This commit is contained in:
Anthony Scemama 2019-11-14 13:00:10 +01:00
parent 08e41378dd
commit 35e63bf4fc
2 changed files with 46 additions and 0 deletions

30
Utils/Conventions.ml Normal file
View File

@ -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

16
Utils/Conventions.mli Normal file
View File

@ -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. *)