diffract-core 0.2.1__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 (193) hide show
  1. diffract/__init__.py +52 -0
  2. diffract/configs/fast_speed_without_disk.ini +48 -0
  3. diffract/configs/hybrid.ini +74 -0
  4. diffract/configs/sqlite.ini +62 -0
  5. diffract/containers.py +405 -0
  6. diffract/core/__init__.py +23 -0
  7. diffract/core/cache/__init__.py +24 -0
  8. diffract/core/cache/containers.py +93 -0
  9. diffract/core/cache/interface.py +117 -0
  10. diffract/core/cache/redis_manager.py +464 -0
  11. diffract/core/cache/simple_manager.py +478 -0
  12. diffract/core/compute/__init__.py +46 -0
  13. diffract/core/compute/config.py +48 -0
  14. diffract/core/compute/containers.py +81 -0
  15. diffract/core/compute/decorator.py +125 -0
  16. diffract/core/compute/exceptions.py +31 -0
  17. diffract/core/compute/execution/__init__.py +14 -0
  18. diffract/core/compute/execution/_types.py +70 -0
  19. diffract/core/compute/execution/aggregation.py +74 -0
  20. diffract/core/compute/execution/aggregation_runner.py +362 -0
  21. diffract/core/compute/execution/enums.py +38 -0
  22. diffract/core/compute/execution/executor.py +125 -0
  23. diffract/core/compute/execution/parameter_runner.py +125 -0
  24. diffract/core/compute/execution/restrictions.py +61 -0
  25. diffract/core/compute/execution/strategy.py +118 -0
  26. diffract/core/compute/execution/utils.py +112 -0
  27. diffract/core/compute/extensions/__init__.py +0 -0
  28. diffract/core/compute/extensions/power_law.py +1051 -0
  29. diffract/core/compute/extensions/rmt.py +150 -0
  30. diffract/core/compute/extensions/utils.py +36 -0
  31. diffract/core/compute/field_signature.py +183 -0
  32. diffract/core/compute/kernels/__init__.py +48 -0
  33. diffract/core/compute/kernels/alignment.py +106 -0
  34. diffract/core/compute/kernels/heavy_tailed.py +394 -0
  35. diffract/core/compute/kernels/marchenko_pastur.py +99 -0
  36. diffract/core/compute/kernels/mat_decomposition.py +101 -0
  37. diffract/core/compute/kernels/mat_properties.py +53 -0
  38. diffract/core/compute/kernels/model_quality.py +27 -0
  39. diffract/core/compute/kernels/norms.py +88 -0
  40. diffract/core/compute/kernels/ranks.py +35 -0
  41. diffract/core/compute/kernels/tracy_widom.py +36 -0
  42. diffract/core/compute/metadata.py +67 -0
  43. diffract/core/compute/registry.py +485 -0
  44. diffract/core/constants.py +147 -0
  45. diffract/core/data/__init__.py +32 -0
  46. diffract/core/data/interface.py +304 -0
  47. diffract/core/data/metadata/__init__.py +15 -0
  48. diffract/core/data/metadata/containers.py +60 -0
  49. diffract/core/data/metadata/interface.py +208 -0
  50. diffract/core/data/metadata/sqlite_index.py +604 -0
  51. diffract/core/data/nn/__init__.py +43 -0
  52. diffract/core/data/nn/aggregates/__init__.py +35 -0
  53. diffract/core/data/nn/aggregates/metadata.py +96 -0
  54. diffract/core/data/nn/aggregates/proxy.py +57 -0
  55. diffract/core/data/nn/aggregates/repository.py +87 -0
  56. diffract/core/data/nn/aggregates/view.py +307 -0
  57. diffract/core/data/nn/containers.py +86 -0
  58. diffract/core/data/nn/extractors/__init__.py +49 -0
  59. diffract/core/data/nn/extractors/base.py +300 -0
  60. diffract/core/data/nn/extractors/factory.py +234 -0
  61. diffract/core/data/nn/extractors/flax.py +112 -0
  62. diffract/core/data/nn/extractors/handlers/__init__.py +39 -0
  63. diffract/core/data/nn/extractors/handlers/base.py +110 -0
  64. diffract/core/data/nn/extractors/handlers/flax_handlers.py +71 -0
  65. diffract/core/data/nn/extractors/handlers/numpy_handlers.py +63 -0
  66. diffract/core/data/nn/extractors/handlers/onnx_handlers.py +67 -0
  67. diffract/core/data/nn/extractors/handlers/tensorflow_handlers.py +82 -0
  68. diffract/core/data/nn/extractors/handlers/torch_handlers.py +124 -0
  69. diffract/core/data/nn/extractors/interface.py +56 -0
  70. diffract/core/data/nn/extractors/numpy.py +94 -0
  71. diffract/core/data/nn/extractors/onnx.py +108 -0
  72. diffract/core/data/nn/extractors/tensorflow.py +99 -0
  73. diffract/core/data/nn/extractors/torch.py +204 -0
  74. diffract/core/data/nn/params/__init__.py +27 -0
  75. diffract/core/data/nn/params/interface.py +402 -0
  76. diffract/core/data/nn/params/metadata.py +110 -0
  77. diffract/core/data/nn/params/proxy.py +93 -0
  78. diffract/core/data/nn/params/repository.py +45 -0
  79. diffract/core/data/nn/params/schema.py +82 -0
  80. diffract/core/data/nn/params/view.py +393 -0
  81. diffract/core/data/proxy.py +246 -0
  82. diffract/core/data/repository.py +227 -0
  83. diffract/core/data/utils.py +33 -0
  84. diffract/core/data/view.py +389 -0
  85. diffract/core/export/__init__.py +27 -0
  86. diffract/core/export/containers.py +47 -0
  87. diffract/core/export/exporters.py +191 -0
  88. diffract/core/export/formatters/__init__.py +23 -0
  89. diffract/core/export/formatters/base.py +68 -0
  90. diffract/core/export/formatters/dict_formatter.py +38 -0
  91. diffract/core/export/formatters/json_formatter.py +58 -0
  92. diffract/core/export/formatters/list_formatter.py +41 -0
  93. diffract/core/export/formatters/pandas_formatter.py +86 -0
  94. diffract/core/export/formatters/polars_formatter.py +86 -0
  95. diffract/core/export/formatters/registry.py +84 -0
  96. diffract/core/export/interface.py +105 -0
  97. diffract/core/parallel/__init__.py +21 -0
  98. diffract/core/parallel/containers.py +57 -0
  99. diffract/core/parallel/execution.py +91 -0
  100. diffract/core/parallel/runtime.py +91 -0
  101. diffract/core/storage/__init__.py +35 -0
  102. diffract/core/storage/base_manager.py +330 -0
  103. diffract/core/storage/containers.py +122 -0
  104. diffract/core/storage/hdf5_manager.py +856 -0
  105. diffract/core/storage/hybrid_manager.py +218 -0
  106. diffract/core/storage/interface.py +222 -0
  107. diffract/core/storage/metadata.py +89 -0
  108. diffract/core/storage/ram_manager.py +159 -0
  109. diffract/core/storage/sqlite_manager.py +1062 -0
  110. diffract/core/storage/zarr_manager.py +992 -0
  111. diffract/core/utils/__init__.py +45 -0
  112. diffract/core/utils/build.py +46 -0
  113. diffract/core/utils/exceptions.py +11 -0
  114. diffract/core/utils/hashing.py +90 -0
  115. diffract/core/utils/imports.py +292 -0
  116. diffract/core/utils/math.py +15 -0
  117. diffract/py.typed +0 -0
  118. diffract/session/__init__.py +24 -0
  119. diffract/session/errors.py +17 -0
  120. diffract/session/field_cache.py +216 -0
  121. diffract/session/namespaces/__init__.py +15 -0
  122. diffract/session/namespaces/compute/__init__.py +219 -0
  123. diffract/session/namespaces/models/__init__.py +282 -0
  124. diffract/session/namespaces/models/parameters/__init__.py +133 -0
  125. diffract/session/namespaces/models/parameters/meta_patcher.py +167 -0
  126. diffract/session/namespaces/results/__init__.py +378 -0
  127. diffract/session/namespaces/results/eraser.py +129 -0
  128. diffract/session/namespaces/results/injester.py +249 -0
  129. diffract/session/namespaces/utils/__init__.py +141 -0
  130. diffract/session/namespaces/utils/merger.py +295 -0
  131. diffract/session/namespaces/viz/__init__.py +91 -0
  132. diffract/session/namespaces/viz/_utils.py +14 -0
  133. diffract/session/namespaces/viz/box.py +207 -0
  134. diffract/session/namespaces/viz/grid.py +160 -0
  135. diffract/session/namespaces/viz/heatmap.py +164 -0
  136. diffract/session/namespaces/viz/scatter.py +202 -0
  137. diffract/session/namespaces/viz/sparkline.py +270 -0
  138. diffract/session/namespaces/viz/violin.py +212 -0
  139. diffract/session/session.py +260 -0
  140. diffract/session/utils.py +81 -0
  141. diffract/viz/__init__.py +42 -0
  142. diffract/viz/data/__init__.py +34 -0
  143. diffract/viz/data/detection.py +57 -0
  144. diffract/viz/data/extraction.py +117 -0
  145. diffract/viz/data/filtering.py +57 -0
  146. diffract/viz/data/ordering.py +129 -0
  147. diffract/viz/data/provider.py +99 -0
  148. diffract/viz/data/types.py +98 -0
  149. diffract/viz/plots/__init__.py +37 -0
  150. diffract/viz/plots/base/__init__.py +20 -0
  151. diffract/viz/plots/base/axis.py +219 -0
  152. diffract/viz/plots/base/coloraxis.py +133 -0
  153. diffract/viz/plots/base/configurator.py +18 -0
  154. diffract/viz/plots/base/jitter.py +368 -0
  155. diffract/viz/plots/base/line.py +197 -0
  156. diffract/viz/plots/base/marker.py +278 -0
  157. diffract/viz/plots/base/overlay.py +14 -0
  158. diffract/viz/plots/base/plot.py +110 -0
  159. diffract/viz/plots/base/update.py +50 -0
  160. diffract/viz/plots/boxplot.py +283 -0
  161. diffract/viz/plots/cluster.py +374 -0
  162. diffract/viz/plots/heatmap.py +168 -0
  163. diffract/viz/plots/scatter.py +233 -0
  164. diffract/viz/plots/sparkline.py +405 -0
  165. diffract/viz/plots/subplots/__init__.py +32 -0
  166. diffract/viz/plots/subplots/coloraxis.py +339 -0
  167. diffract/viz/plots/subplots/factory.py +713 -0
  168. diffract/viz/plots/subplots/grid.py +214 -0
  169. diffract/viz/plots/subplots/layout.py +370 -0
  170. diffract/viz/plots/subplots/spec.py +39 -0
  171. diffract/viz/plots/violin.py +298 -0
  172. diffract/viz/renderer.py +513 -0
  173. diffract/viz/styling/__init__.py +78 -0
  174. diffract/viz/styling/palettes/__init__.py +20 -0
  175. diffract/viz/styling/palettes/bundle.py +16 -0
  176. diffract/viz/styling/palettes/color.py +83 -0
  177. diffract/viz/styling/palettes/dashes.py +27 -0
  178. diffract/viz/styling/palettes/symbols.py +42 -0
  179. diffract/viz/styling/resolvers/__init__.py +11 -0
  180. diffract/viz/styling/resolvers/categorical.py +68 -0
  181. diffract/viz/styling/resolvers/color.py +77 -0
  182. diffract/viz/styling/resolvers/numeric.py +108 -0
  183. diffract/viz/styling/sources.py +27 -0
  184. diffract/viz/styling/theme/__init__.py +29 -0
  185. diffract/viz/styling/theme/applier.py +114 -0
  186. diffract/viz/styling/theme/components.py +66 -0
  187. diffract/viz/styling/theme/presets.py +58 -0
  188. diffract/viz/styling/theme/theme.py +36 -0
  189. diffract_core-0.2.1.dist-info/METADATA +530 -0
  190. diffract_core-0.2.1.dist-info/RECORD +193 -0
  191. diffract_core-0.2.1.dist-info/WHEEL +4 -0
  192. diffract_core-0.2.1.dist-info/licenses/LICENSE +201 -0
  193. diffract_core-0.2.1.dist-info/licenses/NOTICE +2 -0
@@ -0,0 +1,108 @@
1
+ """ONNX parameter extractors.
2
+
3
+ Provides a parameter extractor for ONNX `ModelProto` objects.
4
+ Currently supports only dense (fully-connected) weights, extracted from `Gemm`
5
+ nodes when their weight input is present in graph initializers.
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ import logging
11
+ from typing import TYPE_CHECKING, Any, Self
12
+
13
+ import diffract.core.utils.imports as import_utils
14
+
15
+ from .base import BaseParameterExtractor
16
+
17
+ if TYPE_CHECKING:
18
+ from collections.abc import Generator
19
+
20
+ from .base import ExtractorOverrides
21
+ from .handlers.base import ParameterHandler
22
+
23
+ logger = logging.getLogger(__name__)
24
+
25
+
26
+ if not import_utils.is_available("onnx"):
27
+ logger.debug("ONNX not available, disabling ONNX extractors")
28
+
29
+ class OnnxModelExtractor(BaseParameterExtractor):
30
+ """Stub implementation when ONNX is not available."""
31
+
32
+ def __new__(cls, *_args: Any, **_kwargs: Any) -> Self: # noqa: D102
33
+ msg = "onnx package not available"
34
+ raise ImportError(msg)
35
+
36
+ else:
37
+ import numpy as np
38
+
39
+ onnx = import_utils.require("onnx")
40
+ numpy_helper = import_utils.require("onnx.numpy_helper")
41
+
42
+ from .handlers import OnnxDenseHandler
43
+
44
+ def _onnx_node_display_name(node: Any) -> str:
45
+ if getattr(node, "name", ""):
46
+ return node.name
47
+ outputs = list(getattr(node, "output", []) or [])
48
+ if outputs:
49
+ return outputs[0]
50
+ return "gemm"
51
+
52
+ class OnnxModelExtractor(BaseParameterExtractor):
53
+ """ONNX ModelProto parameter extractor (DENSE only)."""
54
+
55
+ def __init__(
56
+ self,
57
+ model: Any,
58
+ overrides: ExtractorOverrides | None = None,
59
+ skip_not_implemented_types: bool = True,
60
+ custom_handlers: list[ParameterHandler] | None = None,
61
+ ) -> None:
62
+ super().__init__(
63
+ model, overrides, skip_not_implemented_types, custom_handlers
64
+ )
65
+
66
+ def _register_default_handlers(self) -> None:
67
+ self.handler_registry.register_handler_class(OnnxDenseHandler)
68
+ logger.debug(
69
+ "Registered %d default handlers for ONNX models (DENSE only)",
70
+ len(self.handler_registry.list_handlers()),
71
+ )
72
+
73
+ def _iter_parameters(self) -> Generator[tuple[str, Any], None, None]:
74
+ """Yield dense weight arrays from Gemm nodes.
75
+
76
+ For `Gemm` node: inputs are typically [A, B, C]. We treat B as the
77
+ weight matrix, and ignore bias (C).
78
+ """
79
+ model = self.model
80
+ if not isinstance(model, onnx.ModelProto):
81
+ msg = f"OnnxModelExtractor expects onnx.ModelProto, got {type(model)}"
82
+ raise TypeError(msg)
83
+
84
+ graph = model.graph
85
+ initializer_by_name: dict[str, Any] = {
86
+ init.name: init for init in graph.initializer
87
+ }
88
+
89
+ min_gemm_inputs = 2
90
+ for node in graph.node:
91
+ if getattr(node, "op_type", None) != "Gemm":
92
+ continue
93
+
94
+ inputs = list(getattr(node, "input", []) or [])
95
+ if len(inputs) < min_gemm_inputs:
96
+ continue
97
+
98
+ weight_name = inputs[1]
99
+ init = initializer_by_name.get(weight_name)
100
+ if init is None:
101
+ continue
102
+
103
+ weight_arr = numpy_helper.to_array(init)
104
+ # Ensure NumPy array for downstream handlers.
105
+ weight_arr = np.asarray(weight_arr)
106
+
107
+ node_name = _onnx_node_display_name(node)
108
+ yield f"{node_name}.weight", weight_arr
@@ -0,0 +1,99 @@
1
+ """TensorFlow/Keras parameter extractors.
2
+
3
+ Provides a parameter extractor for TensorFlow Keras models.
4
+ Currently supports only dense (fully-connected) layer kernels.
5
+ """
6
+
7
+ from __future__ import annotations
8
+
9
+ import logging
10
+ from typing import TYPE_CHECKING, Any, Self
11
+
12
+ import diffract.core.utils.imports as import_utils
13
+
14
+ from .base import BaseParameterExtractor
15
+
16
+ if TYPE_CHECKING:
17
+ from collections.abc import Generator
18
+
19
+ from .base import ExtractorOverrides
20
+ from .handlers.base import ParameterHandler
21
+
22
+ logger = logging.getLogger(__name__)
23
+
24
+
25
+ if not import_utils.is_available("tensorflow"):
26
+ logger.debug("TensorFlow not available, disabling TensorFlow extractors")
27
+
28
+ class TensorFlowModelExtractor(BaseParameterExtractor):
29
+ """Stub implementation when TensorFlow is not available."""
30
+
31
+ def __new__(cls, *_args: Any, **_kwargs: Any) -> Self: # noqa: D102
32
+ msg = "TensorFlow package not available"
33
+ raise ImportError(msg)
34
+
35
+ else:
36
+ tf = import_utils.require("tensorflow")
37
+
38
+ from .handlers import TensorFlowDenseHandler
39
+
40
+ def _walk_layers(obj: Any) -> Generator[Any, None, None]:
41
+ """Yield layers contained in a Keras model/layer.
42
+
43
+ Uses public attributes (`layers`) when available and falls back to yielding
44
+ the object itself. This avoids relying on private APIs that may change
45
+ across TensorFlow/Keras versions.
46
+ """
47
+ if isinstance(obj, tf.keras.Model):
48
+ for layer in obj.layers:
49
+ yield from _walk_layers(layer)
50
+ return
51
+
52
+ if isinstance(obj, tf.keras.layers.Layer):
53
+ yield obj
54
+ # Some composite layers expose nested layers via `.layers`.
55
+ nested = getattr(obj, "layers", None)
56
+ if isinstance(nested, list):
57
+ for layer in nested:
58
+ yield from _walk_layers(layer)
59
+ return
60
+
61
+ class TensorFlowModelExtractor(BaseParameterExtractor):
62
+ """TensorFlow Keras model parameter extractor (DENSE only)."""
63
+
64
+ def __init__(
65
+ self,
66
+ model: Any,
67
+ overrides: ExtractorOverrides | None = None,
68
+ skip_not_implemented_types: bool = True,
69
+ custom_handlers: list[ParameterHandler] | None = None,
70
+ ) -> None:
71
+ super().__init__(
72
+ model, overrides, skip_not_implemented_types, custom_handlers
73
+ )
74
+
75
+ def _register_default_handlers(self) -> None:
76
+ # Register only the DENSE handler.
77
+ self.handler_registry.register_handler_class(TensorFlowDenseHandler)
78
+ logger.debug(
79
+ "Registered %d default handlers for TensorFlow models (DENSE only)",
80
+ len(self.handler_registry.list_handlers()),
81
+ )
82
+
83
+ def _iter_parameters(self) -> Generator[tuple[str, Any], None, None]:
84
+ """Yield Dense layers as parameters.
85
+
86
+ We intentionally yield only Dense layers and name parameters as
87
+ `<layer.name>.kernel` to match weight-level naming convention.
88
+ """
89
+ model = self.model
90
+ if not isinstance(model, (tf.keras.Model, tf.keras.layers.Layer)):
91
+ msg = (
92
+ "TensorFlowModelExtractor expects a tf.keras.Model or "
93
+ f"tf.keras.layers.Layer, got {type(model)}"
94
+ )
95
+ raise TypeError(msg)
96
+
97
+ for layer in _walk_layers(model):
98
+ if isinstance(layer, tf.keras.layers.Dense):
99
+ yield f"{layer.name}.kernel", layer
@@ -0,0 +1,204 @@
1
+ """PyTorch-specific parameter extractors.
2
+
3
+ This module provides parameter extractors specifically designed for PyTorch
4
+ models and state dictionaries. It implements the BaseParameterExtractor
5
+ interface with PyTorch-specific parameter iteration and handler registration.
6
+
7
+ Supported PyTorch Objects:
8
+ - torch.nn.Module: Complete PyTorch models with named modules
9
+ - dict[str, torch.Tensor]: PyTorch state dictionaries
10
+
11
+ The extractors use handler-based processing to support different parameter
12
+ types while maintaining extensibility for custom parameter handling. Currently
13
+ focused on dense (fully-connected) layer parameters with room for expansion.
14
+
15
+ Example:
16
+ >>> import torch
17
+ >>> model = torch.nn.Sequential(
18
+ ... torch.nn.Linear(10, 5), torch.nn.ReLU(), torch.nn.Linear(5, 1)
19
+ ... )
20
+ >>> extractor = TorchModuleExtractor(model)
21
+ >>> parameters = extractor.extract_parameters(storage, cache)
22
+ >>> # For state dict:
23
+ >>> state_dict = model.state_dict()
24
+ >>> extractor = TorchStateDictExtractor(state_dict)
25
+ >>> parameters = extractor.extract_parameters(storage, cache)
26
+ """
27
+
28
+ from __future__ import annotations
29
+
30
+ import logging
31
+ from typing import TYPE_CHECKING, Any, Self
32
+
33
+ import diffract.core.utils.imports as import_utils
34
+
35
+ from .base import BaseParameterExtractor
36
+
37
+ if TYPE_CHECKING:
38
+ from collections.abc import Generator
39
+
40
+ import torch
41
+ from torch import nn
42
+
43
+ from .base import ExtractorOverrides
44
+ from .handlers.base import ParameterHandler
45
+
46
+ logger = logging.getLogger(__name__)
47
+
48
+
49
+ if not import_utils.is_available("torch"):
50
+ logger.debug("PyTorch not available, disabling PyTorch extractors")
51
+
52
+ class TorchModuleExtractor(BaseParameterExtractor):
53
+ """Stub implementation when PyTorch is not available.
54
+
55
+ Raises ImportError when instantiated to indicate PyTorch dependency
56
+ is missing.
57
+ """
58
+
59
+ def __new__(cls, *_args: Any, **_kwargs: Any) -> Self:
60
+ """Raise ImportError since PyTorch is unavailable."""
61
+ msg = "PyTorch package not available"
62
+ raise ImportError(msg)
63
+
64
+ class TorchStateDictExtractor(BaseParameterExtractor):
65
+ """Stub implementation when PyTorch is not available.
66
+
67
+ Raises ImportError when instantiated to indicate PyTorch dependency
68
+ is missing.
69
+ """
70
+
71
+ def __new__(cls, *_args: Any, **_kwargs: Any) -> Self:
72
+ """Raise ImportError since PyTorch is unavailable."""
73
+ msg = "PyTorch package not available"
74
+ raise ImportError(msg)
75
+
76
+ else:
77
+ from .handlers import TorchDenseHandler, TorchStateDictDenseHandler
78
+
79
+ class TorchModuleExtractor(BaseParameterExtractor):
80
+ """PyTorch nn.Module parameter extractor with handler-based processing.
81
+
82
+ Extracts parameters from PyTorch nn.Module objects by iterating through
83
+ named modules and processing them with registered handlers. Currently
84
+ supports dense (fully-connected) layer parameters with extensible
85
+ architecture for additional parameter types.
86
+
87
+ Example:
88
+ >>> import torch.nn as nn
89
+ >>> model = nn.Sequential(nn.Linear(128, 64), nn.Linear(64, 10))
90
+ >>> extractor = TorchModuleExtractor(model)
91
+ >>> params = extractor.extract_parameters(storage, cache)
92
+
93
+ Attributes:
94
+ model: PyTorch nn.Module to extract parameters from.
95
+ """
96
+
97
+ def __init__(
98
+ self,
99
+ model: nn.Module,
100
+ overrides: ExtractorOverrides | None = None,
101
+ skip_not_implemented_types: bool = True,
102
+ custom_handlers: list[ParameterHandler] | None = None,
103
+ ) -> None:
104
+ """Initialize PyTorch module extractor.
105
+
106
+ Args:
107
+ model: PyTorch nn.Module to extract parameters from.
108
+ overrides: Optional extraction behavior overrides.
109
+ skip_not_implemented_types: Whether to skip unsupported modules.
110
+ custom_handlers: Optional list of custom parameter handlers.
111
+ """
112
+ super().__init__(
113
+ model, overrides, skip_not_implemented_types, custom_handlers
114
+ )
115
+
116
+ def _register_default_handlers(self) -> None:
117
+ """Register default handlers for PyTorch modules.
118
+
119
+ Registers the TorchDenseHandler for processing dense/linear layers.
120
+ Additional handlers can be registered for other layer types.
121
+ """
122
+ # Register only the DENSE handler that was originally supported
123
+ self.handler_registry.register_handler_class(TorchDenseHandler)
124
+ logger.debug(
125
+ "Registered %d default handlers for PyTorch modules (DENSE only)",
126
+ len(self.handler_registry.list_handlers()),
127
+ )
128
+
129
+ def _iter_parameters(self) -> Generator[tuple[str, nn.Module], None, None]:
130
+ """Iterate over named modules in the PyTorch model.
131
+
132
+ Yields all named modules in the model, allowing handlers to process
133
+ each module type appropriately. This includes leaf modules and
134
+ intermediate containers.
135
+
136
+ Yields:
137
+ Tuples of (module_name, module) for each module in the model.
138
+ """
139
+ yield from self.model.named_modules()
140
+
141
+ class TorchStateDictExtractor(BaseParameterExtractor):
142
+ """PyTorch state_dict parameter extractor with handler-based processing.
143
+
144
+ Extracts parameters from PyTorch state dictionaries by iterating through
145
+ tensor entries and processing them with registered handlers. State dicts
146
+ provide direct access to parameter tensors without module structure.
147
+
148
+ This extractor is useful for processing saved model weights, checkpoint
149
+ files, or when working with parameter tensors directly without the
150
+ full model architecture.
151
+
152
+ Example:
153
+ >>> import torch
154
+ >>> state_dict = torch.load("model.pt")
155
+ >>> extractor = TorchStateDictExtractor(state_dict)
156
+ >>> params = extractor.extract_parameters(storage, cache)
157
+
158
+ Attributes:
159
+ model: Dictionary mapping parameter names to tensors.
160
+ """
161
+
162
+ def __init__(
163
+ self,
164
+ model: dict[str, torch.Tensor],
165
+ overrides: ExtractorOverrides | None = None,
166
+ skip_not_implemented_types: bool = True,
167
+ custom_handlers: list[ParameterHandler] | None = None,
168
+ ) -> None:
169
+ """Initialize PyTorch state dict extractor.
170
+
171
+ Args:
172
+ model: Dictionary mapping parameter names to torch.Tensor.
173
+ overrides: Optional extraction behavior overrides.
174
+ skip_not_implemented_types: Whether to skip unsupported tensors.
175
+ custom_handlers: Optional list of custom parameter handlers.
176
+ """
177
+ super().__init__(
178
+ model, overrides, skip_not_implemented_types, custom_handlers
179
+ )
180
+
181
+ def _register_default_handlers(self) -> None:
182
+ """Register default handlers for PyTorch state dict tensors.
183
+
184
+ Registers the TorchStateDictDenseHandler for processing dense layer
185
+ parameter tensors from state dictionaries.
186
+ """
187
+ # Register only the DENSE handler that was originally supported
188
+ self.handler_registry.register_handler_class(TorchStateDictDenseHandler)
189
+ logger.debug(
190
+ "Registered %d default handlers for PyTorch state_dict (DENSE only)",
191
+ len(self.handler_registry.list_handlers()),
192
+ )
193
+
194
+ def _iter_parameters(self) -> Generator[tuple[str, torch.Tensor], None, None]:
195
+ """Iterate over parameter tensors in the state dictionary.
196
+
197
+ Yields all parameter name-tensor pairs from the state dictionary,
198
+ allowing handlers to process each tensor appropriately.
199
+
200
+ Yields:
201
+ Tuples of (parameter_name, tensor) for each entry in state_dict.
202
+ """
203
+ state_dict: dict[str, torch.Tensor] = self.model
204
+ yield from state_dict.items()
@@ -0,0 +1,27 @@
1
+ """Parameter management module.
2
+
3
+ This package contains the core parameter management components:
4
+ - schema: Domain type definitions and enumerations
5
+ - interface: Protocol definitions for repositories, views, and proxies
6
+ - proxy: Parameter proxy implementation
7
+ - view: Parameter view implementation
8
+ """
9
+
10
+ from .interface import IParameterProxy, IParameterRepository, IParameterView
11
+ from .metadata import ParameterMetadata
12
+ from .proxy import ParameterDataProxy
13
+ from .schema import FieldName, ParameterIndex, ParameterType, ParameterUID
14
+ from .view import ParameterView
15
+
16
+ __all__ = [
17
+ "FieldName",
18
+ "IParameterProxy",
19
+ "IParameterRepository",
20
+ "IParameterView",
21
+ "ParameterDataProxy",
22
+ "ParameterIndex",
23
+ "ParameterMetadata",
24
+ "ParameterType",
25
+ "ParameterUID",
26
+ "ParameterView",
27
+ ]