/**
  * This method takes the portfolio Model and returns the investement value for the given number of
  * years after adjusting to inflation
  *
  * @param pModel
  * @return double
  */
 private double InvstSingleIteration(PortfolioModel pModel) {
   double dInvestment = pModel.getInvestment();
   for (int idx = 1; idx <= this.iRetYears; ++idx) {
     dInvestment =
         dInvestment * (1 + getGaussianReturn(pModel.getInvstReturn(), pModel.getInvstRisk()));
   }
   return dInvestment / (Math.pow((1 + pModel.getInflation()), iRetYears));
 }
  public double[] simulatePortfolio(
      final PortfolioModel pModel, final int iYears, final int iNoOfSimulations) throws Exception {

    // validations for the input arguments
    if (pModel == null) throw new Exception(MPTContants.PROVIDE_PORTFOLIO);

    if (pModel.getInvestment() <= 0) throw new Exception(MPTContants.PROVIDE_INVSTMENT);

    if (iYears <= 0) throw new Exception(MPTContants.PROVIDE_YEARS);

    if (iNoOfSimulations <= 0) throw new Exception(MPTContants.PROVIDE_SIMULATIONS);

    this.iRetYears = iYears;
    this.simulSortedValues =
        IntStream.range(0, iNoOfSimulations)
            .parallel() // default is 3 to change default
                        // -Djava.util.concurrent.ForkJoinPool.common.parallelism=5
            .mapToDouble(k -> InvstSingleIteration(pModel))
            .sorted()
            .toArray();
    return simulSortedValues;
  }