mplang-nightly 0.1.dev164__py3-none-any.whl → 0.1.dev166__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/core/expr/evaluator.py +55 -15
- mplang/kernels/__init__.py +28 -0
- mplang/kernels/builtin.py +91 -56
- mplang/kernels/crypto.py +39 -30
- mplang/kernels/mock_tee.py +10 -8
- mplang/kernels/phe.py +238 -39
- mplang/kernels/spu.py +134 -45
- mplang/kernels/sql_duckdb.py +8 -13
- mplang/kernels/stablehlo.py +15 -9
- mplang/kernels/value.py +626 -0
- mplang/protos/v1alpha1/mpir_pb2.pyi +71 -21
- mplang/protos/v1alpha1/value_pb2.py +34 -0
- mplang/protos/v1alpha1/value_pb2.pyi +169 -0
- mplang/runtime/client.py +19 -8
- mplang/runtime/communicator.py +11 -4
- mplang/runtime/driver.py +16 -1
- mplang/runtime/link_comm.py +26 -79
- mplang/runtime/server.py +30 -29
- mplang/runtime/session.py +9 -0
- mplang/runtime/simulation.py +4 -5
- mplang/simp/__init__.py +1 -1
- {mplang_nightly-0.1.dev164.dist-info → mplang_nightly-0.1.dev166.dist-info}/METADATA +1 -1
- {mplang_nightly-0.1.dev164.dist-info → mplang_nightly-0.1.dev166.dist-info}/RECORD +26 -23
- {mplang_nightly-0.1.dev164.dist-info → mplang_nightly-0.1.dev166.dist-info}/WHEEL +0 -0
- {mplang_nightly-0.1.dev164.dist-info → mplang_nightly-0.1.dev166.dist-info}/entry_points.txt +0 -0
- {mplang_nightly-0.1.dev164.dist-info → mplang_nightly-0.1.dev166.dist-info}/licenses/LICENSE +0 -0
mplang/runtime/link_comm.py
CHANGED
@@ -15,18 +15,28 @@
|
|
15
15
|
from __future__ import annotations
|
16
16
|
|
17
17
|
import logging
|
18
|
-
from typing import Any
|
19
18
|
|
20
|
-
import cloudpickle as pickle
|
21
19
|
import spu.libspu as libspu
|
22
20
|
|
23
|
-
from mplang.core.comm import ICollective, ICommunicator
|
24
21
|
|
22
|
+
class LinkCommunicator:
|
23
|
+
"""Minimal wrapper for libspu link context.
|
25
24
|
|
26
|
-
class
|
27
|
-
|
25
|
+
This class serves only to create and hold a libspu link context for SPU runtime.
|
26
|
+
It does NOT provide general-purpose communication methods - those are handled by
|
27
|
+
the underlying libspu.link.Context which SPU runtime uses directly.
|
28
|
+
|
29
|
+
All serialization is handled internally by libspu - no pickle needed here.
|
30
|
+
"""
|
28
31
|
|
29
32
|
def __init__(self, rank: int, addrs: list[str], *, mem_link: bool = False):
|
33
|
+
"""Initialize link communicator for SPU.
|
34
|
+
|
35
|
+
Args:
|
36
|
+
rank: Rank of this party
|
37
|
+
addrs: List of addresses for all parties
|
38
|
+
mem_link: If True, use in-memory link (for testing); otherwise use BRPC
|
39
|
+
"""
|
30
40
|
self._rank = rank
|
31
41
|
self._world_size = len(addrs)
|
32
42
|
|
@@ -42,90 +52,27 @@ class LinkCommunicator(ICommunicator, ICollective):
|
|
42
52
|
self.lctx = libspu.link.create_brpc(desc, self._rank)
|
43
53
|
|
44
54
|
logging.info(
|
45
|
-
f"LinkCommunicator initialized
|
55
|
+
f"LinkCommunicator initialized: rank={self._rank}, world_size={self._world_size}, "
|
56
|
+
f"addrs={addrs}, mem_link={mem_link}"
|
46
57
|
)
|
47
58
|
|
48
|
-
self._counter = 0
|
49
|
-
|
50
59
|
@property
|
51
60
|
def rank(self) -> int:
|
61
|
+
"""Get rank from underlying link context."""
|
52
62
|
return self.lctx.rank # type: ignore[no-any-return]
|
53
63
|
|
54
64
|
@property
|
55
65
|
def world_size(self) -> int:
|
66
|
+
"""Get world size from underlying link context."""
|
56
67
|
return self.lctx.world_size # type: ignore[no-any-return]
|
57
68
|
|
58
69
|
def get_lctx(self) -> libspu.link.Context:
|
59
|
-
"""Get the link context
|
60
|
-
return self.lctx
|
61
|
-
|
62
|
-
# override
|
63
|
-
def new_id(self) -> str:
|
64
|
-
res = self._counter
|
65
|
-
self._counter += 1
|
66
|
-
return str(res)
|
67
|
-
|
68
|
-
def wrap(self, obj: Any) -> str:
|
69
|
-
data = pickle.dumps(obj)
|
70
|
-
return data.hex() # type: ignore[no-any-return]
|
71
|
-
|
72
|
-
def unwrap(self, obj: str) -> Any:
|
73
|
-
data = bytes.fromhex(obj)
|
74
|
-
return pickle.loads(data) # type: ignore[no-any-return]
|
75
|
-
|
76
|
-
def send(self, to: int, key: str, data: Any) -> None:
|
77
|
-
serialized = pickle.dumps((key, data))
|
78
|
-
self.lctx.send(to, serialized.hex())
|
79
|
-
|
80
|
-
def recv(self, frm: int, key: str) -> Any:
|
81
|
-
serialized = self.lctx.recv(frm)
|
82
|
-
rkey, data = pickle.loads(bytes.fromhex(serialized.decode()))
|
83
|
-
assert key == rkey, f"recv key {key} != {rkey}"
|
84
|
-
return data # type: ignore[no-any-return]
|
85
|
-
|
86
|
-
def p2p(self, frm: int, to: int, data: Any) -> Any:
|
87
|
-
assert 0 <= frm < self.world_size
|
88
|
-
assert 0 <= to < self.world_size
|
89
|
-
|
90
|
-
# TODO: link handles cid internally?
|
91
|
-
cid = self.new_id()
|
92
|
-
|
93
|
-
if self.rank == frm:
|
94
|
-
self.send(to, cid, data)
|
95
|
-
return None
|
96
|
-
elif self.rank == to:
|
97
|
-
return self.recv(frm, cid)
|
98
|
-
else:
|
99
|
-
return None
|
100
|
-
|
101
|
-
def gather(self, root: int, data: Any) -> list[Any]:
|
102
|
-
assert 0 <= root < self.world_size
|
103
|
-
rets = self.lctx.gather(self.wrap(data), root)
|
104
|
-
return [self.unwrap(ret) for ret in rets]
|
70
|
+
"""Get the underlying libspu link context.
|
105
71
|
|
106
|
-
|
107
|
-
|
108
|
-
assert len(args) == self.world_size, f"{len(args)} != {self.world_size}"
|
109
|
-
ret = self.lctx.scatter([self.wrap(arg) for arg in args], root)
|
110
|
-
return self.unwrap(ret)
|
72
|
+
This is the primary interface - SPU runtime uses this context directly.
|
73
|
+
All communication and serialization is handled by libspu internally.
|
111
74
|
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
def bcast(self, root: int, arg: Any) -> Any:
|
117
|
-
assert 0 <= root < self.world_size
|
118
|
-
ret = self.lctx.broadcast(self.wrap(arg), root)
|
119
|
-
return self.unwrap(ret)
|
120
|
-
|
121
|
-
def gather_m(self, pmask: int, root: int, data: Any) -> list[Any]:
|
122
|
-
raise ValueError("Not supported by LinkCommunicator")
|
123
|
-
|
124
|
-
def scatter_m(self, pmask: int, root: int, args: list[Any]) -> Any:
|
125
|
-
raise ValueError("Not supported by LinkCommunicator")
|
126
|
-
|
127
|
-
def allgather_m(self, pmask: int, arg: Any) -> list[Any]:
|
128
|
-
raise ValueError("Not supported by LinkCommunicator")
|
129
|
-
|
130
|
-
def bcast_m(self, pmask: int, root: int, arg: Any) -> Any:
|
131
|
-
raise ValueError("Not supported by LinkCommunicator")
|
75
|
+
Returns:
|
76
|
+
The underlying libspu.link.Context instance.
|
77
|
+
"""
|
78
|
+
return self.lctx
|
mplang/runtime/server.py
CHANGED
@@ -22,8 +22,11 @@ import logging
|
|
22
22
|
import re
|
23
23
|
from typing import Any
|
24
24
|
|
25
|
-
|
26
|
-
|
25
|
+
from fastapi import (
|
26
|
+
FastAPI,
|
27
|
+
HTTPException,
|
28
|
+
Request,
|
29
|
+
)
|
27
30
|
from fastapi.responses import JSONResponse
|
28
31
|
from pydantic import BaseModel
|
29
32
|
|
@@ -31,6 +34,7 @@ from mplang.core.mpir import Reader
|
|
31
34
|
from mplang.core.table import TableType
|
32
35
|
from mplang.core.tensor import TensorType
|
33
36
|
from mplang.kernels.base import KernelContext
|
37
|
+
from mplang.kernels.value import Value, decode_value, encode_value
|
34
38
|
from mplang.protos.v1alpha1 import mpir_pb2
|
35
39
|
from mplang.runtime.data_providers import DataProvider, ResolvedURI, register_provider
|
36
40
|
from mplang.runtime.exceptions import InvalidRequestError, ResourceNotFound
|
@@ -112,19 +116,11 @@ class _SymbolsProvider(DataProvider):
|
|
112
116
|
ctx: KernelContext,
|
113
117
|
) -> None: # type: ignore[override]
|
114
118
|
name = self._symbol_name(uri)
|
115
|
-
|
116
|
-
data_b64 = base64.b64encode(pickle.dumps(value)).decode("utf-8")
|
117
|
-
except Exception as e: # pragma: no cover - defensive
|
118
|
-
raise InvalidRequestError(
|
119
|
-
f"Failed to encode value for symbols:// write: {e!s}"
|
120
|
-
) from e
|
121
|
-
try:
|
122
|
-
obj = pickle.loads(base64.b64decode(data_b64))
|
123
|
-
except Exception as e: # pragma: no cover - defensive
|
119
|
+
if not isinstance(value, Value):
|
124
120
|
raise InvalidRequestError(
|
125
|
-
f"
|
126
|
-
)
|
127
|
-
_global_symbols[name] = Symbol(name=name, mptype={}, data=
|
121
|
+
f"symbols:// write expects Value instance, got {type(value)}"
|
122
|
+
)
|
123
|
+
_global_symbols[name] = Symbol(name=name, mptype={}, data=value)
|
128
124
|
|
129
125
|
|
130
126
|
# Register symbols provider explicitly for server runtime
|
@@ -208,17 +204,17 @@ class ComputationResponse(BaseModel):
|
|
208
204
|
|
209
205
|
class CreateSymbolRequest(BaseModel):
|
210
206
|
mptype: dict
|
211
|
-
data: str # Base64 encoded data
|
207
|
+
data: str # Base64 encoded Value data
|
212
208
|
|
213
209
|
|
214
210
|
class SymbolResponse(BaseModel):
|
215
211
|
name: str
|
216
212
|
mptype: dict
|
217
|
-
data: str
|
213
|
+
data: str # Base64 encoded Value data
|
218
214
|
|
219
215
|
|
220
216
|
class CommSendRequest(BaseModel):
|
221
|
-
data: str # Base64 encoded data
|
217
|
+
data: str # Base64 encoded binary data
|
222
218
|
|
223
219
|
|
224
220
|
# Response Models for enhanced status
|
@@ -233,7 +229,7 @@ class ComputationListResponse(BaseModel):
|
|
233
229
|
class GlobalSymbolResponse(BaseModel):
|
234
230
|
name: str
|
235
231
|
mptype: dict
|
236
|
-
data: str
|
232
|
+
data: str # Base64 encoded Value data
|
237
233
|
|
238
234
|
|
239
235
|
@app.get("/health")
|
@@ -359,7 +355,7 @@ def create_session_symbol(
|
|
359
355
|
if not sess:
|
360
356
|
raise ResourceNotFound(f"Session '{session_name}' not found.")
|
361
357
|
try:
|
362
|
-
obj =
|
358
|
+
obj = decode_value(base64.b64decode(request.data))
|
363
359
|
except Exception as e:
|
364
360
|
raise InvalidRequestError(f"Invalid symbol data: {e!s}") from e
|
365
361
|
symbol = Symbol(name=symbol_name, mptype=request.mptype, data=obj)
|
@@ -368,7 +364,7 @@ def create_session_symbol(
|
|
368
364
|
return SymbolResponse(
|
369
365
|
name=symbol.name,
|
370
366
|
mptype=symbol.mptype,
|
371
|
-
data=
|
367
|
+
data=base64.b64encode(encode_value(symbol.data)).decode("utf-8"),
|
372
368
|
)
|
373
369
|
|
374
370
|
|
@@ -388,13 +384,11 @@ def get_session_symbol(session_name: str, symbol_name: str) -> SymbolResponse:
|
|
388
384
|
status_code=404, detail=f"Symbol {symbol_name} not found"
|
389
385
|
)
|
390
386
|
|
391
|
-
|
392
|
-
data_b64 = base64.b64encode(data_bytes).decode("utf-8")
|
393
|
-
|
387
|
+
# Serialize using Value envelope
|
394
388
|
return SymbolResponse(
|
395
389
|
name=symbol.name,
|
396
390
|
mptype=symbol.mptype,
|
397
|
-
data=
|
391
|
+
data=base64.b64encode(encode_value(symbol.data)).decode("utf-8"),
|
398
392
|
)
|
399
393
|
except ValueError as e:
|
400
394
|
raise HTTPException(status_code=404, detail=str(e)) from e
|
@@ -430,12 +424,16 @@ def create_global_symbol(
|
|
430
424
|
) -> GlobalSymbolResponse:
|
431
425
|
validate_name(symbol_name, "symbol")
|
432
426
|
try:
|
433
|
-
obj =
|
427
|
+
obj = decode_value(base64.b64decode(request.data))
|
434
428
|
except Exception as e:
|
435
429
|
raise InvalidRequestError(f"Invalid global symbol data: {e!s}") from e
|
436
430
|
sym = Symbol(name=symbol_name, mptype=request.mptype, data=obj)
|
437
431
|
_global_symbols[symbol_name] = sym
|
438
|
-
return GlobalSymbolResponse(
|
432
|
+
return GlobalSymbolResponse(
|
433
|
+
name=sym.name,
|
434
|
+
mptype=sym.mptype,
|
435
|
+
data=base64.b64encode(encode_value(sym.data)).decode("utf-8"),
|
436
|
+
)
|
439
437
|
|
440
438
|
|
441
439
|
@app.get("/api/v1/symbols/{symbol_name}", response_model=GlobalSymbolResponse)
|
@@ -443,9 +441,12 @@ def get_global_symbol(symbol_name: str) -> GlobalSymbolResponse: # route handle
|
|
443
441
|
sym = _global_symbols.get(symbol_name)
|
444
442
|
if not sym:
|
445
443
|
raise ResourceNotFound(f"Global symbol '{symbol_name}' not found")
|
446
|
-
|
447
|
-
|
448
|
-
|
444
|
+
# Serialize using Value envelope
|
445
|
+
return GlobalSymbolResponse(
|
446
|
+
name=sym.name,
|
447
|
+
mptype=sym.mptype,
|
448
|
+
data=base64.b64encode(encode_value(sym.data)).decode("utf-8"),
|
449
|
+
)
|
449
450
|
|
450
451
|
|
451
452
|
@app.get("/api/v1/symbols")
|
mplang/runtime/session.py
CHANGED
@@ -39,6 +39,7 @@ from mplang.core.expr.evaluator import IEvaluator, create_evaluator
|
|
39
39
|
from mplang.core.mask import Mask
|
40
40
|
from mplang.kernels.context import RuntimeContext
|
41
41
|
from mplang.kernels.spu import PFunction # type: ignore
|
42
|
+
from mplang.kernels.value import Value
|
42
43
|
from mplang.runtime.communicator import HttpCommunicator
|
43
44
|
from mplang.runtime.exceptions import ResourceNotFound
|
44
45
|
from mplang.runtime.link_comm import LinkCommunicator
|
@@ -271,6 +272,14 @@ class Session:
|
|
271
272
|
f"Expected {len(output_names)} results, got {len(results)}"
|
272
273
|
)
|
273
274
|
for name, val in zip(output_names, results, strict=True):
|
275
|
+
if val is None:
|
276
|
+
self.delete_symbol(name)
|
277
|
+
continue
|
278
|
+
if not isinstance(val, Value):
|
279
|
+
raise TypeError(
|
280
|
+
"Session executions must produce kernel Value outputs; "
|
281
|
+
f"got {type(val).__name__} for symbol '{name}'"
|
282
|
+
)
|
274
283
|
self.add_symbol(Symbol(name=name, mptype={}, data=val))
|
275
284
|
|
276
285
|
# --- Convenience constructor ---
|
mplang/runtime/simulation.py
CHANGED
@@ -73,8 +73,8 @@ class SimVar(InterpVar):
|
|
73
73
|
|
74
74
|
@property
|
75
75
|
def values(self) -> list[Any]:
|
76
|
-
"""
|
77
|
-
return self._values
|
76
|
+
"""Converted values across all ranks for user inspection."""
|
77
|
+
return [v.to_numpy() if hasattr(v, "to_numpy") else v for v in self._values]
|
78
78
|
|
79
79
|
def __repr__(self) -> str:
|
80
80
|
return f"SimVar({self.mptype})"
|
@@ -202,8 +202,7 @@ class Simulator(InterpContext):
|
|
202
202
|
def fetch(self, obj: MPObject) -> list[TensorLike]:
|
203
203
|
if not isinstance(obj, SimVar):
|
204
204
|
raise ValueError(f"Expected SimVar, got {type(obj)}")
|
205
|
-
|
206
|
-
return list(obj.values)
|
205
|
+
return [v.to_numpy() if hasattr(v, "to_numpy") else v for v in obj._values]
|
207
206
|
|
208
207
|
# override
|
209
208
|
def evaluate(self, expr: Expr, bindings: dict[str, MPObject]) -> Sequence[MPObject]:
|
@@ -213,7 +212,7 @@ class Simulator(InterpContext):
|
|
213
212
|
raise ValueError(f"Variable {name} not in this context, got {var.ctx}.")
|
214
213
|
|
215
214
|
pts_env = [
|
216
|
-
{name: cast(SimVar, var).
|
215
|
+
{name: cast(SimVar, var)._values[rank] for name, var in bindings.items()}
|
217
216
|
for rank in range(self.world_size())
|
218
217
|
]
|
219
218
|
|
mplang/simp/__init__.py
CHANGED
@@ -96,7 +96,7 @@ def run_impl(
|
|
96
96
|
to route different function types to appropriate handlers.
|
97
97
|
|
98
98
|
Args:
|
99
|
-
pmask: The party mask of this function, None indicates auto deduce parties.
|
99
|
+
pmask: The party mask of this function, None indicates auto deduce parties from args.
|
100
100
|
func: The function to be dispatched and executed
|
101
101
|
*args: Positional arguments to pass to the function
|
102
102
|
**kwargs: Keyword arguments to pass to the function
|
@@ -20,22 +20,23 @@ mplang/core/tensor.py,sha256=86u6DogSZMoL0w5XjtTmQm2PhA_VjwybN1b6U4Zzphg,2361
|
|
20
20
|
mplang/core/tracer.py,sha256=dVMfUeCMmPz4o6tLXewGMW1Kpy5gpZORvr9w4MhwDtM,14288
|
21
21
|
mplang/core/expr/__init__.py,sha256=qwiSTUOcanFJLyK8HZ13_L1ZDrybqpPXIlTHAyeumE8,1988
|
22
22
|
mplang/core/expr/ast.py,sha256=KE46KTtlH9RA2V_EzWVKCKolsycgTmt7SotUrOc8Qxs,20923
|
23
|
-
mplang/core/expr/evaluator.py,sha256=
|
23
|
+
mplang/core/expr/evaluator.py,sha256=91KCnRczzp2vfMevrWs0xpkq0C-jQ_sQG2LOWFvxCUY,23280
|
24
24
|
mplang/core/expr/printer.py,sha256=VblKGnO0OUfzH7EBkszwRNxQUB8QyyC7BlJWJEUv9so,9546
|
25
25
|
mplang/core/expr/transformer.py,sha256=TyL-8FjrVvDq_C9X7kAuKkiqt2XdZM-okjzVQj0A33s,4893
|
26
26
|
mplang/core/expr/utils.py,sha256=VDTJ_-CsdHtVy9wDaGa7XdFxQ7o5lYYaeqcgsAhkbNI,2625
|
27
27
|
mplang/core/expr/visitor.py,sha256=2Ge-I5N-wH8VVXy8d2WyNaEv8x6seiRx9peyH9S2BYU,2044
|
28
28
|
mplang/core/expr/walk.py,sha256=lXkGJEEuvKGDqQihbxXPxfz2RfR1Q1zYUlt11iooQW0,11889
|
29
|
-
mplang/kernels/__init__.py,sha256=
|
29
|
+
mplang/kernels/__init__.py,sha256=eooIUklLSg-cvyGk6uDSwZ3bUAjM6AXtHw_YdbUamYo,1052
|
30
30
|
mplang/kernels/base.py,sha256=-YV4Aj5fs6GT4ehS6Tyi8WQ-amxn5edHTFJRQzyjHXY,3826
|
31
|
-
mplang/kernels/builtin.py,sha256=
|
31
|
+
mplang/kernels/builtin.py,sha256=4XhIu7yLGuVMJeED207ZGtecwV6zvQ2Zg61Nm5DK2co,9015
|
32
32
|
mplang/kernels/context.py,sha256=n-Z7fz7HjHb3UY380iZcasmn2sK-OQUGEIWJk2-fT18,13602
|
33
|
-
mplang/kernels/crypto.py,sha256=
|
34
|
-
mplang/kernels/mock_tee.py,sha256=
|
35
|
-
mplang/kernels/phe.py,sha256=
|
36
|
-
mplang/kernels/spu.py,sha256=
|
37
|
-
mplang/kernels/sql_duckdb.py,sha256=
|
38
|
-
mplang/kernels/stablehlo.py,sha256=
|
33
|
+
mplang/kernels/crypto.py,sha256=y5epCht71QenQnSbn5xRB0DCnb55Wm83iBJ1KRUedUU,4323
|
34
|
+
mplang/kernels/mock_tee.py,sha256=IMTIy5-tEMqB8bD1FG0Ki5UcH8dLAQUFIlFnktXUDX0,2492
|
35
|
+
mplang/kernels/phe.py,sha256=xglWuxPiclKVL1_YHgeN4KSUudqKwP5c4IskB-QjC1Y,72711
|
36
|
+
mplang/kernels/spu.py,sha256=vh-WG-uDVPvK11CDzc-f58sUalGts_eWJPjeuxLANfY,12508
|
37
|
+
mplang/kernels/sql_duckdb.py,sha256=vq4UCth_PCsH8dxcpx7mMnsq54KtjD8kxwISH7tj3qg,1631
|
38
|
+
mplang/kernels/stablehlo.py,sha256=gQyg-2ANyA1TjRg90MZ79mn4cHoXhU7g5GFUCuYXyKs,3231
|
39
|
+
mplang/kernels/value.py,sha256=2NZ0UvaLyRYb3bTCqL_fQXMzbHk1qbQ3j9xiv4v5E0A,20726
|
39
40
|
mplang/ops/__init__.py,sha256=dpe7WWiYapOFzJeGoKFYBr5mnd6P5SdOyvdYaM2Nhm0,1408
|
40
41
|
mplang/ops/base.py,sha256=h67_SHWNZGUuTCuMll-9kDgGvlPhlFov7WAQCHTmUvw,18258
|
41
42
|
mplang/ops/builtin.py,sha256=D7T8rRF9g05VIw9T72lsncF5cDQqaT37eapBieRKvRI,9363
|
@@ -47,21 +48,23 @@ mplang/ops/spu.py,sha256=UHr5DSoqG08xDYER_11OsMVjGGNXXxsvkFoVvXU8uik,4989
|
|
47
48
|
mplang/ops/sql.py,sha256=HyY2i5aGC5W7r62JryFSjQCUDXH3kQz82YADwn4z5uc,2015
|
48
49
|
mplang/ops/tee.py,sha256=bOpS_BXG12D6bONikzdF2yt0oVZj9Jyd0g_3IXP8VgE,1281
|
49
50
|
mplang/protos/v1alpha1/mpir_pb2.py,sha256=Bros37t-4LMJbuUYVSM65rImUYTtZDhNTIADGbZCKp0,7522
|
50
|
-
mplang/protos/v1alpha1/mpir_pb2.pyi,sha256=
|
51
|
+
mplang/protos/v1alpha1/mpir_pb2.pyi,sha256=dLxAtFW7mgFR-HYxC4ExI4jbtEWUGTKBvcKhI3BJ8m0,20972
|
51
52
|
mplang/protos/v1alpha1/mpir_pb2_grpc.py,sha256=xYOs94SXiNYAlFodACnsXW5QovLsHY5tCk3p76RH5Zc,158
|
53
|
+
mplang/protos/v1alpha1/value_pb2.py,sha256=V9fqQTqXNo2efYmlP9xOhC7EpjBUp5jL-05yrJsAvWU,2785
|
54
|
+
mplang/protos/v1alpha1/value_pb2.pyi,sha256=47GVvuZfiV5oaVemwh0xTfns8OYTVBT8YnluIQeQPbs,7108
|
52
55
|
mplang/runtime/__init__.py,sha256=IRPP3TtpFC4iSt7_uaq-S4dL7CwrXL0XBMeaBoEYLlg,948
|
53
56
|
mplang/runtime/cli.py,sha256=WehDodeVB4AukSWx1LJxxtKUqGmLPY4qjayrPlOg3bE,14438
|
54
|
-
mplang/runtime/client.py,sha256=
|
55
|
-
mplang/runtime/communicator.py,sha256=
|
57
|
+
mplang/runtime/client.py,sha256=v73cFnwN7ePaGJmPi20waizeIq6dlJTjEs6OkybSR2M,15858
|
58
|
+
mplang/runtime/communicator.py,sha256=P5nl3wxRomUafoAj-1FSgD7phelof399deitVB1JMos,3508
|
56
59
|
mplang/runtime/data_providers.py,sha256=GX10_nch8PmEyok32mSC4p5rDowvmXrJ-4J5-LvY6ig,8206
|
57
|
-
mplang/runtime/driver.py,sha256=
|
60
|
+
mplang/runtime/driver.py,sha256=Elo6zx66kvpNW7OwYr-gcb-RJDhcnCbPFQWyBcYM0Uk,11745
|
58
61
|
mplang/runtime/exceptions.py,sha256=c18U0xK20dRmgZo0ogTf5vXlkix9y3VAFuzkHxaXPEk,981
|
59
62
|
mplang/runtime/http_api.md,sha256=-re1DhEqMplAkv_wnqEU-PSs8tTzf4-Ml0Gq0f3Go6s,4883
|
60
|
-
mplang/runtime/link_comm.py,sha256=
|
61
|
-
mplang/runtime/server.py,sha256=
|
62
|
-
mplang/runtime/session.py,sha256=
|
63
|
-
mplang/runtime/simulation.py,sha256=
|
64
|
-
mplang/simp/__init__.py,sha256=
|
63
|
+
mplang/runtime/link_comm.py,sha256=ZHNcis8QDu2rcyyF3rhpxMiJDkczoMA_c0iZ2GDW_bA,2793
|
64
|
+
mplang/runtime/server.py,sha256=CdmBmpbylEl7XeZj26i0rUmTrPTvl2CVdRgbtR02gcg,16543
|
65
|
+
mplang/runtime/session.py,sha256=I2711V-pPRCYibNgBhjboUURdubnL6ltCoh5RvFVabs,10641
|
66
|
+
mplang/runtime/simulation.py,sha256=1I_8dIqxivxtYnQK0ofz0oXk3lXXh3-zN0lmNFnWucA,11615
|
67
|
+
mplang/simp/__init__.py,sha256=dMd2fALHo7wXhGktvg-S_ovkDd9Bu3gaZnEpsUymKjc,11589
|
65
68
|
mplang/simp/mpi.py,sha256=Wv_Q16TQ3rdLam6OzqXiefIGSMmagGkso09ycyOkHEs,4774
|
66
69
|
mplang/simp/random.py,sha256=7PVgWNL1j7Sf3MqT5PRiWplUu-0dyhF3Ub566iqX86M,3898
|
67
70
|
mplang/simp/smpc.py,sha256=tdH54aU4T-GIDPhpmf9NCeJC0G67PdOYc04cyUkOnwE,7119
|
@@ -70,8 +73,8 @@ mplang/utils/crypto.py,sha256=rvPomBFtznRHc3RPi6Aip9lsU8zW2oxBqGv1K3vn7Rs,1052
|
|
70
73
|
mplang/utils/func_utils.py,sha256=vCJcZmu0bEbqhOQKdpttV2_MBllIcPSN0b8U4WjNGGo,5164
|
71
74
|
mplang/utils/spu_utils.py,sha256=S3L9RBkBe2AvSuMSQQ12cBY5Y1NPthubvErSX_7nj1A,4158
|
72
75
|
mplang/utils/table_utils.py,sha256=aC-IZOKkSmFkpr3NZchLM0Wt0GOn-rg_xHBHREWBwAU,2202
|
73
|
-
mplang_nightly-0.1.
|
74
|
-
mplang_nightly-0.1.
|
75
|
-
mplang_nightly-0.1.
|
76
|
-
mplang_nightly-0.1.
|
77
|
-
mplang_nightly-0.1.
|
76
|
+
mplang_nightly-0.1.dev166.dist-info/METADATA,sha256=k1vY86w2LkBTs3Ez6uFLKIbk9nPNHjIzu7LS8pX9ufE,16547
|
77
|
+
mplang_nightly-0.1.dev166.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
78
|
+
mplang_nightly-0.1.dev166.dist-info/entry_points.txt,sha256=mG1oJT-GAjQR834a62_QIWb7litzWPPyVnwFqm-rWuY,55
|
79
|
+
mplang_nightly-0.1.dev166.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
80
|
+
mplang_nightly-0.1.dev166.dist-info/RECORD,,
|
File without changes
|
{mplang_nightly-0.1.dev164.dist-info → mplang_nightly-0.1.dev166.dist-info}/entry_points.txt
RENAMED
File without changes
|
{mplang_nightly-0.1.dev164.dist-info → mplang_nightly-0.1.dev166.dist-info}/licenses/LICENSE
RENAMED
File without changes
|