private double CalculateNumeratorFor(Person p)
        {
            int result = 0;

            foreach (int year in p.GetPovertyYears()) {
                result += (year - minYear) + 1;
            }

            return (double)result;
        }
        private Numerator CalculateNumeratorFor(Person p)
        {
            var povertyYears = p.GetPovertyYears();

            int numPovertyYears = povertyYears.Count;

            if (numPovertyYears == 0)
                return Numerator.Zero; ;

            if (numPovertyYears == 1)
                return Numerator.Create(p.GetPovertyGapForYear(povertyYears[0]));

            var result = new Numerator();

            for (int n = 0; n < numPovertyYears - 1; n++) {
                for (int m = n + 1; m < numPovertyYears; m++) {
                    int lowYear = povertyYears[n];
                    int highYear = povertyYears[m];
                    int i = (highYear - minYear) + 1;
                    int j = (lowYear - minYear) + 1;

                    double Oij = p.GetNonPovertyYearsBetween(lowYear, highYear);
                    double Wij = p.GetPovertyGapAverage(lowYear, highYear);
                    double Pij = GetPovertyPersistenceRatioValue(p.Country, lowYear, highYear);

                    // double term = (Math.Pow((i - j + 1), -(Pij * (Oij + 1)))) * Wij;

                    result.S1.Terms.Add(Wij * Math.Pow((i - j + 1), -(Pij * (Oij + 1))));
                    result.S2.Terms.Add(Math.Pow((i - j + 1), -(Pij * (Oij + 1))));
                    result.S3.Terms.Add(Wij * Math.Pow((i - j + 1), -(Oij + 1)));
                    result.S4.Terms.Add(Wij * Math.Pow((i - j + 1), -1.0));
                    result.S5.Terms.Add(Math.Pow((i - j + 1), -1.0));
                }
            }

            return result;
        }