open Input_determinants_by_hand
open Qptypes

let () =
  let ezfio, ezfio' =
    try
      Sys.argv.(1), Sys.argv.(2)
    with Invalid_argument _ ->
      raise (Invalid_argument (Printf.sprintf
         "Syntax : %s EZFIO1 EZFIO2" Sys.argv.(0)))
  in

  let fetch_wf filename =
    Ezfio.set_file filename;
    let mo_tot_num =
      Ezfio.get_mo_basis_mo_tot_num ()
      |> MO_number.of_int
    in
    let d =
      Determinants_by_hand.read ()
    in
    let n_det =
      Det_number.to_int d.Determinants_by_hand.n_det
    in
    let keys = 
      Array.map (Determinant.to_string ~mo_tot_num) 
        d.Determinants_by_hand.psi_det
    and values =
      Array.map Det_coef.to_float
        d.Determinants_by_hand.psi_coef
    in
    let hash = 
      Hashtbl.create n_det
    in
    for i=0 to n_det-1
    do
      Hashtbl.add hash keys.(i) values.(i);
    done;
    hash
  in

  let overlap wf wf' =
    let result, norm, norm' = 
      Hashtbl.fold (fun k c (accu,norm,norm') ->
        let c' =
          try  Hashtbl.find wf' k 
          with Not_found -> 0.
        in
        (accu +. c *. c' , 
        norm +. c *. c  , 
        norm'+. c'*. c' ) 
      ) wf (0.,0.,0.)
    in 
    result /. (norm *. norm')
  in

  let wf, wf' = 
     fetch_wf ezfio,
     fetch_wf ezfio'
  in

  let o = 
    overlap wf wf'
  in
  print_float (abs_float o)
  
