lmi-commits
[Top][All Lists]
Advanced

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

[lmi-commits] [lmi] master c2e0976 1/6: Remove weird surrender charges [


From: Greg Chicares
Subject: [lmi-commits] [lmi] master c2e0976 1/6: Remove weird surrender charges [357]
Date: Tue, 30 Oct 2018 18:21:42 -0400 (EDT)

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

    Remove weird surrender charges [357]
    
    These idiosyncratic surrender charges were once used for a few products,
    but they've been forgiven because the cost of programming them on a new
    vendor system would have exceeded the amount of the charges.
---
 account_value.hpp |  2 --
 dbnames.xpp       |  4 +--
 ihs_acctval.cpp   | 79 -------------------------------------------------------
 ihs_avmly.cpp     |  4 ---
 ihs_basicval.cpp  |  1 +
 5 files changed, 3 insertions(+), 87 deletions(-)

diff --git a/account_value.hpp b/account_value.hpp
index 3830b5c..91f96bb 100644
--- a/account_value.hpp
+++ b/account_value.hpp
@@ -283,8 +283,6 @@ class LMI_SO AccountValue
     void   ChangeSpecAmtBy         (double delta);
     void   ChangeSupplAmtBy        (double delta);
     void   ChangeSurrChgSpecAmtBy  (double delta);
-    void   AddSurrChgLayer         (int year, double delta_specamt);
-    void   ReduceSurrChg           (int year, double partial_surrchg);
     double SurrChg                 ();
 
     double MinInitDumpin() const;
diff --git a/dbnames.xpp b/dbnames.xpp
index 72e345e..f05da77 100644
--- a/dbnames.xpp
+++ b/dbnames.xpp
@@ -188,8 +188,8 @@
 
{DB_SurrChgSpecAmtMult,DB_Topic_SurrenderCharges,"SurrChgSpecAmtMult","Multiple 
of initial spec amt for formulaic surrender charges",}, \
 
{DB_SurrChgSpecAmtSlope,DB_Topic_SurrenderCharges,"SurrChgSpecAmtSlope","Durational
 factor applied to multiple-of-specified-amount surrender charge",}, \
 {DB_SurrChgPremMult,DB_Topic_SurrenderCharges,"SurrChgPremMult","Multiple of 
paid premium for formulaic surrender charges [not yet implemented]",}, \
-{DB_SurrChgOnIncr,DB_Topic_SurrenderCharges,"SurrChgOnIncr","Specified-amount 
increases engender a new surrender layer: 0=no, 1=yes",}, \
-{DB_SurrChgOnDecr,DB_Topic_SurrenderCharges,"SurrChgOnDecr","Specified-amount 
decreases engender a new surrender layer: 0=no, 1=yes [not yet implemented]",}, 
\
+{DB_SurrChgOnIncr,DB_Topic_SurrenderCharges,"SurrChgOnIncr","Specified-amount 
increases engender a new surrender layer: 0=no, 1=yes [support withdrawn]",}, \
+{DB_SurrChgOnDecr,DB_Topic_SurrenderCharges,"SurrChgOnDecr","Specified-amount 
decreases engender a new surrender layer: 0=no, 1=yes [support withdrawn]",}, \
 {DB_Has1035ExchCharge,DB_Topic_SurrenderCharges,"Has1035ExchCharge","Surrender 
charge or market-value adjustment on 1035 exchange: 0=no, 1=yes",}, \
 {DB_SnflQTable,DB_Topic_SurrenderCharges,"SnflQTable","Nonforfeiture annual 
mortality rate (index in mortality table database) [not yet implemented]",}, \
 {DB_CoiSnflIsGuar,DB_Topic_SurrenderCharges,"CoiSnflIsGuar","Use guaranteed 
cost of insurance rates as nonforfeiture basis [not yet implemented]",}, \
diff --git a/ihs_acctval.cpp b/ihs_acctval.cpp
index 473e8c4..a7f16cb 100644
--- a/ihs_acctval.cpp
+++ b/ihs_acctval.cpp
@@ -49,7 +49,6 @@
 
 #include <algorithm>
 #include <cmath>
-#include <functional>                   // bind() et al.
 #include <iterator>                     // back_inserter()
 #include <limits>
 #include <numeric>
@@ -435,25 +434,6 @@ void AccountValue::InitializeLife(mcenum_run_basis a_Basis)
 
     SurrChg_.assign(BasicValues::GetLength(), 0.0);
 
-    if(0 == Year && 0 == Month)
-        {
-        AddSurrChgLayer(Year, InvariantValues().SpecAmt[Year]);
-        }
-    else
-        {
-        // SOMEDAY !! Inforce surrchg is imperfect, but that's not
-        // important enough to fix for the products now supported.
-        double prior_specamt = 0.0;
-        for(int j = 0; j <= Year; ++j)
-            {
-            AddSurrChgLayer
-                (j
-                ,std::max(0.0, yare_input_.SpecifiedAmount[j] - prior_specamt)
-                );
-            prior_specamt = yare_input_.SpecifiedAmount[j];
-            }
-        }
-
     // TAXATION !! Input::InforceAnnualTargetPremium should be used here.
     double annual_target_premium = GetModalTgtPrem
         (0
@@ -1208,65 +1188,6 @@ void AccountValue::set_list_bill_premium()
 }
 
 //============================================================================
-void AccountValue::AddSurrChgLayer(int year, double delta_specamt)
-{
-    if(!SurrChgOnIncr || 0.0 == delta_specamt)
-        {
-        return;
-        }
-
-// TODO ?? It should be something like this:
-//    rate = delta_specamt * TempDatabase.Query(DB_SurrChgSpecAmtMult);
-// but for the moment we resort to this kludge:
-    double z = delta_specamt * MortalityRates_->TargetPremiumRates()[year];
-
-    std::vector<double> new_layer;
-    std::transform
-        (SurrChgRates_->SpecamtRateDurationalFactor().begin()
-        ,SurrChgRates_->SpecamtRateDurationalFactor().end() - year
-        ,std::inserter(new_layer, new_layer.begin())
-        ,std::bind
-            (round_surrender_charge()
-            ,std::bind(std::multiplies<double>(), std::placeholders::_1, z)
-            )
-        );
-
-    std::transform
-        (year + SurrChg_.begin()
-        ,       SurrChg_.end()
-        ,       new_layer.begin()
-        ,year + SurrChg_.begin()
-        ,std::plus<double>()
-        );
-}
-
-//============================================================================
-// Upon partial surrender, multiply current and future surrchg by
-//   1 - (partial surrchg / full surrchg)
-void AccountValue::ReduceSurrChg(int year, double partial_surrchg)
-{
-    if(!SurrChgOnIncr || 0.0 == partial_surrchg)
-        {
-        return;
-        }
-    // We don't assert the condition because this function might
-    // be called for a product that has no tabular surrender charge.
-    if(0.0 != SurrChg_[year])
-        {
-        double multiplier = 1.0 - partial_surrchg / SurrChg_[year];
-        std::transform
-            (year + SurrChg_.begin()
-            ,       SurrChg_.end()
-            ,year + SurrChg_.begin()
-            ,std::bind
-                (round_surrender_charge()
-                ,std::bind(std::multiplies<double>(), std::placeholders::_1, 
multiplier)
-                )
-            );
-        }
-}
-
-//============================================================================
 // Surrender charge. Only simple multiplicative parts are implemented.
 //
 // SOMEDAY !! Table support and UL model reg formulas should be added.
diff --git a/ihs_avmly.cpp b/ihs_avmly.cpp
index d047cd2..2cf7090 100644
--- a/ihs_avmly.cpp
+++ b/ihs_avmly.cpp
@@ -683,7 +683,6 @@ double AccountValue::minimum_specified_amount(bool 
issuing_now, bool term_rider)
 void AccountValue::ChangeSpecAmtBy(double delta)
 {
     double ProportionAppliedToTerm = 0.0;
-    double prior_specamt = ActualSpecAmt;
     // Adjust term here only if it's formally a rider.
     if(TermRiderActive && !TermIsNotRider)
         {
@@ -746,7 +745,6 @@ void AccountValue::ChangeSpecAmtBy(double delta)
         ,minimum_specified_amount(0 == Year && 0 == Month, TermRiderActive)
         );
     ActualSpecAmt = round_specamt()(ActualSpecAmt);
-    AddSurrChgLayer(Year, std::max(0.0, ActualSpecAmt - prior_specamt));
 
     // Carry the new specamt forward into all future years.
     for(int j = Year; j < BasicValues::GetLength(); ++j)
@@ -2589,8 +2587,6 @@ void AccountValue::TxTakeWD()
 // bases, why do we change it for each basis?
 // TODO ?? Shouldn't this be moved to FinalizeMonth()?
     InvariantValues().NetWD[Year] = NetWD;
-
-    ReduceSurrChg(Year, partial_surrchg);
 }
 
 //============================================================================
diff --git a/ihs_basicval.cpp b/ihs_basicval.cpp
index 2800a64..ccf8684 100644
--- a/ihs_basicval.cpp
+++ b/ihs_basicval.cpp
@@ -661,6 +661,7 @@ void BasicValues::SetPermanentInvariants()
     LapseIgnoresSurrChg = Database_->Query(DB_LapseIgnoresSurrChg  );
     SurrChgOnIncr       = Database_->Query(DB_SurrChgOnIncr        );
     SurrChgOnDecr       = Database_->Query(DB_SurrChgOnDecr        );
+    LMI_ASSERT(!SurrChgOnIncr); // Surrchg change on increase not supported.
     LMI_ASSERT(!SurrChgOnDecr); // Surrchg change on decrease not supported.
 
     Database_->Query(FreeWDProportion, DB_FreeWdProportion);



reply via email to

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