/**
   * Function that evaluates the whole function at a single point
   *
   * @param position The value to evaluate the function at
   * @return A double containing the evaluated value.
   */
  @Override
  public double val(double... position) {
    // Check x and a size for correctness
    double y = 0.;
    // Just sum over the individual functions
    for (AFunction f : functionList) y += f.val(position);

    return y;
  }
  @Test
  public void testFunction() {
    AFunction f = new StraightLine();
    Assert.assertEquals(2, f.getNoOfParameters());
    f.setParameterValues(23., -10.);
    Assert.assertArrayEquals(new double[] {23., -10.}, f.getParameterValues(), ABS_TOL);
    Assert.assertEquals(23. - 10., f.val(1), ABS_TOL);

    DoubleDataset xd = new DoubleDataset(new double[] {-1, 0, 2});
    DoubleDataset dx;
    dx = f.calculateValues(xd);
    Assert.assertArrayEquals(new double[] {-23. - 10, -10, 23. * 2 - 10.}, dx.getData(), ABS_TOL);

    dx = f.calculatePartialDerivativeValues(f.getParameter(0), xd);
    Assert.assertArrayEquals(new double[] {-1, 0, 2}, dx.getData(), ABS_TOL);

    dx = f.calculatePartialDerivativeValues(f.getParameter(1), xd);
    Assert.assertArrayEquals(new double[] {1, 1, 1}, dx.getData(), ABS_TOL);

    Assert.assertEquals(-1, f.partialDeriv(f.getParameter(0), -1), ABS_TOL);
    Assert.assertEquals(1, f.partialDeriv(f.getParameter(1), -1), ABS_TOL);
  }