$TITLE SAMBAL PROGRAM $STITLE SAM Balancing Program *=========== 1. Input names of matrix accounts================================== SETS I MATRIX ACCOUNTS /LDO, KDO, LANDO, RP, UP, RR, UR, FIRM, GOV, ROW, BAGR, BIND, BSER, BNTSER, DAGR, DIND, DSER, DNTSER, EAGR, EIND, ESER, ENTSER, ACC, TOT / INT(I) All accounts except total ALIAS(I,J); ALIAS(INT,JNT); INT(I) = YES; INT('TOT') = NO; *============ 2.Input initial matrix =========================================== PARAMETER SAM0(I,J) initial matrix ; $libinclude xlimport SAM0 SAM0.xls A1:X24 *============ 3.Initial matrix values transformed in proportion ================ PARAMETER TOTO initial matrix total ; TOTO = SUM((INT,JNT), SAM0(INT,JNT)); SAM0(INT,JNT) = SAM0(INT,JNT)/TOTO; *============ 4.Matrix of negative defined and negative values transposed======= PARAMETER NEG(I,J) Matrix of negative values; neg(INT,JNT)$(SAM0(INT,JNT) LT 0) =1; SAM0(INT,JNT)$(SAM0(JNT,INT) LT 0)=SAM0(INT,JNT)-SAM0(JNT,INT); SAM0(JNT,INT)$(SAM0(JNT,INT) LT 0)=0; *=========== 5.Non-zero logs parameter ========================================= SCALARS delta Non-zero logs parameter; delta =.0000000000001; *=========== 6.Variable definition ============================================= VARIABLES SAM(I,J) New SAM with transposed negative values OPT Distance variable ; *=========== 7.Equation definition and initialization ========================== EQUATIONS OPTIMIZE Optimization criterion CONSTRAINT(I) Equality between matrix and row sums CONSTRAINT1 Proportions sum equal one ; *Least squares (in percentage form) optimization criterion OPTIMIZE.. OPT =E= SUM((INT,JNT)$SAM0(INT,JNT),(SAM(INT,JNT)/SAM0(INT,JNT)-1)**2); *Entropy optimization criterion *OPTIMIZE.. OPT =E= SUM((INT,JNT)$(SAM0(INT,JNT) NE 0),(SAM(INT,JNT)) * *(LOG(SAM(INT,JNT)+delta)-LOG(SAM0(INT,JNT)+delta))); *Equality between row and column sums CONSTRAINT(INT).. SUM(JNT,SAM(INT,JNT))=E=SUM(JNT,SAM(JNT,INT)); *Proportions sum equal one CONSTRAINT1.. SUM((INT,JNT),SAM(INT,JNT))=E=1 ; *========= 8.Variable initialization============================================ *Cell values between 0 and infinity and empty cells remain empty SAM.L(I,J) = SAM0(I,J); SAM.LO(INT,JNT) = 0 ; SAM.UP(INT,JNT) = +INF ; SAM.FX(INT,JNT)$(NOT SAM0(INT,JNT)) = 0 ; OPT.L = 0; *Fix any variables as desired. However, be careful not to fix too many variables, otherwise the program will not find an optimal solution. *SAM.FX("RP",INT)=SAM0("RP",INT); *SAM.FX("UP",INT)=SAM0("UP",INT); *========== 9.Model solving===================================================== MODEL SAMBAL / ALL /; SAMBAL.workspace = 10; SAMBAL.optfile = 1; *Choose solver OPTION NLP = MINOS5; *OPTION NLP = CONOPT; *OPTION NLP = CONOPT2; OPTION iterlim = 99999; SOLVE SAMBAL USING NLP MINIMIZING OPT; *============ 10.Results copied into new matrix================================= PARAMETER NSAM(I,J) New (balanced) matrix; NSAM(INT,JNT)=SAM.L(INT,JNT); *Negative values retransposed to original position NSAM(INT,JNT)$(NEG(INT,JNT)=1)=-NSAM(JNT,INT); NSAM(JNT,INT)$(NEG(INT,JNT)=1)=0; *Transformation in SAM transaction flow NSAM(INT,JNT) = NSAM(INT,JNT)*TOTO; PARAMETER PROBS(I,J); PROBS(I,J)=0; PROBS(I,J)$(NSAM(I,J) EQ 0 AND SAM0(I,J) NE 0)=SAM0(I,J); DISPLAY PROBS; *Provide name and range of Excel file for exporting new matrix $libinclude xlexport NSAM SAM1.xls A1:X24 *Notes: A file with this name must exist. It will remain intact except the range of the SAM.