public static List ToJordanWignerPauliTerms()

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;
        }