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/__init__.py +0 -7
- mplang/backend/base.py +71 -183
- mplang/backend/context.py +255 -0
- mplang/backend/phe.py +1448 -91
- mplang/backend/spu.py +6 -4
- mplang/backend/sql_duckdb.py +1 -1
- mplang/core/expr/evaluator.py +6 -6
- mplang/frontend/base.py +1 -1
- mplang/frontend/ibis_cc.py +2 -1
- mplang/frontend/phe.py +140 -3
- mplang/frontend/spu.py +4 -3
- mplang/runtime/resource.py +39 -62
- mplang/runtime/simulation.py +6 -13
- {mplang_nightly-0.1.dev142.dist-info → mplang_nightly-0.1.dev144.dist-info}/METADATA +1 -1
- {mplang_nightly-0.1.dev142.dist-info → mplang_nightly-0.1.dev144.dist-info}/RECORD +18 -17
- {mplang_nightly-0.1.dev142.dist-info → mplang_nightly-0.1.dev144.dist-info}/WHEEL +0 -0
- {mplang_nightly-0.1.dev142.dist-info → mplang_nightly-0.1.dev144.dist-info}/entry_points.txt +0 -0
- {mplang_nightly-0.1.dev142.dist-info → mplang_nightly-0.1.dev144.dist-info}/licenses/LICENSE +0 -0
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("
|
189
|
+
@kernel_def("spu.run_pphlo")
|
190
190
|
def _spu_run_mlir(pfunc: PFunction, *args: Any) -> Any:
|
191
|
-
"""Execute compiled SPU function (
|
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 != "
|
198
|
-
raise ValueError(
|
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()
|
mplang/backend/sql_duckdb.py
CHANGED
mplang/core/expr/evaluator.py
CHANGED
@@ -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.
|
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:
|
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:
|
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:
|
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:
|
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:
|
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
|
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
|
"""
|
mplang/frontend/ibis_cc.py
CHANGED
@@ -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
|
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
|
55
|
+
if plaintext.dtype.is_floating:
|
56
56
|
raise ValueError(
|
57
|
-
"PHE multiplication does not support
|
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
|
97
|
+
"""Compile a JAX function into SPU pphlo MLIR and wrap as PFunction.
|
98
98
|
|
99
|
-
|
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="
|
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),
|
mplang/runtime/resource.py
CHANGED
@@ -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
|
-
|
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 =
|
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.
|
mplang/runtime/simulation.py
CHANGED
@@ -24,17 +24,10 @@ from typing import Any, cast
|
|
24
24
|
|
25
25
|
import spu.libspu as libspu
|
26
26
|
|
27
|
-
#
|
28
|
-
|
29
|
-
|
30
|
-
|
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 =
|
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 =
|
220
|
+
runtime = RuntimeContext(rank=rank, world_size=self.world_size())
|
228
221
|
ev = create_evaluator(
|
229
222
|
rank,
|
230
223
|
pts_env[rank],
|
@@ -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=
|
7
|
-
mplang/backend/base.py,sha256=
|
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=
|
11
|
-
mplang/backend/spu.py,sha256=
|
12
|
-
mplang/backend/sql_duckdb.py,sha256=
|
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=
|
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=
|
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=
|
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=
|
45
|
-
mplang/frontend/spu.py,sha256=
|
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
|
61
|
+
mplang/runtime/resource.py,sha256=-B9kSM7xhocc6mpXHmV9xTdpVR2duiUCepJKS7QuLqA,11688
|
61
62
|
mplang/runtime/server.py,sha256=gTPqAux1EdefaBFnserYIXamoi7pbEsQrFX6cXbOjik,14716
|
62
|
-
mplang/runtime/simulation.py,sha256=
|
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.
|
73
|
-
mplang_nightly-0.1.
|
74
|
-
mplang_nightly-0.1.
|
75
|
-
mplang_nightly-0.1.
|
76
|
-
mplang_nightly-0.1.
|
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,,
|
File without changes
|
{mplang_nightly-0.1.dev142.dist-info → mplang_nightly-0.1.dev144.dist-info}/entry_points.txt
RENAMED
File without changes
|
{mplang_nightly-0.1.dev142.dist-info → mplang_nightly-0.1.dev144.dist-info}/licenses/LICENSE
RENAMED
File without changes
|