public void CloneState()
 {
     if (Interlocked.Increment(ref _parent.StateRefCount) > 1)
     {
         State = (ForecastingStateBase)_parent.StateRef.Clone();
     }
 }
            private Delegate MakeGetter(DataViewRow input, ForecastingStateBase state)
            {
                _host.AssertValue(input);
                var         srcGetter   = input.GetGetter <TInput>(input.Schema[_inputColumnIndex]);
                ProcessData processData = _parent.WindowSize > 0 ?
                                          (ProcessData)state.Process : state.ProcessWithoutBuffer;

                ValueGetter <VBuffer <float> > valueGetter = (ref VBuffer <float> dst) =>
                {
                    TInput src = default;
                    if (_dontFetchSrcValue)
                    {
                        state.TransformCore(ref src, null, 0, ref dst);
                        return;
                    }

                    srcGetter(ref src);
                    processData(ref src, ref dst);
                };

                return(valueGetter);
            }
            private Action <PingerArgument> MakePinger(DataViewRow input, ForecastingStateBase state)
            {
                _host.AssertValue(input);
                var srcGetter = input.GetGetter <TInput>(input.Schema[_inputColumnIndex]);
                Action <PingerArgument> pinger = (PingerArgument args) =>
                {
                    state.LocalConfidenceLevel = args.ConfidenceLevel;
                    state.LocalHorizon         = args.Horizon;

                    // This means don't call srcGetter in getters.
                    if (args.DontConsumeSource)
                    {
                        _dontFetchSrcValue = true;
                        return;
                    }

                    _dontFetchSrcValue = false;
                    TInput src = default;
                    srcGetter(ref src);
                    state.UpdateState(ref src, args.RowPosition, _parent.WindowSize > 0);
                };

                return(pinger);
            }
            public Mapper(IHostEnvironment env, SequentialForecastingTransformBase <TInput, TState> parent, DataViewSchema inputSchema)
            {
                Contracts.CheckValue(env, nameof(env));
                _host = env.Register(nameof(Mapper));
                _host.CheckValue(inputSchema, nameof(inputSchema));
                _host.CheckValue(parent, nameof(parent));

                if (!inputSchema.TryGetColumnIndex(parent.InputColumnName, out _inputColumnIndex))
                {
                    throw _host.ExceptSchemaMismatch(nameof(inputSchema), "input", parent.InputColumnName);
                }

                var colType = inputSchema[_inputColumnIndex].Type;

                if (colType != NumberDataViewType.Single)
                {
                    throw _host.ExceptSchemaMismatch(nameof(inputSchema), "input", parent.InputColumnName, "Single", colType.ToString());
                }

                _parent            = parent;
                _parentSchema      = inputSchema;
                State              = (ForecastingStateBase)_parent.StateRef;
                _dontFetchSrcValue = false;
            }