// 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 ) { using var reader = File.OpenText(filename); // 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 switch { IntegralDataFormat.Liquid => LiQuiDSerializer.Deserialize(reader), IntegralDataFormat.Broombridge => BroombridgeSerializer.Deserialize(reader), _ => throw new ArgumentException($"Invalid data format {format}.") })
// 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); }
// 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); }