diff --git a/CI/Determinant.ml b/CI/Determinant.ml index 6d7c342..ff62d3e 100644 --- a/CI/Determinant.ml +++ b/CI/Determinant.ml @@ -1,86 +1,40 @@ -type phase_type = -| Plus -| Minus - -type spin_determinant_type = +type t = { - bitstring : Z.t ; - phase : phase_type; -} - -type determinant_type = -{ - alpha : Z.t ; - beta : Z.t ; - phase : phase_type; + alpha : Spindeterminant.t ; + beta : Spindeterminant.t ; } -type t = determinant_type + +let alpha t = t.alpha + +let beta t = t.beta + +let phase t = + match Spindeterminant.(phase t.alpha, phase t.beta) with + | Phase.Pos, Phase.Pos + | Phase.Neg, Phase.Neg -> Phase.Pos + | _ -> Phase.Neg -let spindet_of_list l = - let rec aux accu nperm = function - | [] -> accu, if nperm mod 2 = 0 then Plus else Minus - | i :: rest -> - let i = pred i in - let x = Z.(shift_left one i) in - let accu = Z.logor accu x in - let nperm = - let mask = Z.(x-one) in - let r = Z.logand accu mask in - if r = Z.zero then - nperm - else - nperm + (Z.popcount r) - in - aux accu nperm rest - in - List.rev l - |> aux Z.zero 0 - - - -(* TODO Phase *) -let rec to_list spindet = - let rec aux accu z = - if z <> Z.zero then - let element = (Z.(trailing_zeros z)+1) in - aux (element::accu) Z.(z land (pred z)) - else List.rev accu - in aux [] spindet - +let of_spindeterminants a b = + { + alpha = a ; + beta = b + } let of_lists a b = - let alpha, phase_a = - spindet_of_list a - in - let beta, phase_b = - spindet_of_list b - in - let phase = - match phase_a, phase_b with - | Plus , Plus -> Plus - | Minus, Minus-> Plus - | _ -> Minus - in - { alpha ; beta ; phase } - -let alpha det = det.alpha -let beta det = det.beta - -let sgn det = - match det.phase with - | Plus -> 1. - | Minus -> -1. - -let pp_spindet ppf spindet = - String.init (Z.numbits spindet) (fun i -> if (Z.testbit spindet i) then '+' else '-') - |> Format.fprintf ppf "@[ @[ %s @]@]" + { + alpha = Spindeterminant.of_list a ; + beta = Spindeterminant.of_list b + } -let pp_det ppf det = - Format.fprintf ppf "@[ a: %a @; b: %a @]@." pp_spindet det.alpha pp_spindet det.beta +let pp_det ppf t = + Format.fprintf ppf "@[ a: %a @; b: %a @]@." + Spindeterminant.pp_spindet t.alpha + Spindeterminant.pp_spindet t.beta + let test_case () =