public static Bindings Create(Arguments args, ISchema input, OptionalColumnTransform parent) { var names = new string[args.Column.Length]; var columnTypes = new ColumnType[args.Column.Length]; var srcCols = new int[args.Column.Length]; for (int i = 0; i < args.Column.Length; i++) { names[i] = args.Column[i]; int col; bool success = input.TryGetColumnIndex(names[i], out col); Contracts.CheckUserArg(success, nameof(args.Column)); columnTypes[i] = input.GetColumnType(col); srcCols[i] = col; } return(new Bindings(parent, columnTypes, srcCols, srcCols, input, input, true, names)); }
public static Bindings Create(IHostEnvironment env, ModelLoadContext ctx, ISchema input, OptionalColumnTransform parent) { Contracts.AssertValue(ctx); Contracts.AssertValue(input); // *** Binary format *** // Schema of the data view containing the optional columns // int: number of added columns // for each added column // int: id of output column name // ColumnType: the type of the column byte[] buffer = null; if (!ctx.TryLoadBinaryStream("Schema.idv", r => buffer = r.ReadByteArray())) { throw env.ExceptDecode(); } BinaryLoader loader = null; var strm = new MemoryStream(buffer, writable: false); loader = new BinaryLoader(env, new BinaryLoader.Arguments(), strm); int size = ctx.Reader.ReadInt32(); Contracts.CheckDecode(size > 0); var saver = new BinarySaver(env, new BinarySaver.Arguments()); var names = new string[size]; var columnTypes = new ColumnType[size]; var srcCols = new int[size]; var srcColsWithOptionalColumn = new int[size]; for (int i = 0; i < size; i++) { names[i] = ctx.LoadNonEmptyString(); columnTypes[i] = saver.LoadTypeDescriptionOrNull(ctx.Reader.BaseStream); int col; bool success = input.TryGetColumnIndex(names[i], out col); srcCols[i] = success ? col : -1; success = loader.Schema.TryGetColumnIndex(names[i], out var colWithOptionalColumn); env.CheckDecode(success); srcColsWithOptionalColumn[i] = colWithOptionalColumn; } return(new Bindings(parent, columnTypes, srcCols, srcColsWithOptionalColumn, input, loader.Schema, false, names)); }