diff --git a/lib/sasacore/exhaustSearch.ml b/lib/sasacore/exhaustSearch.ml index 264f5b40243383e3834e2a94da3fe4de3a003801..aba1d0f9855a7f6a259096e8ee73e60a9cc563c6 100644 --- a/lib/sasacore/exhaustSearch.ml +++ b/lib/sasacore/exhaustSearch.ml @@ -115,7 +115,17 @@ let (bnb : out_channel -> bool -> 'v ss -> ) in let pot0 = pot st0 in - pot_init := pot0; + pot_init := pot0; +(* let t0 = 1000. in + let lambda = 0.99 in + let sa_temp pt = + if args.init_search_sa then + pt *. lambda + else + min_float + in + let sa_reset + *) let pb = { init = { st=marshall_ss st0; d=0; pot=pot0 ; cpt=0; path=[]; cost=pot0 }, Q.empty, (); diff --git a/lib/sasacore/sasArg.ml b/lib/sasacore/sasArg.ml index 8fb49d61e0804fc870dae890c89786092d55df7e..1a41a5ba0d93265743db46ca95fbb3056275ef6a 100644 --- a/lib/sasacore/sasArg.ml +++ b/lib/sasacore/sasArg.ml @@ -1,4 +1,4 @@ -(* Time-stamp: <modified the 08/11/2021 (at 10:53) by Erwan Jahier> *) +(* Time-stamp: <modified the 14/11/2021 (at 18:34) by Erwan Jahier> *) type t = { @@ -18,6 +18,7 @@ type t = { mutable output_algos: bool; mutable gen_register: bool; mutable init_search_max_trials: int option; + mutable init_search_sa: bool; mutable _args : (string * Arg.spec * string) list; mutable _user_man : (string * string list) list; @@ -52,6 +53,7 @@ let (make_args : unit -> t) = output_algos = false; gen_register = false; init_search_max_trials = None; + init_search_sa = false; _args = []; _user_man = []; _hidden_man = []; @@ -156,6 +158,9 @@ let (mkoptab : string array -> t -> unit) = ["Use local search algorithms to find an initial configuration that pessimize "; "the step number. The argument is the maximum number of trials to do the search. "; "Require the state_to_nums Algo.to_register field to be defined."] ~arg:" <int>"; + mkopt args ["--init-search-sa";"-issa"] + (Arg.Int(fun i -> args.init_search_sa <- true; args.init_search_max_trials <- Some i)) + ["ditto + simulated annealing. XXX experimental"] ~arg:" <int>"; mkopt args ["--cores-nb";"-cn"] (Arg.Int(fun i -> args.cores_nb <- i)) diff --git a/lib/sasacore/sasArg.mli b/lib/sasacore/sasArg.mli index 461b0cd252069b5ed8c3eaf7dccff5697aacbc37..800c0e67af3e380a4cf199a50af7f331e001e4ca 100644 --- a/lib/sasacore/sasArg.mli +++ b/lib/sasacore/sasArg.mli @@ -1,4 +1,4 @@ -(* Time-stamp: <modified the 19/10/2021 (at 15:11) by Erwan Jahier> *) +(* Time-stamp: <modified the 14/11/2021 (at 18:34) by Erwan Jahier> *) type t = { mutable topo: string; @@ -17,6 +17,7 @@ type t = { mutable output_algos: bool; mutable gen_register: bool; mutable init_search_max_trials: int option; + mutable init_search_sa: bool; mutable _args : (string * Arg.spec * string) list; mutable _user_man : (string * string list) list; diff --git a/lib/sasacore/worstInit.ml b/lib/sasacore/worstInit.ml index a6f91a2b6a2804e3c8c94f086b2a240f8bb09012..a4e86f18362ba76fcc13395224dad18f1a75025c 100644 --- a/lib/sasacore/worstInit.ml +++ b/lib/sasacore/worstInit.ml @@ -1,4 +1,4 @@ -(* Time-stamp: <modified the 08/11/2021 (at 11:48) by Erwan Jahier> *) +(* Time-stamp: <modified the 17/11/2021 (at 12:06) by Erwan Jahier> *) open Register @@ -7,13 +7,16 @@ type point = value Array.t let debug = false - -let deltaf=1.0 (* something else ?? *) -let mutate_value = function +type distance = Far | Close +let mutate_value distance = function | F (minf,f,maxf) -> + let deltaf = match distance with + | Far -> (maxf-.minf) + | Close -> (maxf-.minf) /. 100. + in let nf = - if minf > f -. deltaf then - minf+.(Random.float (2.0 *. deltaf)) + if minf > f -. deltaf then + minf+.(Random.float (2.0 *. deltaf)) else if maxf < f +. deltaf then maxf -. (Random.float (2.0 *. deltaf)) else @@ -22,37 +25,42 @@ let mutate_value = function F(minf, nf, maxf) | I (mini,i,maxi) -> - let ni = if i=mini then i+1 else if i=maxi then i-1 else - if Random.bool () then i+1 else i-1 + let deltai = match distance with + | Far -> (maxi - mini) / 2 + | Close -> ((maxi - mini) / 100) + in + let deltai = 1+Random.int (max 1 deltai) in + let ni = if i=mini then i+deltai else if i=maxi then i-deltai else + if Random.bool () then i+deltai else i-deltai in I (mini,ni,maxi) - | B b -> B (not b) - + | B b -> B (not b) -let one_dim_succ n = +let one_dim_succ d n = let p = Array.copy n in let j = Random.int (Array.length p) in - p.(j) <- mutate_value p.(j); + p.(j) <- mutate_value d p.(j); p -let ran_dim_succ n = +let ran_dim_succ d n = let p = Array.copy n in for j=0 to Array.length p - 1 do - if Random.bool () then p.(j) <- mutate_value p.(j) + if Random.bool () then p.(j) <- mutate_value d p.(j) done; p -let all_dim_succ n = +let all_dim_succ d n = let p = Array.copy n in for j=0 to Array.length p - 1 do - p.(j) <- mutate_value p.(j) + p.(j) <- mutate_value d p.(j) done; p -(* let tf = float_of_int *) - +let tf = float_of_int +let ti = int_of_float + let (choose : int -> point -> (point -> point) -> point list) = fun n p heuristic -> (*choose n successors of p using heuristic *) @@ -163,7 +171,8 @@ let point2str p = let (fchc : out_channel -> ('v SimuState.t -> int) -> 'v SimuState.t -> int -> 'v SimuState.t) = fun log run ss_init dmax -> - let cpt = ref 0 in + let cpt = ref 0 in + let step_cpt = ref 1 in let cost p = run (point_to_ss p ss_init) in let pinit = ss_to_point ss_init in let percent_done = ref 0 in @@ -171,11 +180,27 @@ let (fchc : out_channel -> ('v SimuState.t -> int) -> 'v SimuState.t -> int { init = ({ st = pinit ; d = 0 ; cost = cost pinit ; cpt = 0 }, Q.empty, ()); succ = (fun n -> - let m = min 50 (max 1 (dmax / 10)) in - let m = min m (max 1 (dmax - !cpt - 2)) in - let pl = (choose m n.st one_dim_succ) @ - (choose 1 n.st ran_dim_succ) @ - (choose 1 n.st all_dim_succ) + (* let beam_size = min 50 (max 1 (dmax / 10)) in *) + (* let beam_size = min m (max 1 (dmax - !cpt - 2)) in *) + (* let beam_size = max 1 (dmax / (10 * !step_cpt)) in (* 10% of the points to simulate. *) + + let beam_size_part0 = beam_size / 6 in + let beam_size_part1 = max 1 beam_size_part0 in + + *) + let beam_size = max 50 ss_init.sasarg.cores_nb in + let percent_close = ((tf !cpt) /. (tf dmax)) ** 2.0 in + let percent_far = 1.0 -. percent_close in + + let far_nb = max 1 (ti ((tf beam_size) *. percent_far) / 6) in + let close_nb = max 1 (ti ((tf beam_size) *. percent_close) / 6) in + incr step_cpt; + let pl = (choose far_nb n.st (one_dim_succ Close)) @ + (choose far_nb n.st (ran_dim_succ Close)) @ + (choose far_nb n.st (all_dim_succ Close)) @ + (choose close_nb n.st (one_dim_succ Far)) @ + (choose close_nb n.st (ran_dim_succ Far)) @ + (choose close_nb n.st (all_dim_succ Far)) in let new_cpt, res = map_local_fold diff --git a/salut/src/dune b/salut/src/dune new file mode 100644 index 0000000000000000000000000000000000000000..f4c25e2510d78905b129b9b29d7f65c98ef05d5a --- /dev/null +++ b/salut/src/dune @@ -0,0 +1,16 @@ +;; Time-stamp: <modified the 21/11/2021 (at 17:50) by Erwan Jahier> + +(executable + (name dot2lus) + (flags -noassert) + (link_flags (-linkall)) + (libraries ocamlgraph lutils sasacore algo) +) + +(install + (section bin) + (package sasa) + (files (dot2lus.exe as salut)) +; (files sasaRun.cmxa) +) +