Source file constraints__add__C.ml

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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
type t = {
  v1: Cp__Var0.ti;
  v2: Cp__Var0.ti;
  v3: Cp__Var0.ti;
  b: Cp__Var0.tb;
  }

let compute_vars_ti (c: t) (si: Cp__Impl0.Si.t) : unit =
  (Cp__Impl0.Si.add si (c.v1));
  (Cp__Impl0.Si.add si (c.v2));
  (Cp__Impl0.Si.add si (c.v3))

let compute_vars_tb (c: t) (sb: Cp__Impl0.Sb.t) : unit =
  (Cp__Impl0.Sb.add sb (c.b))

let propagate (e: (Cp__DomI.t, Cp__DomB.t) Cp__Type.env) (c: t) : unit =
  match Cp__Type.get_bool e c.b with
  | Cp__DomB.V (true) ->
    (let d1 = Cp__Type.get_int e c.v1 in let d2 = Cp__Type.get_int e c.v2 in
     let d3 = Cp__Type.get_int e c.v3 in
     let mind3 =
       Cp__ConstraintHelpers.max (Z.add d1.Cp__DomI.min d2.Cp__DomI.min)
       d3.Cp__DomI.min in
     let maxd3 =
       Cp__ConstraintHelpers.min (Z.add d1.Cp__DomI.max d2.Cp__DomI.max)
       d3.Cp__DomI.max in
     let mind1 =
       Cp__ConstraintHelpers.max (Z.sub d3.Cp__DomI.min d2.Cp__DomI.max)
       d1.Cp__DomI.min in
     let maxd1 =
       Cp__ConstraintHelpers.min (Z.sub d3.Cp__DomI.max d2.Cp__DomI.min)
       d1.Cp__DomI.max in
     let mind2 =
       Cp__ConstraintHelpers.max (Z.sub mind3 maxd1) d2.Cp__DomI.min in
     let maxd2 =
       Cp__ConstraintHelpers.min (Z.sub maxd3 mind1) d2.Cp__DomI.max in
     let mind31 = Cp__ConstraintHelpers.max (Z.add mind1 mind2) mind3 in
     let maxd31 = Cp__ConstraintHelpers.min (Z.add maxd1 maxd2) maxd3 in
     let mind11 = Cp__ConstraintHelpers.max (Z.sub mind31 maxd2) mind1 in
     let maxd11 = Cp__ConstraintHelpers.min (Z.sub maxd31 mind2) maxd1 in
     let mind21 = Cp__ConstraintHelpers.max (Z.sub mind31 maxd11) mind2 in
     let maxd21 = Cp__ConstraintHelpers.min (Z.sub maxd31 mind11) maxd2 in
     Cp__ConstraintHelpers.set_int e
     c.v1
     { Cp__DomI.min = mind11; Cp__DomI.max = maxd11 };
     Cp__ConstraintHelpers.set_int e
     c.v2
     { Cp__DomI.min = mind21; Cp__DomI.max = maxd21 };
     Cp__ConstraintHelpers.set_int e
     c.v3
     { Cp__DomI.min = mind31; Cp__DomI.max = maxd31 })
  | Cp__DomB.V (false) ->
    (let d1 = Cp__Type.get_int e c.v1 in let d2 = Cp__Type.get_int e c.v2 in
     let d3 = Cp__Type.get_int e c.v3 in
     if
       Z.equal d1.Cp__DomI.min d1.Cp__DomI.max && Z.equal d2.Cp__DomI.min
                                                  d2.Cp__DomI.max && 
                                                  Z.equal d3.Cp__DomI.min
                                                  d3.Cp__DomI.max && 
                                                  Z.equal (Z.add d1.Cp__DomI.min
                                                           d2.Cp__DomI.min)
                                                  d3.Cp__DomI.min
     then raise Cp__Type.Unsat)
  | Cp__DomB.Top -> ()

let check_model (mo: (Z.t, bool) Cp__Type.model) (c: t) : bool =
  Utils__extstd__Bool.eqb (Z.equal (Z.add (Cp__Type.get_mod_int mo c.v1)
                                    (Cp__Type.get_mod_int mo c.v2))
                           (Cp__Type.get_mod_int mo c.v3))
  (Cp__Type.get_mod_bool mo c.b)