#include <config.h>
#include <functions/Min.h>
#include <sarray/SArray.h>

#include <algorithm>

using std::min_element;
using std::min;
using std::vector;

Min::Min ()
  : Function ("min", 0)
{
}

void
Min::evaluate (SArray &value, vector < SArray const *>const &args) const
{
  double ans;
  for (unsigned int i = 0; i < args.size(); ++i) {
    double const *argi = args[i]->value ();
    long len = args[i]->length ();
    double mini = *min_element(argi, argi + len);
    if (i == 0) {
      ans = mini;
    }
    else {
      ans = min(ans, mini);
    }
  }
  value.setValue(&ans, 1);
}

bool Min::checkParameterDim (vector <SArray const *> const &args) const
{
  return true;
}

Index Min::dim (vector <SArray const *> const &args) const
{
  return Index(1);
}

bool Min::isDiscreteValued(std::vector<SArray const *> const &args) const
{
  return allDiscrete(args);
}


syntax highlighted by Code2HTML, v. 0.9.1