Skip to content

Commit f5e8414

Browse files
author
Yennefer
committed
fix: use jax.pure_callback for JIT-safe tracer conversion
1 parent bdd5de4 commit f5e8414

1 file changed

Lines changed: 14 additions & 6 deletions

File tree

genesis-q-mem/diamond_optical_engine.py

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -83,22 +83,30 @@ def sample(self, key, interactions, active_flags, states, sampler_state, output_
8383
"""
8484
Main sampling function with PyTree preservation.
8585
JIT-compiled for maximum performance.
86+
Uses jax.pure_callback for safe host-device data transfer.
8687
"""
8788
if states is None:
8889
return None
8990

9091
if HAS_JAX:
91-
# Flatten PyTree to numpy array
92+
# Flatten PyTree to leaves and treedef
9293
leaves, treedef = tree_flatten(states)
9394

94-
# Process through callback bridge
95+
# Process each leaf through pure_callback (JIT-safe)
9596
processed_leaves = []
9697
for leaf in leaves:
9798
if leaf.size > 0:
98-
# Convert to numpy, process, convert back
99-
np_data = np.asarray(leaf)
100-
result = self._host_callback(np_data)
101-
processed_leaves.append(jnp.array(result, dtype=leaf.dtype))
99+
# Use pure_callback for safe tracer-to-numpy conversion
100+
def identity_callback(x):
101+
"""Host callback that returns data unchanged (mirror test)."""
102+
return np.asarray(x)
103+
104+
result = jax.pure_callback(
105+
identity_callback,
106+
jax.ShapeDtypeStruct(leaf.shape, leaf.dtype),
107+
leaf
108+
)
109+
processed_leaves.append(result)
102110
else:
103111
processed_leaves.append(leaf)
104112

0 commit comments

Comments
 (0)