달력

122025  이전 다음

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

'Programs'에 해당되는 글 6건

  1. 2014.08.14 ModelEV.cpp 2
  2. 2014.08.14 GrpKeyTable.cpp
  3. 2014.08.14 ResultUnit.cpp
  4. 2014.08.14 FieldInfoSet.cpp
  5. 2014.08.14 Inc.hpp
  6. 2014.08.14 Group.cpp

ModelEV.cpp

Programs 2014. 8. 14. 20:18

#include "Inc.hpp"

//----------------------------------------------------------------
//ModelEV 클래스 함수들
//----------------------------------------------------------------

ModelEV::ModelEV()
{
    index_ACQ1_EXP = 9999; index_ACQ13_EXP = 9999; index_ACQ14_EXP = 9999; index_ACQ2_EXP = 9999;
    index_ACQ3_EXP = 9999; index_ACQ4_EXP = 9999; index_ACQ5_EXP = 9999; index_ACQ8_EXP = 9999;
    index_ADJ_MATH_RES = 9999; index_ALPHA_LOAD_IF = 9999; index_ALPHA_LOAD_IF_EXP = 9999;
    index_ANUITY_OUTGO = 9999; index_BETA_LOAD_IF = 9999; index_CASH_PREM = 9999;
    index_COLL1_EXP = 9999; index_COLL13_EXP = 9999; index_COLL14_EXP = 9999; index_COLL3_EXP = 9999;
    index_COLL8_EXP = 9999; index_COMM1_EXP = 9999; index_COMM124_EXP = 9999; index_COMM2_EXP = 9999;
    index_COMM31_EXP = 9999; index_COMM32_EXP = 9999; index_COMM33_EXP = 9999; index_COMM34_EXP = 9999;
    index_COMM4_EXP = 9999; index_COMM5_EXP = 9999; index_COMM6_EXP = 9999; index_COMM71_EXP = 9999;
    index_COMM72_EXP = 9999; index_CRED_INT = 9999; index_DAC_ASSD = 9999; index_DAC_DIFF = 9999;
    index_DAC_UNAMORT = 9999; index_DEATH_OUTGO = 9999; index_DEATH_RISK_PREM = 9999; index_DIAG_OUTGO = 9999;
    index_DIAG_RISK_PREM = 9999; index_DISBL_OUTGO = 9999; index_DISBL_RISK_PREM = 9999; index_FMF_INC = 9999;
    index_FMF_OUT = 9999; index_GAMMA_LOAD_IF = 9999; index_GMAB_INC_IF = 9999; index_GMAB_OUT_IF = 9999;
    index_GMAB_RES = 9999; index_GMAB_RES_IF = 9999; index_GMDB_INC_IF = 9999; index_GMDB_INC2_IF = 9999;
    index_GMDB_INCTI_IF = 9999; index_GMDB_OUT_IF = 9999; index_GMDB_OUTTI_IF = 9999; index_GMDB_RES = 9999;
    index_GMDB_RES_IF = 9999; index_GMDB_RESTI = 9999; index_GMDB_RESTI_IF = 9999; index_GMDB_RISK_IF = 9999;
    index_GMSB_INCTI_IF = 9999; index_GMSB_OUTTI_IF = 9999; index_GMSB_RESTI = 9999; index_GMSB_RESTI_IF = 9999;
    index_GMSB_RISK_IF = 9999; index_HOSP_OUTGO = 9999; index_HOSP_RISK_PREM = 9999; index_INFORCE_PREM = 9999;
    index_INFORCEPOL = 9999; index_INFORCEPOL_TK = 9999; index_LIVING_OUTGO = 9999; index_MAINT1_EXP = 9999;
    index_MAINT13_EXP = 9999; index_MAINT14_EXP = 9999; index_MAINT15_EXP = 9999; index_MAINT16_EXP = 9999;
    index_MAINT3_EXP = 9999; index_MAINT4_EXP = 9999; index_MAINT5_EXP = 9999; index_MAINT8_EXP = 9999;
    index_MAINT9_EXP = 9999; index_MAT_OUTGO = 9999; index_NO_NEW_POLS = 9999; index_NONU_INT = 9999;
    index_O_TAXBL_INC = 9999; index_OTH_OUTGO = 9999; index_OTH_RISK_PREM = 9999; index_OTH_RISK_PREM_RBC = 9999;
    index_OTHER_EXP = 9999; index_OTHER1_EXP = 9999; index_PART_SURR_OUTGO = 9999; index_PREM_1ST_M = 9999;
    index_PREM_1ST_S = 9999; index_PREM_INC = 9999; index_PREM_INC_DISC = 9999; index_PREM_UL_BAL = 9999;
    index_PREM_UL_SUB = 9999; index_PREM1YR = 9999; index_PRIOR_ADJ_MATH_RES = 9999; index_PRIOR_DAC_ASSD = 9999;
    index_PRIOR_DAC_UNAMORT = 9999; index_PRIOR_GMAB_RES_IF = 9999; index_PRIOR_GMDB_RES_IF = 9999;
    index_PRIOR_GMDB_RESTI_IF = 9999; index_PRIOR_GMSB_RESTI_IF = 9999; index_PRIOR_PREM_UL_BAL = 9999;
    index_PRIOR_RES_P = 9999; index_PRIOR_RES_W = 9999; index_RBC_ASSET = 9999; index_RBC_ASSET_PRIOR = 9999;
    index_RBC_RISK_A = 9999; index_RBC_RISK_A_DEATH = 9999; index_RBC_RISK_A_DIAGSURG = 9999;
    index_RBC_RISK_A_DISBL = 9999; index_RBC_RISK_A_HOSP = 9999; index_RBC_RISK_A_OTH = 9999;
    index_RBC_RISK_A_PR_DEATH = 9999; index_RBC_RISK_A_PR_DIAGSURG = 9999; index_RBC_RISK_A_PR_DISBL = 9999;
    index_RBC_RISK_A_PR_HOSP = 9999; index_RBC_RISK_A_PR_OTH = 9999; index_RBC_RISK_A_PR_SILSON = 9999;
    index_RBC_RISK_A_SILSON = 9999; index_RBC_RISK_B = 9999; index_RBC_RISK_C = 9999;
    index_RBC_RISK_D_ASSET = 9999; index_RBC_RISK_D_LIAB = 9999; index_RBC_RISK_D_LIAB_PRIOR = 9999;
    index_RBC_RISK_D_MIN = 9999; index_RBC_RISK_D_MIN_PRIOR = 9999; index_RBC_RISK_D_RASSET = 9999;
    index_RBC_RISK_D_REV = 9999; index_RBC_RISK_D_RLIAB = 9999; index_RBC_RISK_D_RLIAB_PRIOR = 9999;
    index_RBC_RISK_D_RLIAB_TEMP = 9999; index_RBC_RISK_E_GEN = 9999; index_RBC_RISK_E_GMAB = 9999;
    index_RBC_RISK_E_GMAB_MIN = 9999; index_RBC_RISK_E_GMDB = 9999; index_RBC_RISK_E_GMDB_MIN = 9999;
    index_RES_P = 9999; index_RES_W = 9999; index_RISK_PREM_SB_IF = 9999; index_SA_ANNUITY = 9999;
    index_SAVING_PREM_SB_IF = 9999; index_SEP_CV_LOAD = 9999; index_SEP_LIVING_OUTGO = 9999;
    index_SEP_NET_LOAD = 9999; index_SEP_PART_SURR_OUTGO = 9999; index_SEP_PREM_1ST_M = 9999;
    index_SEP_PREM_1ST_S = 9999; index_SEP_PREM_INFORCE = 9999; index_SEP_PREM_UL_BAL = 9999;
    index_SEP_PREM_UL_SUB = 9999; index_SEP_PRIOR_PREM_UL_BAL = 9999; index_SEP_PRIOR_RES_P = 9999;
    index_SEP_PRIOR_RES_W = 9999; index_SEP_PU_BETA_LOAD = 9999; index_SEP_PW_DIFF = 9999;
    index_SEP_RES_DTH = 9999; index_SEP_RES_P = 9999; index_SEP_RES_W = 9999; index_SEP_RISK_PREM = 9999;
    index_SEP_SAVE_PREM = 9999; index_SEP_SURR_OUTGO = 9999; index_SILSON_OUTGO = 9999;
    index_SILSON_RISK_PREM_RBC = 9999; index_STD_RES_DTH = 9999; index_SUDANG = 9999;
    index_SUM_ASSD_IF = 9999; index_SURG_OUTGO = 9999; index_SURG_RISK_PREM = 9999;
    index_SURR_OUTGO = 9999; index_TOT_ALPHA_EXP = 9999; index_TOT_BEN_OUTGO = 9999;
    index_TOT_BETA_EXP = 9999; index_TOT_GAMMA_EXP = 9999; index_WAIVER_PREM_IF = 9999;

    return;
}

void ModelEV::Init(long MaxPeriod, FieldInfoSet* fieldinfo)
{
 this->ProjPeriod  = MaxPeriod;
    this->FieldNumOrg = fieldinfo->iFieldNumOrg();

           
    //연산에 사용되는 필드값 추출
    for (int i=0; i<FieldNumOrg; i++)
    {
             if (strcmp(fieldinfo->cFieldName(i), "ACQ1_EXP"                 )==0) index_ACQ1_EXP = i;
        else if (strcmp(fieldinfo->cFieldName(i), "ACQ13_EXP"                )==0) index_ACQ13_EXP = i;
        else if (strcmp(fieldinfo->cFieldName(i), "ACQ14_EXP"                )==0) index_ACQ14_EXP = i;
        else if (strcmp(fieldinfo->cFieldName(i), "ACQ2_EXP"                 )==0) index_ACQ2_EXP = i;
        else if (strcmp(fieldinfo->cFieldName(i), "ACQ3_EXP"                 )==0) index_ACQ3_EXP = i;
        else if (strcmp(fieldinfo->cFieldName(i), "ACQ4_EXP"                 )==0) index_ACQ4_EXP = i;
        else if (strcmp(fieldinfo->cFieldName(i), "ACQ5_EXP"                 )==0) index_ACQ5_EXP = i;
        else if (strcmp(fieldinfo->cFieldName(i), "ACQ8_EXP"                 )==0) index_ACQ8_EXP = i;
        else if (strcmp(fieldinfo->cFieldName(i), "ADJ_MATH_RES"             )==0) index_ADJ_MATH_RES = i;
        else if (strcmp(fieldinfo->cFieldName(i), "ALPHA_LOAD_IF"            )==0) index_ALPHA_LOAD_IF = i;
        else if (strcmp(fieldinfo->cFieldName(i), "ALPHA_LOAD_IF_EXP"        )==0) index_ALPHA_LOAD_IF_EXP = i;
        else if (strcmp(fieldinfo->cFieldName(i), "ANUITY_OUTGO"             )==0) index_ANUITY_OUTGO = i;
        else if (strcmp(fieldinfo->cFieldName(i), "BETA_LOAD_IF"             )==0) index_BETA_LOAD_IF = i;
        else if (strcmp(fieldinfo->cFieldName(i), "CASH_PREM"                )==0) index_CASH_PREM = i;
        else if (strcmp(fieldinfo->cFieldName(i), "COLL1_EXP"                )==0) index_COLL1_EXP = i;
        else if (strcmp(fieldinfo->cFieldName(i), "COLL13_EXP"               )==0) index_COLL13_EXP = i;
        else if (strcmp(fieldinfo->cFieldName(i), "COLL14_EXP"               )==0) index_COLL14_EXP = i;
        else if (strcmp(fieldinfo->cFieldName(i), "COLL3_EXP"                )==0) index_COLL3_EXP = i;
        else if (strcmp(fieldinfo->cFieldName(i), "COLL8_EXP"                )==0) index_COLL8_EXP = i;
        else if (strcmp(fieldinfo->cFieldName(i), "COMM1_EXP"                )==0) index_COMM1_EXP = i;
        else if (strcmp(fieldinfo->cFieldName(i), "COMM124_EXP"              )==0) index_COMM124_EXP = i;
        else if (strcmp(fieldinfo->cFieldName(i), "COMM2_EXP"                )==0) index_COMM2_EXP = i;
        else if (strcmp(fieldinfo->cFieldName(i), "COMM31_EXP"               )==0) index_COMM31_EXP = i;
        else if (strcmp(fieldinfo->cFieldName(i), "COMM32_EXP"               )==0) index_COMM32_EXP = i;
        else if (strcmp(fieldinfo->cFieldName(i), "COMM33_EXP"               )==0) index_COMM33_EXP = i;
        else if (strcmp(fieldinfo->cFieldName(i), "COMM34_EXP"               )==0) index_COMM34_EXP = i;
        else if (strcmp(fieldinfo->cFieldName(i), "COMM4_EXP"                )==0) index_COMM4_EXP = i;
        else if (strcmp(fieldinfo->cFieldName(i), "COMM5_EXP"                )==0) index_COMM5_EXP = i;
        else if (strcmp(fieldinfo->cFieldName(i), "COMM6_EXP"                )==0) index_COMM6_EXP = i;
        else if (strcmp(fieldinfo->cFieldName(i), "COMM71_EXP"               )==0) index_COMM71_EXP = i;
        else if (strcmp(fieldinfo->cFieldName(i), "COMM72_EXP"               )==0) index_COMM72_EXP = i;
        else if (strcmp(fieldinfo->cFieldName(i), "CRED_INT"                 )==0) index_CRED_INT = i;
        else if (strcmp(fieldinfo->cFieldName(i), "DAC_ASSD"                 )==0) index_DAC_ASSD = i;
        else if (strcmp(fieldinfo->cFieldName(i), "DAC_DIFF"                 )==0) index_DAC_DIFF = i;
        else if (strcmp(fieldinfo->cFieldName(i), "DAC_UNAMORT"              )==0) index_DAC_UNAMORT = i;
        else if (strcmp(fieldinfo->cFieldName(i), "DEATH_OUTGO"              )==0) index_DEATH_OUTGO = i;
        else if (strcmp(fieldinfo->cFieldName(i), "DEATH_RISK_PREM"          )==0) index_DEATH_RISK_PREM = i;
        else if (strcmp(fieldinfo->cFieldName(i), "DIAG_OUTGO"               )==0) index_DIAG_OUTGO = i;
        else if (strcmp(fieldinfo->cFieldName(i), "DIAG_RISK_PREM"           )==0) index_DIAG_RISK_PREM = i;
        else if (strcmp(fieldinfo->cFieldName(i), "DISBL_OUTGO"              )==0) index_DISBL_OUTGO = i;
        else if (strcmp(fieldinfo->cFieldName(i), "DISBL_RISK_PREM"          )==0) index_DISBL_RISK_PREM = i;
        else if (strcmp(fieldinfo->cFieldName(i), "FMF_INC"                  )==0) index_FMF_INC = i;
        else if (strcmp(fieldinfo->cFieldName(i), "FMF_OUT"                  )==0) index_FMF_OUT = i;
        else if (strcmp(fieldinfo->cFieldName(i), "GAMMA_LOAD_IF"            )==0) index_GAMMA_LOAD_IF = i;
        else if (strcmp(fieldinfo->cFieldName(i), "GMAB_INC_IF"              )==0) index_GMAB_INC_IF = i;
        else if (strcmp(fieldinfo->cFieldName(i), "GMAB_OUT_IF"              )==0) index_GMAB_OUT_IF = i;
        else if (strcmp(fieldinfo->cFieldName(i), "GMAB_RES"                 )==0) index_GMAB_RES = i;
        else if (strcmp(fieldinfo->cFieldName(i), "GMAB_RES_IF"              )==0) index_GMAB_RES_IF = i;
        else if (strcmp(fieldinfo->cFieldName(i), "GMDB_INC_IF"              )==0) index_GMDB_INC_IF = i;
        else if (strcmp(fieldinfo->cFieldName(i), "GMDB_INC2_IF"             )==0) index_GMDB_INC2_IF = i;
        else if (strcmp(fieldinfo->cFieldName(i), "GMDB_INCTI_IF"            )==0) index_GMDB_INCTI_IF = i;
        else if (strcmp(fieldinfo->cFieldName(i), "GMDB_OUT_IF"              )==0) index_GMDB_OUT_IF = i;
        else if (strcmp(fieldinfo->cFieldName(i), "GMDB_OUTTI_IF"            )==0) index_GMDB_OUTTI_IF = i;
        else if (strcmp(fieldinfo->cFieldName(i), "GMDB_RES"                 )==0) index_GMDB_RES = i;
        else if (strcmp(fieldinfo->cFieldName(i), "GMDB_RES_IF"              )==0) index_GMDB_RES_IF = i;
        else if (strcmp(fieldinfo->cFieldName(i), "GMDB_RESTI"               )==0) index_GMDB_RESTI = i;
        else if (strcmp(fieldinfo->cFieldName(i), "GMDB_RESTI_IF"            )==0) index_GMDB_RESTI_IF = i;
        else if (strcmp(fieldinfo->cFieldName(i), "GMDB_RISK_IF"             )==0) index_GMDB_RISK_IF = i;
        else if (strcmp(fieldinfo->cFieldName(i), "GMSB_INCTI_IF"            )==0) index_GMSB_INCTI_IF = i;
        else if (strcmp(fieldinfo->cFieldName(i), "GMSB_OUTTI_IF"            )==0) index_GMSB_OUTTI_IF = i;
        else if (strcmp(fieldinfo->cFieldName(i), "GMSB_RESTI"               )==0) index_GMSB_RESTI = i;
        else if (strcmp(fieldinfo->cFieldName(i), "GMSB_RESTI_IF"            )==0) index_GMSB_RESTI_IF = i;
        else if (strcmp(fieldinfo->cFieldName(i), "GMSB_RISK_IF"             )==0) index_GMSB_RISK_IF = i;
        else if (strcmp(fieldinfo->cFieldName(i), "HOSP_OUTGO"               )==0) index_HOSP_OUTGO = i;
        else if (strcmp(fieldinfo->cFieldName(i), "HOSP_RISK_PREM"           )==0) index_HOSP_RISK_PREM = i;
        else if (strcmp(fieldinfo->cFieldName(i), "INFORCE_PREM"             )==0) index_INFORCE_PREM = i;
        else if (strcmp(fieldinfo->cFieldName(i), "INFORCEPOL"               )==0) index_INFORCEPOL = i;
        else if (strcmp(fieldinfo->cFieldName(i), "INFORCEPOL_TK"            )==0) index_INFORCEPOL_TK = i;
        else if (strcmp(fieldinfo->cFieldName(i), "LIVING_OUTGO"             )==0) index_LIVING_OUTGO = i;
        else if (strcmp(fieldinfo->cFieldName(i), "MAINT1_EXP"               )==0) index_MAINT1_EXP = i;
        else if (strcmp(fieldinfo->cFieldName(i), "MAINT13_EXP"              )==0) index_MAINT13_EXP = i;
        else if (strcmp(fieldinfo->cFieldName(i), "MAINT14_EXP"              )==0) index_MAINT14_EXP = i;
        else if (strcmp(fieldinfo->cFieldName(i), "MAINT15_EXP"              )==0) index_MAINT15_EXP = i;
        else if (strcmp(fieldinfo->cFieldName(i), "MAINT16_EXP"              )==0) index_MAINT16_EXP = i;
        else if (strcmp(fieldinfo->cFieldName(i), "MAINT3_EXP"               )==0) index_MAINT3_EXP = i;
        else if (strcmp(fieldinfo->cFieldName(i), "MAINT4_EXP"               )==0) index_MAINT4_EXP = i;
        else if (strcmp(fieldinfo->cFieldName(i), "MAINT5_EXP"               )==0) index_MAINT5_EXP = i;
        else if (strcmp(fieldinfo->cFieldName(i), "MAINT8_EXP"               )==0) index_MAINT8_EXP = i;
        else if (strcmp(fieldinfo->cFieldName(i), "MAINT9_EXP"               )==0) index_MAINT9_EXP = i;
        else if (strcmp(fieldinfo->cFieldName(i), "MAT_OUTGO"                )==0) index_MAT_OUTGO = i;
        else if (strcmp(fieldinfo->cFieldName(i), "NO_NEW_POLS"              )==0) index_NO_NEW_POLS = i;
        else if (strcmp(fieldinfo->cFieldName(i), "NONU_INT"                 )==0) index_NONU_INT = i;
        else if (strcmp(fieldinfo->cFieldName(i), "O_TAXBL_INC"              )==0) index_O_TAXBL_INC = i;
        else if (strcmp(fieldinfo->cFieldName(i), "OTH_OUTGO"                )==0) index_OTH_OUTGO = i;
        else if (strcmp(fieldinfo->cFieldName(i), "OTH_RISK_PREM"            )==0) index_OTH_RISK_PREM = i;
        else if (strcmp(fieldinfo->cFieldName(i), "OTH_RISK_PREM_RBC"        )==0) index_OTH_RISK_PREM_RBC = i;
        else if (strcmp(fieldinfo->cFieldName(i), "OTHER_EXP"                )==0) index_OTHER_EXP = i;
        else if (strcmp(fieldinfo->cFieldName(i), "OTHER1_EXP"               )==0) index_OTHER1_EXP = i;
        else if (strcmp(fieldinfo->cFieldName(i), "PART_SURR_OUTGO"          )==0) index_PART_SURR_OUTGO = i;
        else if (strcmp(fieldinfo->cFieldName(i), "PREM_1ST_M"               )==0) index_PREM_1ST_M = i;
        else if (strcmp(fieldinfo->cFieldName(i), "PREM_1ST_S"               )==0) index_PREM_1ST_S = i;
        else if (strcmp(fieldinfo->cFieldName(i), "PREM_INC"                 )==0) index_PREM_INC = i;
        else if (strcmp(fieldinfo->cFieldName(i), "PREM_INC_DISC"            )==0) index_PREM_INC_DISC = i;
        else if (strcmp(fieldinfo->cFieldName(i), "PREM_UL_BAL"              )==0) index_PREM_UL_BAL = i;
        else if (strcmp(fieldinfo->cFieldName(i), "PREM_UL_SUB"              )==0) index_PREM_UL_SUB = i;
        else if (strcmp(fieldinfo->cFieldName(i), "PREM1YR"                  )==0) index_PREM1YR = i;
        else if (strcmp(fieldinfo->cFieldName(i), "PRIOR_ADJ_MATH_RES"       )==0) index_PRIOR_ADJ_MATH_RES = i;
        else if (strcmp(fieldinfo->cFieldName(i), "PRIOR_DAC_ASSD"           )==0) index_PRIOR_DAC_ASSD = i;
        else if (strcmp(fieldinfo->cFieldName(i), "PRIOR_DAC_UNAMORT"        )==0) index_PRIOR_DAC_UNAMORT = i;
        else if (strcmp(fieldinfo->cFieldName(i), "PRIOR_GMAB_RES_IF"        )==0) index_PRIOR_GMAB_RES_IF = i;
        else if (strcmp(fieldinfo->cFieldName(i), "PRIOR_GMDB_RES_IF"        )==0) index_PRIOR_GMDB_RES_IF = i;
        else if (strcmp(fieldinfo->cFieldName(i), "PRIOR_GMDB_RESTI_IF"      )==0) index_PRIOR_GMDB_RESTI_IF = i;
        else if (strcmp(fieldinfo->cFieldName(i), "PRIOR_GMSB_RESTI_IF"      )==0) index_PRIOR_GMSB_RESTI_IF = i;
        else if (strcmp(fieldinfo->cFieldName(i), "PRIOR_PREM_UL_BAL"        )==0) index_PRIOR_PREM_UL_BAL = i;
        else if (strcmp(fieldinfo->cFieldName(i), "PRIOR_RES_P"              )==0) index_PRIOR_RES_P = i;
        else if (strcmp(fieldinfo->cFieldName(i), "PRIOR_RES_W"              )==0) index_PRIOR_RES_W = i;
        else if (strcmp(fieldinfo->cFieldName(i), "RBC_ASSET"                )==0) index_RBC_ASSET = i;
        else if (strcmp(fieldinfo->cFieldName(i), "RBC_ASSET_PRIOR"          )==0) index_RBC_ASSET_PRIOR = i;
        else if (strcmp(fieldinfo->cFieldName(i), "RBC_RISK_A"               )==0) index_RBC_RISK_A = i;
        else if (strcmp(fieldinfo->cFieldName(i), "RBC_RISK_A_DEATH"         )==0) index_RBC_RISK_A_DEATH = i;
        else if (strcmp(fieldinfo->cFieldName(i), "RBC_RISK_A_DIAGSURG"      )==0) index_RBC_RISK_A_DIAGSURG = i;
        else if (strcmp(fieldinfo->cFieldName(i), "RBC_RISK_A_DISBL"         )==0) index_RBC_RISK_A_DISBL = i;
        else if (strcmp(fieldinfo->cFieldName(i), "RBC_RISK_A_HOSP"          )==0) index_RBC_RISK_A_HOSP = i;
        else if (strcmp(fieldinfo->cFieldName(i), "RBC_RISK_A_OTH"           )==0) index_RBC_RISK_A_OTH = i;
        else if (strcmp(fieldinfo->cFieldName(i), "RBC_RISK_A_PR_DEATH"      )==0) index_RBC_RISK_A_PR_DEATH = i;
        else if (strcmp(fieldinfo->cFieldName(i), "RBC_RISK_A_PR_DIAGSURG"   )==0) index_RBC_RISK_A_PR_DIAGSURG = i;
        else if (strcmp(fieldinfo->cFieldName(i), "RBC_RISK_A_PR_DISBL"      )==0) index_RBC_RISK_A_PR_DISBL = i;
        else if (strcmp(fieldinfo->cFieldName(i), "RBC_RISK_A_PR_HOSP"       )==0) index_RBC_RISK_A_PR_HOSP = i;
        else if (strcmp(fieldinfo->cFieldName(i), "RBC_RISK_A_PR_OTH"        )==0) index_RBC_RISK_A_PR_OTH = i;
        else if (strcmp(fieldinfo->cFieldName(i), "RBC_RISK_A_PR_SILSON"     )==0) index_RBC_RISK_A_PR_SILSON = i;
        else if (strcmp(fieldinfo->cFieldName(i), "RBC_RISK_A_SILSON"        )==0) index_RBC_RISK_A_SILSON = i;
        else if (strcmp(fieldinfo->cFieldName(i), "RBC_RISK_B"               )==0) index_RBC_RISK_B = i;
        else if (strcmp(fieldinfo->cFieldName(i), "RBC_RISK_C"               )==0) index_RBC_RISK_C = i;
        else if (strcmp(fieldinfo->cFieldName(i), "RBC_RISK_D_ASSET"         )==0) index_RBC_RISK_D_ASSET = i;
        else if (strcmp(fieldinfo->cFieldName(i), "RBC_RISK_D_LIAB"          )==0) index_RBC_RISK_D_LIAB = i;
        else if (strcmp(fieldinfo->cFieldName(i), "RBC_RISK_D_LIAB_PRIOR"    )==0) index_RBC_RISK_D_LIAB_PRIOR = i;
        else if (strcmp(fieldinfo->cFieldName(i), "RBC_RISK_D_MIN"           )==0) index_RBC_RISK_D_MIN = i;
        else if (strcmp(fieldinfo->cFieldName(i), "RBC_RISK_D_MIN_PRIOR"     )==0) index_RBC_RISK_D_MIN_PRIOR = i;
        else if (strcmp(fieldinfo->cFieldName(i), "RBC_RISK_D_RASSET"        )==0) index_RBC_RISK_D_RASSET = i;
        else if (strcmp(fieldinfo->cFieldName(i), "RBC_RISK_D_REV"           )==0) index_RBC_RISK_D_REV = i;
        else if (strcmp(fieldinfo->cFieldName(i), "RBC_RISK_D_RLIAB"         )==0) index_RBC_RISK_D_RLIAB = i;
        else if (strcmp(fieldinfo->cFieldName(i), "RBC_RISK_D_RLIAB_PRIOR"   )==0) index_RBC_RISK_D_RLIAB_PRIOR = i;
        else if (strcmp(fieldinfo->cFieldName(i), "RBC_RISK_D_RLIAB_TEMP"    )==0) index_RBC_RISK_D_RLIAB_TEMP = i;
        else if (strcmp(fieldinfo->cFieldName(i), "RBC_RISK_E_GEN"           )==0) index_RBC_RISK_E_GEN = i;
        else if (strcmp(fieldinfo->cFieldName(i), "RBC_RISK_E_GMAB"          )==0) index_RBC_RISK_E_GMAB = i;
        else if (strcmp(fieldinfo->cFieldName(i), "RBC_RISK_E_GMAB_MIN"      )==0) index_RBC_RISK_E_GMAB_MIN = i;
        else if (strcmp(fieldinfo->cFieldName(i), "RBC_RISK_E_GMDB"          )==0) index_RBC_RISK_E_GMDB = i;
        else if (strcmp(fieldinfo->cFieldName(i), "RBC_RISK_E_GMDB_MIN"      )==0) index_RBC_RISK_E_GMDB_MIN = i;
        else if (strcmp(fieldinfo->cFieldName(i), "RES_P"                    )==0) index_RES_P = i;
        else if (strcmp(fieldinfo->cFieldName(i), "RES_W"                    )==0) index_RES_W = i;
        else if (strcmp(fieldinfo->cFieldName(i), "RISK_PREM_SB_IF"          )==0) index_RISK_PREM_SB_IF = i;
        else if (strcmp(fieldinfo->cFieldName(i), "SA_ANNUITY"               )==0) index_SA_ANNUITY = i;
        else if (strcmp(fieldinfo->cFieldName(i), "SAVING_PREM_SB_IF"        )==0) index_SAVING_PREM_SB_IF = i;
        else if (strcmp(fieldinfo->cFieldName(i), "SEP_CV_LOAD"              )==0) index_SEP_CV_LOAD = i;
        else if (strcmp(fieldinfo->cFieldName(i), "SEP_LIVING_OUTGO"         )==0) index_SEP_LIVING_OUTGO = i;
        else if (strcmp(fieldinfo->cFieldName(i), "SEP_NET_LOAD"             )==0) index_SEP_NET_LOAD = i;
        else if (strcmp(fieldinfo->cFieldName(i), "SEP_PART_SURR_OUTGO"      )==0) index_SEP_PART_SURR_OUTGO = i;
        else if (strcmp(fieldinfo->cFieldName(i), "SEP_PREM_1ST_M"           )==0) index_SEP_PREM_1ST_M = i;
        else if (strcmp(fieldinfo->cFieldName(i), "SEP_PREM_1ST_S"           )==0) index_SEP_PREM_1ST_S = i;
        else if (strcmp(fieldinfo->cFieldName(i), "SEP_PREM_INFORCE"         )==0) index_SEP_PREM_INFORCE = i;
        else if (strcmp(fieldinfo->cFieldName(i), "SEP_PREM_UL_BAL"          )==0) index_SEP_PREM_UL_BAL = i;
        else if (strcmp(fieldinfo->cFieldName(i), "SEP_PREM_UL_SUB"          )==0) index_SEP_PREM_UL_SUB = i;
        else if (strcmp(fieldinfo->cFieldName(i), "SEP_PRIOR_PREM_UL_BAL"    )==0) index_SEP_PRIOR_PREM_UL_BAL = i;
        else if (strcmp(fieldinfo->cFieldName(i), "SEP_PRIOR_RES_P"          )==0) index_SEP_PRIOR_RES_P = i;
        else if (strcmp(fieldinfo->cFieldName(i), "SEP_PRIOR_RES_W"          )==0) index_SEP_PRIOR_RES_W = i;
        else if (strcmp(fieldinfo->cFieldName(i), "SEP_PU_BETA_LOAD"         )==0) index_SEP_PU_BETA_LOAD = i;
        else if (strcmp(fieldinfo->cFieldName(i), "SEP_PW_DIFF"              )==0) index_SEP_PW_DIFF = i;
        else if (strcmp(fieldinfo->cFieldName(i), "SEP_RES_DTH"              )==0) index_SEP_RES_DTH = i;
        else if (strcmp(fieldinfo->cFieldName(i), "SEP_RES_P"                )==0) index_SEP_RES_P = i;
        else if (strcmp(fieldinfo->cFieldName(i), "SEP_RES_W"                )==0) index_SEP_RES_W = i;
        else if (strcmp(fieldinfo->cFieldName(i), "SEP_RISK_PREM"            )==0) index_SEP_RISK_PREM = i;
        else if (strcmp(fieldinfo->cFieldName(i), "SEP_SAVE_PREM"            )==0) index_SEP_SAVE_PREM = i;
        else if (strcmp(fieldinfo->cFieldName(i), "SEP_SURR_OUTGO"           )==0) index_SEP_SURR_OUTGO = i;
        else if (strcmp(fieldinfo->cFieldName(i), "SILSON_OUTGO"             )==0) index_SILSON_OUTGO = i;
        else if (strcmp(fieldinfo->cFieldName(i), "SILSON_RISK_PREM_RBC"     )==0) index_SILSON_RISK_PREM_RBC = i;
        else if (strcmp(fieldinfo->cFieldName(i), "STD_RES_DTH"              )==0) index_STD_RES_DTH = i;
        else if (strcmp(fieldinfo->cFieldName(i), "SUDANG"                   )==0) index_SUDANG = i;
        else if (strcmp(fieldinfo->cFieldName(i), "SUM_ASSD_IF"              )==0) index_SUM_ASSD_IF = i;
        else if (strcmp(fieldinfo->cFieldName(i), "SURG_OUTGO"               )==0) index_SURG_OUTGO = i;
        else if (strcmp(fieldinfo->cFieldName(i), "SURG_RISK_PREM"           )==0) index_SURG_RISK_PREM = i;
        else if (strcmp(fieldinfo->cFieldName(i), "SURR_OUTGO"               )==0) index_SURR_OUTGO = i;
        else if (strcmp(fieldinfo->cFieldName(i), "TOT_ALPHA_EXP"            )==0) index_TOT_ALPHA_EXP = i;
        else if (strcmp(fieldinfo->cFieldName(i), "TOT_BEN_OUTGO"            )==0) index_TOT_BEN_OUTGO = i;
        else if (strcmp(fieldinfo->cFieldName(i), "TOT_BETA_EXP"             )==0) index_TOT_BETA_EXP = i;
        else if (strcmp(fieldinfo->cFieldName(i), "TOT_GAMMA_EXP"            )==0) index_TOT_GAMMA_EXP = i;
        else if (strcmp(fieldinfo->cFieldName(i), "WAIVER_PREM_IF"           )==0) index_WAIVER_PREM_IF = i;
    }
   
    return;
}

void ModelEV::StartUp(double** result, FieldInfoSet* fieldinfo, char* mcode, char* alfakey2)
{
    this->Result_Org_val = result;
    strcpy(this->M_CODE,   mcode   );
    strcpy(this->ALFAKEY2, alfakey2);
   
    vRESULT_ORG.Init(ProjPeriod,FieldNumOrg);
    vGEN_PREM.Init(ProjPeriod);  
    vRISK_PREM_SB_IF.Init(ProjPeriod);  

    return;
}

ModelEV::~ModelEV()
{
}

/***************************************************************/
/*            사용자정의 함수                                  */
/***************************************************************/


double ModelEV::fRESULT_ORG(unsigned short u, unsigned short index)
{   
    return Result_Org_val[u][index];
}

double ModelEV::RESULT(unsigned short u, unsigned short index)
{   
    if (index>=FieldNumOrg) return 0.0;

    if (u>ProjPeriod)       return 0.0;
   
    return RESULT_ORG(u, index);
}

double ModelEV::fGEN_PREM(unsigned short u)
{  
    if (strcmp(M_CODE, "PA4")==0)
    {
    }

    if (strcmp(ALFAKEY2, "EP1")==0)
    {
    }
   
    if (u==360)
    {
    }
   
    
    return RESULT(u, index_PREM_INC)
         - RESULT(u, index_SEP_PREM_1ST_M)
         - RESULT(u, index_SEP_PREM_1ST_S)
         - RESULT(u, index_SEP_PREM_INFORCE)
         + RESULT(u, index_SEP_RISK_PREM)
         - RESULT(u, index_PREM_UL_SUB)
         + RESULT(u, index_SEP_PREM_UL_SUB)
         - RESULT(u, index_GMDB_INC2_IF);
}

double ModelEV::fRISK_PREM_SB_IF(unsigned short u)
{
    return RESULT(u, index_RISK_PREM_SB_IF);
}

 

/***************************************************************/
/*            EV Report                                        */
/***************************************************************/

double ModelEV::fRBC_GMAB(unsigned short u)
{

 return  RESULT(u, index_RBC_RISK_E_GMAB)
 
}

double ModelEV::fRBC_GMAB_MIN(unsigned short u)
{

 return  RESULT(u, index_RBC_RISK_E_GMAB_MIN)
 
}

double ModelEV::fCOMMISSION_EXPENSE_TOTAL(unsigned short u)
{

 return  RESULT(u, index_COMM1_EXP)
 +RESULT(u, index_COMM2_EXP)
 +RESULT(u, index_COMM31_EXP)
 +RESULT(u, index_COMM32_EXP)
 +RESULT(u, index_COMM33_EXP)
 +RESULT(u, index_COMM34_EXP)
 +RESULT(u, index_COMM4_EXP)
 +RESULT(u, index_COMM5_EXP)
 +RESULT(u, index_COMM6_EXP)
 +RESULT(u, index_COMM71_EXP)
 +RESULT(u, index_COMM72_EXP) ..
 -RESULT(u, index_COMM124_EXP)
}

double ModelEV::fACQUISITION_EXPENSE_TOTAL(unsigned short u)
{

 return  RESULT(u, index_ACQ1_EXP)
        +RESULT(u, index_ACQ2_EXP)
        +RESULT(u, index_ACQ3_EXP)
        +RESULT(u, index_ACQ8_EXP)
        +RESULT(u, index_ACQ14_EXP)
}


double ModelEV::fMAINTENANCE_EXPENSE_TOTAL(unsigned short u)
{

 return  RESULT(u, index_MAINT1_EXP)
 +RESULT(u, index_MAINT3_EXP)
 +RESULT(u, index_MAINT8_EXP) 
 +RESULT(u, index_MAINT9_EXP)
 +RESULT(u, index_MAINT13_EXP)
 +RESULT(u, index_MAINT14_EXP)
 +(RESULT(u, index_MAINT15_EXP)
 +RESULT(u, index_MAINT16_EXP))
}


double ModelEV::fCOLLECTION_EXPENSE(unsigned short u)
{

 return  (RESULT(u, index_COLL1_EXP)
 +RESULT(u, index_COLL3_EXP)
 +RESULT(u, index_COLL8_EXP) 
 +RESULT(u, index_COLL13_EXP)
 +RESULT(u, index_COLL14_EXP))
}


double ModelEV::fOTHER_EXPENSES(unsigned short u)
{

 return  RESULT(u, index_MAINT4_EXP)
 +RESULT(u, index_MAINT5_EXP)
}


double ModelEV::fTRANSGATOSA(unsigned short u)
{

 return  RESULT(u, index_SEP_PREM_1ST_M)
 +RESULT(u, index_SEP_PREM_1ST_S)
 +RESULT(u, index_SEP_PREM_INFORCE) 
 -RESULT(u, index_SEP_RISK_PREM)
 +RESULT(u, index_GMDB_INC2_IF)
}


double ModelEV::fTRANSSATOGA(unsigned short u)
{

 return  RESULT(u, index_SEP_PU_BETA_LOAD) 
}


double ModelEV::fTRANSSATOGASURR(unsigned short u)
{

 return  RESULT(u, index_SEP_SURR_OUTGO)
 +RESULT(u, index_SEP_PW_DIFF) 
}


double ModelEV::fTRANSSATOGALIVING(unsigned short u)
{

 return  RESULT(u, index_SEP_LIVING_OUTGO)
 +RESULT(u, index_SEP_PART_SURR_OUTGO)
}


double ModelEV::fTRANSSATOGAANNRES(unsigned short u)
{

 return  RESULT(u, index_SA_ANNUITY) 
}


double ModelEV::fTRANSSATOGADTHRES(unsigned short u)
{

 return  RESULT(u, index_SEP_RES_DTH)
}


double ModelEV::fLIVING_BEN_OUTGO(unsigned short u)
{

 return  RESULT(u, index_LIVING_OUTGO)
        +RESULT(u, index_PART_SURR_OUTGO)
}


double ModelEV::fDACACQ_NO(unsigned short u)
{

 return  RESULT(u, index_ACQ2_EXP)
}


double ModelEV::fDACACQ_PREM(unsigned short u)
{

 return  RESULT(u, index_ACQ1_EXP)
}


double ModelEV::fNONDACACQ_NO(unsigned short u)
{

 return  RESULT(u, index_ACQ3_EXP)
}


double ModelEV::fNONDACACQ_PREM(unsigned short u)
{

 return  RESULT(u, index_ACQ8_EXP)
}


double ModelEV::fMAINT_NO(unsigned short u)
{

 return  RESULT(u, index_MAINT1_EXP)
}


double ModelEV::fMAINT_PREM(unsigned short u)
{

 return  RESULT(u, index_MAINT15_EXP)
        +RESULT(u, index_MAINT16_EXP)
}


double ModelEV::fSAVING_PREM_GA(unsigned short u)
{

 return  RESULT(u, index_SAVING_PREM_SB_IF)
       -(RESULT(u, index_SEP_PREM_1ST_M)
        +RESULT(u, index_SEP_PREM_1ST_S)
        +RESULT(u, index_SEP_PREM_INFORCE)
        -RESULT(u, index_SEP_RISK_PREM)
        +RESULT(u, index_SEP_NET_LOAD)
        -RESULT(u, index_SEP_CV_LOAD))   
}


double ModelEV::fSAVING_PREM_SA(unsigned short u)
{

 return  RESULT(u, index_SEP_PREM_1ST_M)
        +RESULT(u, index_SEP_PREM_1ST_S)
        +RESULT(u, index_SEP_PREM_INFORCE)
        -RESULT(u, index_SEP_RISK_PREM)
        +RESULT(u, index_SEP_NET_LOAD)
        -RESULT(u, index_SEP_CV_LOAD)
}


double ModelEV::fE_RES_0(unsigned short u)
{

 return  RESULT(u, index_PRIOR_RES_W)
        -RESULT(u, index_SEP_PRIOR_RES_W)
        +RESULT(u, index_PRIOR_GMDB_RES_IF)
        +RESULT(u, index_PRIOR_GMAB_RES_IF)
        +RESULT(u, index_PRIOR_GMSB_RESTI_IF)
        +RESULT(u, index_PRIOR_GMDB_RESTI_IF)

      -(RESULT(u, index_PRIOR_PREM_UL_BAL)
       -RESULT(u, index_SEP_PRIOR_PREM_UL_BAL))
        +RESULT(u, index_PRIOR_PERS_BONUS)
}


double ModelEV::fE_RES_1(unsigned short u)
{

 return  RESULT(u, index_RES_W)
        -RESULT(u, index_SEP_RES_W)
        +RESULT(u, index_GMDB_RES_IF)
        +RESULT(u, index_GMAB_RES_IF)
        +RESULT(u, index_GMSB_RESTI_IF)
        +RESULT(u, index_GMDB_RESTI_IF)
      -(RESULT(u, index_PREM_UL_BAL)
        -RESULT(u, index_SEP_PREM_UL_BAL))
        +RESULT(u, index_PERS_BONUS_RES_BB_IF
}


double ModelEV::fGEN_PREM(unsigned short u)
{

 return  RESULT(u, index_PREM_INC)
        -RESULT(u, index_SEP_PREM_1ST_M)
        -RESULT(u, index_SEP_PREM_1ST_S)
        -RESULT(u, index_SEP_PREM_INFORCE)
        +RESULT(u, index_SEP_RISK_PREM)
       -(RESULT(u, index_PREM_UL_SUB)
        -RESULT(u, index_SEP_PREM_UL_SUB))
        -RESULT(u, index_GMDB_INC2_IF)      
}


double ModelEV::fTOT_BEN(unsigned short u)
{

 return  RESULT(u, index_MAT_OUTGO)
        +RESULT(u, index_ANUITY_OUTGO)
        +RESULT(u, index_LIVING_OUTGO)
        +RESULT(u, index_SURR_OUTGO)
        +RESULT(u, index_PART_SURR_OUTGO)
       +(RESULT(u, index_DEATH_OUTGO)
       +(RESULT(u, index_DISBL_OUTGO)
        +RESULT(u, index_SURG_OUTGO)
        +RESULT(u, index_HOSP_OUTGO)
        +RESULT(u, index_OTH_OUTGO)
        +RESULT(u, index_DIAG_OUTGO)))
        -RESULT(u, index_SEP_SURR_OUTGO)
        -RESULT(u, index_SEP_LIVING_OUTGO)
        -RESULT(u, index_SEP_PART_SURR_OUTGO)
}


double ModelEV::fTOT_EXP(unsigned short u)
{

 return  RESULT(u, index_TOT_ALPHA_EXP)
        +RESULT(u, index_TOT_BETA_EXP)
        +RESULT(u, index_TOT_GAMMA_EXP)
}


double ModelEV::fETC_INC_VA(unsigned short u)
{

 return  RESULT(u, index_SEP_RES_DTH)
        +RESULT(u, index_SEP_PU_BETA_LOAD)
        +RESULT(u, index_SEP_PW_DIFF)
        +RESULT(u, index_SA_ANNUITY)
        +RESULT(u, index_GMDB_INC_IF)
        +RESULT(u, index_GMAB_INC_IF)
}


double ModelEV::fETC_OUT_VA(unsigned short u)
{

 return  RESULT(u, index_GMDB_RES_IF)
        +RESULT(u, index_GMAB_RES_IF)
        +RESULT(u, index_GMSB_RESTI_IF)
        +RESULT(u, index_GMDB_RESTI_IF)
       -(RESULT(u, index_PRIOR_GMDB_RES_IF)
        +RESULT(u, index_PRIOR_GMAB_RES_IF)
        +RESULT(u, index_PRIOR_GMSB_RESTI_IF)
        +RESULT(u, index_PRIOR_GMDB_RESTI_IF))
}


double ModelEV::fRES_DTH(unsigned short u)
{

 return  RESULT(u, index_STD_RES_DTH)
        -RESULT(u, index_SEP_RES_DTH)
}

double ModelEV::fGMAB_OUT_IF(unsigned short u)
{

 return  RESULT(u, index_GMAB_INC_IF)
        *RESULT(u, index_GMAB_COST_RATE)

       
double ModelEV::fSAVING_PREM(unsigned short u)
{

 return  RESULT(u, index_SAVING_PREM_SB_IF)
       -(RESULT(u, index_SEP_PREM_1ST_M)
        +RESULT(u, index_SEP_PREM_1ST_S)
        +RESULT(u, index_SEP_PREM_INFORCE)
        -RESULT(u, index_SEP_RISK_PREM)
        -RESULT(u, index_SEP_PU_BETA_LOAD))
       +(RESULT(u, index_SEP_RES_P)
        -RESULT(u, index_SEP_RES_W))
       -(RESULT(u, index_SEP_PRIOR_RES_P)
        -RESULT(u, index_SEP_PRIOR_RES_W))
        +RESULT(u, index_SEP_PW_DIFF)
        +RESULT(u, index_SA_ANNUITY)
       +(RESULT(u, index_GMDB_INC_IF)
        +RESULT(u, index_GMAB_INC_IF))
       +(RESULT(u, index_GMSB_INCTI_IF)
        +RESULT(u, index_GMDB_INCTI_IF))
        -RESULT(u, index_GMXB_COST)
       -(RESULT(u, index_PREM_UL_SUB)
        -RESULT(u, index_SEP_PREM_UL_SUB))
}


double ModelEV::fVARIABLE_ADJUSTED(unsigned short u)
{

 return  RESULT(u, index_SEP_RES_P)
        -RESULT(u, index_SEP_RES_W)
        -RESULT(u, index_SEP_PRIOR_RES_P)
        +RESULT(u, index_SEP_PRIOR_RES_W)
        +RESULT(u, index_SEP_NET_LOAD)
        -RESULT(u, index_SEP_CV_LOAD)
        +RESULT(u, index_SEP_PU_BETA_LOAD)
        +RESULT(u, index_SEP_PW_DIFF)
}

double ModelEV::fTOT_LOAD(unsigned short u)
{

 return  RESULT(u, index_ALPHA_LOAD_IF)
        +RESULT(u, index_BETA_LOAD_IF)
        +RESULT(u, index_GAMMA_LOAD_IF)
}


double ModelEV::fSA_OUTGO(unsigned short u)
{

 return  RESULT(u, index_DEATH_OUTGO)
       +(RESULT(u, index_DISBL_OUTGO)
        +RESULT(u, index_SURG_OUTGO)
        +RESULT(u, index_HOSP_OUTGO)
        +RESULT(u, index_OTH_OUTGO)
        +RESULT(u, index_DIAG_OUTGO))
        -RESULT(u, index_STD_RES_DTH)
}


double ModelEV::fSAGO_OUTGO(unsigned short u)
{

 return  RESULT(u, index_DEATH_OUTGO)
       +(RESULT(u, index_DISBL_OUTGO)
        +RESULT(u, index_SURG_OUTGO)
        +RESULT(u, index_HOSP_OUTGO)
        +RESULT(u, index_OTH_OUTGO)
        +RESULT(u, index_DIAG_OUTGO)
}


double ModelEV::fRES_INC(unsigned short u)
{

 return (RESULT(u, index_RES_W)
        -RESULT(u, index_PRIOR_RES_W))
       -(RESULT(u, index_SEP_RES_P)
        -RESULT(u, index_SEP_PRIOR_RES_P))
        -RESULT(u, index_DAC_DIFF)
      -((RESULT(u, index_PREM_UL_BAL)
        -RESULT(u, index_SEP_PREM_UL_BAL))
       -(RESULT(u, index_PRIOR_PREM_UL_BAL)
        -RESULT(u, index_SEP_PRIOR_PREM_UL_BAL)))       
       +(RESULT(u, index_PERS_BONUS_RES_BB_IF)
        -RESULT(u, index_PRIOR_PERS_BONUS))
}


double ModelEV::fETC_INC(unsigned short u)
{

 return  RESULT(u, index_ETC_INC_VA)
        +RESULT(u, index_FMF_INC)
}


double ModelEV::fETC_OUT(unsigned short u)
{

 return  RESULT(u, index_OTHER_EXP)
        +RESULT(u, index_ETC_OUT_VA)
        +RESULT(u, index_FMF_OUT)
        +RESULT(u, index_GMXB_COST)
}

 

double ModelEV::fE_BEN(unsigned short u)
{

 return  RESULT(u, index_TOT_BEN)
       -(RESULT(u, index_DEATH_OUTGO)
        +(RESULT(u, index_DISBL_OUTGO)
        +RESULT(u, index_SURG_OUTGO)
        +RESULT(u, index_HOSP_OUTGO)
        +RESULT(u, index_OTH_OUTGO)
        +RESULT(u, index_DIAG_OUTGO)))
}


double ModelEV::fCRED_NEED(unsigned short u)
{

 return  RESULT(u, index_E_RES_1)
        +RESULT(u, index_E_BEN)
        +RESULT(u, index_RES_DTH)
        -RESULT(u, index_E_RES_0)
        -RESULT(u, index_SAVING_PREM)
}


double ModelEV::fGYELSAN(unsigned short u)
{

 return  RESULT(u, index_GEN_PREM)
        -RESULT(u, index_TOT_BEN)
        -RESULT(u, index_TOT_EXP)
       +(RESULT(u, index_ETC_INC)
         -RESULT(u, index_ETC_OUT))
       +RESULT(u, index_O_TAXBL_INC)
       -RESULT(u, index_RES_INC)


double ModelEV::fDAC_DIFF_INC(unsigned short u)
{

 return  RESULT(u, index_DAC_DIFF_INC)
}


double ModelEV::fB_CHA(unsigned short u)
{

 return  RESULT(u, index_TOT_LOAD)
        -RESULT(u, index_TOT_EXP)
        +RESULT(u, index_DAC_DIFF_INC)
}

       
double ModelEV::fSA_CHA(unsigned short u)
{

 return  RESULT(u, index_RISK_PREM_SB_IF)
        -RESULT(u, index_SA_OUTGO)
}


double ModelEV::fETC_CHA(unsigned short u)
{

 return  RESULT(u, index_FMF_INC)
        -RESULT(u, index_OTHER_EXP)
        -RESULT(u, index_FMF_OUT)
}


double ModelEV::fE_CHA(unsigned short u)
{

 return  RESULT(u, index_O_TAXBL_INC)
        -RESULT(u, index_CRED_NEED)
}


double ModelEV::fEWON(unsigned short u)
{

 return  RESULT(u, index_E_CHA)
        +RESULT(u, index_B_CHA)
        +RESULT(u, index_SA_CHA)     
        +RESULT(u, index_ETC_CHA)
}


double ModelEV::fDIFF(unsigned short u)
{

 return  RESULT(u, index_GYELSAN)
        -RESULT(u, index_EWON)
}


double ModelEV::fS_SA_CHA(unsigned short u)
{

 return  RESULT(u, index_SA_CHA)
}


double ModelEV::fS_ETC_CHA(unsigned short u)
{

 return  RESULT(u, index_ETC_CHA)
}


double ModelEV::fS_EWON(unsigned short u)
{

 return  RESULT(u, index_S_E_CHA)
        +RESULT(u, index_S_B_CHA)
        +RESULT(u, index_SA_CHA)
        +RESULT(u, index_ETC_CHA)
}


 

/***************************************************************/
/*            Cost Rate                                        */
/***************************************************************/

 

/***************************************************************/
/*            Contractor Dividend                              */
/***************************************************************/

 

'Programs' 카테고리의 다른 글

GrpKeyTable.cpp  (0) 2014.08.14
ResultUnit.cpp  (0) 2014.08.14
FieldInfoSet.cpp  (0) 2014.08.14
Inc.hpp  (0) 2014.08.14
Group.cpp  (0) 2014.08.14
Posted by Analytical Warrior
|

GrpKeyTable.cpp

Programs 2014. 8. 14. 20:17

#include "Inc.hpp"

//----------------------------------------------------------------
//GrpKeyTable 클래스 함수들
//----------------------------------------------------------------

void GrpKeyTable::Init(char* path_key)
{
    char  rec[1000];
    char* pch;
    long  num = 0;

    this->KeyListNum = 0;

    //키테이블 파일 open
    KeyList.open(path_key, ifstream::in);
    if (KeyList==NULL)
    {
        gLogFile << "Error : Key File missing !!!   : " << path_key << endl;
        cout     << "Error : Key File missing !!!   : " << path_key << endl;
        system("PAUSE"); exit(0);
    }

    while(1)
    {
        KeyList.getline(rec,1000,'\n');

        if (KeyList.eof()==true) break;
        if (strlen(rec)==0)      break;

        if (KeyListNum==0)
        {
            pch = strtok(rec, ",");
            this->KeyFieldNum++;
            for (int m=1; m<100; m++)
            {
                pch = strtok(NULL, ","); if (pch==0) break;
                this->KeyFieldNum++;
            }
        }

        this->KeyListNum ++;
    }

    this->KeyFieldNum = KeyFieldNum - 2; //Prod와 Spcode는 키갯수에서 제외
    this->KeyListNum  = KeyListNum  - 1; //필드명 레코드는 갯수에서 제외

 KeyList.close();

    KeyLabel = new char* [KeyFieldNum];
    KeyError = new char* [KeyFieldNum];
    for(int i=0; i<KeyFieldNum; i++)
    {
        KeyLabel[i] = new char [20];
        KeyError[i] = new char [30];

        strcpy(KeyLabel[i],"Key");
        strcpy(KeyError[i],"*");
    }
    strcpy(KeyError[0],"KeyError");

    Product = new char*  [KeyListNum];
    Spcode  = new long   [KeyListNum];
    Key     = new char** [KeyListNum];
    for (int i=0; i<KeyListNum; i++)
    {
        Product[i] = new char [20]; strcpy(Product[i],"");

        Spcode[i] = 0;

        Key[i] = new char* [KeyFieldNum];
        for(int j=0; j<KeyFieldNum; j++)
        {
            Key[i][j] = new char [30];
            strcpy(Key[i][j],"");
        }
    }

    ifstream KeyList2;      //그룹핑키 목록 파일
    KeyList2.open(path_key, ifstream::in);
    while(1)
    {
        KeyList2.getline(rec,1000,'\n');

        if (KeyList2.eof()==true) break;
        if (strlen(rec)==0)       break;

        if (num==0)
        {
            for (int i=0; i<KeyFieldNum+2; i++)
            {
                if (i==0) pch = strtok(rec, ",");   
                else      pch = strtok(NULL,","); 
               
                if (i>1)
                {
                    strcpy(KeyLabel[i-2], pch);
                }
            }
        }
        else
        {
            for (int i=0; i<KeyFieldNum+2; i++)
            {
                if (i==0) pch = strtok(rec, ",");   
                else      pch = strtok(NULL,","); 
           
                     if (i==0) strcpy(Product[num-1], pch);
                else if (i==1) Spcode[num-1] = atoi(pch);
                else           strcpy(Key[num-1][i-2], pch);
            }
        }

        num++;
    }

 KeyList2.close();

    return;
}

GrpKeyTable::~GrpKeyTable()
{
    for(int i=0; i<KeyFieldNum; i++)
    {
        delete [] KeyLabel[i];
        delete [] KeyError[i];
    }

    delete [] KeyLabel;
    delete [] KeyError;

    for (int i=0; i<KeyListNum; i++)
    {
        delete [] Product[i];

        for(int j=0; j<KeyFieldNum; j++)
        {
            delete [] Key[i][j];
        }

        delete [] Key[i];
    }

    delete [] Product;
    delete [] Spcode;
    delete [] Key;

    return;
}

char** GrpKeyTable::KeySearch(char* prod, long spcode)
{
    for (int i=0; i<KeyListNum; i++)
    {
        if (strcmp(prod, Product[i])==0 && spcode==Spcode[i]) return Key[i];
    }
   
    gLogFile << "Error : Key Missing !!!         : " << prod << " : " << spcode << endl;
    //cout     << "Error : Key Missing !!!         : " << prod << " : " << spcode << endl;

    return KeyError;
}

char* GrpKeyTable::KeySearch(char* prod, long spcode, char* keylabel)
{
    for (int i=0; i<KeyListNum; i++)
    {
        if (strcmp(prod, Product[i])==0 && spcode==Spcode[i])
        {
            for (int j=0; j<KeyFieldNum; j++)
            {
                if (strcmp(keylabel, KeyLabel[j])==0) return Key[i][j];
            }
        }
    }
   
    return "?";
}

 

 


 

'Programs' 카테고리의 다른 글

ModelEV.cpp  (2) 2014.08.14
ResultUnit.cpp  (0) 2014.08.14
FieldInfoSet.cpp  (0) 2014.08.14
Inc.hpp  (0) 2014.08.14
Group.cpp  (0) 2014.08.14
Posted by Analytical Warrior
|

ResultUnit.cpp

Programs 2014. 8. 14. 20:16

#include "Inc.hpp"

//----------------------------------------------------------------
//ResultUnit 클래스 함수들
//----------------------------------------------------------------

void ResultUnit::Init(long period, long fieldnum, short keynum, char** key)
{
    this->Period   = period;
    this->FieldNum = fieldnum;
    this->KeyNum   = keynum;

    Key = new char* [KeyNum];
    for(int i=0; i<KeyNum; i++)
    {
        Key[i] = new char [30];
        strcpy(Key[i], key[i]);
    }
   
    value = new double* [Period];
    for(int i=0; i<Period; i++)
    {
        value[i] = new double [FieldNum];

        for(int j=0; j<FieldNum; j++)
        {
            value[i][j] = 0.0;
        }
    }
}

ResultUnit::~ResultUnit()
{
    for(int i=0; i<KeyNum; i++)
    {
        delete [] Key[i];
    }
    delete [] Key;

    for(int i=0; i<Period; i++)
    {
        delete [] value[i];
    }
    delete [] value;
}

bool ResultUnit::GroupCmp(char** key)
{
    for(int i=0; i<KeyNum; i++)
    {
        if(strcmp(key[i], this->Key[i])!=0) return false;
    }
   
    return true;
}

void ResultUnit::Save(double** result)
{
    for(int i=0; i<Period; i++)
    {
        for(int j=0; j<FieldNum; j++)
        {
            value[i][j] += result[i][j];
        }
    }
}

 

'Programs' 카테고리의 다른 글

ModelEV.cpp  (2) 2014.08.14
GrpKeyTable.cpp  (0) 2014.08.14
FieldInfoSet.cpp  (0) 2014.08.14
Inc.hpp  (0) 2014.08.14
Group.cpp  (0) 2014.08.14
Posted by Analytical Warrior
|

FieldInfoSet.cpp

Programs 2014. 8. 14. 20:16

#include "Inc.hpp"

//----------------------------------------------------------------
//FieldInfoSet 클래스 함수들
//----------------------------------------------------------------

FieldInfoSet::FieldInfoSet()
{
    FieldNumTot = 0;
    FieldNumOrg = 0;
    FieldNumGrp = 0;
    FieldNumCur = 0;
    FieldNumMax = 500;

    FieldName  = new char*  [FieldNumMax];
    OrgWriteYN = new bool   [FieldNumMax];
    GrpWriteYN = new bool   [FieldNumMax];
    CalcYN     = new bool   [FieldNumMax];
    MappingOrg = new long   [FieldNumMax];
    MappingGrp = new long   [FieldNumMax];
    MappingCur = new long   [FieldNumMax];

    for (int j=0; j<FieldNumMax; j++)
    {
        FieldName[j]  = new char[50]; strcpy(FieldName[j],  "");
        OrgWriteYN[j] = false;
        GrpWriteYN[j] = false;
        CalcYN[j]     = false;
        MappingOrg[j] = 999;
        MappingGrp[j] = 999;
        MappingCur[j] = 999;
    }

    return;                           
}

FieldInfoSet::~FieldInfoSet()
{
    for (int j=0; j<FieldNumMax; j++)
    {
        delete [] FieldName[j];
    }

    delete [] FieldName;
    delete [] OrgWriteYN;
    delete [] GrpWriteYN;
    delete [] CalcYN;
    delete [] MappingOrg;
    delete [] MappingGrp;
    delete [] MappingCur;

    return;                           
}


void FieldInfoSet::Init(char* path_label, char* grptype)
{
    char rec[1000];
    char imsi[1000];
    long i; long nlen; long slen; long elen;
    char* pch;

    strcpy(this->GrpType, grptype);

    //필드목록 open
    OUTLABEL.open(path_label, ifstream::in);
    if (OUTLABEL==NULL)
    {
        gLogFile << "Error : Label File missing !!!  : " << path_label << endl;
        cout     << "Error : Label File missing !!!  : " << path_label << endl;
        system("PAUSE"); exit(0);
    }

    //필드목록을 읽어들여 필드목록 배열에 저장
    while(1)
    {
        OUTLABEL.getline(rec,100,'\n');

        if (OUTLABEL.eof()==true) break;
        if (strlen(rec)==0)       break;
       
        //trim 작업
        nlen = strlen(rec);
        for (i=0; i<nlen; i++)
        {
            if (rec[i]!=' ' && rec[i]!='\t')
            {
                slen = i;
                break;
            }
        }
        for (i=nlen-1; i>=0; i--)
        {
            if (rec[i]!=' ' && rec[i]!='\t')
            {
                elen = i;
                rec[elen+1] = '\0';
                break;
            }
        }

        strcpy(imsi, &rec[slen]);
        strcpy(FieldName[FieldNumTot],imsi);
       
        OrgWriteYN[FieldNumTot] = true;
        MappingOrg[FieldNumTot] = FieldNumTot;

        if (imsi[0]=='*')
        {
            strcpy(FieldName[FieldNumTot],&imsi[1]);
            GrpWriteYN[FieldNumTot] = true;
            MappingGrp[FieldNumGrp] = FieldNumTot;
           
            FieldNumGrp ++;
        }

        //레이블이 겹치면 레이블에 "_DUP?" 을 덧붙여줌
        for (int i=0; i<FieldNumOrg-1; i++)
        {
            if (strcmp(FieldName[FieldNumTot], FieldName[i])==0)
            {
                strcat(FieldName[FieldNumTot],"_DUP?");
                break;
            }
        }
       
        FieldNumTot ++;
        FieldNumOrg ++;
    }

 OUTLABEL.close();
 
    //결과 그룹핑 타입이 "EV"인 경우는 summary 출력파일의 필드 갯수, 필드 이름등 Hard coding 
 this->HardCoding();

    return;
}

void FieldInfoSet::CurFile(char* rec)
{
    char buffer[100], fieldname[FieldNumMax][50];
    long mm,nn=0;
    char* pch;
    FieldNumCur = 0;
    for (int j=0; j<FieldNumMax; j++) {strcpy(fieldname[j], "");}
 
    for (mm=0; mm<1000; mm++){ if (rec[mm] == '"') break; }
    pch = strtok(&rec[mm], "\"");
    strcpy(fieldname[0], pch);
               
    for (int m=1; m<FieldNumMax; m++)
    {
        pch = strtok(NULL, "\""); if (pch==0) break;
        pch = strtok(NULL, "\"");
        strcpy(fieldname[m], pch);
    }
               
    //동일한 필드명이 존재할 때, 일련번호를 추가해 줌
    nn=0;
    for (int m=0; m<FieldNumMax-1; m++)
    {
        if (strcmp(fieldname[m], fieldname[m+1])==0)
        {
            if (nn>0 && strcmp(fieldname[m], "")!=0) 
            {
                itoa(nn,buffer,10);
                strcat(fieldname[m-1], "_");
                strcat(fieldname[m-1], buffer);
            }

            nn++;
        }
        else
        {
            if (nn>0 && strcmp(fieldname[m], "")!=0)
            {
                itoa(nn,buffer,10);
                strcat(fieldname[m-1], "_");
                strcat(fieldname[m-1], buffer);

                itoa(nn+1,buffer,10);
                strcat(fieldname[m], "_");
                strcat(fieldname[m], buffer);
            }

            nn=0;
        }

        if (m>0 && strcmp(fieldname[m], "")==0) break;
        FieldNumCur++;
    } //for (int m=0; m<FieldMaxNum-1; m++)

    //읽어들인 필드별로 출력파일의 동일필드 순번 매칭
    for (int m=0; m<FieldNumCur; m++)
    {
        for (int j=0; j<FieldNumTot; j++)
        {
            if (strcmp(fieldname[m], FieldName[j])==0)
            {
                MappingCur[m] = j;
                break;
            }
        }
    }
    return;
}


void FieldInfoSet::HardCoding()
{
    if (strcmp(GrpType, "EV")!=0) return; //결과 그룹핑 타입이 "EV"가 아닌 경우는 그냥 pass

    //Label에서 얻은 필드정보 수정
    for (int i=0; i<FieldNumOrg; i++)
    {
        GrpWriteYN[i] = false;
        CalcYN[i]     = false;
    }

    //Label에서 얻은 필드정보 수정
    for (int i=0; i<FieldNumGrp; i++)
    {
        MappingGrp[i] = 999;
    }

    //필드정보 수정 다시 입력
    this->FieldNumGrp = 117;               
    this->FieldNumTot = FieldNumOrg + FieldNumGrp;

    for (int i=0; i<FieldNumGrp; i++)
    {
        GrpWriteYN[FieldNumOrg+i] = true;
        CalcYN[FieldNumOrg+i]     = true;
        MappingGrp[i]             = FieldNumOrg+i;
    }
   
    long mm = FieldNumOrg;
    strcpy(FieldName[mm], "gen_prem"); mm++;
    strcpy(FieldName[mm], "tot_ben"); mm++;
    strcpy(FieldName[mm], "tot_exp"); mm++;
    strcpy(FieldName[mm], "etc_inc"); mm++;
    strcpy(FieldName[mm], "etc_out"); mm++;
    strcpy(FieldName[mm], "o_taxbl_inc"); mm++;
    strcpy(FieldName[mm], "res_inc"); mm++;
    strcpy(FieldName[mm], "gyelsan"); mm++;
    strcpy(FieldName[mm], "ewon"); mm++;
    strcpy(FieldName[mm], "e_cha "); mm++;
    strcpy(FieldName[mm], "o_taxbl_inc"); mm++;
    strcpy(FieldName[mm], "cred_need"); mm++;
    strcpy(FieldName[mm], "b_cha "); mm++;
    strcpy(FieldName[mm], "alpha_load_if"); mm++;
    strcpy(FieldName[mm], "beta_load_if"); mm++;
    strcpy(FieldName[mm], "gamma_load_if"); mm++;
    strcpy(FieldName[mm], "tot_alpha_exp"); mm++;
    strcpy(FieldName[mm], "tot_beta_exp"); mm++;
    strcpy(FieldName[mm], "tot_gamma_exp"); mm++;
    strcpy(FieldName[mm], "dac_diff_inc"); mm++;
    strcpy(FieldName[mm], "sa_cha "); mm++;
    strcpy(FieldName[mm], "risk_prem_sb_if"); mm++;
    strcpy(FieldName[mm], "sa_outgo"); mm++;
    strcpy(FieldName[mm], "etc_cha "); mm++;
    strcpy(FieldName[mm], "fmf_inc"); mm++;
    strcpy(FieldName[mm], "fmf_out"); mm++;
    strcpy(FieldName[mm], "other_exp"); mm++;
    strcpy(FieldName[mm], "diff"); mm++;
    strcpy(FieldName[mm], "s_gyelsan"); mm++;
    strcpy(FieldName[mm], "s_ewon"); mm++;
    strcpy(FieldName[mm], "s_e_cha"); mm++;
    strcpy(FieldName[mm], "s_b_cha"); mm++;
    strcpy(FieldName[mm], "s_sa_cha "); mm++;
    strcpy(FieldName[mm], "s_etc_cha "); mm++;
    strcpy(FieldName[mm], "prem_1st_m"); mm++;
    strcpy(FieldName[mm], "prem_1st_s"); mm++;
    strcpy(FieldName[mm], "prem_inc"); mm++;
    strcpy(FieldName[mm], "inforcepol"); mm++;
    strcpy(FieldName[mm], "inforcepol_tk"); mm++;
    strcpy(FieldName[mm], "no_new_pols"); mm++;
    strcpy(FieldName[mm], "res_p"); mm++;
    strcpy(FieldName[mm], "res_w"); mm++;
    strcpy(FieldName[mm], "sep_res_p"); mm++;
    strcpy(FieldName[mm], "sep_res_w"); mm++;
    strcpy(FieldName[mm], "gmdb_inc_if"); mm++;
    strcpy(FieldName[mm], "gmab_inc_if"); mm++;
    strcpy(FieldName[mm], "gmdb_incti_if"); mm++;
    strcpy(FieldName[mm], "gmsb_incti_if"); mm++;
    strcpy(FieldName[mm], "gmdb_out_if"); mm++;
    strcpy(FieldName[mm], "gmab_out_if"); mm++;
    strcpy(FieldName[mm], "gmdb_outti_if"); mm++;
    strcpy(FieldName[mm], "gmsb_outti_if"); mm++;
    strcpy(FieldName[mm], "gmdb_res_if"); mm++;
    strcpy(FieldName[mm], "gmab_res_if"); mm++;
    strcpy(FieldName[mm], "gmsb_resti_if"); mm++;
    strcpy(FieldName[mm], "gmdb_resti_if"); mm++;
    strcpy(FieldName[mm], "Commission_Expense_Total"); mm++;
    strcpy(FieldName[mm], "Acquisition_Expense_Total"); mm++;
    strcpy(FieldName[mm], "Maintenance_Expense_Total"); mm++;
    strcpy(FieldName[mm], "Collection_Expense"); mm++;
    strcpy(FieldName[mm], "Other_Expenses"); mm++;
    strcpy(FieldName[mm], "death_risk_prem"); mm++;
    strcpy(FieldName[mm], "disbl_risk_prem"); mm++;
    strcpy(FieldName[mm], "diag_risk_prem"); mm++;
    strcpy(FieldName[mm], "surg_risk_prem"); mm++;
    strcpy(FieldName[mm], "hosp_risk_prem"); mm++;
    strcpy(FieldName[mm], "oth_risk_prem"); mm++;
    strcpy(FieldName[mm], "death_outgo"); mm++;
    strcpy(FieldName[mm], "disbl_outgo"); mm++;
    strcpy(FieldName[mm], "diag_outgo"); mm++;
    strcpy(FieldName[mm], "surg_outgo "); mm++;
    strcpy(FieldName[mm], "hosp_outgo "); mm++;
    strcpy(FieldName[mm], "oth_outgo "); mm++;
    strcpy(FieldName[mm], "std_res_dth"); mm++;
    strcpy(FieldName[mm], "dac_unamort"); mm++;
    strcpy(FieldName[mm], "dac_assd"); mm++;
    strcpy(FieldName[mm], "adj_math_res"); mm++;
    strcpy(FieldName[mm], "prem1yr"); mm++;
    strcpy(FieldName[mm], "mat_outgo"); mm++;
    strcpy(FieldName[mm], "living_Ben_outgo"); mm++;
    strcpy(FieldName[mm], "anuity_outgo"); mm++;
    strcpy(FieldName[mm], "surr_outgo"); mm++;
    strcpy(FieldName[mm], "TransGAtoSA"); mm++;
    strcpy(FieldName[mm], "TransSAtoGA"); mm++;
    strcpy(FieldName[mm], "TransSAtoGASurr"); mm++;
    strcpy(FieldName[mm], "TransSAtoGALiving"); mm++;
    strcpy(FieldName[mm], "TransSAtoGAAnnRes"); mm++;
    strcpy(FieldName[mm], "TransSAtoGADthRes"); mm++;
    strcpy(FieldName[mm], "SA_Par_Dividends"); mm++;
    strcpy(FieldName[mm], "DacAcq_no"); mm++;
    strcpy(FieldName[mm], "DacAcq_prem"); mm++;
    strcpy(FieldName[mm], "NonDacAcq_no"); mm++;
    strcpy(FieldName[mm], "NonDacAcq_prem"); mm++;
    strcpy(FieldName[mm], "Maint_no"); mm++;
    strcpy(FieldName[mm], "Maint_prem"); mm++;
    strcpy(FieldName[mm], "saving_prem_sb_if"); mm++;
    strcpy(FieldName[mm], "saving_prem_ga"); mm++;
    strcpy(FieldName[mm], "saving_prem_sa"); mm++;
    strcpy(FieldName[mm], "rbc_Insurance"); mm++;
    strcpy(FieldName[mm], "rbc_Ins_death"); mm++;
    strcpy(FieldName[mm], "rbc_Ins_Disbl"); mm++;
    strcpy(FieldName[mm], "rbc_Ins_Hosp"); mm++;
    strcpy(FieldName[mm], "rbc_Ins_DiagSurg"); mm++;
    strcpy(FieldName[mm], "rbc_Ins_Silson"); mm++;
    strcpy(FieldName[mm], "rbc_Ins_Oth"); mm++;
    strcpy(FieldName[mm], "rbc_riskprem_silson"); mm++;
    strcpy(FieldName[mm], "rbc_riskprem_oth"); mm++;
    strcpy(FieldName[mm], "rbc_liability"); mm++;
    strcpy(FieldName[mm], "rbc_negativemargin"); mm++;
    strcpy(FieldName[mm], "rbc_gmab"); mm++;
    strcpy(FieldName[mm], "rbc_gmdb_pro"); mm++;
    strcpy(FieldName[mm], "rbc_gmdb_ann"); mm++;
    strcpy(FieldName[mm], "rbc_gmab_min"); mm++;
    strcpy(FieldName[mm], "rbc_gmdb_pro_min"); mm++;
    strcpy(FieldName[mm], "rbc_gmdb_ann_min"); mm++;
    strcpy(FieldName[mm], "gmdb_pro_res_if"); mm++;
    strcpy(FieldName[mm], "gmdb_ann_res_if"); mm++;
   
    return;
}


 

'Programs' 카테고리의 다른 글

ModelEV.cpp  (2) 2014.08.14
GrpKeyTable.cpp  (0) 2014.08.14
ResultUnit.cpp  (0) 2014.08.14
Inc.hpp  (0) 2014.08.14
Group.cpp  (0) 2014.08.14
Posted by Analytical Warrior
|

Inc.hpp

Programs 2014. 8. 14. 20:16

#include <cstdlib>
#include <iostream>
#include <string>
#include <fstream>
#include <vector>
#include "windows.h"

using namespace std;

typedef unsigned short uint;

class value
{
    private:
        double Value;
        bool   YesNo;

    public:
        //value(){Value = 0.0; YesNo = false;}
        value(){YesNo = false;}  //2009.11.3 임대식 수정 - 효률개선을 위해
        ~value(){}
        //void clear(){Value = 0.0; YesNo = false;}
        void clear(){YesNo = false;}  //2009.11.3 임대식 수정 - 효률개선을 위해
        value& operator=(double num){Value = num; YesNo = true; return *this;}
        double Return(){return Value;}
        bool   Existence(){return YesNo;}
};


class column
{
    private:
        value* Value;
        unsigned short period;

    public:
        column(){Value = 0; period = 0;}
        column(unsigned short t){Value = new value [t+1]; period = t;}
        ~column(){if (Value!=0) delete [] Value;}
        void Init(unsigned short t)
        {
            if (Value==0)
            {
                Value = new value [t+1];
                period = t;
            }
            else if (period==t)
            {
                for (int i=0; i<=period; i++)
                    Value[i].clear();
            }
            else
            {
                delete [] Value;
                Value = new value [t+1];
                period = t;
            }
        }
        value&  operator< (unsigned short t){return Value[t];            }
        double  operator()(unsigned short t){return Value[t].Return();   }
        bool    operator* (unsigned short t)
                          {//if (t>period) {SysLog << "column error!!! : " << t <<"/"<< period << endl; t=period;} //디버그용 로직, 실제 실행파일 생서시는 속도를 위해 제거 요망 !!!
                           return Value[t].Existence();}
};


class table
{
    private:
        value** Value;
        unsigned short row;
        unsigned short column;

    public:
        table(){Value = 0; row = 0; column = 0;}
        table(unsigned short r, unsigned short c)
        {
            this->open(r, c);
        }
        ~table()
        {
            this->close();
        }
       
        void Init(unsigned short r, unsigned short c)
        {
            if (Value==0)
            {
                this->open(r, c);
            }
            else if (r==row && c==column && (r+c)>0)
            {
                for (int i=0; i<=column; i++)
                {
                    for (int j=0; j<=row; j++)
                    {
                        Value[i][j].clear();
                    }
                }
            }
            else
            {
                this->close();
                this->open(r, c);
            }
        }
        void open(unsigned short r, unsigned short c)
        {
            this->row    = r;
            this->column = c;
           
            Value = new value* [c+1];
           
            for (int i=0; i<=c; i++)
            {
                Value[i] = new value [r+1];
            }
        }
        void close()
        {
            if (row==0 && column==0) return;
           
            for (int i=0; i<=column; i++)
            {
                if (Value[i]!=0) delete [] Value[i];
                Value[i] = 0;
            }
   
            if (Value!=0) delete [] Value;

            Value  = 0;
            row    = 0;
            column = 0;
        }
        double operator()(unsigned short r, unsigned short c) {return Value[c-1][r].Return();   }
        value& addr      (unsigned short r, unsigned short c) {return Value[c-1][r];            }
        bool   be        (unsigned short r, unsigned short c)
                         {//if (r>row || c>column)  //디버그용 로직, 실제 실행파일 생서시는 속도를 위해 제거 요망 !!!
                          //   {SysLog << "table error!!! : " << r <<"/"<< row << " : " << c << "/" << column << endl; r=row; c=column;}
                             return Value[c-1][r].Existence();   }
};


class FieldInfoSet
{
    private:
        char**   FieldName;       //필드명
        bool*    OrgWriteYN;      //원본 출력파일에 해당필드 출력 여부
        bool*    GrpWriteYN;      //Summary 출력파일에 해당필드 출력 여부
        bool*    CalcYN;          //필드끼리 연산을 통해 생성된 필드인지 여부
       
        long     FieldNumTot;     //총 필드 갯수(연산 필드 포함)
        long     FieldNumOrg;     //원본 출력파일의 총 필드 갯수, 원본 파일은 연산 필드를 포함하지 않고, 전체 필드를 모두 저장
        long     FieldNumGrp;     //Summary 출력파일의  총 필드 갯수, Summary 파일은 연산 필드를 포함하되 출력대상 필드만 저장
        long     FieldNumCur;     //현재 읽은 파일의 총 필드 갯수
        long     FieldNumMax;     //처리가능 필드 최대 허용 갯수

        long*    MappingOrg;      //원본 출력파일의 출력필드 순서 매핑, 핊드정보에서 3번째 필드가 출력파일의 첫번째 필드일 경우, OrgMapping[1-1] = 3-1
        long*    MappingGrp;      //Summary 출력파일의 출력필드 순서 매핑, 핊드정보에서 3번째 필드가 출력파일의 첫번째 필드일 경우, GrpMapping[1-1] = 3-1
        long*    MappingCur;      //현재 읽은 파일의 필드의 정해진 필드순번으로 매핑, 현재 파일의 첫번째 필드가 필드정보에서 3번째 필드일경우, CurMapping[1-1] = 3-1

        ifstream OUTLABEL;        //필드목록 파일

        char     GrpType[30];

    public:
        FieldInfoSet();
        ~FieldInfoSet();
       
        void     Init(char*, char* );     //클래스 초기화 함수, 처리필드목록을 읽고, 필드 정보 추출
        void     CurFile(char*);          //현재 읽은 파일의 필드정보 정리 - 헤더 부분중 필드명 레코드를 입력값을로 받아 필드정보 추출
        void     HardCoding();            //필드정보 수작업 입력
       
        char*    cFieldName(long i) { return FieldName[i];  }
        long     iMappingOrg(long i){ return MappingOrg[i]; }
        long     iMappingGrp(long i){ return MappingGrp[i]; }
        long     iMappingCur(long i){ return MappingCur[i]; }

        long     iFieldNumTot(){ return FieldNumTot; }
        long     iFieldNumOrg(){ return FieldNumOrg; }
        long     iFieldNumGrp(){ return FieldNumGrp; }
        long     iFieldNumCur(){ return FieldNumCur; }
        long     iFieldNumMax(){ return FieldNumMax; }
       
        bool     bCalcYN(long i){ return CalcYN[i];  }
};


class ModelEV
{
    private:
  //시스템변수
        unsigned short ProjPeriod;
        double**       Result_Org_val;
        long           FieldNumOrg;
        char           M_CODE[20];
        char           ALFAKEY2[20];
       
        long index_ACQ1_EXP,index_ACQ13_EXP,index_ACQ14_EXP,index_ACQ2_EXP;
        long index_ACQ3_EXP,index_ACQ4_EXP,index_ACQ5_EXP,index_ACQ8_EXP;
        long index_ADJ_MATH_RES,index_ALPHA_LOAD_IF,index_ALPHA_LOAD_IF_EXP,index_ANUITY_OUTGO;
        long index_BETA_LOAD_IF,index_CASH_PREM,index_COLL1_EXP,index_COLL13_EXP;
        long index_COLL14_EXP,index_COLL3_EXP,index_COLL8_EXP,index_COMM1_EXP,index_COMM124_EXP;
        long index_COMM2_EXP,index_COMM31_EXP,index_COMM32_EXP,index_COMM33_EXP,index_COMM34_EXP;
        long index_COMM4_EXP,index_COMM5_EXP,index_COMM6_EXP,index_COMM71_EXP,index_COMM72_EXP;
        long index_CRED_INT,index_DAC_ASSD,index_DAC_DIFF,index_DAC_UNAMORT,index_DEATH_OUTGO;
        long index_DEATH_RISK_PREM,index_DIAG_OUTGO,index_DIAG_RISK_PREM,index_DISBL_OUTGO;
        long index_DISBL_RISK_PREM,index_FMF_INC,index_FMF_OUT,index_GAMMA_LOAD_IF,index_GMAB_INC_IF;
        long index_GMAB_OUT_IF,index_GMAB_RES,index_GMAB_RES_IF,index_GMDB_INC_IF,index_GMDB_INC2_IF;
        long index_GMDB_INCTI_IF,index_GMDB_OUT_IF,index_GMDB_OUTTI_IF,index_GMDB_RES,index_GMDB_RES_IF;
        long index_GMDB_RESTI,index_GMDB_RESTI_IF,index_GMDB_RISK_IF,index_GMSB_INCTI_IF;
        long index_GMSB_OUTTI_IF,index_GMSB_RESTI,index_GMSB_RESTI_IF,index_GMSB_RISK_IF;
        long index_HOSP_OUTGO,index_HOSP_RISK_PREM,index_INFORCE_PREM,index_INFORCEPOL;
        long index_INFORCEPOL_TK,index_LIVING_OUTGO,index_MAINT1_EXP,index_MAINT13_EXP;
        long index_MAINT14_EXP,index_MAINT15_EXP,index_MAINT16_EXP,index_MAINT3_EXP;
        long index_MAINT4_EXP,index_MAINT5_EXP,index_MAINT8_EXP,index_MAINT9_EXP;
        long index_MAT_OUTGO,index_NO_NEW_POLS,index_NONU_INT,index_O_TAXBL_INC,index_OTH_OUTGO;
        long index_OTH_RISK_PREM,index_OTH_RISK_PREM_RBC,index_OTHER_EXP,index_OTHER1_EXP;
        long index_PART_SURR_OUTGO,index_PREM_1ST_M,index_PREM_1ST_S,index_PREM_INC;
        long index_PREM_INC_DISC,index_PREM_UL_BAL,index_PREM_UL_SUB,index_PREM1YR;
        long index_PRIOR_ADJ_MATH_RES,index_PRIOR_DAC_ASSD,index_PRIOR_DAC_UNAMORT;
        long index_PRIOR_GMAB_RES_IF,index_PRIOR_GMDB_RES_IF,index_PRIOR_GMDB_RESTI_IF;
        long index_PRIOR_GMSB_RESTI_IF,index_PRIOR_PREM_UL_BAL,index_PRIOR_RES_P,index_PRIOR_RES_W;
        long index_RBC_ASSET,index_RBC_ASSET_PRIOR,index_RBC_RISK_A,index_RBC_RISK_A_DEATH;
        long index_RBC_RISK_A_DIAGSURG,index_RBC_RISK_A_DISBL,index_RBC_RISK_A_HOSP;
        long index_RBC_RISK_A_OTH,index_RBC_RISK_A_PR_DEATH,index_RBC_RISK_A_PR_DIAGSURG;
        long index_RBC_RISK_A_PR_DISBL,index_RBC_RISK_A_PR_HOSP,index_RBC_RISK_A_PR_OTH;
        long index_RBC_RISK_A_PR_SILSON,index_RBC_RISK_A_SILSON,index_RBC_RISK_B,index_RBC_RISK_C;
        long index_RBC_RISK_D_ASSET,index_RBC_RISK_D_LIAB,index_RBC_RISK_D_LIAB_PRIOR;
        long index_RBC_RISK_D_MIN,index_RBC_RISK_D_MIN_PRIOR,index_RBC_RISK_D_RASSET,index_RBC_RISK_D_REV;
        long index_RBC_RISK_D_RLIAB,index_RBC_RISK_D_RLIAB_PRIOR,index_RBC_RISK_D_RLIAB_TEMP;
        long index_RBC_RISK_E_GEN,index_RBC_RISK_E_GMAB,index_RBC_RISK_E_GMAB_MIN,index_RBC_RISK_E_GMDB;
        long index_RBC_RISK_E_GMDB_MIN,index_RES_P,index_RES_W,index_RISK_PREM_SB_IF,index_SA_ANNUITY;
        long index_SAVING_PREM_SB_IF,index_SEP_CV_LOAD,index_SEP_LIVING_OUTGO,index_SEP_NET_LOAD;
        long index_SEP_PART_SURR_OUTGO,index_SEP_PREM_1ST_M,index_SEP_PREM_1ST_S,index_SEP_PREM_INFORCE;
        long index_SEP_PREM_UL_BAL,index_SEP_PREM_UL_SUB,index_SEP_PRIOR_PREM_UL_BAL,index_SEP_PRIOR_RES_P;
        long index_SEP_PRIOR_RES_W,index_SEP_PU_BETA_LOAD,index_SEP_PW_DIFF,index_SEP_RES_DTH;
        long index_SEP_RES_P,index_SEP_RES_W,index_SEP_RISK_PREM,index_SEP_SAVE_PREM,index_SEP_SURR_OUTGO;
        long index_SILSON_OUTGO,index_SILSON_RISK_PREM_RBC,index_STD_RES_DTH,index_SUDANG;
        long index_SUM_ASSD_IF,index_SURG_OUTGO,index_SURG_RISK_PREM,index_SURR_OUTGO,index_TOT_ALPHA_EXP;
        long index_TOT_BEN_OUTGO,index_TOT_BETA_EXP,index_TOT_GAMMA_EXP,index_WAIVER_PREM_IF;

       
        //사용자 정의 항목 - 개체 (값과 계산로직)
        //컬럼
        column vGEN_PREM; double fGEN_PREM(unsigned short);
        column vRISK_PREM_SB_IF; double fRISK_PREM_SB_IF(unsigned short);
        //테이블
        table  vRESULT_ORG; double fRESULT_ORG(unsigned short, unsigned short);

    public:
        ModelEV();
        ~ModelEV();
        void Init(long, FieldInfoSet*);
        void StartUp(double** result, FieldInfoSet* fieldinfo, char* mcode, char* alfakey2);
      

        //사용자 정의 항목 - 인터페이스용 함수
        //컬럼
        double GEN_PREM(unsigned short t){if (vGEN_PREM*t==false) vGEN_PREM<t = fGEN_PREM(t); return vGEN_PREM(t);}
        double RISK_PREM_SB_IF(unsigned short t){if (vRISK_PREM_SB_IF*t==false) vRISK_PREM_SB_IF<t = fRISK_PREM_SB_IF(t); return vRISK_PREM_SB_IF(t);}
        //테이블
        double RESULT_ORG(unsigned short r,unsigned short c){if (vRESULT_ORG.be(r,c)==false) vRESULT_ORG.addr(r,c)=fRESULT_ORG(r,c);return vRESULT_ORG(r,c);}
        //함수
        double RESULT(unsigned short r,unsigned short c);

};


class ResultUnit
{
    private:
        long   Period;
        short  FieldNum;

    public:
        ~ResultUnit  ();
        void Init    (long period, long fieldnum, short keynum, char**);
        void Save    (double** result);
        bool GroupCmp(char** key);

        short    KeyNum;
        char**   Key;
        double** value;
};

class GrpKeyTable
{
    private:
        ifstream KeyList;      //그룹핑키 목록 파일
        short    KeyListNum;
        char**   Product;
        long*    Spcode;
        char***  Key;
        char**   KeyError;
       
    public:
        short    KeyFieldNum;
        char**   KeyLabel;

        void     Init(char*);
        char**   KeySearch(char*, long);
        char*    KeySearch(char*, long, char*);

        ~GrpKeyTable();
};

class Group
{
    private:

        char path_label[500];
        char path_ofile[500];
        char path_ofile_grp[500];
        char path_ofile_sub[500];

        ifstream OUTLABEL;      //필드목록 파일
        ofstream OutputFile;    //출력 파일
        ofstream OutputFileGrp; //출력 파일(그룹핑 파일)

        long     FieldTotNum;   //총 필드 갯수 (LABEL에 적힌 필드와 연산필드를 합한 갯수  
        long     FieldORGNum;   //출력대상 총 필드 갯수(LABEL에 적힌 필드갯수)
        long     FieldMaxNum;   //허용가능 총 필드 갯수
        long     FieldGrpNum;   //Summary 출력대상 필드 갯수
       
        long     MT_MaxPeriod;
        short    MT_CurrentArray; 
        char     MT_Result_prod[3][20];
        long     MT_Result_spcode[3];
        long     MT_Result_period[3];
        double** MT_Result_val[3];
        long     MT_GrpNum;
        long     MT_GrpKeyIndex[10000];
        char     MT_path[500];
        char     MT_product[20];
        long     MT_spcode;
        long     MT_period;
        double** Result_Grp_val;
        char     GrpType[30];

        vector<ResultUnit*> RUnit;

        GrpKeyTable  GrpKey;
        FieldInfoSet FieldInfo;
        ModelEV      MDEV;
       
    public:
        Group(){return;}  
        ~Group();

        void  Init(char*, char*, char*, long, char*);   //클래스 초기화 함수, 처리필드목록을 읽고, 출력파일,로그파일 open
        void  MT_Read    (short currentarray);
        void  MT_WriteOrg(short currentarray);
        void  MT_CalcGrp (short currentarray, char* mcode, char* alfakey2);
        void  MT_SaveGrp (short currentarray);
        void  MT_WriteGrp();
        void  MT_WriteGrp(short keyindex);
        void  MT_Setting (char* path, char* product, long spcode);
 
        short CurrentArray(){ return MT_CurrentArray; }
        char* path()        { return MT_path;         }
        char* product()     { return MT_product;      }
        long  spcode()      { return MT_spcode;       }

        long  FileNum;       //현재처리중인 파일의 순번
        long  MergeNum;      //실제로 누적을 실행한 파일 갯수(결과파일 missing건 제외)

        void  Arraysetting(short ca){ MT_CurrentArray = ca; return; }
};

void MT_Main(bool eof, char* path, char* product, char* spcode);  

extern Group    group;        //전역변수
extern ofstream gLogFile;     //전역변수

 

 

 

 

'Programs' 카테고리의 다른 글

ModelEV.cpp  (2) 2014.08.14
GrpKeyTable.cpp  (0) 2014.08.14
ResultUnit.cpp  (0) 2014.08.14
FieldInfoSet.cpp  (0) 2014.08.14
Group.cpp  (0) 2014.08.14
Posted by Analytical Warrior
|

Group.cpp

Programs 2014. 8. 14. 20:12

#include "Inc.hpp"

//클래스 초기화 함수, 처리필드목록을 읽고, 출력파일,로그파일 open
//필드목록 위치와  출력파일 위치를 매개변수로 하여 클래스 초기화
void Group::Init(char* path_label, char* path_key, char* path_out, long MaxPeriod, char* grptype)
{
    //각종 클래스변수 초기화
    strcpy(this->path_label,     path_label);
    strcpy(this->path_ofile    , path_out);   strcat(this->path_ofile,         ".TXT");
    strcpy(this->path_ofile_grp, path_out);   strcat(this->path_ofile_grp, "_grp.TXT");
    strcpy(this->path_ofile_sub, path_out);   strcat(this->path_ofile_sub, "_grp_key");
    strcpy(this->GrpType, grptype);

    FieldInfo.Init(path_label, GrpType);

    this->MT_MaxPeriod    = MaxPeriod;
    this->MT_CurrentArray = 0; 
    this->FieldMaxNum     = FieldInfo.iFieldNumMax();   //필드갯수 상한은 500개!!!
    this->FileNum         = 0;
    this->MergeNum        = 0;
    this->FieldTotNum     = FieldInfo.iFieldNumTot();
    this->FieldORGNum     = FieldInfo.iFieldNumOrg();
    this->FieldGrpNum     = FieldInfo.iFieldNumGrp();
    this->MT_GrpNum       = 0;
    for (int i=0; i<10000; i++) this->MT_GrpKeyIndex[i] = 0;

    //출력파일 open
    OutputFile.open(path_ofile, ofstream::out | ofstream::trunc);
    if (OutputFile==NULL)
    {
        gLogFile << "Error : Out File missing !!! : " << path_ofile << endl;
        cout     << "Error : Out File missing !!! : " << path_ofile << endl;
        system("PAUSE"); exit(0);
    }

    //결과파일 첫행에 필드 레이블 출력
    OutputFile  << "product" << "," << "spcode" << "," << "month";
    for (int j=0; j<FieldORGNum; j++)
    {
        OutputFile    << "," << FieldInfo.cFieldName(j);
    }
    OutputFile    << endl;

    //결과파일 저장용 배열 초기화
    for(int i=0; i<3; i++)
    {
        MT_Result_val[i] = new double* [MT_MaxPeriod];

        for(int j=0; j<MT_MaxPeriod; j++)
        {
            MT_Result_val[i][j] = new double [FieldORGNum];

            for(int k=0; k<FieldORGNum; k++)
            {
               MT_Result_val[i][j][k] = 0.0;
            }
        }
    }

    //Summary 결과파일 저장용 배열 초기화
    Result_Grp_val = new double* [MT_MaxPeriod];
    for (int i=0; i<MT_MaxPeriod; i++)
    {
        Result_Grp_val[i] = new double [FieldGrpNum];
        for (int j=0; j<FieldGrpNum; j++)
        {
            Result_Grp_val[i][j] = 0.0;
        }
    }
       
    this->GrpKey.Init(path_key);
    this->MDEV.Init(MT_MaxPeriod, &FieldInfo);
   
    return;
}

//클래스 종료
//로그파일, 출력파일을 닫고, 각종 배열 반환
Group::~Group()
{
 OutputFile.close();
}


//Group 클래스내 결과파일 읽어들이는 함수
//처리대상파일을 읽어 들여 필드순서를 정렬하에 어레이에 저장
//매개변수는 멀티쓰레딩을 위해 어느 어레이에 저장할지를 지정하는 어레이번호
void Group::MT_Read(short currentarray)
{
    short CA = currentarray; 
    strcpy(MT_Result_prod[CA], MT_product);
    MT_Result_spcode[CA] = MT_spcode;

    //결과값 저장용 배열 초기화
    for(int j=0; j<MT_MaxPeriod; j++)
    {
        for(int k=0; k<FieldORGNum; k++)
        {
           MT_Result_val[CA][j][k] = 0.0;
        }
    }

    FileNum++;
    cout    << FileNum << " : " << MT_path << " : " << MT_product << " : " << MT_spcode << endl;

    //처리대상파일의 레코드길이 상한은 5000바이트!!!
    char rec[5000], buffer[100], fieldname[FieldMaxNum][50];
    long i,k, mon=0, m,n=0;
    bool DataYN = false;
    char* pch;
    char imsi[5000]="";

    //처리대상파일 open
    ifstream InputFile;
    InputFile.open(MT_path, ifstream::in);
   
    if (InputFile==NULL)
    {
        gLogFile << "Error : Result File missing !!! : " << MT_path << endl;
        cout     << "Error : Result File missing !!! : " << MT_path << endl;
        return;
    }

    MergeNum++;  //결과파일을 성공적으로 읽었을 때만 카운트 실시
   
    //처리대상파일을 읽어 필드순서를 정렬하여 출력파일에 저장
    //처리대상파일의 필드명 부분과 DATA 시작부분 인식이 필요
    //레코드값이 '!' 인 레코드의 다음 레코드가 필드명
    //레코드값이 '*' 인 레코드의 다음 레코드가 DATA 시작
    //FieldNum = 0; i=0; k=0; n=0; mon = 0;
    i=0; k=0; n=0; mon = 0;
    while(1)
    {
        InputFile.getline(rec,5000,'\n');
        if (InputFile.eof()==true) break;
        i++;
       
        if (DataYN==false)
        {
            if (strcmp(rec, "\"*\"")==0) //데이터 시작 부분 인식
            {
                DataYN = true;
                InputFile.getline(rec,5000,'\n');
                if (InputFile.eof()==true) break;
                i++;
            }
            else if (strcmp(rec, "\"!\"")==0) //필드명 읽기
            {
                InputFile.getline(rec,5000,'\n');
                FieldInfo.CurFile(rec);

            }//if (strcmp(rec, "!")==0) //필드명 읽기

            if (DataYN==false) continue;
        } //if (DataYN==false)

        for (int j=0; j<FieldInfo.iFieldNumCur(); j++)
        {
            if (j==0) pch = strtok(rec, ",");   
            else      pch = strtok(NULL,","); 
           
            if (FieldInfo.iMappingCur(j)<FieldORGNum) MT_Result_val[CA][mon][FieldInfo.iMappingCur(j)] = atof(pch); //필드순서를 조정하여 필드값 배열에 저장 
        }

        mon++;
        if (mon>=MT_MaxPeriod) break;

    }
    
 InputFile.close();
 MT_Result_period[CA] = mon;

    return;
}

//Group 클래스내 결과파일 누적저장하는 함수
//필드순서가 정렬되어 저장된 어레이를 텍스트 파일로 출력
void Group::MT_WriteOrg(short currentarray)
{
    char  buffer[100];
    short CA = currentarray;
    short period = MT_Result_period[CA]; if (period>MT_MaxPeriod) period = MT_MaxPeriod;

    for (int i=0; i<period; i++)
    {
        OutputFile << MT_Result_prod[CA] << "," << MT_Result_spcode[CA] << "," << i;

        for (int j=0; j<FieldORGNum; j++)
        {
            gcvt(MT_Result_val[CA][i][j],20,buffer);
            OutputFile << "," << buffer;
        }

        OutputFile << endl;
    }

    return;
}


//Group 클래스내 결과파일 그룹핑하는 함수
//키별로 누적하여 메모리에 저장
//기존에 동일키가 저장되어 있으면 누적하고
//동일키가 없으면 새로이 메모리를 할당하여 저장
void Group::MT_SaveGrp(short currentarray)
{
    short  CA       = currentarray;
    char   prod[20]; strcpy(prod, MT_Result_prod[CA]);
    long   spcode   = MT_Result_spcode[CA];
    char** key      = GrpKey.KeySearch(prod,spcode);
    char*  mcode    = GrpKey.KeySearch(prod,spcode,"M_CODE");
    char*  alfakey2 = GrpKey.KeySearch(prod,spcode,"ALFAKEY2");

    this->MT_CalcGrp(CA,mcode,alfakey2);
   
    //동일키가 있는지 확인해서 누적
    for (int i=0; i<MT_GrpNum; i++)
    {
        if (RUnit[i]->GroupCmp(key)==true)
        {
            RUnit[i]->Save(Result_Grp_val);

            return;
        }
    }

    //동일키가 없으면 새로운 저장소 추가
    ResultUnit* imsi; imsi = new ResultUnit;
    RUnit.push_back(imsi);
    MT_GrpNum++;

    RUnit[MT_GrpNum-1]->Init(MT_MaxPeriod, FieldGrpNum, GrpKey.KeyFieldNum, key);
    RUnit[MT_GrpNum-1]->Save(Result_Grp_val);

    return;
}

//Group 클래스내 그룹핑 결과를 텍스트파일로 저장하는 함수
void Group::MT_WriteGrp()
{
    //그룹핑 출력파일 open
    OutputFileGrp.open(path_ofile_grp, ofstream::out | ofstream::trunc);
    if (OutputFileGrp==NULL)
    {
        gLogFile << "Error : Out File missing !!! : " << path_ofile_grp << endl;
        cout     << "Error : Out File missing !!! : " << path_ofile_grp << endl;
        system("PAUSE"); exit(0);
    }

    //long fieldnum = FieldInfo.iFieldNumGrp();
    long index = 0;
   
    //결과파일 첫행에 필드 레이블 출력 - Key 부분
    for (int i=0; i<GrpKey.KeyFieldNum; i++)
    {
        OutputFileGrp << GrpKey.KeyLabel[i] << ",";
    }

    OutputFileGrp << "month";

    for (int j=0; j<FieldGrpNum; j++)
    {
        index = FieldInfo.iMappingGrp(j);
        OutputFileGrp << "," << FieldInfo.cFieldName(index);
    }
    OutputFileGrp << endl;
   
    char buffer[100];

    //그룹핑별로 키값 및 누계값 출력
    for (int i=0; i<MT_GrpNum; i++)
    {
        for (int j=0; j<MT_MaxPeriod; j++)    //키값 출력
        {
            for (int k=0; k<RUnit[i]->KeyNum; k++)
            {
                OutputFileGrp << RUnit[i]->Key[k] << ",";
            }

            OutputFileGrp << j;               //해당월(회차)값 출력

            for (int k=0; k<FieldGrpNum; k++)    //누적값 출력
            {
                gcvt(RUnit[i]->value[j][k],20,buffer);
                OutputFileGrp << "," << buffer;
            }

            OutputFileGrp << endl;
        }
    }

 OutputFileGrp.close();

    //그룹핑키별 추가 그룹핑 결과 출력
    for (int k=0; k<RUnit[0]->KeyNum; k++)
    {
        this->MT_WriteGrp(k);
    }

    return;
}

//그룹핑키별 추가 그룹핑 결과를 텍스트파일로 저장하는 함수
void Group::MT_WriteGrp(short keyindex)
{
    long   GrpNumSub = 0;
    long   index     = 0;
    bool   samekeyyn = false;
    char** key; key = new char * [1]; key[0] = new char [30];

    vector<ResultUnit*> RUnitSub;

    //결과값을 해당키별로 다시 Summary
    for (int i=0; i<MT_GrpNum; i++)
    {
        strcpy(key[0], RUnit[i]->Key[keyindex]);
        samekeyyn = false;

        //동일키가 있는지 확인해서 누적
        for (int j=0; j<GrpNumSub; j++)
        {
            if (strcmp(RUnit[j]->Key[keyindex], key[0])==0)
            {
                RUnitSub[j]->Save(RUnit[i]->value);
                samekeyyn = true;
                break;
            }
        }

        //동일키가 없으면 새로운 저장소 추가
        if (samekeyyn==false)
        {
            ResultUnit* imsi; imsi = new ResultUnit;
            RUnitSub.push_back(imsi);
            GrpNumSub++;
            RUnitSub[GrpNumSub-1]->Init(MT_MaxPeriod, FieldGrpNum, (short)1, key);
            RUnitSub[GrpNumSub-1]->Save(RUnit[i]->value);
        }
    }//for (int i=0; i<MT_GrpNum; i++)  

    //그룹핑 출력파일 open
    char path[500] = ""; char buffer[100] = "";
    strcpy(path, path_ofile_sub); itoa(keyindex+1,buffer,10); strcat(path, buffer); strcat(path, ".TXT");
   
    OutputFileGrp.open(path, ofstream::out | ofstream::trunc);
    if (OutputFileGrp==NULL)
    {
        gLogFile << "Error : Out File missing !!! : " << path << endl;
        cout     << "Error : Out File missing !!! : " << path << endl;
        system("PAUSE"); exit(0);
    }
   
    //결과파일 첫행에 필드 레이블 출력 - Key 부분
    OutputFileGrp << GrpKey.KeyLabel[keyindex] << ",";
    OutputFileGrp << "month";

    //결과파일 첫행에 필드 레이블 출력 - 값 부분
    for (int j=0; j<FieldGrpNum; j++)
    {
        index = FieldInfo.iMappingGrp(j);
        OutputFileGrp << "," << FieldInfo.cFieldName(index);
    }
    OutputFileGrp << endl;

    //그룹핑별로 키값 및 누계값 출력
    for (int i=0; i<GrpNumSub; i++)
    {
        for (int j=0; j<MT_MaxPeriod; j++)    //키값 출력
        {
            OutputFileGrp << RUnitSub[i]->Key[0] << ",";
            OutputFileGrp << j;               //해당월(회차)값 출력

            for (int k=0; k<FieldGrpNum; k++)    //누적값 출력
            {
                gcvt(RUnitSub[i]->value[j][k],20,buffer);
                OutputFileGrp << "," << buffer;
            }

            OutputFileGrp << endl;
        }
    }

 OutputFileGrp.close();

    delete [] key[0];
    delete [] key;

    return;
}

void Group::MT_Setting(char* path, char* product, long spcode)
{
    strcpy(this->MT_path,    path);
    strcpy(this->MT_product, product);
    this->MT_spcode = spcode;
 
    return;
}

//Group 클래스내 결과필드끼리 연산을 수행하는 함수 
//연산 수행후 저장값만 지정된 배열에 저장
void Group::MT_CalcGrp(short currentarray, char* mcode, char* alfakey2)
{
    short CA    = currentarray;
    long  index = 0;

    //결과 그룹핑 타입이 "EV"가 아닌 경우, 필드연산 없이 출력대상 필드만 순서를 조정하여 저장
    if (strcmp(GrpType, "EV")!=0)
    {
        for(int j=0; j<FieldGrpNum; j++)
        {
            index = FieldInfo.iMappingGrp(j);
            for(int i=0; i<MT_MaxPeriod; i++) Result_Grp_val[i][j] = MT_Result_val[CA][i][index];
        }

        return;
    }

    //결과 그룹핑 타입이 "EV"인 경우 ModelEV 클래스를 이용해 필드 연산 수행 
    if (strcmp(GrpType, "EV")==0)
    {
        MDEV.StartUp(MT_Result_val[CA], &FieldInfo, mcode, alfakey2);

        for (int i=0; i<MT_MaxPeriod; i++)
        {
            //여기에 필드연산함수와 저장배열을 순서대로 연결할것!!!
            Result_Grp_val[i][ 0] = MDEV.GEN_PREM(i);
            Result_Grp_val[i][21] = MDEV.RISK_PREM_SB_IF(i);
        }

        return;
    }

    return;
}

'Programs' 카테고리의 다른 글

ModelEV.cpp  (2) 2014.08.14
GrpKeyTable.cpp  (0) 2014.08.14
ResultUnit.cpp  (0) 2014.08.14
FieldInfoSet.cpp  (0) 2014.08.14
Inc.hpp  (0) 2014.08.14
Posted by Analytical Warrior
|