public override void Start()
        {
            CheckIfInputsAreProvided();
            DataObjects.BSDataObject[] inputs = new DataObjects.BSDataObject[Inputs.Count];
            Inputs.TryPopRange(inputs);
            //TODO: improve to allow multiple DataObjects to be used as inputs
            if (inputs.Length != 2)
                throw new NoInputProvidenException();

            if (!inputs.Any(x => x is IForecastingModel))
                throw new IncorrectInputs();
            IForecastingModel model;
            DataObjects.BSDataObject inputData;

            //This part is very, very bad!
            int i = 0;
            model = inputs[i] as IForecastingModel;
            if (null == model)
            {
                i = 1;
                model = inputs[i] as IForecastingModel;
            }
            inputData = inputs[Math.Abs(i - 1)];
            //End of very, very bad part.
            double[][] modelInput, modelOutput;
            model.InputProvider.GenerateInputAndOutput(inputData.DataArray, out modelInput, out modelOutput);
            forecaster = new BasicForecaster(model);
            modelOutput = forecaster.CalculateOutput(modelInput);
            //Also not very good - 1) think about new object name - it can be specified by user or something.
            //2) Check that modelOutput is exactly 1 row.
            double[] output = new double[modelOutput.LongLength];
            for (long j = 0; j < output.LongLength; ++j)
                output[j] = modelOutput[j][0];
            Output = new DataObjects.BSDataObject(output, inputData.Offset + model.InputSize, inputData.ObjName);
        }
        public override void Start()
        {
            CheckIfInputsAreProvided();
            DataObjects.BSDataObject[] inputs = new DataObjects.BSDataObject[Inputs.Count];
            Inputs.TryPopRange(inputs);
            //TODO: improve to allow multiple DataObjects to be used as inputs
            if (inputs.Length != 2)
            {
                throw new NoInputProvidenException();
            }

            if (!inputs.Any(x => x is IForecastingModel))
            {
                throw new IncorrectInputs();
            }
            IForecastingModel model;

            DataObjects.BSDataObject inputData;

            //This part is very, very bad!
            int i = 0;

            model = inputs[i] as IForecastingModel;
            if (null == model)
            {
                i     = 1;
                model = inputs[i] as IForecastingModel;
            }
            inputData = inputs[Math.Abs(i - 1)];
            //End of very, very bad part.
            double[][] modelInput, modelOutput;
            model.InputProvider.GenerateInputAndOutput(inputData.DataArray, out modelInput, out modelOutput);
            forecaster  = new BasicForecaster(model);
            modelOutput = forecaster.CalculateOutput(modelInput);
            //Also not very good - 1) think about new object name - it can be specified by user or something.
            //2) Check that modelOutput is exactly 1 row.
            double[] output = new double[modelOutput.LongLength];
            for (long j = 0; j < output.LongLength; ++j)
            {
                output[j] = modelOutput[j][0];
            }
            Output = new DataObjects.BSDataObject(output, inputData.Offset + model.InputSize, inputData.ObjName);
        }