diff --git a/Utils/Conventions.ml b/Utils/Conventions.ml new file mode 100644 index 0000000..e70918c --- /dev/null +++ b/Utils/Conventions.ml @@ -0,0 +1,30 @@ +(** Contains the conventions relative to the program. + + The phase convention is given by: + {% $\sum_i c_i > 0$ %} or {% $\min_i c_i \ge 0$ %} + +*) + +open Lacaml.D + +let in_phase vec = + let s = Vec.sum vec in + if s = 0. then + let rec first_non_zero k = + if k > Vec.dim vec then + k-1 + else if vec.{k} = 0. then + first_non_zero (k+1) + else k + in + let k = first_non_zero 1 in + vec.{k} >= 0. + else + s > 0. + + +let rephase mat = + Mat.to_col_vecs mat + |> Array.map (fun v -> if in_phase v then v else Vec.neg v) + |> Mat.of_col_vecs + diff --git a/Utils/Conventions.mli b/Utils/Conventions.mli new file mode 100644 index 0000000..e32613f --- /dev/null +++ b/Utils/Conventions.mli @@ -0,0 +1,16 @@ +(** Contains the conventions relative to the program. + + The phase convention is given by: + {% $\sum_i c_i > 0$ %} or {% $\min_i c_i \ge 0$ %} + +*) + +open Lacaml.D + + +val in_phase : Vec.t -> bool +(** Checks if one MO respects the phase convention *) + +val rephase : Mat.t -> Mat.t +(** Apply the phase convention to the MOs. *) +