rc-foundry 0.1.6__py3-none-any.whl → 0.1.9__py3-none-any.whl

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.
@@ -3,20 +3,62 @@
3
3
  import os
4
4
  from dataclasses import dataclass
5
5
  from pathlib import Path
6
+ from typing import Iterable, List
6
7
 
8
+ import dotenv
7
9
 
8
- def get_default_checkpoint_dir() -> Path:
9
- """Get the default checkpoint directory.
10
+ DEFAULT_CHECKPOINT_DIR = Path.home() / ".foundry" / "checkpoints"
11
+
12
+
13
+ def _normalize_paths(paths: Iterable[Path]) -> list[Path]:
14
+ """Return absolute, deduplicated paths in order."""
15
+ seen = set()
16
+ normalized: List[Path] = []
17
+ for path in paths:
18
+ resolved = path.expanduser().absolute()
19
+ if resolved not in seen:
20
+ normalized.append(resolved)
21
+ seen.add(resolved)
22
+ return normalized
10
23
 
11
- Priority:
12
- 1. FOUNDRY_CHECKPOINTS_DIR environment variable
13
- 2. ~/.foundry/checkpoints
24
+
25
+ def get_default_checkpoint_dirs() -> list[Path]:
26
+ """Return checkpoint search paths.
27
+
28
+ Always starts with the default ~/.foundry/checkpoints directory and then
29
+ appends any additional directories from the colon-separated
30
+ FOUNDRY_CHECKPOINT_DIRS environment variable.
14
31
  """
15
- if "FOUNDRY_CHECKPOINTS_DIR" in os.environ and os.environ.get(
16
- "FOUNDRY_CHECKPOINTS_DIR"
17
- ):
18
- return Path(os.environ["FOUNDRY_CHECKPOINTS_DIR"]).absolute()
19
- return Path.home() / ".foundry" / "checkpoints"
32
+ env_dirs = os.environ.get("FOUNDRY_CHECKPOINT_DIRS", "")
33
+
34
+ # For backward compatibility, also check FOUNDRY_CHECKPOINTS_DIR
35
+ if not env_dirs:
36
+ env_dirs = os.environ.get("FOUNDRY_CHECKPOINTS_DIR", "")
37
+
38
+ extra_dirs: list[Path] = []
39
+ if env_dirs:
40
+ extra_dirs = [Path(p.strip()) for p in env_dirs.split(":") if p.strip()]
41
+ return _normalize_paths([*extra_dirs, DEFAULT_CHECKPOINT_DIR])
42
+
43
+
44
+ def get_default_checkpoint_dir() -> Path:
45
+ """Backward-compatible helper returning the primary checkpoint directory."""
46
+ return get_default_checkpoint_dirs()[0]
47
+
48
+
49
+ def append_checkpoint_to_env(checkpoint_dirs: list[Path]) -> bool:
50
+ dotenv_path = dotenv.find_dotenv()
51
+ if dotenv_path:
52
+ checkpoint_dirs = _normalize_paths(checkpoint_dirs)
53
+ dotenv.set_key(
54
+ dotenv_path=dotenv_path,
55
+ key_to_set="FOUNDRY_CHECKPOINT_DIRS",
56
+ value_to_set=":".join(str(path) for path in checkpoint_dirs),
57
+ export=False,
58
+ )
59
+ return True
60
+ else:
61
+ return False
20
62
 
21
63
 
22
64
  @dataclass
@@ -27,7 +69,12 @@ class RegisteredCheckpoint:
27
69
  sha256: None = None # Optional: add checksum for verification
28
70
 
29
71
  def get_default_path(self):
30
- return get_default_checkpoint_dir() / self.filename
72
+ checkpoint_dirs = get_default_checkpoint_dirs()
73
+ for checkpoint_dir in checkpoint_dirs:
74
+ candidate = checkpoint_dir / self.filename
75
+ if candidate.exists():
76
+ return candidate
77
+ return checkpoint_dirs[0] / self.filename
31
78
 
32
79
 
33
80
  REGISTERED_CHECKPOINTS = {
@@ -18,14 +18,19 @@ def weighted_rigid_align(
18
18
  Returns:
19
19
  X_align_L: [B, L, 3]
20
20
  """
21
- assert X_L.shape == X_gt_L.shape
22
- assert X_L.shape[:-1] == w_L.shape
23
21
 
22
+ # Canonicalize dimensions
23
+ if X_L.ndim == 2:
24
+ X_L = X_L[None]
25
+ if X_gt_L.ndim == 2:
26
+ X_gt_L = X_gt_L[None]
24
27
  if X_exists_L is None:
25
28
  X_exists_L = torch.ones((X_L.shape[-2]), dtype=torch.bool)
26
29
  if w_L is None:
27
30
  w_L = torch.ones_like(X_L[..., 0])
28
31
  else:
32
+ if w_L.ndim == 1:
33
+ w_L = w_L[None]
29
34
  w_L = w_L.to(torch.float32)
30
35
 
31
36
  # Assert `X_exists_L` is a boolean mask
@@ -33,6 +38,9 @@ def weighted_rigid_align(
33
38
  X_exists_L.dtype == torch.bool
34
39
  ), "X_exists_L should be a boolean mask! Otherwise, the alignment will be incorrect (silent failure)!"
35
40
 
41
+ assert X_L.shape == X_gt_L.shape
42
+ assert X_L.shape[:-1] == w_L.shape
43
+
36
44
  X_resolved = X_L[:, X_exists_L]
37
45
  X_gt_resolved = X_gt_L[:, X_exists_L]
38
46
  w_resolved = w_L[:, X_exists_L]
foundry/utils/ddp.py CHANGED
@@ -2,7 +2,7 @@ import logging
2
2
 
3
3
  import torch
4
4
  from beartype.typing import Any
5
- from lightning_fabric.utilities import rank_zero_only
5
+ from lightning.fabric.utilities import rank_zero_only
6
6
  from lightning_utilities.core.rank_zero import rank_prefixed_message
7
7
  from omegaconf import DictConfig
8
8
 
foundry/utils/logging.py CHANGED
@@ -4,7 +4,7 @@ from contextlib import contextmanager
4
4
 
5
5
  import pandas as pd
6
6
  from beartype.typing import Any
7
- from lightning_fabric.utilities import rank_zero_only
7
+ from lightning.fabric.utilities import rank_zero_only
8
8
  from omegaconf import DictConfig, OmegaConf
9
9
  from rich.console import Console
10
10
  from rich.syntax import Syntax
foundry/version.py CHANGED
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
28
28
  commit_id: COMMIT_ID
29
29
  __commit_id__: COMMIT_ID
30
30
 
31
- __version__ = version = '0.1.6'
32
- __version_tuple__ = version_tuple = (0, 1, 6)
31
+ __version__ = version = '0.1.9'
32
+ __version_tuple__ = version_tuple = (0, 1, 9)
33
33
 
34
34
  __commit_id__ = commit_id = None
@@ -6,7 +6,7 @@ from typing import Optional
6
6
  from urllib.request import urlopen
7
7
 
8
8
  import typer
9
- from dotenv import find_dotenv, load_dotenv, set_key
9
+ from dotenv import load_dotenv
10
10
  from rich.console import Console
11
11
  from rich.progress import (
12
12
  BarColumn,
@@ -20,7 +20,8 @@ from rich.progress import (
20
20
 
21
21
  from foundry.inference_engines.checkpoint_registry import (
22
22
  REGISTERED_CHECKPOINTS,
23
- get_default_checkpoint_dir,
23
+ append_checkpoint_to_env,
24
+ get_default_checkpoint_dirs,
24
25
  )
25
26
 
26
27
  load_dotenv(override=True)
@@ -29,6 +30,27 @@ app = typer.Typer(help="Foundry model checkpoint installation utilities")
29
30
  console = Console()
30
31
 
31
32
 
33
+ def _resolve_checkpoint_dirs(checkpoint_dir: Optional[Path]) -> list[Path]:
34
+ """Return checkpoint search path with defaults first."""
35
+ checkpoint_dirs = get_default_checkpoint_dirs()
36
+ if checkpoint_dir is not None:
37
+ resolved = checkpoint_dir.expanduser().absolute()
38
+ if resolved not in checkpoint_dirs:
39
+ checkpoint_dirs.insert(0, resolved)
40
+ else:
41
+ # Move to front
42
+ checkpoint_dirs.remove(resolved)
43
+ checkpoint_dirs.insert(0, resolved)
44
+
45
+ # Try to persist checkpoint dir to .env (optional, may not exist in Colab etc.)
46
+ if append_checkpoint_to_env(checkpoint_dirs):
47
+ console.print(
48
+ f"Tracked checkpoint directories: {':'.join(str(path) for path in checkpoint_dirs)}"
49
+ )
50
+
51
+ return checkpoint_dirs
52
+
53
+
32
54
  def download_file(url: str, dest: Path, verify_hash: Optional[str] = None) -> None:
33
55
  """Download a file with progress bar and optional hash verification.
34
56
 
@@ -123,134 +145,112 @@ def install_model(model_name: str, checkpoint_dir: Path, force: bool = False) ->
123
145
  def install(
124
146
  models: list[str] = typer.Argument(
125
147
  ...,
126
- help="Models to install: 'all', 'rfd3', 'rf3', 'mpnn', or combination",
148
+ help="Models to install: 'all', 'rfd3', 'rf3', 'mpnn', or a combination thereof",
127
149
  ),
128
150
  checkpoint_dir: Optional[Path] = typer.Option(
129
151
  None,
130
152
  "--checkpoint-dir",
131
153
  "-d",
132
- help="Directory to save checkpoints (default: $FOUNDRY_CHECKPOINTS_DIR or ~/.foundry/checkpoints)",
154
+ help="Directory to save checkpoints (default search path: ~/.foundry/checkpoints plus any $FOUNDRY_CHECKPOINT_DIRS entries)",
133
155
  ),
134
156
  force: bool = typer.Option(
135
157
  False, "--force", "-f", help="Overwrite existing checkpoints"
136
158
  ),
137
159
  ):
138
160
  """Install model checkpoints for foundry.
139
-
140
161
  Examples:
141
-
142
162
  foundry install all
143
-
144
163
  foundry install rfd3 rf3
145
-
146
164
  foundry install proteinmpnn --checkpoint-dir ./checkpoints
147
165
  """
148
166
  # Determine checkpoint directory
149
- if checkpoint_dir is None:
150
- checkpoint_dir = get_default_checkpoint_dir()
167
+ checkpoint_dirs = _resolve_checkpoint_dirs(checkpoint_dir)
168
+ primary_checkpoint_dir = checkpoint_dirs[0]
151
169
 
152
- console.print(f"[bold]Checkpoint directory:[/bold] {checkpoint_dir}")
153
- console.print()
170
+ console.print(f"[bold]Install target:[/bold] {primary_checkpoint_dir}\n")
154
171
 
155
172
  # Expand 'all' to all available models
156
173
  if "all" in models:
174
+ models_to_install = list(REGISTERED_CHECKPOINTS.keys())
175
+ elif "base-models" in models:
157
176
  models_to_install = ["rfd3", "proteinmpnn", "ligandmpnn", "rf3"]
158
177
  else:
159
178
  models_to_install = models
160
179
 
161
180
  # Install each model
162
181
  for model_name in models_to_install:
163
- install_model(model_name, checkpoint_dir, force)
182
+ install_model(model_name, primary_checkpoint_dir, force)
164
183
  console.print()
165
184
 
166
- # Try to persist checkpoint dir to .env (optional, may not exist in Colab etc.)
167
- dotenv_path = find_dotenv()
168
- if dotenv_path:
169
- set_key(
170
- dotenv_path=dotenv_path,
171
- key_to_set="FOUNDRY_CHECKPOINTS_DIR",
172
- value_to_set=str(checkpoint_dir),
173
- export=False,
174
- )
175
- console.print(f"Saved FOUNDRY_CHECKPOINTS_DIR to {dotenv_path}")
176
-
177
185
  console.print("[bold green]Installation complete![/bold green]")
178
186
 
179
187
 
180
- @app.command(name="list")
181
- def list_models():
188
+ @app.command(name="list-available")
189
+ def list_available():
182
190
  """List available model checkpoints."""
183
191
  console.print("[bold]Available models:[/bold]\n")
184
192
  for name, info in REGISTERED_CHECKPOINTS.items():
185
193
  console.print(f" [cyan]{name:8}[/cyan] - {info.description}")
186
194
 
187
195
 
188
- @app.command()
189
- def show(
190
- checkpoint_dir: Optional[Path] = typer.Option(
191
- None,
192
- "--checkpoint-dir",
193
- "-d",
194
- help="Checkpoint directory to show",
195
- ),
196
- ):
197
- """Show installed checkpoints."""
198
- if checkpoint_dir is None:
199
- checkpoint_dir = get_default_checkpoint_dir()
196
+ @app.command(name="list-installed")
197
+ def list_installed():
198
+ """List installed checkpoints and their sizes."""
199
+ checkpoint_dirs = _resolve_checkpoint_dirs(None)
200
200
 
201
- if not checkpoint_dir.exists():
202
- console.print(
203
- f"[yellow]No checkpoints directory found at {checkpoint_dir}[/yellow]"
204
- )
205
- raise typer.Exit(0)
201
+ checkpoint_files: list[tuple[Path, float]] = []
202
+ for checkpoint_dir in checkpoint_dirs:
203
+ if not checkpoint_dir.exists():
204
+ continue
205
+ ckpts = list(checkpoint_dir.glob("*.ckpt")) + list(checkpoint_dir.glob("*.pt"))
206
+ for ckpt in ckpts:
207
+ size = ckpt.stat().st_size / (1024**3) # GB
208
+ checkpoint_files.append((ckpt, size))
206
209
 
207
- checkpoint_files = list(checkpoint_dir.glob("*.ckpt"))
208
210
  if not checkpoint_files:
209
- console.print(f"[yellow]No checkpoint files found in {checkpoint_dir}[/yellow]")
211
+ console.print(
212
+ "[yellow]No checkpoint files found in any checkpoint directory[/yellow]"
213
+ )
210
214
  raise typer.Exit(0)
211
215
 
212
- console.print(f"[bold]Installed checkpoints in {checkpoint_dir}:[/bold]\n")
216
+ console.print("[bold]Installed checkpoints:[/bold]\n")
213
217
  total_size = 0
214
- for ckpt in sorted(checkpoint_files):
215
- size = ckpt.stat().st_size / (1024**3) # GB
218
+ for ckpt, size in sorted(checkpoint_files, key=lambda item: str(item[0])):
216
219
  total_size += size
217
- console.print(f" {ckpt.name:30} {size:8.2f} GB")
220
+ console.print(f" {ckpt} {size:8.2f} GB")
218
221
 
219
222
  console.print(f"\n[bold]Total:[/bold] {total_size:.2f} GB")
220
223
 
221
224
 
222
- @app.command()
225
+ @app.command(name="clean")
223
226
  def clean(
224
- checkpoint_dir: Optional[Path] = typer.Option(
225
- None,
226
- "--checkpoint-dir",
227
- "-d",
228
- help="Checkpoint directory to clean",
229
- ),
230
227
  confirm: bool = typer.Option(
231
228
  True, "--confirm/--no-confirm", help="Ask for confirmation before deleting"
232
229
  ),
233
230
  ):
234
231
  """Remove all downloaded checkpoints."""
235
- if checkpoint_dir is None:
236
- checkpoint_dir = get_default_checkpoint_dir()
237
-
238
- if not checkpoint_dir.exists():
239
- console.print(f"[yellow]No checkpoints found at {checkpoint_dir}[/yellow]")
240
- raise typer.Exit(0)
232
+ checkpoint_dirs = _resolve_checkpoint_dirs(None)
241
233
 
242
234
  # List files to delete
243
- checkpoint_files = list(checkpoint_dir.glob("*.ckpt"))
235
+ checkpoint_files: list[Path] = []
236
+ for checkpoint_dir in checkpoint_dirs:
237
+ if not checkpoint_dir.exists():
238
+ continue
239
+ checkpoint_files.extend(checkpoint_dir.glob("*.ckpt"))
240
+ checkpoint_files.extend(checkpoint_dir.glob("*.pt"))
241
+
244
242
  if not checkpoint_files:
245
- console.print(f"[yellow]No checkpoint files found in {checkpoint_dir}[/yellow]")
243
+ console.print(
244
+ "[yellow]No checkpoint files found in any checkpoint directory[/yellow]"
245
+ )
246
246
  raise typer.Exit(0)
247
247
 
248
248
  console.print("[bold]Files to delete:[/bold]")
249
249
  total_size = 0
250
- for ckpt in checkpoint_files:
250
+ for ckpt in sorted(checkpoint_files, key=str):
251
251
  size = ckpt.stat().st_size / (1024**3) # GB
252
252
  total_size += size
253
- console.print(f" {ckpt.name} ({size:.2f} GB)")
253
+ console.print(f" {ckpt} ({size:.2f} GB)")
254
254
 
255
255
  console.print(f"\n[bold]Total:[/bold] {total_size:.2f} GB")
256
256
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: rc-foundry
3
- Version: 0.1.6
3
+ Version: 0.1.9
4
4
  Summary: Shared utilities and training infrastructure for biomolecular structure prediction models.
5
5
  Author-email: Institute for Protein Design <contact@ipd.uw.edu>
6
6
  License: BSD 3-Clause License
@@ -97,40 +97,45 @@ Foundry provides tooling and infrastructure for using and training all classes o
97
97
 
98
98
  All models within Foundry rely on [AtomWorks](https://github.com/RosettaCommons/atomworks) - a unified framework for manipulating and processing biomolecular structures - for both training and inference.
99
99
 
100
+
101
+ > [!NOTE]
102
+ > We have a slack now! Join for updates and to get your questions answered [here](https://join.slack.com/t/proteinmodelfoundry/shared_invite/zt-3kpwru8c6-nrmTW6LNHnSE7h16GNnfLA).
103
+
100
104
  ## Getting Started
101
105
  ### Quickstart guide
102
106
  **Installation**
103
107
  ```bash
104
- pip install rc-foundry[all]
108
+ pip install "rc-foundry[all]"
105
109
  ```
106
110
 
107
- **Downloading weights** All models can be downloaded to a target folder with:
108
-
111
+ **Downloading weights** Models can be downloaded to a target folder with:
109
112
  ```
110
- foundry install all --checkpoint_dir <path/to/ckpt/dir>
113
+ foundry install base-models --checkpoint-dir <path/to/ckpt/dir>
111
114
  ```
112
- This will download all the models supported (including multiple checkpoints of RF3) but as a beginner you can start with:
115
+ where `checkpoint-dir` will be `~/.foundry/checkpoints` by default. Foundry always searches `~/.foundry/checkpoints` plus any colon-separated entries in `$FOUNDRY_CHECKPOINT_DIRS` during inference or subsequent commands to find checkpoints. `base-models` installs the latest RFD3, RF3 and MPNN variants - you can also download all of the models supported (including multiple checkpoints of RF3) with `all`, or by listing the models sequentially (e.g. `foundry install rfd3 rf3 ...`).
116
+ To list the registry of available checkpoints:
113
117
  ```
114
- foundry install rfd3 ligandmpnn rf3 --checkpoint_dir <path/to/ckpt/dir>
118
+ foundry list-available
115
119
  ```
120
+ To check what you already have downloaded (searches `~/.foundry/checkpoints` plus `$FOUNDRY_CHECKPOINT_DIRS` if set):
121
+ ```
122
+ foundry list-installed
123
+ ```
124
+
125
+ >*See `examples/all.ipynb` for how to run each model and design proteins end-to-end in a notebook.*
116
126
 
117
- >*See `examples/all.ipynb` for how to run each model in a notebook.*
127
+ ### Google Colab
128
+ For an interactive Google Colab notebook walking through a basic design pipeline with RFD3, MPNN, and RF3, please see the [IPD Design Pipeline Tutorial](https://colab.research.google.com/drive/1ZwIMV3n9h0ZOnIXX0GyKUuoiahgifBxh?usp=sharing).
118
129
 
119
130
  ### RFdiffusion3 (RFD3)
120
131
 
121
132
  [RFdiffusion3](https://www.biorxiv.org/content/10.1101/2025.09.18.676967v2) is an all-atom generative model capable of designing protein structures under complex constraints.
122
133
 
123
- > *See [models/rfd3/README.md](models/rfd3/README.md) for complete documentation.*
124
-
125
134
  <div align="center">
126
- <img src="models/rfd3/docs/.assets/trajectory.png" alt="RFdiffusion3 generation trajectory." width="700">
135
+ <img src="docs/_static/cover.png" alt="RFdiffusion3 generation trajectory." width="700">
127
136
  </div>
128
137
 
129
- ### ProteinMPNN
130
- [ProteinMPNN](https://www.science.org/doi/10.1126/science.add2187) and [LigandMPNN](https://www.nature.com/articles/s41592-025-02626-1) are lightweight inverse-folding models which can be use to design diverse sequences for backbones under constrained conditions.
131
-
132
- > *See [models/mpnn/README.md](models/mpnn/README.md) for complete documentation.*
133
-
138
+ > *See [models/rfd3/README.md](models/rfd3/README.md) for complete documentation.*
134
139
 
135
140
  ### RosettaFold3 (RF3)
136
141
 
@@ -142,6 +147,11 @@ foundry install rfd3 ligandmpnn rf3 --checkpoint_dir <path/to/ckpt/dir>
142
147
 
143
148
  > *See [models/rf3/README.md](models/rf3/README.md) for complete documentation.*
144
149
 
150
+ ### ProteinMPNN
151
+ [ProteinMPNN](https://www.science.org/doi/10.1126/science.add2187) and [LigandMPNN](https://www.nature.com/articles/s41592-025-02626-1) are lightweight inverse-folding models which can be use to design diverse sequences for backbones under constrained conditions.
152
+
153
+ > *See [models/mpnn/README.md](models/mpnn/README.md) for complete documentation.*
154
+
145
155
  ---
146
156
 
147
157
  ## Development
@@ -159,11 +169,7 @@ foundry install rfd3 ligandmpnn rf3 --checkpoint_dir <path/to/ckpt/dir>
159
169
  Install both `foundry` and models in editable mode for development:
160
170
 
161
171
  ```bash
162
- # Install foundry and RF3 in editable mode
163
- uv pip install -e . -e ./models/rf3 -e ./models/rfd3 -e ./models/mpnn
164
-
165
- # Or install only foundry (no models)
166
- uv pip install -e .
172
+ uv pip install -e '.[all,dev]'
167
173
  ```
168
174
 
169
175
  This approach allows you to:
@@ -171,6 +177,9 @@ This approach allows you to:
171
177
  - Work on specific models without installing all models
172
178
  - Add new models as independent packages in `models/`
173
179
 
180
+ > [!NOTE]
181
+ > Running tests is not currently supported, test files may be missing.
182
+
174
183
  ### Adding New Models
175
184
 
176
185
  To add a new model:
@@ -1,7 +1,7 @@
1
1
  foundry/__init__.py,sha256=H8S1nl5v6YeW8ggn1jKy4GdtH7c-FGS-j7CqUCAEnAU,1926
2
2
  foundry/common.py,sha256=Aur8mH-CNmcUqSsw7VgaCQSW5sH1Bqf8Da91jzxPV1Y,3035
3
3
  foundry/constants.py,sha256=0n1wBKCvNuw3QaQehSbmsHYkIdaGn3tLeRFItBrdeHY,913
4
- foundry/version.py,sha256=riGXiVTWXmtdoju9hVCWvTxpszEMAAIK0sZZWoLKlnU,704
4
+ foundry/version.py,sha256=ib8ckvf-NNDfacXd8unW0p5cf-gl57XyQvjoEMc_pvc,704
5
5
  foundry/callbacks/__init__.py,sha256=VsRT1e4sqlJHPcTCsfupMEx82Iz-LoOAGPpwvf_OJeE,126
6
6
  foundry/callbacks/callback.py,sha256=xZBo_suP4bLrP6gl5uJPbaXm00DXigePa6dMeDxucgg,3890
7
7
  foundry/callbacks/health_logging.py,sha256=tEtkByOlaAA7nnelxb7PbM9_dcIgOsdbxCdQY3K5pMc,16664
@@ -10,7 +10,7 @@ foundry/callbacks/timing_logging.py,sha256=u-r0hKp7fWOY3mLk7CcuIwHgZbhte13m5M09x
10
10
  foundry/callbacks/train_logging.py,sha256=Xs3tmZA88qLxmdSOwt-x8YKN4NKb1kVm59uptNXl4Qo,10399
11
11
  foundry/hydra/resolvers.py,sha256=xyJzo6OeWAc_LOu8RiHhX7_CRNoLZ22626AvYHXYl4U,2186
12
12
  foundry/inference_engines/base.py,sha256=ZHdlmGUqH4-p3v4RdrLH-Ps8_zalr7j5mQ4x-S53N4M,8375
13
- foundry/inference_engines/checkpoint_registry.py,sha256=kt2Z1JhrAjoOiEpkIIQ0sLttie1ceL8OgXUBmmyA6iw,2544
13
+ foundry/inference_engines/checkpoint_registry.py,sha256=c_me8Uz2NWXAaELhQ4bT1HMPfY8XrH67kvCKdDPrD8g,4149
14
14
  foundry/metrics/__init__.py,sha256=qL4wwaiQ7EtR30pmZ9MCknqx909BJcNvHVmNJUaz_WM,236
15
15
  foundry/metrics/losses.py,sha256=2CLUmf7oCdFUCvgJukdNkff0FVG3BlATI-NI60TtpVY,903
16
16
  foundry/metrics/metric.py,sha256=23pKh_Ra0EcHGo5cSzYQQrUGr5zWRxeufKSJ58tfXXo,12687
@@ -22,19 +22,19 @@ foundry/trainers/fabric.py,sha256=cjaTHbGuJEQwaGBvIAXD_il4bHtY-crsTY14Xn77uXA,40
22
22
  foundry/training/EMA.py,sha256=3OWA9Pz7XuDr-SRxbz24tZf55DmhSa2fKy9r5v2IXqA,2651
23
23
  foundry/training/checkpoint.py,sha256=mUiObg-qcF3tvMfVu77sD9m3yVRp71czv07ccliU7qQ,1791
24
24
  foundry/training/schedulers.py,sha256=StmXegPfIdLAv31FreCTrDh9dsOvNUfzG4YGa61Y4oE,3647
25
- foundry/utils/alignment.py,sha256=OAN7H2TqraGxP1uMXUpwLO7g0qS0cxUVjuV33pY16z0,2316
25
+ foundry/utils/alignment.py,sha256=2anqy0mn9zeFEiVWS_EG7zHiyPk1C_gbUu-SRvQ5mAM,2502
26
26
  foundry/utils/components.py,sha256=Piw2TfQF26uuxC3hXG3iv_4rgud1lVO-cv6N-p05EDY,15200
27
27
  foundry/utils/datasets.py,sha256=pLBxVezm-TSrYuC5gFnJZdGnNWV7aPH2QiWIVE2hkdQ,16629
28
- foundry/utils/ddp.py,sha256=ydHrO6peGbRnWAwgH5rmpHuQd55g2gFzzoZJYypn7GU,3970
28
+ foundry/utils/ddp.py,sha256=202_7qqm4ihPjpB5Q9NhUjDl4u22pu5JvY0ui0UkRUQ,3970
29
29
  foundry/utils/instantiators.py,sha256=oGCp6hrmY-QPPPEjxKxe5uVFL125fH1RaLxjMKWCD_8,2169
30
- foundry/utils/logging.py,sha256=jrDgiB_56q_hWDc0jkBFekvqnNWcowJBt4B-S-ipJmM,9312
30
+ foundry/utils/logging.py,sha256=ywV75MBlQsothV0IBvqoAQTNg6pjo2-Cib7Uo080nzQ,9312
31
31
  foundry/utils/rigid.py,sha256=_Z1pmitb6xgxyguLj_TukKscUBJjQsU4bsBD24GVS84,44444
32
32
  foundry/utils/rotation_augmentation.py,sha256=7q1WEX2iJ0i7-2aV-M97nEaEdpqexDTaZn5JquYpkUk,1927
33
33
  foundry/utils/squashfs.py,sha256=QlcwuJyVe-QVfIOS7o1QfLhaCQPNzzox7ln4n8dcYEg,5234
34
34
  foundry/utils/torch.py,sha256=OLsqoxw4CTXbGzWUHernLUT7uQjLu0tVPtD8h8747DI,11211
35
35
  foundry/utils/weights.py,sha256=btz4S02xff2vgiq4xMfiXuhK1ERafqQPtmimo1DmoWY,10381
36
36
  foundry_cli/__init__.py,sha256=0BxY2RUKJLaMXUGgypPCwlTskTEFdVnkhTR4C4ft2Kw,52
37
- foundry_cli/download_checkpoints.py,sha256=UCNdy4VZyJe1PH_lnVLqy-VSMuTu875mGGd99ma7fTQ,8426
37
+ foundry_cli/download_checkpoints.py,sha256=CxU9dKBa1vAkVd450tfH5aZAlQIUTrHsDGTbmxzd_JQ,8922
38
38
  mpnn/__init__.py,sha256=hgQcXFaCbAxFrhydVAy0xj8yC7UJF-GCCFhqD0sZ7I4,57
39
39
  mpnn/inference.py,sha256=wPtGR325eVRVeesXoWtBK6b_-VcU8BZae5IfQN3-mvA,1669
40
40
  mpnn/train.py,sha256=9eQGBd3rdNF5Zr2w8oUgETbqxBavNBajtA6Vbc5zESE,10239
@@ -63,8 +63,8 @@ rf3/__init__.py,sha256=XBb5hF2RqBPHODGRmjiRbfTXgOGfOzdY91GbS4Vex00,70
63
63
  rf3/_version.py,sha256=fCfpbI5aeA6yHqjo3tK78-l2dPGxhp-AyKSoCXp34Nc,739
64
64
  rf3/alignment.py,sha256=BvvwMqQGCVxV20xIsTighD1kXMadXXL2SkckLjTerx0,2102
65
65
  rf3/chemical.py,sha256=VECnRPgVm-icXbZeUG4svcENzdUiIupP6dhka_8zCrg,26572
66
- rf3/cli.py,sha256=dPKJFRHYoV2XS6xc_ZmdLTz6frqa6HZg4qgZU5oJcXU,2356
67
- rf3/inference.py,sha256=_AAJ07AfSeU3xTM2_KH9n_H12EK4qZ23IJuyauOrMaQ,2466
66
+ rf3/cli.py,sha256=jxjq8u77J8itIK4aNTfIpnMsNgg8brW1A3NfVjlgE0s,2743
67
+ rf3/inference.py,sha256=yUjSqCjIqsGErUezq42-8K9570Opm_2eYa-bNnwltwA,2494
68
68
  rf3/kinematics.py,sha256=V3yjalPupu1X2FEp7l3XZR-qzLKrhWLZyECk6RgIkcs,10901
69
69
  rf3/scoring.py,sha256=dTllswE-6Fgli2eLiNzLFc2Rhz4ouDT4WL-sVbvLTGU,41541
70
70
  rf3/train.py,sha256=V4nqCC_1JKLI3WQ-nErNa8sqFpvb1mFhXSe6ZPpEheM,7945
@@ -119,18 +119,18 @@ rfd3/__init__.py,sha256=2Wto2IsUIj2lGag9m_gqgdCwBNl5p21-Xnr7W_RpU3c,348
119
119
  rfd3/callbacks.py,sha256=Zjt8RiaYWquoKOwRmC_wCUbRbov-V4zd2_73zjhgDHE,2783
120
120
  rfd3/cli.py,sha256=ka3K5H117fzDYIDXFpOpJV21w_XBrHYJZdFE0thsGBI,1644
121
121
  rfd3/constants.py,sha256=wLvDzrThpOrK8T3wGFNQeGrhAXOJQze8l3v_7pjIdMM,13141
122
- rfd3/engine.py,sha256=La_dB48Ewz0IdY1ocxvSWg-PXVAsySm0OGvwyz42lI8,20824
123
- rfd3/run_inference.py,sha256=ljzsCKEtrlfAvP0SDFPeQwTM3rV_X3ewHOhcRFVI37c,1258
122
+ rfd3/engine.py,sha256=viXzVGYkHPyzv5d0Ifg8zFZ6Wqg-U4I8Y4ldQLPe9x4,21536
123
+ rfd3/run_inference.py,sha256=HfRMQ30_SAHfc-VFzBV52F-aLaNdG6PW8VkdMyB__wE,1264
124
124
  rfd3/train.py,sha256=rHswffIUhOae3_iYyvAiQ3jALoFuzrcRUgMlbJLinlI,7947
125
- rfd3/inference/datasets.py,sha256=u-2U7deHXu-iOs7doiKKynewP-NEyJfdORSTDzUSaQI,6538
126
- rfd3/inference/input_parsing.py,sha256=mk3HBvo7MPTFEET7NagCo5TSjb47w-hxUDoeQxUW_h4,45449
127
- rfd3/inference/legacy_input_parsing.py,sha256=1wf_KF7qWnGLaVM8IXDl8fIsWCmxtOi2YlAiHEVELqw,28046
128
- rfd3/inference/parsing.py,sha256=Nq8CYmimnql4RM-5ZfPAvOFvCae4_CC2pYDzE6iCpWU,5290
129
- rfd3/inference/symmetry/atom_array.py,sha256=HH50Z07bTUnNUgCwAGslADbvMYHgsXn9s-fqwx6BvKw,11034
130
- rfd3/inference/symmetry/checks.py,sha256=wb7K327GnMwGG9bgOvvDAbaPsFj4nGZpEAolICUapNc,8908
125
+ rfd3/inference/datasets.py,sha256=9VLbzl7dpG8mk_pjs0R5C2wFYUoRIgXXoZcS9IohSy0,6510
126
+ rfd3/inference/input_parsing.py,sha256=pocqnnhE3-szeBbCL9gy9E3kZJSP_CGHXd6FFRxfv0c,46563
127
+ rfd3/inference/legacy_input_parsing.py,sha256=G2XxkrjdIpL6i1YY7xEmkFitVv__Pc45ow6IKKPHw64,28855
128
+ rfd3/inference/parsing.py,sha256=ktAMUuZE3Pe4bKAjjV3zjqcEDmGlMZ-cotIUhJsEQQA,5402
129
+ rfd3/inference/symmetry/atom_array.py,sha256=j8yhtZAjRNm4d06KyS4gk2XCquHPCwR0k9WiNmxz7WA,12941
130
+ rfd3/inference/symmetry/checks.py,sha256=ZWpC1JjrAjXY__xDt8EFYb5WUdSF0kobZyxxmacFU7U,10076
131
131
  rfd3/inference/symmetry/contigs.py,sha256=6OvbZ2dJg-a0mvvKAC0VkzUH5HpUDxOJvkByIst_roU,2127
132
- rfd3/inference/symmetry/frames.py,sha256=G55p-aOXqEYG4kCyKxrgWAsS-gW9-gOTlBME6nhbKyU,10716
133
- rfd3/inference/symmetry/symmetry_utils.py,sha256=KwgxrdfO766RCEwF3VElAE85oEKiopPGRQDhJbKZaUA,15810
132
+ rfd3/inference/symmetry/frames.py,sha256=kwog5jU_wgv6ACcUER2iU5qz-mdfdOe0cpi2OTEDKMU,18894
133
+ rfd3/inference/symmetry/symmetry_utils.py,sha256=CGUzMI5CKVIcNi5_l2-YRu-ExroZX54GndxLb5P7RtY,14680
134
134
  rfd3/metrics/design_metrics.py,sha256=O1RqZdjQPNlAWYRg6UJTERYg_gUI1_hVleKsm9xbWBY,16836
135
135
  rfd3/metrics/hbonds_hbplus_metrics.py,sha256=Sewy9KzmrA1OnfkasN-fmWrQ9IRx9G7Yyhe2ua0mk28,11518
136
136
  rfd3/metrics/hbonds_metrics.py,sha256=SIR4BnDhYdpVSqwXXRYpQ_tB-M0_fVyugGl08WivCmE,15257
@@ -140,11 +140,11 @@ rfd3/metrics/sidechain_metrics.py,sha256=EGZuFuWQ0cCe83EVPAf4eysN8vP9ifNjfnmE0o5
140
140
  rfd3/model/RFD3.py,sha256=95aKzye-XzuDyLGgost-Wsfu8eT635zHIRky-pNoHSA,3569
141
141
  rfd3/model/RFD3_diffusion_module.py,sha256=BPjKGyQpbnqdzii3gXMKLhhijNqV8Xh4bSosmfDBt8w,12094
142
142
  rfd3/model/cfg_utils.py,sha256=XPBLyoB_bQRLmdrJ1Z0hCjcVvgUMGIPuw4rxTlHjB_s,2575
143
- rfd3/model/inference_sampler.py,sha256=qge7BNJttW0NXgerg3msPY3izxQ-6FsvWSTAMhZ4GJs,24696
143
+ rfd3/model/inference_sampler.py,sha256=5k_UIkJCL6QO4BEqAxkR9GKxNAOz-NRq5Jh51Wm5MU8,25152
144
144
  rfd3/model/layers/attention.py,sha256=XuNA7WyFlRfLnAgky1PtGvXFCnDGv7GeEcXz8hodTBo,19472
145
- rfd3/model/layers/block_utils.py,sha256=EZq2qYUeO6_VCLKDVC60cxfBE_EPwvp84FPmqLr28ZQ,21197
145
+ rfd3/model/layers/block_utils.py,sha256=oN0aD-vZiH4JbIFs2CzDmb2B74GNPKzdFurmGd-dirE,21244
146
146
  rfd3/model/layers/blocks.py,sha256=MOjJ53THxM2MMM27Ap7xiIXRCdI_SHzqKzLLQVX6FEc,24888
147
- rfd3/model/layers/chunked_pairwise.py,sha256=de5Qc3P7GEfZlX-QLaKfJxr6Ky5vgLcWWogatCw2UnY,14582
147
+ rfd3/model/layers/chunked_pairwise.py,sha256=B8oUxXbdm9akwdbrmjA-7HtcNQBTppMB_gAMAz9VbvY,14712
148
148
  rfd3/model/layers/encoders.py,sha256=CqByjHNSbtMIaNP_h2iEJZdTbm-N8SGo1bZgvRNpMJ8,15207
149
149
  rfd3/model/layers/layer_utils.py,sha256=UPYo-DYa__93KONSEj2YZWLtBqvYNSA9_wHDDPhVrIc,5710
150
150
  rfd3/model/layers/pairformer_layers.py,sha256=uimskhN-Ec0apEXAU6JqomyKX5-6ormrEsCFJotkBtM,3991
@@ -166,11 +166,11 @@ rfd3/transforms/ncaa_transforms.py,sha256=Lz4L8OGuOOG53sKJHcLSdV7WPQ3YzOzwd5tJG4
166
166
  rfd3/transforms/pipelines.py,sha256=FGH-XH3taTWQ6k1zpDO_d-097EQdXmL6uqXZXw4HIMs,22086
167
167
  rfd3/transforms/ppi_transforms.py,sha256=7rXyf-tn2TLz6ybYR_YVDtSDG7hOgqhYY4shNviA_Sw,23493
168
168
  rfd3/transforms/rasa.py,sha256=a4IPFvVMMxldoGLyJQiSlGg7IyUkcBASbRZLWmguAKk,4156
169
- rfd3/transforms/symmetry.py,sha256=GSnMF7oAnUxPozfafsRuHEv0yKXW0BpLTI6wsKGZrbc,2658
169
+ rfd3/transforms/symmetry.py,sha256=9I9gzAZkk5vMUJm7x8XCDSHtNPYYLAHt4meXxOczGT0,2970
170
170
  rfd3/transforms/training_conditions.py,sha256=UXiUPjDwrNKM95tRe0eXrMeRN8XlTPc_MXUvo6UpePo,19510
171
171
  rfd3/transforms/util_transforms.py,sha256=2AcLkzx-73ZFgcWD1cIHv7NyniRPI4_zThHK8azyQaY,18119
172
172
  rfd3/transforms/virtual_atoms.py,sha256=UpmxzPPd5FaJigcRoxgLSHHrLLOqsCvZ5PPZfQSGqII,12547
173
- rfd3/utils/inference.py,sha256=RQp5CCy6Z6uHVZ2Mx0zmmGluYEOrASke4bABtfRjpy0,26448
173
+ rfd3/utils/inference.py,sha256=Yf3aAUk_YZi58uIJr5Y2wfVnQ-2bh3S5GHLBPzCRjUs,26448
174
174
  rfd3/utils/io.py,sha256=wbdjUTQkDc3RCSM7gdogA-XOKR68HeQ-cfvyN4pP90w,9849
175
175
  rfd3/utils/vizualize.py,sha256=HPlczrA3zkOuxV5X05eOvy_Oga9e3cPnFUXOEP4RR_g,11046
176
176
  rf3/configs/inference.yaml,sha256=JmEZdkAnbnOrX79lGS5xrYYho9aBFfVxfUp-8KjJV5I,309
@@ -248,7 +248,7 @@ rfd3/configs/datasets/conditions/sequence_design.yaml,sha256=D1K6WOysmSAQ4LogltU
248
248
  rfd3/configs/datasets/conditions/tipatom.yaml,sha256=0010o7UUL-l75qI8HCjC_tdBXFWysm2dgVXzE7bQyZ0,650
249
249
  rfd3/configs/datasets/conditions/unconditional.yaml,sha256=z1eVHylswLyludXWFs1AMt3mTMu3EbAUHrP8J3XBsRU,446
250
250
  rfd3/configs/datasets/train/rfd3_monomer_distillation.yaml,sha256=1f61uFeRB8OD6sifFuIKFov8D7PcHpqRT4Z-M5EzO4w,1207
251
- rfd3/configs/datasets/train/pdb/af3_train_interface.yaml,sha256=mwbdGJQ9SXc8WvO3qqSWzS--K4rvbFsM0MR371FUrr0,1552
251
+ rfd3/configs/datasets/train/pdb/af3_train_interface.yaml,sha256=DSIpXW2SQ3drDp12490y0tFbjbugecyA7TI_x3WrKng,1546
252
252
  rfd3/configs/datasets/train/pdb/af3_train_pn_unit.yaml,sha256=DPoEhLlyBu0RdBkkJeWB8pkOV4z0DBc6XmclLgww9II,1324
253
253
  rfd3/configs/datasets/train/pdb/base.yaml,sha256=2VUEAKADyvjJmWP4FeOJwRat9r6F3_GXuyGYjvMvArw,291
254
254
  rfd3/configs/datasets/train/pdb/base_no_weights.yaml,sha256=8HchN7DqYESBK520vShdg7xidWBSogGRAxfaxa5pKdE,554
@@ -285,7 +285,7 @@ rfd3/configs/hydra/default.yaml,sha256=SYDTSU8bAw20QssrtTi7lptiBD5H3XNyzApsyy0br
285
285
  rfd3/configs/hydra/no_logging.yaml,sha256=MUXDFcw-QwaRPz9HcE-1tdZwbNha1mexTe31G-Zt9_w,120
286
286
  rfd3/configs/inference_engine/base.yaml,sha256=ekP5U7bAALpeJGpwyj1v0N5LiEtptl5loRCtM8FRzRM,246
287
287
  rfd3/configs/inference_engine/dev.yaml,sha256=-2snClOTwj5TQt7jnwSrI4pzAiI4nFulXKJflmgIyUw,304
288
- rfd3/configs/inference_engine/rfdiffusion3.yaml,sha256=h2e9U9RFCcvXjKAJ6U8puj-8O-U57ZxeZLA0HLB2txA,2161
288
+ rfd3/configs/inference_engine/rfdiffusion3.yaml,sha256=3bHIAhzFhFDIag0xQWYxHBUMSc71fjClHXKbZ-tpHzA,2112
289
289
  rfd3/configs/logger/csv.yaml,sha256=DtcywAIS4OxLXP2QxSEvqdrjhMpT6xHiGspoYw5qkus,245
290
290
  rfd3/configs/logger/default.yaml,sha256=pSyHyxT-J_T-g4_6TtD2yzN3rzxgY6rOG_Vh4RjZeFY,17
291
291
  rfd3/configs/logger/wandb.yaml,sha256=RhCnFtO0hNc3R75ts417l5ICZeGm74lOj9Bfe7ZvRNA,652
@@ -294,7 +294,7 @@ rfd3/configs/model/components/ema.yaml,sha256=AIzf4RZLKP8AcfaxdvZBS1rFw3AlSo431r
294
294
  rfd3/configs/model/components/rfd3_net.yaml,sha256=95FF4U7aWmLCoHvyxsRoE74n-bxTPD6KlAhPKNemVH4,3275
295
295
  rfd3/configs/model/optimizers/adam.yaml,sha256=cTRNo4_4lNgLv0b329v-KiC_MCQtTVVTxeer5Au_FIM,145
296
296
  rfd3/configs/model/samplers/edm.yaml,sha256=QycHAIrfhRgx0mJygTOs56FT93tGCWTGxrQSKBOA7Mc,483
297
- rfd3/configs/model/samplers/symmetry.yaml,sha256=BZZOIhk2ndAvIntf-16nnqCuOW43iWTB7iDU-RsxOcc,214
297
+ rfd3/configs/model/samplers/symmetry.yaml,sha256=pI0Ens6jmbpAIl8E4eYsJR1SqIppe5OsWh91KfpjNjs,214
298
298
  rfd3/configs/model/schedulers/af3.yaml,sha256=xEtRb--KPjg_5pW_IJvN9AHWVqCtOM4QOnXlMH2KrEg,149
299
299
  rfd3/configs/paths/default.yaml,sha256=bjB04SNu_5E6W_v4mRBjwce0xmdKwO5wsVf4gfaRl0Y,1045
300
300
  rfd3/configs/paths/data/default.yaml,sha256=jfs1dbbcOqHja4_6lXheyRg4t0YExqVn2w0rZEWL6XE,788
@@ -304,8 +304,8 @@ rfd3/configs/trainer/rfd3_base.yaml,sha256=R3lZxdyjUirjlLU31qWlnZgHaz4GcWTGGIz4f
304
304
  rfd3/configs/trainer/loss/losses/diffusion_loss.yaml,sha256=FE4FCEfurE0ekwZ4YfS6wCvPSNqxClwg_kc73cPql5Y,323
305
305
  rfd3/configs/trainer/loss/losses/sequence_loss.yaml,sha256=kezbQcqwAZ0VKQPUBr2MsNr9DcDL3ENIP1i-j7h-6Co,64
306
306
  rfd3/configs/trainer/metrics/design_metrics.yaml,sha256=xVDpClhHqSHvsf-8StL26z51Vn-iuWMDG9KMB-kqOI0,719
307
- rc_foundry-0.1.6.dist-info/METADATA,sha256=EEOkAi2nABzo70kEP-n9t5aXZ8a4Gqr5wYZ2mjIBqp4,10585
308
- rc_foundry-0.1.6.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
309
- rc_foundry-0.1.6.dist-info/entry_points.txt,sha256=BmiWCbWGtrd_lSOFMuCLBXyo84B7Nco-alj7hB0Yw9A,130
310
- rc_foundry-0.1.6.dist-info/licenses/LICENSE.md,sha256=NKtPCJ7QMysFmzeDg56ZfUStvgzbq5sOvRQv7_ddZOs,1533
311
- rc_foundry-0.1.6.dist-info/RECORD,,
307
+ rc_foundry-0.1.9.dist-info/METADATA,sha256=SBHGrkr8RsLTCTOhJnbusBs8G7C8HxJUPajCbmU6OyE,11502
308
+ rc_foundry-0.1.9.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
309
+ rc_foundry-0.1.9.dist-info/entry_points.txt,sha256=BmiWCbWGtrd_lSOFMuCLBXyo84B7Nco-alj7hB0Yw9A,130
310
+ rc_foundry-0.1.9.dist-info/licenses/LICENSE.md,sha256=NKtPCJ7QMysFmzeDg56ZfUStvgzbq5sOvRQv7_ddZOs,1533
311
+ rc_foundry-0.1.9.dist-info/RECORD,,