diff --git a/colibri2.opam b/colibri2.opam index 8c522e2911a93cc1e1b44f578b7befe1e6b521fb..e6d656934a70d34c99e813c0f19e3c79490b4ae8 100644 --- a/colibri2.opam +++ b/colibri2.opam @@ -36,7 +36,7 @@ depends: [ "farith" "ounit2" {>= "2.2.4" & with-test} "ocaml" {>= "4.12"} - "ocplib-simplex" {= "0.4"} + "ocplib-simplex" {>= "0.5"} "odoc" {with-doc} ] build: [ diff --git a/colibri2/theories/LRA/simplex.ml b/colibri2/theories/LRA/simplex.ml index 3673a8f9eb0a7dd6e43cb39aea53b17b40c072da..6947d65f782ee4ab2fd7205befb7ac322d9e80d9 100644 --- a/colibri2/theories/LRA/simplex.ml +++ b/colibri2/theories/LRA/simplex.ml @@ -57,6 +57,7 @@ module Rat = struct let mult = A.mul let minus = A.neg let is_m_one v = A.equal v m_one + let ceiling = ceil end module Sim = OcplibSimplex.Basic.Make (Var) (Rat) (Ex) @@ -211,19 +212,19 @@ let of_bound_sup = function | No -> None | Large q -> assert (A.is_real q); - Some (q, A.zero) + Some Sim.Core.{ bvalue = R2.of_r q; explanation = () } | Strict q -> assert (A.is_real q); - Some (q, A.minus_one) + Some Sim.Core.{ bvalue = R2.upper q; explanation = () } let of_bound_inf = function | No -> None | Large q -> assert (A.is_real q); - Some (q, A.zero) + Some Sim.Core.{ bvalue = R2.of_r q; explanation = () } | Strict q -> assert (A.is_real q); - Some (q, A.one) + Some Sim.Core.{ bvalue = R2.lower q; explanation = () } let find_equalities d vars (env : Sim.Core.t) (s : Sim.Core.solution Lazy.t) = (* Env must be sat *) @@ -281,7 +282,7 @@ let find_equalities d vars (env : Sim.Core.t) (s : Sim.Core.solution Lazy.t) = let p' = Polynome.of_list A.zero [ (a, A.one); (b, A.minus_one) ] in let n = Dom_polynome.node_of_polynome d p' in let env', _ = - Sim.Assert.poly env p n (of_bound_inf (Large (A.of_int 2))) () None () + Sim.Assert.poly env p ?min:(of_bound_inf (Large (A.of_int 2))) n in let env' = Sim.Solve.solve env' in let s = @@ -294,9 +295,10 @@ let find_equalities d vars (env : Sim.Core.t) (s : Sim.Core.solution Lazy.t) = | Sim.Core.Max (m, s) -> let m = Lazy.force m in (* Debug.dprintf2 debug "Max %a" A.pp m.max_v; *) - (if m.is_le then Delta.add_le else Delta.add_lt) d a m.max_v b; + (if m.is_le then Delta.add_le else Delta.add_lt) d a m.max_v.bvalue.v b; let notdistinct = - if is_int then A.lt (A.abs m.max_v) A.one else A.equal m.max_v A.zero + if is_int then A.lt (A.abs m.max_v.bvalue.v) A.one + else A.equal m.max_v.bvalue.v A.zero in if notdistinct then (`NotDistinct, env, s) else (`Distinct, env, s) in @@ -341,28 +343,28 @@ let update_domains d env = if Egraph.is_registered d n then let inf = Base.Option.map - ~f:(fun (q1, q2) -> - let s = A.sign q2 in + ~f:(fun { bvalue = { v; offset }; _ } -> + let s = A.sign offset in let b = if s = 0 then Bound.Large else if s > 0 then Strict else assert false (* Why? *) in - (q1, b)) + (v, b)) v.mini in let sup = Base.Option.map - ~f:(fun (q1, q2) -> - let s = A.sign q2 in + ~f:(fun { bvalue = { v; offset }; _ } -> + let s = A.sign offset in let b = if s = 0 then Bound.Large else if s < 0 then Strict else assert false (* Why? *) in - (q1, b)) + (v, b)) v.maxi in let v = Dom_interval.D.from_convexe_hull (inf, sup) in @@ -380,7 +382,7 @@ let simplex (d : Egraph.wt) = Datastructure.Push.fold comparisons d ~f:(make_equations d) ~init:(Polynome.H.create 10, Node.S.empty) in - let env = Sim.Core.empty ~is_int:false ~check_invs:false ~debug:0 in + let env = Sim.Core.empty ~is_int:false ~check_invs:false in let of_poly (p : Polynome.t) = Node.M.fold (fun n r acc -> fst (Sim.Core.P.accumulate n r acc)) @@ -400,7 +402,7 @@ let simplex (d : Egraph.wt) = (conv inf, conv sup) in let env, _ = - Sim.Assert.var env v (of_bound_inf inf) () (of_bound_sup sup) () + Sim.Assert.var env v ?min:(of_bound_inf inf) ?max:(of_bound_sup sup) in env in @@ -415,7 +417,7 @@ let simplex (d : Egraph.wt) = assert (A.equal q A.one); let inf = of_bound_inf eq.inf in let sup = of_bound_sup eq.sup in - let env, _ = Sim.Assert.var env n inf () sup () in + let env, _ = Sim.Assert.var env n ?min:inf ?max:sup in (env, vars)) else let inf = of_bound_inf eq.inf in @@ -423,7 +425,7 @@ let simplex (d : Egraph.wt) = let p = Polynome.of_map A.zero eq.p in let n = Dom_polynome.node_of_polynome d p in let vars = Node.S.add n vars in - let env, _ = Sim.Assert.poly env (of_poly p) n inf () sup () in + let env, _ = Sim.Assert.poly env (of_poly p) n ?min:inf ?max:sup in (env, vars) in let env, vars = Polynome.H.fold add_eqs eqs (env, vars) in diff --git a/dune-project b/dune-project index a268a6e45d79bcef4a4494d88727e54b2bd5ee94..37ef02e9f16b951b5d2ee79d4d8c2d2b67635d4c 100644 --- a/dune-project +++ b/dune-project @@ -78,6 +78,6 @@ "farith" ("ounit2" (and (>= "2.2.4") :with-test)) ("ocaml" (>= "4.12")) - ("ocplib-simplex" (= "0.4")) + ("ocplib-simplex" (>= "0.5")) ) )