int AddChildsInd(Node *n,int var,int cut) { // Add children to bottom node n // use rule for ordinal rule var, with index of rule cut // (in global array RuleMat[NumX+1][RuleNum[i]+1] // only works for ordinal rules right now if(VarType[var]!=ORD) { printf("AddChilds: error, VarType!=ORD"); return 0; } if((n->Bot)!=1) { printf("AddChilds: error, node not bottom"); return 0; } int LeftI,RightI; GetSplitInterval(&LeftI,&RightI,n,var); if(cut<LeftI) { printf("AddChilds: error, cut<LeftI"); return 0; } if(cut>RightI) { printf("AddChilds: error, cut>LeftI"); return 0; } int LeftEx=0; int RightEx=0; n->Bot = 0; n->Nog = 1; if(!(n->Top)) (n->Parent)->Nog=0; (n->rule).Var=var; (n->rule).OrdRule = cut; if((n->rule).OrdRule==LeftI) LeftEx=1; if((n->rule).OrdRule==RightI) RightEx=1; SpawnChildren(n,LeftEx,RightEx); return 1; }
void FindGoodOrdRules(Node *n,int VarI, int &l, int &u) //good rule have splits in [l,u] { int LeftI,RightI; LeftI = 1; // right value if you top out RightI = RuleNum[VarI]; // right value if you top out int lmin,lmax,rmin,rmax; GetSplitInterval(&LeftI,&RightI,n,VarI); lmin=RightI+1; rmin=RightI+1; lmax=LeftI-1; rmax=LeftI-1; OrdFindMinMax(n->LeftC,VarI,&lmin,&lmax); OrdFindMinMax(n->RightC,VarI,&rmin,&rmax); l = (int)max(LeftI,lmax+1); u = (int)min(RightI,rmin-1); }