private void InitializeLocked()
 {
     if (!initialized)
     {
         DoInitialization();
         initialized = true;
         current = null;
         vectorizerCount = GetVectorizers().Count();
     }
 }
        internal OptimizationResultUpdatedEventArgs(OptimizationEpoch epoch, double mse, FeatureMatrix featureMatrix, Matrix<double> output)
        {
            Contract.Requires(epoch != null);
            Contract.Requires(mse >= 0.0);
            Contract.Requires(featureMatrix != null);
            Contract.Requires(output != null);

            Epoch = epoch;
            MSE = mse;
            FeatureMatrix = featureMatrix;
            ComputedOutputMatrix = output;
        }
        internal void Update(double mse, FeatureMatrix featureMatrix, Matrix<double> output)
        {
            Contract.Requires(mse >= 0.0);
            Contract.Requires(featureMatrix != null);
            Contract.Requires(output != null);

            lock (SyncRoot)
            {
                if (bestHolder && mse >= this.mse) return;
                this.mse = mse;
                var handler = Updated;
                if (handler != null) handler(this, new OptimizationResultUpdatedEventArgs(Epoch, mse, featureMatrix, output));
            }
        }
 public void Uninitialize()
 {
     if (initialized)
     {
         lock (SyncRoot)
         {
             if (initialized)
             {
                 DoUninitialization();
                 initialized = false;
                 current = null;
             }
         }
     }
 }
        public FeatureMatrix GetNext()
        {
            lock (SyncRoot)
            {
                // Ensure initialization
                InitializeLocked();

                var nextIndexes = selectionStrategy.GetNextIndexes();

                if (nextIndexes == null || nextIndexes.Value.IsEmpty)
                {
                    if (current == null)
                    {
                        throw new InvalidOperationException(selectionStrategy + " has returned no indexes.");
                    }
                    return current;
                }
                else
                {
                    return current = GetFeatureMatrixInternal(nextIndexes.Value);
                }
            }
        }