public static List<FuzzyVariable> Stretch( List<MeasurementWithResult> learningSet, DecisionMakerType1 originalDecisionMaker, VariableMFParam toStretch, BoundType boundType) { List<MeasurementWithResult> withResultsFromFs = (from measurement in learningSet select new MeasurementWithResult { InputValues = new Dictionary<string, double>(measurement.InputValues), OutputString = originalDecisionMaker.InferTerm(measurement.InputValues) }).ToList(); double multiplier = 1; int error = 0; bool canStretchMore = true; if (boundType == BoundType.Upper) { while (error == 0 && canStretchMore) { multiplier += 0.001; MamdaniFuzzySystem newFuzzySystem = UpdateParamsByMultiplier( originalDecisionMaker, multiplier, toStretch, out canStretchMore); var updatedDecisionMaker = new DecisionMakerType1(newFuzzySystem, originalDecisionMaker.RulesDefinitions); error = (from measurement in withResultsFromFs where updatedDecisionMaker.InferTerm(measurement.InputValues) != measurement.OutputString select measurement).Count(); } multiplier -= 0.001; var finalFuzzySystem = UpdateParamsByMultiplier( originalDecisionMaker, multiplier, toStretch, out canStretchMore); return finalFuzzySystem.Input; } else { while (error == 0 && canStretchMore) { multiplier -= 0.001; MamdaniFuzzySystem newFuzzySystem = UpdateParamsByMultiplier( originalDecisionMaker, multiplier, toStretch, out canStretchMore); var updatedDecisionMaker = new DecisionMakerType1(newFuzzySystem, originalDecisionMaker.RulesDefinitions); error = (from measurement in withResultsFromFs where updatedDecisionMaker.InferTerm(measurement.InputValues) != measurement.OutputString select measurement).Count(); } multiplier += 0.001; var finalFuzzySystem = UpdateParamsByMultiplier( originalDecisionMaker, multiplier, toStretch, out canStretchMore); return finalFuzzySystem.Input; } }