class MultiCapFloorPricer {

  public DoubleMatrix2D capVolVega(double[] capletVols) {

    //cap vega matrix - sensitivity of cap prices to the volatilities of the caplets 
    DoubleMatrix2D vega = vegaFromCapletVols(capletVols);
    double[] capPrices = priceFromCapletVols(capletVols);
    double[] capVols = impliedVols(capPrices);

    //sensitivity of the cap prices to their volatilities 
    double[] capVega = vega(capVols);

    int nCaplets = capletVols.length;
    DoubleMatrix2D capVolVega = new DoubleMatrix2D(_nCaps, nCaplets);
    for (int i = 0; i < _nCaps; i++) {
      double[] temp = capVolVega.getData()[i];
      double[] vegaRow = vega.getData()[i];
      double invVega = 1.0 / capVega[i];
      for (int j = 0; j < nCaplets; j++) {
        temp[j] = invVega * vegaRow[j];
      }
    }

    return capVolVega;
  }

  public  MultiCapFloorPricer(List<CapFloor> caps,  MulticurveProviderInterface curves);

}