quantum_package/ocaml/Input_bitmasks.ml

159 lines
4.0 KiB
OCaml
Raw Permalink Normal View History

2014-10-18 00:10:25 +02:00
open Qptypes;;
open Qputils;;
2017-08-18 18:28:33 +02:00
open Core;;
2014-10-18 00:10:25 +02:00
module Bitmasks : sig
2014-10-21 23:32:47 +02:00
type t =
{ n_int : N_int_number.t;
bit_kind : Bit_kind.t;
2014-10-22 00:12:23 +02:00
n_mask_gen : Bitmask_number.t;
2014-10-21 23:32:47 +02:00
generators : int64 array;
n_mask_cas : Bitmask_number.t;
cas : int64 array;
2017-08-18 18:28:33 +02:00
} [@@deriving sexp]
2014-10-21 23:32:47 +02:00
;;
2014-11-27 23:05:26 +01:00
val read : unit -> t option
2014-10-18 00:10:25 +02:00
val to_string : t -> string
end = struct
type t =
{ n_int : N_int_number.t;
bit_kind : Bit_kind.t;
2014-10-22 00:12:23 +02:00
n_mask_gen : Bitmask_number.t;
2014-10-18 00:10:25 +02:00
generators : int64 array;
n_mask_cas : Bitmask_number.t;
cas : int64 array;
2017-08-18 18:28:33 +02:00
} [@@deriving sexp]
2014-10-18 00:10:25 +02:00
;;
let get_default = Qpackage.get_ezfio_default "bitmasks";;
let read_n_int () =
if not (Ezfio.has_bitmasks_n_int()) then
Ezfio.get_mo_basis_mo_tot_num ()
|> Bitlist.n_int_of_mo_tot_num
|> N_int_number.to_int
|> Ezfio.set_bitmasks_n_int
;
Ezfio.get_bitmasks_n_int ()
|> N_int_number.of_int
;;
let read_bit_kind () =
if not (Ezfio.has_bitmasks_bit_kind ()) then
Lazy.force Qpackage.bit_kind
|> Bit_kind.to_int
|> Ezfio.set_bitmasks_bit_kind
;
Ezfio.get_bitmasks_bit_kind ()
|> Bit_kind.of_int
;;
let read_n_mask_gen () =
if not (Ezfio.has_bitmasks_n_mask_gen ()) then
Ezfio.set_bitmasks_n_mask_gen 1
;
Ezfio.get_bitmasks_n_mask_gen ()
2014-10-22 00:12:23 +02:00
|> Bitmask_number.of_int
2014-10-18 00:10:25 +02:00
;;
let full_mask n_int =
let range = "[1-"^
(Int.to_string (Ezfio.get_mo_basis_mo_tot_num ()))^"]"
in
MO_class.create_active range
|> MO_class.to_bitlist n_int
;;
2014-10-18 00:10:25 +02:00
let read_generators () =
if not (Ezfio.has_bitmasks_generators ()) then
begin
let n_int =
read_n_int ()
in
let act =
full_mask n_int
in
let result = [ act ; act ; act ; act ; act ; act ]
|> List.map ~f:(fun x ->
let y = Bitlist.to_int64_list x in y@y )
|> List.concat
in
let generators = Ezfio.ezfio_array_of_list ~rank:4
~dim:([| (N_int_number.to_int n_int) ; 2; 6; 1|]) ~data:result
in
Ezfio.set_bitmasks_generators generators
2014-10-18 00:10:25 +02:00
end;
Ezfio.get_bitmasks_generators ()
|> Ezfio.flattened_ezfio
2014-10-18 00:10:25 +02:00
;;
let read_n_mask_cas () =
if not (Ezfio.has_bitmasks_n_mask_cas ()) then
Ezfio.set_bitmasks_n_mask_cas 1
;
Ezfio.get_bitmasks_n_mask_cas ()
|> Bitmask_number.of_int
;;
let read_cas () =
if not (Ezfio.has_bitmasks_cas ()) then
begin
let n_int =
read_n_int ()
in
let act =
full_mask n_int
in
let result = [ act ; act ]
|> List.map ~f:(fun x ->
let y = Bitlist.to_int64_list x in y@y )
|> List.concat
in
let cas = Ezfio.ezfio_array_of_list ~rank:3
~dim:([| (N_int_number.to_int n_int) ; 2; 1|]) ~data:result
in
Ezfio.set_bitmasks_cas cas
end;
Ezfio.get_bitmasks_cas ()
|> Ezfio.flattened_ezfio
;;
2014-10-18 00:10:25 +02:00
let read () =
2014-11-27 23:05:26 +01:00
if (Ezfio.has_mo_basis_mo_tot_num ()) then
Some
{ n_int = read_n_int ();
bit_kind = read_bit_kind ();
n_mask_gen = read_n_mask_gen ();
generators = read_generators ();
n_mask_cas = read_n_mask_cas ();
cas = read_cas ();
2014-11-27 23:05:26 +01:00
}
else
None
2014-10-18 00:10:25 +02:00
;;
let to_string b =
Printf.sprintf "
n_int = %s
bit_kind = %s
n_mask_gen = %s
generators = %s
n_mask_cas = %s
cas = %s
2014-10-18 00:10:25 +02:00
"
(N_int_number.to_string b.n_int)
(Bit_kind.to_string b.bit_kind)
2014-10-22 00:12:23 +02:00
(Bitmask_number.to_string b.n_mask_gen)
2014-10-18 00:10:25 +02:00
(Array.to_list b.generators
|> List.map ~f:(fun x-> Int64.to_string x)
|> String.concat ~sep:", ")
(Bitmask_number.to_string b.n_mask_cas)
(Array.to_list b.cas
|> List.map ~f:(fun x-> Int64.to_string x)
|> String.concat ~sep:", ")
2014-10-18 00:10:25 +02:00
end