10
1
mirror of https://gitlab.com/scemama/QCaml.git synced 2024-12-22 12:23:31 +01:00
QCaml/Utils/Util.mli

142 lines
4.0 KiB
OCaml
Raw Normal View History

2018-02-24 23:57:38 +01:00
(** All utilities which should be included in all source files are defined here *)
2018-03-06 18:25:48 +01:00
(** {2 Functions from libm} *)
2018-02-24 23:57:38 +01:00
external erf_float : float -> float = "erf_float_bytecode" "erf_float"
[@@unboxed] [@@noalloc]
(** Error function [erf] from [libm] *)
external erfc_float : float -> float = "erfc_float_bytecode" "erfc_float"
[@@unboxed] [@@noalloc]
(** Complementary error function [erfc] from [libm] *)
external gamma_float : float -> float = "gamma_float_bytecode" "gamma_float"
[@@unboxed] [@@noalloc]
(** Gamma function [gamma] from [libm] *)
2018-03-06 18:25:48 +01:00
(** {2 General functions} *)
2018-02-24 23:57:38 +01:00
val fact : int -> float
(** Factorial function.
@raise Invalid_argument for negative arguments or arguments >100.
*)
val pow : float -> int -> float
(** Fast implementation of the power function for small integer powers *)
val chop : float -> (unit -> float) -> float
(** In [chop a f], evaluate [f] only if the absolute value of [a] is larger
than {!Constants.epsilon}, and return [a *. f ()].
*)
2018-03-06 18:25:48 +01:00
(** {2 Functions related to the Boys function} *)
2018-02-24 23:57:38 +01:00
val incomplete_gamma : alpha:float -> float -> float
(** {{:https://en.wikipedia.org/wiki/Incomplete_gamma_function}
Lower incomplete gamma function}
@raise Failure when the calculation doesn't converge.
*)
val boys_function : maxm:int -> float -> float array
(** {{:https://link.springer.com/article/10.1007/s10910-005-9023-3}
Generalized Boys function}.
@param maxm Maximum total angular momentum.
*)
2018-03-06 18:25:48 +01:00
(** {2 Extension of the Array module} *)
2018-02-24 23:57:38 +01:00
val array_sum : float array -> float
(** Returns the sum of all the elements of the array *)
val array_product : float array -> float
(** Returns the product of all the elements of the array *)
2018-03-22 00:29:14 +01:00
(** {2 Extension of the List module} *)
2018-05-30 18:07:05 +02:00
2018-03-22 00:29:14 +01:00
val list_some : 'a option list -> 'a list
2018-05-30 18:07:05 +02:00
(** Filters out all [None] elements of the list, and returns the elements without
the [Some]. *)
2018-03-22 00:29:14 +01:00
2018-07-20 16:09:06 +02:00
val list_range : ?start:int -> int -> int list
2018-08-05 00:31:48 +02:00
(** Returns a list [start ; start+1 ; ... ; start+n]. Default is [start=0]. *)
2018-07-20 16:09:06 +02:00
2018-06-28 14:43:24 +02:00
(** {2 Useful streams} *)
2018-07-20 16:09:06 +02:00
val stream_range : ?start:int -> int -> int Stream.t
2018-08-05 00:31:48 +02:00
(** Returns a stream <start ; start+1 ; ... ; start+n>. Default is [start=0]. *)
2018-07-20 16:09:06 +02:00
2018-03-22 00:29:14 +01:00
2018-03-06 18:25:48 +01:00
(** {2 Linear algebra } *)
2018-02-24 23:57:38 +01:00
val diagonalize_symm : Lacaml.D.mat -> Lacaml.D.mat * Lacaml.D.vec
(** Diagonalize a symmetric matrix. Returns the eigenvectors and the eigenvalues. *)
val xt_o_x : o:Lacaml.D.mat -> x:Lacaml.D.mat -> Lacaml.D.mat
2018-05-30 09:19:49 +02:00
(** Computes {% $\mathbf{X^\dag\, O\, X}$ %} *)
2018-02-24 23:57:38 +01:00
val canonical_ortho: ?thresh:float -> overlap:Lacaml.D.mat -> Lacaml.D.mat -> Lacaml.D.mat
2018-05-30 09:19:49 +02:00
(** Canonical orthogonalization. [overlap] is the overlap matrix {% $\mathbf{S}$ %},
and the last argument contains the vectors {% $\mathbf{C}$ %} to orthogonalize.
2018-05-30 18:07:05 +02:00
2018-05-30 09:19:49 +02:00
{%
2018-05-30 18:07:05 +02:00
$$
\mathbf{C_\bot} = \mathbf{C\, U\, D^{-1/2}}, \;
\mathbf{U\, D\, V^\dag} = \mathbf{S}
$$
2018-05-30 09:19:49 +02:00
%}
*)
2018-05-30 01:15:45 +02:00
val debug_matrix: string -> Lacaml.D.mat -> unit
(** Prints a matrix in stdout for debug *)
2018-03-15 15:25:49 +01:00
2018-07-05 00:39:17 +02:00
val matrix_of_file : string -> Lacaml.D.mat
(** Reads a matrix from a file with format "%d %d %f" corresponding to
[i, j, A.{i,j}]. *)
val sym_matrix_of_file : string -> Lacaml.D.mat
(** Reads a symmetric matrix from a file with format "%d %d %f" corresponding to
[i, j, A.{i,j}]. *)
2018-03-15 15:25:49 +01:00
(** {2 Printers} *)
val pp_float_array_size : Format.formatter -> float array -> unit
(** Example:
{[
[ 6: 1.000000 1.732051 1.732051 1.000000 1.732051 1.000000
]
]}
*)
val pp_float_array : Format.formatter -> float array -> unit
(** Example:
{[
[ 1.000000 1.732051 1.732051 1.000000 1.732051 1.000000
]
]}
*)
2018-03-20 14:11:31 +01:00
val pp_float_2darray_size : Format.formatter -> float array array -> unit
(** Example:
{[
[
2:[ 6: 1.000000 1.732051 1.732051 1.000000 1.732051 1.000000 ]
[ 4: 1.000000 2.000000 3.000000 4.000000 ] ]
]}
*)
val pp_float_2darray : Format.formatter -> float array array -> unit
(** Example:
{[
[ [ 1.000000 1.732051 1.732051 1.000000 1.732051 1.000000 ]
[ 1.000000 2.000000 3.000000 4.000000 ] ]
]}
*)
2018-06-27 13:13:59 +02:00
val pp_matrix : Format.formatter -> Lacaml.D.mat -> unit