public RawColInfo(string name, string source, HiddenColumnOption hid)
                {
                    Contracts.AssertNonEmpty(name);
                    Contracts.AssertNonEmpty(source);
                    Contracts.Assert(Enum.IsDefined(typeof(HiddenColumnOption), hid));

                    Name   = name;
                    Source = source;
                    Hid    = hid;
                }
        /// <summary>
        /// Backwards compatibility helper function to convert the HiddenColumnOption to a boolean.
        /// </summary>
        private static bool GetHiddenOption(IHostEnvironment env, HiddenColumnOption option)
        {
            switch (option)
            {
            case HiddenColumnOption.Keep:
                return(true);

            case HiddenColumnOption.Drop:
                return(false);

            default:
                throw env.Except("Unsupported hide option specified");
            }
        }
            public Bindings(Arguments args, ISchema schemaInput)
            {
                Contracts.AssertValue(args);
                Contracts.AssertValue(schemaInput);

                Input = schemaInput;

                Contracts.Check(Enum.IsDefined(typeof(HiddenColumnOption), args.Hidden), "hidden");
                HidDefault = args.Hidden;

                RawInfos = new RawColInfo[Utils.Size(args.Column)];
                if (RawInfos.Length > 0)
                {
                    var names = new HashSet <string>();
                    for (int i = 0; i < RawInfos.Length; i++)
                    {
                        var    item = args.Column[i];
                        string dst  = item.Name;
                        string src  = item.Source;

                        if (string.IsNullOrWhiteSpace(src))
                        {
                            src = dst;
                        }
                        else if (string.IsNullOrWhiteSpace(dst))
                        {
                            dst = src;
                        }
                        Contracts.CheckUserArg(!string.IsNullOrWhiteSpace(dst), nameof(Column.Name));

                        if (!names.Add(dst))
                        {
                            throw Contracts.ExceptUserArg(nameof(args.Column), "New column '{0}' specified multiple times", dst);
                        }

                        var hid = item.Hidden ?? args.Hidden;
                        Contracts.CheckUserArg(Enum.IsDefined(typeof(HiddenColumnOption), hid), nameof(args.Hidden));

                        RawInfos[i] = new RawColInfo(dst, src, hid);
                    }
                }

                BuildInfos(out Infos, out NameToInfoIndex, user: true);
                AsSchema = Schema.Create(this);
            }
        /// <summary>
        /// Backwards compatibility helper function that loads a Choose Column Transform.
        /// </summary>
        private static SelectColumnsTransform LoadChooseColumnsTransform(IHostEnvironment env, ModelLoadContext ctx, IDataView input)
        {
            // *** Binary format ***
            // int: sizeof(Float)
            // bindings
            int    cbFloat = ctx.Reader.ReadInt32();
            string renameNotSupportedMsg = "Rename for ChooseColumns is not backwards compatible with the SelectColumnsTranform";
            string differentHideColumnNotSupportedMsg = "Setting a hide option different from default is not compatible with SelectColumnsTransform";
            // *** Binary format ***
            // byte: default HiddenColumnOption value
            // int: number of raw column infos
            // for each raw column info
            //   int: id of output column name
            //   int: id of input column name
            //   byte: HiddenColumnOption
            var hiddenOption = (HiddenColumnOption)ctx.Reader.ReadByte();

            Contracts.Assert(Enum.IsDefined(typeof(HiddenColumnOption), hiddenOption));
            env.Check(HiddenColumnOption.Rename != hiddenOption, renameNotSupportedMsg);
            var keepHidden = GetHiddenOption(env, hiddenOption);

            int count = ctx.Reader.ReadInt32();

            Contracts.CheckDecode(count >= 0);
            var keepHiddenCols = new HiddenColumnOption[count];

            var names = new HashSet <string>();

            for (int colIdx = 0; colIdx < count; ++colIdx)
            {
                string dst = ctx.LoadNonEmptyString();
                Contracts.CheckDecode(names.Add(dst));
                string src = ctx.LoadNonEmptyString();

                var colHiddenOption = (HiddenColumnOption)ctx.Reader.ReadByte();
                Contracts.Assert(Enum.IsDefined(typeof(HiddenColumnOption), colHiddenOption));
                env.Check(colHiddenOption != HiddenColumnOption.Rename, renameNotSupportedMsg);
                var colKeepHidden = GetHiddenOption(env, colHiddenOption);
                env.Check(colKeepHidden == keepHidden, differentHideColumnNotSupportedMsg);
            }

            return(new SelectColumnsTransform(env, names.ToArray(), null, keepHidden));
        }
            public Bindings(ModelLoadContext ctx, ISchema schemaInput)
            {
                Contracts.AssertValue(ctx);
                Contracts.AssertValue(schemaInput);

                Input = schemaInput;

                // *** Binary format ***
                // byte: default HiddenColumnOption value
                // int: number of raw column infos
                // for each raw column info
                //   int: id of output column name
                //   int: id of input column name
                //   byte: HiddenColumnOption
                HidDefault = (HiddenColumnOption)ctx.Reader.ReadByte();
                Contracts.CheckDecode(Enum.IsDefined(typeof(HiddenColumnOption), HidDefault));

                int count = ctx.Reader.ReadInt32();

                Contracts.CheckDecode(count >= 0);

                RawInfos = new RawColInfo[count];
                if (count > 0)
                {
                    var names = new HashSet <string>();
                    for (int i = 0; i < count; i++)
                    {
                        string dst = ctx.LoadNonEmptyString();
                        Contracts.CheckDecode(names.Add(dst));
                        string src = ctx.LoadNonEmptyString();

                        var hid = (HiddenColumnOption)ctx.Reader.ReadByte();
                        Contracts.CheckDecode(Enum.IsDefined(typeof(HiddenColumnOption), hid));
                        RawInfos[i] = new RawColInfo(dst, src, hid);
                    }
                }

                BuildInfos(out Infos, out NameToInfoIndex, user: false);

                AsSchema = Schema.Create(this);
            }