dh-cli 0.12.0__tar.gz → 0.12.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {dh_cli-0.12.0 → dh_cli-0.12.2}/PKG-INFO +1 -1
- {dh_cli-0.12.0 → dh_cli-0.12.2}/pyproject.toml +1 -1
- {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/batch/commands/protmpnn.py +10 -2
- {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/batch/commands/rfd3.py +5 -3
- {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/test_rfd3_command.py +16 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/.gitignore +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/LICENSE +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/README.md +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/__init__.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/_identity.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/batch/__init__.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/batch/aws_batch.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/batch/commands/__init__.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/batch/commands/boltz.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/batch/commands/cancel.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/batch/commands/clean.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/batch/commands/disco.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/batch/commands/embed_t5.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/batch/commands/equilibrator.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/batch/commands/esmfold2.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/batch/commands/finalize.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/batch/commands/list_jobs.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/batch/commands/local.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/batch/commands/logs.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/batch/commands/orca.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/batch/commands/protmpnn_to_boltz.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/batch/commands/retry.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/batch/commands/status.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/batch/commands/submit.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/batch/commands/wait_for.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/batch/fasta_utils.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/batch/h5_utils.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/batch/job_id.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/batch/manifest.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/batch/s3_transport.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/bedrock/__init__.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/bedrock/commands.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/bedrock/cost_report.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/bedrock/pricing.yaml +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/cloud_commands.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/codeartifact.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/engines_studios/__init__.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/engines_studios/api_client.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/engines_studios/auth.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/engines_studios/engine_commands.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/engines_studios/progress.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/engines_studios/ssh_config.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/engines_studios/studio_commands.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/github_commands.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/hz/__init__.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/hz/deploy.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/hz/local.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/hz/test.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/hz/tf.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/hz/users.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/main.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/utility_commands.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/warehouse.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/batch/__init__.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/batch/test_aws_batch_resources.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/batch/test_image_override.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/batch/test_no_train_command.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/batch/test_submit_cpu_only.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/batch/test_submit_image_validation.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/batch/test_submit_merge.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/batch/test_submit_mlflow_env.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/bedrock/conftest.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/bedrock/fixtures/A_cache_write.json +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/bedrock/fixtures/B_cache_read.json +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/bedrock/fixtures/C_plain.json +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/bedrock/fixtures/D_cursor_user.json +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/bedrock/fixtures/E_service_role.json +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/bedrock/fixtures/F_legacy_shared.json +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/bedrock/fixtures/G_unknown_model.json +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/bedrock/test_build_report.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/bedrock/test_classify_arn.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/bedrock/test_cli_exit_codes.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/bedrock/test_cost_calc.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/bedrock/test_cost_command.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/bedrock/test_cur_reconciliation.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/bedrock/test_key_command.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/bedrock/test_render_formats.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/bedrock/test_resolve_base_model.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/bedrock/test_rotate.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/bedrock/test_s3_walker.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/github/__init__.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/github/conftest.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/github/test_engine_role_cannot_read_github_pat.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/github/test_identity.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/github/test_login.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/github/test_login_error_paths.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/github/test_login_security.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/github/test_logout.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/github/test_rotate.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/github/test_status.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/hz/test_init.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/hz/test_suites.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/hz/test_users.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/test_cloud_gcp.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/test_disco_command.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/test_disco_jobdef.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/test_equilibrator_command.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/test_esmfold2_cli.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/test_finalize_boltz_tar.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/test_finalize_disco.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/test_finalize_disco_dispatch.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/test_finalize_equilibrator.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/test_finalize_esmfold2.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/test_finalize_protmpnn.py +0 -0
- {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/test_finalize_rfd3.py +0 -0
|
@@ -71,6 +71,11 @@ DEFAULT_IMAGE_URI = "074735440724.dkr.ecr.us-east-1.amazonaws.com/dayhoff:protmp
|
|
|
71
71
|
is_flag=True,
|
|
72
72
|
help="Save per-residue log probabilities to scores/ directory",
|
|
73
73
|
)
|
|
74
|
+
@click.option(
|
|
75
|
+
"--image",
|
|
76
|
+
default=None,
|
|
77
|
+
help="Override the container image URI or digest (e.g. repo@sha256:...)",
|
|
78
|
+
)
|
|
74
79
|
def protmpnn(
|
|
75
80
|
input_dir,
|
|
76
81
|
workers,
|
|
@@ -83,6 +88,7 @@ def protmpnn(
|
|
|
83
88
|
after,
|
|
84
89
|
auto_validate_top,
|
|
85
90
|
save_score,
|
|
91
|
+
image,
|
|
86
92
|
):
|
|
87
93
|
"""Design protein sequences with ProtMPNN/LigandMPNN.
|
|
88
94
|
|
|
@@ -136,7 +142,7 @@ def protmpnn(
|
|
|
136
142
|
_run_local_mode(input_path, auto_validate_top, base_path, save_score)
|
|
137
143
|
return
|
|
138
144
|
|
|
139
|
-
_submit_batch_job(input_path, workers, queue, dry_run, base_path, after, auto_validate_top, save_score)
|
|
145
|
+
_submit_batch_job(input_path, workers, queue, dry_run, base_path, after, auto_validate_top, save_score, image)
|
|
140
146
|
|
|
141
147
|
|
|
142
148
|
def _has_local_gpu() -> bool:
|
|
@@ -184,6 +190,7 @@ def _submit_batch_job(
|
|
|
184
190
|
after: tuple[str, ...] = (),
|
|
185
191
|
auto_validate_top: int | None = None,
|
|
186
192
|
save_score: bool = False,
|
|
193
|
+
image: str | None = None,
|
|
187
194
|
):
|
|
188
195
|
"""Submit ProtMPNN job to AWS Batch."""
|
|
189
196
|
click.echo(f"Scanning {input_path} for YAML files...")
|
|
@@ -236,7 +243,7 @@ def _submit_batch_job(
|
|
|
236
243
|
user=job_id.split("-")[0],
|
|
237
244
|
pipeline="protmpnn",
|
|
238
245
|
status=JobStatus.PENDING,
|
|
239
|
-
image_uri=DEFAULT_IMAGE_URI,
|
|
246
|
+
image_uri=image or DEFAULT_IMAGE_URI,
|
|
240
247
|
input=InputConfig(
|
|
241
248
|
source=str(input_path),
|
|
242
249
|
num_sequences=num_files,
|
|
@@ -282,6 +289,7 @@ def _submit_batch_job(
|
|
|
282
289
|
retry_attempts=5,
|
|
283
290
|
depends_on=depends_on,
|
|
284
291
|
share_identifier=get_aws_username(),
|
|
292
|
+
image_override=image,
|
|
285
293
|
)
|
|
286
294
|
|
|
287
295
|
manifest.status = JobStatus.SUBMITTED
|
|
@@ -95,13 +95,13 @@ def rfd3(
|
|
|
95
95
|
input_path = Path(input_dir).resolve()
|
|
96
96
|
|
|
97
97
|
if run_local:
|
|
98
|
-
_run_local_mode(input_path, base_path)
|
|
98
|
+
_run_local_mode(input_path, base_path, num_designs)
|
|
99
99
|
return
|
|
100
100
|
|
|
101
101
|
if not run_remote and not dry_run:
|
|
102
102
|
if _has_local_gpu():
|
|
103
103
|
click.echo("GPU detected — running locally (use --remote to override)")
|
|
104
|
-
_run_local_mode(input_path, base_path)
|
|
104
|
+
_run_local_mode(input_path, base_path, num_designs)
|
|
105
105
|
return
|
|
106
106
|
|
|
107
107
|
_submit_batch_job(input_path, workers, queue, dry_run, base_path, after, num_designs)
|
|
@@ -343,7 +343,7 @@ def _submit_batch_job(
|
|
|
343
343
|
raise SystemExit(1)
|
|
344
344
|
|
|
345
345
|
|
|
346
|
-
def _run_local_mode(input_path: Path, base_path: str = BATCH_JOBS_BASE):
|
|
346
|
+
def _run_local_mode(input_path: Path, base_path: str = BATCH_JOBS_BASE, num_designs: int = 1):
|
|
347
347
|
"""Run RFD3 locally in a Docker container after host-side fast-fail checks."""
|
|
348
348
|
machine = platform.machine()
|
|
349
349
|
if machine not in {"x86_64", "amd64"}:
|
|
@@ -395,6 +395,8 @@ def _run_local_mode(input_path: Path, base_path: str = BATCH_JOBS_BASE):
|
|
|
395
395
|
f"FOUNDRY_CHECKPOINT_DIRS={CHECKPOINT_SUBTREE}",
|
|
396
396
|
"-e",
|
|
397
397
|
f"{OFFLINE_ENV_VAR}=1",
|
|
398
|
+
"-e",
|
|
399
|
+
f"NUM_DESIGNS={num_designs}",
|
|
398
400
|
DEFAULT_IMAGE_URI,
|
|
399
401
|
]
|
|
400
402
|
|
|
@@ -228,6 +228,22 @@ class TestLocalRun:
|
|
|
228
228
|
assert "all" in cmd
|
|
229
229
|
assert rfd3_cmd.DEFAULT_IMAGE_URI in cmd
|
|
230
230
|
|
|
231
|
+
def test_local_passes_num_designs(self, runner, input_dir):
|
|
232
|
+
"""A local run with --num-designs N sets NUM_DESIGNS=N in the docker env."""
|
|
233
|
+
_write_config(input_dir, "design1")
|
|
234
|
+
result, run_mock = _run_local_directly(runner, input_dir, extra_args=["--num-designs", "4"])
|
|
235
|
+
assert result.exit_code == 0, result.output
|
|
236
|
+
cmd = run_mock.call_args[0][0]
|
|
237
|
+
assert "NUM_DESIGNS=4" in cmd
|
|
238
|
+
|
|
239
|
+
def test_local_default_num_designs_is_one(self, runner, input_dir):
|
|
240
|
+
"""With no --num-designs flag, the local run defaults NUM_DESIGNS=1."""
|
|
241
|
+
_write_config(input_dir, "design1")
|
|
242
|
+
result, run_mock = _run_local_directly(runner, input_dir)
|
|
243
|
+
assert result.exit_code == 0, result.output
|
|
244
|
+
cmd = run_mock.call_args[0][0]
|
|
245
|
+
assert "NUM_DESIGNS=1" in cmd
|
|
246
|
+
|
|
231
247
|
|
|
232
248
|
class TestLocalFastFail:
|
|
233
249
|
def test_local_nonx86_fails_fast(self, runner, input_dir):
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|