public static void Empty_line_should_not_contain_indent()
        {
            var withIndent = new StringWriter();

            using (var indentedWriter = new IndentedTextWriter(withIndent))
            {
                indentedWriter.Indent();
                indentedWriter.WriteLine("x");
                indentedWriter.WriteLine();
                indentedWriter.Write("x");
            }

            var withoutIndent = new StringWriter();

            using (var indentedWriter = new IndentedTextWriter(withoutIndent))
            {
                indentedWriter.Indent();
                indentedWriter.WriteLine("x");
                indentedWriter.Unindent();
                indentedWriter.WriteLine();
                indentedWriter.Indent();
                indentedWriter.Write("x");
            }

            Assert.That(withIndent.ToString(), Is.EqualTo(withoutIndent.ToString()));
        }
        public static void GenerateLoaderAddInputMethod(IndentedTextWriter writer, string className)
        {
            //Constructor.
            writer.WriteLine("[Obsolete]");
            writer.WriteLine("[JsonIgnore]");
            writer.WriteLine("private string _inputFilePath = null;");
            writer.WriteLine($"public {className}(string filePath)");
            writer.WriteLine("{");
            writer.Indent();
            writer.WriteLine("_inputFilePath = filePath;");
            writer.Outdent();
            writer.WriteLine("}");
            writer.WriteLine("");

            //SetInput.
            writer.WriteLine("[Obsolete]");
            writer.WriteLine($"public void SetInput(IHostEnvironment env, Experiment experiment)");
            writer.WriteLine("{");
            writer.Indent();
            writer.WriteLine("IFileHandle inputFile = new SimpleFileHandle(env, _inputFilePath, false, false);");
            writer.WriteLine("experiment.SetInput(InputFile, inputFile);");
            writer.Outdent();
            writer.WriteLine("}");
            writer.WriteLine("");

            //GetInputData
            writer.WriteLine("[Obsolete]");
            writer.WriteLine("public Var<IDataView> GetInputData() => null;");
            writer.WriteLine("");

            //Apply.
            writer.WriteLine("[Obsolete]");
            writer.WriteLine($"public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Experiment experiment)");
            writer.WriteLine("{");
            writer.Indent();
            writer.WriteLine("Contracts.Assert(previousStep == null);");
            writer.WriteLine("");
            writer.WriteLine($"return new {className}PipelineStep(experiment.Add(this));");
            writer.Outdent();
            writer.WriteLine("}");
            writer.WriteLine("");

            //Pipelinestep class.
            writer.WriteLine("[Obsolete]");
            writer.WriteLine($"private class {className}PipelineStep : ILearningPipelineDataStep");
            writer.WriteLine("{");
            writer.Indent();
            writer.WriteLine($"public {className}PipelineStep (Output output)");
            writer.WriteLine("{");
            writer.Indent();
            writer.WriteLine("Data = output.Data;");
            writer.WriteLine("Model = null;");
            writer.Outdent();
            writer.WriteLine("}");
            writer.WriteLineNoTabs();
            writer.WriteLine("public Var<IDataView> Data { get; }");
            writer.WriteLine("public Var<ITransformModel> Model { get; }");
            writer.Outdent();
            writer.WriteLine("}");
        }
예제 #3
0
 public static void GenerateHeader(IndentedTextWriter writer)
 {
     writer.WriteLine("//------------------------------------------------------------------------------");
     writer.WriteLine("// <auto-generated>");
     writer.WriteLine("//     This code was generated by a tool.");
     writer.WriteLine("//");
     writer.WriteLine("//     Changes to this file may cause incorrect behavior and will be lost if");
     writer.WriteLine("//     the code is regenerated.");
     writer.WriteLine("// </auto-generated>");
     writer.WriteLine("//------------------------------------------------------------------------------");
     writer.WriteLine("#pragma warning disable");
     writer.WriteLine("using System.Collections.Generic;");
     writer.WriteLine("using Microsoft.ML.Runtime;");
     writer.WriteLine("using Microsoft.ML.Runtime.Data;");
     writer.WriteLine("using Microsoft.ML.Runtime.EntryPoints;");
     writer.WriteLine("using Newtonsoft.Json;");
     writer.WriteLine("using System;");
     writer.WriteLine("using System.Linq;");
     writer.WriteLine("using Microsoft.ML.Runtime.CommandLine;");
     writer.WriteLineNoTabs();
     writer.WriteLine("namespace Microsoft.ML");
     writer.WriteLine("{");
     writer.Indent();
     writer.WriteLine("namespace Runtime");
     writer.WriteLine("{");
     writer.Indent();
     writer.WriteLine("public sealed partial class Experiment");
     writer.WriteLine("{");
     writer.Indent();
 }
        public static void Initial_write_should_contain_indent()
        {
            var withIndent = new StringWriter();

            using (var indentedWriter = new IndentedTextWriter(withIndent))
            {
                indentedWriter.Indent();
                indentedWriter.Write("x");
            }

            Assert.That(withIndent.ToString(), Is.EqualTo(Indent + "x"));
        }
        public static void Indent_should_not_apply_to_empty_lines_within_value()
        {
            var withIndent = new StringWriter();

            using (var indentedWriter = new IndentedTextWriter(withIndent))
            {
                indentedWriter.Indent();
                indentedWriter.Write("x" + Environment.NewLine + Environment.NewLine + "x");
            }

            Assert.That(withIndent.ToString(), Is.EqualTo(Indent + "x" + Environment.NewLine + Environment.NewLine + Indent + "x"));
        }
        private void GenerateInputOutput(IndentedTextWriter writer, ComponentCatalog.EntryPointInfo entryPointInfo, ComponentCatalog catalog)
        {
            var classAndMethod = CSharpGeneratorUtils.GetEntryPointMetadata(entryPointInfo);

            writer.WriteLine($"namespace Legacy.{classAndMethod.Namespace}");
            writer.WriteLine("{");
            writer.Indent();
            GenerateInput(writer, entryPointInfo, catalog);
            writer.Outdent();
            writer.WriteLine("}");
            writer.WriteLineNoTabs();
        }
예제 #7
0
        public static void GenerateMethod(IndentedTextWriter writer, string className, string defaultNamespace)
        {
            var inputOuputClassName = defaultNamespace + className;

            writer.WriteLine($"public {inputOuputClassName}.Output Add({inputOuputClassName} input)");
            writer.WriteLine("{");
            writer.Indent();
            writer.WriteLine($"var output = new {inputOuputClassName}.Output();");
            writer.WriteLine("Add(input, output);");
            writer.WriteLine("return output;");
            writer.Outdent();
            writer.WriteLine("}");
            writer.WriteLineNoTabs();
            writer.WriteLine($"public void Add({inputOuputClassName} input, {inputOuputClassName}.Output output)");
            writer.WriteLine("{");
            writer.Indent();
            writer.WriteLine($"_jsonNodes.Add(Serialize(\"{className}\", input, output));");
            writer.Outdent();
            writer.WriteLine("}");
            writer.WriteLineNoTabs();
        }
        private Type GenerateManyToOneColumn(IndentedTextWriter writer, string className, Type columnType,
                                             System.Reflection.FieldInfo fieldInfo, ArgumentAttribute inputAttr, Type type, bool isArray)
        {
            var fieldName = CSharpGeneratorUtils.Capitalize(inputAttr.Name ?? fieldInfo.Name);
            var apiName   = _generatedClasses.GetApiName(type, "");

            writer.WriteLine($"public {className}()");
            writer.WriteLine("{");
            writer.WriteLine("}");
            writer.WriteLine("");
            writer.WriteLine($"public {className}(string output{fieldName}, params string[] input{fieldName}s)");
            writer.WriteLine("{");
            writer.Indent();
            writer.WriteLine($"Add{fieldName}(output{fieldName}, input{fieldName}s);");
            writer.Outdent();
            writer.WriteLine("}");
            writer.WriteLine("");
            writer.WriteLine($"public void Add{fieldName}(string name, params string[] source)");
            writer.WriteLine("{");
            writer.Indent();
            if (isArray)
            {
                writer.WriteLine($"var list = {fieldName} == null ? new List<{apiName}>() : new List<{apiName}>({fieldName});");
                writer.WriteLine($"list.Add(ManyToOneColumn<{apiName}>.Create(name, source));");
                writer.WriteLine($"{fieldName} = list.ToArray();");
            }
            else
            {
                writer.WriteLine($"{fieldName} = ManyToOneColumn<{apiName}>.Create(name, source);");
            }
            writer.Outdent();
            writer.WriteLine("}");
            writer.WriteLineNoTabs();

            Contracts.Assert(columnType == null);

            columnType = type;
            return(columnType);
        }
예제 #9
0
 public static IndentedTextWriter WithIndent(this IndentedTextWriter writer, Action action, int indent = 1)
 {
     if (indent == 0)
     {
         action.Invoke();
     }
     else
     {
         using (writer.Indent(indent))
             action.Invoke();
     }
     return(writer);
 }
예제 #10
0
        public void IndentIndentsText()
        {
            // Arrange
            var baseWriter = new StringWriter();
            var writer     = new IndentedTextWriter(baseWriter, 4);

            // Act
            using (writer.Indent())
            {
                writer.Write("asdf");
            }

            // Assert
            baseWriter.ToString().Should().Be("    asdf");
        }
예제 #11
0
        public static void AppendHistogram(this IndentedTextWriter writer,
                                           string title, double[] data, string unit,
                                           string format        = "0.####",
                                           double[] percentiles = null)
        {
            percentiles = percentiles ?? DefaultPercentiles;

            IndentedTextWriter AppendLine(string s) => writer.AppendLine(s);
            IndentedTextWriter AppendMetric(string name, double value) => writer.AppendMetric(name, value, unit);

            using (writer.Section($"{title}")) {
                if (data.Length == 0)
                {
                    AppendLine("No data.");
                    return;
                }

                AppendLine("Min .. Max:");
                using (writer.Indent()) {
                    AppendMetric("Min", data.Min());
                    AppendMetric("Avg", data.Average());
                    AppendMetric("Max", data.Max());
                }
                if (percentiles.Length > 0)
                {
                    AppendLine("Percentiles:");
                    using (writer.Indent()) {
                        var maxIndex = data.Length - 1;
                        foreach (var p in percentiles)
                        {
                            AppendMetric($"{p:#.##}%", data[(int)(maxIndex * p / 100)]);
                        }
                    }
                }
            }
        }
        public void Generate(IEnumerable <HelpCommand.Component> infos)
        {
            var catalog = _host.ComponentCatalog;

            using (var sw = new StreamWriter(_csFilename))
            {
                var writer = new IndentedTextWriter(sw, "    ");

                // Generate header
                CSharpGeneratorUtils.GenerateHeader(writer);

                foreach (var entryPointInfo in catalog.AllEntryPoints().Where(x => !_excludedSet.Contains(x.Name)).OrderBy(x => x.Name))
                {
                    // Generate method
                    CSharpGeneratorUtils.GenerateMethod(writer, entryPointInfo.Name, _defaultNamespace);
                }

                // Generate footer
                CSharpGeneratorUtils.GenerateFooter(writer);
                CSharpGeneratorUtils.GenerateFooter(writer);

                foreach (var entryPointInfo in catalog.AllEntryPoints().Where(x => !_excludedSet.Contains(x.Name)).OrderBy(x => x.Name))
                {
                    // Generate input and output classes
                    GenerateInputOutput(writer, entryPointInfo, catalog);
                }

                writer.WriteLine("namespace Runtime");
                writer.WriteLine("{");
                writer.Indent();

                foreach (var kind in catalog.GetAllComponentKinds())
                {
                    // Generate kind base class
                    GenerateComponentKind(writer, kind);

                    foreach (var component in catalog.GetAllComponents(kind))
                    {
                        // Generate component
                        GenerateComponent(writer, component, catalog);
                    }
                }

                CSharpGeneratorUtils.GenerateFooter(writer);
                CSharpGeneratorUtils.GenerateFooter(writer);
                writer.WriteLine("#pragma warning restore");
            }
        }
예제 #13
0
 private void GenerateComponent(IndentedTextWriter writer, ComponentCatalog.ComponentInfo component, ComponentCatalog catalog)
 {
     GenerateEnums(writer, component.ArgumentType, "Runtime");
     writer.WriteLineNoTabs();
     GenerateClasses(writer, component.ArgumentType, catalog, "Runtime");
     writer.WriteLineNoTabs();
     CSharpGeneratorUtils.GenerateSummary(writer, component.Description);
     writer.WriteLine($"public sealed class {CSharpGeneratorUtils.GetComponentName(component)} : {component.Kind}");
     writer.WriteLine("{");
     writer.Indent();
     GenerateInputFields(writer, component.ArgumentType, catalog, "Runtime");
     writer.WriteLine($"internal override string ComponentName => \"{component.Name}\";");
     writer.Outdent();
     writer.WriteLine("}");
     writer.WriteLineNoTabs();
 }
        private void GenerateInput(IndentedTextWriter writer, ComponentCatalog.EntryPointInfo entryPointInfo, ComponentCatalog catalog)
        {
            var    entryPointMetadata = CSharpGeneratorUtils.GetEntryPointMetadata(entryPointInfo);
            string classBase          = "";

            if (entryPointInfo.InputKinds != null)
            {
                classBase += $" : {string.Join(", ", entryPointInfo.InputKinds.Select(CSharpGeneratorUtils.GetCSharpTypeName))}";
                if (entryPointInfo.InputKinds.Any(t => typeof(ITrainerInput).IsAssignableFrom(t) || typeof(ITransformInput).IsAssignableFrom(t)))
                {
                    classBase += ", Microsoft.ML.Legacy.ILearningPipelineItem";
                }
            }

            GenerateEnums(writer, entryPointInfo.InputType, _defaultNamespace + entryPointMetadata.Namespace);
            writer.WriteLineNoTabs();
            GenerateClasses(writer, entryPointInfo.InputType, catalog, _defaultNamespace + entryPointMetadata.Namespace);
            CSharpGeneratorUtils.GenerateSummary(writer, entryPointInfo.Description, entryPointInfo.XmlInclude);

            if (entryPointInfo.ObsoleteAttribute != null)
            {
                writer.WriteLine($"[Obsolete(\"{entryPointInfo.ObsoleteAttribute.Message}\")]");
            }
            else
            {
                writer.WriteLine("[Obsolete]");
            }

            writer.WriteLine($"public sealed partial class {entryPointMetadata.ClassName}{classBase}");
            writer.WriteLine("{");
            writer.Indent();
            writer.WriteLineNoTabs();
            if (entryPointInfo.InputKinds != null && entryPointInfo.InputKinds.Any(t => typeof(Legacy.ILearningPipelineLoader).IsAssignableFrom(t)))
            {
                CSharpGeneratorUtils.GenerateLoaderAddInputMethod(writer, entryPointMetadata.ClassName);
            }

            GenerateColumnAddMethods(writer, entryPointInfo.InputType, catalog, entryPointMetadata.ClassName, out Type transformType);
            writer.WriteLineNoTabs();
            GenerateInputFields(writer, entryPointInfo.InputType, catalog, _defaultNamespace + entryPointMetadata.Namespace);
            writer.WriteLineNoTabs();

            GenerateOutput(writer, entryPointInfo, out HashSet <string> outputVariableNames);
            GenerateApplyFunction(writer, entryPointMetadata.ClassName, transformType, outputVariableNames, entryPointInfo.InputKinds);
            writer.Outdent();
            writer.WriteLine("}");
        }
예제 #15
0
 private static string GetString(ExpandoObject obj, ISet <object> seenObjects)
 {
     if (obj.Any())
     {
         var stringWriter = new StringWriter();
         var writer       = new IndentedTextWriter(stringWriter);
         writer.WriteLine("{");
         using (writer.Indent())
         {
             writer.WriteLine(string.Join("," + writer.NewLine, obj.Select(kv => $"{kv.Key}: {GetString(() => kv.Value, seenObjects)}")));
         }
         writer.Write("}");
         return(stringWriter.ToString());
     }
     else
     {
         return("{}");
     }
 }
예제 #16
0
        private static string GetString(IEnumerable obj, ISet <object> seenObjects)
        {
            var items = obj.Cast <object?>().ToList();

            if (items.Any())
            {
                var stringWriter = new StringWriter();
                var writer       = new IndentedTextWriter(stringWriter);
                writer.WriteLine("[");
                using (writer.Indent())
                {
                    writer.WriteLine(string.Join("," + writer.NewLine, items.Select(v => GetString(() => v, seenObjects))));
                }
                writer.Write("]");
                return(stringWriter.ToString());
            }
            else
            {
                return("[]");
            }
        }
        private void GenerateOutput(IndentedTextWriter writer, ComponentCatalog.EntryPointInfo entryPointInfo, out HashSet <string> outputVariableNames)
        {
            outputVariableNames = new HashSet <string>();
            string classBase = "";

            if (entryPointInfo.OutputKinds != null)
            {
                classBase = $" : {string.Join(", ", entryPointInfo.OutputKinds.Select(CSharpGeneratorUtils.GetCSharpTypeName))}";
            }
            writer.WriteLine("[Obsolete]");
            writer.WriteLine($"public sealed class Output{classBase}");
            writer.WriteLine("{");
            writer.Indent();

            var outputType = entryPointInfo.OutputType;

            if (outputType.IsGenericType && outputType.GetGenericTypeDefinition() == typeof(CommonOutputs.MacroOutput <>))
            {
                outputType = outputType.GetGenericTypeArgumentsEx()[0];
            }
            foreach (var fieldInfo in outputType.GetFields())
            {
                var outputAttr = fieldInfo.GetCustomAttributes(typeof(TlcModule.OutputAttribute), false)
                                 .FirstOrDefault() as TlcModule.OutputAttribute;
                if (outputAttr == null)
                {
                    continue;
                }

                CSharpGeneratorUtils.GenerateSummary(writer, outputAttr.Desc);
                var outputTypeString = CSharpGeneratorUtils.GetOutputType(fieldInfo.FieldType);
                outputVariableNames.Add(CSharpGeneratorUtils.Capitalize(outputAttr.Name ?? fieldInfo.Name));
                writer.WriteLine($"public {outputTypeString} {CSharpGeneratorUtils.Capitalize(outputAttr.Name ?? fieldInfo.Name)} {{ get; set; }} = new {outputTypeString}();");
                writer.WriteLineNoTabs();
            }

            writer.Outdent();
            writer.WriteLine("}");
        }
예제 #18
0
        private static string GetString(object obj, ISet <object> seenObjects)
        {
            var type       = obj.GetType();
            var properties = type.GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance);

            if (properties.Any())
            {
                var stringWriter = new StringWriter();
                var writer       = new IndentedTextWriter(stringWriter);
                writer.WriteLine($"{type.FullName} {{");
                using (writer.Indent())
                {
                    writer.WriteLine(string.Join("," + writer.NewLine, properties.Select(prop => $"{prop.Name}: {GetString(() => prop.GetValue(obj), seenObjects)}")));
                }
                writer.Write("}");
                return(stringWriter.ToString());
            }
            else
            {
                return(obj.ToString() ?? type.FullName ?? string.Empty);
            }
        }
예제 #19
0
        public void Run(Options options)
        {
            // Applying options
            if (!string.IsNullOrEmpty(options.GCLatencyMode))
            {
                GCSettings.LatencyMode = Enum.Parse <GCLatencyMode>(options.GCLatencyMode);
            }
            if (options.Duration.HasValue)
            {
                BurnTester.DefaultDuration = TimeSpan.FromSeconds(options.Duration.Value);
            }
            BurnTester.DefaultMaxSize = ArgumentHelper.ParseRelativeValue(
                options.MaxSize, BurnTester.DefaultMaxSize, true);
            ParallelRunner.ThreadCount = (int)ArgumentHelper.ParseRelativeValue(
                options.ThreadCount, ParallelRunner.ThreadCount, true);
            var tests           = options.Tests?.ToLowerInvariant() ?? "";
            var ramSizeGb       = HardwareInfo.GetRamSize() ?? 4;
            var staticSetSizeGb = 0;

            if (!string.IsNullOrEmpty(options.StaticSetSize))
            {
                tests          += "b";
                staticSetSizeGb = (int)ArgumentHelper.ParseRelativeValue(options.StaticSetSize, ramSizeGb, true);
            }
            var outputMode = options.OutputMode ?? "f";

            if (outputMode == "f")
            {
                // Dumping environment info
                Writer.AppendValue("Launch parameters", string.Join(" ", Environment.GetCommandLineArgs().Skip(1)));
                using (Writer.Section("Software:")) {
                    Writer.AppendValue("Runtime", ".NET Core");
                    using (Writer.Indent()) {
                        Writer.AppendValue("Version", RuntimeInformation.FrameworkDescription);
                        Writer.AppendValue("GC mode", GCInfo.GetGCMode());
                    }

                    Writer.AppendValue("OS",
                                       $"{RuntimeInformation.OSDescription.Trim()} ({RuntimeInformation.OSArchitecture})");
                }

                using (Writer.Section("Hardware:")) {
                    var coreCountAddon = ParallelRunner.ThreadCount != Environment.ProcessorCount
                        ? $", {ParallelRunner.ThreadCount} used by test"
                        : "";
                    Writer.AppendValue("CPU", HardwareInfo.GetCpuModelName());
                    Writer.AppendValue("CPU core count", $"{Environment.ProcessorCount}{coreCountAddon}");
                    Writer.AppendValue("RAM size", $"{ramSizeGb:N0} GB");
                }
                Writer.AppendLine();
            }

            RunWarmup();

            if (tests == "")
            {
                RunSpeedTest();
                RunBurnTest("--- Stateless server (no static set) ---", 0);
                RunBurnTest("--- Worker / typical server (static set = 20% RAM) ---", (long)(ramSizeGb * Sizes.GB / 5));
                RunBurnTest("--- Caching / compute server (static set = 50% RAM) ---", (long)(ramSizeGb * Sizes.GB / 2));
                return;
            }

            if (tests.Contains("a"))
            {
                RunSpeedTest();
            }
            if (tests.Contains("b"))
            {
                var title = $"--- Static set = {staticSetSizeGb} GB ({staticSetSizeGb * 100.0 / ramSizeGb:0.##} % RAM) ---";
                RunBurnTest(title, (long)(staticSetSizeGb * Sizes.GB));
            }
        }
        private static void GenerateApplyFunction(IndentedTextWriter writer, string className, Type type,
                                                  HashSet <string> outputVariableNames, Type[] inputKinds)
        {
            if (inputKinds == null)
            {
                return;
            }

            bool isTransform  = false;
            bool isCalibrator = false;

            if (inputKinds.Any(t => typeof(ITransformInput).IsAssignableFrom(t)))
            {
                isTransform = true;
            }
            else if (!inputKinds.Any(t => typeof(ITrainerInput).IsAssignableFrom(t)))
            {
                return;
            }

            if (inputKinds.Any(t => typeof(ICalibratorInput).IsAssignableFrom(t)))
            {
                isCalibrator = true;
            }

            writer.WriteLine("[Obsolete]");
            if (isTransform)
            {
                writer.WriteLine("public Var<IDataView> GetInputData() => Data;");
            }
            else
            {
                writer.WriteLine("public Var<IDataView> GetInputData() => TrainingData;");
            }

            writer.WriteLine("");
            writer.WriteLine("[Obsolete]");
            writer.WriteLine("public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Experiment experiment)");
            writer.WriteLine("{");

            writer.Indent();
            writer.WriteLine("if (previousStep != null)");
            writer.WriteLine("{");
            writer.Indent();
            writer.WriteLine("if (!(previousStep is ILearningPipelineDataStep dataStep))");
            writer.WriteLine("{");
            writer.Indent();
            writer.WriteLine("throw new InvalidOperationException($\"{ nameof(" + className + ")} only supports an { nameof(ILearningPipelineDataStep)} as an input.\");");
            writer.Outdent();
            writer.WriteLine("}");
            writer.WriteLineNoTabs();

            if (isTransform)
            {
                writer.WriteLine("Data = dataStep.Data;");
            }
            else
            {
                writer.WriteLine("TrainingData = dataStep.Data;");
            }

            writer.Outdent();
            writer.WriteLine("}");

            string pipelineStep = $"{className}PipelineStep";

            writer.WriteLine($"Output output = experiment.Add(this);");
            writer.WriteLine($"return new {pipelineStep}(output);");
            writer.Outdent();
            writer.WriteLine("}");

            //Pipeline step.
            writer.WriteLineNoTabs();
            writer.WriteLine("[Obsolete]");
            if (isTransform && !isCalibrator)
            {
                writer.WriteLine($"private class {pipelineStep} : ILearningPipelineDataStep");
            }
            else
            {
                writer.WriteLine($"private class {pipelineStep} : ILearningPipelinePredictorStep");
            }

            writer.WriteLine("{");
            writer.Indent();
            writer.WriteLine("[Obsolete]");
            writer.WriteLine($"public {pipelineStep}(Output output)");
            writer.WriteLine("{");
            writer.Indent();

            if (isTransform && !isCalibrator)
            {
                writer.WriteLine("Data = output.OutputData;");
                if (outputVariableNames.Contains("Model"))
                {
                    writer.WriteLine("Model = output.Model;");
                }
            }
            else
            {
                writer.WriteLine("Model = output.PredictorModel;");
            }

            writer.Outdent();
            writer.WriteLine("}");
            writer.WriteLineNoTabs();

            if (isTransform && !isCalibrator)
            {
                writer.WriteLine("[Obsolete]");
                writer.WriteLine("public Var<IDataView> Data { get; }");
                writer.WriteLine("[Obsolete]");
                writer.WriteLine("public Var<TransformModel> Model { get; }");
            }
            else
            {
                writer.WriteLine("[Obsolete]");
                writer.WriteLine("public Var<PredictorModel> Model { get; }");
            }

            writer.Outdent();
            writer.WriteLine("}");
        }
        private void GenerateClasses(IndentedTextWriter writer, Type inputType, ComponentCatalog catalog, string currentNamespace)
        {
            foreach (var fieldInfo in inputType.GetFields())
            {
                var inputAttr = fieldInfo.GetCustomAttributes(typeof(ArgumentAttribute), false).FirstOrDefault() as ArgumentAttribute;
                if (inputAttr == null || inputAttr.Visibility == ArgumentAttribute.VisibilityType.CmdLineOnly)
                {
                    continue;
                }

                var type = fieldInfo.FieldType;
                type = CSharpGeneratorUtils.ExtractOptionalOrNullableType(type);
                if (type.IsArray)
                {
                    type = type.GetElementType();
                }
                if (type == typeof(JArray) || type == typeof(JObject))
                {
                    continue;
                }
                if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Var <>))
                {
                    continue;
                }
                if (type == typeof(CommonInputs.IEvaluatorInput))
                {
                    continue;
                }
                if (type == typeof(CommonOutputs.IEvaluatorOutput))
                {
                    continue;
                }
                var typeEnum = TlcModule.GetDataType(type);
                if (typeEnum != TlcModule.DataKind.Unknown)
                {
                    continue;
                }

                if (_generatedClasses.IsGenerated(type.FullName))
                {
                    continue;
                }
                GenerateEnums(writer, type, currentNamespace);
                GenerateClasses(writer, type, catalog, currentNamespace);

                var    apiName   = _generatedClasses.GetApiName(type, currentNamespace);
                string classBase = "";
                if (type.IsSubclassOf(typeof(OneToOneColumn)))
                {
                    classBase = $" : OneToOneColumn<{apiName}>, IOneToOneColumn";
                }
                else if (type.IsSubclassOf(typeof(ManyToOneColumn)))
                {
                    classBase = $" : ManyToOneColumn<{apiName}>, IManyToOneColumn";
                }
                writer.WriteLine("[Obsolete]");
                writer.WriteLine($"public sealed partial class {apiName}{classBase}");
                writer.WriteLine("{");
                writer.Indent();
                _generatedClasses.MarkAsGenerated(type.FullName);
                GenerateInputFields(writer, type, catalog, currentNamespace);
                writer.Outdent();
                writer.WriteLine("}");
                writer.WriteLineNoTabs();
            }
        }
예제 #22
0
 public static IDisposable Section(this IndentedTextWriter writer, string title, int indent = 1)
 {
     writer.WriteLine(title);
     return(writer.Indent(indent));
 }
 public Scope(IndentedTextWriter writer)
 {
     _writer = writer;
     _writer.Indent();
 }
        private void GenerateEnums(IndentedTextWriter writer, Type inputType, string currentNamespace)
        {
            foreach (var fieldInfo in inputType.GetFields())
            {
                var inputAttr = fieldInfo.GetCustomAttributes(typeof(ArgumentAttribute), false).FirstOrDefault() as ArgumentAttribute;
                if (inputAttr == null || inputAttr.Visibility == ArgumentAttribute.VisibilityType.CmdLineOnly)
                {
                    continue;
                }
                var type = CSharpGeneratorUtils.ExtractOptionalOrNullableType(fieldInfo.FieldType);
                if (_generatedClasses.IsGenerated(type.FullName))
                {
                    continue;
                }

                if (!type.IsEnum)
                {
                    var typeEnum = TlcModule.GetDataType(type);
                    if (typeEnum == TlcModule.DataKind.Unknown)
                    {
                        GenerateEnums(writer, type, currentNamespace);
                    }
                    continue;
                }

                var enumType = Enum.GetUnderlyingType(type);

                writer.WriteLine("[Obsolete]");
                var apiName = _generatedClasses.GetApiName(type, currentNamespace);
                if (enumType == typeof(int))
                {
                    writer.WriteLine($"public enum {apiName}");
                }
                else
                {
                    Contracts.Assert(enumType == typeof(byte));
                    writer.WriteLine($"public enum {apiName} : byte");
                }

                _generatedClasses.MarkAsGenerated(type.FullName);
                writer.WriteLine("{");
                writer.Indent();
                var names  = Enum.GetNames(type);
                var values = Enum.GetValues(type);
                var lines  = new List <string>();
                for (int i = 0; i < names.Length; i++)
                {
                    var name = names[i];
                    if (type.GetField(name).GetCustomAttribute <HideEnumValueAttribute>() != null)
                    {
                        continue;
                    }
                    var value = values.GetValue(i);
                    if (enumType == typeof(int))
                    {
                        lines.Add($"{name} = {(int)value}");
                    }
                    else
                    {
                        Contracts.Assert(enumType == typeof(byte));
                        lines.Add($"{name} = {(byte)value}");
                    }
                }
                for (int i = 0; i < lines.Count - 1; i++)
                {
                    writer.WriteLine($"{lines[i]},");
                }
                writer.WriteLine($"{lines[lines.Count-1]}");
                writer.Outdent();
                writer.WriteLine("}");
                writer.WriteLineNoTabs();
            }
        }