mplang-nightly 0.1.dev142__py3-none-any.whl → 0.1.dev144__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.
mplang/backend/spu.py CHANGED
@@ -186,16 +186,18 @@ def _spu_reconstruct(pfunc: PFunction, *args: Any) -> Any:
186
186
  return reconstructed
187
187
 
188
188
 
189
- @kernel_def("mlir.pphlo")
189
+ @kernel_def("spu.run_pphlo")
190
190
  def _spu_run_mlir(pfunc: PFunction, *args: Any) -> Any:
191
- """Execute compiled SPU function (mlir.pphlo) and return SpuValue outputs.
191
+ """Execute compiled SPU function (spu.run_pphlo) and return SpuValue outputs.
192
192
 
193
193
  Participation rule: a rank participates iff its entry in the stored
194
194
  link_ctx list is non-None. This allows us to allocate a world-sized list
195
195
  (indexed by global rank) and simply assign None for non-SPU parties.
196
196
  """
197
- if pfunc.fn_type != "mlir.pphlo":
198
- raise ValueError(f"Unsupported format: {pfunc.fn_type}. Expected 'mlir.pphlo'")
197
+ if pfunc.fn_type != "spu.run_pphlo":
198
+ raise ValueError(
199
+ f"Unsupported format: {pfunc.fn_type}. Expected 'spu.run_pphlo'"
200
+ )
199
201
 
200
202
  cfg, _ = _get_spu_config_and_world()
201
203
  pocket = _get_spu_pocket()
@@ -20,7 +20,7 @@ from mplang.backend.base import kernel_def
20
20
  from mplang.core.pfunc import PFunction
21
21
 
22
22
 
23
- @kernel_def("sql[duckdb]")
23
+ @kernel_def("duckdb.run_sql")
24
24
  def _duckdb_sql(pfunc: PFunction, *args: Any) -> Any:
25
25
  import duckdb
26
26
  import pandas as pd
@@ -27,7 +27,7 @@ from __future__ import annotations
27
27
  from dataclasses import dataclass
28
28
  from typing import Any, Protocol
29
29
 
30
- from mplang.backend.base import BackendRuntime
30
+ from mplang.backend.context import RuntimeContext
31
31
  from mplang.core.comm import ICommunicator
32
32
  from mplang.core.expr.ast import (
33
33
  AccessExpr,
@@ -56,7 +56,7 @@ class IEvaluator(Protocol):
56
56
  backend state via evaluator.runtime.run_kernel(...).
57
57
  """
58
58
 
59
- runtime: BackendRuntime
59
+ runtime: RuntimeContext
60
60
 
61
61
  def evaluate(self, root: Expr, env: dict[str, Any] | None = None) -> list[Any]: ...
62
62
 
@@ -72,7 +72,7 @@ class EvalSemantic:
72
72
  rank: int
73
73
  env: dict[str, Any]
74
74
  comm: ICommunicator
75
- runtime: BackendRuntime
75
+ runtime: RuntimeContext
76
76
 
77
77
  # ------------------------------ Shared helpers (semantics) ------------------------------
78
78
  def _should_run(self, rmask: Mask | None, args: list[Any]) -> bool:
@@ -205,7 +205,7 @@ class RecursiveEvaluator(EvalSemantic, ExprVisitor):
205
205
  rank: int,
206
206
  env: dict[str, Any],
207
207
  comm: ICommunicator,
208
- runtime: BackendRuntime,
208
+ runtime: RuntimeContext,
209
209
  ) -> None:
210
210
  super().__init__(rank, env, comm, runtime)
211
211
  self._cache: dict[int, Any] = {} # Cache based on expr id
@@ -380,7 +380,7 @@ class IterativeEvaluator(EvalSemantic):
380
380
  rank: int,
381
381
  env: dict[str, Any],
382
382
  comm: ICommunicator,
383
- runtime: BackendRuntime,
383
+ runtime: RuntimeContext,
384
384
  ) -> None:
385
385
  super().__init__(rank, env, comm, runtime)
386
386
 
@@ -501,7 +501,7 @@ def create_evaluator(
501
501
  rank: int,
502
502
  env: dict[str, Any],
503
503
  comm: ICommunicator,
504
- runtime: BackendRuntime,
504
+ runtime: RuntimeContext,
505
505
  kind: str | None = "iterative",
506
506
  ) -> IEvaluator:
507
507
  """Factory to create an evaluator engine.
mplang/frontend/base.py CHANGED
@@ -129,7 +129,7 @@ class FeModule(ABC):
129
129
  - You need compilation/stateful behavior/dynamic routing, multiple PFunctions, or complex capture flows.
130
130
 
131
131
  Tips:
132
- - Keep routing information in PFunction.fn_type (e.g., "builtin.read", "sql[duckdb]", "mlir.stablehlo").
132
+ - Keep routing information in PFunction.fn_type (e.g., "builtin.read", "sql.run", "mlir.stablehlo").
133
133
  - Avoid backend-specific logic in kernels; only validate and shape types.
134
134
  - Prefer keyword-only attributes in typed_op kernels for clarity (def op(x: MPObject, *, attr: int)).
135
135
  """
@@ -57,8 +57,9 @@ def ibis2sql(
57
57
  outs_info = [_convert(expr.schema())]
58
58
 
59
59
  sql = ibis.to_sql(expr, dialect="duckdb")
60
+ # Emit generic sql.run op; runtime maps to backend-specific kernel.
60
61
  pfn = PFunction(
61
- fn_type="sql[duckdb]",
62
+ fn_type="sql.run",
62
63
  fn_name=fn_name,
63
64
  fn_text=sql,
64
65
  ins_info=tuple(ins_info),
mplang/frontend/phe.py CHANGED
@@ -52,10 +52,9 @@ def add(operand1: TensorType, operand2: TensorType) -> TensorType:
52
52
  @_PHE_MOD.simple_op()
53
53
  def mul(ciphertext: TensorType, plaintext: TensorType) -> TensorType:
54
54
  """Multiply a PHE ciphertext with a plaintext value (ciphertext dtype preserved)."""
55
- if ciphertext.dtype.is_floating and plaintext.dtype.is_floating:
55
+ if plaintext.dtype.is_floating:
56
56
  raise ValueError(
57
- "PHE multiplication does not support float x float operations due to truncation requirements. "
58
- "Consider using mixed types (float x int) or integer types instead."
57
+ "PHE multiplication does not support floating-point plaintext."
59
58
  )
60
59
  return ciphertext
61
60
 
@@ -65,3 +64,141 @@ def decrypt(ciphertext: TensorType, private_key: TensorType) -> TensorType:
65
64
  """Decrypt ciphertext using PHE private key: returns plaintext with same semantic type as ciphertext."""
66
65
  _ = private_key
67
66
  return ciphertext
67
+
68
+
69
+ @_PHE_MOD.simple_op()
70
+ def dot(ciphertext: TensorType, plaintext: TensorType) -> TensorType:
71
+ """Compute dot product of ciphertext with plaintext.
72
+
73
+ Args:
74
+ ciphertext: The ciphertext operand (first argument)
75
+ plaintext: The plaintext operand (second argument)
76
+
77
+ Returns:
78
+ TensorType: Result tensor type with computed shape following numpy dot product rules
79
+ """
80
+ # For dot product, we need to calculate the result shape
81
+ # This follows numpy dot product rules
82
+ import numpy as np
83
+
84
+ # Create dummy arrays to determine result shape
85
+ dummy_ct = np.zeros(ciphertext.shape)
86
+ dummy_pt = np.zeros(plaintext.shape)
87
+ dummy_result = np.dot(dummy_ct, dummy_pt)
88
+
89
+ return TensorType(ciphertext.dtype, dummy_result.shape)
90
+
91
+
92
+ @_PHE_MOD.simple_op()
93
+ def gather(ciphertext: TensorType, indices: TensorType, *, axis: int = 0) -> TensorType:
94
+ """Gather elements from ciphertext using indices.
95
+
96
+ Args:
97
+ ciphertext: The ciphertext to gather from
98
+ indices: The indices to gather
99
+ axis: The axis along which to gather (default: 0)
100
+ """
101
+ # Calculate result shape based on axis parameter
102
+ ct_shape = list(ciphertext.shape)
103
+ indices_shape = list(indices.shape)
104
+
105
+ # Normalize negative axis
106
+ normalized_axis = axis if axis >= 0 else len(ct_shape) + axis
107
+
108
+ # Result shape: replace the axis dimension with indices shape
109
+ result_shape = (
110
+ ct_shape[:normalized_axis] + indices_shape + ct_shape[normalized_axis + 1 :]
111
+ )
112
+ return TensorType(ciphertext.dtype, tuple(result_shape))
113
+
114
+
115
+ @_PHE_MOD.simple_op()
116
+ def scatter(
117
+ ciphertext: TensorType,
118
+ indices: TensorType,
119
+ updates: TensorType,
120
+ *,
121
+ axis: int = 0,
122
+ ) -> TensorType:
123
+ """Scatter updates into ciphertext at specified indices.
124
+
125
+ Args:
126
+ ciphertext: The ciphertext to scatter into
127
+ indices: The indices to scatter at
128
+ updates: The ciphertext updates to scatter
129
+ axis: The axis along which to scatter (default: 0)
130
+
131
+ Returns:
132
+ TensorType: Result tensor type with same shape and dtype as original ciphertext
133
+ """
134
+ return ciphertext
135
+
136
+
137
+ @_PHE_MOD.simple_op()
138
+ def concat(operand0: TensorType, operand1: TensorType, *, axis: int = 0) -> TensorType:
139
+ """Concatenate ciphertext tensors along specified axis.
140
+
141
+ Args:
142
+ operand0: The first ciphertext operand to concatenate
143
+ operand1: The second ciphertext operand to concatenate
144
+ axis: Axis along which to concatenate
145
+
146
+ Returns:
147
+ TensorType: Result tensor type with computed shape following numpy concatenation rules
148
+ """
149
+ # All operands should have same dtype
150
+ first_dtype = operand0.dtype
151
+ if operand1.dtype != first_dtype:
152
+ raise ValueError("All operands must have the same dtype for concatenation")
153
+
154
+ # Calculate result shape using numpy concatenation logic
155
+ import numpy as np
156
+
157
+ dummy_arrays = [np.zeros(operand0.shape), np.zeros(operand1.shape)]
158
+ dummy_result = np.concatenate(dummy_arrays, axis=axis)
159
+
160
+ return TensorType(first_dtype, dummy_result.shape)
161
+
162
+
163
+ @_PHE_MOD.simple_op()
164
+ def reshape(ciphertext: TensorType, *, new_shape: tuple[int, ...]) -> TensorType:
165
+ """Reshape ciphertext to new shape.
166
+
167
+ Args:
168
+ ciphertext: The ciphertext to reshape
169
+ new_shape: The target shape (can contain -1 for inferred dimension)
170
+
171
+ Returns:
172
+ TensorType: Result tensor type with computed shape following numpy reshape rules
173
+ """
174
+ # Calculate the actual result shape (handling -1 inference)
175
+ import numpy as np
176
+
177
+ dummy_array = np.zeros(ciphertext.shape)
178
+ # use this to check the correctness of new_shape
179
+ dummy_result = dummy_array.reshape(new_shape)
180
+ actual_shape = dummy_result.shape
181
+
182
+ return TensorType(ciphertext.dtype, actual_shape)
183
+
184
+
185
+ @_PHE_MOD.simple_op()
186
+ def transpose(
187
+ ciphertext: TensorType, *, axes: tuple[int, ...] | None = None
188
+ ) -> TensorType:
189
+ """Transpose ciphertext by permuting axes.
190
+
191
+ Args:
192
+ ciphertext: The ciphertext to transpose
193
+ axes: Permutation of axes (None for default reverse order)
194
+
195
+ Returns:
196
+ TensorType: Result tensor type with computed shape following numpy transpose rules
197
+ """
198
+ # Calculate result shape using numpy transpose logic
199
+ import numpy as np
200
+
201
+ dummy_array = np.zeros(ciphertext.shape)
202
+ dummy_result = np.transpose(dummy_array, axes)
203
+
204
+ return TensorType(ciphertext.dtype, dummy_result.shape)
mplang/frontend/spu.py CHANGED
@@ -94,9 +94,10 @@ def _compile_jax(
94
94
  *args: Any,
95
95
  **kwargs: Any,
96
96
  ) -> tuple[PFunction, list[MPObject], PyTreeDef]:
97
- """Compile a JAX function into SPU pphlo MLIR representation."""
97
+ """Compile a JAX function into SPU pphlo MLIR and wrap as PFunction.
98
98
 
99
- """Compile a JAX function into SPU pphlo MLIR representation."""
99
+ Resulting PFunction uses fn_type 'spu.run_pphlo'.
100
+ """
100
101
 
101
102
  def is_variable(arg: Any) -> bool:
102
103
  return isinstance(arg, MPObject)
@@ -132,7 +133,7 @@ def _compile_jax(
132
133
  executable_code = executable_code.decode("utf-8")
133
134
 
134
135
  pfunc = PFunction(
135
- fn_type="mlir.pphlo",
136
+ fn_type="spu.run_pphlo",
136
137
  ins_info=tuple(TensorType.from_obj(x) for x in in_vars),
137
138
  outs_info=tuple(output_tensor_infos),
138
139
  fn_name=get_fn_name(fn),
@@ -26,17 +26,7 @@ from urllib.parse import urlparse
26
26
  import cloudpickle as pickle
27
27
  import spu.libspu as libspu
28
28
 
29
- # Import backends (side-effect: kernel registration)
30
- from mplang.backend import ( # noqa: F401
31
- builtin,
32
- crypto,
33
- phe,
34
- spu, # registers flat SPU kernels
35
- sql_duckdb,
36
- stablehlo,
37
- tee,
38
- )
39
- from mplang.backend.base import BackendRuntime, create_runtime
29
+ from mplang.backend.context import RuntimeContext
40
30
  from mplang.backend.spu import PFunction # type: ignore
41
31
  from mplang.core.expr.ast import Expr
42
32
  from mplang.core.expr.evaluator import IEvaluator, create_evaluator
@@ -98,9 +88,6 @@ class Session:
98
88
  # Global session storage
99
89
  _sessions: dict[str, Session] = {}
100
90
 
101
- # Service-level global symbol table (process-local for this server)
102
- _global_symbols: dict[str, Symbol] = {}
103
-
104
91
 
105
92
  # Session Management
106
93
  def create_session(
@@ -147,6 +134,43 @@ def delete_session(name: str) -> bool:
147
134
  return False
148
135
 
149
136
 
137
+ # Global symbol management (process-wide, not per-session)
138
+ _global_symbols: dict[str, Symbol] = {}
139
+
140
+
141
+ def create_global_symbol(name: str, mptype: dict[str, Any], data_b64: str) -> Symbol:
142
+ """Create or replace a global symbol.
143
+
144
+ Args:
145
+ name: Symbol identifier
146
+ mptype: Metadata dict (shape/dtype, etc.)
147
+ data_b64: Base64-encoded pickled data
148
+ """
149
+ try:
150
+ raw = base64.b64decode(data_b64)
151
+ data = pickle.loads(raw)
152
+ except Exception as e: # pragma: no cover - defensive
153
+ raise InvalidRequestError(f"Failed to decode symbol payload: {e}") from e
154
+ sym = Symbol(name=name, mptype=mptype, data=data)
155
+ _global_symbols[name] = sym
156
+ return sym
157
+
158
+
159
+ def get_global_symbol(name: str) -> Symbol:
160
+ sym = _global_symbols.get(name)
161
+ if sym is None:
162
+ raise ResourceNotFound(f"Global symbol '{name}' not found")
163
+ return sym
164
+
165
+
166
+ def delete_global_symbol(name: str) -> bool:
167
+ return _global_symbols.pop(name, None) is not None
168
+
169
+
170
+ def list_global_symbols() -> list[str]: # pragma: no cover - trivial
171
+ return sorted(_global_symbols.keys())
172
+
173
+
150
174
  # Computation Management
151
175
  def create_computation(
152
176
  session_name: str, computation_name: str, expr: Expr
@@ -225,15 +249,7 @@ def execute_computation(
225
249
 
226
250
  # Build evaluator
227
251
  # Explicit per-rank backend runtime (deglobalized)
228
- runtime = create_runtime(rank, session.communicator.world_size)
229
- # Inject global symbol storage into backend runtime state so that
230
- # symbols:// provider can access it during builtin.read/write.
231
- if isinstance(runtime, BackendRuntime):
232
- pocket = runtime.state.setdefault("resource.providers", {})
233
- if "symbols" not in pocket:
234
- pocket["symbols"] = _global_symbols
235
- else:
236
- raise RuntimeError("resource.providers.symbols already exists")
252
+ runtime = RuntimeContext(rank=rank, world_size=session.communicator.world_size)
237
253
  evaluator: IEvaluator = create_evaluator(
238
254
  rank=rank, env=bindings, comm=session.communicator, runtime=runtime
239
255
  )
@@ -285,45 +301,6 @@ def execute_computation(
285
301
  session.symbols[name] = Symbol(name=name, mptype={}, data=val)
286
302
 
287
303
 
288
- # Global symbol CRUD (service-level)
289
- def create_global_symbol(name: str, mptype: Any, data: str) -> Symbol:
290
- """Create or update a global symbol in the service-level table.
291
-
292
- WARNING: Uses Python pickle for arbitrary object deserialization. Deploy
293
- only in trusted environments. Future work may replace this with a
294
- restricted / structured serialization.
295
-
296
- The `data` argument is a base64-encoded pickled Python object. Minimal
297
- validation of `mptype` is performed for tensor metadata (shape/dtype)
298
- when present to catch obvious mismatches.
299
- """
300
- try:
301
- data_bytes = base64.b64decode(data)
302
- obj = pickle.loads(data_bytes)
303
- except Exception as e:
304
- raise InvalidRequestError(f"Invalid global symbol data encoding: {e!s}") from e
305
-
306
- sym = Symbol(name, mptype, obj)
307
- _global_symbols[name] = sym
308
- return sym
309
-
310
-
311
- def get_global_symbol(name: str) -> Symbol | None:
312
- return _global_symbols.get(name)
313
-
314
-
315
- def list_global_symbols() -> list[str]:
316
- return list(_global_symbols.keys())
317
-
318
-
319
- def delete_global_symbol(name: str) -> bool:
320
- if name in _global_symbols:
321
- del _global_symbols[name]
322
- logging.info(f"Global symbol {name} deleted")
323
- return True
324
- return False
325
-
326
-
327
304
  # Symbol Management
328
305
  def create_symbol(session_name: str, name: str, mptype: Any, data: Any) -> Symbol:
329
306
  """Create a symbol in a session's symbol table.
@@ -24,17 +24,10 @@ from typing import Any, cast
24
24
 
25
25
  import spu.libspu as libspu
26
26
 
27
- # Import flat backends for kernel registration side-effects
28
- from mplang.backend import (
29
- builtin, # noqa: F401
30
- crypto, # noqa: F401
31
- phe, # noqa: F401
32
- spu, # noqa: F401 # ensure SPU kernels (spu.seed_env etc.) registered
33
- sql_duckdb, # noqa: F401
34
- stablehlo, # noqa: F401
35
- tee, # noqa: F401
36
- )
37
- from mplang.backend.base import create_runtime # explicit per-rank backend runtime
27
+ # New explicit binding model: we only need RuntimeContext which ensures
28
+ # bindings via bind_all_ops() on creation; per-module side-effect imports
29
+ # are no longer required here.
30
+ from mplang.backend.context import RuntimeContext
38
31
  from mplang.core.cluster import ClusterSpec
39
32
  from mplang.core.comm import CollectiveMixin, CommunicatorBase
40
33
  from mplang.core.expr.ast import Expr
@@ -152,7 +145,7 @@ class Simulator(InterpContext):
152
145
 
153
146
  self._evaluators: list[IEvaluator] = []
154
147
  for rank in range(self.world_size()):
155
- runtime = create_runtime(rank, self.world_size())
148
+ runtime = RuntimeContext(rank=rank, world_size=self.world_size())
156
149
  ev = create_evaluator(
157
150
  rank,
158
151
  {}, # the global environment for this rank
@@ -224,7 +217,7 @@ class Simulator(InterpContext):
224
217
  # Build per-rank evaluators with the per-party environment
225
218
  pts_evaluators: list[IEvaluator] = []
226
219
  for rank in range(self.world_size()):
227
- runtime = create_runtime(rank, self.world_size())
220
+ runtime = RuntimeContext(rank=rank, world_size=self.world_size())
228
221
  ev = create_evaluator(
229
222
  rank,
230
223
  pts_env[rank],
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mplang-nightly
3
- Version: 0.1.dev142
3
+ Version: 0.1.dev144
4
4
  Summary: Multi-Party Programming Language
5
5
  Author-email: SecretFlow Team <secretflow-contact@service.alipay.com>
6
6
  License: Apache License
@@ -3,13 +3,14 @@ mplang/api.py,sha256=ssmv0_CyZPFORhOUJ84Jo6NwRJSK7_Ono3n7ZjEg4sA,3058
3
3
  mplang/device.py,sha256=Iz_YFKkrbTFKtTQdGqkQZfc0NQH9dIxXP7-fUkIQOa4,12568
4
4
  mplang/analysis/__init__.py,sha256=CTHFvRsi-nFngojqjn08UaR3RY9i7CJ7T2UdR95kCrk,1056
5
5
  mplang/analysis/diagram.py,sha256=ffwgD12gL1_KH1uJ_EYkjmIlDrfxYJJkWj-wHl09_Xk,19520
6
- mplang/backend/__init__.py,sha256=Pn1MGW7FZ8ZQWcx_r2Io4Q1JbrMINCpefQt7yCNq_dc,741
7
- mplang/backend/base.py,sha256=zaofB1MPC9Af8FS-rx7q6utFxiu9Mppr2gWaKFZ70Os,9863
6
+ mplang/backend/__init__.py,sha256=2WE4cmW96Xkzyq2yRRYNww4kZ5o6u6NbPV0BxqZG698,581
7
+ mplang/backend/base.py,sha256=Rp4Ze1aF5dypdMOskXnQWE-rM5nc4vkdDogEoxQp7FU,5712
8
8
  mplang/backend/builtin.py,sha256=Mk1uUO2Vpw3meqZ0B7B0hG-wndea6cmFv2Uk1vM_uTg,7052
9
+ mplang/backend/context.py,sha256=e22JzsHydi1DLkjzOEYwGBaAoVHyf8aEFYH_SuN7oR4,9351
9
10
  mplang/backend/crypto.py,sha256=H_s5HI7lUP7g0xz-a9qMbSn6dhJStUilKbn3-7SIh0I,3812
10
- mplang/backend/phe.py,sha256=Y07fkTHTSKHgpMQ1soA3d2eBMlqr25uHCAtZOd5D5_I,10555
11
- mplang/backend/spu.py,sha256=i6Qqgeg-Anwpb5xX5Uz8GdmTWNkRy_pjp-xptIvlxl4,9273
12
- mplang/backend/sql_duckdb.py,sha256=WFEiJk3t68DMpjV9xZz5bJj3v8UMx4X5QWleLIE4Aq0,1499
11
+ mplang/backend/phe.py,sha256=uNqmrbDAbd97TWS_O6D5sopastHy6J20R7knFE4M4uc,65247
12
+ mplang/backend/spu.py,sha256=QT1q5uv-5P_nBGtTvtA_yI2h3h3zIqNSnvzGT7Shua4,9307
13
+ mplang/backend/sql_duckdb.py,sha256=U_KzEUinxrBRDoUz2Vh597-N4I3hPOBT0RT3tX-ZqKE,1502
13
14
  mplang/backend/stablehlo.py,sha256=GOxy-qgOxyEdtBkt6LASKzaZnPewZhvHYSPOgFFXgIM,2612
14
15
  mplang/backend/tee.py,sha256=6kc7qTe8nWc3pr6iYtozEGLO8Umg-UBQLDiz6p3pdVg,1918
15
16
  mplang/core/__init__.py,sha256=lWxlEKfRwX7FNDzgyKZ1fiDMaCiqkyg0j5mKlZD_v7g,2244
@@ -29,20 +30,20 @@ mplang/core/tensor.py,sha256=86u6DogSZMoL0w5XjtTmQm2PhA_VjwybN1b6U4Zzphg,2361
29
30
  mplang/core/tracer.py,sha256=dVMfUeCMmPz4o6tLXewGMW1Kpy5gpZORvr9w4MhwDtM,14288
30
31
  mplang/core/expr/__init__.py,sha256=qwiSTUOcanFJLyK8HZ13_L1ZDrybqpPXIlTHAyeumE8,1988
31
32
  mplang/core/expr/ast.py,sha256=KE46KTtlH9RA2V_EzWVKCKolsycgTmt7SotUrOc8Qxs,20923
32
- mplang/core/expr/evaluator.py,sha256=0ZwDgRyzHh1zxmb-9XW85toVKpk2mk0_t-hY_10U_Q8,20786
33
+ mplang/core/expr/evaluator.py,sha256=3rtfHVajmCUtkanzgiCWkepRRiTKehPcDF2i5EbcitI,20789
33
34
  mplang/core/expr/printer.py,sha256=VblKGnO0OUfzH7EBkszwRNxQUB8QyyC7BlJWJEUv9so,9546
34
35
  mplang/core/expr/transformer.py,sha256=TyL-8FjrVvDq_C9X7kAuKkiqt2XdZM-okjzVQj0A33s,4893
35
36
  mplang/core/expr/utils.py,sha256=VDTJ_-CsdHtVy9wDaGa7XdFxQ7o5lYYaeqcgsAhkbNI,2625
36
37
  mplang/core/expr/visitor.py,sha256=2Ge-I5N-wH8VVXy8d2WyNaEv8x6seiRx9peyH9S2BYU,2044
37
38
  mplang/core/expr/walk.py,sha256=lXkGJEEuvKGDqQihbxXPxfz2RfR1Q1zYUlt11iooQW0,11889
38
39
  mplang/frontend/__init__.py,sha256=3ZBFX_acM96tZ2mtJaxJm150n1cf0LnnCRmkrAc4uBw,1463
39
- mplang/frontend/base.py,sha256=I-Hhh5o6GVqBA1YySl9Nk3zkbMoVrQqLMRyX2JypsPI,18268
40
+ mplang/frontend/base.py,sha256=rGtfBejcDh9mTRxOdJK5VUlG5vYiVJSir8X72X0Huvc,18264
40
41
  mplang/frontend/builtin.py,sha256=8qrlbe_SSy6QTXTnMG6_ADB8jSklVZGFBrkoR-p02FE,9368
41
42
  mplang/frontend/crypto.py,sha256=Nf8zT4Eko7MIs4R2tgZecKVd7d6Hvd_CGGmANhs3Ghs,3651
42
- mplang/frontend/ibis_cc.py,sha256=01joUdFS_Ja9--PkezBhEcW_a9mkDrLgOhu5320s_bQ,4167
43
+ mplang/frontend/ibis_cc.py,sha256=CTTbPPZ9hFnHuFDDIfgJHie1EdNnHmi5Ha1KsX0iYh8,4235
43
44
  mplang/frontend/jax_cc.py,sha256=ssP6rCvyWQ5VAr80-7z9QZUE2mWXyozJCGpq1dYQYY8,6374
44
- mplang/frontend/phe.py,sha256=zsL4rbukoZ4SvCkPdfgGQRzCwXk4_opn693RTgwp7gQ,2501
45
- mplang/frontend/spu.py,sha256=yvnXH8HU55t7j_jaTpxa3Nbh0SqXufVDyZBTYCsRTK4,4994
45
+ mplang/frontend/phe.py,sha256=tDsCvStjVJ1Fs07yF3idkFnugUCA1zdFApPx7Uuulik,6795
46
+ mplang/frontend/spu.py,sha256=7G6DaEfC5APSDhfeWSISTG_8tEcVbWth3XmjL8QUrVA,4994
46
47
  mplang/frontend/sql.py,sha256=DFdvjEPQX28VCRgUMeHYR0rwwOaoCH15bpvvlclLtHA,1999
47
48
  mplang/frontend/tee.py,sha256=EigmlbYDGvXkZCMHSYRAiOboSl9TG0ewoudbgl3_V6M,1393
48
49
  mplang/protos/v1alpha1/mpir_pb2.py,sha256=Bros37t-4LMJbuUYVSM65rImUYTtZDhNTIADGbZCKp0,7522
@@ -57,9 +58,9 @@ mplang/runtime/driver.py,sha256=Ok1jY301ctN1_KTb4jwSxOdB0lI_xhx9AwhtEGJ-VLQ,1130
57
58
  mplang/runtime/exceptions.py,sha256=c18U0xK20dRmgZo0ogTf5vXlkix9y3VAFuzkHxaXPEk,981
58
59
  mplang/runtime/http_api.md,sha256=-re1DhEqMplAkv_wnqEU-PSs8tTzf4-Ml0Gq0f3Go6s,4883
59
60
  mplang/runtime/link_comm.py,sha256=uNqTCGZVwWeuHAb7yXXQf0DUsMXLa8leHCkrcZdzYMU,4559
60
- mplang/runtime/resource.py,sha256=BkzpAjRrkjS-5FPawHHcVzxEE_htpMtS4JJCvcLrnU0,12564
61
+ mplang/runtime/resource.py,sha256=-B9kSM7xhocc6mpXHmV9xTdpVR2duiUCepJKS7QuLqA,11688
61
62
  mplang/runtime/server.py,sha256=gTPqAux1EdefaBFnserYIXamoi7pbEsQrFX6cXbOjik,14716
62
- mplang/runtime/simulation.py,sha256=kj-RtvvypISO2xyYQGtm-N8yavnkVpD33KSLpvL-Vms,11107
63
+ mplang/runtime/simulation.py,sha256=kuFXWuJLGcmy4OvLCBby4K5QbXaQZmKSb4qrCJ2stBY,10957
63
64
  mplang/simp/__init__.py,sha256=DmSMcKvHVXWS2pYsuHazEmwOWWpZeKOJQsNU6VxC10U,11614
64
65
  mplang/simp/mpi.py,sha256=Wv_Q16TQ3rdLam6OzqXiefIGSMmagGkso09ycyOkHEs,4774
65
66
  mplang/simp/random.py,sha256=7PVgWNL1j7Sf3MqT5PRiWplUu-0dyhF3Ub566iqX86M,3898
@@ -69,8 +70,8 @@ mplang/utils/crypto.py,sha256=rvPomBFtznRHc3RPi6Aip9lsU8zW2oxBqGv1K3vn7Rs,1052
69
70
  mplang/utils/func_utils.py,sha256=vCJcZmu0bEbqhOQKdpttV2_MBllIcPSN0b8U4WjNGGo,5164
70
71
  mplang/utils/spu_utils.py,sha256=S3L9RBkBe2AvSuMSQQ12cBY5Y1NPthubvErSX_7nj1A,4158
71
72
  mplang/utils/table_utils.py,sha256=aC-IZOKkSmFkpr3NZchLM0Wt0GOn-rg_xHBHREWBwAU,2202
72
- mplang_nightly-0.1.dev142.dist-info/METADATA,sha256=U2gYpnBcdaqDYhHfzvLnxBrgKB9HWSydYbymvVZEsQY,16547
73
- mplang_nightly-0.1.dev142.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
74
- mplang_nightly-0.1.dev142.dist-info/entry_points.txt,sha256=mG1oJT-GAjQR834a62_QIWb7litzWPPyVnwFqm-rWuY,55
75
- mplang_nightly-0.1.dev142.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
76
- mplang_nightly-0.1.dev142.dist-info/RECORD,,
73
+ mplang_nightly-0.1.dev144.dist-info/METADATA,sha256=i6ef5f8u6W_vm_UfZcAPsekVJ0j4a9wNYCdVDKJRBgw,16547
74
+ mplang_nightly-0.1.dev144.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
75
+ mplang_nightly-0.1.dev144.dist-info/entry_points.txt,sha256=mG1oJT-GAjQR834a62_QIWb7litzWPPyVnwFqm-rWuY,55
76
+ mplang_nightly-0.1.dev144.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
77
+ mplang_nightly-0.1.dev144.dist-info/RECORD,,