cmxflow 0.1.0__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.
- cmxflow-0.1.0/LICENSE +21 -0
- cmxflow-0.1.0/PKG-INFO +187 -0
- cmxflow-0.1.0/README.md +164 -0
- cmxflow-0.1.0/pyproject.toml +62 -0
- cmxflow-0.1.0/src/cmxflow/__init__.py +21 -0
- cmxflow-0.1.0/src/cmxflow/block.py +357 -0
- cmxflow-0.1.0/src/cmxflow/cmxmol.py +124 -0
- cmxflow-0.1.0/src/cmxflow/mcp/__init__.py +11 -0
- cmxflow-0.1.0/src/cmxflow/mcp/server.py +1210 -0
- cmxflow-0.1.0/src/cmxflow/mcp/state.py +314 -0
- cmxflow-0.1.0/src/cmxflow/operators/__init__.py +34 -0
- cmxflow-0.1.0/src/cmxflow/operators/align.py +485 -0
- cmxflow-0.1.0/src/cmxflow/operators/base.py +91 -0
- cmxflow-0.1.0/src/cmxflow/operators/cluster.py +119 -0
- cmxflow-0.1.0/src/cmxflow/operators/confgen.py +222 -0
- cmxflow-0.1.0/src/cmxflow/operators/dedup.py +65 -0
- cmxflow-0.1.0/src/cmxflow/operators/dock/__init__.py +106 -0
- cmxflow-0.1.0/src/cmxflow/operators/dock/dock.py +267 -0
- cmxflow-0.1.0/src/cmxflow/operators/dock/ec.py +260 -0
- cmxflow-0.1.0/src/cmxflow/operators/dock/pose.py +836 -0
- cmxflow-0.1.0/src/cmxflow/operators/dock/score.py +628 -0
- cmxflow-0.1.0/src/cmxflow/operators/filter.py +507 -0
- cmxflow-0.1.0/src/cmxflow/operators/ionize.py +184 -0
- cmxflow-0.1.0/src/cmxflow/operators/method.py +145 -0
- cmxflow-0.1.0/src/cmxflow/operators/select.py +216 -0
- cmxflow-0.1.0/src/cmxflow/operators/sim2d.py +187 -0
- cmxflow-0.1.0/src/cmxflow/operators/sim3d.py +276 -0
- cmxflow-0.1.0/src/cmxflow/operators/standardize.py +98 -0
- cmxflow-0.1.0/src/cmxflow/opt/__init__.py +5 -0
- cmxflow-0.1.0/src/cmxflow/opt/optuna.py +225 -0
- cmxflow-0.1.0/src/cmxflow/parameter.py +197 -0
- cmxflow-0.1.0/src/cmxflow/scores/__init__.py +19 -0
- cmxflow-0.1.0/src/cmxflow/scores/automatic.py +310 -0
- cmxflow-0.1.0/src/cmxflow/scores/cluster.py +84 -0
- cmxflow-0.1.0/src/cmxflow/scores/shape.py +230 -0
- cmxflow-0.1.0/src/cmxflow/sinks/__init__.py +15 -0
- cmxflow-0.1.0/src/cmxflow/sinks/molecule.py +106 -0
- cmxflow-0.1.0/src/cmxflow/sinks/table.py +107 -0
- cmxflow-0.1.0/src/cmxflow/sinks/writer.py +57 -0
- cmxflow-0.1.0/src/cmxflow/sources/__init__.py +17 -0
- cmxflow-0.1.0/src/cmxflow/sources/molecule.py +58 -0
- cmxflow-0.1.0/src/cmxflow/sources/reader.py +121 -0
- cmxflow-0.1.0/src/cmxflow/sources/table.py +142 -0
- cmxflow-0.1.0/src/cmxflow/utils/__init__.py +20 -0
- cmxflow-0.1.0/src/cmxflow/utils/parallel.py +617 -0
- cmxflow-0.1.0/src/cmxflow/utils/pymol.py +65 -0
- cmxflow-0.1.0/src/cmxflow/utils/serial.py +213 -0
- cmxflow-0.1.0/src/cmxflow/utils/text.py +244 -0
- cmxflow-0.1.0/src/cmxflow/workflow.py +263 -0
cmxflow-0.1.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Benjmain J. Shields
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
cmxflow-0.1.0/PKG-INFO
ADDED
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: cmxflow
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: A Python package for building and optimizing cheminformatics workflows using Bayesian optimization and LLM agents
|
|
5
|
+
License-File: LICENSE
|
|
6
|
+
Author: Benjamin J. Shields
|
|
7
|
+
Requires-Python: >=3.10,<4.0
|
|
8
|
+
Classifier: Programming Language :: Python :: 3
|
|
9
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
10
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
11
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
12
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
13
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
14
|
+
Requires-Dist: dimorphite-dl
|
|
15
|
+
Requires-Dist: fastmcp (>=2.0,<3.0)
|
|
16
|
+
Requires-Dist: optuna (>=3.0,<4.0)
|
|
17
|
+
Requires-Dist: pandas (>=2.0,<3.0)
|
|
18
|
+
Requires-Dist: pyarrow
|
|
19
|
+
Requires-Dist: rdkit (>=2025.4,<2026.0)
|
|
20
|
+
Requires-Dist: scikit-learn (>=1.7,<2.0)
|
|
21
|
+
Description-Content-Type: text/markdown
|
|
22
|
+
|
|
23
|
+
# cmxflow ๐งช
|
|
24
|
+
|
|
25
|
+
[](https://b-shields.github.io/cmxflow/)
|
|
26
|
+
[](https://github.com/b-shields/cmxflow/actions/workflows/ci.yml)
|
|
27
|
+
[](https://codecov.io/gh/b-shields/cmxflow)
|
|
28
|
+
[]()
|
|
29
|
+
[](https://github.com/psf/black)
|
|
30
|
+
[](LICENSE)
|
|
31
|
+
|
|
32
|
+
Composable cheminformatics workflows with Bayesian optimization.
|
|
33
|
+
|
|
34
|
+
## Overview ๐ฌ
|
|
35
|
+
|
|
36
|
+
**cmxflow** is a Python framework for building and optimizing cheminformatics pipelines. Chain together molecular operations as blocks, then let Bayesian optimization find the best parameters for your task.
|
|
37
|
+
|
|
38
|
+
**[Read the full documentation →](https://b-shields.github.io/cmxflow/)**
|
|
39
|
+
|
|
40
|
+
### Two Usage Modes โ๏ธ
|
|
41
|
+
|
|
42
|
+
cmxflow is designed to work both as:
|
|
43
|
+
|
|
44
|
+
1. **An Agentic Tool** - via MCP (Model Context Protocol) server, allowing LLM agents to build and optimize workflows conversationally
|
|
45
|
+
2. **A Programmatic API** - for direct Python usage in scripts and notebooks
|
|
46
|
+
|
|
47
|
+
## Block Types ๐งฌ
|
|
48
|
+
|
|
49
|
+
Workflows are built from four types of blocks:
|
|
50
|
+
|
|
51
|
+
| Block Type | Purpose |
|
|
52
|
+
|------------|---------|
|
|
53
|
+
| **SourceBlock** | Read molecules from files (SDF, SMILES, CSV, Parquet) |
|
|
54
|
+
| **Block** | Transform molecules (1:1 or N:M) |
|
|
55
|
+
| **SinkBlock** | Write molecules to files |
|
|
56
|
+
| **ScoreBlock** | Compute optimization objective |
|
|
57
|
+
|
|
58
|
+
### Example Operators ๐
|
|
59
|
+
|
|
60
|
+
| Block | Purpose |
|
|
61
|
+
|-------|---------|
|
|
62
|
+
| `MoleculeStandardizeBlock` | Standardize molecules (metals, salts, charges, tautomers) |
|
|
63
|
+
| `MoleculeDeduplicateBlock` | Remove duplicate molecules by canonical SMILES |
|
|
64
|
+
| `RDKitBlock` | Apply any RDKit method (descriptors, transformations) |
|
|
65
|
+
| `SubstructureFilterBlock` | Filter by SMARTS patterns or catalogs (PAINS, BRENK, etc.) |
|
|
66
|
+
| `PropertyFilterBlock` | Filter molecules by property conditions |
|
|
67
|
+
| `PropertyHeadBlock` | Select top N molecules by property |
|
|
68
|
+
| `PropertyTailBlock` | Select bottom N molecules by property |
|
|
69
|
+
| `MoleculeSimilarityBlock` | Compute 2D fingerprint similarity |
|
|
70
|
+
| `Molecule3DSimilarityBlock` | Compute 3D shape similarity |
|
|
71
|
+
| `IonizeMoleculeBlock` | Generate pH-dependent ionization states |
|
|
72
|
+
| `EnumerateStereoBlock` | Enumerate all stereoisomers |
|
|
73
|
+
| `ConformerGenerationBlock` | Generate 3D conformers (ETKDGv3) |
|
|
74
|
+
| `MoleculeAlignBlock` | Align molecules to 3D reference |
|
|
75
|
+
| `MoleculeDockBlock` | Dock into protein binding pocket |
|
|
76
|
+
| `RepresentativeClusterBlock` | Cluster molecules by fingerprint similarity (leader algorithm) |
|
|
77
|
+
|
|
78
|
+
### Example Score Blocks ๐
|
|
79
|
+
|
|
80
|
+
| ScoreBlock | Purpose |
|
|
81
|
+
|------------|---------|
|
|
82
|
+
| `EnrichmentScoreBlock` | Enrichment AUC for virtual screening |
|
|
83
|
+
| `AverageScoreBlock` | Mean of a molecular property |
|
|
84
|
+
| `ShapeOverlayScoreBlock` | Average 3D shape similarity |
|
|
85
|
+
| `ClusterScoreBlock` | Cluster quality from representative clustering |
|
|
86
|
+
|
|
87
|
+
## Features ๐
|
|
88
|
+
|
|
89
|
+
- **Composable Pipelines** - Chain blocks with `workflow.add()`
|
|
90
|
+
- **Bayesian Optimization** - Find optimal parameters via Optuna
|
|
91
|
+
- **Parallel Execution** - `make_parallel()` for compute-intensive blocks
|
|
92
|
+
- **Mutable Parameters** - Categorical, Integer, and Continuous types
|
|
93
|
+
- **Serialization** - `save_workflow()` and `load_workflow()` for persistence
|
|
94
|
+
- **MCP Server** - Agentic workflow building via `build_workflow`, `run_workflow`, `optimize_workflow`
|
|
95
|
+
|
|
96
|
+
## Environment Variables ๐ง
|
|
97
|
+
|
|
98
|
+
| Variable | Default | Description |
|
|
99
|
+
|----------|---------|-------------|
|
|
100
|
+
| `CMXFLOW_WORKER_TIMEOUT` | `30` | Seconds to wait for a single parallel worker before treating it as failed. Set to `0` to disable the timeout. Applies to all `make_parallel()` and `@parallel` blocks. |
|
|
101
|
+
|
|
102
|
+
## Getting Started ๐
|
|
103
|
+
|
|
104
|
+
See [`examples/basic_usage.ipynb`](examples/basic_usage.ipynb) for a complete tutorial covering:
|
|
105
|
+
|
|
106
|
+
- Building your first workflow
|
|
107
|
+
- 2D similarity search
|
|
108
|
+
- Mutable parameters and optimization
|
|
109
|
+
- Parallel execution
|
|
110
|
+
- Analyzing results with Optuna
|
|
111
|
+
|
|
112
|
+
The tutorial uses the ABL1 kinase benchmark from the wonderful [DUD-E](http://dude.docking.org/) database.
|
|
113
|
+
|
|
114
|
+
## Installation ๐ ๏ธ
|
|
115
|
+
|
|
116
|
+
```bash
|
|
117
|
+
pip install cmxflow
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
### MCP Server
|
|
121
|
+
|
|
122
|
+
To use cmxflow as an agentic tool with Claude Code:
|
|
123
|
+
|
|
124
|
+
```bash
|
|
125
|
+
claude mcp add cmxflow -- cmxflow-mcp
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### Optional Dependencies
|
|
129
|
+
|
|
130
|
+
**PyMOL** โ Required only for 3D structure visualization (`view_structures` MCP tool). Install via conda:
|
|
131
|
+
|
|
132
|
+
```bash
|
|
133
|
+
conda install -c conda-forge pymol-open-source
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
All other functionality works without PyMOL.
|
|
137
|
+
|
|
138
|
+
## Contributing ๐ค
|
|
139
|
+
|
|
140
|
+
Contributions are welcome! This is a side project, so reviews may take some time, but PRs are appreciated.
|
|
141
|
+
|
|
142
|
+
### Before Submitting
|
|
143
|
+
|
|
144
|
+
1. **Open an issue first** for significant changes to discuss the approach
|
|
145
|
+
2. **Fork the repo** and create a feature branch from `main`
|
|
146
|
+
3. **Follow the code style** - run `mypy`, `black`, and `ruff` before committing (or install provided precommit hooks)
|
|
147
|
+
|
|
148
|
+
### PR Requirements
|
|
149
|
+
|
|
150
|
+
- **Clear description** of the bug fixed or feature added
|
|
151
|
+
- **Minimal reproducible example** demonstrating the change
|
|
152
|
+
- **Tests** covering new functionality (`pytest`)
|
|
153
|
+
- **Type hints** for all new code
|
|
154
|
+
- **Docstrings** following Google conventions
|
|
155
|
+
|
|
156
|
+
### Development Setup
|
|
157
|
+
|
|
158
|
+
```bash
|
|
159
|
+
conda config --set solver libmamba
|
|
160
|
+
conda env create -f conda.yml
|
|
161
|
+
conda activate cmxflow
|
|
162
|
+
poetry install
|
|
163
|
+
pre-commit install # Ensures formatting/linting on commit
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
### Running Tests
|
|
167
|
+
|
|
168
|
+
```bash
|
|
169
|
+
pytest tests/
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
## Releases
|
|
173
|
+
|
|
174
|
+
Releases are published to PyPI automatically when a pull request is merged into `main` with a version bump tag in the PR title:
|
|
175
|
+
|
|
176
|
+
| Tag in PR title | Version bump | Example |
|
|
177
|
+
|---|---|---|
|
|
178
|
+
| `[patch]` | Bug fixes, docs (0.1.0 โ 0.1.1) | `Fix conformer bug [patch]` |
|
|
179
|
+
| `[minor]` | New features, backwards-compatible (0.1.0 โ 0.2.0) | `Add ProtonationBlock [minor]` |
|
|
180
|
+
| `[major]` | Breaking changes (0.1.0 โ 1.0.0) | `Redesign block API [major]` |
|
|
181
|
+
|
|
182
|
+
PRs without a tag merge normally without triggering a release.
|
|
183
|
+
|
|
184
|
+
## License ๐
|
|
185
|
+
|
|
186
|
+
MIT
|
|
187
|
+
|
cmxflow-0.1.0/README.md
ADDED
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
# cmxflow ๐งช
|
|
2
|
+
|
|
3
|
+
[](https://b-shields.github.io/cmxflow/)
|
|
4
|
+
[](https://github.com/b-shields/cmxflow/actions/workflows/ci.yml)
|
|
5
|
+
[](https://codecov.io/gh/b-shields/cmxflow)
|
|
6
|
+
[]()
|
|
7
|
+
[](https://github.com/psf/black)
|
|
8
|
+
[](LICENSE)
|
|
9
|
+
|
|
10
|
+
Composable cheminformatics workflows with Bayesian optimization.
|
|
11
|
+
|
|
12
|
+
## Overview ๐ฌ
|
|
13
|
+
|
|
14
|
+
**cmxflow** is a Python framework for building and optimizing cheminformatics pipelines. Chain together molecular operations as blocks, then let Bayesian optimization find the best parameters for your task.
|
|
15
|
+
|
|
16
|
+
**[Read the full documentation →](https://b-shields.github.io/cmxflow/)**
|
|
17
|
+
|
|
18
|
+
### Two Usage Modes โ๏ธ
|
|
19
|
+
|
|
20
|
+
cmxflow is designed to work both as:
|
|
21
|
+
|
|
22
|
+
1. **An Agentic Tool** - via MCP (Model Context Protocol) server, allowing LLM agents to build and optimize workflows conversationally
|
|
23
|
+
2. **A Programmatic API** - for direct Python usage in scripts and notebooks
|
|
24
|
+
|
|
25
|
+
## Block Types ๐งฌ
|
|
26
|
+
|
|
27
|
+
Workflows are built from four types of blocks:
|
|
28
|
+
|
|
29
|
+
| Block Type | Purpose |
|
|
30
|
+
|------------|---------|
|
|
31
|
+
| **SourceBlock** | Read molecules from files (SDF, SMILES, CSV, Parquet) |
|
|
32
|
+
| **Block** | Transform molecules (1:1 or N:M) |
|
|
33
|
+
| **SinkBlock** | Write molecules to files |
|
|
34
|
+
| **ScoreBlock** | Compute optimization objective |
|
|
35
|
+
|
|
36
|
+
### Example Operators ๐
|
|
37
|
+
|
|
38
|
+
| Block | Purpose |
|
|
39
|
+
|-------|---------|
|
|
40
|
+
| `MoleculeStandardizeBlock` | Standardize molecules (metals, salts, charges, tautomers) |
|
|
41
|
+
| `MoleculeDeduplicateBlock` | Remove duplicate molecules by canonical SMILES |
|
|
42
|
+
| `RDKitBlock` | Apply any RDKit method (descriptors, transformations) |
|
|
43
|
+
| `SubstructureFilterBlock` | Filter by SMARTS patterns or catalogs (PAINS, BRENK, etc.) |
|
|
44
|
+
| `PropertyFilterBlock` | Filter molecules by property conditions |
|
|
45
|
+
| `PropertyHeadBlock` | Select top N molecules by property |
|
|
46
|
+
| `PropertyTailBlock` | Select bottom N molecules by property |
|
|
47
|
+
| `MoleculeSimilarityBlock` | Compute 2D fingerprint similarity |
|
|
48
|
+
| `Molecule3DSimilarityBlock` | Compute 3D shape similarity |
|
|
49
|
+
| `IonizeMoleculeBlock` | Generate pH-dependent ionization states |
|
|
50
|
+
| `EnumerateStereoBlock` | Enumerate all stereoisomers |
|
|
51
|
+
| `ConformerGenerationBlock` | Generate 3D conformers (ETKDGv3) |
|
|
52
|
+
| `MoleculeAlignBlock` | Align molecules to 3D reference |
|
|
53
|
+
| `MoleculeDockBlock` | Dock into protein binding pocket |
|
|
54
|
+
| `RepresentativeClusterBlock` | Cluster molecules by fingerprint similarity (leader algorithm) |
|
|
55
|
+
|
|
56
|
+
### Example Score Blocks ๐
|
|
57
|
+
|
|
58
|
+
| ScoreBlock | Purpose |
|
|
59
|
+
|------------|---------|
|
|
60
|
+
| `EnrichmentScoreBlock` | Enrichment AUC for virtual screening |
|
|
61
|
+
| `AverageScoreBlock` | Mean of a molecular property |
|
|
62
|
+
| `ShapeOverlayScoreBlock` | Average 3D shape similarity |
|
|
63
|
+
| `ClusterScoreBlock` | Cluster quality from representative clustering |
|
|
64
|
+
|
|
65
|
+
## Features ๐
|
|
66
|
+
|
|
67
|
+
- **Composable Pipelines** - Chain blocks with `workflow.add()`
|
|
68
|
+
- **Bayesian Optimization** - Find optimal parameters via Optuna
|
|
69
|
+
- **Parallel Execution** - `make_parallel()` for compute-intensive blocks
|
|
70
|
+
- **Mutable Parameters** - Categorical, Integer, and Continuous types
|
|
71
|
+
- **Serialization** - `save_workflow()` and `load_workflow()` for persistence
|
|
72
|
+
- **MCP Server** - Agentic workflow building via `build_workflow`, `run_workflow`, `optimize_workflow`
|
|
73
|
+
|
|
74
|
+
## Environment Variables ๐ง
|
|
75
|
+
|
|
76
|
+
| Variable | Default | Description |
|
|
77
|
+
|----------|---------|-------------|
|
|
78
|
+
| `CMXFLOW_WORKER_TIMEOUT` | `30` | Seconds to wait for a single parallel worker before treating it as failed. Set to `0` to disable the timeout. Applies to all `make_parallel()` and `@parallel` blocks. |
|
|
79
|
+
|
|
80
|
+
## Getting Started ๐
|
|
81
|
+
|
|
82
|
+
See [`examples/basic_usage.ipynb`](examples/basic_usage.ipynb) for a complete tutorial covering:
|
|
83
|
+
|
|
84
|
+
- Building your first workflow
|
|
85
|
+
- 2D similarity search
|
|
86
|
+
- Mutable parameters and optimization
|
|
87
|
+
- Parallel execution
|
|
88
|
+
- Analyzing results with Optuna
|
|
89
|
+
|
|
90
|
+
The tutorial uses the ABL1 kinase benchmark from the wonderful [DUD-E](http://dude.docking.org/) database.
|
|
91
|
+
|
|
92
|
+
## Installation ๐ ๏ธ
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
pip install cmxflow
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### MCP Server
|
|
99
|
+
|
|
100
|
+
To use cmxflow as an agentic tool with Claude Code:
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
claude mcp add cmxflow -- cmxflow-mcp
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### Optional Dependencies
|
|
107
|
+
|
|
108
|
+
**PyMOL** โ Required only for 3D structure visualization (`view_structures` MCP tool). Install via conda:
|
|
109
|
+
|
|
110
|
+
```bash
|
|
111
|
+
conda install -c conda-forge pymol-open-source
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
All other functionality works without PyMOL.
|
|
115
|
+
|
|
116
|
+
## Contributing ๐ค
|
|
117
|
+
|
|
118
|
+
Contributions are welcome! This is a side project, so reviews may take some time, but PRs are appreciated.
|
|
119
|
+
|
|
120
|
+
### Before Submitting
|
|
121
|
+
|
|
122
|
+
1. **Open an issue first** for significant changes to discuss the approach
|
|
123
|
+
2. **Fork the repo** and create a feature branch from `main`
|
|
124
|
+
3. **Follow the code style** - run `mypy`, `black`, and `ruff` before committing (or install provided precommit hooks)
|
|
125
|
+
|
|
126
|
+
### PR Requirements
|
|
127
|
+
|
|
128
|
+
- **Clear description** of the bug fixed or feature added
|
|
129
|
+
- **Minimal reproducible example** demonstrating the change
|
|
130
|
+
- **Tests** covering new functionality (`pytest`)
|
|
131
|
+
- **Type hints** for all new code
|
|
132
|
+
- **Docstrings** following Google conventions
|
|
133
|
+
|
|
134
|
+
### Development Setup
|
|
135
|
+
|
|
136
|
+
```bash
|
|
137
|
+
conda config --set solver libmamba
|
|
138
|
+
conda env create -f conda.yml
|
|
139
|
+
conda activate cmxflow
|
|
140
|
+
poetry install
|
|
141
|
+
pre-commit install # Ensures formatting/linting on commit
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
### Running Tests
|
|
145
|
+
|
|
146
|
+
```bash
|
|
147
|
+
pytest tests/
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
## Releases
|
|
151
|
+
|
|
152
|
+
Releases are published to PyPI automatically when a pull request is merged into `main` with a version bump tag in the PR title:
|
|
153
|
+
|
|
154
|
+
| Tag in PR title | Version bump | Example |
|
|
155
|
+
|---|---|---|
|
|
156
|
+
| `[patch]` | Bug fixes, docs (0.1.0 โ 0.1.1) | `Fix conformer bug [patch]` |
|
|
157
|
+
| `[minor]` | New features, backwards-compatible (0.1.0 โ 0.2.0) | `Add ProtonationBlock [minor]` |
|
|
158
|
+
| `[major]` | Breaking changes (0.1.0 โ 1.0.0) | `Redesign block API [major]` |
|
|
159
|
+
|
|
160
|
+
PRs without a tag merge normally without triggering a release.
|
|
161
|
+
|
|
162
|
+
## License ๐
|
|
163
|
+
|
|
164
|
+
MIT
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
[tool.poetry]
|
|
2
|
+
name = "cmxflow"
|
|
3
|
+
version = "0.1.0"
|
|
4
|
+
description = "A Python package for building and optimizing cheminformatics workflows using Bayesian optimization and LLM agents"
|
|
5
|
+
authors = ["Benjamin J. Shields"]
|
|
6
|
+
readme = "README.md"
|
|
7
|
+
packages = [{include = "cmxflow", from = "src"}]
|
|
8
|
+
|
|
9
|
+
[tool.poetry.dependencies]
|
|
10
|
+
python = "^3.10"
|
|
11
|
+
rdkit = "^2025.4"
|
|
12
|
+
pandas = "^2.0"
|
|
13
|
+
pyarrow = "*"
|
|
14
|
+
scikit-learn = "^1.7"
|
|
15
|
+
optuna = "^3.0"
|
|
16
|
+
dimorphite-dl = "*"
|
|
17
|
+
fastmcp = "^2.0"
|
|
18
|
+
|
|
19
|
+
[tool.poetry.scripts]
|
|
20
|
+
cmxflow-mcp = "cmxflow.mcp:run"
|
|
21
|
+
|
|
22
|
+
[tool.poetry.group.dev.dependencies]
|
|
23
|
+
pytest = "^8.0"
|
|
24
|
+
pytest-cov = "^6.0"
|
|
25
|
+
black = "^24.0"
|
|
26
|
+
ruff = "^0.4"
|
|
27
|
+
mypy = "^1.10"
|
|
28
|
+
pre-commit = "^4.0"
|
|
29
|
+
|
|
30
|
+
[tool.poetry.group.docs.dependencies]
|
|
31
|
+
mkdocs-material = "^9.0"
|
|
32
|
+
mkdocstrings = {extras = ["python"], version = "^0.27"}
|
|
33
|
+
|
|
34
|
+
[build-system]
|
|
35
|
+
requires = ["poetry-core"]
|
|
36
|
+
build-backend = "poetry.core.masonry.api"
|
|
37
|
+
|
|
38
|
+
[tool.black]
|
|
39
|
+
line-length = 88
|
|
40
|
+
|
|
41
|
+
[tool.ruff]
|
|
42
|
+
line-length = 88
|
|
43
|
+
|
|
44
|
+
[tool.ruff.lint]
|
|
45
|
+
select = ["E", "F", "I", "W"]
|
|
46
|
+
|
|
47
|
+
[tool.mypy]
|
|
48
|
+
python_version = "3.10"
|
|
49
|
+
warn_return_any = true
|
|
50
|
+
warn_unused_configs = true
|
|
51
|
+
ignore_missing_imports = true
|
|
52
|
+
|
|
53
|
+
# rdkit stubs are incomplete โ suppress false positives from stub mismatches
|
|
54
|
+
[[tool.mypy.overrides]]
|
|
55
|
+
module = [
|
|
56
|
+
"cmxflow.cmxmol",
|
|
57
|
+
"cmxflow.sinks.molecule",
|
|
58
|
+
"cmxflow.operators.confgen",
|
|
59
|
+
"cmxflow.operators.dock.ec",
|
|
60
|
+
"cmxflow.operators.dock.dock",
|
|
61
|
+
]
|
|
62
|
+
disable_error_code = ["override", "assignment", "no-any-return", "attr-defined"]
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"""cmxflow: Automated cheminformatics workflow optimization."""
|
|
2
|
+
|
|
3
|
+
from cmxflow.block import Block, BlockBase, SinkBlock, SourceBlock
|
|
4
|
+
from cmxflow.cmxmol import Mol, unwrap_mol, wrap_mol
|
|
5
|
+
from cmxflow.utils.serial import load_workflow, save_workflow
|
|
6
|
+
from cmxflow.workflow import Workflow, WorkflowValidationError
|
|
7
|
+
|
|
8
|
+
__version__ = "0.1.0"
|
|
9
|
+
__all__ = [
|
|
10
|
+
"Block",
|
|
11
|
+
"BlockBase",
|
|
12
|
+
"Mol",
|
|
13
|
+
"SinkBlock",
|
|
14
|
+
"SourceBlock",
|
|
15
|
+
"Workflow",
|
|
16
|
+
"WorkflowValidationError",
|
|
17
|
+
"load_workflow",
|
|
18
|
+
"save_workflow",
|
|
19
|
+
"unwrap_mol",
|
|
20
|
+
"wrap_mol",
|
|
21
|
+
]
|