mirror of
https://gitlab.com/scemama/QCaml.git
synced 2024-12-23 12:53:46 +01:00
31 lines
595 B
OCaml
31 lines
595 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 Vector
|
|
|
|
let in_phase vec =
|
|
let s = Vector.sum vec in
|
|
if s = 0. then
|
|
let rec first_non_zero k =
|
|
if k > Vector.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 =
|
|
Matrix.to_col_vecs mat
|
|
|> Array.map (fun v -> if in_phase v then v else Vector.neg v)
|
|
|> Matrix.of_col_vecs
|
|
|