// 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); }
static void ParseLiQuiD(string path, out int nElectrons, out FermionHamiltonian hamiltonian) { nElectrons = 2; hamiltonian = LiQuiD .Deserialize(path) .Single() .OrbitalIntegralHamiltonian .ToFermionHamiltonian(IndexConvention.UpDown); }
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(); } }
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); }
// 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); }
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); }
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(); } }