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.
Files changed (91) hide show
  1. simstack/__init__.py +0 -0
  2. simstack/_version.py +34 -0
  3. simstack/core/__init__.py +0 -0
  4. simstack/core/artifacts.py +447 -0
  5. simstack/core/asnyc_helper.py +14 -0
  6. simstack/core/config_file.py +60 -0
  7. simstack/core/context.py +167 -0
  8. simstack/core/data.py +139 -0
  9. simstack/core/definitions.py +21 -0
  10. simstack/core/engine.py +116 -0
  11. simstack/core/find_simstack_modules.py +43 -0
  12. simstack/core/hash.py +177 -0
  13. simstack/core/model_table.py +199 -0
  14. simstack/core/node.py +911 -0
  15. simstack/core/node_runner.py +254 -0
  16. simstack/core/node_table.py +380 -0
  17. simstack/core/recompute_artifacts.py +120 -0
  18. simstack/core/reset_db.py +12 -0
  19. simstack/core/resources.py +101 -0
  20. simstack/core/run_node.py +69 -0
  21. simstack/core/runner.py +435 -0
  22. simstack/core/simstack_result.py +41 -0
  23. simstack/core/submit_node.py +143 -0
  24. simstack/core/task_id.py +22 -0
  25. simstack/data/__init__.py +0 -0
  26. simstack/methods/__init__.py +0 -0
  27. simstack/methods/get_file.py +10 -0
  28. simstack/methods/multiple_executor.py +307 -0
  29. simstack/models/__init__.py +37 -0
  30. simstack/models/array_list.py +48 -0
  31. simstack/models/array_storage.py +54 -0
  32. simstack/models/artifact_models.py +127 -0
  33. simstack/models/base_types.py +208 -0
  34. simstack/models/charts_artifact.py +411 -0
  35. simstack/models/dataset.py +432 -0
  36. simstack/models/dataset_metadata.py +303 -0
  37. simstack/models/file_instance.py +77 -0
  38. simstack/models/file_list.py +321 -0
  39. simstack/models/files.py +229 -0
  40. simstack/models/log_entry_model.py +37 -0
  41. simstack/models/models.py +40 -0
  42. simstack/models/node_registry.py +105 -0
  43. simstack/models/pandas_model.py +210 -0
  44. simstack/models/parameters.py +388 -0
  45. simstack/models/pickle_models.py +311 -0
  46. simstack/models/runner_model.py +39 -0
  47. simstack/models/simple_table.py +32 -0
  48. simstack/models/simstack_model.py +97 -0
  49. simstack/models/slurm_info.py +17 -0
  50. simstack/models/table_artifact.py +87 -0
  51. simstack/util/__init__.py +0 -0
  52. simstack/util/async_zip_utils.py +18 -0
  53. simstack/util/cleaned_json_schema.py +20 -0
  54. simstack/util/config_reader.py +273 -0
  55. simstack/util/custom_model_dump.py +75 -0
  56. simstack/util/db.py +457 -0
  57. simstack/util/db_logger.py +117 -0
  58. simstack/util/default_from_dict.py +57 -0
  59. simstack/util/directory_iterator.py +216 -0
  60. simstack/util/file_hashing.py +68 -0
  61. simstack/util/files.py +396 -0
  62. simstack/util/find_python_files.py +33 -0
  63. simstack/util/generate_ui_schema.py +80 -0
  64. simstack/util/geometry_utils.py +118 -0
  65. simstack/util/get_module_path.py +26 -0
  66. simstack/util/git_pull.py +65 -0
  67. simstack/util/git_repository_status.py +93 -0
  68. simstack/util/import_module.py +65 -0
  69. simstack/util/importer.py +163 -0
  70. simstack/util/make_graph.py +107 -0
  71. simstack/util/make_table.py +827 -0
  72. simstack/util/minimal_route_finder.py +72 -0
  73. simstack/util/mock_db.py +144 -0
  74. simstack/util/module_path_checker.py +38 -0
  75. simstack/util/path_manager.py +234 -0
  76. simstack/util/project_root_finder.py +36 -0
  77. simstack/util/queue_watcher.py +262 -0
  78. simstack/util/route_finder.py +74 -0
  79. simstack/util/runner_util.py +162 -0
  80. simstack/util/safe_code_executor.py +194 -0
  81. simstack/util/sample_config.py +98 -0
  82. simstack/util/sensitive_content_filter.py +48 -0
  83. simstack/util/setup_logging.py +49 -0
  84. simstack/util/submit_to_watchdog.py +106 -0
  85. simstack/util/ui_tools.py +213 -0
  86. simstack-0.2.0.dist-info/METADATA +361 -0
  87. simstack-0.2.0.dist-info/RECORD +91 -0
  88. simstack-0.2.0.dist-info/WHEEL +5 -0
  89. simstack-0.2.0.dist-info/entry_points.txt +10 -0
  90. simstack-0.2.0.dist-info/licenses/LICENSE +21 -0
  91. 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