/// <summary> /// Converts the raw problem description in V0_2 Broombridge into /// in internal data format. /// </summary> /// <param name="problem">Problem description to be converted</param> /// <returns>The internal problem description data structure.</returns> public static ProblemDescription ProcessRawProblemDescription(Broombridge.V0_2.ProblemDescription problem) { var problemDescription = new ProblemDescription { EnergyOffset = problem.EnergyOffset.Value + problem.CoulombRepulsion.Value, NElectrons = problem.NElectrons, NOrbitals = problem.NOrbitals, OrbitalIntegralHamiltonian = V0_2.ToOrbitalIntegralHamiltonian(problem), Wavefunctions = new Dictionary <string, FermionWavefunction <SpinOrbital> >() }; foreach (var initialState in problem.InitialStates) { var finalState = new FermionWavefunction <SpinOrbital>(); var(method, energy, outputState) = V0_2.ToWavefunction(initialState); var setMethod = V0_2.ParseInitialStateMethod(initialState.Method); var setEnergy = energy; if (setMethod == StateType.SparseMultiConfigurational) { var mcfData = (SparseMultiCFWavefunction <SpinOrbital>)outputState; finalState = new FermionWavefunction <SpinOrbital>( mcfData.Excitations .Select(o => ( o.Key.ToIndices().ToArray(), o.Value.Real ))); } else if (setMethod == StateType.UnitaryCoupledCluster) { var uccData = (UnitaryCCWavefunction <SpinOrbital>)outputState; var reference = uccData.Reference; var excitations = uccData.Excitations; finalState = new FermionWavefunction <SpinOrbital>( reference.ToIndices(), excitations .Select(o => ( o.Key.ToIndices().ToArray(), o.Value.Real )) ); } else { throw new System.ArgumentException($"Wavefunction type {setMethod} not recognized"); } finalState.Method = setMethod; finalState.Energy = setEnergy; problemDescription.Wavefunctions.Add(initialState.Label, finalState); } return(problemDescription); }
internal Data(Broombridge.V0_2.Data broombridgeV0_2) { Raw = broombridgeV0_2; Schema = broombridgeV0_2.Schema; VersionNumber = VersionNumber.v0_2; ProblemDescriptions = Raw.ProblemDescriptions.Select(problem => ProblemDescription.ProcessRawProblemDescription(problem)); }
/// <summary> /// Builds Hamiltonian from Broombridge if data is available. /// </summary> internal static OrbitalIntegralHamiltonian ToOrbitalIntegralHamiltonian(ProblemDescription broombridge) { // Add the identity terms var identityterm = broombridge.CoulombRepulsion.Value + broombridge.EnergyOffset.Value; var hamiltonian = V0_1.ToOrbitalIntegralHamiltonian(broombridge.Hamiltonian); hamiltonian.Add(new OrbitalIntegral(), identityterm); return(hamiltonian); }
public static ProblemDescription ProcessRawProblemDescription(Broombridge.V0_2.ProblemDescription problem) { var problemDescription = new ProblemDescription { EnergyOffset = problem.EnergyOffset.Value + problem.CoulombRepulsion.Value, NElectrons = problem.NElectrons, NOrbitals = problem.NOrbitals, OrbitalIntegralHamiltonian = V0_2.ToOrbitalIntegralHamiltonian(problem), Wavefunctions = problem.InitialStates?.FromBroombridgeV0_2() ?? new Dictionary <string, FermionWavefunction <SpinOrbital> >() }; return(problemDescription); }