package MachineLearning;
import java.util.*;
/**
* Klasa reprezentująca węzeł drzewa decyzyjnego. Dziedziczy po liściu drzewa
* @author Angello
*
*/
public class TermostatNode extends TermostatLeaf
{
/**
* Rodzaj testu wykonywanego w danym węźle
*/
public NominalTest Test;
/**
* Mapa zawierająca węzły lub liście do których prowadzi dany węzeł
*/
HashMap<Integer, TermostatLeaf> m_listOfLeaves = new HashMap<Integer, TermostatLeaf>();
/**
* Konstruktor
* @param test Test
* @param category Kategoria większościowa
* @param P Lista przykładów uczących
*/
public TermostatNode(NominalTest test, Integer category, ArrayList<Integer> P)
{
Test = test;
m_category = category;
m_P = new ArrayList<Integer>(P);
}
/**
* Konstruktor domyślny
*/
public TermostatNode()
{
}
/**
* Dodaje liść lub węzeł do którego można przejść z danego węzła
* @param r
* @param node
*/
public void addNode(Integer r, TermostatLeaf node)
{
if (!m_listOfLeaves.containsKey(r))
m_listOfLeaves.put(r, node);
}
/**
* Rekurencyjne przeszukuje drzewo żeby znaleźć kategorię podanego zestawu atrybutów
*/
public Integer getCategory(Object[] attributes)
{
Integer key = (Integer)attributes[Test.AttributeIndex]; // Wartość atrybutu który testujemy
if (!Test.Results().contains(key)) // Jeśli R (rezultaty) nie zawiera wartości 'value'
return this.category();
return m_listOfLeaves.get(key).getCategory(attributes); // Rekurencyjne wywołanie dla węzła który spełnia test
}
/**
* Tworzy bardziej przejrzystą strukturę drzewa
*/
public ShowedNode showTree()
{
ShowedNode node = new ShowedNode();
node.P = new Integer[m_P.size()];
m_P.toArray(node.P);
node.TestName = Test.AttributeName;
for (Integer key : m_listOfLeaves.keySet())
{
node.addNode(key, m_listOfLeaves.get(key).showTree());
}
return node;
}
}