Skip to content
Snippets Groups Projects
Commit e83e3838 authored by Hichem R. A.'s avatar Hichem R. A. Committed by Hichem R. A.
Browse files

[LRA] Bump to ocplib-simplex.0.5

parent b5076539
No related branches found
No related tags found
1 merge request!32Update ocplib-simplex, some fixes
...@@ -36,7 +36,7 @@ depends: [ ...@@ -36,7 +36,7 @@ depends: [
"farith" "farith"
"ounit2" {>= "2.2.4" & with-test} "ounit2" {>= "2.2.4" & with-test}
"ocaml" {>= "4.12"} "ocaml" {>= "4.12"}
"ocplib-simplex" {= "0.4"} "ocplib-simplex" {>= "0.5"}
"odoc" {with-doc} "odoc" {with-doc}
] ]
build: [ build: [
......
...@@ -57,6 +57,7 @@ module Rat = struct ...@@ -57,6 +57,7 @@ module Rat = struct
let mult = A.mul let mult = A.mul
let minus = A.neg let minus = A.neg
let is_m_one v = A.equal v m_one let is_m_one v = A.equal v m_one
let ceiling = ceil
end end
module Sim = OcplibSimplex.Basic.Make (Var) (Rat) (Ex) module Sim = OcplibSimplex.Basic.Make (Var) (Rat) (Ex)
...@@ -211,19 +212,19 @@ let of_bound_sup = function ...@@ -211,19 +212,19 @@ let of_bound_sup = function
| No -> None | No -> None
| Large q -> | Large q ->
assert (A.is_real q); assert (A.is_real q);
Some (q, A.zero) Some Sim.Core.{ bvalue = R2.of_r q; explanation = () }
| Strict q -> | Strict q ->
assert (A.is_real q); assert (A.is_real q);
Some (q, A.minus_one) Some Sim.Core.{ bvalue = R2.upper q; explanation = () }
let of_bound_inf = function let of_bound_inf = function
| No -> None | No -> None
| Large q -> | Large q ->
assert (A.is_real q); assert (A.is_real q);
Some (q, A.zero) Some Sim.Core.{ bvalue = R2.of_r q; explanation = () }
| Strict q -> | Strict q ->
assert (A.is_real 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) = let find_equalities d vars (env : Sim.Core.t) (s : Sim.Core.solution Lazy.t) =
(* Env must be sat *) (* Env must be sat *)
...@@ -281,7 +282,7 @@ let find_equalities d vars (env : Sim.Core.t) (s : Sim.Core.solution Lazy.t) = ...@@ -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 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 n = Dom_polynome.node_of_polynome d p' in
let env', _ = 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 in
let env' = Sim.Solve.solve env' in let env' = Sim.Solve.solve env' in
let s = let s =
...@@ -294,9 +295,10 @@ let find_equalities d vars (env : Sim.Core.t) (s : Sim.Core.solution Lazy.t) = ...@@ -294,9 +295,10 @@ let find_equalities d vars (env : Sim.Core.t) (s : Sim.Core.solution Lazy.t) =
| Sim.Core.Max (m, s) -> | Sim.Core.Max (m, s) ->
let m = Lazy.force m in let m = Lazy.force m in
(* Debug.dprintf2 debug "Max %a" A.pp m.max_v; *) (* 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 = 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 in
if notdistinct then (`NotDistinct, env, s) else (`Distinct, env, s) if notdistinct then (`NotDistinct, env, s) else (`Distinct, env, s)
in in
...@@ -341,28 +343,28 @@ let update_domains d env = ...@@ -341,28 +343,28 @@ let update_domains d env =
if Egraph.is_registered d n then if Egraph.is_registered d n then
let inf = let inf =
Base.Option.map Base.Option.map
~f:(fun (q1, q2) -> ~f:(fun { bvalue = { v; offset }; _ } ->
let s = A.sign q2 in let s = A.sign offset in
let b = let b =
if s = 0 then Bound.Large if s = 0 then Bound.Large
else if s > 0 then Strict else if s > 0 then Strict
else assert false else assert false
(* Why? *) (* Why? *)
in in
(q1, b)) (v, b))
v.mini v.mini
in in
let sup = let sup =
Base.Option.map Base.Option.map
~f:(fun (q1, q2) -> ~f:(fun { bvalue = { v; offset }; _ } ->
let s = A.sign q2 in let s = A.sign offset in
let b = let b =
if s = 0 then Bound.Large if s = 0 then Bound.Large
else if s < 0 then Strict else if s < 0 then Strict
else assert false else assert false
(* Why? *) (* Why? *)
in in
(q1, b)) (v, b))
v.maxi v.maxi
in in
let v = Dom_interval.D.from_convexe_hull (inf, sup) in let v = Dom_interval.D.from_convexe_hull (inf, sup) in
...@@ -380,7 +382,7 @@ let simplex (d : Egraph.wt) = ...@@ -380,7 +382,7 @@ let simplex (d : Egraph.wt) =
Datastructure.Push.fold comparisons d ~f:(make_equations d) Datastructure.Push.fold comparisons d ~f:(make_equations d)
~init:(Polynome.H.create 10, Node.S.empty) ~init:(Polynome.H.create 10, Node.S.empty)
in 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) = let of_poly (p : Polynome.t) =
Node.M.fold Node.M.fold
(fun n r acc -> fst (Sim.Core.P.accumulate n r acc)) (fun n r acc -> fst (Sim.Core.P.accumulate n r acc))
...@@ -400,7 +402,7 @@ let simplex (d : Egraph.wt) = ...@@ -400,7 +402,7 @@ let simplex (d : Egraph.wt) =
(conv inf, conv sup) (conv inf, conv sup)
in in
let env, _ = 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 in
env env
in in
...@@ -415,7 +417,7 @@ let simplex (d : Egraph.wt) = ...@@ -415,7 +417,7 @@ let simplex (d : Egraph.wt) =
assert (A.equal q A.one); assert (A.equal q A.one);
let inf = of_bound_inf eq.inf in let inf = of_bound_inf eq.inf in
let sup = of_bound_sup eq.sup 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)) (env, vars))
else else
let inf = of_bound_inf eq.inf in let inf = of_bound_inf eq.inf in
...@@ -423,7 +425,7 @@ let simplex (d : Egraph.wt) = ...@@ -423,7 +425,7 @@ let simplex (d : Egraph.wt) =
let p = Polynome.of_map A.zero eq.p in let p = Polynome.of_map A.zero eq.p in
let n = Dom_polynome.node_of_polynome d p in let n = Dom_polynome.node_of_polynome d p in
let vars = Node.S.add n vars 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) (env, vars)
in in
let env, vars = Polynome.H.fold add_eqs eqs (env, vars) in let env, vars = Polynome.H.fold add_eqs eqs (env, vars) in
......
...@@ -78,6 +78,6 @@ ...@@ -78,6 +78,6 @@
"farith" "farith"
("ounit2" (and (>= "2.2.4") :with-test)) ("ounit2" (and (>= "2.2.4") :with-test))
("ocaml" (>= "4.12")) ("ocaml" (>= "4.12"))
("ocplib-simplex" (= "0.4")) ("ocplib-simplex" (>= "0.5"))
) )
) )
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment