lmi-commits
[Top][All Lists]
Advanced

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

[lmi-commits] [lmi] master f9ddc04 5/6: Do not depict a scalar as a vect


From: Greg Chicares
Subject: [lmi-commits] [lmi] master f9ddc04 5/6: Do not depict a scalar as a vector
Date: Sun, 30 Sep 2018 17:07:13 -0400 (EDT)

branch: master
commit f9ddc04ef380f3163d66494f03eef3bfd718f0f3
Author: Gregory W. Chicares <address@hidden>
Commit: Gregory W. Chicares <address@hidden>

    Do not depict a scalar as a vector
    
    The rate of interest due on loans can vary by year. The old XSL-FO
    system depicted it in a column that actually suppressed any variation,
    replicating the initial value instead. That error is fixed by this
    commit, only for the new PDF code (the old will soon be expunged). See:
      https://lists.nongnu.org/archive/html/lmi/2018-02/msg00100.html
---
 ledger_evaluator.cpp        | 13 ++++---------
 ledger_invariant.cpp        | 23 ++++++++++++++++++-----
 ledger_invariant.hpp        |  1 +
 ledger_pdf_generator_wx.cpp |  4 ++--
 4 files changed, 25 insertions(+), 16 deletions(-)

diff --git a/ledger_evaluator.cpp b/ledger_evaluator.cpp
index 450bb3f..deed0aa 100644
--- a/ledger_evaluator.cpp
+++ b/ledger_evaluator.cpp
@@ -46,7 +46,7 @@
 #include <boost/filesystem/fstream.hpp>
 #include <boost/filesystem/path.hpp>
 
-#include <algorithm>                    // fill(), transform()
+#include <algorithm>                    // transform()
 #include <functional>                   // minus
 #include <map>
 #include <unordered_map>
@@ -186,6 +186,7 @@ ledger_evaluator Ledger::make_evaluator() const
     title_map["AnnGAIntRate_Guaranteed"         ] = "Guar Ann\nGen Acct\nInt 
Rate";
     title_map["AnnHoneymoonValueRate_Current"   ] = "Curr 
Ann\nHoneymoon\nValue Rate";
     title_map["AnnHoneymoonValueRate_Guaranteed"] = "Guar 
Ann\nHoneymoon\nValue Rate";
+    title_map["AnnLoanDueRate"                  ] = "Loan\nInt Rate";
     title_map["AnnPostHoneymoonRate_Current"    ] = "Curr 
Post\nHoneymoon\nRate";
     title_map["AnnPostHoneymoonRate_Guaranteed" ] = "Guar 
Post\nHoneymoon\nRate";
     title_map["AnnSAIntRate_Current"            ] = "Curr Ann\nSep Acct\nInt 
Rate";
@@ -322,6 +323,7 @@ ledger_evaluator Ledger::make_evaluator() const
     mask_map ["AnnGAIntRate_Guaranteed"         ] =      "99.99%";
     mask_map ["AnnHoneymoonValueRate_Current"   ] =      "99.99%";
     mask_map ["AnnHoneymoonValueRate_Guaranteed"] =      "99.99%";
+    mask_map ["AnnLoanDueRate"                  ] =      "99.99%";
     mask_map ["AnnPostHoneymoonRate_Current"    ] =      "99.99%";
     mask_map ["AnnPostHoneymoonRate_Guaranteed" ] =      "99.99%";
     mask_map ["AnnSAIntRate_Current"            ] =      "99.99%";
@@ -573,6 +575,7 @@ ledger_evaluator Ledger::make_evaluator() const
 // >
     format_map["AnnGAIntRate"                      ] = f4;
     format_map["AnnHoneymoonValueRate"             ] = f4;
+    format_map["AnnLoanDueRate"                    ] = f4;
     format_map["AnnPostHoneymoonRate"              ] = f4;
     format_map["AnnSAIntRate"                      ] = f4;
     format_map["CorpTaxBracket"                    ] = f4;
@@ -732,14 +735,6 @@ ledger_evaluator Ledger::make_evaluator() const
     vectors["AttainedAge"] = &AttainedAge;
     vectors["PolicyYear" ] = &PolicyYear ;
 
-    std::vector<double> InitAnnLoanDueRate(max_duration);
-    std::fill
-        (InitAnnLoanDueRate.begin()
-        ,InitAnnLoanDueRate.end()
-        ,ledger_invariant_->GetInitAnnLoanDueRate()
-        );
-    vectors["InitAnnLoanDueRate"] = &InitAnnLoanDueRate;
-
     vectors["InforceLives"] = &ledger_invariant_->InforceLives;
 
     vectors["FundNumbers"    ] = &ledger_invariant_->FundNumbers    ;
diff --git a/ledger_invariant.cpp b/ledger_invariant.cpp
index 0c1bfc3..1ddd5ba 100644
--- a/ledger_invariant.cpp
+++ b/ledger_invariant.cpp
@@ -123,6 +123,7 @@ void LedgerInvariant::Alloc(int len)
     OtherVectors    ["AddonCompOnAssets"     ] = &AddonCompOnAssets      ;
     OtherVectors    ["AddonCompOnPremium"    ] = &AddonCompOnPremium     ;
     OtherVectors    ["CorridorFactor"        ] = &CorridorFactor         ;
+    OtherVectors    ["AnnLoanDueRate"        ] = &AnnLoanDueRate         ;
     OtherVectors    ["CurrMandE"             ] = &CurrMandE              ;
     OtherVectors    ["TotalIMF"              ] = &TotalIMF               ;
     OtherVectors    ["RefundableSalesLoad"   ] = &RefundableSalesLoad    ;
@@ -538,6 +539,11 @@ void LedgerInvariant::Init(BasicValues const* b)
     AddonCompOnAssets    = b->yare_input_.ExtraCompensationOnAssets ;
     AddonCompOnPremium   = b->yare_input_.ExtraCompensationOnPremium;
     CorridorFactor       = b->GetCorridorFactor();
+    AnnLoanDueRate       = b->InterestRates_->RegLnDueRate
+        (mce_gen_curr
+        ,mce_annual_rate
+        );
+    InitAnnLoanDueRate   = AnnLoanDueRate[0];
     CurrMandE            = b->InterestRates_->MAndERate(mce_gen_curr);
     TotalIMF             = b->InterestRates_->InvestmentManagementFee();
     RefundableSalesLoad  = b->Loads_->refundable_sales_load_proportion();
@@ -903,11 +909,6 @@ void LedgerInvariant::Init(BasicValues const* b)
     StatePostalAbbrev       = mc_str(b->GetStateOfJurisdiction());
     PremiumTaxState         = mc_str(b->GetPremiumTaxState());
 
-    InitAnnLoanDueRate      = b->InterestRates_->RegLnDueRate
-        (mce_gen_curr
-        ,mce_annual_rate
-        )[0];
-
     IsInforce = b->yare_input_.EffectiveDate != b->yare_input_.InforceAsOfDate;
 
     // This test is probably redundant because it is already performed
@@ -1180,6 +1181,18 @@ LedgerInvariant& LedgerInvariant::PlusEq(LedgerInvariant 
const& a_Addend)
     TotalIMF                      = a_Addend.TotalIMF;
     RefundableSalesLoad           = a_Addend.RefundableSalesLoad;
 
+    // PDF !! This is the logic used in the variant ledger class.
+    // It's not a very good idea, but until it can be replaced
+    // everywhere, at least it ensures that the composite value
+    // isn't zero. (In some other cases, zero might be a sensible
+    // answer--e.g., for ratios like 'CorridorFactor', where an
+    // average weighted by number of lives would be inaccurate,
+    // and any aggregate value could be misleading.)
+    for(int j = 0; j < a_Addend.Length; ++j)
+        {
+        AnnLoanDueRate[j] = a_Addend.AnnLoanDueRate[j];
+        }
+
     IsMec                         = a_Addend.IsMec        || IsMec;
     InforceIsMec                  = a_Addend.InforceIsMec || InforceIsMec;
 
diff --git a/ledger_invariant.hpp b/ledger_invariant.hpp
index 0937a11..a18737e 100644
--- a/ledger_invariant.hpp
+++ b/ledger_invariant.hpp
@@ -103,6 +103,7 @@ class LMI_SO LedgerInvariant
     std::vector<double> AddonCompOnAssets;
     std::vector<double> AddonCompOnPremium;
     std::vector<double> CorridorFactor;
+    std::vector<double> AnnLoanDueRate;
     // TODO ?? M&E varies by basis (cf. 'GuarMaxMandE' below), so it
     // belongs in the variant ledger.
     std::vector<double> CurrMandE;
diff --git a/ledger_pdf_generator_wx.cpp b/ledger_pdf_generator_wx.cpp
index a3b95b3..713b277 100644
--- a/ledger_pdf_generator_wx.cpp
+++ b/ledger_pdf_generator_wx.cpp
@@ -2666,7 +2666,7 @@ class finra_assumption_detail : public 
page_with_tabular_report
 
     illustration_table_columns const& get_table_columns() const override
     {
-    // PDF !! InitAnnLoanDueRate: "Loan\nInt Rate" would be a better
+    // PDF !! AnnLoanDueRate: "Loan\nInt Rate" would be a better
     // heading. "Assumed\nLoan Interest" suggests a dollar amount,
     // but this column is actually an annual rate. Because VLR is not
     // implemented, this is just the contractual fixed loan rate, for
@@ -2679,7 +2679,7 @@ class finra_assumption_detail : public 
page_with_tabular_report
             ,{ "CurrMandE"                  , "M&E"                         ,  
    "99.99%" }
             ,{ "EeMode"                     , "Indiv\nPmt Mode"             ,  
"Semiannual" }
             ,{ "ErMode"                     , "Corp\nPmt Mode"              ,  
"Semiannual" }
-            ,{ "InitAnnLoanDueRate"         , "Assumed\nLoan Interest"      ,  
    "99.99%" }
+            ,{ "AnnLoanDueRate"             , "Assumed\nLoan Interest"      ,  
    "99.99%" }
             };
 
         return columns;



reply via email to

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