[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[lmi-commits] [lmi] master 517a8fe 01/13: Remove a defect marker: refrac
From: |
Greg Chicares |
Subject: |
[lmi-commits] [lmi] master 517a8fe 01/13: Remove a defect marker: refractory compositing issue [347] |
Date: |
Tue, 14 Apr 2020 12:07:00 -0400 (EDT) |
branch: master
commit 517a8fe8e872b02cb4d18bc44a1b81dc4268628b
Author: Gregory W. Chicares <address@hidden>
Commit: Gregory W. Chicares <address@hidden>
Remove a defect marker: refractory compositing issue [347]
Taking the lowest retirement age as the composite value is arbitrary,
but it's as good as any other method.
---
ledger_invariant.cpp | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 57 insertions(+), 1 deletion(-)
diff --git a/ledger_invariant.cpp b/ledger_invariant.cpp
index 258c15c..f7c019b 100644
--- a/ledger_invariant.cpp
+++ b/ledger_invariant.cpp
@@ -535,6 +535,62 @@ void LedgerInvariant::Init()
// input items. What would we do with a plan established thirty years ago
// that includes an individual who's already past the maturity date?
+/// Accumulate an individual cell into a composite ledger.
+///
+/// For ledger members that are naturally additive, such as premiums,
+/// the composite value is the total (weighted by an inforce factor).
+/// For nonadditive members, some other operation may clearly be more
+/// appropriate than addition--e.g.:
+///
+/// NoLongerIssued: This flag prohibits new-business illustrations
+/// when necessary. Its composite value is a logical OR, so that the
+/// prohibition applies to a composite if it applies to any cell.
+///
+/// AllowGroupQuote: This flag permits group quotes if appropriate.
+/// Its composite value is a logical AND, so that the permission
+/// applies to a composite only if it applies to every cell.
+///
+/// Other members may use the same (or other) methods, although with a
+/// less cut-and-dried rationale--e.g.:
+///
+/// IsMec: Composite value is 'true' if any cell is 'true' (i.e.,
+/// logical OR). This doesn't mean that the aggregate is actually a
+/// MEC; it just means that the composite illustration ought to
+/// include the stern tax warnings that are required for a MEC.
+/// With a lot more work, footnotes could be specialized for
+/// composites ("One or more of these contracts is a MEC", e.g.),
+/// but insurers are generally unwilling to go to such lengths.
+///
+/// MecYear: Composite value is the least of any cell. Thus, if a
+/// footnote says that a contract becomes a MEC in a particular
+/// year, the composite uses the lowest such year. That's the least
+/// bad choice because it produces the most severe footnote.
+///
+/// For some other members, the composite value is the value for the
+/// last cell. This is the default behavior for non-additive members,
+/// and at least it has the advantage that if all cells have the same
+/// value, then the composite also has that value. For example:
+///
+/// GenAcctAllocation: Arguably a weighted average would be better,
+/// but averages aren't supported in this simple code yet. However,
+/// any average would be inaccurate.
+///
+/// SubstdTable: This generally represents a mortality multiplier,
+/// for which an average might seem somewhat suitable, but that's
+/// hardly possible because substandard tables are quantized. The
+/// average of "L=+300%" and "P=+400%" is not table N (350%) because
+/// no such table is defined.
+///
+/// WaiverFootnote: String members in general cannot be composited
+/// in any more reasonable way than taking the last cell's value.
+/// A composite may include cells whose policy forms have different
+/// premium-waiver footnotes, but insurers have little desire to
+/// combine them thoughtfully.
+///
+/// Thus, there exists One True Way for compositing additive members
+/// and some boolean members, but composite values assigned here for
+/// other members are often arbitrary.
+
LedgerInvariant& LedgerInvariant::PlusEq(LedgerInvariant const& a_Addend)
{
LedgerBase::PlusEq(a_Addend, a_Addend.InforceLives);
@@ -586,7 +642,7 @@ LedgerInvariant& LedgerInvariant::PlusEq(LedgerInvariant
const& a_Addend)
SmokerBlended = a_Addend.SmokerBlended;
SubstdTable = a_Addend.SubstdTable;
Age = std::min(Age, a_Addend.Age);
- RetAge = std::min(RetAge, a_Addend.RetAge); // TODO
?? Does this make sense?
+ RetAge = std::min(RetAge, a_Addend.RetAge);
EndtAge = std::max(EndtAge, a_Addend.EndtAge);
GroupIndivSelection = GroupIndivSelection ||
a_Addend.GroupIndivSelection;
NoLongerIssued = NoLongerIssued ||
a_Addend.NoLongerIssued;
- [lmi-commits] [lmi] master updated (9537a20 -> 45cf6f4), Greg Chicares, 2020/04/14
- [lmi-commits] [lmi] master 521916f 06/13: Expunge a pointless comment, Greg Chicares, 2020/04/14
- [lmi-commits] [lmi] master b746578 02/13: Remove a defect marker [346], Greg Chicares, 2020/04/14
- [lmi-commits] [lmi] master 11c3b2d 07/13: Mark skipped initializations uniformly, Greg Chicares, 2020/04/14
- [lmi-commits] [lmi] master 1492645 04/13: Declare two variables in dependency order, Greg Chicares, 2020/04/14
- [lmi-commits] [lmi] master 25cc457 05/13: Mark formerly-missing variables as dynamically-assigned, Greg Chicares, 2020/04/14
- [lmi-commits] [lmi] master 278dab3 10/13: Explain some curious comments, Greg Chicares, 2020/04/14
- [lmi-commits] [lmi] master 180c84e 03/13: Initialize ledger members in declaration order, Greg Chicares, 2020/04/14
- [lmi-commits] [lmi] master 517a8fe 01/13: Remove a defect marker: refractory compositing issue [347],
Greg Chicares <=
- [lmi-commits] [lmi] master e09ae5e 09/13: Improve documentation, Greg Chicares, 2020/04/14
- [lmi-commits] [lmi] master 664a0df 11/13: Expunge unused ledger vector 'TgtPrem', Greg Chicares, 2020/04/14
- [lmi-commits] [lmi] master 45cf6f4 13/13: Move initialization of some ledger members, Greg Chicares, 2020/04/14
- [lmi-commits] [lmi] master 1611b81 12/13: Expunge several unused ledger scalars, Greg Chicares, 2020/04/14
- [lmi-commits] [lmi] master e653634 08/13: Regularize whitespace, Greg Chicares, 2020/04/14