docs: public double getATMForward(AnalyticModelInterface model, boolean isFirstPeriodIncluded) {
  		if(!Double.isNaN(cachedATMForward) && cacheStateModel.get() == model && cacheStateIsFirstPeriodIncluded == isFirstPeriodIncluded) {
  			return cachedATMForward;
  		}
  
  		ScheduleInterface remainderSchedule = schedule;
  		if(!isFirstPeriodIncluded) {
  			ArrayList<Period> periods = new ArrayList<Period>();
  			periods.addAll(schedule.getPeriods());
  
  			if(periods.size() > 1) {
  				periods.remove(0);
  			}
  			remainderSchedule = new Schedule(schedule.getReferenceDate(), periods, schedule.getDaycountconvention());
  		}
  
  		SwapLeg floatLeg = new SwapLeg(remainderSchedule, forwardCurveName, 0.0, discountCurveName, false);
  		SwapLeg annuityLeg = new SwapLeg(remainderSchedule, null, 1.0, discountCurveName, false);
  
  		cachedATMForward = floatLeg.getValue(model) / annuityLeg.getValue(model);
  		cacheStateModel = new SoftReference<AnalyticModelInterface>(model);
  		cacheStateIsFirstPeriodIncluded = isFirstPeriodIncluded;
  
  		return cachedATMForward;
  	}