コード例 #1
0
        // 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);
        }
コード例 #2
0
        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]);
        }
コード例 #3
0
 public void BuildFromOrbitalIntegrals(
     OrbitalIntegral orbitalIntegral,
     TermType.Fermion termType,
     (int, int[], double)[] termsRaw)
コード例 #4
0
        /// <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);
        }