Description
Simple check of tree reduction in SCENRED-2 We first check that the obvious reduction is taken, first when the node to be removed has nonzero random values and then all the cases where one of the values is zero. Contributor: Steve Dirkse
Small Model of Type : GAMS
Category : GAMS Test library
Main file : scnred02.gms
$TITLE Scenred2 test - tree reduction and zero values (SCNRED02,SEQ=434)
$Ontext
Simple check of tree reduction in SCENRED-2
We first check that the obvious reduction is taken, first when
the node to be removed has nonzero random values and then all the cases where
one of the values is zero.
Contributor: Steve Dirkse
$Offtext
sets
g 'goods' / g1, g2 /,
n 'nodes' /
n0 'root - stage 1',
(n1*n5) 'stage 2'
/
stage2(n) / (n1*n5) /,
ancestor(n,n) 'input to scenred, in (child,parent) order'
newAncestor(n,n) 'output from scenred'
wantAnc(n,n) 'expected new tree' /
(n1*n4).n0
/
ancDiff(n,n)
;
alias (n,n2);
parameters
prob(n) node probabilities /
n0 1
(n1*n4) 0.24
n5 0.04
/
newProb(n) 'node probabilities output from scenred'
pErr(n) 'probability wanted - got'
rData(g,n) 'random data' /
g1.(n1,n2) .1
g1.(n3,n4) 5
g2.(n1,n3) .1
g2.(n2,n4) 5
g1.n5 0
g2.n5 5
/
;
ancestor(stage2(n),'n0') = yes;
* LOAD SCENRED SYMBOLS *
$set sr2prefix scnred02
$libinclude scenred2
* SCENRED2 METHOD CHOICE *
scenRedParms('reduction_method') = 1;
scenRedParms('red_num_leaves') = 4;
scalar tiny / 1e-3 /;
* test one: add node with parms [tiny,5], should merge with node n2
rData('g1','n5') = tiny;
rData('g2','n5') = 5;
$libinclude runscenred2 %sr2prefix% tree_con n ancestor prob newancestor newprob rData
ancDiff(n,n2) = wantAnc(n,n2) - newAncestor(n,n2);
abort$[card(ancDiff) or (card(wantAnc)-card(newAncestor))] 'bad newAncestor';
pErr(n) = prob(n); pErr('n5') = 0; pErr('n2') = .28;
pErr(n) = abs(pErr(n)-newProb(n));
abort$[smax{n, pErr(n)} > 1e-7] 'bad newProb';
* test two: add node with parms [5,tiny], should merge with node n3
rData('g1','n5') = 5;
rData('g2','n5') = tiny;
$libinclude runscenred2 %sr2prefix% tree_con n ancestor prob newancestor newprob rData
ancDiff(n,n2) = wantAnc(n,n2) - newAncestor(n,n2);
abort$[card(ancDiff) or (card(wantAnc)-card(newAncestor))] 'bad newAncestor';
pErr(n) = prob(n); pErr('n5') = 0; pErr('n3') = .28;
pErr(n) = abs(pErr(n)-newProb(n));
abort$[smax{n, pErr(n)} > 1e-7] 'bad newProb';
* test three: add node with parms [0,5], should merge with node n2
rData('g1','n5') = 0;
rData('g2','n5') = 5;
$libinclude runscenred2 %sr2prefix% tree_con n ancestor prob newancestor newprob rData
ancDiff(n,n2) = wantAnc(n,n2) - newAncestor(n,n2);
abort$[card(ancDiff) or (card(wantAnc)-card(newAncestor))] 'bad newAncestor';
pErr(n) = prob(n); pErr('n5') = 0; pErr('n2') = .28;
pErr(n) = abs(pErr(n)-newProb(n));
abort$[smax{n, pErr(n)} > 1e-7] 'bad newProb';
* test four: add node with parms [5,0], should merge with node n3
rData('g1','n5') = 5;
rData('g2','n5') = 0;
$libinclude runscenred2 %sr2prefix% tree_con n ancestor prob newancestor newprob rData
ancDiff(n,n2) = wantAnc(n,n2) - newAncestor(n,n2);
abort$[card(ancDiff) or (card(wantAnc)-card(newAncestor))] 'bad newAncestor';
pErr(n) = prob(n); pErr('n5') = 0; pErr('n3') = .28;
pErr(n) = abs(pErr(n)-newProb(n));
abort$[smax{n, pErr(n)} > 1e-7] 'bad newProb';