public void Save(ModelSaveContext ctx) { _host.CheckValue(ctx, nameof(ctx)); ctx.CheckAtModel(); ctx.SetVersionInfo(GetVersionInfo()); var dataPipe = _xf; var transforms = new List <IDataTransform>(); while (dataPipe is IDataTransform xf) { transforms.Add(xf); dataPipe = xf.Source; Contracts.AssertValue(dataPipe); } transforms.Reverse(); ctx.SaveSubModel("Loader", c => BinaryLoader.SaveInstance(_host, c, dataPipe.Schema)); ctx.Writer.Write(transforms.Count); for (int i = 0; i < transforms.Count; i++) { var dirName = string.Format(TransformDirTemplate, i); ctx.SaveModel(transforms[i], dirName); } }
void ICanSaveModel.Save(ModelSaveContext ctx) { if (!_allowSave) { throw _host.Except("Saving is not permitted."); } ctx.CheckAtModel(); ctx.SetVersionInfo(GetVersionInfo()); var dataPipe = _xf; var transforms = new List <IDataTransform>(); while (dataPipe is IDataTransform xf) { // REVIEW: a malicious user could construct a loop in the Source chain, that would // cause this method to iterate forever (and throw something when the list overflows). There's // no way to insulate from ALL malicious behavior. transforms.Add(xf); dataPipe = xf.Source; Contracts.AssertValue(dataPipe); } transforms.Reverse(); ctx.SaveSubModel("Loader", c => BinaryLoader.SaveInstance(_host, c, dataPipe.Schema)); ctx.Writer.Write(transforms.Count); for (int i = 0; i < transforms.Count; i++) { var dirName = string.Format(TransformDirTemplate, i); ctx.SaveModel(transforms[i], dirName); } }
/// <summary> /// Save the data pipeline defined by dataPipe. If blankLoader is true or the root IDataView is not an IDataLoader, /// this persists the root as a BinaryLoader having the same schema. /// </summary> public static void SaveDataPipe(IHostEnvironment env, RepositoryWriter repositoryWriter, IDataView dataPipe, bool blankLoader = false) { Contracts.CheckValue(env, nameof(env)); env.CheckValue(repositoryWriter, nameof(repositoryWriter)); env.CheckValue(dataPipe, nameof(dataPipe)); IDataView pipeStart; var xfs = BacktrackPipe(dataPipe, out pipeStart); Action <ModelSaveContext> saveAction; if (!blankLoader && pipeStart is IDataLoader loader) { saveAction = loader.Save; } else { // The serialized pipe must start with a loader. If the original data view is not a loader, // we replace it with a binary loader with the correct schema. saveAction = ctx => BinaryLoader.SaveInstance(env, ctx, pipeStart.Schema); } using (var ctx = ModelFileUtils.GetDataModelSavingContext(repositoryWriter)) { CompositeDataLoader.SavePipe(env, ctx, saveAction, xfs); ctx.Done(); } }