public static IObservable <IO <IObservable <KeyValuePair <DateTime, Tuple <double, double>[]> > > > GetDynamicOutput(bool optimise, Type type, TwoVariableInput filter, IConnectableObservable <KeyValuePair <DateTime, double> > measurements, IScheduler scheduler)
        {
            measurements.Connect();
            measurements.Subscribe(ddd =>
                                   Console.WriteLine(ddd.Key + " " + (DateTime.Now - ddd.Key).Seconds));

            if (optimise)
            {
                //    return Filter.Optimisation.Class1.GetOptimisedOutput(measurements);
                return(Observable.Repeat(PredictionServiceHelper.GetNonOptimisedOutput(filter, measurements), 1).SubscribeOn(scheduler));
            }
            else
            {
                return(Observable.Repeat(PredictionServiceHelper.GetNonOptimisedOutput(filter, measurements), 1).SubscribeOn(scheduler));
            }
        }
        public static IO <IObservable <KeyValuePair <DateTime, Tuple <double, double>[]> > > GetNonOptimisedOutput(TwoVariableInput t, IObservable <KeyValuePair <DateTime, double> > e)
        {
            var run = TypeHelper.GetInstance <IFilterWrapper>(t.Filter, t.VarA, t.VarB).Run(e.Select(_ => new KeyValuePair <DateTime, double?>(_.Key, _.Value)));


            return(new IO <IObservable <KeyValuePair <DateTime, Tuple <double, double>[]> > >
            {
                Output = run,
                Parameters = new double[] { t.VarA, t.VarB },
                Score = 0//ErrorHelper.GetErrorSum(e, run)
            });
        }
 public static IObservable <IO <IEnumerable <KeyValuePair <DateTime, Tuple <double, double>[]> > > > GetStaticOutput(bool optimise, Type type, TwoVariableInput filter, IEnumerable <KeyValuePair <DateTime, double> > measurements, IScheduler scheduler)
 {
     if (optimise)
     {
         //return Optimisation.Class1.GetOptimisedOutput(type, measurements).SubscribeOn(scheduler);
         return(Observable.Repeat(PredictionServiceHelper.GetNonOptimisedOutput(filter, measurements), 1).SubscribeOn(scheduler));
     }
     else
     {
         return(Observable.Repeat(PredictionServiceHelper.GetNonOptimisedOutput(filter, measurements), 1).SubscribeOn(scheduler));
     }
 }
        //  public static AccordGenetic.Wrapper.TimeSeries2DOptimisation<IObservable<KeyValuePair<DateTime, double>>, IObservable<KeyValuePair<DateTime, Tuple<double, double>[]>>>
        //GetOptimiser(List<KeyValuePair<DateTime, double>> z)
        //  {
        //      return new AccordGenetic.Wrapper.TimeSeries2DOptimisation<IObservable<KeyValuePair<DateTime, double>>, IObservable<KeyValuePair<DateTime, Tuple<double, double>[]>>>
        //                 ((ss) => (a, b) => new GaussianProcessWrapper(a, b).Run(ss.Select(_=>new KeyValuePair<DateTime, double?>(_.Key,_.Value))), z.ToObservable(), ErrorHelper.GetErrorSum);

        //  }


        public static IO <IEnumerable <KeyValuePair <DateTime, Tuple <double, double>[]> > > GetNonOptimisedOutput(TwoVariableInput t, IEnumerable <KeyValuePair <DateTime, double> > e)
        {
            var run = TypeHelper.GetInstance <IFilterWrapper>(t.Filter, t.VarA, t.VarB).BatchRun(e).ToList();

            return(new IO <IEnumerable <KeyValuePair <DateTime, Tuple <double, double>[]> > >
            {
                Output = run,
                Parameters = new double[] { t.VarA, t.VarB },
                Score = ErrorHelper.GetErrorSum(e, run)
            });
        }