/*************************************************************************/

/*									 */

/*		Type definitions for C4.5				 */

/*              -------------------------				 */

/*									 */

/*************************************************************************/





typedef  char	Boolean, *String, *Set;



typedef  int	ItemNo;		/* data item number */

typedef  float	ItemCount;	/* count of (partial) items */



typedef  short	ClassNo,	/* class number, 0..MaxClass */

		DiscrValue;	/* discrete attribute value (0 = ?) */

typedef  short	Attribute;	/* attribute number, 0..MaxAtt */



typedef  union  _attribute_value

	 {

	    DiscrValue	_discr_val;

	    float	_cont_val;

	 }

	 	AttValue, *Description;



#define  CVal(Case,Attribute)   Case[Attribute]._cont_val

#define  DVal(Case,Attribute)   Case[Attribute]._discr_val

#define  Class(Case)		Case[MaxAtt+1]._discr_val



#define  Unknown  -999		/* unknown value for continuous attribute */





#define  BrDiscr	1	/* node types:	branch */

#define  ThreshContin	2	/*		threshold cut */

#define  BrSubset	3	/*		subset test */



typedef  struct _tree_record *Tree;

typedef  struct _tree_record

	 {

	    short	NodeType;	/* 0=leaf 1=branch 2=cut 3=subset */

	    ClassNo	Leaf;		/* most frequent class at this node */

	    ItemCount	Items,		/* no of items at this node */

			*ClassDist,	/* class distribution of items */

	    		Errors;		/* no of errors at this node */

	    Attribute	Tested; 	/* attribute referenced in test */

	    short	Forks;		/* number of branches at this node */

	    float	Cut,		/* threshold for continuous attribute */

		  	Lower,		/* lower limit of soft threshold */

		  	Upper;		/* upper limit ditto */

	    Set         *Subset;	/* subsets of discrete values  */

	    Tree	*Branch;	/* Branch[x] = (sub)tree for outcome x */

	 }

		TreeRec;



#define  IGNORE		1	/* special attribute status: do not use */

#define  DISCRETE	2	/* ditto: collect values as data read */





typedef short	RuleNo;			/* rule number */





typedef struct TestRec *Test;



struct TestRec

       {

	   short	NodeType;	/* test type (see tree nodes) */

	   Attribute	Tested;		/* attribute tested */

	   short	Forks;		/* possible branches */

	   float	Cut;		/* threshold (if relevant) */

	   Set		*Subset;	/* subset (if relevant) */

       };





typedef struct CondRec *Condition;



struct CondRec

       {

	   Test		CondTest;	/* test part of condition */

	   short	TestValue;	/* specified outcome of test */

       };





typedef struct ProdRuleRec PR;



struct ProdRuleRec

       {

	   short	Size;		/* number of conditions */

	   Condition	*Lhs;		/* conditions themselves */

	   ClassNo	Rhs;		/* class given by rule */

	   float	Error,		/* estimated error rate */

			Bits;		/* bits to encode rule */

	   ItemNo	Used,		/* times rule used */

			Incorrect;	/* times rule incorrect */

       };





typedef struct RuleSetRec RuleSet;



struct RuleSetRec

       {

	   PR		*SRule;		/* rules */

	   RuleNo	SNRules,	/* number of rules */

			*SRuleIndex;	/* ranking of rules */

	   ClassNo	SDefaultClass;	/* default class for this ruleset */

    };

