this repo has no description
at develop 2.9 kB view raw
1include "fzn_mdd_nondet.mzn"; 2include "fzn_mdd_nondet_reif.mzn"; 3 4/** @group globals.extensional 5 Requires that \a x defines a path from root to true node T through the (nondeterministic) MDD defined by 6 7 \a N is the number of nodes, the root node is node 1 8 \a level is the level of each node, the root is level 1, T is level \a length(x)+1 9 \a E is the number of edges 10 \a from is the leaving node (1..\a N)for each edge 11 \a label is the set of values of the \a x variable for each edge 12 \a to is the entering node for each edge, where 0 = T node 13 14 The MDD can be nondeterministic, i.e., there can be two edges 15 with the same label leaving the same node. 16*/ 17predicate mdd_nondet(array[int] of var int: x, % variables constrained by MDD 18 int: N, % number of nodes root is node 1 19 array[int] of int: level, % level of each node root is level 1, T is level length(x)+1 20 int: E, % number of edges 21 array[int] of int: from, % edge leaving node 1..N 22 array[int] of set of int: label, % possible values of variable 23 array[int] of int: to % edge entering node 0..N where 0 = T node 24 ) = 25 let { set of int: NODE = 1..N; 26 set of int: EDGE = 1..E; 27 int: L = length(x); 28 array[0..N] of int: levele = array1d(0..N,[L+1]++level); } in 29 assert(index_set(level) = NODE, 30 "mdd: third argument must be of length N = \(N)") /\ 31 assert(index_set(from) = EDGE, 32 "mdd: 5th argument must be of length E = \(E)") /\ 33 assert(index_set(to) = EDGE, 34 "mdd: 7th argument must be of length E = \(E)") /\ 35 forall(e in EDGE)(assert(from[e] in NODE, 36 "mdd: from[\(e)] must be in \(NODE)")) /\ 37 forall(e in EDGE)(assert(to[e] in 0..N, 38 "mdd: to[\(e)] must be in 0..\(N)")) /\ 39 forall(e in EDGE)(assert(level[from[e]]+1 = levele[to[e]], 40 "mdd level of from[\(e)] = \(level[from[e]])" ++ 41 "must be 1 less than level of to[\(e)] = \(levele[to[e]])")) /\ 42 fzn_mdd_nondet(x, N, level, E, from, label, to); 43 44% Example consider an MDD over 3 variables 45% 5 nodes and 12 edges 46% level 1 root = 1 47% level 2 2 3 48% level 3 4 5 49% level 4 T 50% with edges (from,label,to) given by 51% (1,1,2), (1,2,3), (1,3,2) 52% (2,2,4), (2,3,5) 53% (3,3,4), (3,2,5) 54% (4,1,0), (4,5,0) 55% (5,2,0), (5,4,0), (5,6,0) 56% this is defined by the call 57% mdd([x1,x2,x3],5,[1,2,2,3,3],12,[1,1,1,2,2,3,3,4,4,5,5,5],[1,3,2,2,3,3,2,1,5,2,4,6],[2,2,3,4,5,4,5,0,0,0,0,0])