Utility class analyzing compile-time FeatureAttribute annotation.
Ejemplo n.º 1
0
        /// <summary>
        /// Creates a serializer for the given type and settings.
        /// </summary>
        /// <typeparam name="TExample">The user type to serialize.</typeparam>
        /// <param name="settings"></param>
        /// <returns></returns>
        public static VowpalWabbitSerializerCompiled <TExample> CreateSerializer <TExample>(VowpalWabbitSettings settings = null)
        {
            List <FeatureExpression> allFeatures = null;

            Type cacheKey = null;

            if (settings != null && settings.AllFeatures != null)
            {
                allFeatures = settings.AllFeatures;
            }
            else
            {
                // only cache non-string generating serializer
                if (!settings.EnableStringExampleGeneration)
                {
                    cacheKey = typeof(TExample);
                    object serializer;

                    if (SerializerCache.TryGetValue(cacheKey, out serializer))
                    {
                        return((VowpalWabbitSerializerCompiled <TExample>)serializer);
                    }
                }

                // TOOD: enhance caching based on feature list & featurizer set
                // if no feature mapping is provided, use [Feature] annotation on provided type.

                Func <PropertyInfo, FeatureAttribute, bool> propertyPredicate = null;
                switch (settings.FeatureDiscovery)
                {
                case VowpalWabbitFeatureDiscovery.Default:
                    propertyPredicate = (_, attr) => attr != null;
                    break;

                case VowpalWabbitFeatureDiscovery.All:
                    propertyPredicate = (_, __) => true;
                    break;
                }

                allFeatures = AnnotationInspector.ExtractFeatures(typeof(TExample), propertyPredicate).ToList();
            }

            // need at least a single feature to do something sensible
            if (allFeatures == null || allFeatures.Count == 0)
            {
                return(null);
            }

            var newSerializer = new VowpalWabbitSerializerCompiled <TExample>(
                allFeatures,
                settings == null ? null : settings.CustomFeaturizer,
                !settings.EnableStringExampleGeneration);

            if (cacheKey != null)
            {
                SerializerCache[cacheKey] = newSerializer;
            }

            return(newSerializer);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Creates a serializer for the given type and settings.
        /// </summary>
        /// <typeparam name="TExample">The user type to serialize.</typeparam>
        /// <param name="settings"></param>
        /// <returns></returns>
        public static IVowpalWabbitSerializerCompiler <TExample> CreateSerializer <TExample>(VowpalWabbitSettings settings = null)
        {
            Schema schema = null;

            Type cacheKey = null;

            if (settings != null && settings.Schema != null)
            {
                schema = settings.Schema;
            }
            else
            {
                // only cache non-string generating serializer
                if (!settings.EnableStringExampleGeneration)
                {
                    cacheKey = typeof(TExample);
                    object serializer;

                    if (SerializerCache.TryGetValue(cacheKey, out serializer))
                    {
                        return((IVowpalWabbitSerializerCompiler <TExample>)serializer);
                    }
                }

                if (settings.FeatureDiscovery == VowpalWabbitFeatureDiscovery.Json)
                {
                    schema = AnnotationJsonInspector.CreateSchema(typeof(TExample), settings.PropertyConfiguration);

                    var multiExampleSerializerCompiler = VowpalWabbitMultiExampleSerializerCompiler.TryCreate <TExample>(settings, schema);
                    if (multiExampleSerializerCompiler != null)
                    {
                        return(multiExampleSerializerCompiler);
                    }
                }
                else
                {
                    // TODO: enhance caching based on feature list & featurizer set
                    // if no feature mapping is provided, use [Feature] annotation on provided type.

                    Func <PropertyInfo, FeatureAttribute, bool> propertyPredicate = null;
                    Func <PropertyInfo, LabelAttribute, bool>   labelPredicate    = null;
                    switch (settings.FeatureDiscovery)
                    {
                    case VowpalWabbitFeatureDiscovery.Default:
                        propertyPredicate = (_, attr) => attr != null;
                        labelPredicate    = (_, attr) => attr != null;
                        break;

                    case VowpalWabbitFeatureDiscovery.All:
                        propertyPredicate = (_, __) => true;
                        labelPredicate    = (_, __) => true;
                        break;
                    }

                    schema = AnnotationInspector.CreateSchema(typeof(TExample), propertyPredicate, labelPredicate);
                }
            }

            // need at least a single feature to do something sensible
            if (schema == null || schema.Features.Count == 0)
            {
                return(null);
            }

            var newSerializer = new VowpalWabbitSingleExampleSerializerCompiler <TExample>(
                schema,
                settings == null ? null : settings.CustomFeaturizer,
                !settings.EnableStringExampleGeneration);

            if (cacheKey != null)
            {
                SerializerCache[cacheKey] = newSerializer;
            }

            return(newSerializer);
        }