pythagoras 0.23.19__tar.gz → 0.24.1__tar.gz
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.
- {pythagoras-0.23.19 → pythagoras-0.24.1}/PKG-INFO +3 -3
- {pythagoras-0.23.19 → pythagoras-0.24.1}/pyproject.toml +3 -3
- pythagoras-0.24.1/src/pythagoras/.DS_Store +0 -0
- pythagoras-0.24.1/src/pythagoras/_010_basic_portals/.DS_Store +0 -0
- {pythagoras-0.23.19 → pythagoras-0.24.1}/src/pythagoras/_010_basic_portals/basic_portal_core_classes.py +5 -1
- pythagoras-0.24.1/src/pythagoras/_020_ordinary_code_portals/.DS_Store +0 -0
- pythagoras-0.24.1/src/pythagoras/_030_data_portals/.DS_Store +0 -0
- {pythagoras-0.23.19 → pythagoras-0.24.1}/src/pythagoras/_030_data_portals/data_portal_core_classes.py +2 -2
- pythagoras-0.24.1/src/pythagoras/_040_logging_code_portals/.DS_Store +0 -0
- {pythagoras-0.23.19 → pythagoras-0.24.1}/src/pythagoras/_040_logging_code_portals/logging_portal_core_classes.py +8 -8
- pythagoras-0.24.1/src/pythagoras/_050_safe_code_portals/.DS_Store +0 -0
- {pythagoras-0.23.19 → pythagoras-0.24.1}/src/pythagoras/_050_safe_code_portals/safe_portal_core_classes.py +2 -2
- pythagoras-0.24.1/src/pythagoras/_060_autonomous_code_portals/.DS_Store +0 -0
- {pythagoras-0.23.19/src/pythagoras → pythagoras-0.24.1/src/pythagoras/_070_protected_code_portals}/.DS_Store +0 -0
- pythagoras-0.24.1/src/pythagoras/_080_pure_code_portals/.DS_Store +0 -0
- {pythagoras-0.23.19 → pythagoras-0.24.1}/src/pythagoras/_080_pure_code_portals/pure_core_classes.py +2 -2
- {pythagoras-0.23.19 → pythagoras-0.24.1}/src/pythagoras/_080_pure_code_portals/recursion_pre_validator.py +9 -5
- pythagoras-0.24.1/src/pythagoras/_090_swarming_portals/.DS_Store +0 -0
- pythagoras-0.24.1/src/pythagoras/_090_swarming_portals/output_suppressor.py +18 -0
- {pythagoras-0.23.19 → pythagoras-0.24.1}/src/pythagoras/_090_swarming_portals/swarming_portals.py +43 -27
- pythagoras-0.24.1/src/pythagoras/_100_top_level_API/.DS_Store +0 -0
- pythagoras-0.24.1/src/pythagoras/_800_signatures_and_converters/.DS_Store +0 -0
- pythagoras-0.24.1/src/pythagoras/_900_project_stats_collector/.DS_Store +0 -0
- pythagoras-0.23.19/src/pythagoras/_090_swarming_portals/output_suppressor.py +0 -23
- {pythagoras-0.23.19 → pythagoras-0.24.1}/README.md +0 -0
- {pythagoras-0.23.19 → pythagoras-0.24.1}/src/pythagoras/_010_basic_portals/__init__.py +0 -0
- {pythagoras-0.23.19 → pythagoras-0.24.1}/src/pythagoras/_010_basic_portals/exceptions.py +0 -0
- {pythagoras-0.23.19 → pythagoras-0.24.1}/src/pythagoras/_010_basic_portals/long_infoname.py +0 -0
- {pythagoras-0.23.19 → pythagoras-0.24.1}/src/pythagoras/_010_basic_portals/not_picklable_class.py +0 -0
- {pythagoras-0.23.19 → pythagoras-0.24.1}/src/pythagoras/_010_basic_portals/portal_tester.py +0 -0
- {pythagoras-0.23.19 → pythagoras-0.24.1}/src/pythagoras/_010_basic_portals/post_init_metaclass.py +0 -0
- {pythagoras-0.23.19 → pythagoras-0.24.1}/src/pythagoras/_020_ordinary_code_portals/__init__.py +0 -0
- {pythagoras-0.23.19 → pythagoras-0.24.1}/src/pythagoras/_020_ordinary_code_portals/code_normalizer.py +0 -0
- {pythagoras-0.23.19 → pythagoras-0.24.1}/src/pythagoras/_020_ordinary_code_portals/function_processing.py +0 -0
- {pythagoras-0.23.19 → pythagoras-0.24.1}/src/pythagoras/_020_ordinary_code_portals/ordinary_decorator.py +0 -0
- {pythagoras-0.23.19 → pythagoras-0.24.1}/src/pythagoras/_020_ordinary_code_portals/ordinary_portal_core_classes.py +0 -0
- {pythagoras-0.23.19 → pythagoras-0.24.1}/src/pythagoras/_030_data_portals/__init__.py +0 -0
- {pythagoras-0.23.19 → pythagoras-0.24.1}/src/pythagoras/_030_data_portals/ready_and_get.py +0 -0
- {pythagoras-0.23.19 → pythagoras-0.24.1}/src/pythagoras/_030_data_portals/storable_decorator.py +0 -0
- {pythagoras-0.23.19 → pythagoras-0.24.1}/src/pythagoras/_040_logging_code_portals/__init__.py +0 -0
- {pythagoras-0.23.19 → pythagoras-0.24.1}/src/pythagoras/_040_logging_code_portals/exception_processing_tracking.py +0 -0
- {pythagoras-0.23.19 → pythagoras-0.24.1}/src/pythagoras/_040_logging_code_portals/execution_environment_summary.py +0 -0
- {pythagoras-0.23.19 → pythagoras-0.24.1}/src/pythagoras/_040_logging_code_portals/kw_args.py +0 -0
- {pythagoras-0.23.19 → pythagoras-0.24.1}/src/pythagoras/_040_logging_code_portals/logging_decorator.py +0 -0
- {pythagoras-0.23.19 → pythagoras-0.24.1}/src/pythagoras/_040_logging_code_portals/notebook_checker.py +0 -0
- {pythagoras-0.23.19 → pythagoras-0.24.1}/src/pythagoras/_040_logging_code_portals/output_capturer.py +0 -0
- {pythagoras-0.23.19 → pythagoras-0.24.1}/src/pythagoras/_040_logging_code_portals/uncaught_exceptions.py +0 -0
- {pythagoras-0.23.19 → pythagoras-0.24.1}/src/pythagoras/_050_safe_code_portals/__init__.py +0 -0
- {pythagoras-0.23.19 → pythagoras-0.24.1}/src/pythagoras/_050_safe_code_portals/safe_decorator.py +0 -0
- {pythagoras-0.23.19 → pythagoras-0.24.1}/src/pythagoras/_060_autonomous_code_portals/__init__.py +0 -0
- {pythagoras-0.23.19 → pythagoras-0.24.1}/src/pythagoras/_060_autonomous_code_portals/autonomous_decorators.py +0 -0
- {pythagoras-0.23.19 → pythagoras-0.24.1}/src/pythagoras/_060_autonomous_code_portals/autonomous_portal_core_classes.py +0 -0
- {pythagoras-0.23.19 → pythagoras-0.24.1}/src/pythagoras/_060_autonomous_code_portals/names_usage_analyzer.py +0 -0
- {pythagoras-0.23.19 → pythagoras-0.24.1}/src/pythagoras/_070_protected_code_portals/__init__.py +0 -0
- {pythagoras-0.23.19 → pythagoras-0.24.1}/src/pythagoras/_070_protected_code_portals/basic_pre_validators.py +0 -0
- {pythagoras-0.23.19 → pythagoras-0.24.1}/src/pythagoras/_070_protected_code_portals/fn_arg_names_checker.py +0 -0
- {pythagoras-0.23.19 → pythagoras-0.24.1}/src/pythagoras/_070_protected_code_portals/list_flattener.py +0 -0
- {pythagoras-0.23.19 → pythagoras-0.24.1}/src/pythagoras/_070_protected_code_portals/package_manager.py +0 -0
- {pythagoras-0.23.19 → pythagoras-0.24.1}/src/pythagoras/_070_protected_code_portals/protected_decorators.py +0 -0
- {pythagoras-0.23.19 → pythagoras-0.24.1}/src/pythagoras/_070_protected_code_portals/protected_portal_core_classes.py +0 -0
- {pythagoras-0.23.19 → pythagoras-0.24.1}/src/pythagoras/_070_protected_code_portals/system_utils.py +0 -0
- {pythagoras-0.23.19 → pythagoras-0.24.1}/src/pythagoras/_070_protected_code_portals/validation_succesful_const.py +0 -0
- {pythagoras-0.23.19 → pythagoras-0.24.1}/src/pythagoras/_080_pure_code_portals/__init__.py +0 -0
- {pythagoras-0.23.19 → pythagoras-0.24.1}/src/pythagoras/_080_pure_code_portals/pure_decorator.py +0 -0
- {pythagoras-0.23.19 → pythagoras-0.24.1}/src/pythagoras/_090_swarming_portals/__init__.py +0 -0
- {pythagoras-0.23.19 → pythagoras-0.24.1}/src/pythagoras/_100_top_level_API/__init__.py +0 -0
- {pythagoras-0.23.19 → pythagoras-0.24.1}/src/pythagoras/_100_top_level_API/default_local_portal.py +0 -0
- {pythagoras-0.23.19 → pythagoras-0.24.1}/src/pythagoras/_100_top_level_API/top_level_API.py +0 -0
- {pythagoras-0.23.19 → pythagoras-0.24.1}/src/pythagoras/_800_signatures_and_converters/__init__.py +0 -0
- {pythagoras-0.23.19 → pythagoras-0.24.1}/src/pythagoras/_800_signatures_and_converters/base_16_32_convertors.py +0 -0
- {pythagoras-0.23.19 → pythagoras-0.24.1}/src/pythagoras/_800_signatures_and_converters/current_date_gmt_str.py +0 -0
- {pythagoras-0.23.19 → pythagoras-0.24.1}/src/pythagoras/_800_signatures_and_converters/hash_signatures.py +0 -0
- {pythagoras-0.23.19 → pythagoras-0.24.1}/src/pythagoras/_800_signatures_and_converters/node_signature.py +0 -0
- {pythagoras-0.23.19 → pythagoras-0.24.1}/src/pythagoras/_800_signatures_and_converters/random_signatures.py +0 -0
- {pythagoras-0.23.19 → pythagoras-0.24.1}/src/pythagoras/_900_project_stats_collector/__init__.py +0 -0
- {pythagoras-0.23.19 → pythagoras-0.24.1}/src/pythagoras/_900_project_stats_collector/project_analyzer.py +0 -0
- {pythagoras-0.23.19 → pythagoras-0.24.1}/src/pythagoras/__init__.py +0 -0
- {pythagoras-0.23.19 → pythagoras-0.24.1}/src/pythagoras/core/__init__.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: pythagoras
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.24.1
|
|
4
4
|
Summary: Planet-scale distributed computing in Python.
|
|
5
5
|
Keywords: cloud,ML,AI,serverless,distributed,parallel,machine-learning,deep-learning,pythagoras
|
|
6
6
|
Author: Volodymyr (Vlad) Pavlov
|
|
@@ -16,8 +16,7 @@ Classifier: Topic :: Scientific/Engineering
|
|
|
16
16
|
Classifier: Topic :: Scientific/Engineering :: Information Analysis
|
|
17
17
|
Classifier: Topic :: Software Development :: Libraries
|
|
18
18
|
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
19
|
-
Requires-Dist:
|
|
20
|
-
Requires-Dist: persidict
|
|
19
|
+
Requires-Dist: persidict==0.104.1
|
|
21
20
|
Requires-Dist: lz4
|
|
22
21
|
Requires-Dist: joblib
|
|
23
22
|
Requires-Dist: scikit-learn
|
|
@@ -32,6 +31,7 @@ Requires-Dist: boto3
|
|
|
32
31
|
Requires-Dist: moto
|
|
33
32
|
Requires-Dist: uv
|
|
34
33
|
Requires-Dist: nvidia-ml-py
|
|
34
|
+
Requires-Dist: parameterizable==0.100.0
|
|
35
35
|
Requires-Dist: persidict[aws] ; extra == 'aws'
|
|
36
36
|
Requires-Dist: boto3 ; extra == 'aws'
|
|
37
37
|
Requires-Dist: moto ; extra == 'aws'
|
|
@@ -4,7 +4,7 @@ build-backend = "uv_build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "pythagoras"
|
|
7
|
-
version = "0.
|
|
7
|
+
version = "0.24.1"
|
|
8
8
|
authors = [
|
|
9
9
|
{name = "Volodymyr (Vlad) Pavlov", email = "vlpavlov@ieee.org"},
|
|
10
10
|
]
|
|
@@ -26,8 +26,7 @@ classifiers = [
|
|
|
26
26
|
]
|
|
27
27
|
keywords = ["cloud", "ML", "AI", "serverless", "distributed", "parallel", "machine-learning", "deep-learning", "pythagoras"]
|
|
28
28
|
dependencies = [
|
|
29
|
-
"
|
|
30
|
-
"persidict",
|
|
29
|
+
"persidict==0.104.1",
|
|
31
30
|
"lz4",
|
|
32
31
|
"joblib",
|
|
33
32
|
"scikit-learn",
|
|
@@ -42,6 +41,7 @@ dependencies = [
|
|
|
42
41
|
"moto",
|
|
43
42
|
"uv",
|
|
44
43
|
"nvidia-ml-py",
|
|
44
|
+
"parameterizable==0.100.0",
|
|
45
45
|
]
|
|
46
46
|
|
|
47
47
|
[project.urls]
|
|
Binary file
|
|
Binary file
|
|
@@ -14,6 +14,7 @@ from abc import abstractmethod
|
|
|
14
14
|
from pathlib import Path
|
|
15
15
|
from typing import TypeVar, Type, Any, NewType
|
|
16
16
|
import pandas as pd
|
|
17
|
+
import parameterizable
|
|
17
18
|
from parameterizable import ParameterizableClass, sort_dict_by_keys
|
|
18
19
|
|
|
19
20
|
from persidict import PersiDict, FileDirDict, SafeStrTuple
|
|
@@ -376,7 +377,10 @@ class BasicPortal(NotPicklable,ParameterizableClass, metaclass = PostInitMeta):
|
|
|
376
377
|
It's an internal hash used by Pythagoras and is different from .__hash__()
|
|
377
378
|
"""
|
|
378
379
|
if not hasattr(self,"_str_id_cache"):
|
|
379
|
-
params = self.
|
|
380
|
+
params = self.get_params()
|
|
381
|
+
jsparams = parameterizable.dumpjs(params)
|
|
382
|
+
param_names = set(params.keys())
|
|
383
|
+
params = parameterizable.access_jsparams(jsparams, *param_names)
|
|
380
384
|
ephemeral_names = self._ephemeral_param_names
|
|
381
385
|
nonephemeral_params = {k:params[k] for k in params
|
|
382
386
|
if k not in ephemeral_names}
|
|
Binary file
|
|
Binary file
|
|
@@ -75,7 +75,7 @@ class DataPortal(OrdinaryCodePortal):
|
|
|
75
75
|
config_settings_prototype = self._root_dict.get_subdict("config_settings")
|
|
76
76
|
config_settings_params = config_settings_prototype.get_params()
|
|
77
77
|
config_settings_params.update(
|
|
78
|
-
digest_len=0,
|
|
78
|
+
digest_len=0, append_only=False, serialization_format="pkl")
|
|
79
79
|
config_settings = type(self._root_dict)(**config_settings_params)
|
|
80
80
|
self._config_settings = config_settings
|
|
81
81
|
|
|
@@ -90,7 +90,7 @@ class DataPortal(OrdinaryCodePortal):
|
|
|
90
90
|
value_store_prototype = self._root_dict.get_subdict("value_store")
|
|
91
91
|
value_store_params = value_store_prototype.get_params()
|
|
92
92
|
value_store_params.update(
|
|
93
|
-
digest_len=0,
|
|
93
|
+
digest_len=0, append_only=True, serialization_format = "pkl")
|
|
94
94
|
value_store = type(self._root_dict)(**value_store_params)
|
|
95
95
|
value_store = WriteOnceDict(value_store, 0)
|
|
96
96
|
self._value_store = value_store
|
|
Binary file
|
|
@@ -5,7 +5,7 @@ import traceback
|
|
|
5
5
|
from typing import Callable, Any
|
|
6
6
|
|
|
7
7
|
import pandas as pd
|
|
8
|
-
from parameterizable import register_parameterizable_class
|
|
8
|
+
# from parameterizable import register_parameterizable_class
|
|
9
9
|
from persidict import PersiDict, KEEP_CURRENT, Joker
|
|
10
10
|
|
|
11
11
|
from .._010_basic_portals import NotPicklable, get_active_portal
|
|
@@ -551,13 +551,13 @@ class LoggingCodePortal(DataPortal):
|
|
|
551
551
|
crash_history_prototype = self._root_dict.get_subdict("crash_history")
|
|
552
552
|
crash_history_params = crash_history_prototype.get_params()
|
|
553
553
|
crash_history_params.update(
|
|
554
|
-
dict(
|
|
554
|
+
dict(serialization_format="json", append_only=True , digest_len=0))
|
|
555
555
|
self._crash_history = type(self._root_dict)(**crash_history_params)
|
|
556
556
|
|
|
557
557
|
event_history_prototype = self._root_dict.get_subdict("event_history")
|
|
558
558
|
event_history_params = event_history_prototype.get_params()
|
|
559
559
|
event_history_params.update(
|
|
560
|
-
dict(
|
|
560
|
+
dict(serialization_format="json", append_only=True, digest_len=0))
|
|
561
561
|
self._event_history = type(self._root_dict)(**event_history_params)
|
|
562
562
|
|
|
563
563
|
run_history_prototype = self._root_dict.get_subdict("run_history")
|
|
@@ -566,10 +566,10 @@ class LoggingCodePortal(DataPortal):
|
|
|
566
566
|
run_history = OverlappingMultiDict(
|
|
567
567
|
dict_type=dict_type
|
|
568
568
|
, shared_subdicts_params=run_history_shared_params
|
|
569
|
-
, json=dict(
|
|
570
|
-
, py=dict(base_class_for_values=str,
|
|
571
|
-
, txt=dict(base_class_for_values=str,
|
|
572
|
-
, pkl=dict(
|
|
569
|
+
, json=dict(append_only=True)
|
|
570
|
+
, py=dict(base_class_for_values=str, append_only=False) # Immutable items????
|
|
571
|
+
, txt=dict(base_class_for_values=str, append_only=True)
|
|
572
|
+
, pkl=dict(append_only=True)
|
|
573
573
|
)
|
|
574
574
|
self._run_history = run_history
|
|
575
575
|
|
|
@@ -611,7 +611,7 @@ class LoggingCodePortal(DataPortal):
|
|
|
611
611
|
super()._clear()
|
|
612
612
|
|
|
613
613
|
|
|
614
|
-
register_parameterizable_class(LoggingCodePortal)
|
|
614
|
+
# register_parameterizable_class(LoggingCodePortal)
|
|
615
615
|
|
|
616
616
|
|
|
617
617
|
def log_exception() -> None:
|
|
Binary file
|
|
@@ -15,7 +15,7 @@ from __future__ import annotations
|
|
|
15
15
|
|
|
16
16
|
from typing import Callable
|
|
17
17
|
|
|
18
|
-
from parameterizable import register_parameterizable_class
|
|
18
|
+
# from parameterizable import register_parameterizable_class
|
|
19
19
|
from persidict import PersiDict, Joker, KEEP_CURRENT
|
|
20
20
|
|
|
21
21
|
from .._040_logging_code_portals.logging_portal_core_classes import *
|
|
@@ -80,4 +80,4 @@ class SafeFn(LoggingFn):
|
|
|
80
80
|
return SafeFnCallSignature(fn=self, arguments=arguments)
|
|
81
81
|
|
|
82
82
|
|
|
83
|
-
register_parameterizable_class(SafeCodePortal)
|
|
83
|
+
# register_parameterizable_class(SafeCodePortal)
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
{pythagoras-0.23.19 → pythagoras-0.24.1}/src/pythagoras/_080_pure_code_portals/pure_core_classes.py
RENAMED
|
@@ -68,7 +68,7 @@ class PureCodePortal(ProtectedCodePortal):
|
|
|
68
68
|
results_dict_prototype = self._root_dict.get_subdict(
|
|
69
69
|
"execution_results")
|
|
70
70
|
results_dict_params = results_dict_prototype.get_params()
|
|
71
|
-
results_dict_params.update(
|
|
71
|
+
results_dict_params.update(append_only=True, serialization_format = "pkl")
|
|
72
72
|
execution_results = type(self._root_dict)(**results_dict_params)
|
|
73
73
|
execution_results = WriteOnceDict(execution_results, 0)
|
|
74
74
|
self._execution_results = execution_results
|
|
@@ -76,7 +76,7 @@ class PureCodePortal(ProtectedCodePortal):
|
|
|
76
76
|
requests_dict_prototype = self._root_dict.get_subdict(
|
|
77
77
|
"execution_requests")
|
|
78
78
|
requests_dict_params = requests_dict_prototype.get_params()
|
|
79
|
-
requests_dict_params.update(
|
|
79
|
+
requests_dict_params.update(append_only=False, serialization_format="pkl")
|
|
80
80
|
execution_requests = type(self._root_dict)(**requests_dict_params)
|
|
81
81
|
self._execution_requests = execution_requests
|
|
82
82
|
|
|
@@ -20,12 +20,17 @@ def _recursion_pre_validator(
|
|
|
20
20
|
param_value = unpacked_kwargs[param_name]
|
|
21
21
|
assert isinstance(param_value, int)
|
|
22
22
|
assert param_value >= 0
|
|
23
|
-
if param_value in {0,1}:
|
|
23
|
+
if param_value in {0,1,2,3,4}:
|
|
24
24
|
return pth.VALIDATION_SUCCESSFUL
|
|
25
|
-
|
|
25
|
+
unpacked_kwargs[param_name] = param_value - 1
|
|
26
|
+
result_addr = pth.PureFnExecutionResultAddr(
|
|
27
|
+
fn=fn, arguments=unpacked_kwargs)
|
|
28
|
+
if result_addr.ready:
|
|
29
|
+
return pth.VALIDATION_SUCCESSFUL
|
|
30
|
+
result = result_addr.call_signature
|
|
31
|
+
|
|
26
32
|
# Binary search to find the smallest n where result_addr.ready is not True
|
|
27
|
-
left, right = 2, param_value -
|
|
28
|
-
result = pth.VALIDATION_SUCCESSFUL # Default result if all are ready
|
|
33
|
+
left, right = 2, param_value - 2
|
|
29
34
|
|
|
30
35
|
while left <= right:
|
|
31
36
|
mid = (left + right) // 2
|
|
@@ -42,7 +47,6 @@ def _recursion_pre_validator(
|
|
|
42
47
|
# Result is ready, search in the right half
|
|
43
48
|
left = mid + 1
|
|
44
49
|
|
|
45
|
-
|
|
46
50
|
return result
|
|
47
51
|
|
|
48
52
|
|
|
Binary file
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import os
|
|
2
|
+
from contextlib import ExitStack, redirect_stderr, redirect_stdout
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class OutputSuppressor:
|
|
7
|
+
"""A context manager that suppresses stdout and stderr output."""
|
|
8
|
+
|
|
9
|
+
def __enter__(self):
|
|
10
|
+
"""Redirect stdout and stderr to os.devnull."""
|
|
11
|
+
self._stack = ExitStack()
|
|
12
|
+
devnull = self._stack.enter_context(open(os.devnull, "w"))
|
|
13
|
+
self._stack.enter_context(redirect_stdout(devnull))
|
|
14
|
+
self._stack.enter_context(redirect_stderr(devnull))
|
|
15
|
+
return self
|
|
16
|
+
|
|
17
|
+
def __exit__(self, exc_type, exc_val, exc_tb):
|
|
18
|
+
return self._stack.__exit__(exc_type, exc_val, exc_tb)
|
{pythagoras-0.23.19 → pythagoras-0.24.1}/src/pythagoras/_090_swarming_portals/swarming_portals.py
RENAMED
|
@@ -12,13 +12,19 @@ at least once but does not offer any further guarantees.
|
|
|
12
12
|
from __future__ import annotations
|
|
13
13
|
|
|
14
14
|
import atexit
|
|
15
|
+
import json
|
|
15
16
|
from time import sleep
|
|
16
17
|
|
|
17
18
|
import pandas as pd
|
|
18
19
|
import parameterizable
|
|
19
|
-
from parameterizable import
|
|
20
|
+
from parameterizable import (
|
|
21
|
+
sort_dict_by_keys,
|
|
22
|
+
update_jsparams,
|
|
23
|
+
access_jsparams)
|
|
20
24
|
from persidict import PersiDict, Joker, KEEP_CURRENT
|
|
21
25
|
|
|
26
|
+
from parameterizable.json_processor import _Markers
|
|
27
|
+
|
|
22
28
|
from .. import VALIDATION_SUCCESSFUL
|
|
23
29
|
from .._010_basic_portals import get_all_known_portals
|
|
24
30
|
from .._070_protected_code_portals.system_utils import get_unused_ram_mb, get_unused_cpu_cores, process_is_active, \
|
|
@@ -77,8 +83,8 @@ class SwarmingPortal(PureCodePortal):
|
|
|
77
83
|
compute_nodes = OverlappingMultiDict(
|
|
78
84
|
dict_type=dict_type
|
|
79
85
|
, shared_subdicts_params=compute_nodes_shared_params
|
|
80
|
-
, json=dict(
|
|
81
|
-
, pkl=dict(
|
|
86
|
+
, json=dict(append_only=False)
|
|
87
|
+
, pkl=dict(append_only=False)
|
|
82
88
|
)
|
|
83
89
|
self._compute_nodes = compute_nodes
|
|
84
90
|
|
|
@@ -88,6 +94,14 @@ class SwarmingPortal(PureCodePortal):
|
|
|
88
94
|
self._child_process = None
|
|
89
95
|
|
|
90
96
|
|
|
97
|
+
def get_params(self) -> dict:
|
|
98
|
+
params = super().get_params()
|
|
99
|
+
params["parent_process_id"] = self._parent_process_id
|
|
100
|
+
params["parent_process_start_time"] = self._parent_process_start_time
|
|
101
|
+
sorted_params = sort_dict_by_keys(params)
|
|
102
|
+
return sorted_params
|
|
103
|
+
|
|
104
|
+
|
|
91
105
|
@property
|
|
92
106
|
def is_parent(self) -> bool:
|
|
93
107
|
"""Check if this portal is the parent process."""
|
|
@@ -106,14 +120,14 @@ class SwarmingPortal(PureCodePortal):
|
|
|
106
120
|
if self.is_parent:
|
|
107
121
|
if self.max_n_workers > 0:
|
|
108
122
|
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
123
|
+
portal_init_jsparams = parameterizable.dumpjs(self)
|
|
124
|
+
portal_init_jsparams = update_jsparams(portal_init_jsparams,
|
|
125
|
+
max_n_workers = self.max_n_workers)
|
|
112
126
|
|
|
113
127
|
ctx = get_context("spawn")
|
|
114
128
|
self._child_process = ctx.Process(
|
|
115
129
|
target=_launch_many_background_workers
|
|
116
|
-
,
|
|
130
|
+
, args=(portal_init_jsparams,))
|
|
117
131
|
self._child_process.start()
|
|
118
132
|
|
|
119
133
|
|
|
@@ -198,22 +212,22 @@ class SwarmingPortal(PureCodePortal):
|
|
|
198
212
|
del self._max_n_workers_cache
|
|
199
213
|
super()._invalidate_cache()
|
|
200
214
|
|
|
201
|
-
parameterizable.register_parameterizable_class(SwarmingPortal)
|
|
215
|
+
# parameterizable.register_parameterizable_class(SwarmingPortal)
|
|
202
216
|
|
|
203
217
|
|
|
204
|
-
def _launch_many_background_workers(
|
|
218
|
+
def _launch_many_background_workers(portal_init_jsparams:JsonSerializedParams) -> None:
|
|
205
219
|
"""Launch many background worker processes."""
|
|
206
|
-
|
|
220
|
+
|
|
221
|
+
|
|
222
|
+
n_workers_to_launch = access_jsparams(portal_init_jsparams
|
|
223
|
+
, "max_n_workers")["max_n_workers"]
|
|
207
224
|
n_workers_to_launch = int(n_workers_to_launch)
|
|
208
225
|
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
portal_init_params = sort_dict_by_keys(portal_init_params)
|
|
215
|
-
portal = parameterizable.get_object_from_portable_params(
|
|
216
|
-
portal_init_params)
|
|
226
|
+
portal_init_jsparams = update_jsparams(portal_init_jsparams,
|
|
227
|
+
max_n_workers=0, parent_process_id = get_current_process_id(),
|
|
228
|
+
parent_process_start_time = get_current_process_start_time())
|
|
229
|
+
|
|
230
|
+
portal = parameterizable.loadjs(portal_init_jsparams)
|
|
217
231
|
assert isinstance(portal, SwarmingPortal)
|
|
218
232
|
|
|
219
233
|
summary = build_execution_environment_summary()
|
|
@@ -226,7 +240,7 @@ def _launch_many_background_workers(**portal_init_params) -> None:
|
|
|
226
240
|
portal._randomly_delay_execution(p=1)
|
|
227
241
|
ctx = get_context("spawn")
|
|
228
242
|
try:
|
|
229
|
-
p = ctx.Process(target=_background_worker,
|
|
243
|
+
p = ctx.Process(target=_background_worker, args=(portal_init_jsparams,))
|
|
230
244
|
p.start()
|
|
231
245
|
list_of_all_workers.append(p)
|
|
232
246
|
except Exception as e:
|
|
@@ -243,7 +257,7 @@ def _launch_many_background_workers(**portal_init_params) -> None:
|
|
|
243
257
|
portal._randomly_delay_execution(p=1)
|
|
244
258
|
ctx = get_context("spawn")
|
|
245
259
|
try:
|
|
246
|
-
p = ctx.Process(target=_background_worker,
|
|
260
|
+
p = ctx.Process(target=_background_worker, args=(portal_init_jsparams,))
|
|
247
261
|
p.start()
|
|
248
262
|
new_list_of_all_workers.append(p)
|
|
249
263
|
except Exception as e:
|
|
@@ -251,10 +265,9 @@ def _launch_many_background_workers(**portal_init_params) -> None:
|
|
|
251
265
|
list_of_all_workers = new_list_of_all_workers
|
|
252
266
|
|
|
253
267
|
|
|
254
|
-
def _background_worker(
|
|
268
|
+
def _background_worker(portal_init_jsparams:JsonSerializedParams) -> None:
|
|
255
269
|
"""Background worker that keeps processing random execution requests."""
|
|
256
|
-
portal = parameterizable.
|
|
257
|
-
portal_init_params)
|
|
270
|
+
portal = parameterizable.loadjs(portal_init_jsparams)
|
|
258
271
|
assert isinstance(portal, SwarmingPortal)
|
|
259
272
|
with portal:
|
|
260
273
|
ctx = get_context("spawn")
|
|
@@ -264,16 +277,19 @@ def _background_worker(**portal_init_params) -> None:
|
|
|
264
277
|
return
|
|
265
278
|
p = ctx.Process(
|
|
266
279
|
target=_process_random_execution_request
|
|
267
|
-
,
|
|
280
|
+
, args=(portal_init_jsparams,))
|
|
268
281
|
p.start()
|
|
269
282
|
p.join()
|
|
270
283
|
portal._randomly_delay_execution()
|
|
271
284
|
|
|
272
285
|
|
|
273
|
-
def _process_random_execution_request(
|
|
286
|
+
def _process_random_execution_request(portal_init_jsparams:JsonSerializedParams):
|
|
274
287
|
"""Process one random execution request."""
|
|
275
|
-
portal = parameterizable.get_object_from_portable_params(
|
|
276
|
-
|
|
288
|
+
# portal = parameterizable.get_object_from_portable_params(
|
|
289
|
+
# portal_init_params)
|
|
290
|
+
portal_init_jsparams = update_jsparams(
|
|
291
|
+
portal_init_jsparams, max_n_workers=0)
|
|
292
|
+
portal = parameterizable.loadjs(portal_init_jsparams)
|
|
277
293
|
assert isinstance(portal, SwarmingPortal)
|
|
278
294
|
with portal:
|
|
279
295
|
call_signature:PureFnCallSignature|None = None
|
|
Binary file
|
|
Binary file
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import os
|
|
2
|
-
import sys
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
class OutputSuppressor:
|
|
6
|
-
"""A context manager that suppresses stdout and stderr output."""
|
|
7
|
-
def __init__(self):
|
|
8
|
-
pass
|
|
9
|
-
|
|
10
|
-
def __enter__(self):
|
|
11
|
-
"""Redirect stdout and stderr to os.devnull."""
|
|
12
|
-
self.old_stdout = sys.stdout
|
|
13
|
-
self.old_stderr = sys.stderr
|
|
14
|
-
self.devnull = open(os.devnull, 'w')
|
|
15
|
-
sys.stdout = self.devnull
|
|
16
|
-
sys.stderr = self.devnull
|
|
17
|
-
return self
|
|
18
|
-
|
|
19
|
-
def __exit__(self, exc_type, exc_val, exc_tb):
|
|
20
|
-
sys.stdout = self.old_stdout
|
|
21
|
-
sys.stderr = self.old_stderr
|
|
22
|
-
if self.devnull:
|
|
23
|
-
self.devnull.close()
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pythagoras-0.23.19 → pythagoras-0.24.1}/src/pythagoras/_010_basic_portals/not_picklable_class.py
RENAMED
|
File without changes
|
|
File without changes
|
{pythagoras-0.23.19 → pythagoras-0.24.1}/src/pythagoras/_010_basic_portals/post_init_metaclass.py
RENAMED
|
File without changes
|
{pythagoras-0.23.19 → pythagoras-0.24.1}/src/pythagoras/_020_ordinary_code_portals/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pythagoras-0.23.19 → pythagoras-0.24.1}/src/pythagoras/_030_data_portals/storable_decorator.py
RENAMED
|
File without changes
|
{pythagoras-0.23.19 → pythagoras-0.24.1}/src/pythagoras/_040_logging_code_portals/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pythagoras-0.23.19 → pythagoras-0.24.1}/src/pythagoras/_040_logging_code_portals/kw_args.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pythagoras-0.23.19 → pythagoras-0.24.1}/src/pythagoras/_040_logging_code_portals/output_capturer.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pythagoras-0.23.19 → pythagoras-0.24.1}/src/pythagoras/_050_safe_code_portals/safe_decorator.py
RENAMED
|
File without changes
|
{pythagoras-0.23.19 → pythagoras-0.24.1}/src/pythagoras/_060_autonomous_code_portals/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pythagoras-0.23.19 → pythagoras-0.24.1}/src/pythagoras/_070_protected_code_portals/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pythagoras-0.23.19 → pythagoras-0.24.1}/src/pythagoras/_070_protected_code_portals/system_utils.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pythagoras-0.23.19 → pythagoras-0.24.1}/src/pythagoras/_080_pure_code_portals/pure_decorator.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pythagoras-0.23.19 → pythagoras-0.24.1}/src/pythagoras/_100_top_level_API/default_local_portal.py
RENAMED
|
File without changes
|
|
File without changes
|
{pythagoras-0.23.19 → pythagoras-0.24.1}/src/pythagoras/_800_signatures_and_converters/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pythagoras-0.23.19 → pythagoras-0.24.1}/src/pythagoras/_900_project_stats_collector/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|