public static JordanWignerEncodingData GetQSharpData(string filename, string wavefunctionLabel, Config configuration) { using var reader = File.OpenText(filename); var broombridge = BroombridgeSerializer.Deserialize(reader).First(); var orbHam = broombridge.OrbitalIntegralHamiltonian; var ferHam = orbHam.ToFermionHamiltonian(configuration.UseIndexConvention); var pauHam = ferHam.ToPauliHamiltonian(); var hamiltonian = pauHam.ToQSharpFormat(); var inputStates = broombridge.InitialStates ?? new Dictionary <string, FermionWavefunction <SpinOrbital> >(); // If no states are provided, use the Hartree--Fock state. // As fermion operators the fermion Hamiltonian are already indexed by, we now apply the desired // spin-orbital -> integer indexing convention. FermionWavefunction <int> wavefunction = inputStates.ContainsKey(wavefunctionLabel) ? inputStates[wavefunctionLabel].ToIndexing(configuration.UseIndexConvention) : ferHam.CreateHartreeFockState(broombridge.NElectrons); var qSharpData = Microsoft.Quantum.Chemistry.QSharpFormat.Convert.ToQSharpFormat(hamiltonian, wavefunction.ToQSharpFormat()); return(qSharpData); }
void OnExecute() { var logger = new 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}..."); using var reader = File.OpenText(Path); var generalHamiltonian = (Format switch { DataFormat.Broombridge => BroombridgeSerializer .Deserialize(reader), DataFormat.LiQuiD => LiQuiDSerializer .Deserialize(reader), _ => throw new ArgumentException($"Invalid data format {Format}.") })
static void ParseBroombridge(string path, out int nElectrons, out FermionHamiltonian hamiltonian) { using var reader = File.OpenText(path); var description = BroombridgeSerializer .Deserialize(reader) .Single(); nElectrons = description.NElectrons; hamiltonian = description .OrbitalIntegralHamiltonian .ToFermionHamiltonian(IndexConvention.UpDown); }
public void RoundtripFcidumpIsCorrect() { // Start by converting the Fcidump data deserialized // in the test fixture out to Broombridge. using var writer = new StringWriter(); BroombridgeSerializer.Serialize(writer, new [] { fixture.problem }); // Now deserialize back from Broombridge. using var reader = new StringReader(writer.ToString()); var roundtripData = BroombridgeSerializer.Deserialize(reader).Single(); // Next, check that the resulting problem is the same. AssertThat(fixture.problem.IsEqualTo(roundtripData)); }
// 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}.") })
static void LoadFromBroombridgeFile() { // This is the name of the file we want to load var filename = @"LiH_0.2.yaml"; // This is the directory containing the file var root = @"Molecules"; // This deserializes Broombridge. using var reader = File.OpenText(Path.Combine(root, filename)); var broombridge = BroombridgeSerializer.Deserialize(reader); // Note that the deserializer returns a list of electronic structure problem instances // as the file might describe multiple Hamiltonians. In this example, there is // only one Hamiltonian. So we use `.Single()`, which selects the only element of the list. var problem = broombridge.Single(); // This extracts the `OrbitalIntegralHamiltonian` from Broombridge format, // then converts it to a fermion Hamiltonian, then to a Jordan–Wigner // representation. var orbitalIntegralHamiltonian = problem.OrbitalIntegralHamiltonian; var fermionHamiltonian = orbitalIntegralHamiltonian.ToFermionHamiltonian(IndexConvention.UpDown); var jordanWignerEncoding = fermionHamiltonian.ToPauliHamiltonian(Paulis.QubitEncoding.JordanWigner); // The desired initial state, assuming that a description of it is present in the // Broombridge schema. var state = "|E1>"; var wavefunction = problem.InitialStates[state].ToIndexing(IndexConvention.UpDown); // This creates the qSharpData consumable by the Q# chemistry library algorithms. var qSharpHamiltonianData = jordanWignerEncoding.ToQSharpFormat(); var qSharpWavefunctionData = wavefunction.ToQSharpFormat(); var qSharpData = QSharpFormat.Convert.ToQSharpFormat(qSharpHamiltonianData, qSharpWavefunctionData); Assert.True(wavefunction.Method == StateType.SparseMultiConfigurational); Assert.True(jordanWignerEncoding.SystemIndices.Count() == 12); }