From e8877429f8f3db54f2fe3e38270be1287e373458 Mon Sep 17 00:00:00 2001 From: Antoine Date: Wed, 11 Feb 2026 14:42:07 +0000 Subject: [PATCH] Smart isolation: backup/restore master model before each trial - One-time backup of model files at study start (_model_backup/) - Restore clean state before each trial (files stay in models/, NX refs intact) - If a trial corrupts the model, next trial starts clean - Best of both: NX reference integrity + trial isolation --- .../studies/01_doe_landscape/nx_interface.py | 29 +++++++++++++++++-- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/projects/hydrotech-beam/studies/01_doe_landscape/nx_interface.py b/projects/hydrotech-beam/studies/01_doe_landscape/nx_interface.py index 9e7b0306..eda8163a 100644 --- a/projects/hydrotech-beam/studies/01_doe_landscape/nx_interface.py +++ b/projects/hydrotech-beam/studies/01_doe_landscape/nx_interface.py @@ -159,13 +159,26 @@ class AtomizerNXSolver: self.use_iteration_folders = use_iteration_folders self._iteration = 0 - # Iteration outputs go inside the study folder, not models/ - # study_dir = the directory where run_doe.py lives + # Iteration outputs go inside the study folder self.study_dir = Path(__file__).parent.resolve() self.iterations_dir = self.study_dir / "iterations" self.iterations_dir.mkdir(parents=True, exist_ok=True) logger.info("Iterations dir: %s", self.iterations_dir) + # Create one-time backup of master model files (clean state) + # Restored before each trial to ensure isolation + import shutil + self._backup_dir = self.study_dir / "_model_backup" + if not self._backup_dir.exists(): + logger.info("Creating master model backup at %s", self._backup_dir) + self._backup_dir.mkdir(parents=True) + for ext in ("*.prt", "*.fem", "*.sim"): + for f in model_dir.glob(ext): + shutil.copy2(f, self._backup_dir / f.name) + logger.info("Backed up %d model files", len(list(self._backup_dir.iterdir()))) + else: + logger.info("Using existing model backup at %s", self._backup_dir) + # Find the .sim file sim_files = list(model_dir.glob("*.sim")) if not sim_files: @@ -285,7 +298,17 @@ class AtomizerNXSolver: iter_dir.mkdir(parents=True, exist_ok=True) try: - # Step 1: Solve directly on master model (no file copying) + # Step 0: Restore master model from backup (clean state each trial) + # Files stay in models/ so NX references are intact, but content is fresh + import shutil + restored = 0 + for backup_file in self._backup_dir.iterdir(): + dest = self.model_dir / backup_file.name + shutil.copy2(backup_file, dest) + restored += 1 + logger.info("Restored %d model files from backup", restored) + + # Step 1: Solve directly on master model # NX file references stay intact — expressions updated in-place by journal sim_file = self.sim_file prt_file = self.prt_file