// 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 <FermionHamiltonian> hamiltonians = format.Map( (IntegralDataFormat.Liquid, () => FermionHamiltonian.LoadFromLiquid(filename)), (IntegralDataFormat.YAML, () => FermionHamiltonian.LoadFromYAML(filename)) ); var hamiltonian = hamiltonians.First(); // Process Hamiltonitn to obtain optimized Jordan-Wigner representation. var jordanWignerEncoding = JordanWignerEncoding.Create(hamiltonian); // Convert to format for consumption by Q# algorithms. var qSharpData = jordanWignerEncoding.QSharpData(); var gateCountResults = new List <GateCountResults>(); foreach (var config in configurations) { GateCountResults results = await RunGateCount(qSharpData, config); results.HamiltonianName = hamiltonian.Name; results.IntegralDataPath = filename; results.SpinOrbitals = jordanWignerEncoding.NSpinOrbitals; gateCountResults.Add(results); } return(gateCountResults); }
// 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); }
// This method computes the gate count of simulation a single configuration passed to it. internal static async Task <GateCountResults> RunGateCount(JordanWignerEncodingData qSharpData, HamiltonianSimulationConfig config) { // Creates and configures Trace simulator for accumulating gate counts. QCTraceSimulator sim = CreateAndConfigureTraceSim(); // Create stop-watch to measure the execution time Stopwatch stopWatch = new Stopwatch(); var gateCountResults = new GateCountResults(); #region Trace Simulator on Trotter step if (config.hamiltonianSimulationAlgorithm == HamiltonianSimulationConfig.HamiltonianSimulationAlgorithm.ProductFormula) { stopWatch.Reset(); stopWatch.Start(); var res = await RunTrotterStep.Run(sim, qSharpData); stopWatch.Stop(); gateCountResults = new GateCountResults { Method = "Trotter", ElapsedMilliseconds = stopWatch.ElapsedMilliseconds, RotationsCount = sim.GetMetric <RunTrotterStep>(PrimitiveOperationsGroupsNames.R), TCount = sim.GetMetric <RunTrotterStep>(PrimitiveOperationsGroupsNames.T), CNOTCount = sim.GetMetric <RunTrotterStep>(PrimitiveOperationsGroupsNames.CNOT), TraceSimulationStats = sim.ToCSV() }; // Dump all the statistics to CSV files, one file per statistics collector // FIXME: the names here aren't varied, and so the CSVs will get overwritten when running many // different Hamiltonians. var gateStats = sim.ToCSV(); foreach (var x in gateStats) { System.IO.File.WriteAllLines($"TrotterGateCountEstimates.{x.Key}.csv", new string[] { x.Value }); } } #endregion #region Trace Simulator on Qubitization step if (config.hamiltonianSimulationAlgorithm == HamiltonianSimulationConfig.HamiltonianSimulationAlgorithm.Qubitization) { if (config.qubitizationConfig.qubitizationStatePrep == HamiltonianSimulationConfig.QubitizationConfig.QubitizationStatePrep.MinimizeQubitCount) { stopWatch.Reset(); stopWatch.Start(); var res = await RunQubitizationStep.Run(sim, qSharpData); stopWatch.Stop(); gateCountResults = new GateCountResults { Method = "Qubitization", ElapsedMilliseconds = stopWatch.ElapsedMilliseconds, RotationsCount = sim.GetMetric <RunQubitizationStep>(PrimitiveOperationsGroupsNames.R), TCount = sim.GetMetric <RunQubitizationStep>(PrimitiveOperationsGroupsNames.T), CNOTCount = sim.GetMetric <RunQubitizationStep>(PrimitiveOperationsGroupsNames.CNOT), TraceSimulationStats = sim.ToCSV() }; // Dump all the statistics to CSV files, one file per statistics collector // FIXME: the names here aren't varied, and so the CSVs will get overwritten when running many // different Hamiltonians. var gateStats = sim.ToCSV(); foreach (var x in gateStats) { System.IO.File.WriteAllLines($"QubitizationGateCountEstimates.{x.Key}.csv", new string[] { x.Value }); } } } #endregion #region Trace Simulator on Optimized Qubitization step if (config.hamiltonianSimulationAlgorithm == HamiltonianSimulationConfig.HamiltonianSimulationAlgorithm.Qubitization) { if (config.qubitizationConfig.qubitizationStatePrep == HamiltonianSimulationConfig.QubitizationConfig.QubitizationStatePrep.MinimizeTGateCount) { stopWatch.Reset(); stopWatch.Start(); // This primarily affects the Qubit count and CNOT count. // The T-count only has a logarithmic dependence on this parameter. var targetError = 0.001; var res = await RunOptimizedQubitizationStep.Run(sim, qSharpData, targetError); stopWatch.Stop(); gateCountResults = new GateCountResults { Method = "Optimized Qubitization", ElapsedMilliseconds = stopWatch.ElapsedMilliseconds, RotationsCount = sim.GetMetric <RunOptimizedQubitizationStep>(PrimitiveOperationsGroupsNames.R), TCount = sim.GetMetric <RunOptimizedQubitizationStep>(PrimitiveOperationsGroupsNames.T), CNOTCount = sim.GetMetric <RunOptimizedQubitizationStep>(PrimitiveOperationsGroupsNames.CNOT), TraceSimulationStats = sim.ToCSV() }; // Dump all the statistics to CSV files, one file per statistics collector // FIXME: the names here aren't varied, and so the CSVs will get overwritten when running many // different Hamiltonians. var gateStats = sim.ToCSV(); foreach (var x in gateStats) { System.IO.File.WriteAllLines($"OptimizedQubitizationGateCountEstimates.{x.Key}.csv", new string[] { x.Value }); } } } #endregion return(gateCountResults); }
// This method computes the gate count of simulation a single configuration passed to it. internal static async Task <GateCountResults> RunGateCount( JordanWignerEncodingData qSharpData, HamiltonianSimulationConfig config, string outputFolder = null ) { // Creates and configures Trace simulator for accumulating gate counts. var sim = CreateAndConfigureTraceSim(); // Create stop-watch to measure the execution time var stopWatch = new Stopwatch(); var gateCountResults = new GateCountResults(); #region Trace Simulator on Trotter step if (config.HamiltonianSimulationAlgorithm == HamiltonianSimulationAlgorithm.ProductFormula) { var res = await stopWatch.Measure(async() => await RunTrotterStep.Run(sim, qSharpData)); gateCountResults = new GateCountResults { Method = "Trotter", ElapsedMilliseconds = stopWatch.ElapsedMilliseconds, RotationsCount = sim.GetMetric <RunTrotterStep>(PrimitiveOperationsGroupsNames.R), TCount = sim.GetMetric <RunTrotterStep>(PrimitiveOperationsGroupsNames.T), CNOTCount = sim.GetMetric <RunTrotterStep>(PrimitiveOperationsGroupsNames.CNOT), TraceSimulationStats = sim.ToCSV() }; // Dump all the statistics to CSV files, one file per statistics collector // FIXME: the names here aren't varied, and so the CSVs will get overwritten when running many // different Hamiltonians. if (outputFolder != null) { sim.WriteResultsToFolder(outputFolder, "TrotterGateCountEstimates"); } } #endregion #region Trace Simulator on Qubitization step if (config.HamiltonianSimulationAlgorithm == HamiltonianSimulationAlgorithm.Qubitization) { if (config.QubitizationConfig.QubitizationStatePrep == QubitizationStatePrep.MinimizeQubitCount) { var res = await stopWatch.Measure(async() => await RunQubitizationStep.Run(sim, qSharpData)); gateCountResults = new GateCountResults { Method = "Qubitization", ElapsedMilliseconds = stopWatch.ElapsedMilliseconds, RotationsCount = sim.GetMetric <RunQubitizationStep>(PrimitiveOperationsGroupsNames.R), TCount = sim.GetMetric <RunQubitizationStep>(PrimitiveOperationsGroupsNames.T), CNOTCount = sim.GetMetric <RunQubitizationStep>(PrimitiveOperationsGroupsNames.CNOT), TraceSimulationStats = sim.ToCSV(), NormMultipler = res }; // Dump all the statistics to CSV files, one file per statistics collector // FIXME: the names here aren't varied, and so the CSVs will get overwritten when running many // different Hamiltonians. if (outputFolder != null) { sim.WriteResultsToFolder(outputFolder, "QubitizationGateCountEstimates"); } } } #endregion #region Trace Simulator on Optimized Qubitization step if (config.HamiltonianSimulationAlgorithm == HamiltonianSimulationAlgorithm.Qubitization) { if (config.QubitizationConfig.QubitizationStatePrep == QubitizationStatePrep.MinimizeTGateCount) { // This primarily affects the Qubit count and CNOT count. // The T-count only has a logarithmic dependence on this parameter. var targetError = 0.001; var res = await stopWatch.Measure(async() => await RunOptimizedQubitizationStep.Run(sim, qSharpData, targetError)); stopWatch.Stop(); gateCountResults = new GateCountResults { Method = "Optimized Qubitization", ElapsedMilliseconds = stopWatch.ElapsedMilliseconds, RotationsCount = sim.GetMetric <RunOptimizedQubitizationStep>(PrimitiveOperationsGroupsNames.R), TCount = sim.GetMetric <RunOptimizedQubitizationStep>(PrimitiveOperationsGroupsNames.T), CNOTCount = sim.GetMetric <RunOptimizedQubitizationStep>(PrimitiveOperationsGroupsNames.CNOT), TraceSimulationStats = sim.ToCSV(), NormMultipler = res }; // Dump all the statistics to CSV files, one file per statistics collector // FIXME: the names here aren't varied, and so the CSVs will get overwritten when running many // different Hamiltonians. if (outputFolder != null) { sim.WriteResultsToFolder(outputFolder, "OptimizedQubitizationGateCountEstimates"); } } } #endregion return(gateCountResults); }