<?php
namespace Moserware\Skills\FactorGraphs;

require_once(dirname(__FILE__) . "/FactorGraph.php");
require_once(dirname(__FILE__) . "/Schedule.php");

abstract class FactorGraphLayer
{
    private $_localFactors = array();
    private $_outputVariablesGroups = array();    
    private $_inputVariablesGroups = array();
    private $_parentFactorGraph;

    protected function __construct(FactorGraph &$parentGraph)
    {
        $this->_parentFactorGraph = &$parentGraph;
    }

    protected function &getInputVariablesGroups()
    {
        return $this->_inputVariablesGroups;        
    }

    // HACK

    public function &getParentFactorGraph()
    {
        return $this->_parentFactorGraph;
    }

    public function &getOutputVariablesGroups()
    {
        return $this->_outputVariablesGroups;        
    }

    public function &getLocalFactors()
    {
        return $this->_localFactors;        
    }

    public function setInputVariablesGroups(&$value)
    {
        $this->_inputVariablesGroups = $value;
    }

    protected function scheduleSequence(&$itemsToSequence)
    {
        return new ScheduleSequence("TODO", $itemsToSequence);
    }

    protected function addLayerFactor(&$factor)
    {
        $this->_localFactors[] = $factor;
    }

    public abstract function buildLayer();

    public function createPriorSchedule()
    {
        return null;
    }

    public function createPosteriorSchedule()
    {
        return null;
    }
}

?>