// This method computes the gate count of simulation by all configurations passed to it.
        internal static async Task <IEnumerable <GateCountResults> > RunGateCount(string filename, IntegralDataFormat format, IEnumerable <HamiltonianSimulationConfig> configurations)
        {
            // Read Hamiltonian terms from file.
            IEnumerable <OrbitalIntegrals.OrbitalIntegralHamiltonian> hamiltonians =
                format.Map(
                    (IntegralDataFormat.Liquid, () => LiQuiD.Deserialize(filename).Select(o => o.OrbitalIntegralHamiltonian)),
                    (IntegralDataFormat.YAML, () => Broombridge.Deserializers.DeserializeBroombridge(filename).ProblemDescriptions.Select(o => o.OrbitalIntegralHamiltonian))
                    );

            var hamiltonian = hamiltonians.First();

            // Process Hamiltonitn to obtain optimized Jordan–Wigner representation.
            var jordanWignerEncoding = hamiltonian
                                       .ToFermionHamiltonian(IndexConvention.UpDown)
                                       .ToPauliHamiltonian(Paulis.QubitEncoding.JordanWigner);

            // Convert to format for consumption by Q# algorithms.
            var qSharpData = jordanWignerEncoding.ToQSharpFormat().Pad();

            var gateCountResults = new List <GateCountResults>();

            foreach (var config in configurations)
            {
                GateCountResults results = await RunGateCount(qSharpData, config);

                results.HamiltonianName  = filename;
                results.IntegralDataPath = filename;
                results.SpinOrbitals     = jordanWignerEncoding.SystemIndices.Count();
                gateCountResults.Add(results);
            }

            return(gateCountResults);
        }
Beispiel #2
0
 static void ParseLiQuiD(string path, out int nElectrons, out FermionHamiltonian hamiltonian)
 {
     nElectrons  = 2;
     hamiltonian = LiQuiD
                   .Deserialize(path)
                   .Single()
                   .OrbitalIntegralHamiltonian
                   .ToFermionHamiltonian(IndexConvention.UpDown);
 }
Beispiel #3
0
        void OnExecute()
        {
            var logger = Logging.LoggerFactory.CreateLogger <Program>();

            // Directory containing integral data generated by Microsoft.
            //Example Liquid data format files

            /*
             * "h2_sto3g_4.dat" // 4 SO
             * "B_sto6g.dat" // 10 SO
             * "Be_sto6g_10.dat" // 10 SO
             * "h2o_sto6g_14.dat" // 14 SO
             * "h2s_sto6g_22.dat" // 22 SO
             * "co2_sto3g_30.dat" // 30 SO
             * "co2_p321_54.dat" // 54 SO
             * "fe2s2_sto3g.dat" // 110 SO
             * "nitrogenase_tzvp_54.dat" // 108 SO
             */

            // For loading data in the format consumed by Liquid.
            logger.LogInformation($"Processing {Path}...");
            var generalHamiltonian =
                (
                    Format == DataFormat.Broombridge

                    ? Broombridge
                    .Deserializers
                    .DeserializeBroombridge(Path)
                    .ProblemDescriptions
                    .Single()
                    .OrbitalIntegralHamiltonian

                    : LiQuiD
                    .Deserialize(Path)
                    .Single()
                    .OrbitalIntegralHamiltonian
                )
                .ToFermionHamiltonian(IndexConvention.UpDown);

            logger.LogInformation("End read file. Computing one-norms.");

            foreach (var termType in generalHamiltonian.Terms.Keys)
            {
                var line = $"One-norm for term type {termType}: {generalHamiltonian.Norm(new[] { termType }, 1.0)}";
                logger.LogInformation(line);
            }
            logger.LogInformation("Computed one-norm.");

            if (System.Diagnostics.Debugger.IsAttached)
            {
                System.Console.ReadLine();
            }
        }
Beispiel #4
0
        static void Main(string[] args)
        {
            var logger = Logging.LoggerFactory.CreateLogger <Program>();

            // Directory containing integral data generated by Microsoft.
            //Example Liquid data format files

            /*
             * "h2_sto3g_4.dat" // 4 SO
             * "B_sto6g.dat" // 10 SO
             * "Be_sto6g_10.dat" // 10 SO
             * "h2o_sto6g_14.dat" // 14 SO
             * "h2s_sto6g_22.dat" // 22 SO
             * "co2_sto3g_30.dat" // 30 SO
             * "co2_p321_54.dat" // 54 SO
             * "fe2s2_sto3g.dat" // 110 SO
             * "nitrogenase_tzvp_54.dat" // 108 SO
             */

            string LiquidRoot     = @"..\IntegralData\Liquid\";
            string LiquidFilename = "Be_sto6g_10.dat";

            // For loading data in the format consumed by Liquid.
            logger.LogInformation($"Processing {LiquidFilename}");
            var generalHamiltonian0 = LiQuiD.Deserialize($@"{LiquidRoot}\{LiquidFilename}").Single()
                                      .OrbitalIntegralHamiltonian
                                      .ToFermionHamiltonian(IndexConvention.UpDown);

            // For loading data in the YAML format.
            string YAMLRoot            = @"..\IntegralData\YAML\";
            string YAMLFilename        = "lih_sto-3g_0.800_int.yaml";
            var    generalHamiltonian1 = Broombridge.Deserializers.DeserializeBroombridge($@"{YAMLRoot}\{YAMLFilename}")
                                         .ProblemDescriptions.Single()
                                         .OrbitalIntegralHamiltonian
                                         .ToFermionHamiltonian(IndexConvention.UpDown);

            // Read Hamiltonian terms from file.

            logger.LogInformation("End read file. Computing one-norms.");
            foreach (var termType in generalHamiltonian0.Terms.Keys)
            {
                var line = $"One-norm for term type {termType}: {generalHamiltonian0.Norm(new[] { termType }, 1.0)}";
                logger.LogInformation(line);
            }
            logger.LogInformation("Computed one-norm.");

            if (System.Diagnostics.Debugger.IsAttached)
            {
                System.Console.ReadLine();
            }
        }
        static void LoadFromLiquidFile()
        {
            // This is the name of the file we want to load
            var filename = @"B_sto6g.dat"; // This is Ferrodoxin.
            // This is the directory containing the file
            var root = @"Molecules";

            // Deserialize the LiQuiD format.
            var problem = LiQuiD.Deserialize(Path.Combine(root, filename)).First();

            // This extracts the `OrbitalIntegralHamiltonian` from problem
            // description format.
            var orbitalIntegralHamiltonian = problem.OrbitalIntegralHamiltonian;

            Assert.True(orbitalIntegralHamiltonian.CountTerms() > 10);
        }
Beispiel #6
0
        // This method computes the gate count of simulation by all configurations passed to it.
        internal static async Task <IEnumerable <GateCountResults> > RunGateCount(
            string filename, IntegralDataFormat format, IEnumerable <HamiltonianSimulationConfig> configurations,
            string outputFolder = null
            )
        {
            // To get the data for exporting to Q#, we proceed in several steps.
            var jordanWignerEncoding =
                // First, we deserialize the file given by filename, using the
                // format given by format.
                format.Map(
                    (IntegralDataFormat.Liquid, () => LiQuiD.Deserialize(filename).Select(o => o.OrbitalIntegralHamiltonian)),
                    (IntegralDataFormat.Broombridge, () => Broombridge.Deserializers.DeserializeBroombridge(filename).ProblemDescriptions.Select(o => o.OrbitalIntegralHamiltonian))
                    )
                // In general, Broombridge allows for loading multiple Hamiltonians
                // from a single file. For the purpose of simplicitly, however,
                // we'll only load a single Hamiltonian from each file in this
                // sample. We use .Single here instead of .First to make sure
                // that we raise an error instead of silently discarding data.
                .Single()
                // Next, we convert to a fermionic Hamiltonian using the UpDown
                // convention.
                .ToFermionHamiltonian(IndexConvention.UpDown)
                // Finally, we use the optimized Jordan–Wigner representation
                // to convert to a qubit Hamiltonian that we can export to
                // a format understood by Q#.
                .ToPauliHamiltonian(Paulis.QubitEncoding.JordanWigner);

            // We save the exported Q# data into a variable that we can pass
            // to the trace simulator.
            var qSharpData = jordanWignerEncoding
                             .ToQSharpFormat()
                             .Pad();

            var gateCountResults = new List <GateCountResults>();

            foreach (var config in configurations)
            {
                var results = await RunGateCount(qSharpData, config, outputFolder);

                results.IntegralDataPath = filename;
                results.SpinOrbitals     = jordanWignerEncoding.SystemIndices.Count();
                gateCountResults.Add(results);
            }

            return(gateCountResults);
        }
Beispiel #7
0
        public void LoadFromLiquidTest(string line, TermType.OrbitalIntegral termType, OrbitalIntegral term)
        {
            //var test = terms.Item1;
            //string[] lines, FermionTermType termType, FermionTerm[] terms
            var hamiltonian = LiQuiD.DeserializeSingle(line).OrbitalIntegralHamiltonian;

            Assert.True(hamiltonian.Terms.ContainsKey(termType));
            // Check that expected terms are found

            var orb = hamiltonian.Terms[termType].Keys.First();

            // Check index
            //Assert.True(term == orb);

            // Check coefficient
            Assert.Equal(term.Coefficient, hamiltonian.Terms[termType][term.ToCanonicalForm()].Value);
        }
Beispiel #8
0
        static void Main(string[] args)
        {
            var logger = Logging.LoggerFactory.CreateLogger <Program>();

            // Directory containing integral data generated by Microsoft.
            //Example Liquid data format files

            /*
             * "h2_sto3g_4.dat" // 4 SO
             * "B_sto6g.dat" // 10 SO
             * "Be_sto6g_10.dat" // 10 SO
             * "h2o_sto6g_14.dat" // 14 SO
             * "h2s_sto6g_22.dat" // 22 SO
             * "co2_sto3g_30.dat" // 30 SO
             * "co2_p321_54.dat" // 54 SO
             * "fe2s2_sto3g.dat" // 110 SO
             * "nitrogenase_tzvp_54.dat" // 108 SO
             */



            // Read Hamiltonian terms from file.
            // Stopwatch for logging time to process file.
            Stopwatch stopWatch = new Stopwatch();


            #region For loading data in the format consumed by Liquid.
            stopWatch.Start();
            string LiquidRoot     = @"..\IntegralData\Liquid\";
            string LiquidFilename = "h2_sto3g_4.dat";

            logger.LogInformation($"Processing {LiquidFilename}");
            var problemDescriptionLiQuiD = LiQuiD.Deserialize($@"{LiquidRoot}\{LiquidFilename}").Single();
            // Number of electrons. This must be specified for the liquid format.
            problemDescriptionLiQuiD.NElectrons = 2;

            logger.LogInformation($"Liquid Load took {stopWatch.ElapsedMilliseconds}ms");
            stopWatch.Restart();
            #endregion
            #region For loading data in the Broombridge format.
            stopWatch.Start();
            string YAMLRoot     = @"..\IntegralData\YAML\";
            string YAMLFilename = "lih_sto-3g_0.800_int.yaml";
            var    problemDescriptionBroombridge = Broombridge.Deserializers.DeserializeBroombridge($@"{YAMLRoot}\{YAMLFilename}").ProblemDescriptions.Single();
            logger.LogInformation($"Broombridge Load took {stopWatch.ElapsedMilliseconds}ms");
            stopWatch.Restart();
            #endregion

            // Select problem description to use
            var problemDescription = problemDescriptionBroombridge;
            var fermionHamiltonian = problemDescription.OrbitalIntegralHamiltonian.ToFermionHamiltonian(IndexConvention.UpDown);

            // Logs spin-orbital data in Logger.Message.
            logger.LogInformation(fermionHamiltonian.ToString());

            // Process Hamiltonitn to obtain Jordan–Wigner representation.
            var jordanWignerEncoding = fermionHamiltonian.ToPauliHamiltonian(Paulis.QubitEncoding.JordanWigner);

            // Create input wavefunction.
            var wavefunction = fermionHamiltonian.CreateHartreeFockState(problemDescription.NElectrons);

            // Alternately, use wavefunction contained in problem description,
            // if available
            // var wavefunction = problemDescription.Wavefunctions["label"].ToIndexing(IndexConvention.UpDown);

            // Logs Jordan–Wigner representation data in Logger.Message.
            logger.LogInformation(jordanWignerEncoding.ToString());

            logger.LogInformation("End read file");

            // We begin by making an instance of the simulator that we will use to run our Q# code.
            using (var qsim = new QuantumSimulator())
            {
                // Package hamiltonian and wavefunction data into a format
                // consumed by Q#.
                var qSharpData = QSharpFormat.Convert.ToQSharpFormat(
                    jordanWignerEncoding.ToQSharpFormat(),
                    wavefunction.ToQSharpFormat());

                #region Calling into Q#
                // Bits of precision in phase estimation.
                var bits = 10;

                // Repetitions to find minimum energy.
                var reps = 5;

                // Run phase estimation simulation using Jordan–Wigner Trotterization.
                var runJW = true;

                // Trotter step size.
                var trotterStep = .4;

                // Run phase estimation simulation using Jordan–Wigner Trotterization with optimzied circuit.
                var runJWOptimized = true;

                // Run phase estimation simulation using Jordan–Wigner qubitization.
                var runJWQubitization = true;

                if (runJW)
                {
                    for (int i = 0; i < reps; i++)
                    {
                        var(phaseEst, energyEst) = TrotterEstimateEnergy.Run(qsim, qSharpData, bits, trotterStep).Result;
                        logger.LogInformation($"Trotter simulation. phase: {phaseEst}; energy {energyEst}");
                    }
                }
                if (runJWOptimized)
                {
                    for (int i = 0; i < reps; i++)
                    {
                        var(phaseEst, energyEst) = OptimizedTrotterEstimateEnergy.Run(qsim, qSharpData, bits - 1, trotterStep).Result;
                        logger.LogInformation($"Optimized Trotter simulation. phase {phaseEst}; energy {energyEst}");
                    }
                }
                if (runJWQubitization)
                {
                    for (int i = 0; i < reps; i++)
                    {
                        var(phaseEst, energyEst) = QubitizationEstimateEnergy.Run(qsim, qSharpData, bits - 2).Result;
                        logger.LogInformation($"Qubitization simulation. phase: {phaseEst}; energy {energyEst}");
                    }
                }

                #endregion
            }


            if (System.Diagnostics.Debugger.IsAttached)
            {
                System.Console.ReadLine();
            }
        }