class VolatilitySurfaceInterpolator {

  public Function1D<Double, Double>[] getIndependentSmileFits(final SmileSurfaceDataBundle marketData) {
    ArgumentChecker.notNull(marketData, "market data");
    final int n = marketData.getNumExpiries();
    final double[] forwards = marketData.getForwards();
    final double[][] strikes = marketData.getStrikes();
    final double[] expiries = marketData.getExpiries();
    final double[][] vols = marketData.getVolatilities();

    //fit each smile independently
    @SuppressWarnings("unchecked")
    final Function1D<Double, Double>[] smileFunctions = new Function1D[n];
    for (int i = 0; i < n; i++) {
      smileFunctions[i] = _smileInterpolator.getVolatilityFunction(forwards[i], strikes[i], expiries[i], vols[i]);
    }
    return smileFunctions;
  }

  public  VolatilitySurfaceInterpolator();
  public  VolatilitySurfaceInterpolator(final GeneralSmileInterpolator smileInterpolator);
  public  VolatilitySurfaceInterpolator(final Interpolator1D timeInterpolator);
  public  VolatilitySurfaceInterpolator(final GeneralSmileInterpolator smileInterpolator, final Interpolator1D timeInterpolator);
  public  VolatilitySurfaceInterpolator(final boolean useIntegratedVariance, final boolean useLogTime, final boolean useLogVariance);
  public  VolatilitySurfaceInterpolator(final GeneralSmileInterpolator smileInterpolator, final boolean useLogTime, final boolean useIntegratedVariance,
      final boolean useLogValue);
  public  VolatilitySurfaceInterpolator(final Interpolator1D timeInterpolator, final boolean useLogTime, final boolean useIntegratedVariance, final boolean useLogValue);
  public  VolatilitySurfaceInterpolator(final GeneralSmileInterpolator smileInterpolator, final Interpolator1D timeInterpolator, final boolean useLogTime,
      final boolean useIntegratedVariance, final boolean useLogValue);

}