clm-kernel 0.0.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.
- clm/__init__.py +230 -0
- clm/__main__.py +25 -0
- clm/cross_cutting/__init__.py +50 -0
- clm/cross_cutting/_test_runner.py +36 -0
- clm/cross_cutting/async_utils.py +25 -0
- clm/cross_cutting/cel_builder.py +123 -0
- clm/cross_cutting/cel_converter.py +697 -0
- clm/cross_cutting/cel_engine.py +252 -0
- clm/cross_cutting/cel_ops.py +72 -0
- clm/cross_cutting/cel_ops_db.py +157 -0
- clm/cross_cutting/cel_ops_files.py +99 -0
- clm/cross_cutting/cel_ops_state.py +71 -0
- clm/cross_cutting/cel_ops_strings.py +64 -0
- clm/cross_cutting/cel_resolver.py +63 -0
- clm/cross_cutting/cel_slices.py +56 -0
- clm/cross_cutting/cel_store.py +330 -0
- clm/cross_cutting/clm_logger.py +140 -0
- clm/cross_cutting/config/__init__.py +155 -0
- clm/cross_cutting/config/config_constants.py +392 -0
- clm/cross_cutting/config/env_parameters.py +90 -0
- clm/cross_cutting/config/logging.py +378 -0
- clm/cross_cutting/config/settings.py +504 -0
- clm/cross_cutting/context.py +5 -0
- clm/cross_cutting/domain_models.py +55 -0
- clm/cross_cutting/domain_types.py +61 -0
- clm/cross_cutting/effects.py +67 -0
- clm/cross_cutting/errors.py +153 -0
- clm/cross_cutting/governance.py +331 -0
- clm/cross_cutting/guards.py +41 -0
- clm/cross_cutting/mcard.py +321 -0
- clm/cross_cutting/native.py +185 -0
- clm/cross_cutting/observability.py +289 -0
- clm/cross_cutting/pcard.py +434 -0
- clm/cross_cutting/registry.py +71 -0
- clm/cross_cutting/resources.py +84 -0
- clm/cross_cutting/secrets.py +44 -0
- clm/cross_cutting/subprocess_utils.py +118 -0
- clm/cross_cutting/telemetry.py +164 -0
- clm/cross_cutting/testing/__init__.py +8 -0
- clm/cross_cutting/testing/comparator.py +187 -0
- clm/cross_cutting/testing/datasets.py +87 -0
- clm/cross_cutting/timeutil.py +20 -0
- clm/cross_cutting/types/new_type_check.py +0 -0
- clm/cross_cutting/utils/__init__.py +1 -0
- clm/cross_cutting/utils/url_safety.py +50 -0
- clm/cross_cutting/vcard.py +560 -0
- clm/cross_cutting/writer.py +118 -0
- clm/layer0/README.md +50 -0
- clm/layer0/__init__.py +223 -0
- clm/layer0/algebra.py +60 -0
- clm/layer0/algebra_baldwin.py +133 -0
- clm/layer0/algebra_baldwin_generators.py +36 -0
- clm/layer0/algebra_equivalence.py +262 -0
- clm/layer0/algebra_ingest.py +306 -0
- clm/layer0/algebra_manifest_io.py +156 -0
- clm/layer0/assembler.py +481 -0
- clm/layer0/cel/__init__.py +23 -0
- clm/layer0/cel_eval.py +491 -0
- clm/layer0/codec.py +106 -0
- clm/layer0/context.py +122 -0
- clm/layer0/db.py +160 -0
- clm/layer0/exceptions.py +73 -0
- clm/layer0/fibration.py +106 -0
- clm/layer0/gates.py +50 -0
- clm/layer0/hash.py +80 -0
- clm/layer0/loader.py +826 -0
- clm/layer0/math_utils.py +163 -0
- clm/layer0/mcard.py +96 -0
- clm/layer0/model/__init__.py +0 -0
- clm/layer0/model/action.py +223 -0
- clm/layer0/model/card.py +280 -0
- clm/layer0/model/card_triad.py +427 -0
- clm/layer0/model/compatibility.py +60 -0
- clm/layer0/model/dictionary.py +46 -0
- clm/layer0/model/dots.py +331 -0
- clm/layer0/model/event_producer.py +88 -0
- clm/layer0/model/g_time.py +89 -0
- clm/layer0/model/handle.py +163 -0
- clm/layer0/model/hash/__init__.py +6 -0
- clm/layer0/model/hash/algorithms/__init__.py +3 -0
- clm/layer0/model/hash/algorithms/custom_hash.py +7 -0
- clm/layer0/model/hash/algorithms/local_sha256.py +178 -0
- clm/layer0/model/hash/constants.py +53 -0
- clm/layer0/model/hash/enums.py +60 -0
- clm/layer0/model/hash/validator.py +307 -0
- clm/layer0/model/interpreter.py +275 -0
- clm/layer0/model/pagination.py +45 -0
- clm/layer0/model/pcard.py +716 -0
- clm/layer0/model/schema.py +44 -0
- clm/layer0/model/utils/__init__.py +1 -0
- clm/layer0/model/utils/content_analyzer.py +152 -0
- clm/layer0/model/validators/__init__.py +1 -0
- clm/layer0/model/validators/base_validator.py +44 -0
- clm/layer0/model/validators/binary_validator.py +66 -0
- clm/layer0/model/validators/text_validator.py +82 -0
- clm/layer0/model/validators/validation_registry.py +49 -0
- clm/layer0/model/vcard.py +823 -0
- clm/layer0/model/vcard_ext/__init__.py +39 -0
- clm/layer0/model/vcard_ext/core.py +60 -0
- clm/layer0/model/vcard_ext/network.py +23 -0
- clm/layer0/model/vcard_ext/observability.py +63 -0
- clm/layer0/model/vcard_ext/storage.py +60 -0
- clm/layer0/model/vcard_ext/vendors.py +211 -0
- clm/layer0/model/vcard_sandwich.py +119 -0
- clm/layer0/model/vcard_vocabulary.py +463 -0
- clm/layer0/model/workflow.py +274 -0
- clm/layer0/narrative.py +431 -0
- clm/layer0/ontology/collection.py +125 -0
- clm/layer0/parser.py +429 -0
- clm/layer0/relations.py +73 -0
- clm/layer0/rule_evaluator.py +251 -0
- clm/layer0/schema/__init__.py +38 -0
- clm/layer0/schema/ddl.py +97 -0
- clm/layer0/templates/abstract.yaml +99 -0
- clm/layer0/templates/balanced.yaml +253 -0
- clm/layer0/templates/concrete.yaml +172 -0
- clm/layer0/type_registry.py +223 -0
- clm/layer0/types.py +204 -0
- clm/layer0/utils.py +886 -0
- clm/layer0/verifier_core.py +262 -0
- clm/layer1/__init__.py +31 -0
- clm/layer1/action_dispatcher.py +275 -0
- clm/layer1/adapter_registry.py +233 -0
- clm/layer1/algebra_baldwin_generators.py +192 -0
- clm/layer1/arrow_compiler.py +525 -0
- clm/layer1/batch_processor.py +152 -0
- clm/layer1/cel/__init__.py +27 -0
- clm/layer1/cel/builder.py +173 -0
- clm/layer1/engine.py +759 -0
- clm/layer1/engine_async.py +89 -0
- clm/layer1/eval_callback.py +49 -0
- clm/layer1/gate_composer.py +229 -0
- clm/layer1/hoare_sandwich.py +298 -0
- clm/layer1/identity_guard.py +348 -0
- clm/layer1/matrix.py +138 -0
- clm/layer1/neural_runtime.py +221 -0
- clm/layer1/operations/__init__.py +123 -0
- clm/layer1/operations/augment.py +156 -0
- clm/layer1/operations/base.py +109 -0
- clm/layer1/operations/builtins.py +338 -0
- clm/layer1/operations/dispatch.py +144 -0
- clm/layer1/operations/exclude.py +107 -0
- clm/layer1/operations/handle.py +197 -0
- clm/layer1/operations/identity.py +139 -0
- clm/layer1/operations/invert.py +66 -0
- clm/layer1/operations/loader.py +116 -0
- clm/layer1/operations/manipulators/__init__.py +23 -0
- clm/layer1/operations/manipulators/document.py +211 -0
- clm/layer1/operations/manipulators/media.py +134 -0
- clm/layer1/operations/manipulators/structured.py +159 -0
- clm/layer1/operations/manipulators/tabular.py +334 -0
- clm/layer1/operations/port.py +65 -0
- clm/layer1/operations/services.py +529 -0
- clm/layer1/operations/split.py +117 -0
- clm/layer1/operations/substitute.py +75 -0
- clm/layer1/petri.py +1052 -0
- clm/layer1/pocketflow_orchestrator.py +408 -0
- clm/layer1/pocketflow_scheduler.py +519 -0
- clm/layer1/protocols.py +197 -0
- clm/layer1/runtime_adapter.py +718 -0
- clm/layer1/runtimes/__init__.py +71 -0
- clm/layer1/runtimes/_generated_assertions.py +125 -0
- clm/layer1/runtimes/_generated_types.py +42 -0
- clm/layer1/runtimes/base.py +265 -0
- clm/layer1/runtimes/binary.py +101 -0
- clm/layer1/runtimes/factory.py +203 -0
- clm/layer1/runtimes/javascript.py +321 -0
- clm/layer1/runtimes/javascript_runtime.js +33 -0
- clm/layer1/runtimes/js_scripts/isomorphism.mjs +22 -0
- clm/layer1/runtimes/js_scripts/loader.mjs +52 -0
- clm/layer1/runtimes/lambda_calc.py +126 -0
- clm/layer1/runtimes/python.py +288 -0
- clm/layer1/runtimes/python_runtime.py +41 -0
- clm/layer1/runtimes/script.py +114 -0
- clm/layer1/sandbox.py +334 -0
- clm/layer1/savepoint_guard.py +136 -0
- clm/layer1/sparse_net.py +122 -0
- clm/layer1/spec_tester.py +165 -0
- clm/layer1/store.py +295 -0
- clm/layer1/test_runner.py +498 -0
- clm/layer1/type_inspector.py +166 -0
- clm/layer1/verifier.py +772 -0
- clm/layer1/vm.py +91 -0
- clm/layer2/__init__.py +78 -0
- clm/layer2/card_collection.py +678 -0
- clm/layer2/classifier.py +479 -0
- clm/layer2/engine/__init__.py +1 -0
- clm/layer2/engine/abstract_sql_engine.py +320 -0
- clm/layer2/engine/base.py +193 -0
- clm/layer2/engine/duckdb_engine.py +576 -0
- clm/layer2/engine/sqlite_engine.py +518 -0
- clm/layer2/fiber/__init__.py +31 -0
- clm/layer2/fiber/context.py +89 -0
- clm/layer2/fiber/disposable.py +163 -0
- clm/layer2/fiber/fiber.py +125 -0
- clm/layer2/fiber/hoare.py +191 -0
- clm/layer2/file_io.py +376 -0
- clm/layer2/file_registrar.py +77 -0
- clm/layer2/ingest.py +202 -0
- clm/layer2/lineage.py +322 -0
- clm/layer2/mcard_fs.py +262 -0
- clm/layer2/merkle.py +11 -0
- clm/layer2/mime.py +244 -0
- clm/layer2/mime_detector.py +245 -0
- clm/layer2/private_collection.py +118 -0
- clm/layer2/shared_store.py +11 -0
- clm/layer2/storage/__init__.py +190 -0
- clm/layer2/storage/db_bitemporal.py +141 -0
- clm/layer2/storage/db_driver.py +331 -0
- clm/layer2/storage/db_hyperlinks.py +214 -0
- clm/layer2/storage/db_pool.py +139 -0
- clm/layer2/storage/db_repository.py +229 -0
- clm/layer2/storage/savepoint.py +78 -0
- clm/layer2/storage/sqlite_wal.py +74 -0
- clm/layer2/tridb.py +245 -0
- clm/layer2/vcard_receipt.py +71 -0
- clm/layer2/vfs.py +17 -0
- clm/layer3/__init__.py +141 -0
- clm/layer3/agency/__init__.py +19 -0
- clm/layer3/agency/config.py +220 -0
- clm/layer3/agency/providers/__init__.py +15 -0
- clm/layer3/agency/providers/base.py +91 -0
- clm/layer3/agency/providers/mlc_llm.py +169 -0
- clm/layer3/agency/providers/ollama.py +203 -0
- clm/layer3/agency/router.py +71 -0
- clm/layer3/agency/runtime.py +524 -0
- clm/layer3/gateway.py +353 -0
- clm/layer3/open_interpreter_adapter.py +159 -0
- clm/layer3/rag/__init__.py +70 -0
- clm/layer3/rag/cli.py +228 -0
- clm/layer3/rag/config.py +153 -0
- clm/layer3/rag/embeddings/__init__.py +16 -0
- clm/layer3/rag/embeddings/base.py +79 -0
- clm/layer3/rag/embeddings/ollama.py +211 -0
- clm/layer3/rag/embeddings/vision.py +290 -0
- clm/layer3/rag/engine.py +276 -0
- clm/layer3/rag/graph/__init__.py +22 -0
- clm/layer3/rag/graph/community.py +198 -0
- clm/layer3/rag/graph/engine.py +433 -0
- clm/layer3/rag/graph/extractor.py +255 -0
- clm/layer3/rag/graph/schema.py +115 -0
- clm/layer3/rag/graph/store.py +641 -0
- clm/layer3/rag/indexer.py +333 -0
- clm/layer3/rag/llm_providers.json +52 -0
- clm/layer3/rag/semantic_versioning.py +313 -0
- clm/layer3/rag/vector/__init__.py +28 -0
- clm/layer3/rag/vector/handle_vector_store.py +749 -0
- clm/layer3/rag/vector/schema.py +151 -0
- clm/layer3/rag/vector/store.py +632 -0
- clm/layer3/reticulum/__init__.py +55 -0
- clm/layer3/reticulum/bridge.py +74 -0
- clm/layer3/reticulum/daemon.py +88 -0
- clm/layer3/reticulum/discovery.py +164 -0
- clm/layer3/reticulum/identity.py +107 -0
- clm/layer3/reticulum/media.py +148 -0
- clm/layer3/reticulum/transport.py +133 -0
- clm/layer3/satori/__init__.py +209 -0
- clm/layer3/satori/alpha_conversion.py +168 -0
- clm/layer3/satori/beta_reduction.py +359 -0
- clm/layer3/satori/continuation.py +38 -0
- clm/layer3/satori/eta_conversion.py +205 -0
- clm/layer3/satori/free_variables.py +163 -0
- clm/layer3/satori/io_effects.py +370 -0
- clm/layer3/satori/lambda_runtime.py +726 -0
- clm/layer3/satori/lambda_term.py +230 -0
- clm/layer3/satori/sheaf_audit.py +261 -0
- clm/layer3/satori/speech_act.py +279 -0
- clm/layer4/README.md +9 -0
- clm/layer4/__init__.py +67 -0
- clm/layer4/_sovereign_executor.py +580 -0
- clm/layer4/action_commands.py +719 -0
- clm/layer4/api.py +236 -0
- clm/layer4/bootstrap/__init__.py +13 -0
- clm/layer4/bootstrap/bootstrapper.py +118 -0
- clm/layer4/bootstrap/cleanup.py +44 -0
- clm/layer4/bootstrap/clm_hooks.py +49 -0
- clm/layer4/bootstrap/genesis.py +77 -0
- clm/layer4/bootstrap/injection.py +125 -0
- clm/layer4/cli.py +549 -0
- clm/layer4/collection_manager.py +553 -0
- clm/layer4/commands/__init__.py +81 -0
- clm/layer4/commands/action_cmd.py +42 -0
- clm/layer4/commands/check_cmd.py +82 -0
- clm/layer4/commands/envelope.py +73 -0
- clm/layer4/commands/evaluate_cmd.py +224 -0
- clm/layer4/commands/mcard_cmd.py +24 -0
- clm/layer4/commands/petri_cmd.py +92 -0
- clm/layer4/commands/tridb_cmd.py +319 -0
- clm/layer4/commands/version_cmd.py +27 -0
- clm/layer4/diff_commands.py +167 -0
- clm/layer4/eoa_sponsor.py +232 -0
- clm/layer4/events.py +69 -0
- clm/layer4/flux_gateway.py +133 -0
- clm/layer4/gateway.py +91 -0
- clm/layer4/loader.py +307 -0
- clm/layer4/mcard_commands.py +166 -0
- clm/layer4/membrane.py +273 -0
- clm/layer4/navigation.py +50 -0
- clm/layer4/protocol/protocol_entry_python.py +108 -0
- clm/layer4/protocol/python_sync.py +126 -0
- clm/layer4/runner.py +150 -0
- clm/layer4/satori.py +262 -0
- clm/layer4/server/python_sync_client.py +150 -0
- clm/layer4/server/python_sync_server.py +139 -0
- clm/layer4/server/service_api.py +315 -0
- clm/layer4/server/start_servers.py +107 -0
- clm/layer4/server/stop_servers.py +24 -0
- clm/layer4/simulated_optimization_fix.py +0 -0
- clm/layer4/storage.py +463 -0
- clm/layer4/tridb_admin.py +268 -0
- clm/layer4/websocket/test_ws_client.py +104 -0
- clm/layer4/websocket/test_ws_server.py +138 -0
- clm/layer4/websocket/ws_server_local.py +160 -0
- clm/layer5/__init__.py +51 -0
- clm/layer5/async_batch_writer.py +133 -0
- clm/layer5/learning.py +276 -0
- clm/layer5/telemetry_hook.py +107 -0
- clm/layer5/type_lattice.py +238 -0
- clm/py.typed +0 -0
- clm/schemas/__init__.py +652 -0
- clm/schemas/abstract_face_schema.yaml +77 -0
- clm/schemas/cel_schema.yaml +416 -0
- clm/schemas/lifecycle/__init__.py +45 -0
- clm/schemas/lifecycle/models.py +123 -0
- clm/schemas/lifecycle/service.py +364 -0
- clm/schemas/mcard_schema.sql +192 -0
- clm/schemas/mcard_vector_schema.sql +283 -0
- clm/schemas/mlp-context-v1.json +91 -0
- clm_kernel-0.0.0.dist-info/METADATA +121 -0
- clm_kernel-0.0.0.dist-info/RECORD +333 -0
- clm_kernel-0.0.0.dist-info/WHEEL +4 -0
- clm_kernel-0.0.0.dist-info/entry_points.txt +3 -0
- clm_kernel-0.0.0.dist-info/licenses/LICENSE +21 -0
clm/layer0/math_utils.py
ADDED
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
"""Mathematical utility functions for the CLM Petri Net runtime."""
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
def math_gcd(a: int, b: int) -> int:
|
|
5
|
+
"""
|
|
6
|
+
Computes the greatest common divisor of two integers.
|
|
7
|
+
"""
|
|
8
|
+
a = abs(a)
|
|
9
|
+
b = abs(b)
|
|
10
|
+
while b > 0:
|
|
11
|
+
a, b = b, a % b
|
|
12
|
+
return a
|
|
13
|
+
|
|
14
|
+
def math_lcm(a: int, b: int) -> int:
|
|
15
|
+
"""
|
|
16
|
+
Computes the least common multiple of two integers.
|
|
17
|
+
"""
|
|
18
|
+
if a == 0 or b == 0:
|
|
19
|
+
return 0
|
|
20
|
+
return abs(a * b) // math_gcd(a, b)
|
|
21
|
+
|
|
22
|
+
def solve_nullspace(matrix: list[list[int]], rows: int, cols: int, transpose: bool = False) -> list[list[int]]:
|
|
23
|
+
"""
|
|
24
|
+
Solves for the rational nullspace of a matrix.
|
|
25
|
+
|
|
26
|
+
Args:
|
|
27
|
+
matrix (List[List[int]]): The matrix to evaluate.
|
|
28
|
+
rows (int): The number of rows.
|
|
29
|
+
cols (int): The number of columns.
|
|
30
|
+
transpose (bool): True if the matrix should be transposed before solving.
|
|
31
|
+
|
|
32
|
+
Returns:
|
|
33
|
+
List[List[int]]: A basis for the nullspace.
|
|
34
|
+
"""
|
|
35
|
+
work_rows, work_cols = (cols, rows) if transpose else (rows, cols)
|
|
36
|
+
if work_rows == 0 or work_cols == 0:
|
|
37
|
+
return []
|
|
38
|
+
|
|
39
|
+
a_mat = [[0] * work_cols for _ in range(work_rows)]
|
|
40
|
+
for r in range(work_rows):
|
|
41
|
+
for c in range(work_cols):
|
|
42
|
+
if transpose:
|
|
43
|
+
if c < len(matrix) and r < len(matrix[c]):
|
|
44
|
+
a_mat[r][c] = matrix[c][r]
|
|
45
|
+
else:
|
|
46
|
+
if r < len(matrix) and c < len(matrix[r]):
|
|
47
|
+
a_mat[r][c] = matrix[r][c]
|
|
48
|
+
|
|
49
|
+
pivot_row = [-1] * work_cols
|
|
50
|
+
is_free = [True] * work_cols
|
|
51
|
+
|
|
52
|
+
p = 0
|
|
53
|
+
c = 0
|
|
54
|
+
while c < work_cols and p < work_rows:
|
|
55
|
+
pr = p
|
|
56
|
+
found = False
|
|
57
|
+
while pr < work_rows:
|
|
58
|
+
if a_mat[pr][c] != 0:
|
|
59
|
+
found = True
|
|
60
|
+
break
|
|
61
|
+
pr += 1
|
|
62
|
+
|
|
63
|
+
if not found:
|
|
64
|
+
c += 1
|
|
65
|
+
continue
|
|
66
|
+
|
|
67
|
+
if pr != p:
|
|
68
|
+
a_mat[p], a_mat[pr] = a_mat[pr], a_mat[p]
|
|
69
|
+
|
|
70
|
+
pivot = a_mat[p][c]
|
|
71
|
+
is_free[c] = False
|
|
72
|
+
pivot_row[c] = p
|
|
73
|
+
|
|
74
|
+
for i in range(work_rows):
|
|
75
|
+
if i != p:
|
|
76
|
+
val_i = a_mat[i][c]
|
|
77
|
+
if val_i != 0:
|
|
78
|
+
g = math_gcd(pivot, val_i)
|
|
79
|
+
factor_p = val_i // g
|
|
80
|
+
factor_i = pivot // g
|
|
81
|
+
|
|
82
|
+
for j in range(work_cols):
|
|
83
|
+
a_mat[i][j] = factor_i * a_mat[i][j] - factor_p * a_mat[p][j]
|
|
84
|
+
|
|
85
|
+
# Simplify row i
|
|
86
|
+
r_gcd = 0
|
|
87
|
+
for j in range(work_cols):
|
|
88
|
+
r_gcd = math_gcd(r_gcd, a_mat[i][j])
|
|
89
|
+
if r_gcd > 1:
|
|
90
|
+
for j in range(work_cols):
|
|
91
|
+
a_mat[i][j] //= r_gcd
|
|
92
|
+
|
|
93
|
+
# Simplify pivot row
|
|
94
|
+
p_gcd = 0
|
|
95
|
+
for j in range(work_cols):
|
|
96
|
+
p_gcd = math_gcd(p_gcd, a_mat[p][j])
|
|
97
|
+
if p_gcd > 1:
|
|
98
|
+
for j in range(work_cols):
|
|
99
|
+
a_mat[p][j] //= p_gcd
|
|
100
|
+
|
|
101
|
+
p += 1
|
|
102
|
+
c += 1
|
|
103
|
+
|
|
104
|
+
# Back-Substitution & Basis Generation
|
|
105
|
+
basis_vectors = []
|
|
106
|
+
for f in range(work_cols):
|
|
107
|
+
if is_free[f]:
|
|
108
|
+
num_vec = [0] * work_cols
|
|
109
|
+
den_vec = [1] * work_cols
|
|
110
|
+
|
|
111
|
+
for j in range(work_cols):
|
|
112
|
+
if is_free[j]:
|
|
113
|
+
if j == f:
|
|
114
|
+
num_vec[j] = 1
|
|
115
|
+
den_vec[j] = 1
|
|
116
|
+
else:
|
|
117
|
+
num_vec[j] = 0
|
|
118
|
+
den_vec[j] = 1
|
|
119
|
+
else:
|
|
120
|
+
pr = pivot_row[j]
|
|
121
|
+
a_pr_j = a_mat[pr][j]
|
|
122
|
+
a_pr_f = a_mat[pr][f]
|
|
123
|
+
|
|
124
|
+
num = -a_pr_f
|
|
125
|
+
den = a_pr_j
|
|
126
|
+
if den < 0:
|
|
127
|
+
num = -num
|
|
128
|
+
den = -den
|
|
129
|
+
g = math_gcd(num, den)
|
|
130
|
+
num_vec[j] = num // g
|
|
131
|
+
den_vec[j] = den // g
|
|
132
|
+
|
|
133
|
+
# Find LCM of denominators
|
|
134
|
+
lcm = 1
|
|
135
|
+
for j in range(work_cols):
|
|
136
|
+
lcm = math_lcm(lcm, den_vec[j])
|
|
137
|
+
|
|
138
|
+
# Multiply by LCM to get integer vector
|
|
139
|
+
int_vec = [0] * work_cols
|
|
140
|
+
for j in range(work_cols):
|
|
141
|
+
int_vec[j] = num_vec[j] * (lcm // den_vec[j])
|
|
142
|
+
|
|
143
|
+
# Simplify vector by dividing by overall GCD
|
|
144
|
+
vec_gcd = 0
|
|
145
|
+
for j in range(work_cols):
|
|
146
|
+
vec_gcd = math_gcd(vec_gcd, int_vec[j])
|
|
147
|
+
if vec_gcd > 1:
|
|
148
|
+
for j in range(work_cols):
|
|
149
|
+
int_vec[j] //= vec_gcd
|
|
150
|
+
|
|
151
|
+
# Normalize direction
|
|
152
|
+
all_non_positive = True
|
|
153
|
+
for j in range(work_cols):
|
|
154
|
+
if int_vec[j] > 0:
|
|
155
|
+
all_non_positive = False
|
|
156
|
+
break
|
|
157
|
+
if all_non_positive:
|
|
158
|
+
for j in range(work_cols):
|
|
159
|
+
int_vec[j] = -int_vec[j]
|
|
160
|
+
|
|
161
|
+
basis_vectors.append(int_vec)
|
|
162
|
+
|
|
163
|
+
return basis_vectors
|
clm/layer0/mcard.py
ADDED
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
"""Layer 0: Stateless Kenotic MCard Data Entity.
|
|
2
|
+
|
|
3
|
+
Canonical Path: kernel/scripts/clm/layer0/mcard.py
|
|
4
|
+
Parity: Rust `src/layer0/mcard.rs`, TypeScript `src/layer0/mcard.ts`
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
from dataclasses import dataclass, field
|
|
10
|
+
from typing import Any
|
|
11
|
+
|
|
12
|
+
from clm.layer0.codec import canonical_json
|
|
13
|
+
from clm.layer0.hash import compute_blake3, verify_hash
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
@dataclass(frozen=True)
|
|
17
|
+
class MCardPayload:
|
|
18
|
+
kind: str # 'Scalar', 'Text', 'Binary', 'Structured', 'Uri'
|
|
19
|
+
value: Any
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
@dataclass
|
|
23
|
+
class MCard:
|
|
24
|
+
uri: str
|
|
25
|
+
hash: str
|
|
26
|
+
payload: MCardPayload
|
|
27
|
+
author: str
|
|
28
|
+
sequence: int = 0
|
|
29
|
+
metadata: dict[str, Any] = field(default_factory=dict)
|
|
30
|
+
|
|
31
|
+
def to_canonical_bytes(self) -> bytes:
|
|
32
|
+
return to_canonical_bytes(self)
|
|
33
|
+
|
|
34
|
+
def verify_integrity(self) -> bool:
|
|
35
|
+
return verify_mcard_integrity(self)
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def payload_to_bytes(payload: MCardPayload) -> bytes:
|
|
39
|
+
"""Serializes payload to deterministic bytes for cryptographic hashing."""
|
|
40
|
+
kind = payload.kind
|
|
41
|
+
if kind == "Text":
|
|
42
|
+
return payload.value.encode("utf-8")
|
|
43
|
+
elif kind == "Binary":
|
|
44
|
+
data = payload.value.get("data") if isinstance(payload.value, dict) else payload.value
|
|
45
|
+
return data if isinstance(data, bytes) else bytes(data)
|
|
46
|
+
elif kind in ("Scalar", "Structured"):
|
|
47
|
+
return canonical_json(payload.value).encode("utf-8")
|
|
48
|
+
elif kind == "Uri":
|
|
49
|
+
return payload.value.encode("utf-8")
|
|
50
|
+
else:
|
|
51
|
+
return str(payload.value).encode("utf-8")
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def create_mcard(
|
|
55
|
+
uri: str,
|
|
56
|
+
payload: MCardPayload,
|
|
57
|
+
author: str,
|
|
58
|
+
sequence: int = 0,
|
|
59
|
+
metadata: dict[str, Any] | None = None,
|
|
60
|
+
) -> MCard:
|
|
61
|
+
"""Constructs a new immutable MCard, computing its BLAKE3 hash from payload."""
|
|
62
|
+
payload_bytes = payload_to_bytes(payload)
|
|
63
|
+
h = compute_blake3(payload_bytes)
|
|
64
|
+
return MCard(
|
|
65
|
+
uri=uri,
|
|
66
|
+
hash=h,
|
|
67
|
+
payload=payload,
|
|
68
|
+
author=author,
|
|
69
|
+
sequence=sequence,
|
|
70
|
+
metadata=metadata if metadata is not None else {},
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def verify_mcard_integrity(card: MCard) -> bool:
|
|
75
|
+
"""Verifies that the MCard hash matches its underlying payload."""
|
|
76
|
+
payload_bytes = payload_to_bytes(card.payload)
|
|
77
|
+
return verify_hash(payload_bytes, card.hash)
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def to_canonical_bytes(card: MCard) -> bytes:
|
|
81
|
+
"""Serializes the entire MCard into canonical JSON UTF-8 bytes."""
|
|
82
|
+
card_dict = {
|
|
83
|
+
"uri": card.uri,
|
|
84
|
+
"hash": card.hash,
|
|
85
|
+
"payload": {
|
|
86
|
+
"kind": card.payload.kind,
|
|
87
|
+
"value": card.payload.value if card.payload.kind != "Binary" else {
|
|
88
|
+
"mime_type": card.payload.value.get("mime_type", "application/octet-stream"),
|
|
89
|
+
"data": list(card.payload.value.get("data", b"")),
|
|
90
|
+
},
|
|
91
|
+
},
|
|
92
|
+
"metadata": card.metadata,
|
|
93
|
+
"author": card.author,
|
|
94
|
+
"sequence": card.sequence,
|
|
95
|
+
}
|
|
96
|
+
return canonical_json(card_dict).encode("utf-8")
|
|
File without changes
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
"""Declarative Action Manifest Domain Models (Sprint 392 / DEL-392-01).
|
|
2
|
+
|
|
3
|
+
Implements Pydantic V2 domain models for canonical CLM Action specifications (clm.action.v1).
|
|
4
|
+
An Action represents a temporal morphism (the C face of the Operational Triad)
|
|
5
|
+
operating on spatial carrier MCards (A face) and bracketed by Hoare invariants (B face).
|
|
6
|
+
|
|
7
|
+
Zero dependencies on Layer 1 through Layer 5.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
import json
|
|
13
|
+
from pathlib import Path
|
|
14
|
+
from typing import Any, Literal
|
|
15
|
+
|
|
16
|
+
import yaml
|
|
17
|
+
from pydantic import BaseModel, ConfigDict, Field, field_validator
|
|
18
|
+
|
|
19
|
+
ActionFormat = Literal[
|
|
20
|
+
"csv",
|
|
21
|
+
"json",
|
|
22
|
+
"yaml",
|
|
23
|
+
"markdown",
|
|
24
|
+
"text",
|
|
25
|
+
"binary",
|
|
26
|
+
"media",
|
|
27
|
+
"image",
|
|
28
|
+
"audio",
|
|
29
|
+
"model3d",
|
|
30
|
+
]
|
|
31
|
+
|
|
32
|
+
BaldwinOperator = Literal[
|
|
33
|
+
"split",
|
|
34
|
+
"substitute",
|
|
35
|
+
"augment",
|
|
36
|
+
"exclude",
|
|
37
|
+
"invert",
|
|
38
|
+
"port",
|
|
39
|
+
"custom",
|
|
40
|
+
]
|
|
41
|
+
|
|
42
|
+
ActionRuntime = Literal[
|
|
43
|
+
"builtin",
|
|
44
|
+
"python",
|
|
45
|
+
"cel",
|
|
46
|
+
"shell",
|
|
47
|
+
"wasm",
|
|
48
|
+
]
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
class ActionMetadata(BaseModel):
|
|
52
|
+
"""Metadata block identifying the Action and its algebraic role in CLM."""
|
|
53
|
+
|
|
54
|
+
model_config = ConfigDict(frozen=True, extra="forbid")
|
|
55
|
+
|
|
56
|
+
type: Literal["action", "pcard_action"] = "action"
|
|
57
|
+
name: str = Field(..., pattern=r"^[a-z0-9_\-]+$")
|
|
58
|
+
description: str | None = None
|
|
59
|
+
face: Literal["C", "concrete_impl"] = "C"
|
|
60
|
+
operator: BaldwinOperator
|
|
61
|
+
author: str = "did:clm:system"
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
class ActionInput(BaseModel):
|
|
65
|
+
"""Specification of an input MCard bound to the Action."""
|
|
66
|
+
|
|
67
|
+
model_config = ConfigDict(frozen=True, extra="forbid")
|
|
68
|
+
|
|
69
|
+
name: str
|
|
70
|
+
uri: str | None = None
|
|
71
|
+
format: ActionFormat | None = None
|
|
72
|
+
required: bool = True
|
|
73
|
+
description: str | None = None
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
class ActionPrecondition(BaseModel):
|
|
77
|
+
"""Precondition invariant rule (V_pre Gate) verified before Action execution."""
|
|
78
|
+
|
|
79
|
+
model_config = ConfigDict(frozen=True, extra="forbid")
|
|
80
|
+
|
|
81
|
+
invariant: str
|
|
82
|
+
rule: str
|
|
83
|
+
schema_ref: str | None = None
|
|
84
|
+
description: str | None = None
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
class ActionOperation(BaseModel):
|
|
88
|
+
"""Algebraic operation definition specifying the Baldwin operator and parameters."""
|
|
89
|
+
|
|
90
|
+
model_config = ConfigDict(frozen=True, extra="forbid")
|
|
91
|
+
|
|
92
|
+
operator: BaldwinOperator
|
|
93
|
+
strategy: str | None = None
|
|
94
|
+
parameters: dict[str, Any] = Field(default_factory=dict)
|
|
95
|
+
runtime: ActionRuntime = "builtin"
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
class ActionPostcondition(BaseModel):
|
|
99
|
+
"""Postcondition invariant rule (V_post Witness) verified before committing output."""
|
|
100
|
+
|
|
101
|
+
model_config = ConfigDict(frozen=True, extra="forbid")
|
|
102
|
+
|
|
103
|
+
invariant: str
|
|
104
|
+
rule: str
|
|
105
|
+
schema_ref: str | None = None
|
|
106
|
+
description: str | None = None
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
class ActionOutput(BaseModel):
|
|
110
|
+
"""Specification of an output MCard emitted by the Action."""
|
|
111
|
+
|
|
112
|
+
model_config = ConfigDict(frozen=True, extra="forbid")
|
|
113
|
+
|
|
114
|
+
name: str
|
|
115
|
+
handle: str | None = None
|
|
116
|
+
format: ActionFormat | None = None
|
|
117
|
+
description: str | None = None
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
class ActionManifest(BaseModel):
|
|
121
|
+
"""Canonical Declarative Action Manifest (clm.action.v1).
|
|
122
|
+
|
|
123
|
+
Encapsulates inputs, Hoare preconditions (V_pre), Baldwin algebraic operation,
|
|
124
|
+
Hoare postconditions (V_post), and outputs.
|
|
125
|
+
"""
|
|
126
|
+
|
|
127
|
+
model_config = ConfigDict(frozen=True, extra="forbid")
|
|
128
|
+
|
|
129
|
+
version: Literal["1.0", "1.0.0"] = "1.0"
|
|
130
|
+
clm: ActionMetadata
|
|
131
|
+
inputs: list[ActionInput] = Field(..., min_length=1)
|
|
132
|
+
preconditions: list[ActionPrecondition] = Field(default_factory=list)
|
|
133
|
+
operation: ActionOperation
|
|
134
|
+
postconditions: list[ActionPostcondition] = Field(default_factory=list)
|
|
135
|
+
outputs: list[ActionOutput] = Field(..., min_length=1)
|
|
136
|
+
|
|
137
|
+
@field_validator("operation")
|
|
138
|
+
@classmethod
|
|
139
|
+
def validate_operator_congruence(cls, v: ActionOperation, info: Any) -> ActionOperation:
|
|
140
|
+
"""Validate that clm.operator and operation.operator are congruent."""
|
|
141
|
+
clm_meta = info.data.get("clm")
|
|
142
|
+
if clm_meta and isinstance(clm_meta, ActionMetadata):
|
|
143
|
+
if clm_meta.operator != v.operator:
|
|
144
|
+
raise ValueError(
|
|
145
|
+
f"Operator mismatch: clm.operator='{clm_meta.operator}' != operation.operator='{v.operator}'"
|
|
146
|
+
)
|
|
147
|
+
return v
|
|
148
|
+
|
|
149
|
+
@classmethod
|
|
150
|
+
def from_dict(cls, data: dict[str, Any]) -> ActionManifest:
|
|
151
|
+
"""Parse an ActionManifest from a Python dictionary."""
|
|
152
|
+
return cls(**data)
|
|
153
|
+
|
|
154
|
+
@classmethod
|
|
155
|
+
def from_yaml(cls, yaml_content: str | Path) -> ActionManifest:
|
|
156
|
+
"""Parse an ActionManifest from a YAML string or file path."""
|
|
157
|
+
if isinstance(yaml_content, Path):
|
|
158
|
+
return cls.from_yaml_file(yaml_content)
|
|
159
|
+
if isinstance(yaml_content, str):
|
|
160
|
+
# If it's a short string without newlines that points to an existing file
|
|
161
|
+
if "\n" not in yaml_content and len(yaml_content) < 260:
|
|
162
|
+
try:
|
|
163
|
+
p = Path(yaml_content)
|
|
164
|
+
if p.is_file():
|
|
165
|
+
return cls.from_yaml_file(p)
|
|
166
|
+
except OSError:
|
|
167
|
+
pass
|
|
168
|
+
data = yaml.safe_load(yaml_content)
|
|
169
|
+
if not isinstance(data, dict):
|
|
170
|
+
raise ValueError("YAML content does not represent a valid dictionary")
|
|
171
|
+
return cls(**data)
|
|
172
|
+
raise TypeError(f"Expected str or Path, got {type(yaml_content)}")
|
|
173
|
+
|
|
174
|
+
@classmethod
|
|
175
|
+
def from_yaml_file(cls, path: str | Path) -> ActionManifest:
|
|
176
|
+
"""Parse an ActionManifest from a YAML file path."""
|
|
177
|
+
p = Path(path)
|
|
178
|
+
raw = p.read_text(encoding="utf-8")
|
|
179
|
+
data = yaml.safe_load(raw)
|
|
180
|
+
if not isinstance(data, dict):
|
|
181
|
+
raise ValueError(f"File {path} does not contain a valid YAML dictionary")
|
|
182
|
+
return cls(**data)
|
|
183
|
+
|
|
184
|
+
@classmethod
|
|
185
|
+
def from_json(cls, json_content: str | Path) -> ActionManifest:
|
|
186
|
+
"""Parse an ActionManifest from a JSON string or file path."""
|
|
187
|
+
if isinstance(json_content, Path):
|
|
188
|
+
return cls.from_json_file(json_content)
|
|
189
|
+
if isinstance(json_content, str):
|
|
190
|
+
if "\n" not in json_content and not json_content.strip().startswith("{") and len(json_content) < 260:
|
|
191
|
+
try:
|
|
192
|
+
p = Path(json_content)
|
|
193
|
+
if p.is_file():
|
|
194
|
+
return cls.from_json_file(p)
|
|
195
|
+
except OSError:
|
|
196
|
+
pass
|
|
197
|
+
data = json.loads(json_content)
|
|
198
|
+
if not isinstance(data, dict):
|
|
199
|
+
raise ValueError("JSON content does not represent a valid dictionary")
|
|
200
|
+
return cls(**data)
|
|
201
|
+
raise TypeError(f"Expected str or Path, got {type(json_content)}")
|
|
202
|
+
|
|
203
|
+
@classmethod
|
|
204
|
+
def from_json_file(cls, path: str | Path) -> ActionManifest:
|
|
205
|
+
"""Parse an ActionManifest from a JSON file path."""
|
|
206
|
+
p = Path(path)
|
|
207
|
+
raw = p.read_text(encoding="utf-8")
|
|
208
|
+
data = json.loads(raw)
|
|
209
|
+
if not isinstance(data, dict):
|
|
210
|
+
raise ValueError(f"File {path} does not contain a valid JSON dictionary")
|
|
211
|
+
return cls(**data)
|
|
212
|
+
|
|
213
|
+
def to_dict(self) -> dict[str, Any]:
|
|
214
|
+
"""Convert manifest to Python dictionary."""
|
|
215
|
+
return self.model_dump(exclude_none=True)
|
|
216
|
+
|
|
217
|
+
def to_yaml(self) -> str:
|
|
218
|
+
"""Convert manifest to YAML string."""
|
|
219
|
+
return yaml.dump(self.to_dict(), sort_keys=False)
|
|
220
|
+
|
|
221
|
+
def to_json(self, indent: int = 2) -> str:
|
|
222
|
+
"""Convert manifest to formatted JSON string."""
|
|
223
|
+
return json.dumps(self.to_dict(), indent=indent)
|