public async Task <IEnumerable <MathErrorOutcome> > DoExperiment(IExperiment experiment) { if (!(experiment.ExperimentPositions?.Any() ?? false)) { throw new Exception("No Experiment Positions generated."); } if (!IsDataSetCalculated) { throw new ApplicationException("DataSet is not calculated"); } if (!IsANFISTrained) { throw new ApplicationException("ANFIS is not trained"); } var mathematicalOutcomes = new List <IKinematicOutcome>(); var anfisOutcomes = new List <IKinematicOutcome>(); experiment.ExperimentPositions.ToList().ForEach(point => { var anfisOut = CalculateAngelsUsingANFIS(point).GetAwaiter().GetResult(); var mathOuts = CalculateArmJoint(point).GetAwaiter().GetResult() .Select(x => new KinematicOutcome(x.Theta1.ConvertRadiansToDegrees(), x.Theta2.ConvertRadiansToDegrees(), x.JointPosition)); var mathOut = mathOuts.OrderBy(x => x, new CustomSort(anfisOut)).FirstOrDefault(); anfisOutcomes.Add(anfisOut); mathematicalOutcomes.Add(mathOut); }); experiment.SetActualOutputs(mathematicalOutcomes); experiment.SetAnfisOutputs(anfisOutcomes); return(await experiment.CalculateError()); }