in Chemistry/src/DataModel/Fermion/JordanWignerEncoding.cs [52:114]
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;
}