Source code for oasislmf.pytools.fm.policy_extras

"""
TODO: should I check values are valid in the financial structure percentage not between 0 and 1 (ex: deductible, limit ...)
TODO: validate max and min ded implementation
TODO: It seems that if a policy with share is used, subsequent policy using min or max deductible will be wrong
     so it make no sense to compute deductible, over_limit, under_limit

"""


from numba import njit
from .policy import (calcrule_28 as _calcrule_28, calcrule_32 as _calcrule_32, calcrule_34 as _calcrule_34,
                     calcrule_37 as _calcrule_37, calcrule_38 as _calcrule_38)


@njit(cache=True)
[docs] def min2(a, b): return a if a < b else b
@njit(cache=True)
[docs] def deductible_over_max(i, loss_out, loss_in, deductible, over_limit, under_limit, max_deductible): """ deductible is over maximum deductible, we reduce the loss, therefore increase the loss up to under_limit under limit is always the minimum between the limit - loss and the sub_node under_limit + the applied deductible so we are sure that if deductible[i] > max_ded_left, we are sure that under_limit is the good cap we are sure that is there is no sub node with limit loss_delta < under_limit loss delta can be negative so in this case we have to be careful it is not bigger than loss_in """ loss_delta = deductible[i] - max_deductible if loss_delta > under_limit[i]: loss_out[i] = loss_in[i] + under_limit[i] over_limit[i] += loss_delta - under_limit[i] deductible[i] = max_deductible under_limit[i] = 0 elif loss_in[i] >= -loss_delta: loss_out[i] = loss_in[i] + loss_delta under_limit[i] -= loss_delta deductible[i] = max_deductible else: loss_out[i] = 0 deductible[i] += loss_in[i] under_limit[i] += loss_in[i]
@njit(cache=True)
[docs] def deductible_under_min(i, loss_out, loss_in, effective_deductible, over_limit, under_limit, min_deductible, deductible): """ Deductible is under the minimum, we raise the deductible from over_limit first then loss if over_limit is not enough """ loss_delta = min_deductible - deductible - effective_deductible[i] if loss_delta <= over_limit[i]: # we have enough over_limit to cover loss_delta if loss_in[i] > deductible: # we have enough loss to cover deductible loss_out[i] = loss_in[i] over_limit[i] -= loss_delta effective_deductible[i] = min_deductible elif (over_limit[i] - loss_delta) + loss_in[i] > deductible: # not enough loss, we also reduce the over_limit loss_out[i] = 0 over_limit[i] -= loss_delta + deductible effective_deductible[i] = min_deductible under_limit[i] += loss_in[i] else: effective_deductible[i] += loss_in[i] + over_limit[i] loss_out[i] = 0 over_limit[i] = 0 under_limit[i] += loss_in[i] else: loss_not_over_limit = loss_delta - over_limit[i] if loss_in[i] > loss_not_over_limit + deductible: # we have enough loss after we use over_limit pool loss_out[i] = loss_in[i] - loss_not_over_limit - deductible over_limit[i] = 0 effective_deductible[i] = min_deductible under_limit[i] += loss_not_over_limit else: loss_out[i] = 0 effective_deductible[i] += loss_in[i] + over_limit[i] under_limit[i] += loss_in[i] over_limit[i] = 0
@njit(cache=True, fastmath=True)
[docs] def calcrule_1(policy, loss_out, loss_in, deductible, over_limit, under_limit): """ Deductible and limit """ lim = policy['limit_1'] + policy['deductible_1'] for i in range(loss_in.shape[0]): if loss_in[i] <= policy['deductible_1']: under_limit[i] = min2(under_limit[i] + loss_in[i], policy['limit_1']) deductible[i] += loss_in[i] loss_out[i] = 0 elif loss_in[i] <= lim: under_limit[i] = min2(under_limit[i] + policy['deductible_1'], lim - loss_in[i]) deductible[i] += policy['deductible_1'] loss_out[i] = loss_in[i] - policy['deductible_1'] else: over_limit[i] += loss_in[i] - lim under_limit[i] = 0 deductible[i] += policy['deductible_1'] loss_out[i] = policy['limit_1']
@njit(cache=True, fastmath=True)
[docs] def calcrule_2(policy, loss_out, loss_in, deductible, over_limit, under_limit): """ Deductible, attachment, limit and share """ ded_att = policy['deductible_1'] + policy['attachment_1'] lim = policy['limit_1'] + ded_att maxi = policy['limit_1'] * policy['share_1'] for i in range(loss_in.shape[0]): if loss_in[i] <= ded_att: loss_out[i] = 0 elif loss_in[i] <= lim: loss_out[i] = (loss_in[i] - ded_att) * policy['share_1'] else: loss_out[i] = maxi
@njit(cache=True, fastmath=True)
[docs] def calcrule_3(policy, loss_out, loss_in, deductible, over_limit, under_limit): """ Franchise deductible and limit """ for i in range(loss_in.shape[0]): if loss_in[i] <= policy['deductible_1']: under_limit[i] = min2(under_limit[i] + loss_in[i], policy['limit_1']) deductible[i] += loss_in[i] loss_out[i] = 0 elif loss_in[i] <= policy['limit_1']: under_limit[i] = min2(under_limit[i], policy['limit_1'] - loss_in[i]) loss_out[i] = loss_in[i] else: under_limit[i] = 0 over_limit[i] += loss_in[i] - policy['limit_1'] loss_out[i] = policy['limit_1']
@njit(cache=True, fastmath=True)
[docs] def calcrule_5(policy, loss_out, loss_in, deductible, over_limit, under_limit): """ Deductible and limit as a proportion of loss """ effective_deductible = loss_in * policy['deductible_1'] effective_limit = loss_in * policy['limit_1'] deductible += effective_deductible if policy['deductible_1'] + policy['limit_1'] >= 1: # always under limit for i in range(loss_in.shape[0]): loss_out[i] = loss_in[i] - effective_deductible[i] under_limit[i] = min2(effective_limit[i] - loss_out[i], under_limit[i] + effective_deductible[i]) else: # always over limit loss_out[:] = effective_limit over_limit += loss_in - effective_deductible - effective_limit under_limit[:] = 0
@njit(cache=True, fastmath=True)
[docs] def calcrule_7(policy, loss_out, loss_in, deductible, over_limit, under_limit): """ deductible, minimum and maximum deductible, with limit """ max_ded_left = policy['deductible_3'] - policy['deductible_1'] min_ded_left = policy['deductible_2'] - policy['deductible_1'] for i in range(loss_in.shape[0]): if deductible[i] > max_ded_left: deductible_over_max(i, loss_out, loss_in, deductible, over_limit, under_limit, policy['deductible_3']) elif deductible[i] < min_ded_left: deductible_under_min(i, loss_out, loss_in, deductible, over_limit, under_limit, policy['deductible_2'], policy['deductible_1']) else: if loss_in[i] > policy['deductible_1']: loss_out[i] = loss_in[i] - policy['deductible_1'] deductible[i] += policy['deductible_1'] under_limit[i] += policy['deductible_1'] else: loss_out[i] = 0 deductible[i] += loss_in[i] under_limit[i] += loss_in[i] if loss_out[i] > policy['limit_1']: over_limit[i] += loss_out[i] - policy['limit_1'] under_limit[i] = 0 loss_out[i] = policy['limit_1'] else: under_limit[i] = min2(policy['limit_1'] - loss_out[i], under_limit[i])
@njit(cache=True, fastmath=True)
[docs] def calcrule_8(policy, loss_out, loss_in, deductible, over_limit, under_limit): """ deductible and minimum deductible, with limit """ min_ded_left = policy['deductible_2'] - policy['deductible_1'] for i in range(loss_in.shape[0]): if deductible[i] < min_ded_left: deductible_under_min(i, loss_out, loss_in, deductible, over_limit, under_limit, policy['deductible_2'], policy['deductible_1']) else: if loss_in[i] > policy['deductible_1']: loss_out[i] = loss_in[i] - policy['deductible_1'] deductible[i] += policy['deductible_1'] under_limit[i] += policy['deductible_1'] else: loss_out[i] = 0 deductible[i] += loss_in[i] under_limit[i] += loss_in[i] if loss_out[i] > policy['limit_1']: over_limit[i] += loss_out[i] - policy['limit_1'] under_limit[i] = 0 loss_out[i] = policy['limit_1'] else: under_limit[i] = min2(policy['limit_1'] - loss_out[i], under_limit[i])
@njit(cache=True, fastmath=True)
[docs] def calcrule_10(policy, loss_out, loss_in, deductible, over_limit, under_limit): """ deductible and maximum deductible """ max_ded_left = policy['deductible_3'] - policy['deductible_1'] for i in range(loss_in.shape[0]): if deductible[i] > max_ded_left: deductible_over_max(i, loss_out, loss_in, deductible, over_limit, under_limit, policy['deductible_3']) else: if loss_in[i] > policy['deductible_1']: loss_out[i] = loss_in[i] - policy['deductible_1'] deductible[i] += policy['deductible_1'] under_limit[i] += policy['deductible_1'] else: loss_out[i] = 0 deductible[i] += loss_in[i] under_limit[i] += loss_in[i]
@njit(cache=True, fastmath=True)
[docs] def calcrule_11(policy, loss_out, loss_in, deductible, over_limit, under_limit): """ deductible and minimum deductible """ min_ded_left = policy['deductible_2'] - policy['deductible_1'] for i in range(loss_in.shape[0]): if deductible[i] < min_ded_left: deductible_under_min(i, loss_out, loss_in, deductible, over_limit, under_limit, policy['deductible_2'], policy['deductible_1']) else: if loss_in[i] > policy['deductible_1']: loss_out[i] = loss_in[i] - policy['deductible_1'] deductible[i] += policy['deductible_1'] under_limit[i] += policy['deductible_1'] else: loss_out[i] = 0 deductible[i] += loss_in[i] under_limit[i] += loss_in[i]
@njit(cache=True, fastmath=True)
[docs] def calcrule_12(policy, loss_out, loss_in, deductible, over_limit, under_limit): """ Deductible only """ for i in range(loss_in.shape[0]): if loss_in[i] <= policy['deductible_1']: under_limit[i] += loss_in[i] deductible[i] += loss_in[i] loss_out[i] = 0 else: under_limit[i] += policy['deductible_1'] deductible[i] += policy['deductible_1'] loss_out[i] = loss_in[i] - policy['deductible_1']
@njit(cache=True, fastmath=True)
[docs] def calcrule_13(policy, loss_out, loss_in, deductible, over_limit, under_limit): """ deductible, minimum and maximum deductible """ max_ded_left = policy['deductible_3'] - policy['deductible_1'] min_ded_left = policy['deductible_2'] - policy['deductible_1'] for i in range(loss_in.shape[0]): if deductible[i] > max_ded_left: deductible_over_max(i, loss_out, loss_in, deductible, over_limit, under_limit, policy['deductible_3']) elif deductible[i] < min_ded_left: deductible_under_min(i, loss_out, loss_in, deductible, over_limit, under_limit, policy['deductible_2'], policy['deductible_1']) else: if loss_in[i] > policy['deductible_1']: loss_out[i] = loss_in[i] - policy['deductible_1'] deductible[i] += policy['deductible_1'] under_limit[i] += policy['deductible_1'] else: loss_out[i] = 0 deductible[i] += loss_in[i] under_limit[i] += loss_in[i]
@njit(cache=True, fastmath=True)
[docs] def calcrule_14(policy, loss_out, loss_in, deductible, over_limit, under_limit): """ Limit only """ for i in range(loss_in.shape[0]): if loss_in[i] <= policy['limit_1']: under_limit[i] = min2(policy['limit_1'] - loss_in[i], under_limit[i]) loss_out[i] = loss_in[i] else: over_limit[i] += loss_in[i] - policy['limit_1'] under_limit[i] = 0 loss_out[i] = policy['limit_1']
@njit(cache=True, fastmath=True)
[docs] def calcrule_15(policy, loss_out, loss_in, deductible, over_limit, under_limit): """ deductible and limit % loss """ effective_limit = policy['deductible_1'] / (1 - policy['limit_1']) for i in range(loss_in.shape[0]): if loss_in[i] <= policy['deductible_1']: under_limit[i] = min2(effective_limit, under_limit[i] + loss_in[i]) loss_out[i] = 0 deductible[i] += loss_in[i] elif loss_in[i] <= effective_limit: under_limit[i] = min2(effective_limit - loss_in[i], under_limit[i] + policy['deductible_1']) loss_out[i] = loss_in[i] - policy['deductible_1'] deductible[i] += policy['deductible_1'] else: loss_out[i] = loss_in[i] * policy['limit_1'] deductible[i] += policy['deductible_1'] over_limit[i] += loss_in[i] - loss_out[i] - policy['deductible_1'] under_limit[i] = 0
@njit(cache=True, fastmath=True)
[docs] def calcrule_16(policy, loss_out, loss_in, deductible, over_limit, under_limit): """ deductible % loss """ effective_deductible = loss_in * policy['deductible_1'] deductible += effective_deductible under_limit += effective_deductible loss_out[:] = loss_in - effective_deductible
@njit(cache=True, fastmath=True)
[docs] def calcrule_17(policy, loss_out, loss_in, deductible, over_limit, under_limit): """ deductible % loss with attachment, limit and share """ if policy['deductible_1'] >= 1: loss_out.fill(0) else: post_ded_attachment = policy['attachment_1'] / (1 - policy['deductible_1']) post_ded_attachment_limit = (policy['attachment_1'] + policy['limit_1']) / (1 - policy['deductible_1']) maxi = policy['limit_1'] * policy['share_1'] for i in range(loss_in.shape[0]): effective_deductible = loss_in[i] * policy['deductible_1'] if loss_in[i] <= post_ded_attachment: loss_out[i] = 0 elif loss_in[i] <= post_ded_attachment_limit: loss_out[i] = (loss_in[i] - effective_deductible - policy['attachment_1']) * policy['share_1'] else: loss_out[i] = maxi
@njit(cache=True, fastmath=True)
[docs] def calcrule_19(policy, loss_out, loss_in, deductible, over_limit, under_limit): """ deductible % loss with min and/or max deductible TODO: check if we can assume 0 <= policy['deductible_1'] <= 1 """ for i in range(loss_in.shape[0]): effective_deductible = loss_in[i] * policy['deductible_1'] if effective_deductible + deductible[i] > policy['deductible_3'] > 0: deductible_over_max(i, loss_out, loss_in, deductible, over_limit, under_limit, policy['deductible_3']) elif effective_deductible + deductible[i] < policy['deductible_2']: deductible_under_min(i, loss_out, loss_in, deductible, over_limit, under_limit, policy['deductible_2'], effective_deductible) else: if loss_in[i] > effective_deductible: loss_out[i] = loss_in[i] - effective_deductible deductible[i] += effective_deductible under_limit[i] += effective_deductible else: loss_out[i] = 0 deductible[i] += loss_in[i] under_limit[i] += loss_in[i]
@njit(cache=True, fastmath=True)
[docs] def calcrule_20(policy, loss_out, loss_in, deductible, over_limit, under_limit): """ reverse franchise deductible """ for i in range(loss_in.shape[0]): if loss_in[i] > policy['deductible_1']: loss_out[i] = 0 else: loss_out[i] = loss_in[i]
@njit(cache=True, fastmath=True)
[docs] def calcrule_22(policy, loss_out, loss_in, deductible, over_limit, under_limit): """ reinsurance % ceded, limit and % placed """ if policy['share_1'] == 0: loss_out.fill(0) else: pre_share_limit = policy['limit_1'] / policy['share_1'] all_share = policy['share_1'] * policy['share_2'] * policy['share_3'] maxi = policy['limit_1'] * policy['share_2'] * policy['share_3'] for i in range(loss_in.shape[0]): if loss_in[i] <= pre_share_limit: loss_out[i] = loss_in[i] * all_share else: loss_out[i] = maxi
@njit(cache=True, fastmath=True)
[docs] def calcrule_23(policy, loss_out, loss_in, deductible, over_limit, under_limit): """ reinsurance limit and % placed """ all_share = policy['share_2'] * policy['share_3'] maxi = policy['limit_1'] * all_share for i in range(loss_in.shape[0]): if loss_in[i] <= policy['limit_1']: loss_out[i] = loss_in[i] * all_share else: loss_out[i] = maxi
@njit(cache=True, fastmath=True)
[docs] def calcrule_24(policy, loss_out, loss_in, deductible, over_limit, under_limit): """ reinsurance excess terms """ if policy['share_1'] == 0: loss_out.fill(0) else: pre_share_attachment = policy['attachment_1'] / policy['share_1'] pre_share_attachment_limit = (policy['limit_1'] + policy['attachment_1']) / policy['share_1'] attachment_share = policy['attachment_1'] * policy['share_2'] * policy['share_3'] all_share = policy['share_1'] * policy['share_2'] * policy['share_3'] maxi = policy['limit_1'] * policy['share_2'] * policy['share_3'] for i in range(loss_in.shape[0]): if loss_in[i] <= pre_share_attachment: loss_out[i] = 0 elif loss_in[i] <= pre_share_attachment_limit: loss_out[i] = loss_in[i] * all_share - attachment_share else: loss_out[i] = maxi
@njit(cache=True, fastmath=True)
[docs] def calcrule_25(policy, loss_out, loss_in, deductible, over_limit, under_limit): """ reinsurance proportional terms """ loss_out[:] = loss_in * (policy['share_1'] * policy['share_2'] * policy['share_3'])
@njit(cache=True, fastmath=True)
[docs] def calcrule_26(policy, loss_out, loss_in, deductible, over_limit, under_limit): """ deductible % loss with min and/or max deductible and limit TODO: check if we can assume 0 <= policy['deductible_1'] <= 1 """ for i in range(loss_in.shape[0]): effective_deductible = loss_in[i] * policy['deductible_1'] if effective_deductible + deductible[i] > policy['deductible_3'] > 0: deductible_over_max(i, loss_out, loss_in, deductible, over_limit, under_limit, policy['deductible_3']) elif effective_deductible + deductible[i] < policy['deductible_2']: deductible_under_min(i, loss_out, loss_in, deductible, over_limit, under_limit, policy['deductible_2'], effective_deductible) else: if loss_in[i] > effective_deductible: loss_out[i] = loss_in[i] - effective_deductible deductible[i] += effective_deductible under_limit[i] += effective_deductible else: loss_out[i] = 0 deductible[i] += loss_in[i] under_limit[i] += loss_in[i] if loss_out[i] > policy['limit_1']: over_limit[i] += loss_out[i] - policy['limit_1'] under_limit[i] = 0 loss_out[i] = policy['limit_1'] else: under_limit[i] = min2(policy['limit_1'] - loss_out[i], under_limit[i])
@njit(cache=True, fastmath=True)
[docs] def calcrule_27(policy, loss_out, loss_in, deductible, over_limit, under_limit): """ step payout with limit """ if policy['step_id'] == 1: loss_out.fill(0) for i in range(loss_in.shape[0]): if (0 < loss_in[i] or 0 < deductible[i]) and policy['trigger_start'] <= loss_in[i] < policy['trigger_end']: loss_out[i] += policy['payout_start']
@njit(cache=True, fastmath=True)
[docs] def calcrule_28(policy, loss_out, loss_in, deductible, over_limit, under_limit): """ % loss step payout """ _calcrule_28(policy, loss_out, loss_in)
@njit(cache=True, fastmath=True)
[docs] def calcrule_32(policy, loss_out, loss_in, deductible, over_limit, under_limit): """ monetary amount trigger and % loss step payout with limit """ _calcrule_32(policy, loss_out, loss_in)
@njit(cache=True, fastmath=True)
[docs] def calcrule_33(policy, loss_out, loss_in, deductible, over_limit, under_limit): """ deductible % loss with limit """ if policy['deductible_1'] >= 1: loss_out.fill(0) deductible += loss_in else: post_ded_limit = policy['limit_1'] / (1 - policy['deductible_1']) for i in range(loss_in.shape[0]): effective_deductible = loss_in[i] * policy['deductible_1'] deductible[i] += effective_deductible if loss_in[i] <= post_ded_limit: loss_out[i] = loss_in[i] - effective_deductible under_limit[i] = min2(under_limit[i] + effective_deductible, policy['limit_1'] - loss_out[i]) else: over_limit[i] += loss_in[i] - effective_deductible - policy['limit_1'] under_limit[i] = 0 loss_out[i] = policy['limit_1']
@njit(cache=True, fastmath=True)
[docs] def calcrule_34(policy, loss_out, loss_in, deductible, over_limit, under_limit): """ deductible with attachment and share TODO: compare to the cpp, as there is shares, deductible won't be use later on so no need to compute it """ _calcrule_34(policy, loss_out, loss_in)
@njit(cache=True, fastmath=True)
[docs] def calcrule_35(policy, loss_out, loss_in, deductible, over_limit, under_limit): """ deductible % loss with min and/or max deductible and limit % loss TODO: check if we can assume 0 <= policy['deductible_1'] <= 1 """ for i in range(loss_in.shape[0]): effective_deductible = loss_in[i] * policy['deductible_1'] if effective_deductible + deductible[i] > policy['deductible_3'] > 0: deductible_over_max(i, loss_out, loss_in, deductible, over_limit, under_limit, policy['deductible_3']) elif effective_deductible + deductible[i] < policy['deductible_2']: deductible_under_min(i, loss_out, loss_in, deductible, over_limit, under_limit, policy['deductible_2'], effective_deductible) else: if loss_in[i] > effective_deductible: loss_out[i] = loss_in[i] - effective_deductible deductible[i] += effective_deductible under_limit[i] += effective_deductible else: loss_out[i] = 0 deductible[i] += loss_in[i] under_limit[i] += loss_in[i] limit = loss_in[i] * policy['limit_1'] if loss_out[i] > limit: over_limit[i] += loss_out[i] - limit under_limit[i] = 0 loss_out[i] = limit else: under_limit[i] = min2(limit - loss_out[i], under_limit[i])
@njit(cache=True, fastmath=True)
[docs] def calcrule_36(policy, loss_out, loss_in, deductible, over_limit, under_limit): """ deductible with min and/or max deductible and limit % loss """ max_ded_left = policy['deductible_3'] - policy['deductible_1'] min_ded_left = policy['deductible_2'] - policy['deductible_1'] for i in range(loss_in.shape[0]): if deductible[i] > max_ded_left > 0: deductible_over_max(i, loss_out, loss_in, deductible, over_limit, under_limit, policy['deductible_3']) elif deductible[i] < min_ded_left: deductible_under_min(i, loss_out, loss_in, deductible, over_limit, under_limit, policy['deductible_2'], policy['deductible_1']) else: if loss_in[i] > policy['deductible_1']: loss_out[i] = loss_in[i] - policy['deductible_1'] deductible[i] += policy['deductible_1'] under_limit[i] += policy['deductible_1'] else: loss_out[i] = 0 deductible[i] += loss_in[i] under_limit[i] += loss_in[i] limit = loss_in[i] * policy['limit_1'] if loss_out[i] > limit: over_limit[i] += loss_out[i] - limit under_limit[i] = 0 loss_out[i] = limit else: under_limit[i] = min2(limit - loss_out[i], under_limit[i])
@njit(cache=True, fastmath=True)
[docs] def calcrule_37(policy, loss_out, loss_in, deductible, over_limit, under_limit): """ % loss step payout """ _calcrule_37(policy, loss_out, loss_in) if policy['step_id'] == 1: loss_out.fill(0) for i in range(loss_in.shape[0]): if policy['trigger_start'] <= loss_in[i] < policy['trigger_end']: loss = min(max(policy['payout_start'] * loss_in[i] - policy['deductible_1'], 0), policy['limit_1']) loss_out[i] = (loss + min(loss * policy['scale_2'], policy['limit_2'])) * policy['scale_1']
@njit(cache=True, fastmath=True)
[docs] def calcrule_38(policy, loss_out, loss_in, deductible, over_limit, under_limit): """ conditional coverage """ _calcrule_38(policy, loss_out, loss_in)
@njit(cache=True, fastmath=True)
[docs] def calcrule_39(policy, loss_out, loss_in, deductible, over_limit, under_limit): """ Franchise deductible """ for i in range(loss_in.shape[0]): if loss_in[i] <= policy['deductible_1']: under_limit[i] += loss_in[i] deductible[i] += loss_in[i] loss_out[i] = 0 else: loss_out[i] = loss_in[i]
@njit(cache=True)
[docs] def calc(policy, loss_out, loss_in, deductible, over_limit, under_limit, stepped): if policy['calcrule_id'] == 1: calcrule_1(policy, loss_out, loss_in, deductible, over_limit, under_limit) elif policy['calcrule_id'] == 2: calcrule_2(policy, loss_out, loss_in, deductible, over_limit, under_limit) elif policy['calcrule_id'] == 3: calcrule_3(policy, loss_out, loss_in, deductible, over_limit, under_limit) # calcrule_4 (deductible % TIV and limit) is redirected to 1 when building financial structure elif policy['calcrule_id'] == 5: calcrule_5(policy, loss_out, loss_in, deductible, over_limit, under_limit) # calcrule_6 (deductible % TIV) is redirected to 12 when building financial structure elif policy['calcrule_id'] == 7: calcrule_7(policy, loss_out, loss_in, deductible, over_limit, under_limit) elif policy['calcrule_id'] == 8: calcrule_8(policy, loss_out, loss_in, deductible, over_limit, under_limit) # calcrule_9 (limit with deductible % limit) is redirected to 1 when building financial structure elif policy['calcrule_id'] == 10: calcrule_10(policy, loss_out, loss_in, deductible, over_limit, under_limit) elif policy['calcrule_id'] == 11: calcrule_11(policy, loss_out, loss_in, deductible, over_limit, under_limit) elif policy['calcrule_id'] == 12: calcrule_12(policy, loss_out, loss_in, deductible, over_limit, under_limit) elif policy['calcrule_id'] == 13: calcrule_13(policy, loss_out, loss_in, deductible, over_limit, under_limit) elif policy['calcrule_id'] == 14: calcrule_14(policy, loss_out, loss_in, deductible, over_limit, under_limit) elif policy['calcrule_id'] == 15: calcrule_15(policy, loss_out, loss_in, deductible, over_limit, under_limit) elif policy['calcrule_id'] == 16: calcrule_16(policy, loss_out, loss_in, deductible, over_limit, under_limit) elif policy['calcrule_id'] == 17: calcrule_17(policy, loss_out, loss_in, deductible, over_limit, under_limit) # calcrule_18 (deductible % tiv with attachment, limit and share) is redirected to 2 when building financial structure elif policy['calcrule_id'] == 19: calcrule_19(policy, loss_out, loss_in, deductible, over_limit, under_limit) elif policy['calcrule_id'] == 20: calcrule_20(policy, loss_out, loss_in, deductible, over_limit, under_limit) # calcrule_21 (deductible % tiv with min and max deductible) is redirected to 13 when building financial structure elif policy['calcrule_id'] == 22: calcrule_22(policy, loss_out, loss_in, deductible, over_limit, under_limit) elif policy['calcrule_id'] == 23: calcrule_23(policy, loss_out, loss_in, deductible, over_limit, under_limit) elif policy['calcrule_id'] == 24: calcrule_24(policy, loss_out, loss_in, deductible, over_limit, under_limit) elif policy['calcrule_id'] == 25: calcrule_25(policy, loss_out, loss_in, deductible, over_limit, under_limit) elif policy['calcrule_id'] == 26: calcrule_26(policy, loss_out, loss_in, deductible, over_limit, under_limit) elif policy['calcrule_id'] == 33: calcrule_33(policy, loss_out, loss_in, deductible, over_limit, under_limit) elif policy['calcrule_id'] == 34: calcrule_34(policy, loss_out, loss_in, deductible, over_limit, under_limit) elif policy['calcrule_id'] == 35: calcrule_35(policy, loss_out, loss_in, deductible, over_limit, under_limit) elif policy['calcrule_id'] == 36: calcrule_36(policy, loss_out, loss_in, deductible, over_limit, under_limit) elif policy['calcrule_id'] == 39: calcrule_39(policy, loss_out, loss_in, deductible, over_limit, under_limit) elif policy['calcrule_id'] == 100: loss_out[:] = loss_in elif policy['calcrule_id'] == 200: loss_out[:] = loss_in * policy['share_1'] elif policy['calcrule_id'] == 101: calcrule_1(policy, loss_out, loss_in, deductible, over_limit, under_limit) loss_out *= policy['share_1'] elif policy['calcrule_id'] == 103: calcrule_3(policy, loss_out, loss_in, deductible, over_limit, under_limit) loss_out *= policy['share_1'] elif policy['calcrule_id'] == 105: calcrule_5(policy, loss_out, loss_in, deductible, over_limit, under_limit) loss_out *= policy['share_1'] elif policy['calcrule_id'] == 107: calcrule_7(policy, loss_out, loss_in, deductible, over_limit, under_limit) loss_out *= policy['share_1'] elif policy['calcrule_id'] == 108: calcrule_8(policy, loss_out, loss_in, deductible, over_limit, under_limit) loss_out *= policy['share_1'] elif policy['calcrule_id'] == 110: calcrule_10(policy, loss_out, loss_in, deductible, over_limit, under_limit) loss_out *= policy['share_1'] elif policy['calcrule_id'] == 111: calcrule_11(policy, loss_out, loss_in, deductible, over_limit, under_limit) loss_out *= policy['share_1'] elif policy['calcrule_id'] == 112: calcrule_12(policy, loss_out, loss_in, deductible, over_limit, under_limit) loss_out *= policy['share_1'] elif policy['calcrule_id'] == 113: calcrule_13(policy, loss_out, loss_in, deductible, over_limit, under_limit) loss_out *= policy['share_1'] elif policy['calcrule_id'] == 114: calcrule_14(policy, loss_out, loss_in, deductible, over_limit, under_limit) loss_out *= policy['share_1'] elif policy['calcrule_id'] == 115: calcrule_15(policy, loss_out, loss_in, deductible, over_limit, under_limit) loss_out *= policy['share_1'] elif policy['calcrule_id'] == 116: calcrule_16(policy, loss_out, loss_in, deductible, over_limit, under_limit) loss_out *= policy['share_1'] elif policy['calcrule_id'] == 119: calcrule_19(policy, loss_out, loss_in, deductible, over_limit, under_limit) loss_out *= policy['share_1'] elif policy['calcrule_id'] == 120: calcrule_20(policy, loss_out, loss_in, deductible, over_limit, under_limit) loss_out *= policy['share_1'] elif policy['calcrule_id'] == 126: calcrule_26(policy, loss_out, loss_in, deductible, over_limit, under_limit) loss_out *= policy['share_1'] elif policy['calcrule_id'] == 133: calcrule_33(policy, loss_out, loss_in, deductible, over_limit, under_limit) loss_out *= policy['share_1'] elif policy['calcrule_id'] == 135: calcrule_35(policy, loss_out, loss_in, deductible, over_limit, under_limit) loss_out *= policy['share_1'] elif policy['calcrule_id'] == 136: calcrule_36(policy, loss_out, loss_in, deductible, over_limit, under_limit) loss_out *= policy['share_1'] elif stepped is not None: if policy['calcrule_id'] == 27: calcrule_27(policy, loss_out, loss_in, deductible, over_limit, under_limit) elif policy['calcrule_id'] == 28: calcrule_28(policy, loss_out, loss_in, deductible, over_limit, under_limit) elif policy['calcrule_id'] == 32: calcrule_32(policy, loss_out, loss_in, deductible, over_limit, under_limit) elif policy['calcrule_id'] == 37: calcrule_37(policy, loss_out, loss_in, deductible, over_limit, under_limit) elif policy['calcrule_id'] == 38: calcrule_38(policy, loss_out, loss_in, deductible, over_limit, under_limit) else: raise ValueError(f"UnknownCalcrule {policy['calcrule_id']}") else: raise ValueError(f"UnknownCalcrule {policy['calcrule_id']}")