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.
Files changed (63) hide show
  1. synkit/Chem/Fingerprint/__init__.py +0 -0
  2. synkit/Chem/Fingerprint/fp_calculator.py +122 -0
  3. synkit/Chem/Fingerprint/smiles_featurizer.py +185 -0
  4. synkit/Chem/Fingerprint/transformation_fp.py +79 -0
  5. synkit/Chem/Molecule/__init__.py +0 -0
  6. synkit/Chem/Molecule/standardize.py +137 -0
  7. synkit/Chem/Reaction/__init__.py +0 -0
  8. synkit/Chem/Reaction/balance_check.py +162 -0
  9. synkit/Chem/Reaction/cleanning.py +59 -0
  10. synkit/Chem/Reaction/deionize.py +289 -0
  11. synkit/Chem/Reaction/neutralize.py +256 -0
  12. synkit/Chem/Reaction/reagent.py +102 -0
  13. synkit/Chem/Reaction/standardize.py +157 -0
  14. synkit/Chem/Reaction/tautomerize.py +168 -0
  15. synkit/Graph/Cluster/__init__.py +0 -0
  16. synkit/Graph/Cluster/morphism.py +83 -0
  17. synkit/Graph/Feature/__init__.py +0 -0
  18. synkit/Graph/Feature/graph_descriptors.py +325 -0
  19. synkit/Graph/Feature/graph_fps.py +97 -0
  20. synkit/Graph/Feature/graph_signature.py +236 -0
  21. synkit/Graph/Feature/hash_fps.py +130 -0
  22. synkit/Graph/Feature/morgan_fps.py +87 -0
  23. synkit/Graph/Feature/path_fps.py +82 -0
  24. synkit/Graph/__init.py +0 -0
  25. synkit/IO/__init__.py +0 -0
  26. synkit/IO/chem_converter.py +231 -0
  27. synkit/IO/data_io.py +277 -0
  28. synkit/IO/data_process.py +49 -0
  29. synkit/IO/debug.py +78 -0
  30. synkit/IO/dg_to_gml.py +124 -0
  31. synkit/IO/gml_to_nx.py +119 -0
  32. synkit/IO/graph_to_mol.py +110 -0
  33. synkit/IO/mol_to_graph.py +282 -0
  34. synkit/IO/nx_to_gml.py +200 -0
  35. synkit/IO/parse_rule.py +172 -0
  36. synkit/IO/smiles_to_id.py +119 -0
  37. synkit/ITS/_misc.py +280 -0
  38. synkit/ITS/aam_validator.py +254 -0
  39. synkit/ITS/its_builder.py +94 -0
  40. synkit/ITS/its_construction.py +213 -0
  41. synkit/ITS/normalize_aam.py +183 -0
  42. synkit/ITS/partial_expand.py +170 -0
  43. synkit/Reactor/__init__.py +0 -0
  44. synkit/Reactor/core_engine.py +164 -0
  45. synkit/Reactor/inference.py +73 -0
  46. synkit/Reactor/multi_step.py +227 -0
  47. synkit/Reactor/multi_step_aam.py +82 -0
  48. synkit/Reactor/reagent.py +95 -0
  49. synkit/Reactor/rule_apply.py +81 -0
  50. synkit/Vis/__init__.py +0 -0
  51. synkit/Vis/chemical_graph_visualizer.py +378 -0
  52. synkit/Vis/chemical_reaction_visualizer.py +133 -0
  53. synkit/Vis/chemical_space.py +83 -0
  54. synkit/Vis/embedding.py +92 -0
  55. synkit/Vis/graph_visualizer.py +286 -0
  56. synkit/Vis/pdf_writer.py +143 -0
  57. synkit/Vis/rsmi_to_fig.py +169 -0
  58. synkit/__init__.py +0 -0
  59. synkit/_misc.py +181 -0
  60. synkit-0.0.1.dist-info/METADATA +148 -0
  61. synkit-0.0.1.dist-info/RECORD +63 -0
  62. synkit-0.0.1.dist-info/WHEEL +4 -0
  63. 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
+ ![SynKit](https://raw.githubusercontent.com/TieuLongPhan/SynKit/main/Data/Figure/synkit.png)
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,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: hatchling 1.27.0
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
@@ -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.