diff --git a/ocaml/.merlin b/ocaml/.merlin new file mode 100644 index 0000000..ddf2226 --- /dev/null +++ b/ocaml/.merlin @@ -0,0 +1,3 @@ +PKG core cryptokit str ZMQ +S . + diff --git a/ocaml/QmcMd5.ml b/ocaml/QmcMd5.ml new file mode 100644 index 0000000..fa177f1 --- /dev/null +++ b/ocaml/QmcMd5.ml @@ -0,0 +1,149 @@ +open Core + +(** Directory containing the list of input files. The directory is created is inexistant. *) +let input_directory = lazy ( + + let ezfio_filename = + Lazy.force Qputils.ezfio_filename + in + + let dirname = + Filename.concat ezfio_filename "input" + in + + begin + match ( Sys.is_directory dirname ) with + | `No -> Unix.mkdir dirname + | _ -> () + end ; + + dirname +) + + +(** List of files responsible for the MD5 key of the input *) +let files_to_track = [ + "ao_basis/ao_coef.gz" ; + "ao_basis/ao_expo.gz" ; + "ao_basis/ao_nucl.gz" ; + "ao_basis/ao_num" ; + "ao_basis/ao_power.gz" ; + "ao_basis/ao_prim_num.gz" ; + "electrons/elec_alpha_num" ; + "electrons/elec_beta_num" ; + "electrons/elec_walk_num" ; + "jastrow/jast_type" ; + "mo_basis/mo_coef.gz" ; + "mo_basis/mo_tot_num" ; + "nuclei/nucl_charge.gz" ; + "nuclei/nucl_coord.gz" ; + "nuclei/nucl_num" ; + "simulation/ci_threshold" ; + "simulation/nucl_fitcusp_factor" ; + "simulation/jast_a_up_dn" ; + "simulation/jast_a_up_up" ; + "simulation/jast_b_up_dn" ; + "simulation/jast_b_up_up" ; + "simulation/jast_core_a1" ; + "simulation/jast_core_a2" ; + "simulation/jast_core_b1" ; + "simulation/jast_core_b2" ; + "simulation/jast_een_e_a.gz" ; + "simulation/jast_een_e_b.gz" ; + "simulation/jast_een_n.gz" ; + "simulation/jast_pen.gz" ; + "simulation/method" ; + "simulation/time_step" ; + "simulation/dmc_projection_time" ; + "spindeterminants/bit_kind" ; + "spindeterminants/n_det" ; + "spindeterminants/n_det_alpha" ; + "spindeterminants/n_det_beta" ; + "spindeterminants/n_int" ; + "spindeterminants/n_states" ; + "spindeterminants/psi_coef_matrix_columns.gz" ; + "spindeterminants/psi_coef_matrix_rows.gz" ; + "spindeterminants/psi_coef_matrix_values.gz" ; + "spindeterminants/psi_det_alpha.gz" ; + "spindeterminants/psi_det_beta.gz" ; + "/pseudo/do_pseudo" ; + "/pseudo/mo_pseudo_grid.gz" ; + "/pseudo/pseudo_dz_kl.gz"; + "/pseudo/pseudo_klocmax" ; + "/pseudo/pseudo_n_k.gz" ; + "/pseudo/pseudo_v_kl.gz" ; + "/pseudo/pseudo_grid_rmax" ; + "/pseudo/pseudo_kmax" ; + "/pseudo/pseudo_n_kl.gz" ; + "/pseudo/pseudo_dz_k.gz" ; + "/pseudo/pseudo_grid_size" ; + "/pseudo/pseudo_v_k.gz" ; + ] + + +(** Get an MD5 ke from the content of a file. *) +let hash_file filename = + match Sys.is_file filename with + | `Yes -> + begin + In_channel.with_file filename ~f:(fun ic -> + Cryptokit.hash_channel (Cryptokit.Hash.md5 ()) ic + |> Cryptokit.transform_string (Cryptokit.Hexa.encode ()) ) + end + | _ -> "" + + +(** Cache containing the current value of the MD5 hash. *) +let _hash = + ref None + +(** Get the hash correcponding to the EZFIO file. *) +let hash () = + let compute_hash () = + let ezfio_filename = + Lazy.force Qputils.ezfio_filename + in + let old_md5 = + if Ezfio.has_simulation_md5_key () then + Ezfio.get_simulation_md5_key () + else + "" + in + let md5_string = + files_to_track + |> List.map ~f:(fun x -> Printf.sprintf "%s/%s" ezfio_filename x) + |> List.map ~f:hash_file + |> String.concat + in + + let new_md5 = + md5_string + |> Cryptokit.hash_string (Cryptokit.Hash.md5 ()) + |> Cryptokit.transform_string (Cryptokit.Hexa.encode ()) + in + if (new_md5 <> old_md5) then + begin + Printf.eprintf "Info : MD5 key changed\n %s\n-> %s\n%!" old_md5 new_md5 ; + Ezfio.set_simulation_md5_key new_md5 + end + ; + new_md5 + in + match (!_hash) with + | Some key -> key + | None -> + begin + let key = + compute_hash () + in + _hash := Some key ; + key + end + +(** Reset the cache of the MD5 hash. *) +let reset_hash () = + _hash := None; + ignore (hash ()) + + +