mplang-nightly 0.1.dev163__py3-none-any.whl → 0.1.dev165__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.
@@ -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 LinkCommunicator(ICommunicator, ICollective):
27
- """Wraps libspu link communicator for distributed communication"""
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 with rank={self._rank}, world_size={self._world_size}, addrs={addrs}",
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
- def scatter(self, root: int, args: list[Any]) -> Any:
107
- assert 0 <= root < self.world_size
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
- def allgather(self, arg: Any) -> list[Any]:
113
- rets = self.lctx.all_gather(self.wrap(arg))
114
- return [self.unwrap(ret) for ret in rets]
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
- import cloudpickle as pickle
26
- from fastapi import FastAPI, HTTPException, Request
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
- try:
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"Failed to decode value for symbols:// write: {e!s}"
126
- ) from e
127
- _global_symbols[name] = Symbol(name=name, mptype={}, data=obj)
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 = pickle.loads(base64.b64decode(request.data))
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=request.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
- data_bytes = pickle.dumps(symbol.data)
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=data_b64,
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 = pickle.loads(base64.b64decode(request.data))
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(name=sym.name, mptype=sym.mptype, data=request.data)
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
- data_bytes = pickle.dumps(sym.data)
447
- data_b64 = base64.b64encode(data_bytes).decode("utf-8")
448
- return GlobalSymbolResponse(name=sym.name, mptype=sym.mptype, data=data_b64)
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 ---
@@ -73,8 +73,8 @@ class SimVar(InterpVar):
73
73
 
74
74
  @property
75
75
  def values(self) -> list[Any]:
76
- """The values of this variable across all ranks."""
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).values[rank] for name, var in bindings.items()}
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
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mplang-nightly
3
- Version: 0.1.dev163
3
+ Version: 0.1.dev165
4
4
  Summary: Multi-Party Programming Language
5
5
  Author-email: SecretFlow Team <secretflow-contact@service.alipay.com>
6
6
  License: Apache License
@@ -1,6 +1,6 @@
1
1
  mplang/__init__.py,sha256=ofO-F-CNoVIxpMpTJtTJoQtKegJcHwcOJLzoVispiyc,1852
2
2
  mplang/api.py,sha256=ssmv0_CyZPFORhOUJ84Jo6NwRJSK7_Ono3n7ZjEg4sA,3058
3
- mplang/device.py,sha256=UxfsgaGrJaQyAOzrQBWYArqU6CHIvyONWxgAJHXVQ_0,13041
3
+ mplang/device.py,sha256=oFdu_XGaJ7AaSePCg1IEQmt6pVoJ3YWHzFyFX4UQBGM,12552
4
4
  mplang/analysis/__init__.py,sha256=CTHFvRsi-nFngojqjn08UaR3RY9i7CJ7T2UdR95kCrk,1056
5
5
  mplang/analysis/diagram.py,sha256=ffwgD12gL1_KH1uJ_EYkjmIlDrfxYJJkWj-wHl09_Xk,19520
6
6
  mplang/core/__init__.py,sha256=lWxlEKfRwX7FNDzgyKZ1fiDMaCiqkyg0j5mKlZD_v7g,2244
@@ -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=VrUUA_0BWTgdB178PgOEKPv91nuiqZui0lS-loEOEE4,21600
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=2WE4cmW96Xkzyq2yRRYNww4kZ5o6u6NbPV0BxqZG698,581
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=nSuM79cn7M6M27A6Y8ycilXT_qAlB1ktkwkRX6dv_VQ,7052
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=s7R0yd4Fk5cI2Qd3LpLc-kmbVuk8fFsbKbfKi43R0aE,3892
34
- mplang/kernels/mock_tee.py,sha256=wzXgiCpDWqQFS1HJHa5z_GxRJM7-r5l6T7KBpNcIZlg,2457
35
- mplang/kernels/phe.py,sha256=8-_1IFPOaGECGj9mbYja8XoqbMYnYqfpDNVyMJd8J1Y,65247
36
- mplang/kernels/spu.py,sha256=LkM8tNzhwTa8lufNgClHfnI4LNu25cdWLQZdJsMDEO8,9301
37
- mplang/kernels/sql_duckdb.py,sha256=UN1Ev6-MxF_-65zMExUsLScC9PlmEIEcN8YziIoX_rY,1724
38
- mplang/kernels/stablehlo.py,sha256=M25_1G332uFCUcIIjpcTMwIdSDW1TMjfhFWxbz5OBZ0,2966
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
@@ -45,23 +46,25 @@ mplang/ops/jax_cc.py,sha256=42czYg3hNQbI_nUebXnshlU8ULwM-oBDe_TQoApLNVA,7802
45
46
  mplang/ops/phe.py,sha256=SatswExjZWPed8y3qA33BCwIWbvsgHCuCAz_pv2RLLw,6790
46
47
  mplang/ops/spu.py,sha256=UHr5DSoqG08xDYER_11OsMVjGGNXXxsvkFoVvXU8uik,4989
47
48
  mplang/ops/sql.py,sha256=HyY2i5aGC5W7r62JryFSjQCUDXH3kQz82YADwn4z5uc,2015
48
- mplang/ops/tee.py,sha256=1yoaFFF5NI9gJge1-bhbT2lsphjBXErfDsleYlEMoWs,1664
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=GwXR4wPB_kB_36iYS9x-cGI9KDKFMq89KhdLhW_xmvE,19342
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=vkJUFSDcKIdbKiGUM5AosCKTZygl9g8uZFEjw2xwKig,15249
55
- mplang/runtime/communicator.py,sha256=Lek6_h_Wmr_W-_JpT-vMxL3CHxcVZdtf7jdaLGuxPgQ,3199
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=pq2EQFZK9tH90Idops_yeF6fj0cfFVD_5mFcmy4Hzco,11089
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=uNqTCGZVwWeuHAb7yXXQf0DUsMXLa8leHCkrcZdzYMU,4559
61
- mplang/runtime/server.py,sha256=vYjuWTWhhSLHUpsO8FDnOQ8kFzPhE-fXDDyL8GHVPj4,16673
62
- mplang/runtime/session.py,sha256=zDk7lJAeTcimMRqmPNJyfyWODJ4MyidlYE2HLOeLPeE,10269
63
- mplang/runtime/simulation.py,sha256=WyIs8ta3ZM5o3RB0Bcb0MUu6Yh88Iujr27KvZFqGxig,11497
64
- mplang/simp/__init__.py,sha256=xNXnA8-jZAANa2A1W39b3lYO7D02zdCXl0TpivkTGS4,11579
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.dev163.dist-info/METADATA,sha256=2JegY_nYHjbyCsl7Tl-0afJb7ufKl7SoMfvz_9E3v50,16547
74
- mplang_nightly-0.1.dev163.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
75
- mplang_nightly-0.1.dev163.dist-info/entry_points.txt,sha256=mG1oJT-GAjQR834a62_QIWb7litzWPPyVnwFqm-rWuY,55
76
- mplang_nightly-0.1.dev163.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
77
- mplang_nightly-0.1.dev163.dist-info/RECORD,,
76
+ mplang_nightly-0.1.dev165.dist-info/METADATA,sha256=of1Q2tokLJJxfzA5--BJFbeY9D3L6vbTjQOM6tOtNAo,16547
77
+ mplang_nightly-0.1.dev165.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
78
+ mplang_nightly-0.1.dev165.dist-info/entry_points.txt,sha256=mG1oJT-GAjQR834a62_QIWb7litzWPPyVnwFqm-rWuY,55
79
+ mplang_nightly-0.1.dev165.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
80
+ mplang_nightly-0.1.dev165.dist-info/RECORD,,