chronaxis 0.1.0.dev0__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 (917) hide show
  1. chronaxis/__init__.py +72 -0
  2. chronaxis/__main__.py +12 -0
  3. chronaxis/analysis_cli.py +181 -0
  4. chronaxis/batch/__init__.py +14 -0
  5. chronaxis/batch/api.py +46 -0
  6. chronaxis/batch/cli.py +48 -0
  7. chronaxis/batch/config.py +37 -0
  8. chronaxis/batch/models.py +202 -0
  9. chronaxis/batch/process_transport.py +149 -0
  10. chronaxis/batch/process_tree.py +72 -0
  11. chronaxis/batch/publication.py +41 -0
  12. chronaxis/batch/runner.py +236 -0
  13. chronaxis/batch/templates.py +42 -0
  14. chronaxis/can_dependencies.py +42 -0
  15. chronaxis/cli.py +193 -0
  16. chronaxis/configuration/__init__.py +46 -0
  17. chronaxis/configuration/cli.py +41 -0
  18. chronaxis/configuration/diagnostics.py +107 -0
  19. chronaxis/configuration/explanation.py +233 -0
  20. chronaxis/configuration/file_tools.py +140 -0
  21. chronaxis/configuration/imports.py +144 -0
  22. chronaxis/configuration/initialization.py +36 -0
  23. chronaxis/configuration/json_parser.py +114 -0
  24. chronaxis/configuration/models.py +74 -0
  25. chronaxis/configuration/origins.py +90 -0
  26. chronaxis/configuration/overrides.py +55 -0
  27. chronaxis/configuration/resolution.py +150 -0
  28. chronaxis/configuration/template_catalog.py +68 -0
  29. chronaxis/configuration/templates/batch/analysis-annotated.yaml +18 -0
  30. chronaxis/configuration/templates/batch/analysis-minimal.yaml +18 -0
  31. chronaxis/configuration/templates/batch/annotated.yaml +6 -0
  32. chronaxis/configuration/templates/batch/minimal.yaml +6 -0
  33. chronaxis/configuration/templates/can-asc/annotated.yaml +18 -0
  34. chronaxis/configuration/templates/can-asc/minimal.yaml +18 -0
  35. chronaxis/configuration/templates/can-blf/annotated.yaml +18 -0
  36. chronaxis/configuration/templates/can-blf/minimal.yaml +18 -0
  37. chronaxis/configuration/templates/can-export/annotated.yaml +23 -0
  38. chronaxis/configuration/templates/can-export/minimal.yaml +23 -0
  39. chronaxis/configuration/templates/catalog.json +233 -0
  40. chronaxis/configuration/templates/charge-session/annotated.yaml +38 -0
  41. chronaxis/configuration/templates/charge-session/minimal.yaml +38 -0
  42. chronaxis/configuration/templates/command-response/annotated.yaml +32 -0
  43. chronaxis/configuration/templates/command-response/minimal.yaml +36 -0
  44. chronaxis/configuration/templates/fault-window/annotated.yaml +25 -0
  45. chronaxis/configuration/templates/fault-window/minimal.yaml +27 -0
  46. chronaxis/configuration/templates/ini-mapping/annotated.yaml +20 -0
  47. chronaxis/configuration/templates/ini-mapping/minimal.yaml +20 -0
  48. chronaxis/configuration/templates/raw-can-csv/annotated.yaml +34 -0
  49. chronaxis/configuration/templates/raw-can-csv/minimal.yaml +35 -0
  50. chronaxis/configuration/templates/shared/charge-session.asc +5 -0
  51. chronaxis/configuration/templates/shared/command-response.asc +8 -0
  52. chronaxis/configuration/templates/shared/fault-window.asc +5 -0
  53. chronaxis/configuration/templates/shared/power.asc +7 -0
  54. chronaxis/configuration/templates/shared/sample.asc +6 -0
  55. chronaxis/configuration/templates/shared/sample.blf +0 -0
  56. chronaxis/configuration/templates/shared/sample.csv +5 -0
  57. chronaxis/configuration/templates/shared/sample.dbc +11 -0
  58. chronaxis/configuration/templates/shared/signals.csv +6 -0
  59. chronaxis/configuration/templates/shared/source.ini +5 -0
  60. chronaxis/configuration/templates/shared/stability.asc +9 -0
  61. chronaxis/configuration/templates/shared/teaching.dbc +27 -0
  62. chronaxis/configuration/templates/shared/threshold.asc +7 -0
  63. chronaxis/configuration/templates/signal-csv/annotated.yaml +27 -0
  64. chronaxis/configuration/templates/signal-csv/minimal.yaml +27 -0
  65. chronaxis/configuration/templates/signal-export/annotated.yaml +27 -0
  66. chronaxis/configuration/templates/signal-export/minimal.yaml +29 -0
  67. chronaxis/configuration/templates/stability/annotated.yaml +35 -0
  68. chronaxis/configuration/templates/stability/minimal.yaml +35 -0
  69. chronaxis/configuration/templates/threshold/annotated.yaml +22 -0
  70. chronaxis/configuration/templates/threshold/minimal.yaml +22 -0
  71. chronaxis/configuration/yaml_parser.py +125 -0
  72. chronaxis/core/__init__.py +71 -0
  73. chronaxis/core/binding.py +449 -0
  74. chronaxis/core/calculation_series_join.py +106 -0
  75. chronaxis/core/calculations.py +435 -0
  76. chronaxis/core/calculations_memory_numpy.py +136 -0
  77. chronaxis/core/calculations_memory_reference.py +165 -0
  78. chronaxis/core/calculations_numpy.py +298 -0
  79. chronaxis/core/calculations_reference.py +294 -0
  80. chronaxis/core/condition_evidence.py +182 -0
  81. chronaxis/core/conditional_integral_result.py +43 -0
  82. chronaxis/core/conditional_integral_terms.py +146 -0
  83. chronaxis/core/conditional_integral_terms_numpy.py +148 -0
  84. chronaxis/core/conditional_integral_terms_reference.py +111 -0
  85. chronaxis/core/conditional_time_reduction.py +118 -0
  86. chronaxis/core/conditional_time_reduction_numpy.py +223 -0
  87. chronaxis/core/conditional_time_reduction_reference.py +213 -0
  88. chronaxis/core/declarations.py +192 -0
  89. chronaxis/core/decoded_binding.py +197 -0
  90. chronaxis/core/direct_message.py +387 -0
  91. chronaxis/core/export_interpolation.py +54 -0
  92. chronaxis/core/expression.py +642 -0
  93. chronaxis/core/expression_numpy.py +314 -0
  94. chronaxis/core/expression_reference.py +272 -0
  95. chronaxis/core/integral_result.py +53 -0
  96. chronaxis/core/integral_sum.py +77 -0
  97. chronaxis/core/integral_sum_numpy.py +224 -0
  98. chronaxis/core/integral_sum_reference.py +148 -0
  99. chronaxis/core/integral_terms.py +119 -0
  100. chronaxis/core/integral_terms_numpy.py +127 -0
  101. chronaxis/core/integral_terms_reference.py +91 -0
  102. chronaxis/core/mean_weights_numpy.py +29 -0
  103. chronaxis/core/mean_weights_reference.py +27 -0
  104. chronaxis/core/message_binding.py +305 -0
  105. chronaxis/core/models.py +485 -0
  106. chronaxis/core/normalize_numpy.py +396 -0
  107. chronaxis/core/numeric.py +472 -0
  108. chronaxis/core/numeric_numpy.py +440 -0
  109. chronaxis/core/record_intervals.py +115 -0
  110. chronaxis/core/sample_reduction.py +161 -0
  111. chronaxis/core/sample_reduction_numpy.py +160 -0
  112. chronaxis/core/sample_reduction_reference.py +154 -0
  113. chronaxis/core/selection.py +74 -0
  114. chronaxis/core/sequence.py +160 -0
  115. chronaxis/core/sequence_reference.py +248 -0
  116. chronaxis/core/stability.py +249 -0
  117. chronaxis/core/start_end.py +169 -0
  118. chronaxis/core/state.py +494 -0
  119. chronaxis/core/state_numpy.py +296 -0
  120. chronaxis/core/temporal.py +373 -0
  121. chronaxis/core/temporal_clock.py +25 -0
  122. chronaxis/core/temporal_memory_numpy.py +163 -0
  123. chronaxis/core/temporal_memory_reference.py +161 -0
  124. chronaxis/core/temporal_numpy.py +345 -0
  125. chronaxis/core/temporal_reference.py +304 -0
  126. chronaxis/core/time_reduction.py +190 -0
  127. chronaxis/core/time_reduction_numpy.py +205 -0
  128. chronaxis/core/time_reduction_reference.py +203 -0
  129. chronaxis/core/types.py +105 -0
  130. chronaxis/core/units.py +81 -0
  131. chronaxis/core/validation.py +94 -0
  132. chronaxis/core/window_delta.py +123 -0
  133. chronaxis/core/window_delta_numpy.py +78 -0
  134. chronaxis/core/window_delta_reference.py +69 -0
  135. chronaxis/core/windows.py +224 -0
  136. chronaxis/core/windows_numpy.py +78 -0
  137. chronaxis/core/windows_reference.py +61 -0
  138. chronaxis/execution/__init__.py +6 -0
  139. chronaxis/execution/batch_signal_groups.py +122 -0
  140. chronaxis/execution/bindings.py +296 -0
  141. chronaxis/execution/boundaries.py +568 -0
  142. chronaxis/execution/calculation_blocks.py +338 -0
  143. chronaxis/execution/calculation_values.py +55 -0
  144. chronaxis/execution/can_batch_reader.py +356 -0
  145. chronaxis/execution/can_reader.py +948 -0
  146. chronaxis/execution/can_reference_template.py +61 -0
  147. chronaxis/execution/condition_evidence.py +370 -0
  148. chronaxis/execution/conditional_integral_facts.py +310 -0
  149. chronaxis/execution/conditional_integral_reduction.py +216 -0
  150. chronaxis/execution/csv_observation.py +524 -0
  151. chronaxis/execution/csv_reader.py +662 -0
  152. chronaxis/execution/current_message_calculation.py +225 -0
  153. chronaxis/execution/driver_expression.py +274 -0
  154. chronaxis/execution/expressions.py +618 -0
  155. chronaxis/execution/frame_capture.py +245 -0
  156. chronaxis/execution/groups.py +236 -0
  157. chronaxis/execution/historical_conditional_blocks.py +264 -0
  158. chronaxis/execution/historical_conditional_integral.py +226 -0
  159. chronaxis/execution/historical_conditional_time_calculation.py +368 -0
  160. chronaxis/execution/historical_integral.py +219 -0
  161. chronaxis/execution/historical_observation.py +372 -0
  162. chronaxis/execution/historical_sample_calculation.py +338 -0
  163. chronaxis/execution/historical_selection_rows.py +300 -0
  164. chronaxis/execution/historical_time_calculation.py +341 -0
  165. chronaxis/execution/history.py +572 -0
  166. chronaxis/execution/history_records.py +225 -0
  167. chronaxis/execution/hold.py +448 -0
  168. chronaxis/execution/integral_facts.py +311 -0
  169. chronaxis/execution/integral_reduction.py +216 -0
  170. chronaxis/execution/legacy_frame_samples.py +94 -0
  171. chronaxis/execution/memory_reader.py +247 -0
  172. chronaxis/execution/message_bindings.py +293 -0
  173. chronaxis/execution/message_delivery.py +37 -0
  174. chronaxis/execution/observed_ingestion.py +551 -0
  175. chronaxis/execution/raw_signal_groups.py +192 -0
  176. chronaxis/execution/record_alarm_duration.py +114 -0
  177. chronaxis/execution/record_delta_condition.py +167 -0
  178. chronaxis/execution/record_diagnostics.py +87 -0
  179. chronaxis/execution/record_event_durations.py +143 -0
  180. chronaxis/execution/record_export_samples.py +94 -0
  181. chronaxis/execution/record_exports.py +155 -0
  182. chronaxis/execution/record_integral.py +196 -0
  183. chronaxis/execution/record_point_buffer.py +101 -0
  184. chronaxis/execution/record_rule_timeline.py +344 -0
  185. chronaxis/execution/record_sample.py +46 -0
  186. chronaxis/execution/record_sample_series.py +29 -0
  187. chronaxis/execution/record_scope_calculations.py +290 -0
  188. chronaxis/execution/record_selection.py +62 -0
  189. chronaxis/execution/record_sequences.py +199 -0
  190. chronaxis/execution/record_session_calculations.py +778 -0
  191. chronaxis/execution/record_signal_export.py +133 -0
  192. chronaxis/execution/record_source_cursor.py +295 -0
  193. chronaxis/execution/record_time_calculation.py +322 -0
  194. chronaxis/execution/record_time_indexes.py +143 -0
  195. chronaxis/execution/record_value_history.py +160 -0
  196. chronaxis/execution/record_windows.py +229 -0
  197. chronaxis/execution/required_expression.py +52 -0
  198. chronaxis/execution/retained_metadata.py +71 -0
  199. chronaxis/execution/run_session.py +402 -0
  200. chronaxis/execution/scanned_signal_proof.py +550 -0
  201. chronaxis/execution/signal_validity.py +40 -0
  202. chronaxis/execution/state.py +280 -0
  203. chronaxis/execution/temporal_buffer.py +508 -0
  204. chronaxis/execution/text_can_reader.py +359 -0
  205. chronaxis/execution/timeline.py +309 -0
  206. chronaxis/execution/timeline_multi.py +415 -0
  207. chronaxis/execution/window_delta_events.py +220 -0
  208. chronaxis/execution/window_replay.py +350 -0
  209. chronaxis/execution/windows.py +173 -0
  210. chronaxis/guide/README.md +70 -0
  211. chronaxis/guide/api/AnalysisError.md +14 -0
  212. chronaxis/guide/api/AnalysisPlan.md +96 -0
  213. chronaxis/guide/api/AnalysisResult.md +398 -0
  214. chronaxis/guide/api/AnalysisRunner.md +155 -0
  215. chronaxis/guide/api/BatchJob.md +19 -0
  216. chronaxis/guide/api/BatchJobResult.md +61 -0
  217. chronaxis/guide/api/BatchPlan.md +48 -0
  218. chronaxis/guide/api/BatchReport.md +108 -0
  219. chronaxis/guide/api/BatchRunner.md +84 -0
  220. chronaxis/guide/api/OutputManifest.md +23 -0
  221. chronaxis/guide/api/PlanFragment.md +47 -0
  222. chronaxis/guide/api/PlanValidationError.md +98 -0
  223. chronaxis/guide/api/PresetSpec.md +63 -0
  224. chronaxis/guide/api/ResultClosedError.md +14 -0
  225. chronaxis/guide/api/RunMetadata.md +100 -0
  226. chronaxis/guide/api/TimeConversion.md +29 -0
  227. chronaxis/guide/api/TimeOverflowError.md +17 -0
  228. chronaxis/guide/api/build_preset.md +36 -0
  229. chronaxis/guide/api/checked_add_ns.md +30 -0
  230. chronaxis/guide/api/convert_time.md +40 -0
  231. chronaxis/guide/api/explain_analysis_plan.md +38 -0
  232. chronaxis/guide/api/index.json +185 -0
  233. chronaxis/guide/api/load_analysis_plan.md +34 -0
  234. chronaxis/guide/api/load_batch_plan.md +36 -0
  235. chronaxis/guide/api/parse_datetime_ns.md +35 -0
  236. chronaxis/guide/api/parse_duration.md +30 -0
  237. chronaxis/guide/api/resolve_preset_roles.md +37 -0
  238. chronaxis/guide/api/run_batch.md +38 -0
  239. chronaxis/guide/api/shift_times_reference.md +33 -0
  240. chronaxis/guide/api/time_deltas_reference.md +37 -0
  241. chronaxis/guide/api/validate_analysis_plan.md +38 -0
  242. chronaxis/guide/en/README.md +74 -0
  243. chronaxis/guide/en/api/AnalysisError.md +14 -0
  244. chronaxis/guide/en/api/AnalysisPlan.md +93 -0
  245. chronaxis/guide/en/api/AnalysisResult.md +398 -0
  246. chronaxis/guide/en/api/AnalysisRunner.md +191 -0
  247. chronaxis/guide/en/api/BatchJob.md +17 -0
  248. chronaxis/guide/en/api/BatchJobResult.md +43 -0
  249. chronaxis/guide/en/api/BatchPlan.md +37 -0
  250. chronaxis/guide/en/api/BatchReport.md +52 -0
  251. chronaxis/guide/en/api/BatchRunner.md +51 -0
  252. chronaxis/guide/en/api/OutputManifest.md +23 -0
  253. chronaxis/guide/en/api/PlanFragment.md +33 -0
  254. chronaxis/guide/en/api/PlanValidationError.md +58 -0
  255. chronaxis/guide/en/api/PresetSpec.md +51 -0
  256. chronaxis/guide/en/api/ResultClosedError.md +14 -0
  257. chronaxis/guide/en/api/RunMetadata.md +100 -0
  258. chronaxis/guide/en/api/TimeConversion.md +23 -0
  259. chronaxis/guide/en/api/TimeOverflowError.md +14 -0
  260. chronaxis/guide/en/api/build_preset.md +23 -0
  261. chronaxis/guide/en/api/checked_add_ns.md +21 -0
  262. chronaxis/guide/en/api/convert_time.md +25 -0
  263. chronaxis/guide/en/api/explain_analysis_plan.md +30 -0
  264. chronaxis/guide/en/api/index.json +185 -0
  265. chronaxis/guide/en/api/load_analysis_plan.md +27 -0
  266. chronaxis/guide/en/api/load_batch_plan.md +28 -0
  267. chronaxis/guide/en/api/parse_datetime_ns.md +23 -0
  268. chronaxis/guide/en/api/parse_duration.md +20 -0
  269. chronaxis/guide/en/api/resolve_preset_roles.md +23 -0
  270. chronaxis/guide/en/api/run_batch.md +39 -0
  271. chronaxis/guide/en/api/shift_times_reference.md +21 -0
  272. chronaxis/guide/en/api/time_deltas_reference.md +22 -0
  273. chronaxis/guide/en/api/validate_analysis_plan.md +29 -0
  274. chronaxis/guide/en/fields/analysis/calculations-all-1.json +345 -0
  275. chronaxis/guide/en/fields/analysis/calculations-all-2.json +300 -0
  276. chronaxis/guide/en/fields/analysis/calculations-all-3.json +84 -0
  277. chronaxis/guide/en/fields/analysis/config_version-all-1.json +24 -0
  278. chronaxis/guide/en/fields/analysis/dataset-all-1.json +344 -0
  279. chronaxis/guide/en/fields/analysis/derived-all-1.json +147 -0
  280. chronaxis/guide/en/fields/analysis/diagnostics-all-1.json +69 -0
  281. chronaxis/guide/en/fields/analysis/execution-all-1.json +167 -0
  282. chronaxis/guide/en/fields/analysis/imports-all-1.json +39 -0
  283. chronaxis/guide/en/fields/analysis/intervals-all-1.json +173 -0
  284. chronaxis/guide/en/fields/analysis/message_calculations-all-1.json +345 -0
  285. chronaxis/guide/en/fields/analysis/message_calculations-all-2.json +270 -0
  286. chronaxis/guide/en/fields/analysis/metadata-all-1.json +24 -0
  287. chronaxis/guide/en/fields/analysis/outputs-all-1.json +332 -0
  288. chronaxis/guide/en/fields/analysis/outputs-all-2.json +319 -0
  289. chronaxis/guide/en/fields/analysis/outputs-all-3.json +321 -0
  290. chronaxis/guide/en/fields/analysis/outputs-all-4.json +236 -0
  291. chronaxis/guide/en/fields/analysis/outputs-all-5.json +246 -0
  292. chronaxis/guide/en/fields/analysis/outputs-all-6.json +214 -0
  293. chronaxis/guide/en/fields/analysis/overrides-all-1.json +104 -0
  294. chronaxis/guide/en/fields/analysis/presets-charge_session-1.json +398 -0
  295. chronaxis/guide/en/fields/analysis/presets-charge_session-2.json +114 -0
  296. chronaxis/guide/en/fields/analysis/presets-command_response-1.json +376 -0
  297. chronaxis/guide/en/fields/analysis/presets-fault_context-1.json +285 -0
  298. chronaxis/guide/en/fields/analysis/presets-threshold_excursion-1.json +317 -0
  299. chronaxis/guide/en/fields/analysis/rules-condition_duration-1.json +344 -0
  300. chronaxis/guide/en/fields/analysis/rules-condition_duration-2.json +27 -0
  301. chronaxis/guide/en/fields/analysis/rules-debounce-1.json +335 -0
  302. chronaxis/guide/en/fields/analysis/rules-falling_edge-1.json +317 -0
  303. chronaxis/guide/en/fields/analysis/rules-hysteresis-1.json +334 -0
  304. chronaxis/guide/en/fields/analysis/rules-hysteresis-2.json +27 -0
  305. chronaxis/guide/en/fields/analysis/rules-rising_edge-1.json +317 -0
  306. chronaxis/guide/en/fields/analysis/rules-start_end-1.json +333 -0
  307. chronaxis/guide/en/fields/analysis/rules-start_end-2.json +60 -0
  308. chronaxis/guide/en/fields/analysis/rules-start_only-1.json +334 -0
  309. chronaxis/guide/en/fields/analysis/rules-window_delta-1.json +338 -0
  310. chronaxis/guide/en/fields/analysis/rules-window_delta-2.json +96 -0
  311. chronaxis/guide/en/fields/analysis/sequences-all-1.json +378 -0
  312. chronaxis/guide/en/fields/analysis/sequences-all-2.json +70 -0
  313. chronaxis/guide/en/fields/analysis/signals-variant-1-1.json +349 -0
  314. chronaxis/guide/en/fields/analysis/signals-variant-1-2.json +297 -0
  315. chronaxis/guide/en/fields/analysis/signals-variant-1-3.json +323 -0
  316. chronaxis/guide/en/fields/analysis/signals-variant-1-4.json +192 -0
  317. chronaxis/guide/en/fields/analysis/signals-variant-2-1.json +327 -0
  318. chronaxis/guide/en/fields/analysis/signals-variant-2-2.json +312 -0
  319. chronaxis/guide/en/fields/analysis/signals-variant-2-3.json +294 -0
  320. chronaxis/guide/en/fields/analysis/signals-variant-2-4.json +253 -0
  321. chronaxis/guide/en/fields/analysis/signals-variant-2-5.json +44 -0
  322. chronaxis/guide/en/fields/analysis/sources-can_asc-1.json +318 -0
  323. chronaxis/guide/en/fields/analysis/sources-can_asc-2.json +310 -0
  324. chronaxis/guide/en/fields/analysis/sources-can_asc-3.json +311 -0
  325. chronaxis/guide/en/fields/analysis/sources-can_asc-4.json +69 -0
  326. chronaxis/guide/en/fields/analysis/sources-can_blf-1.json +317 -0
  327. chronaxis/guide/en/fields/analysis/sources-can_blf-2.json +310 -0
  328. chronaxis/guide/en/fields/analysis/sources-can_blf-3.json +317 -0
  329. chronaxis/guide/en/fields/analysis/sources-memory-1.json +332 -0
  330. chronaxis/guide/en/fields/analysis/sources-memory-2.json +125 -0
  331. chronaxis/guide/en/fields/analysis/sources-raw_can_csv-1.json +330 -0
  332. chronaxis/guide/en/fields/analysis/sources-raw_can_csv-10.json +233 -0
  333. chronaxis/guide/en/fields/analysis/sources-raw_can_csv-11.json +225 -0
  334. chronaxis/guide/en/fields/analysis/sources-raw_can_csv-12.json +228 -0
  335. chronaxis/guide/en/fields/analysis/sources-raw_can_csv-13.json +226 -0
  336. chronaxis/guide/en/fields/analysis/sources-raw_can_csv-14.json +230 -0
  337. chronaxis/guide/en/fields/analysis/sources-raw_can_csv-15.json +227 -0
  338. chronaxis/guide/en/fields/analysis/sources-raw_can_csv-16.json +230 -0
  339. chronaxis/guide/en/fields/analysis/sources-raw_can_csv-17.json +238 -0
  340. chronaxis/guide/en/fields/analysis/sources-raw_can_csv-18.json +239 -0
  341. chronaxis/guide/en/fields/analysis/sources-raw_can_csv-19.json +233 -0
  342. chronaxis/guide/en/fields/analysis/sources-raw_can_csv-2.json +310 -0
  343. chronaxis/guide/en/fields/analysis/sources-raw_can_csv-20.json +242 -0
  344. chronaxis/guide/en/fields/analysis/sources-raw_can_csv-21.json +230 -0
  345. chronaxis/guide/en/fields/analysis/sources-raw_can_csv-22.json +228 -0
  346. chronaxis/guide/en/fields/analysis/sources-raw_can_csv-23.json +230 -0
  347. chronaxis/guide/en/fields/analysis/sources-raw_can_csv-24.json +223 -0
  348. chronaxis/guide/en/fields/analysis/sources-raw_can_csv-25.json +290 -0
  349. chronaxis/guide/en/fields/analysis/sources-raw_can_csv-26.json +131 -0
  350. chronaxis/guide/en/fields/analysis/sources-raw_can_csv-3.json +297 -0
  351. chronaxis/guide/en/fields/analysis/sources-raw_can_csv-4.json +226 -0
  352. chronaxis/guide/en/fields/analysis/sources-raw_can_csv-5.json +230 -0
  353. chronaxis/guide/en/fields/analysis/sources-raw_can_csv-6.json +227 -0
  354. chronaxis/guide/en/fields/analysis/sources-raw_can_csv-7.json +230 -0
  355. chronaxis/guide/en/fields/analysis/sources-raw_can_csv-8.json +238 -0
  356. chronaxis/guide/en/fields/analysis/sources-raw_can_csv-9.json +239 -0
  357. chronaxis/guide/en/fields/analysis/sources-signal_csv-1.json +331 -0
  358. chronaxis/guide/en/fields/analysis/sources-signal_csv-2.json +307 -0
  359. chronaxis/guide/en/fields/analysis/sources-signal_csv-3.json +315 -0
  360. chronaxis/guide/en/fields/analysis/sources-variant-6-1.json +319 -0
  361. chronaxis/guide/en/fields/analysis/sources-variant-6-2.json +307 -0
  362. chronaxis/guide/en/fields/analysis/sources-variant-6-3.json +312 -0
  363. chronaxis/guide/en/fields/analysis/sources-variant-6-4.json +113 -0
  364. chronaxis/guide/en/fields/analysis/windows-all-1.json +361 -0
  365. chronaxis/guide/en/fields/analysis/windows-all-2.json +187 -0
  366. chronaxis/guide/en/fields/batch/backend-all-1.json +26 -0
  367. chronaxis/guide/en/fields/batch/batch_version-all-1.json +22 -0
  368. chronaxis/guide/en/fields/batch/fail_fast-all-1.json +22 -0
  369. chronaxis/guide/en/fields/batch/inputs-all-1.json +161 -0
  370. chronaxis/guide/en/fields/batch/jobs-all-1.json +58 -0
  371. chronaxis/guide/en/fields/batch/process_count-all-1.json +23 -0
  372. chronaxis/guide/en/fields/batch/source-all-1.json +22 -0
  373. chronaxis/guide/en/fields/batch/template-all-1.json +22 -0
  374. chronaxis/guide/en/fields/definitions/derived-all-1.json +121 -0
  375. chronaxis/guide/en/fields/definitions/signals-all-1.json +336 -0
  376. chronaxis/guide/en/fields/definitions/signals-all-2.json +307 -0
  377. chronaxis/guide/en/fields/definitions/signals-all-3.json +290 -0
  378. chronaxis/guide/en/fields/definitions/signals-all-4.json +347 -0
  379. chronaxis/guide/en/fields/definitions/signals-all-5.json +297 -0
  380. chronaxis/guide/en/fields/definitions/signals-all-6.json +259 -0
  381. chronaxis/guide/en/fields/definitions/signals-all-7.json +117 -0
  382. chronaxis/guide/en/fields/definitions/sources-all-1.json +332 -0
  383. chronaxis/guide/en/fields/definitions/sources-all-10.json +306 -0
  384. chronaxis/guide/en/fields/definitions/sources-all-11.json +294 -0
  385. chronaxis/guide/en/fields/definitions/sources-all-12.json +212 -0
  386. chronaxis/guide/en/fields/definitions/sources-all-13.json +217 -0
  387. chronaxis/guide/en/fields/definitions/sources-all-14.json +213 -0
  388. chronaxis/guide/en/fields/definitions/sources-all-15.json +214 -0
  389. chronaxis/guide/en/fields/definitions/sources-all-16.json +215 -0
  390. chronaxis/guide/en/fields/definitions/sources-all-17.json +213 -0
  391. chronaxis/guide/en/fields/definitions/sources-all-18.json +214 -0
  392. chronaxis/guide/en/fields/definitions/sources-all-19.json +213 -0
  393. chronaxis/guide/en/fields/definitions/sources-all-2.json +323 -0
  394. chronaxis/guide/en/fields/definitions/sources-all-20.json +217 -0
  395. chronaxis/guide/en/fields/definitions/sources-all-21.json +210 -0
  396. chronaxis/guide/en/fields/definitions/sources-all-22.json +214 -0
  397. chronaxis/guide/en/fields/definitions/sources-all-23.json +218 -0
  398. chronaxis/guide/en/fields/definitions/sources-all-24.json +209 -0
  399. chronaxis/guide/en/fields/definitions/sources-all-25.json +215 -0
  400. chronaxis/guide/en/fields/definitions/sources-all-26.json +218 -0
  401. chronaxis/guide/en/fields/definitions/sources-all-27.json +224 -0
  402. chronaxis/guide/en/fields/definitions/sources-all-28.json +215 -0
  403. chronaxis/guide/en/fields/definitions/sources-all-29.json +205 -0
  404. chronaxis/guide/en/fields/definitions/sources-all-3.json +303 -0
  405. chronaxis/guide/en/fields/definitions/sources-all-30.json +298 -0
  406. chronaxis/guide/en/fields/definitions/sources-all-31.json +315 -0
  407. chronaxis/guide/en/fields/definitions/sources-all-32.json +306 -0
  408. chronaxis/guide/en/fields/definitions/sources-all-33.json +209 -0
  409. chronaxis/guide/en/fields/definitions/sources-all-4.json +336 -0
  410. chronaxis/guide/en/fields/definitions/sources-all-5.json +299 -0
  411. chronaxis/guide/en/fields/definitions/sources-all-6.json +307 -0
  412. chronaxis/guide/en/fields/definitions/sources-all-7.json +320 -0
  413. chronaxis/guide/en/fields/definitions/sources-all-8.json +303 -0
  414. chronaxis/guide/en/fields/definitions/sources-all-9.json +315 -0
  415. chronaxis/guide/en/fields/index.json +3450 -0
  416. chronaxis/guide/en/fields/mapping/aliases-all-1.json +91 -0
  417. chronaxis/guide/en/fields/mapping/analysis-all-1.json +382 -0
  418. chronaxis/guide/en/fields/mapping/analysis-all-10.json +301 -0
  419. chronaxis/guide/en/fields/mapping/analysis-all-11.json +312 -0
  420. chronaxis/guide/en/fields/mapping/analysis-all-12.json +311 -0
  421. chronaxis/guide/en/fields/mapping/analysis-all-13.json +314 -0
  422. chronaxis/guide/en/fields/mapping/analysis-all-14.json +310 -0
  423. chronaxis/guide/en/fields/mapping/analysis-all-15.json +297 -0
  424. chronaxis/guide/en/fields/mapping/analysis-all-16.json +226 -0
  425. chronaxis/guide/en/fields/mapping/analysis-all-17.json +230 -0
  426. chronaxis/guide/en/fields/mapping/analysis-all-18.json +227 -0
  427. chronaxis/guide/en/fields/mapping/analysis-all-19.json +230 -0
  428. chronaxis/guide/en/fields/mapping/analysis-all-2.json +323 -0
  429. chronaxis/guide/en/fields/mapping/analysis-all-20.json +221 -0
  430. chronaxis/guide/en/fields/mapping/analysis-all-21.json +237 -0
  431. chronaxis/guide/en/fields/mapping/analysis-all-22.json +233 -0
  432. chronaxis/guide/en/fields/mapping/analysis-all-23.json +222 -0
  433. chronaxis/guide/en/fields/mapping/analysis-all-24.json +231 -0
  434. chronaxis/guide/en/fields/mapping/analysis-all-25.json +225 -0
  435. chronaxis/guide/en/fields/mapping/analysis-all-26.json +230 -0
  436. chronaxis/guide/en/fields/mapping/analysis-all-27.json +228 -0
  437. chronaxis/guide/en/fields/mapping/analysis-all-28.json +230 -0
  438. chronaxis/guide/en/fields/mapping/analysis-all-29.json +223 -0
  439. chronaxis/guide/en/fields/mapping/analysis-all-3.json +318 -0
  440. chronaxis/guide/en/fields/mapping/analysis-all-30.json +233 -0
  441. chronaxis/guide/en/fields/mapping/analysis-all-31.json +218 -0
  442. chronaxis/guide/en/fields/mapping/analysis-all-32.json +239 -0
  443. chronaxis/guide/en/fields/mapping/analysis-all-33.json +233 -0
  444. chronaxis/guide/en/fields/mapping/analysis-all-34.json +225 -0
  445. chronaxis/guide/en/fields/mapping/analysis-all-35.json +228 -0
  446. chronaxis/guide/en/fields/mapping/analysis-all-36.json +226 -0
  447. chronaxis/guide/en/fields/mapping/analysis-all-37.json +244 -0
  448. chronaxis/guide/en/fields/mapping/analysis-all-38.json +326 -0
  449. chronaxis/guide/en/fields/mapping/analysis-all-39.json +299 -0
  450. chronaxis/guide/en/fields/mapping/analysis-all-4.json +297 -0
  451. chronaxis/guide/en/fields/mapping/analysis-all-40.json +311 -0
  452. chronaxis/guide/en/fields/mapping/analysis-all-41.json +310 -0
  453. chronaxis/guide/en/fields/mapping/analysis-all-42.json +346 -0
  454. chronaxis/guide/en/fields/mapping/analysis-all-43.json +267 -0
  455. chronaxis/guide/en/fields/mapping/analysis-all-44.json +327 -0
  456. chronaxis/guide/en/fields/mapping/analysis-all-45.json +279 -0
  457. chronaxis/guide/en/fields/mapping/analysis-all-46.json +327 -0
  458. chronaxis/guide/en/fields/mapping/analysis-all-47.json +312 -0
  459. chronaxis/guide/en/fields/mapping/analysis-all-48.json +294 -0
  460. chronaxis/guide/en/fields/mapping/analysis-all-49.json +253 -0
  461. chronaxis/guide/en/fields/mapping/analysis-all-5.json +312 -0
  462. chronaxis/guide/en/fields/mapping/analysis-all-50.json +346 -0
  463. chronaxis/guide/en/fields/mapping/analysis-all-51.json +324 -0
  464. chronaxis/guide/en/fields/mapping/analysis-all-52.json +335 -0
  465. chronaxis/guide/en/fields/mapping/analysis-all-53.json +317 -0
  466. chronaxis/guide/en/fields/mapping/analysis-all-54.json +316 -0
  467. chronaxis/guide/en/fields/mapping/analysis-all-55.json +302 -0
  468. chronaxis/guide/en/fields/mapping/analysis-all-56.json +319 -0
  469. chronaxis/guide/en/fields/mapping/analysis-all-57.json +334 -0
  470. chronaxis/guide/en/fields/mapping/analysis-all-58.json +333 -0
  471. chronaxis/guide/en/fields/mapping/analysis-all-59.json +359 -0
  472. chronaxis/guide/en/fields/mapping/analysis-all-6.json +327 -0
  473. chronaxis/guide/en/fields/mapping/analysis-all-60.json +303 -0
  474. chronaxis/guide/en/fields/mapping/analysis-all-61.json +326 -0
  475. chronaxis/guide/en/fields/mapping/analysis-all-62.json +301 -0
  476. chronaxis/guide/en/fields/mapping/analysis-all-63.json +326 -0
  477. chronaxis/guide/en/fields/mapping/analysis-all-64.json +367 -0
  478. chronaxis/guide/en/fields/mapping/analysis-all-65.json +334 -0
  479. chronaxis/guide/en/fields/mapping/analysis-all-66.json +358 -0
  480. chronaxis/guide/en/fields/mapping/analysis-all-67.json +349 -0
  481. chronaxis/guide/en/fields/mapping/analysis-all-68.json +331 -0
  482. chronaxis/guide/en/fields/mapping/analysis-all-69.json +304 -0
  483. chronaxis/guide/en/fields/mapping/analysis-all-7.json +303 -0
  484. chronaxis/guide/en/fields/mapping/analysis-all-70.json +349 -0
  485. chronaxis/guide/en/fields/mapping/analysis-all-71.json +288 -0
  486. chronaxis/guide/en/fields/mapping/analysis-all-72.json +316 -0
  487. chronaxis/guide/en/fields/mapping/analysis-all-73.json +266 -0
  488. chronaxis/guide/en/fields/mapping/analysis-all-74.json +227 -0
  489. chronaxis/guide/en/fields/mapping/analysis-all-75.json +239 -0
  490. chronaxis/guide/en/fields/mapping/analysis-all-76.json +274 -0
  491. chronaxis/guide/en/fields/mapping/analysis-all-77.json +380 -0
  492. chronaxis/guide/en/fields/mapping/analysis-all-78.json +313 -0
  493. chronaxis/guide/en/fields/mapping/analysis-all-79.json +338 -0
  494. chronaxis/guide/en/fields/mapping/analysis-all-8.json +292 -0
  495. chronaxis/guide/en/fields/mapping/analysis-all-80.json +304 -0
  496. chronaxis/guide/en/fields/mapping/analysis-all-81.json +140 -0
  497. chronaxis/guide/en/fields/mapping/analysis-all-9.json +332 -0
  498. chronaxis/guide/en/fields/mapping/io_policy-all-1.json +19 -0
  499. chronaxis/guide/en/fields/mapping/mapping_version-all-1.json +19 -0
  500. chronaxis/guide/en/fields/mapping/path_base-all-1.json +19 -0
  501. chronaxis/guide/en/fields/mapping/sections-all-1.json +402 -0
  502. chronaxis/guide/en/fields/mapping/sections-all-2.json +232 -0
  503. chronaxis/guide/en/semantics.md +70 -0
  504. chronaxis/guide/en/tasks.json +290 -0
  505. chronaxis/guide/en/workflow.md +41 -0
  506. chronaxis/guide/examples/analysis-imports.yaml +22 -0
  507. chronaxis/guide/examples/analysis.yaml +23 -0
  508. chronaxis/guide/examples/batch-minimal.yaml +3 -0
  509. chronaxis/guide/examples/conditional-energy.yaml +36 -0
  510. chronaxis/guide/examples/data/activity.csv +6 -0
  511. chronaxis/guide/examples/data/can/activity.asc +11 -0
  512. chronaxis/guide/examples/data/can/calculation-minimal.asc +6 -0
  513. chronaxis/guide/examples/data/can/conditional-energy/part-1.asc +92 -0
  514. chronaxis/guide/examples/data/can/conditional-energy/part-2.asc +36 -0
  515. chronaxis/guide/examples/data/can/conditional-energy/signals.dbc +10 -0
  516. chronaxis/guide/examples/data/can/execution-comparison.asc +12 -0
  517. chronaxis/guide/examples/data/can/execution-report.asc +4 -0
  518. chronaxis/guide/examples/data/can/expression-extended.asc +11 -0
  519. chronaxis/guide/examples/data/can/interval-actual.asc +6 -0
  520. chronaxis/guide/examples/data/can/preset-charge-energy.asc +15 -0
  521. chronaxis/guide/examples/data/can/preset-charge-minimal.asc +11 -0
  522. chronaxis/guide/examples/data/can/preset-command-automatic.asc +11 -0
  523. chronaxis/guide/examples/data/can/preset-fault-context.asc +7 -0
  524. chronaxis/guide/examples/data/can/preset-threshold-delay.asc +7 -0
  525. chronaxis/guide/examples/data/can/preset-threshold-partial.asc +7 -0
  526. chronaxis/guide/examples/data/can/quality.asc +6 -0
  527. chronaxis/guide/examples/data/can/quickstart-parts/part1.asc +4 -0
  528. chronaxis/guide/examples/data/can/quickstart-parts/part2.asc +3 -0
  529. chronaxis/guide/examples/data/can/quickstart.asc +6 -0
  530. chronaxis/guide/examples/data/can/rule-condition_duration-extended.asc +35 -0
  531. chronaxis/guide/examples/data/can/rule-condition_duration-minimal.asc +19 -0
  532. chronaxis/guide/examples/data/can/rule-debounce-extended.asc +19 -0
  533. chronaxis/guide/examples/data/can/rule-falling_edge-extended.asc +35 -0
  534. chronaxis/guide/examples/data/can/rule-hysteresis-extended.asc +19 -0
  535. chronaxis/guide/examples/data/can/rule-start_end-extended.asc +35 -0
  536. chronaxis/guide/examples/data/can/rule-start_only-extended.asc +19 -0
  537. chronaxis/guide/examples/data/can/rule-window_delta-extended.asc +19 -0
  538. chronaxis/guide/examples/data/can/sequence-outcomes.asc +19 -0
  539. chronaxis/guide/examples/data/can/signal-types.asc +13 -0
  540. chronaxis/guide/examples/data/can/start-end.asc +30 -0
  541. chronaxis/guide/examples/data/can/teaching-base.asc +58 -0
  542. chronaxis/guide/examples/data/can/teaching.dbc +53 -0
  543. chronaxis/guide/examples/data/joint-current.csv +5 -0
  544. chronaxis/guide/examples/data/joint.asc +5 -0
  545. chronaxis/guide/examples/data/joint.dbc +7 -0
  546. chronaxis/guide/examples/data/message-clean.asc +6 -0
  547. chronaxis/guide/examples/data/message-direction.asc +7 -0
  548. chronaxis/guide/examples/data/message-direction.dbc +7 -0
  549. chronaxis/guide/examples/data/power.blf +0 -0
  550. chronaxis/guide/examples/data/power.dbc +6 -0
  551. chronaxis/guide/examples/data/quality.csv +5 -0
  552. chronaxis/guide/examples/data/raw-can-example.csv +5 -0
  553. chronaxis/guide/examples/data/signal-types.csv +5 -0
  554. chronaxis/guide/examples/data/signals.csv +6 -0
  555. chronaxis/guide/examples/data/timing.asc +6 -0
  556. chronaxis/guide/examples/data/timing.dbc +11 -0
  557. chronaxis/guide/examples/export-can-minimal.yaml +24 -0
  558. chronaxis/guide/examples/input-csv-minimal.yaml +23 -0
  559. chronaxis/guide/examples/preset-charge-energy.yaml +41 -0
  560. chronaxis/guide/examples/preset-charge-minimal.yaml +31 -0
  561. chronaxis/guide/examples/preset-fault-context.yaml +27 -0
  562. chronaxis/guide/examples/quality.yaml +19 -0
  563. chronaxis/guide/examples/sequence-outcomes.yaml +39 -0
  564. chronaxis/guide/examples/shared/definitions.yaml +14 -0
  565. chronaxis/guide/examples/signal-enum-minimal.yaml +19 -0
  566. chronaxis/guide/examples/signal-number-conversion.yaml +24 -0
  567. chronaxis/guide/examples/window-merged.yaml +28 -0
  568. chronaxis/guide/fields/analysis/calculations-all-1.json +360 -0
  569. chronaxis/guide/fields/analysis/calculations-all-2.json +299 -0
  570. chronaxis/guide/fields/analysis/calculations-all-3.json +70 -0
  571. chronaxis/guide/fields/analysis/config_version-all-1.json +24 -0
  572. chronaxis/guide/fields/analysis/dataset-all-1.json +344 -0
  573. chronaxis/guide/fields/analysis/derived-all-1.json +147 -0
  574. chronaxis/guide/fields/analysis/diagnostics-all-1.json +69 -0
  575. chronaxis/guide/fields/analysis/execution-all-1.json +167 -0
  576. chronaxis/guide/fields/analysis/imports-all-1.json +39 -0
  577. chronaxis/guide/fields/analysis/intervals-all-1.json +173 -0
  578. chronaxis/guide/fields/analysis/message_calculations-all-1.json +360 -0
  579. chronaxis/guide/fields/analysis/message_calculations-all-2.json +255 -0
  580. chronaxis/guide/fields/analysis/metadata-all-1.json +24 -0
  581. chronaxis/guide/fields/analysis/outputs-all-1.json +349 -0
  582. chronaxis/guide/fields/analysis/outputs-all-2.json +302 -0
  583. chronaxis/guide/fields/analysis/outputs-all-3.json +321 -0
  584. chronaxis/guide/fields/analysis/outputs-all-4.json +253 -0
  585. chronaxis/guide/fields/analysis/outputs-all-5.json +244 -0
  586. chronaxis/guide/fields/analysis/outputs-all-6.json +199 -0
  587. chronaxis/guide/fields/analysis/overrides-all-1.json +104 -0
  588. chronaxis/guide/fields/analysis/presets-charge_session-1.json +398 -0
  589. chronaxis/guide/fields/analysis/presets-charge_session-2.json +114 -0
  590. chronaxis/guide/fields/analysis/presets-command_response-1.json +376 -0
  591. chronaxis/guide/fields/analysis/presets-fault_context-1.json +285 -0
  592. chronaxis/guide/fields/analysis/presets-threshold_excursion-1.json +317 -0
  593. chronaxis/guide/fields/analysis/rules-condition_duration-1.json +344 -0
  594. chronaxis/guide/fields/analysis/rules-condition_duration-2.json +27 -0
  595. chronaxis/guide/fields/analysis/rules-debounce-1.json +335 -0
  596. chronaxis/guide/fields/analysis/rules-falling_edge-1.json +317 -0
  597. chronaxis/guide/fields/analysis/rules-hysteresis-1.json +334 -0
  598. chronaxis/guide/fields/analysis/rules-hysteresis-2.json +27 -0
  599. chronaxis/guide/fields/analysis/rules-rising_edge-1.json +317 -0
  600. chronaxis/guide/fields/analysis/rules-start_end-1.json +349 -0
  601. chronaxis/guide/fields/analysis/rules-start_end-2.json +44 -0
  602. chronaxis/guide/fields/analysis/rules-start_only-1.json +334 -0
  603. chronaxis/guide/fields/analysis/rules-window_delta-1.json +356 -0
  604. chronaxis/guide/fields/analysis/rules-window_delta-2.json +78 -0
  605. chronaxis/guide/fields/analysis/sequences-all-1.json +394 -0
  606. chronaxis/guide/fields/analysis/sequences-all-2.json +54 -0
  607. chronaxis/guide/fields/analysis/signals-variant-1-1.json +349 -0
  608. chronaxis/guide/fields/analysis/signals-variant-1-2.json +297 -0
  609. chronaxis/guide/fields/analysis/signals-variant-1-3.json +340 -0
  610. chronaxis/guide/fields/analysis/signals-variant-1-4.json +175 -0
  611. chronaxis/guide/fields/analysis/signals-variant-2-1.json +327 -0
  612. chronaxis/guide/fields/analysis/signals-variant-2-2.json +335 -0
  613. chronaxis/guide/fields/analysis/signals-variant-2-3.json +289 -0
  614. chronaxis/guide/fields/analysis/signals-variant-2-4.json +270 -0
  615. chronaxis/guide/fields/analysis/sources-can_asc-1.json +318 -0
  616. chronaxis/guide/fields/analysis/sources-can_asc-2.json +310 -0
  617. chronaxis/guide/fields/analysis/sources-can_asc-3.json +311 -0
  618. chronaxis/guide/fields/analysis/sources-can_asc-4.json +69 -0
  619. chronaxis/guide/fields/analysis/sources-can_blf-1.json +317 -0
  620. chronaxis/guide/fields/analysis/sources-can_blf-2.json +310 -0
  621. chronaxis/guide/fields/analysis/sources-can_blf-3.json +317 -0
  622. chronaxis/guide/fields/analysis/sources-memory-1.json +347 -0
  623. chronaxis/guide/fields/analysis/sources-memory-2.json +110 -0
  624. chronaxis/guide/fields/analysis/sources-raw_can_csv-1.json +330 -0
  625. chronaxis/guide/fields/analysis/sources-raw_can_csv-10.json +233 -0
  626. chronaxis/guide/fields/analysis/sources-raw_can_csv-11.json +225 -0
  627. chronaxis/guide/fields/analysis/sources-raw_can_csv-12.json +228 -0
  628. chronaxis/guide/fields/analysis/sources-raw_can_csv-13.json +226 -0
  629. chronaxis/guide/fields/analysis/sources-raw_can_csv-14.json +230 -0
  630. chronaxis/guide/fields/analysis/sources-raw_can_csv-15.json +227 -0
  631. chronaxis/guide/fields/analysis/sources-raw_can_csv-16.json +230 -0
  632. chronaxis/guide/fields/analysis/sources-raw_can_csv-17.json +238 -0
  633. chronaxis/guide/fields/analysis/sources-raw_can_csv-18.json +239 -0
  634. chronaxis/guide/fields/analysis/sources-raw_can_csv-19.json +233 -0
  635. chronaxis/guide/fields/analysis/sources-raw_can_csv-2.json +310 -0
  636. chronaxis/guide/fields/analysis/sources-raw_can_csv-20.json +242 -0
  637. chronaxis/guide/fields/analysis/sources-raw_can_csv-21.json +230 -0
  638. chronaxis/guide/fields/analysis/sources-raw_can_csv-22.json +228 -0
  639. chronaxis/guide/fields/analysis/sources-raw_can_csv-23.json +230 -0
  640. chronaxis/guide/fields/analysis/sources-raw_can_csv-24.json +223 -0
  641. chronaxis/guide/fields/analysis/sources-raw_can_csv-25.json +290 -0
  642. chronaxis/guide/fields/analysis/sources-raw_can_csv-26.json +131 -0
  643. chronaxis/guide/fields/analysis/sources-raw_can_csv-3.json +297 -0
  644. chronaxis/guide/fields/analysis/sources-raw_can_csv-4.json +226 -0
  645. chronaxis/guide/fields/analysis/sources-raw_can_csv-5.json +230 -0
  646. chronaxis/guide/fields/analysis/sources-raw_can_csv-6.json +227 -0
  647. chronaxis/guide/fields/analysis/sources-raw_can_csv-7.json +230 -0
  648. chronaxis/guide/fields/analysis/sources-raw_can_csv-8.json +238 -0
  649. chronaxis/guide/fields/analysis/sources-raw_can_csv-9.json +239 -0
  650. chronaxis/guide/fields/analysis/sources-signal_csv-1.json +331 -0
  651. chronaxis/guide/fields/analysis/sources-signal_csv-2.json +327 -0
  652. chronaxis/guide/fields/analysis/sources-signal_csv-3.json +295 -0
  653. chronaxis/guide/fields/analysis/sources-variant-6-1.json +319 -0
  654. chronaxis/guide/fields/analysis/sources-variant-6-2.json +327 -0
  655. chronaxis/guide/fields/analysis/sources-variant-6-3.json +314 -0
  656. chronaxis/guide/fields/analysis/sources-variant-6-4.json +91 -0
  657. chronaxis/guide/fields/analysis/windows-all-1.json +361 -0
  658. chronaxis/guide/fields/analysis/windows-all-2.json +187 -0
  659. chronaxis/guide/fields/batch/backend-all-1.json +26 -0
  660. chronaxis/guide/fields/batch/batch_version-all-1.json +22 -0
  661. chronaxis/guide/fields/batch/fail_fast-all-1.json +22 -0
  662. chronaxis/guide/fields/batch/inputs-all-1.json +161 -0
  663. chronaxis/guide/fields/batch/jobs-all-1.json +58 -0
  664. chronaxis/guide/fields/batch/process_count-all-1.json +23 -0
  665. chronaxis/guide/fields/batch/source-all-1.json +22 -0
  666. chronaxis/guide/fields/batch/template-all-1.json +22 -0
  667. chronaxis/guide/fields/definitions/derived-all-1.json +121 -0
  668. chronaxis/guide/fields/definitions/signals-all-1.json +336 -0
  669. chronaxis/guide/fields/definitions/signals-all-2.json +307 -0
  670. chronaxis/guide/fields/definitions/signals-all-3.json +305 -0
  671. chronaxis/guide/fields/definitions/signals-all-4.json +352 -0
  672. chronaxis/guide/fields/definitions/signals-all-5.json +311 -0
  673. chronaxis/guide/fields/definitions/signals-all-6.json +254 -0
  674. chronaxis/guide/fields/definitions/signals-all-7.json +88 -0
  675. chronaxis/guide/fields/definitions/sources-all-1.json +332 -0
  676. chronaxis/guide/fields/definitions/sources-all-10.json +307 -0
  677. chronaxis/guide/fields/definitions/sources-all-11.json +280 -0
  678. chronaxis/guide/fields/definitions/sources-all-12.json +209 -0
  679. chronaxis/guide/fields/definitions/sources-all-13.json +219 -0
  680. chronaxis/guide/fields/definitions/sources-all-14.json +213 -0
  681. chronaxis/guide/fields/definitions/sources-all-15.json +212 -0
  682. chronaxis/guide/fields/definitions/sources-all-16.json +232 -0
  683. chronaxis/guide/fields/definitions/sources-all-17.json +213 -0
  684. chronaxis/guide/fields/definitions/sources-all-18.json +212 -0
  685. chronaxis/guide/fields/definitions/sources-all-19.json +217 -0
  686. chronaxis/guide/fields/definitions/sources-all-2.json +336 -0
  687. chronaxis/guide/fields/definitions/sources-all-20.json +228 -0
  688. chronaxis/guide/fields/definitions/sources-all-21.json +212 -0
  689. chronaxis/guide/fields/definitions/sources-all-22.json +232 -0
  690. chronaxis/guide/fields/definitions/sources-all-23.json +213 -0
  691. chronaxis/guide/fields/definitions/sources-all-24.json +212 -0
  692. chronaxis/guide/fields/definitions/sources-all-25.json +217 -0
  693. chronaxis/guide/fields/definitions/sources-all-26.json +228 -0
  694. chronaxis/guide/fields/definitions/sources-all-27.json +212 -0
  695. chronaxis/guide/fields/definitions/sources-all-28.json +217 -0
  696. chronaxis/guide/fields/definitions/sources-all-29.json +227 -0
  697. chronaxis/guide/fields/definitions/sources-all-3.json +306 -0
  698. chronaxis/guide/fields/definitions/sources-all-30.json +333 -0
  699. chronaxis/guide/fields/definitions/sources-all-31.json +302 -0
  700. chronaxis/guide/fields/definitions/sources-all-32.json +319 -0
  701. chronaxis/guide/fields/definitions/sources-all-33.json +89 -0
  702. chronaxis/guide/fields/definitions/sources-all-4.json +336 -0
  703. chronaxis/guide/fields/definitions/sources-all-5.json +313 -0
  704. chronaxis/guide/fields/definitions/sources-all-6.json +292 -0
  705. chronaxis/guide/fields/definitions/sources-all-7.json +319 -0
  706. chronaxis/guide/fields/definitions/sources-all-8.json +315 -0
  707. chronaxis/guide/fields/definitions/sources-all-9.json +318 -0
  708. chronaxis/guide/fields/index.json +3432 -0
  709. chronaxis/guide/fields/mapping/aliases-all-1.json +91 -0
  710. chronaxis/guide/fields/mapping/analysis-all-1.json +382 -0
  711. chronaxis/guide/fields/mapping/analysis-all-10.json +307 -0
  712. chronaxis/guide/fields/mapping/analysis-all-11.json +311 -0
  713. chronaxis/guide/fields/mapping/analysis-all-12.json +329 -0
  714. chronaxis/guide/fields/mapping/analysis-all-13.json +294 -0
  715. chronaxis/guide/fields/mapping/analysis-all-14.json +311 -0
  716. chronaxis/guide/fields/mapping/analysis-all-15.json +280 -0
  717. chronaxis/guide/fields/mapping/analysis-all-16.json +227 -0
  718. chronaxis/guide/fields/mapping/analysis-all-17.json +230 -0
  719. chronaxis/guide/fields/mapping/analysis-all-18.json +221 -0
  720. chronaxis/guide/fields/mapping/analysis-all-19.json +237 -0
  721. chronaxis/guide/fields/mapping/analysis-all-2.json +342 -0
  722. chronaxis/guide/fields/mapping/analysis-all-20.json +233 -0
  723. chronaxis/guide/fields/mapping/analysis-all-21.json +244 -0
  724. chronaxis/guide/fields/mapping/analysis-all-22.json +228 -0
  725. chronaxis/guide/fields/mapping/analysis-all-23.json +226 -0
  726. chronaxis/guide/fields/mapping/analysis-all-24.json +230 -0
  727. chronaxis/guide/fields/mapping/analysis-all-25.json +227 -0
  728. chronaxis/guide/fields/mapping/analysis-all-26.json +230 -0
  729. chronaxis/guide/fields/mapping/analysis-all-27.json +221 -0
  730. chronaxis/guide/fields/mapping/analysis-all-28.json +237 -0
  731. chronaxis/guide/fields/mapping/analysis-all-29.json +233 -0
  732. chronaxis/guide/fields/mapping/analysis-all-3.json +322 -0
  733. chronaxis/guide/fields/mapping/analysis-all-30.json +244 -0
  734. chronaxis/guide/fields/mapping/analysis-all-31.json +228 -0
  735. chronaxis/guide/fields/mapping/analysis-all-32.json +226 -0
  736. chronaxis/guide/fields/mapping/analysis-all-33.json +230 -0
  737. chronaxis/guide/fields/mapping/analysis-all-34.json +227 -0
  738. chronaxis/guide/fields/mapping/analysis-all-35.json +230 -0
  739. chronaxis/guide/fields/mapping/analysis-all-36.json +221 -0
  740. chronaxis/guide/fields/mapping/analysis-all-37.json +291 -0
  741. chronaxis/guide/fields/mapping/analysis-all-38.json +315 -0
  742. chronaxis/guide/fields/mapping/analysis-all-39.json +304 -0
  743. chronaxis/guide/fields/mapping/analysis-all-4.json +312 -0
  744. chronaxis/guide/fields/mapping/analysis-all-40.json +307 -0
  745. chronaxis/guide/fields/mapping/analysis-all-41.json +292 -0
  746. chronaxis/guide/fields/mapping/analysis-all-42.json +333 -0
  747. chronaxis/guide/fields/mapping/analysis-all-43.json +296 -0
  748. chronaxis/guide/fields/mapping/analysis-all-44.json +322 -0
  749. chronaxis/guide/fields/mapping/analysis-all-45.json +298 -0
  750. chronaxis/guide/fields/mapping/analysis-all-46.json +347 -0
  751. chronaxis/guide/fields/mapping/analysis-all-47.json +302 -0
  752. chronaxis/guide/fields/mapping/analysis-all-48.json +263 -0
  753. chronaxis/guide/fields/mapping/analysis-all-49.json +301 -0
  754. chronaxis/guide/fields/mapping/analysis-all-5.json +313 -0
  755. chronaxis/guide/fields/mapping/analysis-all-50.json +336 -0
  756. chronaxis/guide/fields/mapping/analysis-all-51.json +335 -0
  757. chronaxis/guide/fields/mapping/analysis-all-52.json +335 -0
  758. chronaxis/guide/fields/mapping/analysis-all-53.json +334 -0
  759. chronaxis/guide/fields/mapping/analysis-all-54.json +339 -0
  760. chronaxis/guide/fields/mapping/analysis-all-55.json +335 -0
  761. chronaxis/guide/fields/mapping/analysis-all-56.json +336 -0
  762. chronaxis/guide/fields/mapping/analysis-all-57.json +335 -0
  763. chronaxis/guide/fields/mapping/analysis-all-58.json +333 -0
  764. chronaxis/guide/fields/mapping/analysis-all-59.json +325 -0
  765. chronaxis/guide/fields/mapping/analysis-all-6.json +323 -0
  766. chronaxis/guide/fields/mapping/analysis-all-60.json +334 -0
  767. chronaxis/guide/fields/mapping/analysis-all-61.json +311 -0
  768. chronaxis/guide/fields/mapping/analysis-all-62.json +289 -0
  769. chronaxis/guide/fields/mapping/analysis-all-63.json +383 -0
  770. chronaxis/guide/fields/mapping/analysis-all-64.json +357 -0
  771. chronaxis/guide/fields/mapping/analysis-all-65.json +375 -0
  772. chronaxis/guide/fields/mapping/analysis-all-66.json +351 -0
  773. chronaxis/guide/fields/mapping/analysis-all-67.json +346 -0
  774. chronaxis/guide/fields/mapping/analysis-all-68.json +317 -0
  775. chronaxis/guide/fields/mapping/analysis-all-69.json +313 -0
  776. chronaxis/guide/fields/mapping/analysis-all-7.json +306 -0
  777. chronaxis/guide/fields/mapping/analysis-all-70.json +326 -0
  778. chronaxis/guide/fields/mapping/analysis-all-71.json +316 -0
  779. chronaxis/guide/fields/mapping/analysis-all-72.json +264 -0
  780. chronaxis/guide/fields/mapping/analysis-all-73.json +228 -0
  781. chronaxis/guide/fields/mapping/analysis-all-74.json +241 -0
  782. chronaxis/guide/fields/mapping/analysis-all-75.json +273 -0
  783. chronaxis/guide/fields/mapping/analysis-all-76.json +382 -0
  784. chronaxis/guide/fields/mapping/analysis-all-77.json +328 -0
  785. chronaxis/guide/fields/mapping/analysis-all-78.json +338 -0
  786. chronaxis/guide/fields/mapping/analysis-all-79.json +304 -0
  787. chronaxis/guide/fields/mapping/analysis-all-8.json +309 -0
  788. chronaxis/guide/fields/mapping/analysis-all-80.json +140 -0
  789. chronaxis/guide/fields/mapping/analysis-all-9.json +329 -0
  790. chronaxis/guide/fields/mapping/io_policy-all-1.json +19 -0
  791. chronaxis/guide/fields/mapping/mapping_version-all-1.json +19 -0
  792. chronaxis/guide/fields/mapping/path_base-all-1.json +19 -0
  793. chronaxis/guide/fields/mapping/sections-all-1.json +402 -0
  794. chronaxis/guide/fields/mapping/sections-all-2.json +232 -0
  795. chronaxis/guide/lookup.py +90 -0
  796. chronaxis/guide/manifest.json +614 -0
  797. chronaxis/guide/run_analysis.py +34 -0
  798. chronaxis/guide/schemas/analysis.schema.json +8451 -0
  799. chronaxis/guide/schemas/batch-v1.schema.json +172 -0
  800. chronaxis/guide/schemas/definitions.schema.json +29 -0
  801. chronaxis/guide/schemas/legacy-import-v1.schema.json +143 -0
  802. chronaxis/guide/semantics.md +62 -0
  803. chronaxis/guide/tasks.json +290 -0
  804. chronaxis/guide/workflow.md +38 -0
  805. chronaxis/legacy/__init__.py +46 -0
  806. chronaxis/legacy/batch_read.py +412 -0
  807. chronaxis/legacy/batch_validation.py +134 -0
  808. chronaxis/legacy/batch_wire.py +264 -0
  809. chronaxis/legacy/batch_worker.py +417 -0
  810. chronaxis/legacy/binding.py +154 -0
  811. chronaxis/legacy/dbc_cycles.py +47 -0
  812. chronaxis/legacy/decode_policy.py +28 -0
  813. chronaxis/legacy/disjunction.py +79 -0
  814. chronaxis/legacy/export_worker.py +147 -0
  815. chronaxis/legacy/export_write.py +378 -0
  816. chronaxis/legacy/message_store.py +562 -0
  817. chronaxis/legacy/process_read.py +526 -0
  818. chronaxis/legacy/raw_store.py +341 -0
  819. chronaxis/legacy/records.py +709 -0
  820. chronaxis/legacy/required_records.py +122 -0
  821. chronaxis/legacy/sum.py +403 -0
  822. chronaxis/legacy/sum_numpy.py +43 -0
  823. chronaxis/legacy/updates.py +277 -0
  824. chronaxis/legacy/vendor/sclicer_functions_v1/can_processor.py +138 -0
  825. chronaxis/legacy/vendor/sclicer_functions_v1/file_processor.py +218 -0
  826. chronaxis/legacy/vendor/sclicer_functions_v1/utils.py +447 -0
  827. chronaxis/legacy/worker.py +352 -0
  828. chronaxis/migration/__init__.py +11 -0
  829. chronaxis/migration/api.py +270 -0
  830. chronaxis/migration/ini.py +110 -0
  831. chronaxis/migration/legacy_sum.py +304 -0
  832. chronaxis/migration/models.py +83 -0
  833. chronaxis/migration/publication.py +230 -0
  834. chronaxis/migration/sclicer.py +241 -0
  835. chronaxis/migration/slope.py +78 -0
  836. chronaxis/migration/start_end.py +48 -0
  837. chronaxis/planning/__init__.py +19 -0
  838. chronaxis/planning/channels.py +30 -0
  839. chronaxis/planning/checks.py +447 -0
  840. chronaxis/planning/config_groups.py +215 -0
  841. chronaxis/planning/dbc_defaults.py +88 -0
  842. chronaxis/planning/export_options.py +247 -0
  843. chronaxis/planning/input_defaults.py +62 -0
  844. chronaxis/planning/input_paths.py +124 -0
  845. chronaxis/planning/input_requirements.py +250 -0
  846. chronaxis/planning/inputs.py +306 -0
  847. chronaxis/planning/intervals.py +242 -0
  848. chronaxis/planning/legacy_execution.py +38 -0
  849. chronaxis/planning/message_calculations.py +171 -0
  850. chronaxis/planning/models.py +369 -0
  851. chronaxis/planning/nodes.py +355 -0
  852. chronaxis/planning/plan.py +294 -0
  853. chronaxis/planning/preset_models.py +211 -0
  854. chronaxis/planning/record_execution.py +76 -0
  855. chronaxis/planning/reports.py +523 -0
  856. chronaxis/planning/sequences.py +91 -0
  857. chronaxis/planning/signal_groups.py +61 -0
  858. chronaxis/planning/signal_validity.py +46 -0
  859. chronaxis/planning/text_inputs.py +110 -0
  860. chronaxis/presets.py +270 -0
  861. chronaxis/results/__init__.py +34 -0
  862. chronaxis/results/analysis_outcome.py +67 -0
  863. chronaxis/results/artifact_exports.py +212 -0
  864. chronaxis/results/binding_metadata.py +54 -0
  865. chronaxis/results/budget.py +138 -0
  866. chronaxis/results/can_metadata.py +247 -0
  867. chronaxis/results/codec.py +246 -0
  868. chronaxis/results/errors.py +25 -0
  869. chronaxis/results/export_files.py +216 -0
  870. chronaxis/results/frame_exports.py +299 -0
  871. chronaxis/results/frame_patch.py +186 -0
  872. chronaxis/results/frame_rebuild.py +458 -0
  873. chronaxis/results/frame_sort.py +223 -0
  874. chronaxis/results/input_diagnostics.py +51 -0
  875. chronaxis/results/manifest.py +343 -0
  876. chronaxis/results/merge_runs.py +207 -0
  877. chronaxis/results/owned_directory.py +32 -0
  878. chronaxis/results/raw_exports.py +689 -0
  879. chronaxis/results/readable.py +355 -0
  880. chronaxis/results/readable_format.py +94 -0
  881. chronaxis/results/result.py +734 -0
  882. chronaxis/results/rows.py +57 -0
  883. chronaxis/results/signal_exports.py +209 -0
  884. chronaxis/results/signal_grid.py +219 -0
  885. chronaxis/results/spool.py +421 -0
  886. chronaxis/results/summary.py +350 -0
  887. chronaxis/results/text_can_metadata.py +64 -0
  888. chronaxis/results/threshold_metadata.py +105 -0
  889. chronaxis/runner.py +121 -0
  890. chronaxis/sources/__init__.py +23 -0
  891. chronaxis/sources/asc.py +412 -0
  892. chronaxis/sources/blf.py +101 -0
  893. chronaxis/sources/can_spec.py +179 -0
  894. chronaxis/sources/can_updates.py +160 -0
  895. chronaxis/sources/csv_spec.py +133 -0
  896. chronaxis/sources/descriptions.py +65 -0
  897. chronaxis/sources/memory.py +299 -0
  898. chronaxis/sources/models.py +497 -0
  899. chronaxis/sources/packing.py +170 -0
  900. chronaxis/sources/protocol.py +221 -0
  901. chronaxis/sources/raw_can.py +62 -0
  902. chronaxis/sources/raw_csv.py +470 -0
  903. chronaxis/sources/raw_csv_layout.py +310 -0
  904. chronaxis/sources/signal_csv.py +608 -0
  905. chronaxis/sources/text_can_decode.py +421 -0
  906. chronaxis/sources/text_can_ref.py +48 -0
  907. chronaxis/sources/text_can_spec.py +61 -0
  908. chronaxis/timebase/__init__.py +19 -0
  909. chronaxis/timebase/conversion.py +364 -0
  910. chronaxis/timebase/numpy_ops.py +104 -0
  911. chronaxis/user_guide.py +81 -0
  912. chronaxis-0.1.0.dev0.dist-info/METADATA +172 -0
  913. chronaxis-0.1.0.dev0.dist-info/RECORD +917 -0
  914. chronaxis-0.1.0.dev0.dist-info/WHEEL +5 -0
  915. chronaxis-0.1.0.dev0.dist-info/entry_points.txt +2 -0
  916. chronaxis-0.1.0.dev0.dist-info/licenses/LICENSE +21 -0
  917. chronaxis-0.1.0.dev0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,197 @@
1
+ """把实际封存解码历史的来源证据关联为可执行的轻量信号绑定。
2
+
3
+ 输入为DeclarationBindings及逐来源DecodedSourceEvidence,输出不可变的
4
+ DecodedBindings与独立运行身份。先检查SHA格式、投影、会话和whole-source EOF,
5
+ 再把完整实际证据与原声明身份纳入摘要;运行依赖还须存在于实际读取投影中。
6
+ 声明身份只证明配置,实际证据应由执行层工厂完整重放封存历史后生成。
7
+ 单独构造合法SHA文本或EOF字段本身不证明文件已读取、校验或具有这些内容。
8
+ 本模块仅依赖标准库和核心声明模型,不持有样本历史、不读写文件或加载NumPy。
9
+ 模型无关闭资源;执行层持有元数据的预算与生命周期由对应lease负责。
10
+ """
11
+
12
+ # 冻结证据和运行身份;不引入数组、来源适配器或磁盘操作。
13
+ from dataclasses import dataclass, field
14
+ from hashlib import sha256
15
+ from .binding import SignalDefinition, _identity
16
+ from .declarations import DeclarationBindings
17
+ from .validation import require_identifier
18
+ from ..timebase.conversion import require_int64_ns
19
+
20
+
21
+ def _require_sha256(value: str, name: str) -> None:
22
+ """只校验固定SHA-256文本格式,不声称摘要来自已核实文件。
23
+
24
+ 参数: value为64位小写十六进制文本;name为错误定位字段。
25
+ 返回: None;无数据读取或字符串归一化。
26
+ 异常: TypeError为非原生str;ValueError为长度或字符不符。
27
+ """
28
+ # 明确拒绝隐式str转换,保留工厂生成的规范摘要。
29
+ if type(value) is not str:
30
+ raise TypeError(f'{name}需要原生SHA-256字符串')
31
+ # 固定字符域同时拒绝大写、空白、换行和非十六进制字符。
32
+ if len(value) != 64 or any(character not in '0123456789abcdef' for character in value):
33
+ raise ValueError(f'{name}需要64位小写十六进制SHA-256')
34
+
35
+
36
+ @dataclass(frozen=True)
37
+ class DecodedSourceEvidence:
38
+ """保存工厂已核对的一份来源历史事实,字段冻结且不保存逐条样本。
39
+
40
+ 三份摘要分别关联实际描述、请求和规范历史,不以文件名代替数据身份。
41
+ counts记录全源重放总量,projected_aliases保存实际请求投影顺序。
42
+ 观测端点允许未知且保持None;EOF只接受整个来源结束,不能冒充批次结束。
43
+ 模型仅验证证据结构,实际文件、字段、计数和摘要由执行层工厂负责核实。
44
+ """
45
+
46
+ source: str # 当前声明中的唯一来源名。
47
+ session_id: str # 当前实际重放所属会话。
48
+ description_sha256: str # 实际来源描述及完整转换契约摘要。
49
+ request_sha256: str # 本次读取范围、投影和批次声明摘要。
50
+ history_sha256: str # 已核实规范历史字节摘要,不冒充原始日志摘要。
51
+ sample_count: int # 全源实际样本总数,非负原生整数。
52
+ progress_count: int # 全源实际批次进度记录数,至少包含最终EOF。
53
+ projected_aliases: tuple[str, ...] # 实际读取的唯一简单别名,空投影合法。
54
+ observation_start_ns: int | None # 原描述中的已知会话坐标首端;未知不补0。
55
+ observation_end_ns: int | None # 最终EOF中的已知会话坐标终点;未知不补周期。
56
+ source_eof: bool # 必须为True,表示整个配置来源已完成。
57
+
58
+ def __post_init__(self) -> None:
59
+ """检查固定身份、摘要格式、全源计数、投影和精确观测端点。
60
+
61
+ 参数: 无,读取冻结字段;时间单位均为整数纳秒。
62
+ 返回: None;合法整数端点规范为原生int,None保持未知。
63
+ 异常: TypeError/ValueError为结构或事实矛盾;时间溢出异常原样传播。
64
+ 副作用: 仅在构造期规范本对象端点,不访问来源或验证文件内容。
65
+ """
66
+ # 来源/会话名称不能借点号路径或任意对象绕过身份检查。
67
+ require_identifier(self.source, 'decoded.source')
68
+ require_identifier(self.session_id, 'decoded.session_id')
69
+ # 三种证据用途不同,逐项校验而不把任一摘要当另一个摘要使用。
70
+ for name, value in (('description_sha256', self.description_sha256),
71
+ ('request_sha256', self.request_sha256),
72
+ ('history_sha256', self.history_sha256)):
73
+ _require_sha256(value, f'decoded.{name}')
74
+ # bool不是计数;最终EOF至少对应一条实际进度记录。
75
+ if type(self.sample_count) is not int or self.sample_count < 0:
76
+ raise ValueError('decoded.sample_count需要非负原生int')
77
+ if type(self.progress_count) is not int or self.progress_count < 1:
78
+ raise ValueError('decoded.progress_count需要至少为1的原生int')
79
+ # 冻结投影顺序,不隐式消除重复或接受可变列表。
80
+ if type(self.projected_aliases) is not tuple:
81
+ raise TypeError('decoded.projected_aliases需要tuple')
82
+ for alias in self.projected_aliases:
83
+ require_identifier(alias, 'decoded.projected_alias')
84
+ if len(set(self.projected_aliases)) != len(self.projected_aliases):
85
+ raise ValueError('decoded.projected_aliases不能重复')
86
+ # 单个已知端点独立检查;不凭请求域或投影首样本推断未知端点。
87
+ start = None if self.observation_start_ns is None else require_int64_ns(self.observation_start_ns, 'decoded.observation_start_ns')
88
+ end = None if self.observation_end_ns is None else require_int64_ns(self.observation_end_ns, 'decoded.observation_end_ns')
89
+ if start is not None and end is not None and end < start:
90
+ raise ValueError('decoded来源观测终点早于起点')
91
+ # 普通批次结束不能升级为可执行证据,只接真正全源耗尽的明确bool。
92
+ if type(self.source_eof) is not bool or not self.source_eof:
93
+ raise ValueError('decoded证据需要真正whole-source EOF=True')
94
+ # 身份编码只接原生标量,整数规范保留精确坐标,不改变端点含义。
95
+ object.__setattr__(self, 'observation_start_ns', start)
96
+ object.__setattr__(self, 'observation_end_ns', end)
97
+
98
+
99
+ @dataclass(frozen=True)
100
+ class DecodedBindings:
101
+ """冻结当前声明与实际解码历史证据,供编译和两个数值context入口使用。
102
+
103
+ sources必须与声明来源一一对应,投影只能包含该来源声明的原信号别名。
104
+ identity使用decoded-binding-v1前缀与完整证据,不能与声明或memory身份混用。
105
+ resolve仅委托冻结声明;执行前仍检查实际投影和已有同步政策。
106
+ 本对象不保存SourceSpec.rows,也不能交给材料化完整内存历史的快捷入口。
107
+ """
108
+
109
+ declarations: DeclarationBindings # 原配置关系与同步依据;其身份仍只是声明证明。
110
+ sources: tuple[DecodedSourceEvidence, ...] # 已核对来源事实,保留工厂的固定顺序。
111
+ identity: str = field(init=False) # 声明加实际证据的独立SHA-256运行身份。
112
+
113
+ def __post_init__(self) -> None:
114
+ """检查来源/会话/投影归属,再生成与完整实际证据关联的身份。
115
+
116
+ 参数: 无,读取declarations与sources;所有容器必须冻结。
117
+ 返回: None;构造identity,不重新读取历史或改变声明。
118
+ 异常: TypeError/ValueError为模型、重复/缺少来源、会话或投影冲突。
119
+ """
120
+ # 只接明确类型,声明或自由dict不能自行冒充实际来源证据。
121
+ if (not isinstance(self.declarations, DeclarationBindings) or type(self.sources) is not tuple
122
+ or any(not isinstance(item, DecodedSourceEvidence) for item in self.sources)):
123
+ raise TypeError('解码绑定需要DeclarationBindings和DecodedSourceEvidence tuple')
124
+ names = {item.source for item in self.sources}
125
+ if len(names) != len(self.sources) or names != {item.name for item in self.declarations.sources}:
126
+ raise ValueError('解码证据来源必须唯一且与声明完全对应')
127
+ for evidence in self.sources:
128
+ # 来源事实不能跨会话借用,即使字段/摘要文本相同也不接受。
129
+ if evidence.session_id != self.declarations.session_id:
130
+ raise ValueError('解码证据会话与当前声明不一致')
131
+ aliases = {item.name for item in self.declarations.signals if item.source == evidence.source}
132
+ if not set(evidence.projected_aliases).issubset(aliases):
133
+ raise ValueError('解码投影包含其他来源或未声明别名')
134
+ # 完整证据保留来源/请求/历史摘要、原范围、全源计数和实际投影;不只哈希配置。
135
+ payload = ('decoded-binding-v1', self.declarations.identity,
136
+ tuple((item.source, item.session_id, item.description_sha256, item.request_sha256,
137
+ item.history_sha256, item.sample_count, item.progress_count, item.projected_aliases,
138
+ item.observation_start_ns, item.observation_end_ns, item.source_eof) for item in self.sources))
139
+ object.__setattr__(self, 'identity', sha256(_identity(payload).encode('utf-8')).hexdigest())
140
+
141
+ @property
142
+ def signals(self) -> tuple[SignalDefinition, ...]:
143
+ """读取当前冻结信号声明,不创建原始行或数值历史。
144
+
145
+ 参数: 无。返回: SignalDefinition tuple。异常: 无;属性不能重新赋值。
146
+ """
147
+ return self.declarations.signals
148
+
149
+ @property
150
+ def projected_signals(self) -> tuple[SignalDefinition, ...]:
151
+ """按原声明顺序返回实际历史投影中的定义,不把未读取声明当作运行状态。
152
+
153
+ 参数: 无,使用当前已校验sources中的projected_aliases。
154
+ 返回: 原SignalDefinition对象组成的tuple;signals仍保留完整声明。
155
+ 异常: 分配或取消错误原样传播。调用执行层须先为有限索引和tuple预付费用。
156
+ 不读取历史、不改变绑定身份,也不把不同来源的投影误判为同步依据。
157
+ """
158
+ selected = None
159
+ try:
160
+ selected = {name for source in self.sources for name in source.projected_aliases}
161
+ return tuple(item for item in self.declarations.signals if item.name in selected)
162
+ finally:
163
+ selected = None
164
+
165
+ @property
166
+ def derived_names(self) -> tuple[str, ...]:
167
+ """读取当前统一名称空间中的派生别名。
168
+
169
+ 参数: 无。返回: str tuple。异常: 无;不把派生名称当实际读入列。
170
+ """
171
+ return self.declarations.derived_names
172
+
173
+ def resolve(self, name: str) -> SignalDefinition:
174
+ """按当前声明查找原信号定义,不推断字段或执行数值转换。
175
+
176
+ 参数: name为安全简单别名。返回: 当前SignalDefinition。
177
+ 异常: ValueError为非法或未声明名称;查找本身不证明该别名已投影。
178
+ """
179
+ return self.declarations.resolve(name)
180
+
181
+ def require_synchronized(self, names: tuple[str, ...]) -> None:
182
+ """先证明全部实际依赖已读取,再应用既有多源同步政策。
183
+
184
+ 参数: names为展开后的原信号依赖tuple;空依赖合法。
185
+ 返回: None;不修改投影、偏移或同步声明。
186
+ 异常: TypeError为错误容器;ValueError为未知/未投影依赖或同步缺项。
187
+ """
188
+ # 可变/无限依赖容器不能绕过冻结编译协议。
189
+ if type(names) is not tuple:
190
+ raise TypeError('解码联合依赖names必须为tuple')
191
+ evidence_by_source = {item.source: item for item in self.sources}
192
+ for name in names:
193
+ definition = self.resolve(name)
194
+ if name not in evidence_by_source[definition.source].projected_aliases:
195
+ raise ValueError(f'运行依赖未在实际解码投影中:{name}')
196
+ # offset数值或同名时基不替代原有核实同步依据;不另立宽松政策。
197
+ self.declarations.require_synchronized(names)
@@ -0,0 +1,387 @@
1
+ """保存直接消息累计的版本化扫描证据,不声称消息历史曾写入磁盘。
2
+
3
+ 输入由执行层在同次真实扫描、EOF和读取资源关闭后提取;本模块仅校有限结构,
4
+ 不读CAN/DBC、不重算信号、不认证手造对象。旧signal_stream_sha256明确对应全部
5
+ 声明信号的规范HistorySample/HistoryProgress流,既非原文件SHA,也非消息仓SHA。
6
+ 新输入证据单独保存全部原时间及实际保留计算记录的传输内容摘要;不生成普通
7
+ 信号样本,不以零样本数或旧摘要字段冒充整套信号检查,也不覆盖未传输的帧载荷。
8
+ 全原帧观测、投影和指标ID选择分别保留,避免把信号样本数误作原帧数。结果解码时
9
+ 重新执行严格校验;身份由全部字段及独立版本生成,不借用MessageBindings身份。
10
+ """
11
+
12
+ from dataclasses import dataclass, field
13
+
14
+ from .message_binding import _hash_parts
15
+ from .validation import require_identifier, require_text
16
+ from ..timebase.conversion import require_int64_ns
17
+
18
+
19
+ def _text(value, name, *, identifier=False):
20
+ """检查原生非空文本。参数: 原值、字段名及名称开关。返回: None。异常: 原类型/文本错误。"""
21
+ if type(value) is not str:
22
+ raise TypeError(name + '需要原生str')
23
+ (require_identifier if identifier else require_text)(value, name)
24
+
25
+
26
+ def _sha(value, name):
27
+ """检查规范SHA文本,不把标签冒充摘要。参数: 原值及字段名。返回: None。异常: 类型/格式错误。"""
28
+ _text(value, name)
29
+ if len(value) != 64 or any(char not in '0123456789abcdef' for char in value):
30
+ raise ValueError(name + '需要64位小写SHA-256')
31
+
32
+
33
+ @dataclass(frozen=True)
34
+ class DirectMessageEvidence:
35
+ """冻结一次已完成扫描的有限事实;构造成功本身不证明实际读取发生。"""
36
+
37
+ source: str # 原计划中的CAN来源名。
38
+ session_id: str # 同次请求的会话身份。
39
+ decoder_profile: str # 同次READY确认的旧解码profile。
40
+ read_identity: str # 实际read的UUID,不用于稳定输入身份。
41
+ input_identity: str # 原来源声明的输入身份,不冒充原文件内容SHA。
42
+ source_contract_sha256: str # 来源配置、时基、偏移和输入声明的规范摘要。
43
+ description_sha256: str # 原adapter描述的规范摘要。
44
+ request_sha256: str # 本次全部别名、请求范围及批上限的规范摘要。
45
+ signal_stream_sha256: str # 已校验信号样本/进度流摘要;不存在对应消息历史文件。
46
+ projected_aliases: tuple[str, ...] # 原请求的完整别名顺序,允许空投影。
47
+ progress_count: int # 实际验证的进度记录数,含最终EOF记录。
48
+ sample_count: int # 已校验信号样本数,多信号时不同于原帧数。
49
+ observed_frame_count: int # 全部原yield数,包括不匹配指标或没有信号的帧。
50
+ first_time_ns: int | None # 全原帧首个映射时间,空源为None。
51
+ last_time_ns: int | None # 全原帧最后映射时间,不补采样周期。
52
+ observed_start_ns: int | None # 来源实际观测范围起点,可保声明的更早起点。
53
+ observed_end_ns: int | None # 真实EOF确认的观测终点。
54
+ calculation_frame_ids: tuple[int, ...] # 指标请求的去重原ID,非全部读取帧集合。
55
+ source_eof: bool # 必须True;工厂还需核实际进程结束和read关闭。
56
+ evidence_kind: str = 'can-direct-scan-v1' # 与消息仓证据完全独立的固定版本。
57
+ identity: str = field(init=False) # 全字段版本化SHA,含本次read UUID。
58
+
59
+ def __post_init__(self):
60
+ """核扫描范围、真实EOF标志和固定选择域,再计算独立身份。
61
+
62
+ 参数: 全部构造字段。返回: None,时间规范为原生int,identity为全字段SHA。
63
+ 异常: TypeError/ValueError为结构矛盾;时间越界、编码及取消错误原样传播。
64
+ 执行工厂还须核同scan/read/request及预算归属;此模型不开放假历史字段。
65
+ """
66
+ for name in ('source', 'session_id'):
67
+ _text(getattr(self, name), 'direct.' + name, identifier=True)
68
+ for name in ('decoder_profile', 'read_identity', 'input_identity'):
69
+ _text(getattr(self, name), 'direct.' + name)
70
+ if type(self.evidence_kind) is not str or self.evidence_kind != 'can-direct-scan-v1':
71
+ raise ValueError('直接消息证据只支持can-direct-scan-v1')
72
+ for name in ('source_contract_sha256', 'description_sha256', 'request_sha256', 'signal_stream_sha256'):
73
+ _sha(getattr(self, name), 'direct.' + name)
74
+ if type(self.projected_aliases) is not tuple:
75
+ raise TypeError('直接扫描投影需要tuple')
76
+ for alias in self.projected_aliases:
77
+ _text(alias, 'direct.projected_alias', identifier=True)
78
+ if len(set(self.projected_aliases)) != len(self.projected_aliases):
79
+ raise ValueError('直接扫描投影不能重复')
80
+ for name in ('progress_count', 'sample_count', 'observed_frame_count'):
81
+ value = getattr(self, name)
82
+ if type(value) is not int or value < 0:
83
+ raise ValueError('direct.' + name + '需要非负原生int')
84
+ if not self.progress_count or self.source_eof is not True:
85
+ raise ValueError('直接扫描证据需要完整EOF及至少一次进度记录')
86
+ if not self.projected_aliases and self.sample_count:
87
+ raise ValueError('空投影不能有信号样本')
88
+ for name in ('first_time_ns', 'last_time_ns', 'observed_start_ns', 'observed_end_ns'):
89
+ value = getattr(self, name)
90
+ if value is not None:
91
+ object.__setattr__(self, name, require_int64_ns(value, 'direct.' + name))
92
+ if self.observed_frame_count == 0:
93
+ if self.first_time_ns is not None or self.last_time_ns is not None or self.sample_count:
94
+ raise ValueError('全空扫描不能有原帧首末或信号样本')
95
+ elif (self.first_time_ns is None or self.last_time_ns is None
96
+ or self.observed_start_ns is None or self.observed_end_ns is None
97
+ or not self.observed_start_ns <= self.first_time_ns <= self.last_time_ns <= self.observed_end_ns):
98
+ raise ValueError('非空直接扫描需有序首末及包含原帧的观测范围')
99
+ if (self.observed_start_ns is not None and self.observed_end_ns is not None
100
+ and self.observed_start_ns > self.observed_end_ns):
101
+ raise ValueError('直接扫描观测范围不能回退')
102
+ if type(self.calculation_frame_ids) is not tuple or not self.calculation_frame_ids:
103
+ raise TypeError('直接累计指标帧ID需要非空tuple')
104
+ previous = -1
105
+ for frame_id in self.calculation_frame_ids:
106
+ if type(frame_id) is not int or not 0 <= frame_id <= 0x1fffffff or frame_id <= previous:
107
+ raise ValueError('直接累计帧ID须为严格递增且范围合法的原生int')
108
+ previous = frame_id
109
+ parts = None
110
+ try:
111
+ # 用长度前缀hash编码每字段;嵌套tuple先明确数量,不以文本拼接猜边界。
112
+ parts = (self.evidence_kind, self.source, self.session_id, self.decoder_profile,
113
+ self.read_identity, self.input_identity, self.source_contract_sha256,
114
+ self.description_sha256, self.request_sha256, self.signal_stream_sha256,
115
+ str(len(self.projected_aliases)), *self.projected_aliases,
116
+ str(self.progress_count), str(self.sample_count), str(self.observed_frame_count),
117
+ *(str(value) if value is not None else 'none' for value in
118
+ (self.first_time_ns, self.last_time_ns, self.observed_start_ns, self.observed_end_ns)),
119
+ str(len(self.calculation_frame_ids)), *(str(value) for value in self.calculation_frame_ids), 'true')
120
+ object.__setattr__(self, 'identity', _hash_parts(parts))
121
+ finally:
122
+ parts = None
123
+
124
+
125
+ @dataclass(frozen=True)
126
+ class DirectMessageInputEvidence:
127
+ """冻结按实际需求完成读取的输入事实,与旧普通信号扫描证据分开。
128
+
129
+ 原时间摘要按原序连接每帧大端float64字节,保留正负零;记录摘要连接每条
130
+ 已严格解包记录的四字节长度及JSON字节,两者均不包含批头,故不依赖分批。
131
+ 它们不是BLF文件SHA,也不证明未保留帧的载荷;实际投影范围由请求、描述、
132
+ 所需别名和指标ID共同标识。构造仅检查有限结构,完成工厂仍须核同次读取、
133
+ 全部时间映射、EOF与资源成功关闭,并先预约模型和身份计算的内存。
134
+ """
135
+
136
+ source: str # 计划中的CAN来源名称。
137
+ session_id: str # 同次读取和累计所属的会话身份。
138
+ decoder_profile: str # 实际READY确认的旧解码profile。
139
+ read_identity: str # 同次真实read UUID,不用于跨运行稳定输入身份。
140
+ input_identity: str # 原来源输入声明身份,不冒充BLF内容SHA。
141
+ source_contract_sha256: str # 来源配置、时基、偏移与输入声明的规范摘要。
142
+ description_sha256: str # 实际来源描述,包含解码策略和字段选择范围。
143
+ request_sha256: str # 实际请求字段、范围、批上限等的规范摘要。
144
+ original_timestamps_sha256: str # 全部原帧时间字节流SHA,包含未保留帧的时间。
145
+ retained_records_sha256: str # 保留记录长度及JSON字节流SHA,仅覆盖实际投影内容。
146
+ required_aliases: tuple[str, ...] # 本次实际计算所需别名顺序,常量指标允许为空。
147
+ observed_frame_count: int # 全部原yield数量,不限于目标ID或有效计算。
148
+ retained_record_count: int # 严格解包的实际保留记录数,不等同求值或贡献数。
149
+ first_time_ns: int | None # 全原帧首个映射时间;空输入为None。
150
+ last_time_ns: int | None # 全原帧最后映射时间,不补采样周期。
151
+ observed_start_ns: int | None # 实际观测范围起点,可包括声明的更早起点。
152
+ observed_end_ns: int | None # 真实EOF确认的观测终点。
153
+ calculation_frame_ids: tuple[int, ...] # 指标请求的去重原ID,严格递增。
154
+ source_eof: bool # 只能为True;工厂另核真实EOF和成功关闭。
155
+ evidence_kind: str = 'can-direct-input-v2' # 与旧信号流及消息历史证据不同的版本。
156
+ identity: str = field(init=False) # 全部字段及版本的SHA,包含本次read UUID。
157
+
158
+ def __post_init__(self):
159
+ """核实际选择、两路内容摘要及完整读取范围,计算独立版本身份。
160
+
161
+ 参数: 全部构造字段;计数为非负原生int,时间为可规范化的int64纳秒。
162
+ 返回: None;时间规范为原生int,identity写入全字段版本化SHA。
163
+ 异常: TypeError/ValueError为结构矛盾,时间溢出、编码或取消错误原样传播。
164
+ 无文件或进程操作;SHA文本合法不等于此构造器认证了实际输入内容。
165
+ """
166
+ # 输入身份与读取身份保持原含义,不把同名旧证据或自由标签当成新版本。
167
+ for name in ('source', 'session_id'):
168
+ _text(getattr(self, name), 'direct_input.' + name, identifier=True)
169
+ for name in ('decoder_profile', 'read_identity', 'input_identity'):
170
+ _text(getattr(self, name), 'direct_input.' + name)
171
+ if type(self.evidence_kind) is not str or self.evidence_kind != 'can-direct-input-v2':
172
+ raise ValueError('直接输入证据只支持can-direct-input-v2')
173
+ for name in ('source_contract_sha256', 'description_sha256', 'request_sha256',
174
+ 'original_timestamps_sha256', 'retained_records_sha256'):
175
+ _sha(getattr(self, name), 'direct_input.' + name)
176
+
177
+ # 空别名不等于空记录:纯参数表达式仍按实际selector消息求值。
178
+ if type(self.required_aliases) is not tuple:
179
+ raise TypeError('直接输入所需别名需要tuple')
180
+ for alias in self.required_aliases:
181
+ _text(alias, 'direct_input.required_alias', identifier=True)
182
+ if len(set(self.required_aliases)) != len(self.required_aliases):
183
+ raise ValueError('直接输入所需别名不能重复')
184
+ for name in ('observed_frame_count', 'retained_record_count'):
185
+ value = getattr(self, name)
186
+ if type(value) is not int or value < 0:
187
+ raise ValueError('direct_input.' + name + '需要非负原生int')
188
+ if self.retained_record_count > self.observed_frame_count:
189
+ raise ValueError('保留计算记录数不能超过全部原帧数')
190
+ if self.source_eof is not True:
191
+ raise ValueError('直接输入证据需要真实完整EOF')
192
+
193
+ # 两路都是原字节流SHA;零项的规范值已知,不能用任意摘要假装空输入。
194
+ empty_sha256 = 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'
195
+ if not self.observed_frame_count and self.original_timestamps_sha256 != empty_sha256:
196
+ raise ValueError('无原帧时原时间摘要必须为空字节流SHA-256')
197
+ if not self.retained_record_count and self.retained_records_sha256 != empty_sha256:
198
+ raise ValueError('无保留记录时记录摘要必须为空字节流SHA-256')
199
+
200
+ # 先规范时间再比较。空来源可保声明范围,但不伪造首末原帧时间。
201
+ for name in ('first_time_ns', 'last_time_ns', 'observed_start_ns', 'observed_end_ns'):
202
+ value = getattr(self, name)
203
+ if value is not None:
204
+ object.__setattr__(self, name, require_int64_ns(value, 'direct_input.' + name))
205
+ if (self.observed_start_ns is None) != (self.observed_end_ns is None):
206
+ raise ValueError('直接输入观测范围起终必须同时存在或同时为空')
207
+ if not self.observed_frame_count:
208
+ if self.first_time_ns is not None or self.last_time_ns is not None:
209
+ raise ValueError('全空直接输入不能有原帧首末时间')
210
+ elif (self.first_time_ns is None or self.last_time_ns is None
211
+ or self.observed_start_ns is None or self.observed_end_ns is None
212
+ or not self.observed_start_ns <= self.first_time_ns <= self.last_time_ns <= self.observed_end_ns):
213
+ raise ValueError('非空直接输入需有序首末及包含原帧的观测范围')
214
+ if (self.observed_start_ns is not None and self.observed_end_ns is not None
215
+ and self.observed_start_ns > self.observed_end_ns):
216
+ raise ValueError('直接输入观测范围不能回退')
217
+
218
+ # ID只表示指标选择,不声称全部原帧ID集合或所有帧都产生了计算记录。
219
+ if type(self.calculation_frame_ids) is not tuple or not self.calculation_frame_ids:
220
+ raise TypeError('直接输入指标帧ID需要非空tuple')
221
+ previous = -1
222
+ for frame_id in self.calculation_frame_ids:
223
+ if type(frame_id) is not int or not 0 <= frame_id <= 0x1fffffff or frame_id <= previous:
224
+ raise ValueError('直接输入帧ID须为严格递增且范围合法的原生int')
225
+ previous = frame_id
226
+ parts = None
227
+ try:
228
+ # 字段与tuple均有明确边界;把两个摘要分别绑定,不能互换后保留身份。
229
+ parts = (self.evidence_kind, self.source, self.session_id, self.decoder_profile,
230
+ self.read_identity, self.input_identity, self.source_contract_sha256,
231
+ self.description_sha256, self.request_sha256, self.original_timestamps_sha256,
232
+ self.retained_records_sha256, str(len(self.required_aliases)), *self.required_aliases,
233
+ str(self.observed_frame_count), str(self.retained_record_count),
234
+ *(str(value) if value is not None else 'none' for value in
235
+ (self.first_time_ns, self.last_time_ns, self.observed_start_ns, self.observed_end_ns)),
236
+ str(len(self.calculation_frame_ids)), *(str(value) for value in self.calculation_frame_ids), 'true')
237
+ object.__setattr__(self, 'identity', _hash_parts(parts))
238
+ finally:
239
+ # 取消或编码失败不由本帧额外保留新身份tuple;外层负责模型费用恢复。
240
+ parts = None
241
+
242
+
243
+ @dataclass(frozen=True)
244
+ class DemandMessageInputEvidence:
245
+ """保存按需处理范围与实际输入,允许完全不采集时间。
246
+
247
+ source模式的时间摘要连接每帧float64字节,其他模式为None。记录摘要连接每条
248
+ 已严格解包记录的四字节长度及JSON字节,两者均不包含批头,故不依赖分批。
249
+ 它们不是BLF文件SHA,也不证明未保留帧的载荷;实际投影范围由请求、描述、
250
+ 所需别名和指标ID共同标识。构造仅检查有限结构,完成工厂仍须核同次读取、
251
+ 声明范围内的时间检查、EOF与资源成功关闭,并先预约模型和身份计算的内存。
252
+ """
253
+
254
+ source: str # 计划中的CAN来源名称。
255
+ session_id: str # 同次读取和累计所属的会话身份。
256
+ decoder_profile: str # 实际READY确认的旧解码profile。
257
+ read_identity: str # 同次真实read UUID,不用于跨运行稳定输入身份。
258
+ input_identity: str # 原来源输入声明身份,不冒充BLF内容SHA。
259
+ source_contract_sha256: str # 来源配置、时基、偏移与输入声明的规范摘要。
260
+ description_sha256: str # 实际来源描述,包含解码策略和字段选择范围。
261
+ request_sha256: str # 实际请求字段、范围、批上限等的规范摘要。
262
+ original_timestamps_sha256: str | None # 只有source模式提供全部原帧时间SHA。
263
+ retained_records_sha256: str # 保留记录长度及JSON字节流SHA,仅覆盖实际投影内容。
264
+ required_aliases: tuple[str, ...] # 本次实际计算所需别名顺序,常量指标允许为空。
265
+ observed_frame_count: int # 全部原yield数量,不限于目标ID或有效计算。
266
+ retained_record_count: int # 严格解包的实际保留记录数,不等同求值或贡献数。
267
+ first_time_ns: int | None # source为全来源首时间,selected为目标首时间,none未采集。
268
+ last_time_ns: int | None # 对应采集范围的末时间,不补采样周期。
269
+ observed_start_ns: int | None # 实际观测范围起点,可包括声明的更早起点。
270
+ observed_end_ns: int | None # 真实EOF确认的观测终点。
271
+ calculation_frame_ids: tuple[int, ...] # 指标请求的去重原ID,严格递增。
272
+ source_eof: bool # 只能为True;工厂另核真实EOF和成功关闭。
273
+ time_scope: str # none/selected/source,只描述实际采集范围。
274
+ input_check: str # auto/full,实际worker握手认证的检查策略。
275
+ evidence_kind: str = 'can-demand-input-v1' # 与旧信号流及消息历史证据不同的版本。
276
+ identity: str = field(init=False) # 全部字段及版本的SHA,包含本次read UUID。
277
+
278
+ def __post_init__(self):
279
+ """核实际选择、两路内容摘要及完整读取范围,计算独立版本身份。
280
+
281
+ 参数: 全部构造字段;计数为非负原生int,时间为可规范化的int64纳秒。
282
+ 返回: None;时间规范为原生int,identity写入全字段版本化SHA。
283
+ 异常: TypeError/ValueError为结构矛盾,时间溢出、编码或取消错误原样传播。
284
+ 无文件或进程操作;SHA文本合法不等于此构造器认证了实际输入内容。
285
+ """
286
+ # 输入身份与读取身份保持原含义,不把同名旧证据或自由标签当成新版本。
287
+ for name in ('source', 'session_id'):
288
+ _text(getattr(self, name), 'direct_input.' + name, identifier=True)
289
+ for name in ('decoder_profile', 'read_identity', 'input_identity'):
290
+ _text(getattr(self, name), 'direct_input.' + name)
291
+ if type(self.evidence_kind) is not str or self.evidence_kind != 'can-demand-input-v1':
292
+ raise ValueError('直接输入证据只支持can-demand-input-v1')
293
+ for name in ('source_contract_sha256', 'description_sha256', 'request_sha256',
294
+ 'retained_records_sha256'):
295
+ _sha(getattr(self, name), 'direct_input.' + name)
296
+
297
+ # 不采集全原时间时使用None,禁止空SHA或目标时间SHA冒充全时间证据。
298
+ if type(self.time_scope) is not str or self.time_scope not in ('none', 'selected', 'source'):
299
+ raise ValueError('按需输入时间范围仅none/selected/source')
300
+ if type(self.input_check) is not str or self.input_check not in ('auto', 'full'):
301
+ raise ValueError('按需输入检查范围仅auto/full')
302
+ if self.input_check == 'full' and self.time_scope != 'source':
303
+ raise ValueError('完整检查必须覆盖整个来源时间')
304
+ if self.time_scope == 'source':
305
+ _sha(self.original_timestamps_sha256, 'demand.original_timestamps_sha256')
306
+ elif self.original_timestamps_sha256 is not None:
307
+ raise ValueError('未采集全部原时间时不能声明全时间摘要')
308
+
309
+ # 空别名不等于空记录:纯参数表达式仍按实际selector消息求值。
310
+ if type(self.required_aliases) is not tuple:
311
+ raise TypeError('直接输入所需别名需要tuple')
312
+ for alias in self.required_aliases:
313
+ _text(alias, 'direct_input.required_alias', identifier=True)
314
+ if len(set(self.required_aliases)) != len(self.required_aliases):
315
+ raise ValueError('直接输入所需别名不能重复')
316
+ for name in ('observed_frame_count', 'retained_record_count'):
317
+ value = getattr(self, name)
318
+ if type(value) is not int or value < 0:
319
+ raise ValueError('direct_input.' + name + '需要非负原生int')
320
+ if self.retained_record_count > self.observed_frame_count:
321
+ raise ValueError('保留计算记录数不能超过全部原帧数')
322
+ if self.source_eof is not True:
323
+ raise ValueError('直接输入证据需要真实完整EOF')
324
+
325
+ # 两路都是原字节流SHA;零项的规范值已知,不能用任意摘要假装空输入。
326
+ empty_sha256 = 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'
327
+ if self.time_scope == 'source' and not self.observed_frame_count and self.original_timestamps_sha256 != empty_sha256:
328
+ raise ValueError('无原帧时原时间摘要必须为空字节流SHA-256')
329
+ if not self.retained_record_count and self.retained_records_sha256 != empty_sha256:
330
+ raise ValueError('无保留记录时记录摘要必须为空字节流SHA-256')
331
+
332
+ # 先规范时间再比较。空来源可保声明范围,但不伪造首末原帧时间。
333
+ for name in ('first_time_ns', 'last_time_ns', 'observed_start_ns', 'observed_end_ns'):
334
+ value = getattr(self, name)
335
+ if value is not None:
336
+ object.__setattr__(self, name, require_int64_ns(value, 'direct_input.' + name))
337
+ if (self.observed_start_ns is None) != (self.observed_end_ns is None):
338
+ raise ValueError('直接输入观测范围起终必须同时存在或同时为空')
339
+ if self.time_scope == 'none':
340
+ if any(getattr(self, name) is not None for name in
341
+ ('first_time_ns', 'last_time_ns', 'observed_start_ns', 'observed_end_ns')):
342
+ raise ValueError('无时间输入不能伪造首末或观测范围')
343
+ elif self.time_scope == 'selected':
344
+ if self.observed_start_ns is not None or self.observed_end_ns is not None:
345
+ raise ValueError('目标记录范围不能冒充整个来源的观测范围')
346
+ if self.retained_record_count:
347
+ if self.first_time_ns is None or self.last_time_ns is None or self.first_time_ns > self.last_time_ns:
348
+ raise ValueError('非空目标时间需有序首末')
349
+ elif self.first_time_ns is not None or self.last_time_ns is not None:
350
+ raise ValueError('没有目标记录不能声明目标首末时间')
351
+ elif not self.observed_frame_count:
352
+ if self.first_time_ns is not None or self.last_time_ns is not None:
353
+ raise ValueError('全空直接输入不能有原帧首末时间')
354
+ elif (self.first_time_ns is None or self.last_time_ns is None
355
+ or self.observed_start_ns is None or self.observed_end_ns is None
356
+ or not self.observed_start_ns <= self.first_time_ns <= self.last_time_ns <= self.observed_end_ns):
357
+ raise ValueError('全来源时间证明需包含全部原帧首末')
358
+
359
+ # 空来源也不能以声明边界绕过有序范围检查。
360
+ if (self.observed_start_ns is not None and self.observed_end_ns is not None
361
+ and self.observed_start_ns > self.observed_end_ns):
362
+ raise ValueError('按需输入观测范围不能回退')
363
+
364
+ # ID只表示指标选择,不声称全部原帧ID集合或所有帧都产生了计算记录。
365
+ if type(self.calculation_frame_ids) is not tuple or not self.calculation_frame_ids:
366
+ raise TypeError('直接输入指标帧ID需要非空tuple')
367
+ previous = -1
368
+ for frame_id in self.calculation_frame_ids:
369
+ if type(frame_id) is not int or not 0 <= frame_id <= 0x1fffffff or frame_id <= previous:
370
+ raise ValueError('直接输入帧ID须为严格递增且范围合法的原生int')
371
+ previous = frame_id
372
+ parts = None
373
+ try:
374
+ # 字段与tuple均有明确边界;把两个摘要分别绑定,不能互换后保留身份。
375
+ parts = (self.evidence_kind, self.source, self.session_id, self.decoder_profile,
376
+ self.read_identity, self.input_identity, self.source_contract_sha256,
377
+ self.description_sha256, self.request_sha256, self.time_scope, self.input_check,
378
+ self.original_timestamps_sha256 or 'not_collected',
379
+ self.retained_records_sha256, str(len(self.required_aliases)), *self.required_aliases,
380
+ str(self.observed_frame_count), str(self.retained_record_count),
381
+ *(str(value) if value is not None else 'none' for value in
382
+ (self.first_time_ns, self.last_time_ns, self.observed_start_ns, self.observed_end_ns)),
383
+ str(len(self.calculation_frame_ids)), *(str(value) for value in self.calculation_frame_ids), 'true')
384
+ object.__setattr__(self, 'identity', _hash_parts(parts))
385
+ finally:
386
+ # 取消或编码失败不由本帧额外保留新身份tuple;外层负责模型费用恢复。
387
+ parts = None
@@ -0,0 +1,54 @@
1
+ """计算离线导出的线性值;不改变分析中的向后保持、事件或积分语义。
2
+
3
+ 调用方已确定相邻有效端点、范围及最大间隔。参考实现用精确有理数计算后转
4
+ float64;NumPy实现以一维longdouble数组计算后转float64,计算内核独立。
5
+ 整数纳秒先作精确相对差,避免把很大的绝对时间直接转浮点。输出为估计值,
6
+ 不声称恢复真实观测;无文件、预算或全局状态。
7
+ """
8
+
9
+ from fractions import Fraction
10
+ from math import isfinite
11
+ import numpy as np
12
+
13
+
14
+ def linear_reference(times, left_ns, right_ns, left_value, right_value):
15
+ """独立标量线性参考。参数: times有限ns tuple、相邻端点时间/数值。返回: float tuple。
16
+
17
+ 异常: 时间/数值非法或结果不有限;只接受严格位于两个端点之间的目标。
18
+ """
19
+ if (not left_ns < right_ns or any(not left_ns < t < right_ns for t in times)
20
+ or not isfinite(left_value) or not isfinite(right_value)):
21
+ raise ValueError('插值需要有效有序两端与内部目标')
22
+ left,right = Fraction(left_value),Fraction(right_value)
23
+ result = tuple(float(left+(right-left)*Fraction(t-left_ns,right_ns-left_ns)) for t in times)
24
+ if any(not isfinite(value) for value in result):
25
+ raise ValueError('插值结果非有限')
26
+ return result
27
+
28
+
29
+ def linear_numpy(times, left_ns, right_ns, left_value, right_value):
30
+ """独立数组线性计算。参数: 同reference。返回: shape(N,) float64 ndarray。
31
+
32
+ 异常: 时间/值非法或结果不有限;数组副本限当前有限块,不使用object数组。
33
+ """
34
+ if (not left_ns < right_ns or any(not left_ns < t < right_ns for t in times)
35
+ or not isfinite(left_value) or not isfinite(right_value)):
36
+ raise ValueError('插值需要有效有序两端与内部目标')
37
+ # 先精确减绝对坐标再装箱,按相同时间权重对整块执行真实数组运算。
38
+ relative = np.asarray([t-left_ns for t in times],dtype=np.longdouble)
39
+ span=np.longdouble(right_ns-left_ns)
40
+ left,right=np.longdouble(left_value),np.longdouble(right_value)
41
+ # Windows longdouble可能就是float64;用较近端点的增量,减少两项乘法及抵消误差。
42
+ # 两个合法极大有限端点的差可能溢出,只在该明确中间状态采用凸组合。
43
+ with np.errstate(over='ignore'):
44
+ difference=right-left
45
+ if np.isfinite(difference):
46
+ from_right=np.asarray([right_ns-t for t in times],dtype=np.longdouble)
47
+ values=np.where(relative<=from_right,left+difference*(relative/span),
48
+ right-difference*(from_right/span)).astype(np.float64)
49
+ else:
50
+ alpha=relative/span
51
+ values=np.asarray((1-alpha)*left+alpha*right,dtype=np.float64)
52
+ if not np.all(np.isfinite(values)):
53
+ raise ValueError('插值结果非有限')
54
+ return values