From b14fe1dc345e936f643884813ab9251e28810c36 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Mon, 22 Jul 2019 11:31:16 +0200 Subject: [PATCH] Removing core --- ocaml/Qmcchem_debug.ml | 47 ++++++++++-------- ocaml/Qmcchem_info.ml | 30 ++++++------ ocaml/Qmcchem_md5.ml | 17 ++++--- ocaml/Qmcchem_run.ml | 106 ++++++++++++++++++++++++----------------- ocaml/Qmcchem_stop.ml | 27 ++++++----- ocaml/Sample.ml | 4 +- ocaml/Sample.mli | 2 +- ocaml/Time.ml | 24 ++++++++++ ocaml/qmcchem.ml | 47 +++++++++++++----- 9 files changed, 192 insertions(+), 112 deletions(-) diff --git a/ocaml/Qmcchem_debug.ml b/ocaml/Qmcchem_debug.ml index 55c5a59..8b32af9 100644 --- a/ocaml/Qmcchem_debug.ml +++ b/ocaml/Qmcchem_debug.ml @@ -19,7 +19,7 @@ let run ~t ezfio_filename= match (Ezfio.get_simulation_http_server () |> String_ext.rsplit2 ~on:':' ) with - | Some (a,p) -> a^":"^( (Int.of_string p)+4 |> Int.to_string ) + | Some (a,p) -> a^":"^( (int_of_string p)+4 |> string_of_int ) | None -> failwith "Badly formed address" in Zmq.Socket.connect socket address; @@ -31,7 +31,7 @@ let run ~t ezfio_filename= Str.regexp " *: *" in let tot_size = - ref (Byte_units.create `Bytes 0.) + ref 0. in while true do @@ -41,12 +41,12 @@ let run ~t ezfio_filename= let (socket, bytes) = match Str.split re_split msg with | socket :: bytes :: _ -> - (socket, Byte_units.create `Bytes (Float.of_string bytes)) - | _ -> (print_endline msg ; ("", Byte_units.create `Bytes 0.)) + (socket, float_of_string bytes) + | _ -> (print_endline msg ; ("", 0.)) in - tot_size := Byte_units.create `Bytes ((Byte_units.bytes !tot_size) +. (Byte_units.bytes bytes)); - Printf.printf "%s\n%!" (Byte_units.to_string !tot_size); - Time.pause (Time.Span.of_sec 1.) + tot_size := !tot_size +. bytes; + Printf.printf "%f\n%!" !tot_size; + Unix.sleep 1 done end else @@ -62,20 +62,29 @@ let run ~t ezfio_filename= -let spec = - let open Command.Spec in - empty - +> flag "t" no_arg - ~doc:"Measure the throughput" - +> anon ("ezfio_file" %: string) +let () = + let open Command_line in + begin + set_header_doc (Sys.argv.(0) ^ " - QMC=Chem command"); + set_description_doc "Debug ZeroMQ communications"; + [ { short='t' ; long="traffic" ; opt=Optional ; + doc="Print traffic in bytes" ; + arg=Without_arg } ; + + anonymous "EZFIO_DIR" Mandatory "EZFIO directory" ] + |> set_specs + end; + + let t = Command_line.get_bool "traffic" in + let ezfio_file = + match Command_line.anon_args () with + | ezfio_file :: [] -> ezfio_file + | _ -> (Command_line.help () ; failwith "Inconsistent command line") + in + + run t ezfio_file -let command = - Command.basic_spec - ~summary: "Debug ZeroMQ communications" - ~readme:(fun () -> "Gets debug information from the Zmq debug sockets.") - spec - (fun t ezfio_file () -> run t ezfio_file) diff --git a/ocaml/Qmcchem_info.ml b/ocaml/Qmcchem_info.ml index 678f2dc..51853d8 100644 --- a/ocaml/Qmcchem_info.ml +++ b/ocaml/Qmcchem_info.ml @@ -10,22 +10,22 @@ let run ezfio_filename = [| qmcchem_info ; ezfio_filename |] in ignore @@ - Unix.exec prog argv + Unix.execv prog argv +let () = + let open Command_line in + begin + set_header_doc (Sys.argv.(0) ^ " - QMC=Chem command"); + set_description_doc "Display info on an EZFIO database"; + [ anonymous "EZFIO_DIR" Mandatory "EZFIO directory" ] + |> set_specs + end; -let spec = - let open Command.Spec in - empty - +> anon ("ezfio_file" %: string) - -let command = - Command.basic_spec - ~summary: "Display info on an EZFIO database" - ~readme:(fun () -> - " -Display info on an EZFIO database - ") - spec - (fun ezfio_file () -> run ezfio_file ) + let ezfio_file = + match Command_line.anon_args () with + | ezfio_file :: [] -> ezfio_file + | _ -> (Command_line.help () ; failwith "Inconsistent command line") + in + run ezfio_file diff --git a/ocaml/Qmcchem_md5.ml b/ocaml/Qmcchem_md5.ml index 073cbf7..8254710 100644 --- a/ocaml/Qmcchem_md5.ml +++ b/ocaml/Qmcchem_md5.ml @@ -52,7 +52,7 @@ let run ?c ?d ~l ~update ezfio_filename = String.concat "/" [ ezfio_filename; "input"; old_key ] in Printf.printf "Removing %s\n%!" old_name; - try Sys.unlink old_name with + try Sys.remove old_name with | Sys_error _ -> (); end in @@ -87,11 +87,10 @@ let run ?c ?d ~l ~update ezfio_filename = else "" in - let date = - (Unix.stat filename).Unix.st_mtime - in - let date = - Unix.strftime (Unix.localtime date) "%a, %d %b %Y %T %z" + let date = + let open Unix in + localtime (stat filename).st_mtime + |> Time.string_of_date in Printf.printf "%s : %s %s\n" md5 date this) in @@ -153,6 +152,12 @@ let () = let d = Command_line.get "diff" in let l = Command_line.get_bool "list" in + let ezfio_file = + match Command_line.anon_args () with + | ezfio_file :: [] -> ezfio_file + | _ -> (Command_line.help () ; failwith "Inconsistent command line") + in + run ?c ?d ~l ~update ezfio_file diff --git a/ocaml/Qmcchem_run.ml b/ocaml/Qmcchem_run.ml index 574f42c..bbf5961 100644 --- a/ocaml/Qmcchem_run.ml +++ b/ocaml/Qmcchem_run.ml @@ -1,4 +1,3 @@ -open Core let full_run ?(start_dataserver=true) ezfio_filename = (* Identify the job scheduler *) @@ -39,13 +38,13 @@ let full_run ?(start_dataserver=true) ezfio_filename = (* Start the data server *) - let prog, argv = - qmcchem, [ qmcchem; "run" ; "-d" ; ezfio_filename] + let prog, args = + qmcchem, [| qmcchem; "run" ; "-d" ; ezfio_filename |] in let pid_dataserver = - Watchdog.fork_exec ~prog ~argv () + Watchdog.fork_exec ~prog ~args () in - Printf.printf "%7d : %s\n%!" (Pid.to_int pid_dataserver) (String.concat ~sep:" " argv) + Printf.printf "%7d : %s\n%!" pid_dataserver (String.concat " " (Array.to_list args)) end; @@ -87,7 +86,7 @@ let full_run ?(start_dataserver=true) ezfio_filename = | n -> if (not (test_open_rep_socket ())) then begin - Time.pause (Time.Span.of_sec 0.5); + Unix.sleepf 0.5; count (n-1); end else @@ -96,32 +95,33 @@ let full_run ?(start_dataserver=true) ezfio_filename = if (not (count 300)) then Watchdog.kill (); *) - Time.pause (Time.Span.of_sec 3.); + Unix.sleep 3; (* Start the qmc processes *) - let prog, argv = + let prog, args_list = let launcher = Launcher.(find () |> to_string) in match launcher - |> String.split ~on:' ' - |> List.map ~f:String.strip - |> List.filter ~f:(fun x -> x <> "") + |> String.split_on_char ' ' + |> List.map String.trim + |> List.filter (fun x -> x <> "") with | launcher_exe::launcher_flags -> launcher_exe, launcher_exe :: launcher_flags @ qmc @ [ Ezfio.get_simulation_http_server () ; ezfio_filename ] | _ -> failwith "Error in launcher" in + let args = Array.of_list args_list in let pid_qmc = try - Watchdog.fork_exec ~prog ~argv () + Watchdog.fork_exec ~prog ~args () with | Unix.Unix_error _ -> begin let command = - String.concat ~sep:" " argv + String.concat " " args_list in Printf.printf " ============================================================ @@ -132,7 +132,7 @@ Error: Unable to run the following command Watchdog.kill () end in - Printf.printf "%7d : %s\n%!" (Pid.to_int pid_qmc) (String.concat ~sep:" " argv); + Printf.printf "%7d : %s\n%!" pid_qmc (String.concat " " args_list); (* Wait for processes to finish *) Watchdog.join () @@ -152,18 +152,19 @@ let run a d ?q ?s ezfio_filename = Qputils.set_ezfio_filename ezfio_filename; (* Signal handler to Kill properly all the processes *) - let handler s = - Printf.printf "QMC=Chem received the %s signal... killing\n%!" (Signal.to_string s); + let handler s = + Printf.printf "QMC=Chem received signal %d... killing\n%!" s; Watchdog.kill (); in - List.iter [ - Signal.int ; - Signal.term ; - Signal.quit ; + List.iter (fun s -> ignore @@ Sys.signal s (Sys.Signal_handle handler)) + [ + Sys.sigint ; + Sys.sigterm ; + Sys.sigquit ; ] - ~f:(fun x -> Signal.Expert.handle x handler) ; + (* Validate input *) Input.validate (); (* Printf.printf "MD5 : %s\n" (Lazy.force Md5.hash) ; *) @@ -191,30 +192,45 @@ let run a d ?q ?s ezfio_filename = -let spec = - let open Command.Spec in - empty - +> flag "a" no_arg - ~doc:(" Add more resources to a running calculation.") - +> flag "d" no_arg - ~doc:(" Start a dataserver process on the local host.") - +> flag "q" (optional string) - ~doc:(" Start a qmc process on the local host.") - +> flag "s" (optional string) - ~doc:(" Start a qmc process on .") - +> anon ("ezfio_file" %: string) - - - -let command = - Command.basic_spec - ~summary: "Run a calculation" - ~readme:(fun () -> - " -Run QMC=Chem - ") - spec - (fun a d q s ezfio_file () -> run a d ?q ?s ezfio_file ) +let () = + let open Command_line in + begin + set_header_doc (Sys.argv.(0) ^ " - QMC=Chem command"); + set_description_doc "Run a calculation"; + + [ { short='a' ; long="add" ; opt=Optional ; + doc="Add more resources to a running calculation" ; + arg=Without_arg ; }; + + { short='d' ; long="data-server" ; opt=Optional ; + doc="Start a dataserver process on the local host" ; + arg=Without_arg ; }; + + { short='q' ; long="local-qmc" ; opt=Optional ; + doc="Start a qmc process on the local host attached to the addres given as an argument" ; + arg=With_arg "" ; }; + + { short='s' ; long="remote-qmc" ; opt=Optional ; + doc="Start a qmc process on the remote host as an argument" ; + arg=With_arg "" ; }; + + anonymous "EZFIO_DIR" Mandatory "EZFIO directory"; + ] + |> set_specs + end; + + let a = Command_line.get_bool "add" in + let d = Command_line.get_bool "data-server" in + let q = Command_line.get "local-qmc" in + let s = Command_line.get "remote-qmc" in + + let ezfio_file = + match Command_line.anon_args () with + | ezfio_file :: [] -> ezfio_file + | _ -> (Command_line.help () ; failwith "Inconsistent command line") + in + + run a d ?q ?s ezfio_file diff --git a/ocaml/Qmcchem_stop.ml b/ocaml/Qmcchem_stop.ml index 8204283..02ec94b 100644 --- a/ocaml/Qmcchem_stop.ml +++ b/ocaml/Qmcchem_stop.ml @@ -3,20 +3,21 @@ let run ezfio_filename = Qputils.set_ezfio_filename ezfio_filename; Status.write Status.Stopping +let () = + let open Command_line in + begin + set_header_doc (Sys.argv.(0) ^ " - QMC=Chem command"); + set_description_doc "Stop a running calculation"; + [ anonymous "EZFIO_DIR" Mandatory "EZFIO directory" ] + |> set_specs + end; -let spec = - let open Command.Spec in - empty - +> anon ("ezfio_file" %: string) + let ezfio_file = + match Command_line.anon_args () with + | ezfio_file :: [] -> ezfio_file + | _ -> (Command_line.help () ; failwith "Inconsistent command line") + in -let command = - Command.basic_spec - ~summary: "Stop a running calculation" - ~readme:(fun () -> - " -Stop a running calculation - ") - spec - (fun ezfio_file () -> run ezfio_file ) + run ezfio_file diff --git a/ocaml/Sample.ml b/ocaml/Sample.ml index 6987388..540cb8b 100644 --- a/ocaml/Sample.ml +++ b/ocaml/Sample.ml @@ -1,7 +1,9 @@ +open Sexplib.Std + type t = | One_dimensional of float | Multidimensional of (float array * int) -[@ deriving sexp] +[@@deriving sexp] let dimension = function | One_dimensional _ -> 1 diff --git a/ocaml/Sample.mli b/ocaml/Sample.mli index 031c715..58a1f64 100644 --- a/ocaml/Sample.mli +++ b/ocaml/Sample.mli @@ -1,4 +1,4 @@ -type t [@@ deriving sexp] +type t [@@deriving sexp] val to_float : ?idx:int -> t -> float val to_float_array : t -> float array val of_float : float -> t diff --git a/ocaml/Time.ml b/ocaml/Time.ml index 0540ec7..ec4a320 100644 --- a/ocaml/Time.ml +++ b/ocaml/Time.ml @@ -20,6 +20,30 @@ let string_of_t t = in Printf.sprintf "%2d:%2d:%2d" hour min sec +let string_of_date t = + let year = 1900 + t.Unix.tm_year in + let mon = t.Unix.tm_mon in + let mday = t.Unix.tm_mday in + let sec = t.Unix.tm_sec + and min = t.Unix.tm_min + and hour = t.Unix.tm_hour + in + let month = + match mon with + | 0 -> "Jan" | 1 -> "Feb" | 2 -> "Mar" | 3 -> "Apr" + | 4 -> "May" | 5 -> "Jun" | 6 -> "Jul" | 7 -> "Aug" + | 8 -> "Sep" | 9 -> "Oct" | 10 -> "Nov" | 11 -> "Dec" + | _ -> assert false + in + Printf.sprintf "%2d %3s %4d - %2.2d:%2.2d:%2.2d" mday month year hour min sec + + +let string_of_now () = + Unix.time () + |> Unix.localtime + |> string_of_date + + let string_of_sec s = of_sec s |> string_of_t diff --git a/ocaml/qmcchem.ml b/ocaml/qmcchem.ml index ad341b3..cdf27a9 100644 --- a/ocaml/qmcchem.ml +++ b/ocaml/qmcchem.ml @@ -1,16 +1,39 @@ -open Core +let update_command_line () = + let last = Array.length Sys.argv - 1 in + for i=1 to last do + Sys.argv.(i) <- Sys.argv.(i+1) + done; + Sys.argv.(last) <- "--" -let command = - Command.group ~summary:"QMC=Chem command" [ - "debug" , Qmcchem_debug.command ; - "edit" , Qmcchem_edit.command ; - "info" , Qmcchem_info.command ; - "md5" , Qmcchem_md5.command ; - "result", Qmcchem_result.command ; - "run" , Qmcchem_run.command ; - "stop" , Qmcchem_stop.command ; +let () = + let open Command_line in + begin + set_header_doc (Sys.argv.(0) ^ " - QMC=Chem command"); + set_description_doc "Driver for subcommands."; + [ + anonymous "COMMAND" Mandatory "[debug|edit|info|md5|result|run|stop]"; + anonymous "EZFIO_DIR" Mandatory "EZFIO directory"; ] + |> set_specs + end; + + let command = + match Command_line.anon_args () with + | command :: ezfio_file :: [] -> command + | _ -> (Command_line.help () ; failwith "Inconsistent command line") + in + + update_command_line (); + + match command with + | "debug" -> let open Qmcchem_debug in () + | "edit" -> let open Qmcchem_edit in () + | "info" -> let open Qmcchem_info in () + | "md5" -> let open Qmcchem_md5 in () + | "result" -> let open Qmcchem_result in () + | "run" -> let open Qmcchem_run in () + | "stop" -> let open Qmcchem_stop in () + | _ -> (Command_line.help () ; failwith "Inconsistent command line") + -let () = - Command.run command