vector-mtrl 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 (81) hide show
  1. mtrl/__init__.py +144 -0
  2. mtrl/_alignment_report.py +105 -0
  3. mtrl/_archive_documents.py +73 -0
  4. mtrl/_archive_integrity.py +539 -0
  5. mtrl/_archive_loading.py +1070 -0
  6. mtrl/_archive_serialise.py +696 -0
  7. mtrl/_candidate_matching.py +216 -0
  8. mtrl/_cli.py +28 -0
  9. mtrl/_disclosure.py +735 -0
  10. mtrl/_ingestion_shortcuts.py +99 -0
  11. mtrl/_install_targets.py +36 -0
  12. mtrl/_optional.py +38 -0
  13. mtrl/_provenance.py +32 -0
  14. mtrl/_receipts.py +211 -0
  15. mtrl/_record_resolution.py +60 -0
  16. mtrl/_replay_plan.py +557 -0
  17. mtrl/_replay_run.py +734 -0
  18. mtrl/_run_management.py +400 -0
  19. mtrl/_source_capture.py +507 -0
  20. mtrl/_table_plan.py +271 -0
  21. mtrl/_table_provenance.py +387 -0
  22. mtrl/_table_values.py +188 -0
  23. mtrl/_transform_apply.py +223 -0
  24. mtrl/_transform_validation.py +1367 -0
  25. mtrl/archive/__init__.py +54 -0
  26. mtrl/archive/canonical.py +45 -0
  27. mtrl/archive/codecs.py +88 -0
  28. mtrl/archive/dtypes.py +39 -0
  29. mtrl/archive/reader.py +945 -0
  30. mtrl/archive/validation.py +1872 -0
  31. mtrl/connectors/__init__.py +1 -0
  32. mtrl/connectors/protocols.py +84 -0
  33. mtrl/disclosure.py +273 -0
  34. mtrl/domain/__init__.py +129 -0
  35. mtrl/domain/archive_limits.py +46 -0
  36. mtrl/domain/committed_values.py +539 -0
  37. mtrl/domain/frozen_containers.py +168 -0
  38. mtrl/domain/identities.py +174 -0
  39. mtrl/domain/provenance.py +448 -0
  40. mtrl/domain/records.py +233 -0
  41. mtrl/domain/revisions.py +121 -0
  42. mtrl/domain/source.py +13 -0
  43. mtrl/domain/verification.py +302 -0
  44. mtrl/excel.py +139 -0
  45. mtrl/exceptions.py +215 -0
  46. mtrl/exports.py +326 -0
  47. mtrl/features.py +251 -0
  48. mtrl/frames.py +228 -0
  49. mtrl/grids.py +1172 -0
  50. mtrl/integrity/__init__.py +143 -0
  51. mtrl/integrity/canonical.py +511 -0
  52. mtrl/integrity/digests.py +363 -0
  53. mtrl/integrity/manifest.py +631 -0
  54. mtrl/integrity/receipts.py +771 -0
  55. mtrl/integrity/verification.py +1303 -0
  56. mtrl/models.py +952 -0
  57. mtrl/mtrl.py +1852 -0
  58. mtrl/operations/__init__.py +36 -0
  59. mtrl/operations/_identity.py +17 -0
  60. mtrl/operations/_validation.py +106 -0
  61. mtrl/operations/arithmetic.py +207 -0
  62. mtrl/operations/base.py +292 -0
  63. mtrl/operations/resampling.py +203 -0
  64. mtrl/operations/resampling_scipy.py +138 -0
  65. mtrl/operations/spectra.py +58 -0
  66. mtrl/processing/__init__.py +23 -0
  67. mtrl/processing/_table_capture.py +341 -0
  68. mtrl/processing/limits.py +9 -0
  69. mtrl/processing/registry.py +1533 -0
  70. mtrl/protocols.py +13 -0
  71. mtrl/py.typed +0 -0
  72. mtrl/replay.py +946 -0
  73. mtrl/tables.py +1365 -0
  74. mtrl/transformations/__init__.py +22 -0
  75. mtrl/transformations/base.py +17 -0
  76. mtrl/units.py +60 -0
  77. vector_mtrl-0.2.0.dist-info/METADATA +142 -0
  78. vector_mtrl-0.2.0.dist-info/RECORD +81 -0
  79. vector_mtrl-0.2.0.dist-info/WHEEL +4 -0
  80. vector_mtrl-0.2.0.dist-info/licenses/LICENSE +373 -0
  81. vector_mtrl-0.2.0.dist-info/licenses/NOTICE +30 -0
@@ -0,0 +1,22 @@
1
+ """Compatibility shim for the transformation interface.
2
+
3
+ The live code moved to `mtrl.operations`. The `mtrl.transformations` import path stays
4
+ available until Stage 3.
5
+ """
6
+
7
+ from importlib import import_module
8
+ from typing import TYPE_CHECKING, Any
9
+
10
+ __all__ = ["DEFAULT_PARAMETERS", "TRANSFORMATIONS", "apply"]
11
+
12
+ if TYPE_CHECKING:
13
+ from mtrl.operations.base import DEFAULT_PARAMETERS, TRANSFORMATIONS, apply
14
+
15
+
16
+ def __getattr__(name: str) -> Any:
17
+ """Load the compatibility transformation interface only when a caller requests it."""
18
+ if name not in __all__:
19
+ raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
20
+
21
+ base_module = import_module("mtrl.operations.base")
22
+ return getattr(base_module, name)
@@ -0,0 +1,17 @@
1
+ """Compatibility re-export of the transformation base module.
2
+
3
+ The live code moved to `mtrl.operations.base`. This shim keeps the documented
4
+ `mtrl.transformations.base` import path working until Stage 3.
5
+ """
6
+
7
+ from mtrl._provenance import _hash_function
8
+ from mtrl.operations._identity import identity
9
+ from mtrl.operations.base import DEFAULT_PARAMETERS, TRANSFORMATIONS, apply
10
+
11
+ __all__ = [
12
+ "DEFAULT_PARAMETERS",
13
+ "TRANSFORMATIONS",
14
+ "_hash_function",
15
+ "apply",
16
+ "identity",
17
+ ]
mtrl/units.py ADDED
@@ -0,0 +1,60 @@
1
+ """Units of measure for the Mtrl package, against the QUDT standard.
2
+
3
+ QUDT (Quantities, Units, Dimensions and Types) gives every unit a stable term. This package
4
+ keeps the reader's own text with that term. A unit that this package cannot match stays in
5
+ the record.
6
+ """
7
+
8
+ from pydantic import BaseModel, ConfigDict
9
+
10
+ QUDT_TERMS_BY_RAW_UNIT: dict[str, tuple[str, str]] = {
11
+ "cm⁻¹": ("PER-CentiM", "InverseLength"),
12
+ "cm^-1": ("PER-CentiM", "InverseLength"),
13
+ "1/cm": ("PER-CentiM", "InverseLength"),
14
+ "s": ("SEC", "Time"),
15
+ "second": ("SEC", "Time"),
16
+ "a.u.": ("UNITLESS", "Dimensionless"),
17
+ }
18
+ """QUDT terms for each spelling of a unit that a reader can report.
19
+
20
+ Each value holds the QUDT unit and the QUDT quantity kind. Each entry holds one spelling,
21
+ because a reader can spell the same unit in more than one way.
22
+ """
23
+
24
+
25
+ # @lat: [[domain-model#Units of measure]]
26
+ class Unit(BaseModel):
27
+ """A unit of measure, as a reader reported it and as QUDT identifies it.
28
+
29
+ A Unit is frozen. A checkpoint and the checkpoints that come from it can share one
30
+ Unit. Replace a Unit when a checkpoint must hold a different one.
31
+
32
+ Attributes:
33
+ raw: The unit as the reader reported it, e.g. "cm⁻¹".
34
+ qudt_unit: The local name of the QUDT unit, if known, e.g. "PER-CentiM". It gives
35
+ the measure of the quantity.
36
+ qudt_quantity_kind: The local name of the QUDT quantity kind, if known, e.g.
37
+ "InverseLength". It names the property.
38
+ """
39
+
40
+ model_config = ConfigDict(frozen=True)
41
+
42
+ raw: str
43
+ qudt_unit: str | None = None
44
+ qudt_quantity_kind: str | None = None
45
+
46
+ @classmethod
47
+ def from_raw(cls, raw_unit: str | None) -> Unit | None:
48
+ """Build a Unit from the text that a reader reported for a unit.
49
+
50
+ Args:
51
+ raw_unit: The unit as the reader reported it, e.g. "cm⁻¹".
52
+
53
+ Returns:
54
+ A Unit that holds `raw_unit`, and the QUDT terms where this package knows them.
55
+ None, when `raw_unit` is empty or absent.
56
+ """
57
+ if not raw_unit:
58
+ return None
59
+ qudt_unit, qudt_quantity_kind = QUDT_TERMS_BY_RAW_UNIT.get(raw_unit, (None, None))
60
+ return cls(raw=raw_unit, qudt_unit=qudt_unit, qudt_quantity_kind=qudt_quantity_kind)
@@ -0,0 +1,142 @@
1
+ Metadata-Version: 2.5
2
+ Name: vector-mtrl
3
+ Version: 0.2.0
4
+ Summary: Materials research tools for spectra and archive workflows.
5
+ Author-email: Fuzzy Labs <info@fuzzylabs.ai>
6
+ License-Expression: MPL-2.0
7
+ License-File: LICENSE
8
+ License-File: NOTICE
9
+ Requires-Python: <4.0,>=3.14
10
+ Requires-Dist: numpy>=2.5.2
11
+ Requires-Dist: pydantic>=2.13.4
12
+ Requires-Dist: rfc8785==0.1.4
13
+ Provides-Extra: excel
14
+ Requires-Dist: openpyxl>=3.1.5; extra == 'excel'
15
+ Requires-Dist: pandas>=3.0.5; extra == 'excel'
16
+ Provides-Extra: interp
17
+ Requires-Dist: scipy>=1.16; extra == 'interp'
18
+ Provides-Extra: tabular
19
+ Requires-Dist: pandas>=3.0.5; extra == 'tabular'
20
+ Description-Content-Type: text/markdown
21
+
22
+ # vector-mtrl
23
+
24
+ `mtrl` reads, checks, and writes materials data archives. It records each scientific result as an
25
+ immutable record with exact lineage.
26
+
27
+ ## What you get
28
+
29
+ - Immutable committed records with stable identities and complete lineage.
30
+ - Bounded `.mtrl` archives with an integrity manifest, external receipts, and forensic inspection.
31
+ - NumPy-only operations: identity, scale, offset, peak normalisation, zero-at-point, and linear
32
+ resample, beside mean and median aggregates.
33
+ - Explicit analysis grids and a read-only alignment report.
34
+ - A read-only replay plan, a capability view, and a detached rerun for committed chains.
35
+ - Author disclosure that stays inert: stored environment records and passive source bundles that
36
+ MTRL never imports or executes.
37
+ - CSV export without pandas.
38
+ - Optional extras add SciPy resampling, pandas conversion, and Excel export.
39
+
40
+ ## Install
41
+
42
+ `vector-mtrl` requires Python 3.14 or newer, below Python 4. The base install depends only on
43
+ NumPy, Pydantic, and RFC 8785 canonical JSON. Create one environment and install the core:
44
+
45
+ ```sh
46
+ uv venv --python 3.14
47
+ uv pip install --python .venv/bin/python vector-mtrl
48
+ ```
49
+
50
+ ## Quick start
51
+
52
+ Commit one synthetic spectrum, normalise it, save an archive, verify it, load it, and export
53
+ CSV. The base install alone runs every step.
54
+
55
+ ### Example: Quick start
56
+
57
+ **Required install:** `vector-mtrl`
58
+
59
+ ```python
60
+ from pathlib import Path
61
+ from tempfile import TemporaryDirectory
62
+
63
+ import numpy as np
64
+
65
+ from mtrl import InstrumentRun, MaterialData, Mtrl, verify_archive
66
+
67
+ application = Mtrl(sample_id="sample-01")
68
+ run = InstrumentRun(run_name="replicate-01")
69
+ axis = np.array([2000.0, 2100.0, 2200.0])
70
+ content = np.empty(axis.size, dtype=[("wavenumber", "<f8"), ("absorbance", "<f8")])
71
+ content["wavenumber"] = axis
72
+ content["absorbance"] = [0.1, 0.2, 0.3]
73
+ checkpoint = MaterialData(
74
+ content=content,
75
+ type="raw",
76
+ checkpoint_name="spectrum",
77
+ )
78
+ run.add_checkpoint(checkpoint)
79
+ application.add(run)
80
+
81
+ normalised = application.transform(
82
+ run.run_id,
83
+ checkpoint.checkpoint_id,
84
+ "normalise_peak",
85
+ )
86
+ print(normalised.lineage.provenance.qualified_identifier)
87
+
88
+ with TemporaryDirectory() as directory:
89
+ archive_path = application.save(Path(directory) / "sample.mtrl")
90
+ verification = verify_archive(archive_path)
91
+ print(verification.structural_status.value, verification.hash_status.value)
92
+
93
+ loaded = Mtrl.load(archive_path)
94
+ print(loaded.sample_id, loaded.get_run(run.run_id) is not None)
95
+ csv_path = loaded.export_checkpoint(
96
+ run.run_id,
97
+ normalised.checkpoint_id,
98
+ Path(directory) / "signal.csv",
99
+ )
100
+ exported = np.genfromtxt(csv_path, delimiter=",", names=True)
101
+ np.testing.assert_allclose(exported["absorbance"], [1 / 3, 2 / 3, 1])
102
+ print(csv_path.is_file())
103
+ ```
104
+
105
+ `Mtrl.add()` commits a detached copy, so later changes to your arrays cannot alter the record.
106
+ Every mutation, including the transform above, creates one new revision.
107
+
108
+ ## Guides
109
+
110
+ The expanded guides ship in the source archive under `docs/user/`. Download the archive for a
111
+ release from https://pypi.org/project/vector-mtrl/#files, then read:
112
+
113
+ - `docs/user/getting-started.md` for installation, first records, and the save, load, verify,
114
+ and export loop.
115
+ - `docs/user/workflows.md` for corrections, replacements, transforms, resampling, aggregates,
116
+ alignment reports, replay, receipts, forensic inspection, disclosure, exports, and registry
117
+ control.
118
+ - `docs/user/reference.md` for every public route, the stable typed imports, the exact
119
+ package-root export list, registry names, format features, and the archive safety contract.
120
+
121
+ ## Archive and provenance limits
122
+
123
+ MTRL reads `.mtrl` archives inside configured size and member limits, and it validates paths,
124
+ entries, JSON, references, payloads, and integrity before it returns data. It does not extract
125
+ archive files.
126
+
127
+ Archive content does not install packages, does not import operation code, does not change a
128
+ registry, does not execute stored source, and does not change committed records directly.
129
+ Committed records are immutable: use `Mtrl` methods to create a new record version or change the
130
+ active view.
131
+
132
+ New archives require integrity coverage. Keep a receipt outside the archive if you need to
133
+ detect a complete rewrite. A receipt has no signature, so send it through a separate trusted
134
+ channel. `forensic_inspect()` reports damaged archive facts, but it does not return damaged data
135
+ for normal analysis. MTRL verifies digests and never verifies your execution environment:
136
+ environment records are author claims, not checked facts.
137
+
138
+ ## Licence
139
+
140
+ The core is licensed under the MPL-2.0. Read the licence text in `LICENSE` and the inherited
141
+ notices in `NOTICE`, both included in this distribution. The upstream licence reference is
142
+ https://www.mozilla.org/en-US/MPL/2.0/.
@@ -0,0 +1,81 @@
1
+ mtrl/__init__.py,sha256=tLPY9zhx4iOM58s9LjZwGXK-8u4jIFm9W1q-DlXxIh8,3466
2
+ mtrl/_alignment_report.py,sha256=bG6ZLOPq2-AxibIVyt0w0565aX-MTDu9CqMMbGQzgJs,3968
3
+ mtrl/_archive_documents.py,sha256=LKED-bIXLcFof2x05zyi0-CM56EU-enEyyruEaqM8QQ,2726
4
+ mtrl/_archive_integrity.py,sha256=59ew1H8L6wGq7rUtqIrRrXvI6ii71G7QDrqcnKofA5M,22398
5
+ mtrl/_archive_loading.py,sha256=O-UE0dTSTAQ0rM_KZasz6XZPP0OIDDBm8pDNqMah9L4,40661
6
+ mtrl/_archive_serialise.py,sha256=4_4hCNOGRx8E-iX10fRNJ_RqOFrJfEpVE2uPMbx82mc,27326
7
+ mtrl/_candidate_matching.py,sha256=lO3Vo6tiTuuzM7zwds9pArxfhfQda4zKg9vkijRNmtI,8141
8
+ mtrl/_cli.py,sha256=iXeU82meXI3lNkv-_r9w-3mPJ5RTFHjuFjSKqr6GFcA,1134
9
+ mtrl/_disclosure.py,sha256=94s_ZZ0yxUr-Qz85We6wVHHqdH7xI49rGz6Id4MriE8,27468
10
+ mtrl/_ingestion_shortcuts.py,sha256=7YLJTUcM1egkwaqWdnm96oc_n3kwxuy8jHKpaWdbQsY,3004
11
+ mtrl/_install_targets.py,sha256=CX4IYKe1gVM22wAqHpAUeoZl3uD8Si1k3UWjk9Hu7zQ,1555
12
+ mtrl/_optional.py,sha256=RWEw_7kOft_szNzRjyhXmImQ_d0sTDHPaRRm5HLRYrQ,1149
13
+ mtrl/_provenance.py,sha256=8q_dqrfDe6UXSFTArSZklneaYDgkgUbJ2QCigcOpJMM,934
14
+ mtrl/_receipts.py,sha256=jnPSSoYVZAafs5cqrzqjZA4esQUUV1oHqYZtW7wk6Ac,7098
15
+ mtrl/_record_resolution.py,sha256=1nofqch_08dRaeC6ZKYD6lYJiZ5GkK0SyJgzL50VEdw,2119
16
+ mtrl/_replay_plan.py,sha256=hhel0fdwWVFK_BnFwQLwA5j6oY857dqDoBsM7wzsWHA,20846
17
+ mtrl/_replay_run.py,sha256=-C8itb59j7pBbUvyx0YezjcshsmVfZHsKD2TyQXI2nk,27563
18
+ mtrl/_run_management.py,sha256=S3ou2IhF2fLFTMf8RcBkFfuKsaX8T8MPj-bYwAnuLEM,15228
19
+ mtrl/_source_capture.py,sha256=iLRD_MEJUlrZ6xx4RprpHO1TeUEcd9qi-RAFzj5gGpI,19547
20
+ mtrl/_table_plan.py,sha256=gt2S2kb6ahz0xAtWWMDCauW4TlyqQSdo6996e3zCBgI,10623
21
+ mtrl/_table_provenance.py,sha256=OcHuzWY9XNGsIIc2DfLDjPHqe8VG7yBXw1UomGaa_XI,13099
22
+ mtrl/_table_values.py,sha256=Arg_eMS3-YRwEJ3GOm3HnF_iJn88-kkrcAVwIpCnjPg,6095
23
+ mtrl/_transform_apply.py,sha256=28LtcDyhEzHVIN0EL-bLgwgCNrOc9BvODcxn9XM3QbQ,8460
24
+ mtrl/_transform_validation.py,sha256=956GQzynbks1BtJaIkW50EccpsDlm7img_Zw6dThc5Y,53238
25
+ mtrl/disclosure.py,sha256=JJ7tHFmQB2V68O-ZKmf-M8cc6TOPOTJKfs3FWjuVOeU,10724
26
+ mtrl/excel.py,sha256=diFhLjNRHCzzQCEuq67nubwgPbH9x36Bg2SzMMG3HLo,5103
27
+ mtrl/exceptions.py,sha256=6Ey2RODweeRdCD0IKuU_xSWtE1ULqMO9unGx-WfQ0ps,6623
28
+ mtrl/exports.py,sha256=QnyJLv4eUYls2lpc4EFsm-HOREkJDZ1BWeIgBa-TTWk,11620
29
+ mtrl/features.py,sha256=Rj8sVrCNtT7f1j15PfesucuTxv3cuE3P0pl4tr9XRrA,9176
30
+ mtrl/frames.py,sha256=0aSKz_up6CKqosXK9uGgvY-nnU59gu0sStydV-4DRWc,8645
31
+ mtrl/grids.py,sha256=Z6fL8JAtC683DKlcF3NRdCEMWzW1c7n7rYBnHqpLfoM,46273
32
+ mtrl/models.py,sha256=99LADTjHK8QTsUUTtH8ZzFTpOTZsa21b-bP2UimPzZo,38276
33
+ mtrl/mtrl.py,sha256=sKR82KxR3K5fWCDtZ_N2aKv4R0OR1AJbdoevYxBYqNs,75655
34
+ mtrl/protocols.py,sha256=nxOJ-i9_-gweg3gHzt_QSnDg_AQ9o2qAZC5dhN8gkfw,379
35
+ mtrl/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
36
+ mtrl/replay.py,sha256=Tx6QY2JiH9-Oo-zcySGcFYu0GkY5V4MhvF4nINZR1LA,36022
37
+ mtrl/tables.py,sha256=gyZ-CYhciQIuKb2-hapFLWzbbogqDwkK5Xgiof2dPb8,48078
38
+ mtrl/units.py,sha256=ztsuwT3MiYfxyDwjuMN6Z1NIdayxHUIYHMgW_bLkjE8,2278
39
+ mtrl/archive/__init__.py,sha256=IFyiR-3Jzm-y-kJvpQgRM27Ux4L3lgI7ZTB-Nx0qJWY,1411
40
+ mtrl/archive/canonical.py,sha256=yXIw_H5nDBpIDyziEdb4Pu1cWiAbk6kj5gZauJGdQlw,1113
41
+ mtrl/archive/codecs.py,sha256=DRJSR-S_RRQsGDex6z9TOk6mbWOZYHJJ8T0C00rKiaU,2497
42
+ mtrl/archive/dtypes.py,sha256=_ZQBf4GAiTGQ_X3DlDg5y11O0TwlqsqRnE3f4e8l4Yk,1048
43
+ mtrl/archive/reader.py,sha256=k89bdeeVjTqQ3_LEZbPZ3o8rq-yS7QmFRsSVb2VZRCc,38162
44
+ mtrl/archive/validation.py,sha256=LhT3wsFt2lDtwxvEeRcZTX3Eymx_-tNZAX-uRtsxwfg,75061
45
+ mtrl/connectors/__init__.py,sha256=0Tx9emLVyKUTZzQOYuc7jpEQl9BOBB6USDPyy4VcL70,67
46
+ mtrl/connectors/protocols.py,sha256=IiFeTOLD9K4SSWxUU99FrCTqiyKzZ7lMhZ7uWd_aivk,2862
47
+ mtrl/domain/__init__.py,sha256=VPBTGm51VfYNxrMvJjxGn1VNIllNoGnAJlxVZuGBqTE,3015
48
+ mtrl/domain/archive_limits.py,sha256=osfZt4OY9YfldaBcnKhizRSXvZZmnajTE5TXZbCKNJw,1845
49
+ mtrl/domain/committed_values.py,sha256=q0OJzWL3rXb6u34KLSezD_XJTH_DIEOmOIakFcY0khE,18583
50
+ mtrl/domain/frozen_containers.py,sha256=nNljqJADnAnyb79adypqmMtjJQw3cpy85gfMuP8JGkw,5916
51
+ mtrl/domain/identities.py,sha256=rvfTFwtn-src18D6-F4fLFjJKTzzUgd45yPCX6pPKcI,4831
52
+ mtrl/domain/provenance.py,sha256=f0Ecl8p_942acI33HKJPWVx_1CeSwX25W191N_MW-jc,18533
53
+ mtrl/domain/records.py,sha256=Aa1PGqIj6ME7aYZkxCcUNLdX6dsjKpEDfLZ4HG1atRw,9725
54
+ mtrl/domain/revisions.py,sha256=jLZCUpniLXlU6y4yJMwM84cGTO7d8Sy-2K22UFeGMaY,4621
55
+ mtrl/domain/source.py,sha256=WDhqjGYDOrYvvf3AYzdgL_AWHuQPQQ9EEtt7AtVOgso,243
56
+ mtrl/domain/verification.py,sha256=fOAHtweDZzm7OxN11pRexbGddtoiq4vf3lcIj-Qw-Tk,9968
57
+ mtrl/integrity/__init__.py,sha256=IeexlOhCPCOz532zRkBAOsVpPOANJxuHEhK49t3XIFI,3699
58
+ mtrl/integrity/canonical.py,sha256=43Elrnoy1CIvcL1bSzbAOR1UBINh3QXxvzTntC-BUpA,17617
59
+ mtrl/integrity/digests.py,sha256=i2JwZpGg3-TT8STHsd6RDPAYfwZCFNmza6PJuuq7G4w,11495
60
+ mtrl/integrity/manifest.py,sha256=7Hv25frCFwftEdJOLKuhJpZyrsjzSvKNa0lwo_tnopo,24869
61
+ mtrl/integrity/receipts.py,sha256=OUh9kxdcg1kSzxd73AHW3xECx0KpF__noI2Uy0kxlZU,28293
62
+ mtrl/integrity/verification.py,sha256=OTRRZpSqJOZDuLNivCQO3uiI9-zp8u44YeNrkmA2Rw0,45133
63
+ mtrl/operations/__init__.py,sha256=odQ4R8pmpBlr5Cy5AZVLGwAd4H_eFhbHu2Dny8c5_5w,1031
64
+ mtrl/operations/_identity.py,sha256=lfsnchZn_E1-IUEbAAGd4xNHzTLhyp35nLvud0pPBVI,316
65
+ mtrl/operations/_validation.py,sha256=FYxWDiitjq1KbLsYO-ld9S0w-sp2AXsxzbh1OfWAS4c,3797
66
+ mtrl/operations/arithmetic.py,sha256=kbsrlYY1vj30bruLSz4Ddrbt-35htjSpP1ds2CrMvQo,8382
67
+ mtrl/operations/base.py,sha256=SyIIqNgoH21Pf6YMAnixKScM_NetUBMGxlpHhJa-y7M,11059
68
+ mtrl/operations/resampling.py,sha256=QTG7RaQ04b8tteIHWcpBsFKHXFZ2ZKgzuQTCjYPhDHE,7554
69
+ mtrl/operations/resampling_scipy.py,sha256=ObDb0z19ENLxEOBIXVhCYaUzmR7Nng-y9cE9oWqU6vo,4904
70
+ mtrl/operations/spectra.py,sha256=n2lmsf8iGp_Jon25aSua2zXE7rzYftrPwuJYHV3fvY4,2362
71
+ mtrl/processing/__init__.py,sha256=YfEquS19a1Ch-HWUe2MRD6ZhnplXT7Ph__hS_2nJLgM,583
72
+ mtrl/processing/_table_capture.py,sha256=Oyz6ig9pPcDhQWAietO8sfkxeWrn5X9Wqb5JY2rrHLI,12457
73
+ mtrl/processing/limits.py,sha256=CfPIL6_MiDpcvylf2O5I00myPTNqFHCmnz_42Qapc-Q,401
74
+ mtrl/processing/registry.py,sha256=mLbVcVfyABtQ_i-dAei-9BZtQ8USxbU9DaNcGKBGlaE,63740
75
+ mtrl/transformations/__init__.py,sha256=x9Se7ZUbCB7_mwbwWn-IcP2MPHFR0suLYkdni9u5RKA,738
76
+ mtrl/transformations/base.py,sha256=9TbCSpM-2hytnreUE2YtW62OJz0oi_hKa4kxyrebXkk,491
77
+ vector_mtrl-0.2.0.dist-info/METADATA,sha256=OUXi5t4frEkcQ-MvYm052TFmK_e2Xw0UYsVdihCORSM,5492
78
+ vector_mtrl-0.2.0.dist-info/WHEEL,sha256=zOwg4jB6zX2kU910N-cMawjivD6tO8NEWvE12je1bVk,87
79
+ vector_mtrl-0.2.0.dist-info/licenses/LICENSE,sha256=HyVuytGSiAUQ6ErWBHTqt1iSGHhLmlC8fO7jTCuR8dU,16725
80
+ vector_mtrl-0.2.0.dist-info/licenses/NOTICE,sha256=G6LHUEsMF-StwWFKa1QoTaoIxtqRjVqp0NY74FCYnLs,1440
81
+ vector_mtrl-0.2.0.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: hatchling 1.32.0
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any