synkit 0.0.1__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.
- synkit/Chem/Fingerprint/__init__.py +0 -0
- synkit/Chem/Fingerprint/fp_calculator.py +122 -0
- synkit/Chem/Fingerprint/smiles_featurizer.py +185 -0
- synkit/Chem/Fingerprint/transformation_fp.py +79 -0
- synkit/Chem/Molecule/__init__.py +0 -0
- synkit/Chem/Molecule/standardize.py +137 -0
- synkit/Chem/Reaction/__init__.py +0 -0
- synkit/Chem/Reaction/balance_check.py +162 -0
- synkit/Chem/Reaction/cleanning.py +59 -0
- synkit/Chem/Reaction/deionize.py +289 -0
- synkit/Chem/Reaction/neutralize.py +256 -0
- synkit/Chem/Reaction/reagent.py +102 -0
- synkit/Chem/Reaction/standardize.py +157 -0
- synkit/Chem/Reaction/tautomerize.py +168 -0
- synkit/Graph/Cluster/__init__.py +0 -0
- synkit/Graph/Cluster/morphism.py +83 -0
- synkit/Graph/Feature/__init__.py +0 -0
- synkit/Graph/Feature/graph_descriptors.py +325 -0
- synkit/Graph/Feature/graph_fps.py +97 -0
- synkit/Graph/Feature/graph_signature.py +236 -0
- synkit/Graph/Feature/hash_fps.py +130 -0
- synkit/Graph/Feature/morgan_fps.py +87 -0
- synkit/Graph/Feature/path_fps.py +82 -0
- synkit/Graph/__init.py +0 -0
- synkit/IO/__init__.py +0 -0
- synkit/IO/chem_converter.py +231 -0
- synkit/IO/data_io.py +277 -0
- synkit/IO/data_process.py +49 -0
- synkit/IO/debug.py +78 -0
- synkit/IO/dg_to_gml.py +124 -0
- synkit/IO/gml_to_nx.py +119 -0
- synkit/IO/graph_to_mol.py +110 -0
- synkit/IO/mol_to_graph.py +282 -0
- synkit/IO/nx_to_gml.py +200 -0
- synkit/IO/parse_rule.py +172 -0
- synkit/IO/smiles_to_id.py +119 -0
- synkit/ITS/_misc.py +280 -0
- synkit/ITS/aam_validator.py +254 -0
- synkit/ITS/its_builder.py +94 -0
- synkit/ITS/its_construction.py +213 -0
- synkit/ITS/normalize_aam.py +183 -0
- synkit/ITS/partial_expand.py +170 -0
- synkit/Reactor/__init__.py +0 -0
- synkit/Reactor/core_engine.py +164 -0
- synkit/Reactor/inference.py +73 -0
- synkit/Reactor/multi_step.py +227 -0
- synkit/Reactor/multi_step_aam.py +82 -0
- synkit/Reactor/reagent.py +95 -0
- synkit/Reactor/rule_apply.py +81 -0
- synkit/Vis/__init__.py +0 -0
- synkit/Vis/chemical_graph_visualizer.py +378 -0
- synkit/Vis/chemical_reaction_visualizer.py +133 -0
- synkit/Vis/chemical_space.py +83 -0
- synkit/Vis/embedding.py +92 -0
- synkit/Vis/graph_visualizer.py +286 -0
- synkit/Vis/pdf_writer.py +143 -0
- synkit/Vis/rsmi_to_fig.py +169 -0
- synkit/__init__.py +0 -0
- synkit/_misc.py +181 -0
- synkit-0.0.1.dist-info/METADATA +148 -0
- synkit-0.0.1.dist-info/RECORD +63 -0
- synkit-0.0.1.dist-info/WHEEL +4 -0
- synkit-0.0.1.dist-info/licenses/LICENSE +21 -0
synkit/_misc.py
ADDED
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import random
|
|
2
|
+
from typing import Dict, List, Optional
|
|
3
|
+
from datetime import datetime
|
|
4
|
+
import networkx as nx
|
|
5
|
+
from typing import Iterable
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def stratified_random_sample(
|
|
9
|
+
data: List[Dict[str, any]],
|
|
10
|
+
property_key: str,
|
|
11
|
+
samples_per_class: int = 1,
|
|
12
|
+
seed: Optional[int] = 42,
|
|
13
|
+
bypass: bool = False,
|
|
14
|
+
) -> List[Dict[str, any]]:
|
|
15
|
+
"""
|
|
16
|
+
Stratifies and samples data from a list of dictionaries based on a
|
|
17
|
+
specified property key.
|
|
18
|
+
|
|
19
|
+
Parameters:
|
|
20
|
+
- data (List[Dict[str, any]]): The data to sample from, a list of dictionaries.
|
|
21
|
+
- property_key (str): The key in the dictionaries to stratify by.
|
|
22
|
+
- samples_per_class (int): The number of samples to take from each class.
|
|
23
|
+
Defaults to 1.
|
|
24
|
+
- seed (Optional[int], optional): The seed for the random number generator
|
|
25
|
+
for reproducibility. Defaults to 42.
|
|
26
|
+
- bypass (bool, optional): If True, classes with fewer than
|
|
27
|
+
`samples_per_class` entries will be skipped without raising an error.
|
|
28
|
+
Defaults to False.
|
|
29
|
+
|
|
30
|
+
Returns:
|
|
31
|
+
- List[Dict[str, any]]: A list of sampled dictionaries, where each entry corresponds
|
|
32
|
+
to a sampled item.
|
|
33
|
+
|
|
34
|
+
Raises:
|
|
35
|
+
- ValueError: If a class has fewer than `samples_per_class` entries
|
|
36
|
+
and `bypass` is False.
|
|
37
|
+
"""
|
|
38
|
+
|
|
39
|
+
if seed is not None:
|
|
40
|
+
random.seed(seed)
|
|
41
|
+
|
|
42
|
+
stratified_data = {}
|
|
43
|
+
for item in data:
|
|
44
|
+
key = item.get(property_key)
|
|
45
|
+
if key is None:
|
|
46
|
+
continue # Exclude data items where the specified key is not present
|
|
47
|
+
if key in stratified_data:
|
|
48
|
+
stratified_data[key].append(item)
|
|
49
|
+
else:
|
|
50
|
+
stratified_data[key] = [item]
|
|
51
|
+
|
|
52
|
+
sampled_data = []
|
|
53
|
+
for key, items in stratified_data.items():
|
|
54
|
+
class_size = len(items)
|
|
55
|
+
if class_size >= samples_per_class:
|
|
56
|
+
sampled_data.extend(random.sample(items, samples_per_class))
|
|
57
|
+
elif bypass:
|
|
58
|
+
continue # Skip this group entirely if not enough data and bypass is True
|
|
59
|
+
else:
|
|
60
|
+
raise ValueError(
|
|
61
|
+
f"Not enough data to sample {samples_per_class} items for class '{key}', "
|
|
62
|
+
f"only {class_size} available."
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
return sampled_data
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def calculate_processing_time(start_time_str: str, end_time_str: str) -> float:
|
|
69
|
+
"""
|
|
70
|
+
Calculates the processing time in seconds between two timestamps.
|
|
71
|
+
|
|
72
|
+
Parameters:
|
|
73
|
+
- start_time_str (str): A string representing the start time in the format
|
|
74
|
+
'YYYY-MM-DD HH:MM:SS,fff'.
|
|
75
|
+
- end_time_str (str): A string representing the end time in the same format as
|
|
76
|
+
start_time_str.
|
|
77
|
+
|
|
78
|
+
Returns:
|
|
79
|
+
- float: The duration between the start and end time in seconds.
|
|
80
|
+
|
|
81
|
+
Raises:
|
|
82
|
+
- ValueError: If the input strings do not match the expected format.
|
|
83
|
+
"""
|
|
84
|
+
datetime_format = "%Y-%m-%d %H:%M:%S,%f"
|
|
85
|
+
|
|
86
|
+
start_time = datetime.strptime(start_time_str, datetime_format)
|
|
87
|
+
end_time = datetime.strptime(end_time_str, datetime_format)
|
|
88
|
+
|
|
89
|
+
duration = end_time - start_time
|
|
90
|
+
|
|
91
|
+
return duration.total_seconds()
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
def remove_explicit_hydrogen(
|
|
95
|
+
Graph: nx.Graph, excluded_indices: Iterable[int]
|
|
96
|
+
) -> nx.Graph:
|
|
97
|
+
"""
|
|
98
|
+
Processes a molecular graph by calculating hydrogen count ('h_count') for each node and
|
|
99
|
+
removing hydrogen nodes that are not specified in the excluded indices.
|
|
100
|
+
|
|
101
|
+
Parameters
|
|
102
|
+
----------
|
|
103
|
+
Graph : nx.Graph
|
|
104
|
+
The input graph with nodes expected to have an 'element' attribute.
|
|
105
|
+
excluded_indices : Iterable[int]
|
|
106
|
+
Indices of hydrogen nodes to be preserved and excluded from 'h_count' calculations.
|
|
107
|
+
|
|
108
|
+
Returns
|
|
109
|
+
-------
|
|
110
|
+
nx.Graph
|
|
111
|
+
The modified graph where each node has an 'h_count' attribute indicating the count
|
|
112
|
+
of hydrogen neighbors, and specific hydrogens have been removed unless listed in
|
|
113
|
+
excluded_indices.
|
|
114
|
+
|
|
115
|
+
Notes
|
|
116
|
+
-----
|
|
117
|
+
This function operates on a copy of the input graph and does not alter the original.
|
|
118
|
+
"""
|
|
119
|
+
G = Graph.copy()
|
|
120
|
+
|
|
121
|
+
# Calculate h_count for each node
|
|
122
|
+
for node in list(G.nodes):
|
|
123
|
+
h_count = 0
|
|
124
|
+
for neighbor in G.neighbors(node):
|
|
125
|
+
if (
|
|
126
|
+
G.nodes[neighbor].get("element") == "H"
|
|
127
|
+
and neighbor not in excluded_indices
|
|
128
|
+
):
|
|
129
|
+
h_count += 1
|
|
130
|
+
G.nodes[node]["hcount"] = h_count
|
|
131
|
+
|
|
132
|
+
# Remove hydrogen nodes not in excluded indices
|
|
133
|
+
nodes_to_remove = [
|
|
134
|
+
n
|
|
135
|
+
for n in G.nodes
|
|
136
|
+
if G.nodes[n].get("element") == "H" and n not in excluded_indices
|
|
137
|
+
]
|
|
138
|
+
G.remove_nodes_from(nodes_to_remove)
|
|
139
|
+
|
|
140
|
+
return G
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
def fix_implicit_hydrogen(Graph: nx.Graph, indices: Iterable[int]) -> nx.Graph:
|
|
144
|
+
"""
|
|
145
|
+
Adjusts the 'h_count' attribute of specific nodes in a molecular graph,
|
|
146
|
+
decreasing it based on the presence of neighboring hydrogen atoms that are also
|
|
147
|
+
included in the specified indices. This function works on a copy
|
|
148
|
+
of the provided graph and returns the modified copy.
|
|
149
|
+
|
|
150
|
+
Parameters
|
|
151
|
+
----------
|
|
152
|
+
- Graph (nx.Graph): The input graph where nodes have an 'element' attribute
|
|
153
|
+
and possibly an 'hcount'.
|
|
154
|
+
- indices (Iterable[int]): Indices of nodes to check for neighboring hydrogen atoms
|
|
155
|
+
that are also in the indices list.
|
|
156
|
+
|
|
157
|
+
Returns
|
|
158
|
+
-------
|
|
159
|
+
- nx.Graph: A modified copy of the original graph with adjusted
|
|
160
|
+
'hcount' for specific nodes.
|
|
161
|
+
|
|
162
|
+
Notes
|
|
163
|
+
-----
|
|
164
|
+
Ensure the 'hcount' exists and is appropriately structured before using this
|
|
165
|
+
function. It is assumed that 'hcount' is a mutable integer that can be directly
|
|
166
|
+
decremented.
|
|
167
|
+
"""
|
|
168
|
+
G = Graph.copy() # Work on a copy of the graph to preserve the original
|
|
169
|
+
valid_indices = set(indices).intersection(
|
|
170
|
+
G.nodes
|
|
171
|
+
) # Ensure node indices exist in the graph
|
|
172
|
+
|
|
173
|
+
for node in valid_indices:
|
|
174
|
+
if "hcount" in G.nodes[node]: # Ensure the node has an 'h_count' to modify
|
|
175
|
+
for neighbor in G.neighbors(node):
|
|
176
|
+
# Check if neighbor is hydrogen and also in indices
|
|
177
|
+
if G.nodes[neighbor].get("element") == "H" and neighbor in indices:
|
|
178
|
+
if G.nodes[node].get("element") != "H":
|
|
179
|
+
G.nodes[node]["hcount"] -= 1
|
|
180
|
+
|
|
181
|
+
return G
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: synkit
|
|
3
|
+
Version: 0.0.1
|
|
4
|
+
Summary: Utility for reaction modeling using graph grammar
|
|
5
|
+
Project-URL: homepage, https://github.com/TieuLongPhan/SynKit
|
|
6
|
+
Project-URL: source, https://github.com/TieuLongPhan/SynKit
|
|
7
|
+
Project-URL: issues, https://github.com/TieuLongPhan/SynKit/issues
|
|
8
|
+
Project-URL: documentation, https://tieulongphan.github.io/SynKit/
|
|
9
|
+
Author-email: Tieu Long Phan <tieu@bioinf.uni-leipzig.de>
|
|
10
|
+
License-File: LICENSE
|
|
11
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
12
|
+
Classifier: Operating System :: OS Independent
|
|
13
|
+
Classifier: Programming Language :: Python :: 3
|
|
14
|
+
Requires-Python: >=3.11
|
|
15
|
+
Requires-Dist: networkx>=3.3
|
|
16
|
+
Requires-Dist: pandas>=1.5.3
|
|
17
|
+
Requires-Dist: rdkit>=2024.3.3
|
|
18
|
+
Requires-Dist: requests>=2.32.3
|
|
19
|
+
Requires-Dist: scikit-learn>=1.4.0
|
|
20
|
+
Requires-Dist: seaborn>=0.13.2
|
|
21
|
+
Provides-Extra: all
|
|
22
|
+
Requires-Dist: drfp==0.3.6; extra == 'all'
|
|
23
|
+
Requires-Dist: fgutils>=0.1.3; extra == 'all'
|
|
24
|
+
Requires-Dist: rxn-chem-utils==1.5.0; extra == 'all'
|
|
25
|
+
Requires-Dist: rxn-utils==2.0.0; extra == 'all'
|
|
26
|
+
Requires-Dist: rxnmapper==0.3.0; extra == 'all'
|
|
27
|
+
Requires-Dist: xgboost>=2.1.1; extra == 'all'
|
|
28
|
+
Description-Content-Type: text/markdown
|
|
29
|
+
|
|
30
|
+
# SynKit
|
|
31
|
+
|
|
32
|
+
**Toolkit for Synthesis Planning**
|
|
33
|
+
|
|
34
|
+
SynKit is a collection of tools designed to support the planning and execution of chemical synthesis.
|
|
35
|
+
|
|
36
|
+

|
|
37
|
+
|
|
38
|
+
Our tools are tailored to assist researchers and chemists in navigating complex chemical reactions and synthesis pathways, leveraging the power of modern computational chemistry. Whether you're designing novel compounds or optimizing existing processes, ``synkit`` aims to provide the critical tools you need.
|
|
39
|
+
|
|
40
|
+
For more details on each utility within the repository, please refer to the documentation provided in the respective folders.
|
|
41
|
+
|
|
42
|
+
## Step-by-Step Installation Guide
|
|
43
|
+
|
|
44
|
+
1. **Python Installation:**
|
|
45
|
+
Ensure that Python 3.11 or later is installed on your system. You can download it from [python.org](https://www.python.org/downloads/).
|
|
46
|
+
|
|
47
|
+
2. **Creating a Virtual Environment (Optional but Recommended):**
|
|
48
|
+
It's recommended to use a virtual environment to avoid conflicts with other projects or system-wide packages. Use the following commands to create and activate a virtual environment:
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
python -m venv synkit-env
|
|
52
|
+
source synkit-env/bin/activate
|
|
53
|
+
```
|
|
54
|
+
Or Conda
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
conda create --name synkit-env python=3.11
|
|
58
|
+
conda activate synkit-env
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
3. **Install from PyPi:**
|
|
62
|
+
The easiest way to use SynTemp is by installing the PyPI package
|
|
63
|
+
[synkit](https://pypi.org/project/synkit/).
|
|
64
|
+
|
|
65
|
+
```
|
|
66
|
+
pip install synkit
|
|
67
|
+
```
|
|
68
|
+
Optional if you want to install full version
|
|
69
|
+
```
|
|
70
|
+
pip install synkit[all]
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## For contributors
|
|
74
|
+
|
|
75
|
+
We're welcoming new contributors to build this project better. Please not hesitate to inquire me via [email][tieu@bioinf.uni-leipzig.de].
|
|
76
|
+
|
|
77
|
+
Before you start, ensure your local development environment is set up correctly. Pull the latest version of the `main` branch to start with the most recent stable code.
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
git checkout main
|
|
81
|
+
git pull
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## Working on New Features
|
|
85
|
+
|
|
86
|
+
1. **Create a New Branch**:
|
|
87
|
+
For every new feature or bug fix, create a new branch from the `main` branch. Name your branch meaningfully, related to the feature or fix you are working on.
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
git checkout -b feature/your-feature-name
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
2. **Develop and Commit Changes**:
|
|
94
|
+
Make your changes locally, commit them to your branch. Keep your commits small and focused; each should represent a logical unit of work.
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
git commit -m "Describe the change"
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
3. **Run Quality Checks**:
|
|
101
|
+
Before finalizing your feature, run the following commands to ensure your code meets our formatting standards and passes all tests:
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
./lint.sh # Check code format
|
|
105
|
+
pytest Test # Run tests
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
Fix any issues or errors highlighted by these checks.
|
|
109
|
+
|
|
110
|
+
## Integrating Changes
|
|
111
|
+
|
|
112
|
+
1. **Rebase onto Staging**:
|
|
113
|
+
Once your feature is complete and tests pass, rebase your changes onto the `staging` branch to prepare for integration.
|
|
114
|
+
|
|
115
|
+
```bash
|
|
116
|
+
git fetch origin
|
|
117
|
+
git rebase origin/staging
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
Carefully resolve any conflicts that arise during the rebase.
|
|
121
|
+
|
|
122
|
+
2. **Push to Your Feature Branch**:
|
|
123
|
+
After successfully rebasing, push your branch to the remote repository.
|
|
124
|
+
|
|
125
|
+
```bash
|
|
126
|
+
git push origin feature/your-feature-name
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
3. **Create a Pull Request**:
|
|
130
|
+
Open a pull request from your feature branch to the `stagging` branch. Ensure the pull request description clearly describes the changes and any additional context necessary for review.
|
|
131
|
+
|
|
132
|
+
## Contributing
|
|
133
|
+
- [Tieu-Long Phan](https://tieulongphan.github.io/)
|
|
134
|
+
- [Klaus Weinbauer](https://github.com/klausweinbauer)
|
|
135
|
+
- [Phuoc-Chung Nguyen Van](https://github.com/phuocchung123)
|
|
136
|
+
|
|
137
|
+
## Deployment timeline
|
|
138
|
+
|
|
139
|
+
We plan to update new version quarterly.
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
## License
|
|
143
|
+
|
|
144
|
+
This project is licensed under MIT License - see the [License](LICENSE) file for details.
|
|
145
|
+
|
|
146
|
+
## Acknowledgments
|
|
147
|
+
|
|
148
|
+
This project has received funding from the European Unions Horizon Europe Doctoral Network programme under the Marie-Skłodowska-Curie grant agreement No 101072930 ([TACsy](https://tacsy.eu/) -- Training Alliance for Computational)
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
synkit/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
2
|
+
synkit/_misc.py,sha256=wPyS42xYGGHOFKZT7JtJHdpLQyk14MQylEf9AJiEG6o,6106
|
|
3
|
+
synkit/Chem/Fingerprint/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
4
|
+
synkit/Chem/Fingerprint/fp_calculator.py,sha256=EVJ-c-LdQ412SOLDbYs7UkPsf5XFH-hz70Dv2x4QjVw,4206
|
|
5
|
+
synkit/Chem/Fingerprint/smiles_featurizer.py,sha256=fQFyvUYoQVpSeskU_cC-H2L-s4tuRBWTXgIwF7MAINA,6706
|
|
6
|
+
synkit/Chem/Fingerprint/transformation_fp.py,sha256=QcI4tOJUZfH5QzZM_6WqBoVuJMiVUtvQGrwkP1nZJcQ,2897
|
|
7
|
+
synkit/Chem/Molecule/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
8
|
+
synkit/Chem/Molecule/standardize.py,sha256=jmHm90iSv0hTO0VF1Gc_RrH4WfxbA0srhZD6dXPg1B8,3616
|
|
9
|
+
synkit/Chem/Reaction/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
10
|
+
synkit/Chem/Reaction/balance_check.py,sha256=HKL82oUVSjF0oivtW9L2oHNbyZw-1kPx4RpMGMeNVP8,5809
|
|
11
|
+
synkit/Chem/Reaction/cleanning.py,sha256=NU7Zfg0P3dYHsipcE3JZzBco6tLPKzbMdvM8puWWNwk,2051
|
|
12
|
+
synkit/Chem/Reaction/deionize.py,sha256=ZCyixwRPfA90-qbOgPZx2uLJWcUiQ2VDPKoZvKDgRBc,11345
|
|
13
|
+
synkit/Chem/Reaction/neutralize.py,sha256=ElnIJvN-8d83dwM5vcqvg55LmIinTtUAJw7koFaP_Xc,10486
|
|
14
|
+
synkit/Chem/Reaction/reagent.py,sha256=fJB96kPX1ZJ4M226_a7A3lI-y0LU4_-ekoXFNo4pzTo,3932
|
|
15
|
+
synkit/Chem/Reaction/standardize.py,sha256=UQYOkcMDTKKvXURcAXMQZWHCm-SLQ8vb1uTPPS8nrs4,5937
|
|
16
|
+
synkit/Chem/Reaction/tautomerize.py,sha256=5s8ivAE-gk8MY17klocFardjsCYeh2-HvIAMa-Sglow,6247
|
|
17
|
+
synkit/Graph/__init.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
18
|
+
synkit/Graph/Cluster/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
19
|
+
synkit/Graph/Cluster/morphism.py,sha256=O8exowhzfR2vQn4XcthEL3PxiOqPq5hMMR5XEIhDxtA,2889
|
|
20
|
+
synkit/Graph/Feature/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
21
|
+
synkit/Graph/Feature/graph_descriptors.py,sha256=UwJJre1RLhs4qpkRtZ_MwIwpWyZadq-ikWoI_HSVrTI,11180
|
|
22
|
+
synkit/Graph/Feature/graph_fps.py,sha256=8J0-aONHQP2kG3WOtMop-lZGhn5aadYvXXaod5_7HD0,3539
|
|
23
|
+
synkit/Graph/Feature/graph_signature.py,sha256=_0OdhnlHF7cqd6DrfdeVdx5GSGZ65izzCVqlQPbV9WQ,9983
|
|
24
|
+
synkit/Graph/Feature/hash_fps.py,sha256=dYpSQgtvVTZ3-QMG-GLbSkpiFEnbdw77wZtFp6NYp3I,4856
|
|
25
|
+
synkit/Graph/Feature/morgan_fps.py,sha256=BtNOwi4KyrnZq6GHerP3t-BClCP_oOrOHKnPmIh0ytU,3191
|
|
26
|
+
synkit/Graph/Feature/path_fps.py,sha256=3_fL1V4uGukjt3i_0eiRu2MKbT0_4-tVKiIu8oJswXE,3186
|
|
27
|
+
synkit/IO/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
28
|
+
synkit/IO/chem_converter.py,sha256=XzGD94-7KAdVylUmgSsRMwi3KPGRgnLYRkSSMTydSTc,7885
|
|
29
|
+
synkit/IO/data_io.py,sha256=6Ud-fnTir-aeqToR_8GKZVeRcgKAUGPzw7Q6TV6Rkik,7768
|
|
30
|
+
synkit/IO/data_process.py,sha256=3-wKIDl_jy_eod966hbIQfSjW76Rffpb-lyjh-xoz9E,1850
|
|
31
|
+
synkit/IO/debug.py,sha256=_fTNlUlB8Gbeyk_RPmhdMrvtftnc09aNx9734xttXtM,2336
|
|
32
|
+
synkit/IO/dg_to_gml.py,sha256=b-t-4LPkjztWskLo9Is8TidQCEg9ZwjW3oyAB6Wbk3U,4439
|
|
33
|
+
synkit/IO/gml_to_nx.py,sha256=lerPnBY1Spf_2ccWFtP15m73nwJS5Ny2Ss-Rv0Von74,4868
|
|
34
|
+
synkit/IO/graph_to_mol.py,sha256=9v3TxEaKjW2xkVuR2OslfLmmjgJ77nFA0agW0WS64qs,3668
|
|
35
|
+
synkit/IO/mol_to_graph.py,sha256=pP9oRW7XK-0CcsI-ks1oT5pi2tIQzos3-UtVt-Do6h0,10050
|
|
36
|
+
synkit/IO/nx_to_gml.py,sha256=mJ8qF0YU5JROczs2D2SxgrApM7r1WcqTAE1RilVecTg,7411
|
|
37
|
+
synkit/IO/parse_rule.py,sha256=xtz3DSrWsPEaIOaOMLZjHDO2uUnZa2XjsvbkEFP9QYc,5728
|
|
38
|
+
synkit/IO/smiles_to_id.py,sha256=DqwZx_yNp_D9LE6Lt7TBnbEXpDNAiLwqTc2N4dg6T18,4256
|
|
39
|
+
synkit/ITS/_misc.py,sha256=Eef3axSxESubkhnyd1mQsLY7hjxbrRTt62u6unbKVDM,9942
|
|
40
|
+
synkit/ITS/aam_validator.py,sha256=3WV7yZJMmwxcaoQ8IayNUw4PLJJVeT9Pkg_qkLNYP4w,9718
|
|
41
|
+
synkit/ITS/its_builder.py,sha256=qiSdo8hQ4MHQTpGA3CKJUeykAOzgIKvDEvQTNEjueOI,3630
|
|
42
|
+
synkit/ITS/its_construction.py,sha256=nFGBsXxHADwDCkbR7B2l7XWXcbxltsDopHfRG_7ah9U,8545
|
|
43
|
+
synkit/ITS/normalize_aam.py,sha256=5-euyF7s7s2sUjYRVWy1D0B4TBEbGCeoiXpgz43nqps,6779
|
|
44
|
+
synkit/ITS/partial_expand.py,sha256=YtEXUQA3Hjbq1_Yvt_EALzRA86UTBD46xhkL53U7ESE,6818
|
|
45
|
+
synkit/Reactor/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
46
|
+
synkit/Reactor/core_engine.py,sha256=T0HbrIq_eifRCczcwwbL0KOhv4BsgKzN3-dzsXgIQQ8,6811
|
|
47
|
+
synkit/Reactor/inference.py,sha256=MIrxMs71GXmhx7ZRWX1u_J1n38tSZDuu-_Zkqgz2SNI,2721
|
|
48
|
+
synkit/Reactor/multi_step.py,sha256=qlVw37m0AesNXe9dW5dn6Lz1v2d9hCX-pSe6cPUD6ts,7942
|
|
49
|
+
synkit/Reactor/multi_step_aam.py,sha256=OFJvyqrrrUwXgtoG-Hgz3OVpTwhD7TuBe9241T2OuqY,2776
|
|
50
|
+
synkit/Reactor/reagent.py,sha256=pXcqkMIdmxgbtVF181tgDsKv40ZsiU4_kZypGrOYPhg,3614
|
|
51
|
+
synkit/Reactor/rule_apply.py,sha256=92aZAchPfuybzAJlx7DZg3hmSDxS7LWmV-fqNphLL5M,2807
|
|
52
|
+
synkit/Vis/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
53
|
+
synkit/Vis/chemical_graph_visualizer.py,sha256=nJqMXgUlLbo_asDX4Vv8yiz5mSxOcmYUKnA4DOyfNhE,13556
|
|
54
|
+
synkit/Vis/chemical_reaction_visualizer.py,sha256=iV-18P154MXbWbjVk9l42iIIasIfeOAaZFQOIuqTKF0,5527
|
|
55
|
+
synkit/Vis/chemical_space.py,sha256=vHWIYZdk9Rvg1RVStkgQkYRBCMvRm4qP9evFhOJ3WEo,2650
|
|
56
|
+
synkit/Vis/embedding.py,sha256=cOdfv0H6pbrguivaS56mrDG2WDTWC24vnY7PkfiO3dM,2819
|
|
57
|
+
synkit/Vis/graph_visualizer.py,sha256=4FRYqrxz35O0IvmeU_Lq3IwpYoT8E4cDpWEXFZplhpA,10782
|
|
58
|
+
synkit/Vis/pdf_writer.py,sha256=zHdiEFJFpQEFYpJQvsAm4h7y6V1aCcWZcr47lE6l5mA,5528
|
|
59
|
+
synkit/Vis/rsmi_to_fig.py,sha256=BoWEL-xiy8rpVk-SgXmx7PQ4Y89e9R3aWQ2ywcEx-sk,5791
|
|
60
|
+
synkit-0.0.1.dist-info/METADATA,sha256=dGHQfRP14NMyMBjIrWiY8hddU_Q3r5V4-oJHV9APUGQ,5233
|
|
61
|
+
synkit-0.0.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
62
|
+
synkit-0.0.1.dist-info/licenses/LICENSE,sha256=kkW526ibbbADXjJJB96NPh_27HiOUsvJgzjAe56Cfvk,1071
|
|
63
|
+
synkit-0.0.1.dist-info/RECORD,,
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Tieu Long Phan
|
|
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.
|