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,127 @@
1
+ """用真实数组计算有限块的原序ZOH面积项,不在块内先求和或换单位。
2
+
3
+ 输入为无条件CalculationSeries/CalculationDefinition,输出只读(N-1,)面积/有效掩码与IntegralFacts。
4
+ 先裁剪int64端点,批量计算整数差、秒、乘积及非有限/下溢掩码,UNKNOWN不补正常零。
5
+ 整数到float的判据用独立NumPy转换核;覆盖归约独立,不调用标量面积或覆盖实现。
6
+ 元数据循环仅恢复未知Interval,不承担数值计算;不修改输入或读写文件。
7
+ 输出及临时数组需在调用方有限块workspace内消费;本纯核不提供独立内存上限。
8
+ """
9
+
10
+ # 数值全部用真实ufunc/掩码/归约;只共享冻结事实和配置门槛。
11
+ from dataclasses import dataclass
12
+ import numpy as np
13
+ from .integral_terms import IntegralFacts, require_integral_terms
14
+ from .calculations import merge_ranges
15
+ from .models import Interval
16
+ from .numeric_numpy import DTYPES, NumericArray, to_float_numpy
17
+ from .types import QualityFlag as Q
18
+
19
+
20
+ @dataclass(frozen=True)
21
+ class NumpyIntegralTerms:
22
+ """持有只读面积及显式有效掩码,数组保持原区间顺序。"""
23
+
24
+ areas: np.ndarray # float64形状(N-1,),无效位置0只是存储。
25
+ valid: np.ndarray # bool形状(N-1,),True位置可归约。
26
+ facts: IntegralFacts # 当前块原请求/覆盖/诊断和完整真实来源。
27
+
28
+ def __post_init__(self):
29
+ """检查真实一维同长只读数组,不接受object或非有限占位。
30
+
31
+ 参数: 无。返回: None。异常: TypeError/ValueError为数组或事实错误。
32
+ """
33
+ # 只接受同形真实数值列,返回后禁止原地改写冻结面积事实。
34
+ if (not isinstance(self.areas, np.ndarray) or not isinstance(self.valid, np.ndarray)
35
+ or self.areas.dtype != np.float64 or self.valid.dtype != bool
36
+ or self.areas.ndim != 1 or self.areas.shape != self.valid.shape
37
+ or not isinstance(self.facts, IntegralFacts)):
38
+ raise TypeError('数组积分项需要同长一维float64/bool及IntegralFacts')
39
+ if (self.areas.flags.writeable or self.valid.flags.writeable
40
+ or not np.all(np.isfinite(self.areas)) or np.any(~self.valid & (self.areas != 0))):
41
+ raise ValueError('数组积分项必须只读且有限,无效位置仅0存储')
42
+
43
+
44
+ def compute_integral_terms_numpy(series, spec, *, step_ns=None, retain_unknown_ranges=True, valid_until_ns=None):
45
+ """批量生成未转换面积与有效掩码,独立计算覆盖和样本数。
46
+
47
+ 参数: series为有限CalculationSeries,spec为无条件integral请求;step_ns省略保持
48
+ 实际积分,指定时只接收所选驱动真实更新,按实际交集比例计周期。
49
+ retain_unknown_ranges=False跳过未知范围对象构造,仍计算有效时长和质量。
50
+ valid_until_ns为同长实际有效截止;到达截止即失效,不改变记录对分母。
51
+ 返回: NumpyIntegralTerms;实际临时/输出列为N或N-1,面积单位input_unit乘秒。
52
+ 异常: 输入/单位/时间/分配错误传播;浮点故障追加质量并使对应项无效。
53
+ """
54
+ # typed请求先校验,实际交集仍为整数ns;输入不被裁剪改写。
55
+ require_integral_terms(series, spec, step_ns=step_ns, valid_until_ns=valid_until_ns)
56
+ if type(retain_unknown_ranges) is not bool:
57
+ raise TypeError('未知区间保留选项需要bool')
58
+ start = max(series.observation.start_ns, spec.window.start_ns)
59
+ end = min(series.observation.end_ns, spec.window.end_ns)
60
+ actual = Interval(start, end) if start <= end else None
61
+ # N个值/有效性/uint16质量列;未知0仅存储,独立转换核检查定宽精度。
62
+ column = NumericArray(series.values[0].dtype,
63
+ np.array([value.value if value.valid else 0 for value in series.values], dtype=DTYPES[series.values[0].dtype]),
64
+ np.array([value.valid for value in series.values], dtype=bool),
65
+ np.array([int(value.quality) for value in series.values], dtype=np.uint16))
66
+ values = to_float_numpy(column)
67
+ # 绝对时间不先转float;只对正裁剪区间求安全int64差。
68
+ times = np.array(series.times_ns, dtype=np.int64)
69
+ left, right = np.maximum(times[:-1], np.int64(start)), np.minimum(times[1:], np.int64(end))
70
+ observed = right > left
71
+ # 仅当前块的必要截止掩码;原始右端点继续作为周期比例的分母。
72
+ effective_right = right
73
+ expired_samples = None
74
+ if valid_until_ns is not None:
75
+ deadlines = np.array([item if item is not None else (1 << 63) - 1 for item in valid_until_ns], dtype=np.int64)
76
+ has_deadline = np.array([item is not None for item in valid_until_ns], dtype=bool)
77
+ expired_samples = has_deadline & (times >= deadlines)
78
+ effective_right = np.maximum(left, np.minimum(right, deadlines[:-1]))
79
+ effective = observed if valid_until_ns is None else observed & (effective_right > left)
80
+ durations = np.zeros(len(left), dtype=np.int64)
81
+ np.subtract(effective_right, left, out=durations, where=effective)
82
+ # N与N-1临时列均为当前块副本;mask限制乘法,面积为input_unit乘秒。
83
+ valid_values, quality_values = values.valid.copy(), values.quality.copy()
84
+ if expired_samples is not None:
85
+ valid_values[expired_samples] = False
86
+ quality_values[expired_samples] |= int(Q.STALE)
87
+ quality_values[:-1][observed & (effective_right < right)] |= int(Q.STALE)
88
+ keep = effective & valid_values[:-1]
89
+ areas = np.zeros(len(left), dtype=np.float64)
90
+ seconds = durations.astype(np.float64)
91
+ if step_ns is None:
92
+ seconds /= 1_000_000_000
93
+ else:
94
+ # 完整记录对作为分母;只算当前有限块,不创建第二时间轴或取整权重。
95
+ # CalculationSeries严格递增且观测跨度受int64限制,diff不会溢出或为零。
96
+ seconds /= np.diff(times)
97
+ seconds *= step_ns / 1_000_000_000
98
+ with np.errstate(over='ignore', under='ignore', invalid='ignore'):
99
+ np.multiply(values.values[:-1], seconds, out=areas, where=keep)
100
+ # 计算失败既影响当前面积也影响同位置样本可用性,原输入列保持不变。
101
+ nonfinite = keep & ~np.isfinite(areas)
102
+ underflow = keep & (areas == 0) & (values.values[:-1] != 0)
103
+ quality_values[:-1][nonfinite] |= int(Q.NONFINITE)
104
+ quality_values[:-1][underflow] |= int(Q.PRECISION_LOSS)
105
+ valid_values[:-1][nonfinite | underflow] = False
106
+ keep = effective & valid_values[:-1]
107
+ areas[~keep] = 0.0
108
+ # 真实样本半开计数;非负有效dt总和受原实际跨度int64上界约束。
109
+ actual_updates = np.array(series.actual_value_updates, dtype=bool)
110
+ actual_samples = actual_updates & (times >= start) & (times < end)
111
+ sample_count = int(np.count_nonzero(actual_samples & valid_values))
112
+ duration = int(np.sum(durations, where=keep, dtype=np.int64))
113
+ # 只OR实际样本和已观察正区间的诊断,窗口外末点不污染结果。
114
+ diagnostic = np.array([int(value) for value in series.diagnostics], dtype=np.uint16) | quality_values
115
+ relevant = actual_samples.copy()
116
+ relevant[:-1] |= observed
117
+ quality = Q(int(np.bitwise_or.reduce(diagnostic, where=relevant, initial=0)))
118
+ # 只对有限块的诊断恢复Interval,原时间不经float,合并仅限相邻未知。
119
+ unknown = (tuple(Interval(int(effective_right[index] if keep[index] else left[index]), int(right[index]))
120
+ for index in np.flatnonzero(observed & (~keep | (effective_right < right))))
121
+ if retain_unknown_ranges else ())
122
+ facts = IntegralFacts(spec, actual, duration, sample_count, merge_ranges(unknown), quality,
123
+ series.unit, series.binding_identity, series.source_refs)
124
+ # 输出仍归调用方块workspace存活范围;纯核没有独立资源owner。
125
+ areas.setflags(write=False)
126
+ keep.setflags(write=False)
127
+ return NumpyIntegralTerms(areas, keep, facts)
@@ -0,0 +1,91 @@
1
+ """独立标量计算有限块中的原序ZOH面积项,保留未知与覆盖事实。
2
+
3
+ 输入为无选择条件的CalculationSeries/CalculationDefinition,输出ReferenceIntegralTerms。
4
+ 逐正区间先裁剪整数ns,再乘当前有效值;不跨UNKNOWN,不先求和或换单位。
5
+ 严格检查整数到float精度、乘积非有限和非零下溢,并更新该区间样本可用性。
6
+ 只依赖标准库及typed核心,不调用NumPy、不读文件、不修改输入。
7
+ 所有有限列表/冻结输出在调用方块workspace内使用,单独调用不提供内存上限。
8
+ """
9
+
10
+ # 标量有限性及精度判据独立于数组核,只有模型与门槛共享。
11
+ from math import isfinite
12
+ from .integral_terms import IntegralFacts, ReferenceIntegralTerms, require_integral_terms
13
+ from .calculations import merge_ranges
14
+ from .models import Interval
15
+ from .numeric import ScalarValue, to_float_reference
16
+ from .types import QualityFlag as Q
17
+ from .record_intervals import clipped_record_seconds
18
+
19
+
20
+ def compute_integral_terms_reference(series, spec, *, step_ns=None, retain_unknown_ranges=True, valid_until_ns=None):
21
+ """逐区间计算原序未转换面积与明确有效掩码。
22
+
23
+ 参数: series为有限CalculationSeries;spec为无条件integral CalculationDefinition;step_ns省略
24
+ 保持实际积分,指定时输入仅含所选驱动真实更新,按实际交集比例计周期。
25
+ retain_unknown_ranges=False不构造未知区间明细,保留计算所需的有效时长/质量。
26
+ valid_until_ns为同长实际有效截止,None项表示本块无额外截止;到达截止即失效。
27
+ 返回: ReferenceIntegralTerms,areas/valid长度N-1;面积单位为input_unit乘秒。
28
+ 异常: 输入/单位/时间/分配错误传播;数值精度/溢出/下溢写入质量并使面积无效。
29
+ """
30
+ # 先验证请求;裁剪仍在精确整数ns域,无交集不产生实际范围。
31
+ require_integral_terms(series, spec, step_ns=step_ns, valid_until_ns=valid_until_ns)
32
+ if type(retain_unknown_ranges) is not bool:
33
+ raise TypeError('未知区间保留选项需要bool')
34
+ start = max(series.observation.start_ns, spec.window.start_ns)
35
+ end = min(series.observation.end_ns, spec.window.end_ns)
36
+ actual = Interval(start, end) if start <= end else None
37
+ # 每值转换独立检查精度,不改变原ScalarValue。
38
+ values = [to_float_reference(value) for value in series.values]
39
+ # 已经失效的驱动快照不能继续计算;过期时间不由固定周期延长。
40
+ if valid_until_ns is not None:
41
+ for index, deadline in enumerate(valid_until_ns):
42
+ if deadline is not None and series.times_ns[index] >= deadline:
43
+ value = values[index]
44
+ values[index] = ScalarValue(value.value, value.dtype, False, value.quality | Q.STALE, value.labels)
45
+ # 列长度受调用方有限输入约束;逐区间保留原顺序,不累计面积总值。
46
+ areas, valid, unknown = [], [], []
47
+ duration, sample_count, quality = 0, 0, Q.NONE
48
+ for index in range(len(series.times_ns) - 1):
49
+ left, right = max(start, series.times_ns[index]), min(end, series.times_ns[index + 1])
50
+ area, keep = 0.0, False
51
+ if left < right:
52
+ deadline = None if valid_until_ns is None else valid_until_ns[index]
53
+ effective_right = right if deadline is None else max(left, min(right, deadline))
54
+ # 非零实际区间才纳入来源诊断,末点不增加面积。
55
+ value = values[index]
56
+ quality |= series.diagnostics[index] | value.quality
57
+ if effective_right < right:
58
+ quality |= Q.STALE
59
+ if value.valid and left < effective_right:
60
+ seconds = ((effective_right - left) / 1_000_000_000 if step_ns is None else
61
+ clipped_record_seconds(series.times_ns[index], series.times_ns[index + 1],
62
+ spec.window if effective_right == right else Interval(left, effective_right),
63
+ step_ns=step_ns))
64
+ term = value.value * seconds
65
+ failure = Q.NONFINITE if not isfinite(term) else Q.PRECISION_LOSS if term == 0 and value.value != 0 else Q.NONE
66
+ if failure == Q.NONE:
67
+ area, keep = term, True
68
+ duration += effective_right - left
69
+ else:
70
+ # 失败项和该位置真实样本均不可核实,不把下溢当正常零。
71
+ quality |= failure
72
+ values[index] = ScalarValue(value.value, value.dtype, False, value.quality | failure, value.labels)
73
+ # 无效正区间保留位置和原因,未观察区间不伪造未知覆盖。
74
+ if not keep and retain_unknown_ranges:
75
+ unknown.append(Interval(left, right))
76
+ elif retain_unknown_ranges and effective_right < right:
77
+ unknown.append(Interval(effective_right, right))
78
+ # 保留每个原区间的槽位及顺序,未知0存储只能结合False掩码使用。
79
+ areas.append(area)
80
+ valid.append(keep)
81
+ # 样本只来自半开窗口内真实更新;面积故障已在局部转换列标无效。
82
+ for index, time in enumerate(series.times_ns):
83
+ if start <= time < end and series.actual_value_updates[index]:
84
+ value = values[index]
85
+ quality |= series.diagnostics[index] | value.quality
86
+ if value.valid:
87
+ sample_count += 1
88
+ # 仅紧凑诊断与冻结事实,原绑定/来源引用保持,不生成最终指标状态。
89
+ facts = IntegralFacts(spec, actual, duration, sample_count, merge_ranges(unknown), quality,
90
+ series.unit, series.binding_identity, series.source_refs)
91
+ return ReferenceIntegralTerms(tuple(areas), tuple(valid), facts)
@@ -0,0 +1,29 @@
1
+ """以独立NumPy运算执行均值权重归一化,不调用标量数值核。"""
2
+
3
+ import numpy as np
4
+ from .types import QualityFlag as Q
5
+
6
+
7
+ def normalized_mean_terms(values, weights, denominator):
8
+ """对有限数值列先除整窗正分母再乘值,返回只读项和质量。
9
+
10
+ 参数: 同形一维有效值/权重数组及已核实正分母。返回: (ndarray, QualityFlag)。
11
+ 异常: 结构或分配错误传播;非有限和非零下溢记质量,不修补结果。
12
+ """
13
+ try:
14
+ if values.ndim != 1 or weights.shape != values.shape or not np.isfinite(denominator) or denominator <= 0:
15
+ raise ValueError('均值需要同形一维输入和有限正分母')
16
+ if np.any(~np.isfinite(values)) or np.any(~np.isfinite(weights)) or np.any(weights <= 0):
17
+ raise ValueError('均值回读需要有限数值和正权重')
18
+ with np.errstate(over='ignore', under='ignore', invalid='ignore'):
19
+ terms = np.multiply(values, weights / denominator)
20
+ quality = Q.NONE
21
+ if np.any(~np.isfinite(terms)):
22
+ quality |= Q.NONFINITE
23
+ if np.any((terms == 0) & (values != 0)):
24
+ quality |= Q.PRECISION_LOSS
25
+ terms.setflags(write=False)
26
+ return terms, quality
27
+ finally:
28
+ # 保留原异常,断开本帧借用列,避免调用方保存traceback时延长其生命周期。
29
+ values = weights = terms = None
@@ -0,0 +1,27 @@
1
+ """复用标量均值的先归一化再相乘规则,避免先求面积导致溢出。"""
2
+
3
+ from math import isfinite
4
+ from .types import QualityFlag as Q
5
+
6
+
7
+ def normalized_mean_terms(values, weights, denominator):
8
+ """将有限有效值按整窗正分母加权,返回原序项和计算质量。
9
+
10
+ 参数: 同长有效数值/正权重序列,denominator为已核实总权重。
11
+ 返回: (tuple, QualityFlag)。异常: 结构或分配错误传播;非有限/下溢标质量。
12
+ """
13
+ try:
14
+ if len(values) != len(weights) or not isfinite(denominator) or denominator <= 0:
15
+ raise ValueError('均值需要同长输入和有限正分母')
16
+ terms, quality = [], Q.NONE
17
+ for value, weight in zip(values, weights):
18
+ if not isfinite(value) or not isfinite(weight) or weight <= 0:
19
+ raise ValueError('均值回读需要有限数值和正权重')
20
+ term = value * (weight / denominator)
21
+ failure = Q.NONFINITE if not isfinite(term) else Q.PRECISION_LOSS if term == 0 and value != 0 else Q.NONE
22
+ quality |= failure
23
+ terms.append(term if failure == Q.NONE else 0.0)
24
+ return tuple(terms), quality
25
+ finally:
26
+ # 保留原异常,断开本帧借用列,避免调用方保存traceback时延长其生命周期。
27
+ values = weights = terms = None
@@ -0,0 +1,305 @@
1
+ """为当前消息表达式声明参数,并把独立消息仓事实关联为运行绑定。
2
+
3
+ ExpressionParameter将显式单位的配置数值规范成精确FLOAT64。MessageDeclarations
4
+ 引用当前DeclarationBindings中选定来源的原SignalDefinition,不复制或虚构信号、
5
+ 普通历史或TTL;当前policy只使用本条消息原字典,不继承上一条值。
6
+ MessageSourceEvidence只检查显式来源标签、全仓摘要、条数和首末的结构;
7
+ MessageBindings将其与完整声明身份关联。真正封存文件的EOF/SHA/条数验证由
8
+ 执行层bind_message_store负责,单独构造证据不证明来源文件已经读取。
9
+
10
+ 本模块只保存冻结配置与有限事实,不读文件、不执行表达式、不加载NumPy或
11
+ CAN,也不证明仓来自同一次CAN捕获或DBC单位已核实。这些关联留给实际生产端。
12
+ 身份使用新版本前缀与固定字段的长度前缀增量SHA,不改变普通绑定的身份协议。
13
+ 模型及调用者保留的配置由调用者拥有;执行工厂另付其新运行元数据费用。
14
+ """
15
+
16
+ # 参数、证据及绑定均不可变;数值配置不从对象隐式推断。
17
+ from dataclasses import dataclass, field
18
+ from hashlib import sha256
19
+ from math import isfinite
20
+
21
+ from .binding import SignalDefinition
22
+ from .declarations import DeclarationBindings
23
+ from .types import SignalDType
24
+ from .units import UNIT_TABLE
25
+ from .validation import require_identifier, require_text
26
+ from ..timebase.conversion import require_int64_ns
27
+
28
+
29
+ def _hash_parts(parts: tuple[str, ...]) -> str:
30
+ """按固定模型字段顺序增量编码文本身份,失败不保活新增整段编码副本。
31
+
32
+ 参数: parts为本模块已检查的原生文本tuple,首项含独立版本前缀。
33
+ 返回: 小写SHA-256文本;每段UTF-8字节有长度前缀,分隔符不能造成碰撞。
34
+ 异常: 原Unicode、内存或取消错误;不调用外部repr或保存全量canonical文本。
35
+ """
36
+ raw = None
37
+ try:
38
+ digest = sha256()
39
+ for part in parts:
40
+ # 每次只保留一段编码;不同文本和字段边界均进入新身份。
41
+ if type(part) is not str:
42
+ raise TypeError('消息身份只编码已检查的原生文本')
43
+ raw = part.encode('utf-8')
44
+ digest.update(str(len(raw)).encode('ascii'))
45
+ digest.update(b':')
46
+ digest.update(raw)
47
+ raw = None
48
+ return digest.hexdigest()
49
+ finally:
50
+ # 执行工厂可能在此异常后抵费,TB不得留下本层新编码或parts容器。
51
+ raw = parts = None
52
+
53
+
54
+ @dataclass(frozen=True)
55
+ class ExpressionParameter:
56
+ """保存一个有明确单位、不可被对方重赋单位的FLOAT64配置参数。
57
+
58
+ 只接受原生有限int/float;int须能精确转为有限float,不能静默舍入。
59
+ 该参数不是信号或裸数字literal,不产生来源依赖和时间保持状态。
60
+ """
61
+
62
+ name: str # 表达式使用的安全简单名称。
63
+ value: int | float # 构造后规范为有限原生float。
64
+ unit: str # 明确单位标签;不按对方信号自动改写。
65
+ unit_status: str = field(init=False) # 只说明标签是否属于已有单位表。
66
+
67
+ def __post_init__(self) -> None:
68
+ """验证参数名称、精确数值及单位,不执行来源或表达式。
69
+
70
+ 参数: 无,读取name/value/unit。
71
+ 返回: None,value规范成FLOAT64可精确表示的原生float。
72
+ 异常: TypeError为非原生数值;ValueError为非有限、有损整数或声明非法。
73
+ """
74
+ if type(self.name) is not str or type(self.unit) is not str:
75
+ raise TypeError('表达式参数名称和单位需要原生str')
76
+ require_identifier(self.name, 'parameter.name')
77
+ require_text(self.unit, 'parameter.unit')
78
+ if type(self.value) not in (int, float):
79
+ raise TypeError('表达式参数只接受原生int/float,不能为bool')
80
+ # 在配置边界证明精确性,不把参数有损转换拖到每条消息求值中。
81
+ try:
82
+ number = float(self.value)
83
+ except OverflowError as exc:
84
+ raise ValueError('表达式参数不能表示为有限FLOAT64') from exc
85
+ if not isfinite(number) or type(self.value) is int and int(number) != self.value:
86
+ raise ValueError('表达式参数必须能精确表示为有限FLOAT64')
87
+ object.__setattr__(self, 'value', number)
88
+ object.__setattr__(self, 'unit_status', 'verified' if self.unit in UNIT_TABLE else 'unverified')
89
+
90
+ @property
91
+ def dtype(self) -> SignalDType:
92
+ """读取固定数值类型;参数: 无;返回: FLOAT64;异常: 无。"""
93
+ return SignalDType.FLOAT64
94
+
95
+
96
+ @dataclass(frozen=True)
97
+ class MessageDeclarations:
98
+ """为一个选定来源建立独立的当前消息名称空间,不制造运行证明。
99
+
100
+ signals引用原声明中的同一SignalDefinition对象。原定义的转换声明保留,
101
+ 其TTL不在本模型执行;依赖仅能来自selected source。parameters及局部
102
+ derived_names不能覆盖原计划任何signal/derived,也不能互相覆盖。
103
+ """
104
+
105
+ declarations: DeclarationBindings # 完整原配置声明及身份,非实际文件证明。
106
+ source: str # 只允许这个原来源的信号参与当前消息表达式。
107
+ parameters: tuple[ExpressionParameter, ...] = () # 有明确单位的配置参数。
108
+ derived_names: tuple[str, ...] = () # 当前指标显式登记的局部派生名。
109
+ message_policy: str = 'current_message-v1' # 只看当前字典,不沿用缓存或TTL。
110
+ identity: str = field(init=False) # 完整原配置与消息配置的独立声明SHA。
111
+
112
+ def __post_init__(self) -> None:
113
+ """核对来源、完整名称空间与policy,生成静态消息声明身份。
114
+
115
+ 参数: 无,读取冻结字段,不读取文件或DBC。
116
+ 返回: None;保原定义对象,不将声明身份当真实仓EOF证明。
117
+ 异常: TypeError为模型/容器错误;ValueError为来源、名称或policy冲突。
118
+ """
119
+ if not isinstance(self.declarations, DeclarationBindings):
120
+ raise TypeError('消息声明需要DeclarationBindings')
121
+ if type(self.source) is not str:
122
+ raise TypeError('消息来源需要原生str')
123
+ require_identifier(self.source, 'message.source')
124
+ if self.source not in {item.name for item in self.declarations.sources}:
125
+ raise ValueError('消息来源不在原声明中')
126
+ if (type(self.parameters) is not tuple or type(self.derived_names) is not tuple
127
+ or any(type(item) is not ExpressionParameter for item in self.parameters)):
128
+ raise TypeError('消息参数与局部派生名称需要typed tuple')
129
+ if type(self.message_policy) is not str or self.message_policy != 'current_message-v1':
130
+ raise ValueError('消息policy仅支持current_message-v1')
131
+ # 全原计划名称都受保护,不能利用selected source隐藏其他来源的名称冲突。
132
+ names = {item.name for item in self.declarations.signals} | set(self.declarations.derived_names)
133
+ for parameter in self.parameters:
134
+ if parameter.name in names:
135
+ raise ValueError('消息参数与原声明或其他参数名称冲突:' + parameter.name)
136
+ names.add(parameter.name)
137
+ for name in self.derived_names:
138
+ if type(name) is not str:
139
+ raise TypeError('消息局部派生名称需要原生str')
140
+ require_identifier(name, 'message.derived_name')
141
+ if name in names:
142
+ raise ValueError('消息局部派生名称冲突:' + name)
143
+ names.add(name)
144
+ parts = None
145
+ try:
146
+ # 数量字段固定参数与派生分段;完整base身份含未选来源,不能遗漏配置变化。
147
+ parts = ('message-declaration-v1', self.declarations.identity, self.source,
148
+ self.message_policy, str(len(self.parameters)))
149
+ parts += tuple(value for item in self.parameters
150
+ for value in (item.name, item.value.hex(), item.unit, item.unit_status))
151
+ parts += (str(len(self.derived_names)), *self.derived_names)
152
+ object.__setattr__(self, 'identity', _hash_parts(parts))
153
+ finally:
154
+ # 只清本层新身份容器,原声明/参数仍由调用者持有。
155
+ parts = None
156
+
157
+ @property
158
+ def signals(self) -> tuple[SignalDefinition, ...]:
159
+ """选择同一原定义对象;参数: 无;返回: tuple;异常: 无主动异常。"""
160
+ return tuple(item for item in self.declarations.signals if item.source == self.source)
161
+
162
+ def resolve(self, name: str) -> SignalDefinition:
163
+ """只定位本来源原信号,参数名称另由编译器处理。
164
+
165
+ 参数: name为安全简单信号别名。返回: 原SignalDefinition对象。
166
+ 异常: ValueError为未知、其他来源或非法名称;不从点号猜测原字段。
167
+ """
168
+ require_identifier(name, 'message.signal_alias')
169
+ for definition in self.signals:
170
+ if definition.name == name:
171
+ return definition
172
+ raise ValueError('未知或不属消息来源的信号别名:' + name)
173
+
174
+ def require_synchronized(self, names: tuple[str, ...]) -> None:
175
+ """检查实际依赖均在本来源,不借其他来源的同步声明引入缓存值。
176
+
177
+ 参数: names为展开后的原信号依赖tuple,空依赖合法。
178
+ 返回: None;单源当前字典不需要合并其他来源时钟。
179
+ 异常: TypeError为容器错误;ValueError为非本来源或未知依赖。
180
+ """
181
+ if type(names) is not tuple:
182
+ raise TypeError('消息依赖names需要tuple')
183
+ for name in names:
184
+ self.resolve(name)
185
+
186
+
187
+ @dataclass(frozen=True)
188
+ class MessageSourceEvidence:
189
+ """保存独立解码消息仓的有限事实,仅校结构而不声明真实回读已发生。
190
+
191
+ decoder_profile/read_identity是仓内显式标签,不认证旧CAN来源。原序SHA
192
+ 包含记录和值/映射时间;首末可相同,空仓必须两端None且条数为0。
193
+ """
194
+
195
+ source: str # 本消息来源。
196
+ session_id: str # 原声明会话。
197
+ decoder_profile: str # 显式解码来源标签,不冒充计算policy。
198
+ read_identity: str # 仓的显式读取标识,CAN同次关联由生产端另核。
199
+ store_sha256: str # 已封口全消息行流摘要。
200
+ record_count: int # 全decoded条数,不是普通历史样本数。
201
+ first_time_ns: int | None # 全仓首条映射坐标,空仓为None。
202
+ last_time_ns: int | None # 全仓最后坐标,不补采样周期。
203
+
204
+ def __post_init__(self) -> None:
205
+ """验证有限证据一致性,单独构造不能替代实际EOF校验。
206
+
207
+ 参数: 无,读取冻结字段。返回: None,已知时间规范成原生int。
208
+ 异常: TypeError/ValueError为类型、SHA、条数或首末矛盾;时间超界原样传播。
209
+ """
210
+ if any(type(value) is not str for value in (self.source, self.session_id,
211
+ self.decoder_profile, self.read_identity)):
212
+ raise TypeError('消息证据来源、会话及读取标签需要原生str')
213
+ require_identifier(self.source, 'message_evidence.source')
214
+ require_identifier(self.session_id, 'message_evidence.session_id')
215
+ require_text(self.decoder_profile, 'message_evidence.decoder_profile')
216
+ require_text(self.read_identity, 'message_evidence.read_identity')
217
+ if type(self.store_sha256) is not str:
218
+ raise TypeError('消息仓摘要需要原生str')
219
+ if (len(self.store_sha256) != 64
220
+ or any(char not in '0123456789abcdef' for char in self.store_sha256)):
221
+ raise ValueError('消息仓摘要需要64位小写十六进制SHA-256')
222
+ if type(self.record_count) is not int or self.record_count < 0:
223
+ raise ValueError('消息条数需要非负原生int')
224
+ if self.record_count == 0:
225
+ if self.first_time_ns is not None or self.last_time_ns is not None:
226
+ raise ValueError('空消息仓首末必须为None')
227
+ return
228
+ if self.first_time_ns is None or self.last_time_ns is None:
229
+ raise ValueError('非空消息仓必须有真实首末时间')
230
+ # 共享int64单端点规则允许真实零长观测,不计算两端差值造成溢出。
231
+ first = require_int64_ns(self.first_time_ns, 'message_evidence.first_time_ns')
232
+ last = require_int64_ns(self.last_time_ns, 'message_evidence.last_time_ns')
233
+ if last < first:
234
+ raise ValueError('消息仓终点早于起点')
235
+ object.__setattr__(self, 'first_time_ns', first)
236
+ object.__setattr__(self, 'last_time_ns', last)
237
+
238
+
239
+ @dataclass(frozen=True)
240
+ class MessageBindings:
241
+ """关联消息声明与实际仓证据,保持独立于普通DecodedBindings的运行身份。
242
+
243
+ 证据实际性由bind_message_store完整回读负责;本模型只校结构/归属。
244
+ 不证明普通历史、TTL、DBC字段单位或同次CAN捕获,也不保存逐条记录。
245
+ """
246
+
247
+ declarations: MessageDeclarations # 单源消息配置及完整原声明身份。
248
+ evidence: MessageSourceEvidence # 执行工厂核实后的仓事实,非手造即证明。
249
+ identity: str = field(init=False) # 独立message-binding-v1身份。
250
+
251
+ def __post_init__(self) -> None:
252
+ """核对声明与证据来源/会话,增量生成有限运行身份。
253
+
254
+ 参数: 无,读取declarations/evidence。返回: None,不再次打开消息仓。
255
+ 异常: TypeError为模型错误;ValueError为来源/会话不符;编码或取消原错传播。
256
+ """
257
+ if not isinstance(self.declarations, MessageDeclarations) or not isinstance(self.evidence, MessageSourceEvidence):
258
+ raise TypeError('消息运行绑定需要MessageDeclarations和MessageSourceEvidence')
259
+ if (self.evidence.source != self.declarations.source
260
+ or self.evidence.session_id != self.declarations.declarations.session_id):
261
+ raise ValueError('消息仓证据的来源或会话与当前声明不符')
262
+ parts = None
263
+ try:
264
+ # 每一证据字段都进入独立身份,不把read标签或同名配置单独当输入证明。
265
+ evidence = self.evidence
266
+ parts = ('message-binding-v1', self.declarations.identity, evidence.source,
267
+ evidence.session_id, evidence.decoder_profile, evidence.read_identity,
268
+ evidence.store_sha256, str(evidence.record_count),
269
+ 'none' if evidence.first_time_ns is None else str(evidence.first_time_ns),
270
+ 'none' if evidence.last_time_ns is None else str(evidence.last_time_ns))
271
+ object.__setattr__(self, 'identity', _hash_parts(parts))
272
+ finally:
273
+ # 原错误可被调用者保留,执行层抵费后不由本TB留下新身份容器。
274
+ parts = None
275
+
276
+ @property
277
+ def signals(self) -> tuple[SignalDefinition, ...]:
278
+ """读取同一原信号定义;参数: 无;返回: tuple;异常: 无主动异常。"""
279
+ return self.declarations.signals
280
+
281
+ @property
282
+ def parameters(self) -> tuple[ExpressionParameter, ...]:
283
+ """读取冻结配置参数;参数: 无;返回: tuple;异常: 无。"""
284
+ return self.declarations.parameters
285
+
286
+ @property
287
+ def derived_names(self) -> tuple[str, ...]:
288
+ """读取显式局部派生名;参数: 无;返回: tuple;异常: 无。"""
289
+ return self.declarations.derived_names
290
+
291
+ def resolve(self, name: str) -> SignalDefinition:
292
+ """按单来源原定义定位信号,不从证据标签生成字段。
293
+
294
+ 参数: name为安全别名。返回: 原SignalDefinition。
295
+ 异常: ValueError为非法、未知或其他来源名称。
296
+ """
297
+ return self.declarations.resolve(name)
298
+
299
+ def require_synchronized(self, names: tuple[str, ...]) -> None:
300
+ """执行前复核全部依赖属于本来源,不执行普通TTL或时钟合并。
301
+
302
+ 参数: names为原信号依赖tuple。返回: None。
303
+ 异常: TypeError/ValueError为容器或非本来源依赖。
304
+ """
305
+ self.declarations.require_synchronized(names)