simstack 0.2.0__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.
- simstack/__init__.py +0 -0
- simstack/_version.py +34 -0
- simstack/core/__init__.py +0 -0
- simstack/core/artifacts.py +447 -0
- simstack/core/asnyc_helper.py +14 -0
- simstack/core/config_file.py +60 -0
- simstack/core/context.py +167 -0
- simstack/core/data.py +139 -0
- simstack/core/definitions.py +21 -0
- simstack/core/engine.py +116 -0
- simstack/core/find_simstack_modules.py +43 -0
- simstack/core/hash.py +177 -0
- simstack/core/model_table.py +199 -0
- simstack/core/node.py +911 -0
- simstack/core/node_runner.py +254 -0
- simstack/core/node_table.py +380 -0
- simstack/core/recompute_artifacts.py +120 -0
- simstack/core/reset_db.py +12 -0
- simstack/core/resources.py +101 -0
- simstack/core/run_node.py +69 -0
- simstack/core/runner.py +435 -0
- simstack/core/simstack_result.py +41 -0
- simstack/core/submit_node.py +143 -0
- simstack/core/task_id.py +22 -0
- simstack/data/__init__.py +0 -0
- simstack/methods/__init__.py +0 -0
- simstack/methods/get_file.py +10 -0
- simstack/methods/multiple_executor.py +307 -0
- simstack/models/__init__.py +37 -0
- simstack/models/array_list.py +48 -0
- simstack/models/array_storage.py +54 -0
- simstack/models/artifact_models.py +127 -0
- simstack/models/base_types.py +208 -0
- simstack/models/charts_artifact.py +411 -0
- simstack/models/dataset.py +432 -0
- simstack/models/dataset_metadata.py +303 -0
- simstack/models/file_instance.py +77 -0
- simstack/models/file_list.py +321 -0
- simstack/models/files.py +229 -0
- simstack/models/log_entry_model.py +37 -0
- simstack/models/models.py +40 -0
- simstack/models/node_registry.py +105 -0
- simstack/models/pandas_model.py +210 -0
- simstack/models/parameters.py +388 -0
- simstack/models/pickle_models.py +311 -0
- simstack/models/runner_model.py +39 -0
- simstack/models/simple_table.py +32 -0
- simstack/models/simstack_model.py +97 -0
- simstack/models/slurm_info.py +17 -0
- simstack/models/table_artifact.py +87 -0
- simstack/util/__init__.py +0 -0
- simstack/util/async_zip_utils.py +18 -0
- simstack/util/cleaned_json_schema.py +20 -0
- simstack/util/config_reader.py +273 -0
- simstack/util/custom_model_dump.py +75 -0
- simstack/util/db.py +457 -0
- simstack/util/db_logger.py +117 -0
- simstack/util/default_from_dict.py +57 -0
- simstack/util/directory_iterator.py +216 -0
- simstack/util/file_hashing.py +68 -0
- simstack/util/files.py +396 -0
- simstack/util/find_python_files.py +33 -0
- simstack/util/generate_ui_schema.py +80 -0
- simstack/util/geometry_utils.py +118 -0
- simstack/util/get_module_path.py +26 -0
- simstack/util/git_pull.py +65 -0
- simstack/util/git_repository_status.py +93 -0
- simstack/util/import_module.py +65 -0
- simstack/util/importer.py +163 -0
- simstack/util/make_graph.py +107 -0
- simstack/util/make_table.py +827 -0
- simstack/util/minimal_route_finder.py +72 -0
- simstack/util/mock_db.py +144 -0
- simstack/util/module_path_checker.py +38 -0
- simstack/util/path_manager.py +234 -0
- simstack/util/project_root_finder.py +36 -0
- simstack/util/queue_watcher.py +262 -0
- simstack/util/route_finder.py +74 -0
- simstack/util/runner_util.py +162 -0
- simstack/util/safe_code_executor.py +194 -0
- simstack/util/sample_config.py +98 -0
- simstack/util/sensitive_content_filter.py +48 -0
- simstack/util/setup_logging.py +49 -0
- simstack/util/submit_to_watchdog.py +106 -0
- simstack/util/ui_tools.py +213 -0
- simstack-0.2.0.dist-info/METADATA +361 -0
- simstack-0.2.0.dist-info/RECORD +91 -0
- simstack-0.2.0.dist-info/WHEEL +5 -0
- simstack-0.2.0.dist-info/entry_points.txt +10 -0
- simstack-0.2.0.dist-info/licenses/LICENSE +21 -0
- simstack-0.2.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
def model_to_graph_data(model, exclude_none=True, exclude_unset=True, exclude=None):
|
|
2
|
+
"""
|
|
3
|
+
Checks if an odmantic Model contains fields that can be interpreted as graph data
|
|
4
|
+
(multiple lists of the same length) and converts it to a format suitable for ag-graph.
|
|
5
|
+
|
|
6
|
+
Args:
|
|
7
|
+
model: An odmantic Model instance
|
|
8
|
+
exclude_none (bool): Whether to exclude None values
|
|
9
|
+
exclude_unset (bool): Whether to exclude unset values
|
|
10
|
+
exclude (set): Fields to exclude
|
|
11
|
+
|
|
12
|
+
Returns:
|
|
13
|
+
dict: A dictionary with graph data if the model contains compatible fields, otherwise None
|
|
14
|
+
"""
|
|
15
|
+
if exclude is None:
|
|
16
|
+
exclude = set()
|
|
17
|
+
|
|
18
|
+
# Collect all list fields from the model
|
|
19
|
+
list_fields = {}
|
|
20
|
+
|
|
21
|
+
# Get all fields from the model
|
|
22
|
+
if hasattr(model, "__fields__"):
|
|
23
|
+
fields = model.__fields__
|
|
24
|
+
else:
|
|
25
|
+
# Fallback if field access pattern is different
|
|
26
|
+
fields = {
|
|
27
|
+
k: None
|
|
28
|
+
for k in dir(model)
|
|
29
|
+
if not k.startswith("_") and not callable(getattr(model, k))
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
# Process each field to find lists with numeric or string values
|
|
33
|
+
for field_name in fields:
|
|
34
|
+
if field_name in exclude:
|
|
35
|
+
continue
|
|
36
|
+
|
|
37
|
+
value = getattr(model, field_name, None)
|
|
38
|
+
|
|
39
|
+
# Skip None values if exclude_none is True
|
|
40
|
+
if value is None and exclude_none:
|
|
41
|
+
continue
|
|
42
|
+
|
|
43
|
+
# Handle unset values if exclude_unset is True
|
|
44
|
+
if exclude_unset and value == getattr(
|
|
45
|
+
fields.get(field_name), "default", object()
|
|
46
|
+
):
|
|
47
|
+
continue
|
|
48
|
+
|
|
49
|
+
# Check if the field is a list with numeric or string values
|
|
50
|
+
if isinstance(value, list) and len(value) > 0:
|
|
51
|
+
# Check if all elements are numeric or strings
|
|
52
|
+
if all(isinstance(item, (int, float, str)) for item in value):
|
|
53
|
+
list_fields[field_name] = value
|
|
54
|
+
|
|
55
|
+
# If we don't have at least two lists, we can't make a graph
|
|
56
|
+
if len(list_fields) < 2:
|
|
57
|
+
return None
|
|
58
|
+
|
|
59
|
+
# Check if all lists have the same length
|
|
60
|
+
list_lengths = {len(lst) for lst in list_fields.values()}
|
|
61
|
+
if len(list_lengths) != 1:
|
|
62
|
+
return None # Not all lists have the same length
|
|
63
|
+
|
|
64
|
+
list_length = next(iter(list_lengths))
|
|
65
|
+
if list_length == 0:
|
|
66
|
+
return None # Empty lists
|
|
67
|
+
|
|
68
|
+
# Generate data series for each potential y-axis
|
|
69
|
+
series = []
|
|
70
|
+
|
|
71
|
+
# Use first string list as labels if available, otherwise use index
|
|
72
|
+
x_axis_field = None
|
|
73
|
+
for field_name, values in list_fields.items():
|
|
74
|
+
if all(isinstance(item, str) for item in values):
|
|
75
|
+
x_axis_field = field_name
|
|
76
|
+
break
|
|
77
|
+
|
|
78
|
+
# If no string list found, use the first field as x-axis
|
|
79
|
+
if x_axis_field is None:
|
|
80
|
+
x_axis_field = next(iter(list_fields.keys()))
|
|
81
|
+
|
|
82
|
+
x_values = list_fields[x_axis_field]
|
|
83
|
+
|
|
84
|
+
# Create series for each numeric list (except the x-axis)
|
|
85
|
+
for field_name, values in list_fields.items():
|
|
86
|
+
if field_name != x_axis_field:
|
|
87
|
+
# Create a series for this y-axis
|
|
88
|
+
series_data = []
|
|
89
|
+
for i in range(list_length):
|
|
90
|
+
series_data.append({"x": x_values[i], "y": values[i]})
|
|
91
|
+
|
|
92
|
+
series.append({"name": field_name, "data": series_data})
|
|
93
|
+
|
|
94
|
+
# Create the graph data structure
|
|
95
|
+
graph_data = {
|
|
96
|
+
"chart": {
|
|
97
|
+
"type": "line" # Default chart type, can be changed
|
|
98
|
+
},
|
|
99
|
+
"title": {
|
|
100
|
+
"text": model.__class__.__name__ # Use model class name as title
|
|
101
|
+
},
|
|
102
|
+
"xAxis": {"title": {"text": x_axis_field}},
|
|
103
|
+
"yAxis": {"title": {"text": "Value"}},
|
|
104
|
+
"series": series,
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
return graph_data
|