Exemplo n.º 1
0
        /// <summary>
        /// Default configuration constructor;
        /// </summary>
        public Config()
        {
            UseIndexConvention = IndexConvention.UpDown;
            QubitEncoding UseQubitEncoding = QubitEncoding.JordanWigner;

            UseTruncationThreshold = 1e-8;
        }
Exemplo n.º 2
0
        // Takes in a standard Q# format and outputs interpretable data to text
        // Input: Problem, state, indexConvention (default), qubitEncoding (default)
        // Output: No output, see ToPauliHamiltonian for generated filed
        public static void ToQSharpFormat(
            ProblemDescription problem,
            string state = "",
            IndexConvention indexConvention = IndexConvention.UpDown,
            QubitEncoding qubitEncoding     = QubitEncoding.JordanWigner
            )
        {
            var fermionHamiltonian = problem
                                     .OrbitalIntegralHamiltonian
                                     .ToFermionHamiltonian(indexConvention);

            Auxiliary.ToPauliHamiltonian(fermionHamiltonian, qubitEncoding);
        }
Exemplo n.º 3
0
        // Creates the file with fermion terms
        // Input: FermionHamiltonian, encoding type (default)
        // Output: Writes the fermion terms to a file
        public static void ToPauliHamiltonian(
            FermionHamiltonian sourceHamiltonian,
            QubitEncoding encoding = QubitEncoding.JordanWigner)
        {
            var lines = new List <String>();

            foreach (var termType in sourceHamiltonian.Terms)
            {
                foreach (var term in termType.Value)
                {
                    lines.Add(Auxiliary.ToJordanWignerPauliTerms(term.Key, termType.Key, term.Value.Value));
                }
            }
            System.IO.File.WriteAllLines("./_temp/_FermionTerms.txt", lines);
        }
        /// <summary>
        /// Method for constructing a Pauli Hamiltonian from a fermion Hamiltonina.
        /// </summary>
        /// <param name="sourceHamiltonian">Input orbital integral Hamiltonian.</param>
        /// <param name="encoding">Identifies how the terms should be encoded on the qubits.</param>
        /// <returns>Fermion Hamiltonian constructed from orbital integrals.</returns>
        public static PauliHamiltonian ToPauliHamiltonian(
            this FermionHamiltonian sourceHamiltonian,
            QubitEncoding encoding = QubitEncoding.JordanWigner)
        {
            var nFermions   = sourceHamiltonian.SystemIndices.Max() + 1;
            var hamiltonian = new PauliHamiltonian();
            Func <FermionTerm, TermType.Fermion, double, IEnumerable <(PauliTerm, PauliTermValue)> > conversion =
                (fermionTerm, termType, coeff)
                => (fermionTerm.ToJordanWignerPauliTerms(termType, coeff));

            foreach (var termType in sourceHamiltonian.Terms)
            {
                foreach (var term in termType.Value)
                {
                    hamiltonian.AddRange(conversion(term.Key, termType.Key, term.Value.Value));
                }
            }
            // Create a copy of fermion indices hash set.
            hamiltonian.SystemIndices = new HashSet <int>(sourceHamiltonian.SystemIndices.ToList());
            return(hamiltonian);
        }
Exemplo n.º 5
0
        /// <summary>
        /// Converts an electronic structure problem description
        /// into a format consumable by Q# using default settings.
        /// </summary>
        /// <param name="problem">Input electronic structure problem description.</param>
        /// <param name="state">Selected wavefunction ansatz. This uses the Hartree–Fock state by default.</param>
        /// <param name="indexConvention">Convention for mapping spin-orbit indices to integer indices.</param>
        /// <param name="qubitEncoding">Scheme for mapping fermions to qubits.</param>
        /// <returns>
        /// A representation of <paramref name="problem" /> suitable for passing to Q# simulation operations.
        /// </returns>
        public static JordanWignerEncodingData ToQSharpFormat(
            this ProblemDescription problem,
            string state = "",
            IndexConvention indexConvention = IndexConvention.UpDown,
            QubitEncoding qubitEncoding     = QubitEncoding.JordanWigner
            )
        {
            var fermionHamiltonian = problem
                                     .OrbitalIntegralHamiltonian
                                     .ToFermionHamiltonian(indexConvention);

            var wavefunction = problem.Wavefunctions.ContainsKey(state) ?
                               problem.Wavefunctions[state].ToIndexing(indexConvention) :
                               fermionHamiltonian.CreateHartreeFockState(problem.NElectrons);

            var pauliHamiltonian = fermionHamiltonian.ToPauliHamiltonian(qubitEncoding);

            var pauliHamiltonianQSharpFormat = pauliHamiltonian.ToQSharpFormat();
            var wavefunctionQSharpFormat     = wavefunction.ToQSharpFormat();

            return(QSharpFormat.Convert.ToQSharpFormat(pauliHamiltonianQSharpFormat, wavefunctionQSharpFormat));
        }