Example #1
0
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;

}
Example #2
0
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);

}