(** A spin-determinant is one of the two determinants in the Waller-Hartree double determinant representation of a Slater determinant. It is represented as a bit string and a phase factor. *) type t (** {1 Accessors}. *) val phase : t -> Phase.t (** Phase factor. @raise [Invalid_argument] if the spin-determinant is [None]. *) val bitstring : t -> Z.t (** Bit string. @raise [Invalid_argument] if the spin-determinant is [None]. *) val is_none : t -> bool (** Tests if a spin-determinant is [None]. *) (** {1 Second quantization operators} *) val vac : t (** Vacuum state, [vac = Some ]{% $|\rangle$ %} *) val creation : int -> t -> t (** [creation p] is the creation operator {% $a^\dagger_p$ %}. *) val annihilation : int -> t -> t (** [annihilation q] is the annihilation operator {% $a_q$ %}. *) val of_list : int list -> t (** Builds a spin-determinant from a list of orbital indices. If the creation of the spin-determinant is not possible because of Pauli's exclusion principle, a [None] spin-determinant is returned. *) val to_list : t -> int list (** Transforms a spin-determinant into a list of orbital indices. *) (** {2 Printers}. *) val pp_spindet : Format.formatter -> t -> unit (** {2 Unit testing} *) val test_case : unit -> (string * [> `Quick ] * (unit -> unit)) list