#include <config.h>
#include <sampler/RealSliceSampler.h>
#include <graph/StochasticNode.h>
#include <graph/NodeError.h>
#include <distributions/DistReal.h>

#include <cmath>
#include <cfloat>
#include <Rmath.h>

using std::vector;

RealSliceSampler::RealSliceSampler(StochasticNode *node, Graph const &graph,
				   double width, long maxwidth)
  : Slicer(vector<StochasticNode*>(1,node), graph, width, maxwidth)
{
}

bool 
RealSliceSampler::canSample(StochasticNode const *node, Graph const &graph)
{
  return (!node->distribution()->isDiscreteValued() &&
	  node->data.length() == 1 &&
	  node->distribution()->df(node->parameters()) == 1);
}

double RealSliceSampler::value()
{
  return *nodes().front()->data.value();
}
 
void RealSliceSampler::setValue(double value)
{
  nodes().front()->data.setValue(value, 0);
  vector<Node*> const &dc = deterministicChildren();
  for (vector<Node*>::const_iterator i(dc.begin()); i != dc.end(); ++i) {
    (*i)->forwardSample();
  }
}

double RealSliceSampler::lowerLimit()
{
  StochasticNode const *node = nodes().front();
  return node->distribution()->lowerSupport(0, node->parameters());
}

double RealSliceSampler::upperLimit()
{
  StochasticNode const *node = nodes().front();
  return node->distribution()->upperSupport(0, node->parameters());
}

void RealSliceSampler::update()
{
  updateStep();
}


syntax highlighted by Code2HTML, v. 0.9.1