public override SchemaShape GetOutputSchema(SchemaShape inputSchema) { var addedCols = DataViewConstructionUtils.GetSchemaColumns(Transformer.AddedSchema); var addedSchemaShape = SchemaShape.Create(SchemaBuilder.MakeSchema(addedCols)); var result = inputSchema.Columns.ToDictionary(x => x.Name); var inputDef = InternalSchemaDefinition.Create(typeof(TSrc), Transformer.InputSchemaDefinition); foreach (var col in inputDef.Columns) { if (!result.TryGetValue(col.ColumnName, out var column)) { throw Contracts.ExceptSchemaMismatch(nameof(inputSchema), "input", col.ColumnName); } SchemaShape.GetColumnTypeShape(col.ColumnType, out var vecKind, out var itemType, out var isKey); // Special treatment for vectors: if we expect variable vector, we also allow fixed-size vector. if (itemType != column.ItemType || isKey != column.IsKey || vecKind == SchemaShape.Column.VectorKind.Scalar && column.Kind != SchemaShape.Column.VectorKind.Scalar || vecKind == SchemaShape.Column.VectorKind.Vector && column.Kind != SchemaShape.Column.VectorKind.Vector || vecKind == SchemaShape.Column.VectorKind.VariableVector && column.Kind == SchemaShape.Column.VectorKind.Scalar) { throw Contracts.ExceptSchemaMismatch(nameof(inputSchema), "input", col.ColumnName, col.ColumnType.ToString(), column.GetTypeString()); } } foreach (var addedCol in addedSchemaShape.Columns) { result[addedCol.Name] = addedCol; } return(new SchemaShape(result.Values)); }