Exemplo n.º 1
0
        /// <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);
        }
Exemplo n.º 2
0
        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);
        }
Exemplo n.º 4
0
        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);
        }