// Extracts the JW terms from the Hamiltonian // Input: Individual fermionTerm, type of the term, coefficient // Output: String describing the term information public static String ToJordanWignerPauliTerms( FermionTerm fermionTerm, TermType.Fermion termType, double coeff) { // Console.WriteLine(fermionTerm.ToString()); var seq = fermionTerm.Sequence.Select(o => o.Index).ToArray(); var string_output = $"{termType.ToString()} | {String.Join(",", seq.Select(p => p.ToString()).ToArray())} | {string.Join(",", fermionTerm.Sequence)} | {coeff.ToString()}"; // Console.WriteLine(string_output); return(string_output); }
public void GetFermionTermTypeTests(int norbitals, int[] idx, int type) { var tmp = new TermType.Fermion[] { Identity, PP, PQ, PQQP, PQQR, PQRS }; var fermionTerm = new HermitianFermionTerm(idx.ToLadderSequence()); var fermionTermType = fermionTerm.TermType; Assert.True(fermionTermType == tmp[type]); }
public void BuildFromOrbitalIntegrals( OrbitalIntegral orbitalIntegral, TermType.Fermion termType, (int, int[], double)[] termsRaw)
/// <summary> /// Creates all fermion terms generated by all symmetries of an orbital integral. /// </summary> /// <returns>List of fermion terms generated by all symmetries of an orbital integral.</returns> public static List <(PauliTerm, PauliTermValue)> ToJordanWignerPauliTerms( this FermionTerm fermionTerm, TermType.Fermion termType, double coeff) { var pauliTerms = new List <(PauliTerm, PauliTermValue)>(); // Make a copy of the list of indices. var seq = fermionTerm.Sequence.Select(o => o.Index).ToArray(); switch (termType) { case TermType.Fermion.Identity: pauliTerms.Add((new PauliTerm(new int[] { }, TermType.PauliTerm.Identity), coeff.ToPauliTTermValue())); break; case TermType.Fermion.PP: pauliTerms.Add((new PauliTerm(new int[] { }, TermType.PauliTerm.Identity), (0.5 * coeff).ToPauliTTermValue())); pauliTerms.Add((new PauliTerm(seq.Take(1), TermType.PauliTerm.Z), (-0.5 * coeff).ToPauliTTermValue())); break; case TermType.Fermion.PQ: pauliTerms.Add((new PauliTerm(seq, TermType.PauliTerm.PQ), (0.25 * coeff).ToPauliTTermValue())); break; case TermType.Fermion.PQQP: pauliTerms.Add((new PauliTerm(new int[] { }, TermType.PauliTerm.Identity), (0.25 * coeff).ToPauliTTermValue())); pauliTerms.Add((new PauliTerm(seq.Take(2), TermType.PauliTerm.ZZ), (0.25 * coeff).ToPauliTTermValue())); pauliTerms.Add((new PauliTerm(seq.Take(1), TermType.PauliTerm.Z), (-0.25 * coeff).ToPauliTTermValue())); pauliTerms.Add((new PauliTerm(seq.Skip(1).Take(1), TermType.PauliTerm.Z), (-0.25 * coeff).ToPauliTTermValue())); break; case TermType.Fermion.PQQR: var multiplier = 1.0; if (seq.First() == seq.Last()) { // This means terms are ordered like QPRQ. So we reorder to PQQR seq[0] = seq[1]; seq[1] = seq[3]; seq[3] = seq[2]; seq[2] = seq[1]; } else if (seq[1] == seq[3]) { // This means terms are ordered like PQRQ. So we reorder to PQQR seq[3] = seq[2]; seq[2] = seq[1]; multiplier = -1.0; } pauliTerms.Add((new PauliTerm(seq, TermType.PauliTerm.PQQR), (-0.125 * multiplier * coeff).ToPauliTTermValue())); // PQ term pauliTerms.Add((new PauliTerm(new int[] { seq[0], seq[3] }, TermType.PauliTerm.PQ), (0.125 * multiplier * coeff).ToPauliTTermValue())); break; case TermType.Fermion.PQRS: var pqrsSorted = seq.ToList(); pqrsSorted.Sort(); var(newTerm, newCoeff) = IdentifyHpqrsPermutation((pqrsSorted, seq, coeff)); pauliTerms.Add((new PauliTerm(newTerm, TermType.PauliTerm.v01234), newCoeff.ToPauliTTermValue())); break; default: throw new System.NotImplementedException(); } return(pauliTerms); }