molcraft 0.1.0a1__py3-none-any.whl → 0.1.0a2__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.

Potentially problematic release.


This version of molcraft might be problematic. Click here for more details.

molcraft/models.py CHANGED
@@ -194,8 +194,7 @@ class GraphModel(layers.GraphLayer, keras.models.Model):
194
194
  Args:
195
195
  x:
196
196
  A `GraphTensor` instance or a `tf.data.Dataset` constructed from
197
- a `GraphTensor` instance. Context `label`s and/or `weight`s may
198
- be encoded and will be ignored.
197
+ a `GraphTensor` instance.
199
198
  batch_size:
200
199
  Number of samples per batch of computation.
201
200
  kwargs:
molcraft/tensors.py CHANGED
@@ -9,6 +9,9 @@ from molcraft import ops
9
9
  class GraphTensorBatchEncoder(tf.experimental.ExtensionTypeBatchEncoder):
10
10
 
11
11
  def batch(self, spec: 'GraphTensor.Spec', batch_size: int | None):
12
+ """Batches spec.
13
+ """
14
+
12
15
  def batch_field(f):
13
16
  if isinstance(f, tf.TensorSpec):
14
17
  return tf.TensorSpec(
@@ -36,6 +39,9 @@ class GraphTensorBatchEncoder(tf.experimental.ExtensionTypeBatchEncoder):
36
39
  return batched_spec
37
40
 
38
41
  def unbatch(self, spec: 'GraphTensor.Spec'):
42
+ """Unbatches spec.
43
+ """
44
+
39
45
  def unbatch_field(f):
40
46
  if isinstance(f, tf.TensorSpec):
41
47
  return tf.TensorSpec(
@@ -63,6 +69,8 @@ class GraphTensorBatchEncoder(tf.experimental.ExtensionTypeBatchEncoder):
63
69
  return unbatched_spec
64
70
 
65
71
  def encode(self, spec: 'GraphTensor.Spec', value: 'GraphTensor', minimum_rank: int = 0):
72
+ """Encodes value.
73
+ """
66
74
  unflatten = False if (is_ragged(spec) or is_scalar(spec)) else True
67
75
  if unflatten:
68
76
  value = value.unflatten()
@@ -74,6 +82,8 @@ class GraphTensorBatchEncoder(tf.experimental.ExtensionTypeBatchEncoder):
74
82
  return value_components
75
83
 
76
84
  def encoding_specs(self, spec: 'GraphTensor.Spec'):
85
+ """Matches spec and encoded value of `encode(spec, value)`.
86
+ """
77
87
  def encode_fields(f):
78
88
  if isinstance(f, tf.TensorSpec):
79
89
  scalar = is_scalar(spec)
@@ -95,6 +105,8 @@ class GraphTensorBatchEncoder(tf.experimental.ExtensionTypeBatchEncoder):
95
105
  return spec_components
96
106
 
97
107
  def decode(self, spec, encoded_value):
108
+ """Decodes encoded value.
109
+ """
98
110
  spec_tuple = tuple(spec.__dict__.values())
99
111
  encoded_value = iter(encoded_value)
100
112
  value_tuple = [
@@ -122,18 +134,27 @@ class GraphTensor(tf.experimental.BatchableExtensionType):
122
134
  __name__ = 'GraphTensor'
123
135
 
124
136
  def __validate__(self):
125
- assert 'size' in self.context, "graph.context['size'] is required."
126
- assert self.context['size'].dtype == tf.int32, (
127
- "dtype of graph.context['size'] needs to be int32.")
128
- assert 'feature' in self.node, "graph.node['feature'] is required."
129
- assert 'source' in self.edge, "graph.edge['source'] is required."
130
- assert 'target' in self.edge, "graph.edge['target'] is required."
131
- assert self.edge['source'].dtype == tf.int32, (
132
- "dtype of graph.edge['source'] needs to be int32.")
133
- assert self.edge['target'].dtype == tf.int32, (
134
- "dtype of graph.edge['target'] needs to be int32.")
135
- # TODO: Assert node sizes (based on context['size'])
136
- # Assert edge sizes (based on edge['source'])
137
+ if tf.executing_eagerly():
138
+ assert 'size' in self.context, "graph.context['size'] is required."
139
+ assert self.context['size'].dtype == tf.int32, (
140
+ "dtype of graph.context['size'] needs to be int32."
141
+ )
142
+ assert 'feature' in self.node, "graph.node['feature'] is required."
143
+ assert 'source' in self.edge, "graph.edge['source'] is required."
144
+ assert 'target' in self.edge, "graph.edge['target'] is required."
145
+ assert self.edge['source'].dtype == tf.int32, (
146
+ "dtype of graph.edge['source'] needs to be int32."
147
+ )
148
+ assert self.edge['target'].dtype == tf.int32, (
149
+ "dtype of graph.edge['target'] needs to be int32."
150
+ )
151
+ if isinstance(self.node['feature'], tf.Tensor):
152
+ num_nodes = keras.ops.shape(self.node['feature'])[0]
153
+ else:
154
+ num_nodes = keras.ops.sum(self.node['feature'].row_lengths())
155
+ assert keras.ops.sum(self.context['size']) == num_nodes, (
156
+ "graph.node['feature'] tensor is incompatible with graph.context['size']"
157
+ )
137
158
 
138
159
  @property
139
160
  def spec(self):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: molcraft
3
- Version: 0.1.0a1
3
+ Version: 0.1.0a2
4
4
  Summary: Graph Neural Networks for Molecular Machine Learning
5
5
  Author-email: Alexander Kensert <alexander.kensert@gmail.com>
6
6
  License: MIT License
@@ -56,3 +56,70 @@ Dynamic: license-file
56
56
  - Modular graph **layers**
57
57
  - Serializable graph **featurizers** and **models**
58
58
  - Flexible **GraphTensor**
59
+
60
+ ## Examples
61
+
62
+ ```python
63
+ from molcraft import features
64
+ from molcraft import descriptors
65
+ from molcraft import featurizers
66
+ from molcraft import layers
67
+ from molcraft import models
68
+ import keras
69
+
70
+ featurizer = featurizers.MolGraphFeaturizer(
71
+ atom_features=[
72
+ features.AtomType(),
73
+ features.TotalNumHs(),
74
+ features.Degree(),
75
+ ],
76
+ bond_features=[
77
+ features.BondType(),
78
+ features.IsRotatable(),
79
+ ],
80
+ super_atom=True,
81
+ self_loops=False,
82
+ )
83
+
84
+ graph = featurizer([('N[C@@H](C)C(=O)O', 2.0), ('N[C@@H](CS)C(=O)O', 1.0)])
85
+ print(graph)
86
+
87
+ model = models.GraphModel.from_layers(
88
+ [
89
+ layers.Input(graph.spec),
90
+ layers.NodeEmbedding(dim=128),
91
+ layers.EdgeEmbedding(dim=128),
92
+ layers.GraphTransformer(units=128),
93
+ layers.GraphTransformer(units=128),
94
+ layers.GraphTransformer(units=128),
95
+ layers.GraphTransformer(units=128),
96
+ layers.Readout(mode='mean'),
97
+ keras.layers.Dense(units=1024, activation='relu'),
98
+ keras.layers.Dense(units=1024, activation='relu'),
99
+ keras.layers.Dense(1)
100
+ ]
101
+ )
102
+
103
+ pred = model(graph)
104
+ print(pred)
105
+
106
+ # featurizers.save_featurizer(featurizer, '/tmp/featurizer.json')
107
+ # models.save_model(model, '/tmp/model.keras')
108
+
109
+ # featurizers.load_featurizer('/tmp/featurizer.json')
110
+ # models.load_model('/tmp/model.keras')
111
+ ```
112
+
113
+ ## Installation
114
+
115
+ Install the pre-release of molcraft via pip:
116
+
117
+ ```bash
118
+ pip install molcraft --pre
119
+ ```
120
+
121
+ with GPU support:
122
+
123
+ ```bash
124
+ pip install molcraft[gpu] --pre
125
+ ```
@@ -0,0 +1,20 @@
1
+ molcraft/__init__.py,sha256=lE7_mCo7lLcP1AopGZtGyWqzAN1qgjZnH5juymdjrJc,406
2
+ molcraft/callbacks.py,sha256=6gwCwdsHGb-fVB4m1QGmtBwQwZ9mFq9QUkmPKSMn05U,849
3
+ molcraft/chem.py,sha256=_UO5O-I7KUtGf3vRrFEYoAUGlW5xi2x8ylu5f-Ybumo,18696
4
+ molcraft/conformers.py,sha256=p09gOQOdxLSj3yohZOMkxxLriHsZ1ZqOoiWLi73OpIg,4325
5
+ molcraft/datasets.py,sha256=rFgXTC1ZheLhfgQgcCspP_wEE54a33PIneH7OplbS-8,4047
6
+ molcraft/descriptors.py,sha256=x6RfZ-gK7D_WSvmK6sh6yHyEjQqovPnRU0xwC3dAKfg,2880
7
+ molcraft/features.py,sha256=nZDfX9fsWWjhUbUbrWSUI0ny1QIDbxb4MO8umjcdQqw,13572
8
+ molcraft/featurizers.py,sha256=gAUe7Ui8gF32aotuiDAUoRUuw8bTbkMgB2C2BO1VWDM,26176
9
+ molcraft/layers.py,sha256=zs6Ae6p7ASeAy3eF113f35d55yQmyk2Z7vUUfkfJUmY,49677
10
+ molcraft/models.py,sha256=Nvm5LKCtH-xj395f1OvIEmYVTTrnutoSthL2DxGicnY,16519
11
+ molcraft/ops.py,sha256=iiE6zgA2P7cmjKO1RHmL9GE_Tv7Tyuo_xDoxB_ELZQM,3824
12
+ molcraft/records.py,sha256=w4-bcWZEC0oVInrE1e0kQBroIaSCA0PN1JBPOtO6VUY,5251
13
+ molcraft/tensors.py,sha256=b7PO-YOvV72s9g057ILJACKS2n2fn10VkO35gHXpssI,22312
14
+ molcraft/experimental/__init__.py,sha256=x5h6LOO8bo3NPjkKKM9M1H-Kz6R3yxYhRSePoxHCdRE,42
15
+ molcraft/experimental/peptides.py,sha256=RCuOTSwoYHGSdeYi6TWHdPIv2WC3avCZjKLdhEZQeXw,8997
16
+ molcraft-0.1.0a2.dist-info/licenses/LICENSE,sha256=sbVeqlrtZ0V63uYhZGL5dCxUm8rBAOqe2avyA1zIQNk,1074
17
+ molcraft-0.1.0a2.dist-info/METADATA,sha256=TYf32YHTSrK9OaaGKCCk89uPlf_REWsK-LKf93c6V4M,4088
18
+ molcraft-0.1.0a2.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
19
+ molcraft-0.1.0a2.dist-info/top_level.txt,sha256=dENV6MfOceshM6MQCgJlcN1ojZkiCL9B4F7XyUge3QM,9
20
+ molcraft-0.1.0a2.dist-info/RECORD,,
@@ -1,19 +0,0 @@
1
- molcraft/__init__.py,sha256=lx_frHVGfTmGUmzLhCt5LJVy47W_d_mTrKtRsw9RTQ8,406
2
- molcraft/callbacks.py,sha256=6gwCwdsHGb-fVB4m1QGmtBwQwZ9mFq9QUkmPKSMn05U,849
3
- molcraft/chem.py,sha256=_UO5O-I7KUtGf3vRrFEYoAUGlW5xi2x8ylu5f-Ybumo,18696
4
- molcraft/conformers.py,sha256=p09gOQOdxLSj3yohZOMkxxLriHsZ1ZqOoiWLi73OpIg,4325
5
- molcraft/descriptors.py,sha256=x6RfZ-gK7D_WSvmK6sh6yHyEjQqovPnRU0xwC3dAKfg,2880
6
- molcraft/features.py,sha256=nZDfX9fsWWjhUbUbrWSUI0ny1QIDbxb4MO8umjcdQqw,13572
7
- molcraft/featurizers.py,sha256=epv-K5ah9MVFEDZ7c2UzT7f9Vxglr28sbQoTYk1fev8,24583
8
- molcraft/layers.py,sha256=XRxAUXnYOQ_fD8OegkuJTb1zMHHKm_4lAjxnIr2fdl4,43119
9
- molcraft/models.py,sha256=z2V9_I_cnJr3VNqfY_CWkZKojlLoD_8r9MHkv3pKOh8,16605
10
- molcraft/ops.py,sha256=iiE6zgA2P7cmjKO1RHmL9GE_Tv7Tyuo_xDoxB_ELZQM,3824
11
- molcraft/records.py,sha256=w4-bcWZEC0oVInrE1e0kQBroIaSCA0PN1JBPOtO6VUY,5251
12
- molcraft/tensors.py,sha256=_zlcTHH47icUe_S_wYzRp7J-4M2U_4lLkAZOIInea0w,21677
13
- molcraft/experimental/__init__.py,sha256=x5h6LOO8bo3NPjkKKM9M1H-Kz6R3yxYhRSePoxHCdRE,42
14
- molcraft/experimental/peptides.py,sha256=AcjuilPUPzn6l2ui5YPYE00VpXnGj8H1osTjz58biGw,10442
15
- molcraft-0.1.0a1.dist-info/licenses/LICENSE,sha256=sbVeqlrtZ0V63uYhZGL5dCxUm8rBAOqe2avyA1zIQNk,1074
16
- molcraft-0.1.0a1.dist-info/METADATA,sha256=0fczlpAEjq5hLHqGCQPdocQXeoCRfF7L4cyoz8WzYeM,2573
17
- molcraft-0.1.0a1.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
18
- molcraft-0.1.0a1.dist-info/top_level.txt,sha256=dENV6MfOceshM6MQCgJlcN1ojZkiCL9B4F7XyUge3QM,9
19
- molcraft-0.1.0a1.dist-info/RECORD,,