[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[lmi-commits] [lmi] master 7b9b0cf 11/14: Resolve a marked defect [339]

From: Greg Chicares
Subject: [lmi-commits] [lmi] master 7b9b0cf 11/14: Resolve a marked defect [339]
Date: Sun, 6 Sep 2020 07:50:38 -0400 (EDT)

branch: master
commit 7b9b0cf5e88d190eb186ae70e4a796bb04b1c519
Author: Gregory W. Chicares <gchicares@sbcglobal.net>
Commit: Gregory W. Chicares <gchicares@sbcglobal.net>

    Resolve a marked defect [339]
    The defect marker was spurious: lapses really were reflected, because
    of the way 'ItLapsed' was used in GetPartMortQ(). Removed that use of
    'ItLapsed', however, because partial-mortality factors are independent
    of calculation basis, whereas 'ItLapsed' is not. This makes the
    description of the alleged defect accurate, whereas previously it was
    However, that description identified no true defect, because the
    probability of survival is independent of policy lapse. One might
    anticipate a system-test regression, but Ledger::ZeroInforceAfterLapse()
    prevents that, by design. Removed an old comment on that function: it
    is not possible to know the latest lapse duration among all bases until
    after all have been calculated.
 ihs_acctval.cpp | 12 +++++++-----
 ledger.cpp      |  3 ---
 2 files changed, 7 insertions(+), 8 deletions(-)

diff --git a/ihs_acctval.cpp b/ihs_acctval.cpp
index 79ec645..33b4a2c 100644
--- a/ihs_acctval.cpp
+++ b/ihs_acctval.cpp
@@ -1440,14 +1440,16 @@ void AccountValue::SetAnnualInvariants()
 /// limit (if any). If partial mortality is not used, then qx is
 /// uniformly zero, tpx is one, and lx is the radix.
+/// tpx and lx both have one more element than qx; dropping the first
+/// or last element gives EOY and BOY vectors, respectively.
 /// Whether a contract continues after its normal maturity date does
 /// not matter. It is treated as not expiring on that date because
 /// year-end composite values are multiplied by this lx.
-/// TODO ?? These actuarial functions may be thought of as
-/// counting potential inforce lives: they do not reflect lapses.
-/// InforceLivesBoy() and InforceLivesEoy() may be used where
-/// lapses should be taken into account.
+/// These actuarial functions reflect survivorship only, not lapses.
+/// Use AccountValue::InforceLives{E,B}oy() where lapses should be
+/// taken into account; cf. Ledger::ZeroInforceAfterLapse().
 void AccountValue::set_partial_mortality()
@@ -1472,7 +1474,7 @@ void AccountValue::set_partial_mortality()
 double AccountValue::GetPartMortQ(int a_year) const
     LMI_ASSERT(a_year <= BasicValues::GetLength());
-    if(!yare_input_.UsePartialMortality || ItLapsed)
+    if(!yare_input_.UsePartialMortality)
         return 0.0;
diff --git a/ledger.cpp b/ledger.cpp
index 09e3c4d..73f9d9e 100644
--- a/ledger.cpp
+++ b/ledger.cpp
@@ -177,9 +177,6 @@ void Ledger::SetRunBases(int length)
 /// want to truncate values on that other basis, even if it means
 /// that the vector of inforce lives does not correspond to the
 /// current values.
-/// SOMEDAY !! Reconsider whether the values this function sets to
-/// zero should somehow be set to zero upstream.
 void Ledger::ZeroInforceAfterLapse()

reply via email to

[Prev in Thread] Current Thread [Next in Thread]