1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
use crate::{FnUpdate, RegulatoryGraph};
use biodivine_lib_bdd::boolean_expression::BooleanExpression;
impl FnUpdate {
pub fn try_from_expression(
expression: BooleanExpression,
graph: &RegulatoryGraph,
) -> Option<FnUpdate> {
Some(match expression {
BooleanExpression::Const(value) => FnUpdate::Const(value),
BooleanExpression::Variable(name) => FnUpdate::Var(graph.find_variable(&name)?),
BooleanExpression::Not(inner) => {
FnUpdate::try_from_expression(*inner, graph)?.negation()
}
BooleanExpression::Or(l, r) => {
let l = FnUpdate::try_from_expression(*l, graph)?;
let r = FnUpdate::try_from_expression(*r, graph)?;
l.or(r)
}
BooleanExpression::And(l, r) => {
let l = FnUpdate::try_from_expression(*l, graph)?;
let r = FnUpdate::try_from_expression(*r, graph)?;
l.and(r)
}
BooleanExpression::Iff(l, r) => {
let l = FnUpdate::try_from_expression(*l, graph)?;
let r = FnUpdate::try_from_expression(*r, graph)?;
l.iff(r)
}
BooleanExpression::Imp(l, r) => {
let l = FnUpdate::try_from_expression(*l, graph)?;
let r = FnUpdate::try_from_expression(*r, graph)?;
l.implies(r)
}
BooleanExpression::Xor(l, r) => {
let l = FnUpdate::try_from_expression(*l, graph)?;
let r = FnUpdate::try_from_expression(*r, graph)?;
l.xor(r)
}
})
}
}