mirror of
https://gitlab.com/scemama/QCaml.git
synced 2024-11-19 04:22:21 +01:00
49 lines
939 B
OCaml
49 lines
939 B
OCaml
open Util
|
|
open Lacaml.D
|
|
|
|
type t =
|
|
| Lowdin of Mat.t
|
|
| Canonical of Mat.t
|
|
| Svd of Mat.t
|
|
|
|
|
|
|
|
|
|
let make_canonical ~cartesian ~thresh ~overlap =
|
|
let result =
|
|
if cartesian then
|
|
canonical_ortho ~thresh ~overlap (Mat.identity @@ Mat.dim1 overlap)
|
|
else
|
|
(* TODO *)
|
|
canonical_ortho ~thresh ~overlap (Mat.identity @@ Mat.dim1 overlap)
|
|
in
|
|
Canonical result
|
|
|
|
|
|
|
|
let make_lowdin ~thresh ~overlap =
|
|
|
|
let u_vec, u_val = diagonalize_symm overlap in
|
|
|
|
Vec.iter (fun x -> if x < thresh then
|
|
invalid_arg (__FILE__^": make_lowdin") ) u_val;
|
|
|
|
let u_val = Vec.reci (Vec.sqrt u_val) in
|
|
|
|
let u_vec' =
|
|
Mat.init_cols (Mat.dim1 u_vec) (Mat.dim2 u_vec) (fun i j -> u_vec.{i,j} *. u_val.{j})
|
|
in
|
|
let result =
|
|
gemm u_vec' ~transb:`T u_vec
|
|
in
|
|
|
|
Lowdin result
|
|
|
|
|
|
|
|
let make ~cartesian ?(thresh=1.e-12) overlap =
|
|
(*
|
|
make_lowdin ~thresh ~overlap
|
|
*)
|
|
make_canonical ~cartesian ~thresh ~overlap
|