#ifndef DISTRIB_H
#define DISTRIB_H
#include "iterator.h"
#include "matrix.h"
#include <string>

extern int distribFootprint;

class Distrib {
	public:
		Distrib() { left = 0; right = 0; count = 1; tot = 0; parent = 0; distribFootprint += sizeof(Distrib); }
		~Distrib();
		Distrib(double v, double r) { value = v; value2 = r; left = 0; right = 0; count = 1; tot = 0; parent = 0; distribFootprint += sizeof(Distrib); }
		Distrib *right;
		Distrib *left;
		Distrib *parent;
		double value,value2;
		int pvalue;
		int count;
		int tot;
		void traverse();
		void settotal(int t);
		double get_pvalue(double l1, double l2);
		void traverse(Matrix<double> &y, Matrix<double> &X, int size);
		
		double traverse_and_sum(Matrix<double> &a, int size);
		
		void add(Distrib *i);
};

class DistribHolder {
	public:
		DistribHolder();
		~DistribHolder();
		double get_pvalue(double l1, double l2, int nuc, Iterator *i);
		void add_tree(Distrib *t, int nuc);
	private:
		Distrib *trees[GLET*GLET*GLET];
};

DistribHolder *get_distrib(Iterator *i, std::string key);

#endif
