Esempio n. 1
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
     )
 {
     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}.")
     })
Esempio n. 2
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);
        }
Esempio n. 3
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)
        {
            // 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);
        }