10
1
mirror of https://gitlab.com/scemama/QCaml.git synced 2024-11-14 10:03:39 +01:00
QCaml/Utils/Conventions.ml

31 lines
576 B
OCaml
Raw Normal View History

2019-11-14 13:00:10 +01:00
(** 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