39 #define LocalVerbosity(x,s) if (Sh >= 0) {Verbosity(x,s)}
40 #define Intab(x) Indent(x, 0)
44 #define REPORTPROGRESS 4
73 Verbosity(2, fprintf(
Of,
"\n"))
75 Regrow = (
Trial == 0 ||
Now == WINNOWATTS );
150 CaseNo i, Bp, Ep, Missing;
151 CaseCount Cases=0, KnownCases, *BranchCases, MissingCases,
152 *SmallBranches, SmallBranchCases=0,
153 Errs, SaveErrs, TreeErrs, LeafErrs, ExtraLeafErrs=0, BestBrErrs;
154 double Factor, *LocalClassDist;
162 if ( Fp > Lp )
return;
177 Cases += LocalClassDist[c];
179 if ( LocalClassDist[c] > LocalClassDist[BestClass] ) BestClass = c;
186 Cases += LocalClassDist[c];
188 if ( LocalClassDist[c] > LocalClassDist[BestClass] ) BestClass = c;
192 LeafErrs = Cases - LocalClassDist[BestClass];
193 ExtraLeafErrs =
ExtraErrs(Cases, LeafErrs, BestClass);
195 Free(LocalClassDist);
197 if ( (Flags & UPDATE) )
206 Now == SIMPLIFYTREE &&
212 T->
Errors = LeafErrs + ExtraLeafErrs;
214 if ( (Flags & UPDATE) )
231 Missing = (Ep =
Group(0, Fp, Lp, T)) - Fp + 1;
240 MissingCases = CountCases(Fp, Ep);
241 KnownCases = Cases - MissingCases;
247 if ( Missing ) UnitWeights = 0;
254 Ep =
Group(v, Bp + Missing, Lp, T);
259 BranchCases[v] = CountCases(Bp + Missing, Ep);
261 Factor = ( ! Missing ? 0 :
265 if ( (BranchCases[v] += Factor * MissingCases) >= MinLeaf )
269 ForEach(i, Bp, Bp + Missing - 1)
286 SmallBranchCases += BranchCases[v];
297 for ( i = Ep ; i >= Bp ; i-- )
314 if ( SmallBranchCases )
319 if ( SmallBranches[c] > SmallBranches[BestClass] ) BestClass = c;
322 Errs = SmallBranchCases - SmallBranches[BestClass];
323 TreeErrs += Errs +
ExtraErrs(SmallBranchCases, Errs, BestClass);
328 if ( ! (Flags & UPDATE) )
368 fprintf(
Of,
"%s: [%d%% N=%.2f tree=%.2f leaf=%.2f+%.2f",
370 (
int) ((TreeErrs * 100) / (T->
Cases + 0.001)),
371 T->
Cases, TreeErrs, LeafErrs, ExtraLeafErrs);
374 fprintf(
Of,
" br[%d]=%.2f", BestBr, BestBrErrs);
380 if ( LeafErrs + ExtraLeafErrs <= BestBrErrs + 0.1 &&
381 LeafErrs + ExtraLeafErrs <= TreeErrs + 0.1 )
388 T->
Errors = LeafErrs + ExtraLeafErrs;
391 if ( BestBrErrs <= TreeErrs + 0.1 )
395 fprintf(
Of,
"Replaced with branch %d\n", BestBr))
413 memcpy((
char *) T, (
char *) Br,
sizeof(
TreeRec));
416 Factor = T->
Cases / Cases;
499 fprintf(
Of,
"%d tied with MinCC=%.3f; total extra errs %.1f\n",
515 DeltaLeaves = 1 - ST->Leaves;
519 ST->Leaves += DeltaLeaves;
526 fprintf(
Of,
"global: %d leaves, %.1f errs\n",
527 DeltaLeaves, DeltaErrs))
549 double ExtraErrs, CC, SaveMinCC, SaveTotalExtraErrs;
574 CC = ExtraErrs / (T->Leaves - 1);
583 CC <=
MinCC && CC < SaveMinCC )
625 T->
Errors = T->Leaves = 0;
633 T->Leaves += T->
Branch[v]->Leaves;
639 if ( T->
Cases > 1E-3 )
659 int v, vv, x, Bytes, b, First, Any=0;
675 if ( !
Ordered(A) && PruneDefaults )
703 if (
In(vv, T->
Subset[v]) && !
In(vv, HoldValues) )
705 ResetBit(vv, T->
Subset[v]);
725 First = (
In(1, T->
Subset[1]) ? 2 : 1 );
726 for ( v = First ; v < T->
Forks ; v++ )
733 for ( vv = v+1 ; vv <= T->
Forks ; )
748 if ( ! LeafBr->
Cases )
810 float Val[] = { 0, 0.001, 0.005, 0.01, 0.05, 0.10, 0.20, 0.40, 1.00},
811 Dev[] = {4.0, 3.09, 2.58, 2.33, 1.65, 1.28, 0.84, 0.25, 0.00},
823 while (
CF > Val[i] ) i++;
826 (
Dev[i] -
Dev[i-1]) * (
CF - Val[i-1]) /(Val[i] - Val[i-1]);
870 return N * (1 - exp(log(
CF) / N));
873 if ( N > 1 && E < 0.9999 )
875 Val0 = N * (1 - exp(log(
CF) / N));
881 return 0.67 * (N - E);
885 Pr = (E + 0.5 +
Coeff/2
886 + sqrt(
Coeff * ((E + 0.5) * (1 - (E + 0.5)/N) +
Coeff/4)) )
917 if ( T->
Cases >= MinLeaf )
977 EmptyOnly && Br->
Cases >= MinLeaf )
988 for ( vv = 2 ; vv < v ; vv++ )
993 ( Br->
Cases < MinLeaf ) &&
1003 LocalSet[v] = ( vv < v ? LocalSet[vv] : ++S );
1019 if ( LocalSet[v] > S )
1022 Br = T->
Branch[S] = OldBranch[v];
1036 if ( LocalSet[vv] == S )
1068 UnitWeights = ( LocalFlag != 0 );