mirror of
https://gitlab.com/scemama/QCaml.git
synced 2024-10-31 19:23:40 +01:00
31 lines
576 B
OCaml
31 lines
576 B
OCaml
|
(** 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
|
||
|
|