bool IsValid(IValueMapper mapper, ref DataViewType inputType)
 {
     // inputType
     if (mapper == null)
     {
         return(false);
     }
     if (mapper.OutputType != NumberDataViewType.Single)
     {
         return(false);
     }
     if (!mapper.InputType.IsVector() || mapper.InputType.ItemType() != NumberDataViewType.Single)
     {
         return(false);
     }
     if (inputType == null)
     {
         inputType = mapper.InputType;
     }
     else if (inputType.VectorSize() != mapper.InputType.VectorSize())
     {
         if (inputType.VectorSize() == 0)
         {
             inputType = mapper.InputType;
         }
         else if (mapper.InputType.VectorSize() != 0)
         {
             return(false);
         }
     }
     return(true);
 }
            public override ValueMapper <VBuffer <float>, VBuffer <float> > GetMapper()
            {
                var maps = new ValueMapper <VBuffer <float>, float, float> [_mappers.Length];

                for (int i = 0; i < _mappers.Length; i++)
                {
                    maps[i] = _mappers[i].GetMapper <VBuffer <float>, float, float>();
                }

                return
                    ((in VBuffer <float> src, ref VBuffer <float> dst) =>
                {
                    if (_inputType.VectorSize() > 0)
                    {
                        Contracts.Check(src.Length == _inputType.VectorSize());
                    }

                    var values = dst.Values;
                    if (Utils.Size(values) < maps.Length)
                    {
                        values = new float[maps.Length];
                    }

                    var tmp = src;
                    Parallel.For(0, maps.Length,
                                 i =>
                    {
                        float score = 0;
                        maps[i](in tmp, ref score, ref values[i]);
                    });