lmi-commits
[Top][All Lists]
Advanced

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

[lmi-commits] [lmi] master fee9d55 02/15: Support tabular minimum premiu


From: Greg Chicares
Subject: [lmi-commits] [lmi] master fee9d55 02/15: Support tabular minimum premiums
Date: Tue, 27 Aug 2019 13:50:17 -0400 (EDT)

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

    Support tabular minimum premiums
---
 basic_values.hpp          |  6 ++++++
 ihs_basicval.cpp          | 34 ++++++++++++++++++++++++++++++++++
 mortality_rates.hpp       |  7 +++++++
 mortality_rates_fetch.cpp |  1 +
 4 files changed, 48 insertions(+)

diff --git a/basic_values.hpp b/basic_values.hpp
index 5bc9342..8e153f0 100644
--- a/basic_values.hpp
+++ b/basic_values.hpp
@@ -161,6 +161,7 @@ class LMI_SO BasicValues
     std::vector<double> GetGuaranteedTermRates()        const;
     std::vector<double> GetGroupProxyRates()            const;
     std::vector<double> GetSevenPayRates()              const;
+    std::vector<double> GetMinPremRates()               const;
     std::vector<double> GetTgtPremRates()               const;
     std::vector<double> GetIrc7702QRates()              const;
     std::vector<double> GetPartialMortalityRates()      const;
@@ -206,6 +207,11 @@ class LMI_SO BasicValues
         ,mcenum_mode a_mode
         ,double      a_specamt
         ) const;
+    double GetModalPremMinFromTable
+        (int         a_year
+        ,mcenum_mode a_mode
+        ,double      a_specamt
+        ) const;
     double GetModalPremTgtFromTable
         (int         a_year
         ,mcenum_mode a_mode
diff --git a/ihs_basicval.cpp b/ihs_basicval.cpp
index 79b8bf0..4e7d683 100644
--- a/ihs_basicval.cpp
+++ b/ihs_basicval.cpp
@@ -909,6 +909,31 @@ double BasicValues::GetModalPremMaxNonMec
     return round_max_premium()(ldbl_eps_plus_one_times(temp * a_specamt / 
a_mode));
 }
 
+/// Calculate premium using a minimum-premium ratio.
+///
+/// Only the initial minimum-premium rate is used here, because that's
+/// generally fixed at issue. This calculation remains naive in that
+/// the initial specified amount may also be fixed at issue, but that
+/// choice is left to the caller.
+///
+/// As the GetModalSpecAmt() documentation for 'oe_modal_table' says,
+/// target and minimum premiums really ought to distinguished.
+
+double BasicValues::GetModalPremMinFromTable
+    (int      // a_year // Unused.
+    ,mcenum_mode a_mode
+    ,double      a_specamt
+    ) const
+{
+    return round_max_premium()
+        (ldbl_eps_plus_one_times
+            (
+                (a_specamt * MortalityRates_->MinimumPremiumRates()[0])
+            /   a_mode
+            )
+        );
+}
+
 /// Calculate premium using a target-premium ratio.
 ///
 /// Only the initial target-premium rate is used here, because that's
@@ -2022,6 +2047,15 @@ std::vector<double> BasicValues::GetSevenPayRates() const
         );
 }
 
+std::vector<double> BasicValues::GetMinPremRates() const
+{
+    return GetTable
+        (product().datum("MinPremFilename")
+        ,DB_MinPremTable
+        ,oe_modal_table == MinPremType
+        );
+}
+
 std::vector<double> BasicValues::GetTgtPremRates() const
 {
     return GetTable
diff --git a/mortality_rates.hpp b/mortality_rates.hpp
index 0df4231..16d7b8c 100644
--- a/mortality_rates.hpp
+++ b/mortality_rates.hpp
@@ -71,6 +71,7 @@ class MortalityRates
     std::vector<double> const& ChildRiderRates     () const;
     std::vector<double> const& SpouseRiderRates    (mcenum_gen_basis) const;
 
+    std::vector<double> const& MinimumPremiumRates () const;
     std::vector<double> const& TargetPremiumRates  () const;
 
     std::vector<double> const& Irc7702Q            () const;
@@ -152,6 +153,7 @@ class MortalityRates
     std::vector<double> CurrentSpouseRiderRates_;
     std::vector<double> MidpointSpouseRiderRates_;
 
+    std::vector<double> MinimumPremiumRates_;
     std::vector<double> TargetPremiumRates_;
 
     std::vector<double> Irc7702Q_;
@@ -177,6 +179,11 @@ inline std::vector<double> const& 
MortalityRates::ChildRiderRates() const
     return ChildRiderRates_;
 }
 
+inline std::vector<double> const& MortalityRates::MinimumPremiumRates() const
+{
+    return MinimumPremiumRates_;
+}
+
 inline std::vector<double> const& MortalityRates::TargetPremiumRates() const
 {
     return TargetPremiumRates_;
diff --git a/mortality_rates_fetch.cpp b/mortality_rates_fetch.cpp
index b9c6e91..659cdd8 100644
--- a/mortality_rates_fetch.cpp
+++ b/mortality_rates_fetch.cpp
@@ -104,6 +104,7 @@ void MortalityRates::fetch_parameters(BasicValues const& 
basic_values)
     ChildRiderRates_               = basic_values.GetChildRiderRates();
     GuaranteedSpouseRiderRates_    = 
basic_values.GetGuaranteedSpouseRiderRates();
     CurrentSpouseRiderRates_       = basic_values.GetCurrentSpouseRiderRates();
+    MinimumPremiumRates_           = basic_values.GetMinPremRates();
     TargetPremiumRates_            = basic_values.GetTgtPremRates();
 
     Irc7702Q_                      = basic_values.GetIrc7702QRates();



reply via email to

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