lmi-commits
[Top][All Lists]
Advanced

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

[lmi-commits] [lmi] master c291b59 05/14: Assert more preconditions


From: Greg Chicares
Subject: [lmi-commits] [lmi] master c291b59 05/14: Assert more preconditions
Date: Thu, 1 Apr 2021 18:15:17 -0400 (EDT)

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

    Assert more preconditions
    
    If all 'use_..._' are false in any year, then the formula
       max
         ((max(A, Bgen, Cgen) - Dgen) * use_gen
         ,(max(A, Bsep, Csep) - Dsep) * use_sep
         ,(max(A, Bflr, Cflr) - Dflr) * use_flr
         ,(max(A, Bvlr, Cvlr) - Dvlr) * use_vlr
         )
    would return zero, but the law requires that it return at least 'A'.
    
    Rewriting the formula to guarantee that directly:
       max
         (A
         ,max
           ((max(A, Bgen, Cgen) - Dgen) * use_gen
           ,(max(A, Bsep, Csep) - Dsep) * use_sep
           ,(max(A, Bflr, Cflr) - Dflr) * use_flr
           ,(max(A, Bvlr, Cvlr) - Dvlr) * use_vlr
           )
         )
    would make it more complicated and slower. Presumably at least one of
    {use_gen_, use_sep_} must always be true in the problem domain anyway,
    so that the assertion would never fire.
---
 i7702.cpp      | 7 +++++++
 i7702_init.cpp | 3 ---
 2 files changed, 7 insertions(+), 3 deletions(-)

diff --git a/i7702.cpp b/i7702.cpp
index b484bfa..7e19704 100644
--- a/i7702.cpp
+++ b/i7702.cpp
@@ -249,6 +249,13 @@ void i7702::assert_preconditions()
     LMI_ASSERT(length_ == lmi::ssize(use_flr_));
     LMI_ASSERT(length_ == lmi::ssize(use_vlr_));
 
+    // These must all be boolean, and not all false in any year.
+    LMI_ASSERT(AllOf(EqualTo(true, use_gen_) || EqualTo(false, use_gen_)));
+    LMI_ASSERT(AllOf(EqualTo(true, use_sep_) || EqualTo(false, use_sep_)));
+    LMI_ASSERT(AllOf(EqualTo(true, use_flr_) || EqualTo(false, use_flr_)));
+    LMI_ASSERT(AllOf(EqualTo(true, use_vlr_) || EqualTo(false, use_vlr_)));
+    LMI_ASSERT(AllOf(use_gen_ || use_sep_ || use_flr_ || use_vlr_));
+
     LMI_ASSERT(each_equal(++Cgen_.begin(), Cgen_.end(), 0.0));
     LMI_ASSERT(each_equal(++Csep_.begin(), Csep_.end(), 0.0));
     LMI_ASSERT(each_equal(++Cflr_.begin(), Cflr_.end(), 0.0));
diff --git a/i7702_init.cpp b/i7702_init.cpp
index 9e15766..857bf7a 100644
--- a/i7702_init.cpp
+++ b/i7702_init.cpp
@@ -77,9 +77,6 @@ i7702::i7702
         use_vlr_ = zero;
         }
 
-    // 7702 !! Assert that all use_* are boolean.
-    // 7702 !! Assert (use_gen_ || use_sep_) for each duration.
-
     // 7702 !! Alternatively, specify A0_ and delta, then calculate A1_?
     A0_ = database.query<double>(DB_AnnIntRate7702);
     A1_ = 0.02 + A0_;



reply via email to

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