Skip to content

Commit be1dc39

Browse files
committed
Refactor to replace the use of subprocess with module importing
1 parent 6d6e843 commit be1dc39

3 files changed

Lines changed: 76 additions & 66 deletions

File tree

scripts/analyze_experiment.py

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -750,21 +750,23 @@ def diagnose_pso_hyperparameters(runs: List[Dict[str, Any]], experiment_name: st
750750
print("\n" + "=" * 80)
751751

752752

753-
def main() -> None:
753+
def main(experiment: str = None, diagnose_pso: bool | str = None) -> None:
754754
parser = argparse.ArgumentParser(
755755
description="Analyze experiment results and generate visualization figures."
756756
)
757-
parser.add_argument(
758-
"--experiment",
759-
type=str,
760-
required=True,
761-
help="Experiment name: 'cnn-rs', 'dt-ga', 'knn-pso')",
762-
)
763-
parser.add_argument(
764-
"--diagnose-pso",
765-
action="store_true",
766-
help="Run PSO hyperparameter diagnostics",
767-
)
757+
if experiment is None:
758+
parser.add_argument(
759+
"--experiment",
760+
type=str,
761+
required=True,
762+
help="Experiment name: 'cnn-rs', 'dt-ga', 'knn-pso')",
763+
)
764+
if diagnose_pso is None:
765+
parser.add_argument(
766+
"--diagnose-pso",
767+
action="store_true",
768+
help="Run PSO hyperparameter diagnostics",
769+
)
768770

769771
args = parser.parse_args()
770772

scripts/analyze_ga.py

Lines changed: 28 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -8,37 +8,36 @@
88
REPO_ROOT = Path(__file__).resolve().parent.parent
99
sys.path.append(str(REPO_ROOT))
1010

11-
def run_experiment(args):
12-
model, optimizer = args
13-
cmd = [
14-
"uv", "run", # Using 'uv run' to ensure virtual environment is activated
15-
"./scripts/run_experiment.py",
16-
"--model",
17-
model,
18-
"--optimizer",
19-
optimizer,
20-
"--evaluations",
21-
str(20), # LIMIT BUDGET: much less than 50 for quick experiment (comparison)
22-
]
23-
print(f"Running: {' '.join(cmd)}")
24-
result = subprocess.run(cmd)
25-
if result.returncode != 0:
26-
print(f"Command failed: {' '.join(cmd)}")
11+
# Import codefiles
12+
from run_experiment import run_experiment, EVALUATIONS_PER_RUN
13+
from analyze_experiment import main
14+
15+
def ga_comp_run_experiment(model, optimizer):
16+
try:
17+
if optimizer.startswith("ga"): # Only try GA optimizers
18+
run_experiment(
19+
model_key=model,
20+
optimizer_name=optimizer,
21+
num_runs=1,
22+
n_jobs=1,
23+
base_seed=42,
24+
evaluations=EVALUATIONS_PER_RUN
25+
)
26+
except Exception as e:
27+
print(f"Error running experiment for {model} with {optimizer}: {e}")
2728
return False
2829
return True
2930

30-
def analyze_experiment(model, optimizer):
31+
def ga_comp_analyze_experiment(model, optimizer):
3132
experiment_name = f"{model}_{optimizer}_experiment"
32-
cmd = [
33-
"uv", "run", # Using 'uv run' to ensure virtual environment is activated
34-
"./scripts/analyze_experiment.py",
35-
"--experiment-name",
36-
experiment_name
37-
]
38-
print(f"Analyzing by script: {' '.join(cmd)}")
39-
result = subprocess.run(cmd)
40-
if result.returncode != 0:
41-
print(f"Command failed: {' '.join(cmd)}")
33+
try:
34+
if optimizer.startswith("ga"): # Only try GA optimizers
35+
main(
36+
experiment=experiment_name,
37+
diagnose_pso=False
38+
)
39+
except Exception as e:
40+
print(f"Error analyzing experiment for {model} with {optimizer}: {e}")
4241
return False
4342
return True
4443

@@ -79,11 +78,11 @@ def experiment_exists(modelName: str, optimizerName: str) -> bool:
7978
continue
8079

8180
# Run experiment
82-
run_success = run_experiment((model, optimizer))
81+
run_success = ga_comp_run_experiment((model, optimizer))
8382

8483
if run_success:
8584
# Analyze immediately after successful run
86-
analyze_success = analyze_experiment(model, optimizer)
85+
analyze_success = ga_comp_analyze_experiment(model, optimizer)
8786
if not analyze_success:
8887
print(f"WARNING: Analysis failed for {model}-{optimizer}")
8988
failed_analyses.append(f"{model}-{optimizer}")

scripts/analyze_ga_parallel_run.py

Lines changed: 34 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -10,35 +10,44 @@
1010
REPO_ROOT = Path(__file__).resolve().parent.parent
1111
sys.path.append(str(REPO_ROOT))
1212

13-
def run_experiment(args):
14-
model, optimizer = args
15-
cmd = [
16-
"uv", "run", # Using 'uv run' to ensure virtual environment is activated
17-
"./scripts/run_experiment.py",
18-
"--model",
19-
model,
20-
"--optimizer",
21-
optimizer
22-
]
23-
print(f"Running: {' '.join(cmd)}")
24-
result = subprocess.run(cmd)
25-
if result.returncode != 0:
26-
print(f"Command failed: {' '.join(cmd)}")
13+
# Import codefiles
14+
from run_experiment import run_experiment, EVALUATIONS_PER_RUN
15+
from analyze_experiment import main
16+
import argparse
17+
18+
def analyze_experiment(experiment_name) -> None:
19+
main(experiment=experiment_name, diagnose_pso=False)
20+
21+
def ga_comp_run_experiment(model, optimizer):
22+
runs = n_jobs = 1
23+
seed = 42
24+
evaluations = EVALUATIONS_PER_RUN
25+
26+
try:
27+
if optimizer.startswith("ga"): # Only try GA optimizers
28+
run_experiment(
29+
model_key=model,
30+
optimizer_name=optimizer,
31+
num_runs=runs,
32+
n_jobs=n_jobs,
33+
base_seed=seed,
34+
evaluations=evaluations
35+
)
36+
except Exception as e:
37+
print(f"Error running experiment for {model} with {optimizer}: {e}")
2738
return False
2839
return True
2940

30-
def analyze_experiment(model, optimizer):
41+
def ga_comp_analyze_experiment(model, optimizer):
3142
experiment_name = f"{model}_{optimizer}_experiment"
32-
cmd = [
33-
"uv", "run", # Using 'uv run' to ensure virtual environment is activated
34-
"./scripts/analyze_experiment.py",
35-
"--experiment-name",
36-
experiment_name
37-
]
38-
print(f"Analyzing by script: {' '.join(cmd)}")
39-
result = subprocess.run(cmd)
40-
if result.returncode != 0:
41-
print(f"Command failed: {' '.join(cmd)}")
43+
44+
try:
45+
if optimizer.startswith("ga"): # Only try GA optimizers
46+
analyze_experiment(
47+
experiment_name=experiment_name
48+
)
49+
except Exception as e:
50+
print(f"Error analyzing experiment for {model} with {optimizer}: {e}")
4251
return False
4352
return True
4453

0 commit comments

Comments
 (0)