diff --git a/src/core/Internal.ml b/src/core/Internal.ml index 30ddfd9b..ed5c809c 100644 --- a/src/core/Internal.ml +++ b/src/core/Internal.ml @@ -134,7 +134,7 @@ module Make } (* Starting environment. *) - let create ?(st=St.create()) () : t = { + let create_ ~st ~size_trail ~size_lvl () : t = { st; unsat_conflict = None; next_decision = None; @@ -149,10 +149,10 @@ module Make th_head = 0; elt_head = 0; - trail = Vec.make 601 (Trail_elt.of_atom Atom.dummy); - elt_levels = Vec.make 601 (-1); - th_levels = Vec.make 100 Plugin.dummy; - user_levels = Vec.make 10 (-1); + trail = Vec.make size_trail (Trail_elt.of_atom Atom.dummy); + elt_levels = Vec.make size_lvl (-1); + th_levels = Vec.make size_lvl Plugin.dummy; + user_levels = Vec.make 0 (-1); order = H.create(); @@ -181,6 +181,14 @@ module Make nb_init_clauses = 0; } + let create ?(size=`Big) ?st () : t = + let st = match st with Some s -> s | None -> St.create ~size () in + let size_trail, size_lvl = match size with + | `Tiny -> 0, 0 + | `Small -> 32, 16 + | `Big -> 600, 50 + in create_ ~st ~size_trail ~size_lvl () + (* Misc functions *) let to_float = float_of_int let to_int = int_of_float diff --git a/src/core/Internal.mli b/src/core/Internal.mli index e25a675c..6082470e 100644 --- a/src/core/Internal.mli +++ b/src/core/Internal.mli @@ -27,7 +27,7 @@ module Make type t (** Solver *) - val create : ?st:St.t -> unit -> t + val create : ?size:[`Tiny|`Small|`Big] -> ?st:St.t -> unit -> t val st : t -> St.t (** Underlying state *) diff --git a/src/core/Solver_intf.ml b/src/core/Solver_intf.ml index 4fafcf18..21e2612e 100644 --- a/src/core/Solver_intf.ml +++ b/src/core/Solver_intf.ml @@ -64,7 +64,7 @@ module type S = sig type t (** Main solver type, containing all state *) - val create : ?st:St.t -> unit -> t + val create : ?size:[`Tiny|`Small|`Big] -> ?st:St.t -> unit -> t (** Create new solver *) (* TODO: add size hint, callbacks, etc. *) diff --git a/src/core/Solver_types.ml b/src/core/Solver_types.ml index c22d2df2..40f62928 100644 --- a/src/core/Solver_types.ml +++ b/src/core/Solver_types.ml @@ -148,15 +148,21 @@ module McMake (E : Expr_intf.S) = struct type state = t - let create() : t = { - f_map = MF.create 4096; - t_map = MT.create 4096; - vars = Vec.make 107 (E_var dummy_var); + let create_ size_map size_vars () : t = { + f_map = MF.create size_map; + t_map = MT.create size_map; + vars = Vec.make size_vars (E_var dummy_var); cpt_mk_var = 0; cpt_mk_clause = 0; } - (* TODO: embed a state `t` with these inside *) + let create ?(size=`Big) () : t = + let size_map, size_vars = match size with + | `Tiny -> 8, 0 + | `Small -> 16, 10 + | `Big -> 4096, 128 + in + create_ size_map size_vars () let nb_elt st = Vec.size st.vars let get_elt st i = Vec.get st.vars i diff --git a/src/core/Solver_types_intf.ml b/src/core/Solver_types_intf.ml index b311f4ea..485316df 100644 --- a/src/core/Solver_types_intf.ml +++ b/src/core/Solver_types_intf.ml @@ -35,8 +35,7 @@ module type S = sig type t (** State for creating new terms, literals, clauses *) - (* TODO: add size hint *) - val create: unit -> t + val create: ?size:[`Tiny|`Small|`Big] -> unit -> t (** {2 Type definitions} *) diff --git a/src/main/main.ml b/src/main/main.ml index 964bdecf..a8b2e18e 100644 --- a/src/main/main.ml +++ b/src/main/main.ml @@ -37,7 +37,7 @@ module Make let hyps = ref [] - let st = S.create() + let st = S.create ~size:`Big () let check_model sat = let check_clause c =