/* LICENSE:
  =========================================================================
    CMPack'04 Source Code Release for OPEN-R SDK 1.1.5-r2 for ERS7
    Copyright (C) 2004 Multirobot Lab [Project Head: Manuela Veloso]
    School of Computer Science, Carnegie Mellon University
    All rights reserved.
  ========================================================================= */

#ifndef DTree_h
#define DTree_h

#include "../headers/DogTypes.h"
#include "../headers/FileSystem.h"

class DTree {

 private:

  struct Node {
    Node() {
      test_value = type = test_variable = leaf_class = 0;
      left = right = NULL;
    }

    enum types { T_CHOICE, T_LEAF };

    int32 type;

    // Only valid for choice nodes
    // (Yes, I should have used inheritance. But I'm
    // lazy)
    int32 test_variable;
    double test_value;
    
    // Only valid for leaf nodes
    int32 leaf_class;
    
    Node *left;
    Node *right;
  };
  
  Node *head;
  
  Node *recursiveLoad(HFS::FILE *infile);
  void recursivePrint(int indent_level,Node *node);
  
 public:
  
  DTree();
  DTree(char *filename);
  
  ~DTree();

  void load(char *filename);
  void print();
  
  int32 getClass(double *features);
  int32 getClass(double *features, int32 num_features);
};

#endif
