diff --git a/R/InsuranceContract.R b/R/InsuranceContract.R index 7922b14d674d3f3cb5b3be26e3c9a415a50bb357..72ea0ca81c8e563356a75ba69bb6ab68f0f85318 100644 --- a/R/InsuranceContract.R +++ b/R/InsuranceContract.R @@ -266,6 +266,9 @@ InsuranceContract = R6Class( #' [InsuranceContract.ParameterDefaults] data structure. #' initialize = function(tarif, parent = NULL, calculate = "all", profitid = "default", ...) { + if (getOption('LIC.debug.init', FALSE)) { + browser(); + } private$initParams = c(list(tarif = tarif, parent = parent, calculate = calculate, profitid = profitid), list(...)) self$tarif = tarif; self$parent = parent; @@ -374,6 +377,9 @@ InsuranceContract = R6Class( #' @examples #' # TODO addBlock = function(id = NULL, block = NULL, t = block$Values$int$blockStart, comment = comment, ...) { + if (getOption('LIC.debug.addBlock', FALSE)) { + browser(); + } if (missing(block) || is.null(block) || !is(block, "InsuranceContract")) { # Create a block with the same tariff and parameters as the main contract, but allow overriding params with the ... arguments block = InsuranceContract$new(id = id, ...) @@ -446,6 +452,9 @@ InsuranceContract = R6Class( #' @examples #' # TODO addDynamics = function(t, NewSumInsured, SumInsuredDelta, id, ...) { + if (getOption('LIC.debug.addDynamics', FALSE)) { + browser(); + } # TODO: Override only the required parameters params = private$initParams @@ -530,6 +539,9 @@ InsuranceContract = R6Class( #' @param history_type The type (free-form string) to record in the history snapshot #' calculateContract = function(calculate = "all", valuesFrom = 0, premiumCalculationTime = 0, preservePastPV = TRUE, additionalCapital = 0, recalculatePremiums = TRUE, recalculatePremiumSum = TRUE, history_comment = NULL, history_type = "Contract") { + if (getOption('LIC.debug.calculateContract', FALSE)) { + browser(); + } if (!is.null(self$blocks)) { for (b in self$blocks) { .args = as.list(match.call()[-1]) @@ -657,6 +669,9 @@ InsuranceContract = R6Class( #' @param valuesFrom The time from when to aggragate values. Values before #' that time will be left unchanged. consolidateBlocks = function(valuesFrom = 0) { + if (getOption('LIC.debug.consolidateBlocks', FALSE)) { + browser(); + } # First, Re-calculate all children that have children on their own for (b in self$blocks) { if (length(b$blocks) > 0) { @@ -764,6 +779,9 @@ InsuranceContract = R6Class( #' @examples #' # TODO premiumWaiver = function(t) { + if (getOption('LIC.debug.premiumWaiver', FALSE)) { + browser(); + } newSumInsured = self$Values$reserves[[toString(t), "PremiumFreeSumInsured"]]; self$Parameters$ContractState$premiumWaiver = TRUE; self$Parameters$ContractState$surrenderPenalty = FALSE; # Surrender penalty has already been applied, don't apply a second time @@ -799,6 +817,9 @@ InsuranceContract = R6Class( #' @examples #' # TODO profitScenario = function(...) { + if (getOption('LIC.debug.profitScenario', FALSE)) { + browser(); + } private$calculateProfitParticipation(...) }, @@ -823,6 +844,9 @@ InsuranceContract = R6Class( #' @examples #' # TODO addProfitScenario = function(id, ...) { + if (getOption('LIC.debug.addProfitScenario', FALSE)) { + browser(); + } .args = as.list(match.call()[-1]) self$Parameters$ProfitParticipation$scenarios[[id]] = list(...) if (length(self$blocks) > 0) { diff --git a/R/InsuranceTarif.R b/R/InsuranceTarif.R index b0fc94c798a35e26c06f8b54204baaab5c35e500..11b7c2b86c30f48c2399bd1c7a56dbc521d3958b 100644 --- a/R/InsuranceTarif.R +++ b/R/InsuranceTarif.R @@ -214,6 +214,9 @@ InsuranceTarif = R6Class( #' tarif.male = InsuranceTarif$new(name = "Annuity Males", type = "annuity", #' i = 0.01, mortalityTable = AVOe2005R.male) initialize = function(name = NULL, type = "wholelife", tarif = "Generic Tarif", desc = "Description of tarif", ...) { + if (getOption('LIC.debug.Tarif.init', FALSE)) { + browser(); + } if (!missing(name)) self$name = name; if (!missing(type)) { self$tariffType = TariffTypeEnum(type) @@ -257,6 +260,9 @@ InsuranceTarif = R6Class( #' tarif.unisex = tarif.male$createModification(name = "Annuity unisex", #' mortalityTable = AVOe2005R.unisex) createModification = function(name = NULL, tarif = NULL, desc = NULL, tariffType = NULL, ...) { + if (getOption('LIC.debug.createModification', FALSE)) { + browser(); + } cloned = self$clone(); if (!missing(name)) cloned$name = name; if (!missing(tarif)) cloned$tarif = tarif; @@ -287,6 +293,9 @@ InsuranceTarif = R6Class( #' #' @param ... currently unused getInternalValues = function(params, ...) { + if (getOption('LIC.debug.getInternalValues', FALSE)) { + browser(); + } age = params$ContractData$technicalAge maxAge = MortalityTables::getOmega(params$ActuarialBases$mortalityTable) policyPeriod = params$ContractData$policyPeriod @@ -305,6 +314,9 @@ InsuranceTarif = R6Class( #' by the InsuranceContract class. It returns the relevant ages during the #' whole contract period getAges = function(params) { + if (getOption('LIC.debug.getAges', FALSE)) { + browser(); + } ages = ages(params$ActuarialBases$mortalityTable, YOB = params$ContractData$YOB); age = params$ContractData$technicalAge; if (age > 0) { @@ -318,6 +330,9 @@ InsuranceTarif = R6Class( #' values \code{values} #' @details Not to be called directly, but implicitly by the [InsuranceContract] object. getTransitionProbabilities = function(params, values) { + if (getOption('LIC.debug.getTransitionProbabilities', FALSE)) { + browser(); + } age = params$ContractData$technicalAge; ages = self$getAges(params); q = MortalityTables::deathProbabilities(params$ActuarialBases$mortalityTable, YOB = params$ContractData$YOB, ageDifferences = params$ContractData$ageDifferences); @@ -353,6 +368,9 @@ InsuranceTarif = R6Class( #' #' @param params The parameters of the contract / tariff getCostValues = function(params) { + if (getOption('LIC.debug.getCostValues', FALSE)) { + browser(); + } costs = valueOrFunction(params$Costs, params = params, values = NULL) baseCost = valueOrFunction(params$minCosts, params = params, values = NULL, costs = costs) if (!is.null(baseCost)) { @@ -376,6 +394,9 @@ InsuranceTarif = R6Class( #' @details Not to be called directly, but implicitly by the [InsuranceContract] object. #' @param len The desired length of the returned data frame (the number of contract periods desire) getPremiumCF = function(len, params, values) { + if (getOption('LIC.debug.getPremiumCF', FALSE)) { + browser(); + } premPeriod = min(params$ContractData$premiumPeriod, params$ContractData$policyPeriod, len); if (is.null(params$ContractData$premiumIncrease)) { pad0(rep(1, premPeriod - 1), len) @@ -400,6 +421,9 @@ InsuranceTarif = R6Class( #' @details Not to be called directly, but implicitly by the [InsuranceContract] object. #' @param len The desired length of the returned data frame (the number of contract periods desire) getAnnuityCF = function(len, params, values) { + if (getOption('LIC.debug.getAnnuityCF', FALSE)) { + browser(); + } annuityPeriod = min(params$ContractData$policyPeriod - params$ContractData$deferralPeriod, len); if (is.null(params$ContractData$annuityIncrease)) { pad0(rep(1, annuityPeriod), len); @@ -424,6 +448,9 @@ InsuranceTarif = R6Class( #' @details Not to be called directly, but implicitly by the [InsuranceContract] object. #' @param len The desired length of the returned data frame (the number of contract periods desire) getDeathCF = function(len, params, values) { + if (getOption('LIC.debug.getDeathCF', FALSE)) { + browser(); + } period = params$ContractData$policyPeriod - params$ContractData$deferralPeriod; if (is.null(params$ContractData$deathBenefit)) { pad0(rep(1, period), len) @@ -445,6 +472,9 @@ InsuranceTarif = R6Class( #' of insurance given in the InsuranceTarif's `tariffType` field #' @details Not to be called directly, but implicitly by the [InsuranceContract] object. getBasicCashFlows = function(params, values) { + if (getOption('LIC.debug.getBasicCashFlows', FALSE)) { + browser(); + } deferralPeriod = params$ContractData$deferralPeriod; guaranteedPeriod = params$ContractData$guaranteedPeriod; @@ -510,6 +540,9 @@ InsuranceTarif = R6Class( #' @description Returns the cash flows for the contract given the parameters #' @details Not to be called directly, but implicitly by the [InsuranceContract] object. getCashFlows = function(params, values) { + if (getOption('LIC.debug.getCashFlows', FALSE)) { + browser(); + } age = params$ContractData$technicalAge; if (is.null(values$cashFlowsBasic)) { @@ -575,6 +608,9 @@ InsuranceTarif = R6Class( #' and tariff parameters #' @details Not to be called directly, but implicitly by the [InsuranceContract] object. getCashFlowsCosts = function(params, values) { + if (getOption('LIC.debug.getCashFlowsCosts', FALSE)) { + browser(); + } dm = dim(params$Costs); dmnames = dimnames(params$Costs); @@ -618,6 +654,9 @@ InsuranceTarif = R6Class( #' @details Not to be called directly, but implicitly by the [InsuranceContract] object. #' @param cashFlows data.frame of cash flows calculated by a call to \href{#method-getCashFlows}{\code{InsuranceTarif$getCashFlows()}} presentValueCashFlows = function(cashFlows, params, values) { + if (getOption('LIC.debug.presentValueCashFlows', FALSE)) { + browser(); + } qq = self$getTransitionProbabilities(params); qx = pad0(qq$q, values$int$l); @@ -680,6 +719,9 @@ InsuranceTarif = R6Class( #' and stored in the \code{values} list #' @details Not to be called directly, but implicitly by the [InsuranceContract] object. presentValueCashFlowsCosts = function(params, values) { + if (getOption('LIC.debug.presentValueCashFlowsCosts', FALSE)) { + browser(); + } len = values$int$l; q = self$getTransitionProbabilities(params); qx = pad0(q$q, len); @@ -697,6 +739,9 @@ InsuranceTarif = R6Class( #' #' This method is NOT to be called directly, but implicitly by the [InsuranceContract] object. getAbsCashFlows = function(params, values) { + if (getOption('LIC.debug.getAbsCashFlows', FALSE)) { + browser(); + } # TODO: Set up a nice list with coefficients for each type of cashflow, # rather than multiplying each item manually (this also mitigates the risk @@ -743,6 +788,9 @@ InsuranceTarif = R6Class( #' #' This method is NOT to be called directly, but implicitly by the [InsuranceContract] object. getAbsPresentValues = function(params, values) { + if (getOption('LIC.debug.getAbsPresentValues', FALSE)) { + browser(); + } pv = values$presentValues; #pv[,"age"] = pv[,"premiums"]; @@ -774,6 +822,9 @@ InsuranceTarif = R6Class( #' #' This method is NOT to be called directly, but implicitly by the [InsuranceContract] object. presentValueBenefits = function(params, values) { + if (getOption('LIC.debug.presentValueBenefits', FALSE)) { + browser(); + } # TODO: Here we don't use the securityLoading parameter => Shall it be used or are these values to be understood without additional security loading? benefits = values$presentValues[,"survival"] + values$presentValues[,"guaranteed"] + @@ -814,6 +865,9 @@ InsuranceTarif = R6Class( #' (e.g. for net and Zillmer, the gross premium has already been #' calculated to allow modelling the premium refund) getPremiumCoefficients = function(type = "gross", coeffBenefits, coeffCosts, premiums, params, values, premiumCalculationTime = values$int$premiumCalculationTime) { + if (getOption('LIC.debug.getPremiumCoefficients', FALSE)) { + browser(); + } # Merge a possibly passed loadings override with the defaults of this class: securityLoading = valueOrFunction(params$Loadings$security, params = params, values = values); t = as.character(premiumCalculationTime) @@ -889,6 +943,9 @@ InsuranceTarif = R6Class( #' #' @details Not to be called directly, but implicitly by the [InsuranceContract] object. premiumCalculation = function(params, values, premiumCalculationTime = values$int$premiumCalculationTime) { + if (getOption('LIC.debug.premiumCalculation', FALSE)) { + browser(); + } loadings = params$Loadings; sumInsured = params$ContractData$sumInsured values$premiums = c( @@ -984,6 +1041,9 @@ InsuranceTarif = R6Class( #' #' @details Not to be called directly, but implicitly by the [InsuranceContract] object. reserveCalculation = function(params, values) { + if (getOption('LIC.debug.reserveCalculation', FALSE)) { + browser(); + } t = "0" securityFactor = (1 + valueOrFunction(params$Loadings$security, params = params, values = values)); ppScheme = params$ProfitParticipation$profitParticipationScheme; @@ -1094,6 +1154,9 @@ InsuranceTarif = R6Class( #' @param years how many years to calculate (for some usances, the factor #' is different in leap years!) getBalanceSheetReserveFactor = function(method, params, years = 1) { + if (getOption('LIC.debug.getBalanceSheetReserveFactor', FALSE)) { + browser(); + } balanceDate = params$ActuarialBases$balanceSheetDate year(balanceDate) = year(params$ContractData$contractClosing); if (balanceDate < params$ContractData$contractClosing) { @@ -1124,6 +1187,9 @@ InsuranceTarif = R6Class( #' the yearly reference date of the contract #' @details Not to be called directly, but implicitly by the [InsuranceContract] object. reserveCalculationBalanceSheet = function(params, values) { + if (getOption('LIC.debug.reserveCalculationBalanceSheet', FALSE)) { + browser(); + } reserves = values$reserves; years = length(reserves[,"Zillmer"]); # Balance sheet reserves: @@ -1181,7 +1247,10 @@ InsuranceTarif = R6Class( #' @param ... Additional parameters for the profit participation calculation, passed #' through to the profit participation scheme's \href{../../LifeInsuranceContracts/html/ProfitParticipation.html#method-getProfitParticipation}{\code{ProfitParticipation$getProfitParticipation()}} calculateProfitParticipation = function(params, ...) { - ppScheme = params$ProfitParticipation$profitParticipationScheme; + if (getOption('LIC.debug.calculateProfitParticipation', FALSE)) { + browser(); + } + ppScheme = params$ProfitParticipation$profitParticipationScheme; if (!is.null(ppScheme)) { ppScheme$getProfitParticipation(params = params, ...) } @@ -1192,14 +1261,20 @@ InsuranceTarif = R6Class( #' @param profitScenario The ID of the profit scenario for which to calculate the reserves #' @param ... TODO reservesAfterProfit = function(profitScenario, params, values, ...) { - # TODO + if (getOption('LIC.debug.reservesAfterProfit', FALSE)) { + browser(); + } + # TODO }, #' @description Return the time series of the basic contract #' @details Not to be called directly, but implicitly by the [InsuranceContract] object. getBasicDataTimeseries = function(params, values) { - res = cbind( + if (getOption('LIC.debug.getBasicDataTimeseries', FALSE)) { + browser(); + } + res = cbind( "PremiumPayment" = values$premiumComposition[, "charged"] > 0, "SumInsured" = values$reserves[, "SumInsured"], "Premiums" = values$absCashFlows$premiums_advance + values$absCashFlows$premiums_arrears, @@ -1215,6 +1290,9 @@ InsuranceTarif = R6Class( #' @details Not to be called directly, but implicitly by the [InsuranceContract] object. #' All premiums, reserves and present values have already been calculated. premiumDecomposition = function(params, values) { + if (getOption('LIC.debug.premiumDecomposition', FALSE)) { + browser(); + } loadings = params$Loadings; sumInsured = params$ContractData$sumInsured; premiums = values$premiums;