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,350 @@
1
+ """定义按需执行的精简指标行,不要求不存在的完整输入证明。
2
+
3
+ 只保留结果身份、业务数值、单位及完成/质量状态。事件或片段通过parent_id关联,
4
+ 不逐行重复配置、信号定义、时间对照或贡献;公开结果只接受当前扁平模型。
5
+ 本模型只校验结果字段,不读取输入或执行指标计算。
6
+ """
7
+
8
+ from dataclasses import dataclass
9
+ import json
10
+ from math import isfinite
11
+
12
+ from ..core.types import QualityFlag as Q
13
+ from ..core.validation import require_identifier, require_text
14
+ from ..timebase.conversion import require_int64_ns
15
+
16
+
17
+ @dataclass(frozen=True)
18
+ class SummaryCalculationRow:
19
+ """一条精简指标;未知用None,不能把缺失转换为正常零。"""
20
+
21
+ # 固定身份只用于关联本次结果,不代替原始输入哈希或逐条来源。
22
+ sequence: int
23
+ dataset_id: str
24
+ entity_id: str
25
+ session_id: str
26
+ calculation_id: str
27
+ # 算子及父范围给出业务含义;session没有父对象。
28
+ operation: str
29
+ scope: str
30
+ parent_id: str | None
31
+ # 数值与质量必须一起读取,None不等于有效零。
32
+ value: int | float | None
33
+ unit: str
34
+ status: str
35
+ reason: str
36
+ quality: Q
37
+
38
+ def __post_init__(self):
39
+ """核对身份、数值类型及状态,不补造来源或时间信息。
40
+
41
+ 参数: 无。返回: None。异常: TypeError/ValueError为字段或组合错误。
42
+ """
43
+ if type(self.sequence) is not int or self.sequence < 0:
44
+ raise ValueError('精简指标序号需要非负原生int')
45
+ for name in ('dataset_id', 'entity_id', 'session_id', 'calculation_id'):
46
+ require_identifier(getattr(self, name), 'summary.'+name)
47
+ if self.operation not in ('integral', 'duration', 'min_time', 'max_time', 'time_weighted_mean',
48
+ 'sample_minimum', 'sample_maximum', 'sample_mean', 'legacy_sum'):
49
+ raise ValueError('精简指标不支持该算子')
50
+ if self.scope not in ('session', 'event', 'segment'):
51
+ raise ValueError('精简指标scope无效')
52
+ if self.scope == 'session':
53
+ if self.parent_id is not None:
54
+ raise ValueError('会话指标不能声明父事件或片段')
55
+ else:
56
+ require_text(self.parent_id, 'summary.parent_id')
57
+ if self.value is not None and (type(self.value) not in (int, float)
58
+ or type(self.value) is float and not isfinite(self.value)):
59
+ raise ValueError('精简指标值需要有限数值或None')
60
+ require_text(self.unit, 'summary.unit')
61
+ require_text(self.reason, 'summary.reason')
62
+ if self.status not in ('complete', 'partial', 'indeterminate'):
63
+ raise ValueError('精简指标status无效')
64
+ if self.status == 'indeterminate' and self.value is not None:
65
+ raise ValueError('无法确定的指标不能含可用数值')
66
+ if not isinstance(self.quality, Q):
67
+ raise TypeError('精简指标质量需要QualityFlag')
68
+
69
+
70
+ SUMMARY_FIELDS = ('sequence', 'dataset_id', 'entity_id', 'session_id', 'calculation_id', 'operation',
71
+ 'scope', 'parent_id', 'value', 'unit', 'status', 'reason', 'quality')
72
+
73
+
74
+ @dataclass(frozen=True)
75
+ class SummaryCoverageCalculationRow(SummaryCalculationRow):
76
+ """仅明确设置覆盖门槛时补一个判定,不重复输出时长、比例或输入明细。"""
77
+
78
+ coverage_status: str
79
+
80
+ def __post_init__(self):
81
+ """保留数值政策与覆盖门槛两个不同事实。参数: 无。返回: None。异常: 非法判定。"""
82
+ super().__post_init__()
83
+ if self.coverage_status not in ('sufficient','indeterminate'):
84
+ raise ValueError('覆盖门槛判定无效')
85
+
86
+
87
+ def _require_row_identity(row):
88
+ """核精简事件和配对的公共身份。参数: 冻结行。返回: None。异常: 类型或字段错误。"""
89
+ if type(row.sequence) is not int or row.sequence < 0:
90
+ raise ValueError('精简结果序号需要非负原生int')
91
+ for name in ('dataset_id','entity_id','session_id','rule_id'):
92
+ require_identifier(getattr(row,name),'summary.'+name)
93
+ if not isinstance(row.quality,Q):
94
+ raise TypeError('精简结果质量需要QualityFlag')
95
+
96
+
97
+ @dataclass(frozen=True)
98
+ class SummaryEventRow:
99
+ """一条业务事件;开始、确认、结束各有不同含义,不含原帧或逐条来源副本。"""
100
+
101
+ sequence: int
102
+ dataset_id: str
103
+ entity_id: str
104
+ session_id: str
105
+ rule_id: str
106
+ event_id: str
107
+ start_ns: int
108
+ confirmed_ns: int
109
+ end_ns: int | None
110
+ status: str
111
+ trigger: str
112
+ quality: Q
113
+
114
+ def __post_init__(self):
115
+ """核实际业务端点,不能把未知结束填为零。参数: 无。返回: None。异常: 合同错误。"""
116
+ _require_row_identity(self)
117
+ require_text(self.event_id,'event_id')
118
+ start=require_int64_ns(self.start_ns,'start_ns')
119
+ confirmed=require_int64_ns(self.confirmed_ns,'confirmed_ns')
120
+ if confirmed < start:
121
+ raise ValueError('确认不能早于开始')
122
+ if self.status == 'point':
123
+ if self.end_ns is not None or start != confirmed:
124
+ raise ValueError('点事件没有活动结束时间')
125
+ elif self.status in ('closed','interrupted','truncated','timeout'):
126
+ end=require_int64_ns(self.end_ns,'end_ns')
127
+ if not start < end or confirmed > end:
128
+ raise ValueError('活动实际端点顺序无效')
129
+ else:
130
+ raise ValueError('精简事件状态无效')
131
+ require_text(self.trigger,'trigger')
132
+
133
+
134
+ @dataclass(frozen=True)
135
+ class SummarySequenceRow:
136
+ """一条配对结论,只关联既有事件ID并保存所选口径的延迟。"""
137
+
138
+ sequence: int
139
+ dataset_id: str
140
+ entity_id: str
141
+ session_id: str
142
+ rule_id: str
143
+ result_id: str
144
+ request_id: str
145
+ response_id: str | None
146
+ decided_ns: int
147
+ delay_ns: int | None
148
+ status: str
149
+ quality: Q
150
+
151
+ def __post_init__(self):
152
+ """核配对及未知结果,不逐行重复规则和事件。参数: 无。返回: None。异常: 合同错误。"""
153
+ _require_row_identity(self)
154
+ for name in ('result_id','request_id'):
155
+ require_text(getattr(self,name),name)
156
+ require_int64_ns(self.decided_ns,'decided_ns')
157
+ if self.status == 'matched':
158
+ require_text(self.response_id,'response_id')
159
+ if require_int64_ns(self.delay_ns,'delay_ns') < 0:
160
+ raise ValueError('配对延迟不能为负')
161
+ elif self.status in ('no_response','indeterminate'):
162
+ if self.response_id is not None or self.delay_ns is not None:
163
+ raise ValueError('未匹配结果不能伪造响应和延迟')
164
+ if self.status == 'indeterminate' and self.quality == Q.NONE:
165
+ raise ValueError('未知配对必须说明质量原因')
166
+ if self.status == 'no_response' and self.quality != Q.NONE:
167
+ raise ValueError('缺失观测不能声明确定未响应')
168
+ else:
169
+ raise ValueError('精简配对状态无效')
170
+
171
+
172
+ @dataclass(frozen=True)
173
+ class SummarySegmentRow:
174
+ """片段只输出实际边界、状态和父事件ID,不重复请求边界/原事件/来源。"""
175
+ sequence: int
176
+ dataset_id: str
177
+ entity_id: str
178
+ session_id: str
179
+ window_id: str
180
+ segment_id: str
181
+ start_ns: int | None
182
+ end_ns: int | None
183
+ status: str
184
+ parent_event_ids: tuple[str,...]
185
+ quality: Q
186
+
187
+ def __post_init__(self):
188
+ """检查实际范围和必需父关联。参数: 无。返回: None。异常: 字段/组合错误。"""
189
+ if type(self.sequence) is not int or self.sequence<0:
190
+ raise ValueError('片段sequence需非负原生int')
191
+ for name in ('dataset_id','entity_id','session_id','window_id'):
192
+ require_identifier(getattr(self,name),name)
193
+ require_text(self.segment_id,'segment_id')
194
+ if not isinstance(self.quality,Q) or type(self.parent_event_ids) is not tuple or not self.parent_event_ids:
195
+ raise TypeError('片段需质量及非空父ID tuple')
196
+ if len(set(self.parent_event_ids))!=len(self.parent_event_ids):
197
+ raise ValueError('片段父ID不能重复')
198
+ for parent in self.parent_event_ids:
199
+ require_text(parent,'parent_event_id')
200
+ if self.status=='empty':
201
+ if self.start_ns is not None or self.end_ns is not None:
202
+ raise ValueError('空片段不能伪造实际范围')
203
+ elif self.status in ('complete','partial'):
204
+ if require_int64_ns(self.start_ns)>=require_int64_ns(self.end_ns):
205
+ raise ValueError('片段需要正实际范围')
206
+ else:
207
+ raise ValueError('片段状态错误')
208
+
209
+
210
+ SUMMARY_EVENT_FIELDS = ('sequence','dataset_id','entity_id','session_id','rule_id','event_id',
211
+ 'start_ns','confirmed_ns','end_ns','status','trigger','quality')
212
+ SUMMARY_SEQUENCE_FIELDS = ('sequence','dataset_id','entity_id','session_id','rule_id','result_id',
213
+ 'request_id','response_id','decided_ns','delay_ns','status','quality')
214
+ SUMMARY_MODELS = {SummaryCalculationRow: ('calculations',SUMMARY_FIELDS,7),
215
+ SummaryEventRow: ('events',SUMMARY_EVENT_FIELDS,8), SummarySequenceRow: ('sequences',SUMMARY_SEQUENCE_FIELDS,9)}
216
+ SUMMARY_MODELS[SummarySegmentRow]=('segments',('sequence','dataset_id','entity_id','session_id','window_id',
217
+ 'segment_id','start_ns','end_ns','status','parent_event_ids','quality'),11)
218
+ @dataclass(frozen=True)
219
+ class SummaryContributionRow:
220
+ """一条明确请求的逐消息贡献;仅定位计算,不复制原帧或输入值。"""
221
+
222
+ sequence: int
223
+ dataset_id: str
224
+ entity_id: str
225
+ session_id: str
226
+ calculation_id: str
227
+ source: str
228
+ original_sequence: int
229
+ evaluation_index: int
230
+ value: float | None
231
+ reason: str
232
+ quality: Q
233
+
234
+ def __post_init__(self):
235
+ """核定位及贡献/跳过互斥。参数: 无。返回: None。异常: 类型或字段错误。"""
236
+ for name in ('sequence','original_sequence','evaluation_index'):
237
+ if type(getattr(self,name)) is not int or getattr(self,name)<0:
238
+ raise ValueError('贡献定位需非负原生整数')
239
+ for name in ('dataset_id','entity_id','session_id','calculation_id','source'):
240
+ require_identifier(getattr(self,name),name)
241
+ if not isinstance(self.quality,Q):
242
+ raise TypeError('贡献质量需QualityFlag')
243
+ if self.value is None:
244
+ if self.reason not in ('missing_input','condition_false','evaluation_error','nonfinite_input'):
245
+ raise ValueError('跳过贡献需要明确原因')
246
+ elif type(self.value) is not float or not isfinite(self.value) or self.reason!='contributed':
247
+ raise ValueError('有效贡献需要有限float及contributed状态')
248
+
249
+
250
+ SUMMARY_MODELS[SummaryContributionRow]=('contributions',('sequence','dataset_id','entity_id','session_id',
251
+ 'calculation_id','source','original_sequence','evaluation_index','value','reason','quality'),12)
252
+ @dataclass(frozen=True)
253
+ class SummaryInputRow:
254
+ """按请求保存一次所需输入;字段原值一份,不保存双时间表示或原帧副本。"""
255
+ sequence: int
256
+ dataset_id: str
257
+ entity_id: str
258
+ session_id: str
259
+ source: str
260
+ original_sequence: int
261
+ time_ns: int | None
262
+ record_type: str
263
+ locator: str
264
+ values_json: str
265
+ quality: Q
266
+
267
+ def __post_init__(self):
268
+ """核定位与有限JSON标量,拒绝任意嵌套模型。参数: 无。返回: None。异常: 字段/格式错误。"""
269
+ for name in ('sequence','original_sequence'):
270
+ if type(getattr(self,name)) is not int or getattr(self,name)<0:raise ValueError('追溯序号需非负int')
271
+ for name in ('dataset_id','entity_id','session_id','source'):require_identifier(getattr(self,name),name)
272
+ if self.time_ns is not None:require_int64_ns(self.time_ns)
273
+ if self.record_type not in ('decoded_message','signal_sample','signal_clock') or not isinstance(self.quality,Q):
274
+ raise ValueError('追溯类型/质量无效')
275
+ require_text(self.locator,'trace.locator')
276
+ if type(self.values_json) is not str:raise TypeError('追溯值需JSON文本')
277
+ values=json.loads(self.values_json)
278
+ if type(values) is not dict:raise ValueError('追溯值需字段对象')
279
+ for name,value in values.items():
280
+ require_text(name,'trace.field')
281
+ if type(value) is dict:
282
+ if set(value)!= {'nonfinite'} or value['nonfinite'] not in ('nan','inf','-inf'):
283
+ raise ValueError('追溯只允许明确非有限值标签')
284
+ elif value is not None and (type(value) not in (str,int,float,bool)
285
+ or type(value) is float and not isfinite(value)):
286
+ raise ValueError('追溯字段需有限标量或明确非有限标签')
287
+
288
+
289
+ SUMMARY_MODELS[SummaryInputRow]=('input_trace',('sequence','dataset_id','entity_id','session_id',
290
+ 'source','original_sequence','time_ns','record_type','locator','values_json','quality'),13)
291
+ @dataclass(frozen=True)
292
+ class SummarySelectionRow:
293
+ """一条真实更新的选择结果;保业务值及三值选择,不重复输入证明。"""
294
+ sequence: int
295
+ dataset_id: str
296
+ entity_id: str
297
+ session_id: str
298
+ calculation_id: str
299
+ scope: str
300
+ parent_id: str | None
301
+ time_ns: int
302
+ value: int | float | bool | str | None
303
+ dtype: str
304
+ unit: str
305
+ valid: bool
306
+ selection: str
307
+ quality: Q
308
+
309
+ def __post_init__(self):
310
+ """核选择行身份和值类型。参数: 无。返回: None。异常: 类型/结构错误。"""
311
+ if type(self.sequence) is not int or self.sequence<0:raise ValueError('选择序号需要非负int')
312
+ for name in ('dataset_id','entity_id','session_id','calculation_id'):require_identifier(getattr(self,name),name)
313
+ if self.scope not in ('session','event','segment'):raise ValueError('选择范围类型无效')
314
+ if self.scope=='session':
315
+ if self.parent_id is not None:raise ValueError('会话选择不能声明父对象')
316
+ else:require_text(self.parent_id,'selection.parent_id')
317
+ require_int64_ns(self.time_ns);require_text(self.unit,'selection.unit')
318
+ kinds={'float64':float,'int64':int,'uint64':int,'bool':bool,'enum':str}
319
+ if self.dtype not in kinds or type(self.valid) is not bool or not isinstance(self.quality,Q):
320
+ raise TypeError('选择类型/有效性/质量错误')
321
+ if self.selection not in ('true','unknown') or self.selection=='unknown' and self.quality==Q.NONE:
322
+ raise ValueError('选择仅支持TRUE或有质量原因的UNKNOWN')
323
+ if self.valid:
324
+ if type(self.value) is not kinds[self.dtype] or type(self.value) is float and not isfinite(self.value):
325
+ raise ValueError('选择有效值与dtype不符')
326
+ if self.dtype=='int64' and not -(1<<63)<=self.value<(1<<63) or self.dtype=='uint64' and not 0<=self.value<(1<<64):
327
+ raise ValueError('选择整数超出dtype')
328
+ elif self.value is not None or self.quality==Q.NONE:
329
+ raise ValueError('选择无效值必须为空并保留质量原因')
330
+
331
+
332
+ SUMMARY_MODELS[SummarySelectionRow]=('selections',('sequence','dataset_id','entity_id','session_id','calculation_id',
333
+ 'scope','parent_id','time_ns','value','dtype','unit','valid','selection','quality'),14)
334
+ SUMMARY_COLUMNS = {table: names for table,names,_ in SUMMARY_MODELS.values()}
335
+ SUMMARY_MODELS[SummaryCoverageCalculationRow] = ('calculations',SUMMARY_FIELDS+('coverage_status',),10)
336
+
337
+
338
+ def summary_fields(row):
339
+ """转换必要平坦字段,CSV和JSONL共用,不附另一份row_json。
340
+
341
+ 参数: SummaryCalculationRow。返回: 固定字段dict。异常: TypeError为错误根类型。
342
+ """
343
+ try:
344
+ if type(row) not in SUMMARY_MODELS:
345
+ raise TypeError('精简字段需要SummaryCalculationRow')
346
+ result = {name: getattr(row, name) for name in SUMMARY_MODELS[type(row)][1]}
347
+ result['quality'] = int(row.quality)
348
+ return result
349
+ finally:
350
+ row = None
@@ -0,0 +1,64 @@
1
+ """保存新文本CAN同次读取取得的DBC身份、解析声明和实际观测事实。
2
+
3
+ 这是can-text-v1的独立清单,不冒充旧进程READY或未计算的原文件哈希。
4
+ 声明的路径/格式与实际读取计数分别保留;空来源不伪造首末时间。
5
+ """
6
+
7
+ from dataclasses import dataclass
8
+ from ..core.validation import require_identifier,require_text
9
+ from ..timebase.conversion import require_int64_ns
10
+ from .can_metadata import CANUnitCheck,CANFrameFormatNotice
11
+
12
+
13
+ @dataclass(frozen=True)
14
+ class TextCANSourceMetadata:
15
+ """仅接受冻结有限字段;实际事实由完成的ObservedSourceScan交付。"""
16
+
17
+ source: str
18
+ session_id: str
19
+ source_type: str
20
+ read_identity: str
21
+ inputs: tuple[tuple[str,str,int], ...]
22
+ dbc_path: str
23
+ dbc_sha256: str
24
+ cantools_version: str
25
+ record_count: int
26
+ decode_calls: int
27
+ first_ns: int | None
28
+ last_ns: int | None
29
+ unit_checks: tuple[CANUnitCheck,...]
30
+ frame_format_notices: tuple[CANFrameFormatNotice,...]=()
31
+ profile: str='can-text-v1'
32
+ decode_scope: str='requested'
33
+ time_scope: str='source'
34
+
35
+ def __post_init__(self):
36
+ """核实结构及计数一致性,不读文件。参数: 冻结字段。返回: None。异常: 类型/值错误。
37
+ """
38
+ for name in ('source','session_id'):
39
+ require_identifier(getattr(self,name),name)
40
+ for name in ('read_identity','dbc_path','cantools_version'):
41
+ require_text(getattr(self,name),name)
42
+ if (self.source_type not in ('can_asc','asc_or_blf','raw_can_csv') or self.profile!='can-text-v1'
43
+ or self.decode_scope!='requested' or self.time_scope!='source'):
44
+ raise ValueError('文本CAN清单策略错误')
45
+ if type(self.dbc_sha256) is not str or len(self.dbc_sha256)!=64 or any(c not in '0123456789abcdef' for c in self.dbc_sha256):
46
+ raise ValueError('文本CAN清单需要实际DBC SHA256')
47
+ if type(self.inputs) is not tuple or not 1<=len(self.inputs)<=4096:
48
+ raise ValueError('文本CAN清单需要有限有序输入')
49
+ for item in self.inputs:
50
+ if type(item) is not tuple or len(item)!=3:
51
+ raise ValueError('输入清单需要(path,parser,offset_ns)')
52
+ require_text(item[0],'path'); require_text(item[1],'parser'); require_int64_ns(item[2],'offset_ns')
53
+ if type(self.record_count) is not int or self.record_count<0 or type(self.decode_calls) is not int or not 0<=self.decode_calls<=self.record_count:
54
+ raise ValueError('文本CAN实际帧数与解码次数错误')
55
+ if not self.record_count:
56
+ if self.first_ns is not None or self.last_ns is not None:
57
+ raise ValueError('空文本CAN不能声明观测时间')
58
+ else:
59
+ require_int64_ns(self.first_ns,'first_ns'); require_int64_ns(self.last_ns,'last_ns')
60
+ if self.first_ns>self.last_ns:
61
+ raise ValueError('文本CAN观测时间倒退')
62
+ if (type(self.unit_checks) is not tuple or any(type(x) is not CANUnitCheck for x in self.unit_checks)
63
+ or type(self.frame_format_notices) is not tuple or any(type(x) is not CANFrameFormatNotice for x in self.frame_format_notices)):
64
+ raise TypeError('文本CAN单位/帧型清单需要冻结模型tuple')
@@ -0,0 +1,105 @@
1
+ """保存一次阈值报警预设在实际观测范围内的时长汇总。
2
+
3
+ 输入是同次迟滞状态机累计的整数纳秒,不再次读取信号或推算缺口内状态。
4
+ 有未知时间时只报告已知报警累计,完整总时长为空;无观测不返回正常零。
5
+ 快照只随有限预设数增长,由结果清单预算承担,重复发布不会重新计算。
6
+ """
7
+
8
+ from dataclasses import dataclass
9
+ from math import isfinite
10
+ from ..core.models import Interval
11
+ from ..core.validation import require_identifier
12
+
13
+
14
+ @dataclass(frozen=True)
15
+ class ThresholdDurationMetadata:
16
+ """冻结报警、已知与未知时长,完整总数只在整个观测范围已知时给出。"""
17
+
18
+ preset_id: str # 本次计划的预设ID。
19
+ rule_id: str # 实际生成的迟滞规则ID,可关联事件表。
20
+ observed_start_ns: int | None # 实际时钟组起点,无观测为None。
21
+ observed_end_ns: int | None # 实际时钟组末点,不向请求末端外推。
22
+ known_active_duration_ns: int # 已知报警区间的准确整数纳秒和。
23
+ known_duration_ns: int # 已知报警或未报警的总纳秒。
24
+
25
+ def __post_init__(self):
26
+ """检查固定计数和观测范围的一致性。
27
+
28
+ 参数: 无。返回: None。异常: TypeError/ValueError为身份、范围或计数矛盾。
29
+ """
30
+ require_identifier(self.preset_id, 'threshold.preset_id')
31
+ require_identifier(self.rule_id, 'threshold.rule_id')
32
+ if (self.observed_start_ns is None) != (self.observed_end_ns is None):
33
+ raise ValueError('阈值汇总观测端点必须同时存在或同时为空')
34
+ if self.observed_start_ns is not None:
35
+ if type(self.observed_start_ns) is not int or type(self.observed_end_ns) is not int:
36
+ raise TypeError('阈值汇总端点须原生整数纳秒')
37
+ Interval(self.observed_start_ns, self.observed_end_ns)
38
+ if any(type(value) is not int for value in (self.known_active_duration_ns, self.known_duration_ns)):
39
+ raise TypeError('阈值汇总时长须原生整数纳秒')
40
+ if not 0 <= self.known_active_duration_ns <= self.known_duration_ns <= self.observed_duration_ns:
41
+ raise ValueError('报警/已知时长不得超过实际观测范围')
42
+
43
+ @property
44
+ def observed_duration_ns(self):
45
+ """取得实际半开范围长度。参数: 无。返回: int纳秒。异常: 无。"""
46
+ return 0 if self.observed_start_ns is None else self.observed_end_ns - self.observed_start_ns
47
+
48
+ @property
49
+ def unknown_duration_ns(self):
50
+ """取得未确定报警状态的时长。参数: 无。返回: int纳秒。异常: 无。"""
51
+ return self.observed_duration_ns - self.known_duration_ns
52
+
53
+ @property
54
+ def total_duration_ns(self):
55
+ """完整总时长不能由未知区间推测。参数: 无。返回: int或None。异常: 无。"""
56
+ return self.known_active_duration_ns if self.observed_duration_ns > 0 and self.unknown_duration_ns == 0 else None
57
+
58
+ @property
59
+ def status(self):
60
+ """区分完整、部分、全未知和无观测。参数: 无。返回: 状态文本。异常: 无。"""
61
+ if self.observed_duration_ns == 0:
62
+ return 'no_observation'
63
+ if self.known_duration_ns == 0:
64
+ return 'indeterminate'
65
+ return 'partial' if self.unknown_duration_ns else 'complete'
66
+
67
+ def to_dict(self):
68
+ """将纳秒事实及便于阅读的秒数写入清单。
69
+
70
+ 参数: 无。返回: 独立dict。异常: 无;调用方在复制前预付元数据费用。
71
+ """
72
+ return dict(preset_id=self.preset_id, rule_id=self.rule_id,
73
+ observed_start_ns=self.observed_start_ns, observed_end_ns=self.observed_end_ns,
74
+ observed_duration_ns=self.observed_duration_ns, known_duration_ns=self.known_duration_ns,
75
+ known_active_duration_ns=self.known_active_duration_ns, unknown_duration_ns=self.unknown_duration_ns,
76
+ total_duration_ns=self.total_duration_ns,
77
+ total_duration_s=None if self.total_duration_ns is None else self.total_duration_ns / 10**9,
78
+ known_active_duration_s=self.known_active_duration_ns / 10**9, status=self.status)
79
+
80
+
81
+ @dataclass(frozen=True)
82
+ class SummaryThresholdDuration:
83
+ """新合同只保存一个累计值和单位;partial说明它只是已知部分。"""
84
+
85
+ preset_id: str
86
+ rule_id: str
87
+ value: float | None
88
+ status: str
89
+ unit: str = 's'
90
+
91
+ def __post_init__(self):
92
+ """检查唯一单位和未知总量。参数: 无。返回: None。异常: 非法身份/数值/状态。"""
93
+ require_identifier(self.preset_id,'preset_id')
94
+ require_identifier(self.rule_id,'rule_id')
95
+ if self.value is not None and (type(self.value) not in (int,float) or not isfinite(self.value) or self.value<0):
96
+ raise ValueError('报警时长必须为非负有限值或未知')
97
+ if self.unit!='s' or self.status not in ('no_observation','indeterminate','partial','complete'):
98
+ raise ValueError('报警汇总单位或状态无效')
99
+ if (self.status in ('no_observation','indeterminate')) != (self.value is None):
100
+ raise ValueError('无观测/全未知为空,完整或部分累计必须有可核实值')
101
+
102
+ def to_dict(self):
103
+ """发布一种数值单位,不附重复ns/s或时间范围。参数: 无。返回: dict。异常: 无。"""
104
+ return dict(preset_id=self.preset_id,rule_id=self.rule_id,unit=self.unit,
105
+ value=self.value,status=self.status)
chronaxis/runner.py ADDED
@@ -0,0 +1,121 @@
1
+ """把分析计划交给同一公共入口检查、解释和执行,返回可流式读取的结果。
2
+
3
+ AnalysisRunner接收已经由load_analysis_plan或AnalysisPlan.from_dict构建的计划。validate和explain
4
+ 只查看声明,沿用planning.reports,不打开CSV、DBC或旧日志。run才创建独立
5
+ RunSession,首次扫描来源、封存新历史并依次运行已有四个分析阶段;这里不重写
6
+ 读取、数值算法或发布。返回AnalysisResult表示analysis_complete,write另行发布。
7
+
8
+ 显式backend只替换内部执行视图中的计算方式,保留原配置identity、raw_config和
9
+ 来源对象;清单另记实际后端。AnalysisRunner本身没有输入、FD或跨运行状态,能够重复运行
10
+ 同一计划,每次使用独立资源。成功前全部输入关闭;失败保原cause及最高运行恢复
11
+ owner,取消保原KeyboardInterrupt/SystemExit。暂存与诊断保留,不宣称回滚输入。
12
+ """
13
+
14
+ # 只在run时加载实际执行组件;静态检查不创建预算、工作目录或来源adapter。
15
+ from dataclasses import replace
16
+ from .planning.plan import AnalysisPlan
17
+ from .planning.models import ExecutionPlan
18
+ from .planning.reports import validate_analysis_plan, explain_analysis_plan
19
+ from .results.errors import AnalysisError
20
+ from .results.spool import _cleanup_owner
21
+
22
+
23
+ class AnalysisRunner:
24
+ """保存可选后端覆盖,复用同一静态校验,逐次创建独立运行资源。
25
+
26
+ _backend为None或已支持的明确后端,不自动回退。实例不持有执行结果或活动
27
+ session;结果所有权交给调用者,失败未清完资源通过原异常的最高owner恢复。
28
+ """
29
+
30
+ def __init__(self, backend=None):
31
+ """选择是否覆盖计划后端,不读取任何来源或配置文件。
32
+
33
+ 参数: backend为None/reference/numpy;None使用各次计划原execution.backend。
34
+ 返回: None;初始化实例状态。异常: TypeError为非文本覆盖;ValueError为未知后端。
35
+ """
36
+ # 明确拒绝任意对象和隐藏回退,不能把拼错的后端当成默认NumPy。
37
+ if backend is not None:
38
+ if type(backend) is not str:
39
+ raise TypeError('AnalysisRunner backend需要reference、numpy或None')
40
+ if backend not in ('reference', 'numpy'):
41
+ raise ValueError('AnalysisRunner仅支持reference与numpy后端')
42
+ self._backend = backend
43
+
44
+ @property
45
+ def backend(self):
46
+ """读取构造时的覆盖选择,不表示某个尚未运行计划的实际后端。
47
+
48
+ 参数: 无。返回: None/reference/numpy。异常: 无。
49
+ """
50
+ return self._backend
51
+
52
+ def _effective_plan(self, plan):
53
+ """保留原声明身份,只为明确覆盖创建内部执行视图。
54
+
55
+ 参数: plan为已构建AnalysisPlan。返回: 原plan或仅execution.backend不同的新view。
56
+ 异常: TypeError为非计划/执行声明;不重新解析配置或复制原输入行。
57
+ """
58
+ if not isinstance(plan, AnalysisPlan) or not isinstance(plan.execution, ExecutionPlan):
59
+ raise TypeError('AnalysisRunner需要load_analysis_plan或AnalysisPlan.from_dict构建的计划')
60
+ # 来源、绑定及raw_config仍借原对象;后端是本次执行选项,不伪造另一份输入。
61
+ if self._backend is None or self._backend == plan.execution.backend:
62
+ return plan
63
+ return replace(plan, execution=replace(plan.execution, backend=self._backend))
64
+
65
+ def validate(self, plan):
66
+ """报告声明是否合法及执行路径是否已接入,不提前读取数据。
67
+
68
+ 参数: plan为已构建AnalysisPlan。返回: 同一共享ValidationReport,保留实际字段/范围未验警告。
69
+ 异常: TypeError为非AnalysisPlan或非法执行模型;正常计划的静态问题写入报告errors,
70
+ 不以校验成功证明输入文件内容有效。副作用: 无来源I/O或目录创建。
71
+ """
72
+ # 使用相同有效视图和纯静态报告,避免校验后偷偷换另一套后端能力。
73
+ return validate_analysis_plan(self._effective_plan(plan))
74
+
75
+ def explain(self, plan):
76
+ """列出真实依赖、各节点后端、历史需求及声明预算,不启动分析。
77
+
78
+ 参数: plan为已构建AnalysisPlan。返回: ExplainReport,plan_identity保原声明身份。
79
+ 异常: TypeError为非AnalysisPlan或非法执行模型;调用者绕过解析器手工破坏typed
80
+ 引用时可能产生AttributeError/KeyError,应重新从完整配置构造计划。
81
+ 副作用: 不读取CSV/DBC,也不测量实耗。
82
+ """
83
+ # 规则状态驱动与数组节点分别由同一报告说明,不把覆盖当整个计划标量回退。
84
+ return explain_analysis_plan(self._effective_plan(plan))
85
+
86
+ def run(self, plan, work_dir=None):
87
+ """验证后执行一次真实分析,输入全关才返回独立AnalysisResult。
88
+
89
+ 参数: plan为已构建AnalysisPlan;work_dir为全新工作目录或None(唯一专用目录)。
90
+ 返回: analysis_complete的AnalysisResult,由调用者close/上下文管理,write另行发布。
91
+ 异常: TypeError为错误plan;验证或运行错误为AnalysisError,保原cause和诊断;
92
+ KeyboardInterrupt/SystemExit原样传播。持续清理失败用runner_cleanup_owner.close恢复。
93
+ 副作用: 创建本次新暂存;扫描来源一次、后续仅回读新history,不自动删除或发布文件。
94
+ """
95
+ effective = self._effective_plan(plan)
96
+ validation = validate_analysis_plan(effective)
97
+ if validation.errors or not validation.valid or not validation.execution_ready:
98
+ raise AnalysisError('计划尚不能执行:' + (';'.join(validation.errors) or '所需执行路径不可用'))
99
+ session = None
100
+ try:
101
+ # 惰性加载保证validate/explain没有实际来源组件的创建或调用。
102
+ from .execution.run_session import RunSession
103
+ session = RunSession(effective, work_dir=work_dir)
104
+ return session.execute()
105
+ except BaseException as exc:
106
+ # 未返回构造有自己的最高owner;正常构造后仍由唯一session关闭全部本次资源。
107
+ owner = getattr(exc, 'runner_cleanup_owner', None)
108
+ if owner is None:
109
+ owner = session
110
+ if owner is not None:
111
+ _cleanup_owner(owner, exc, 'runner_cleanup_owner', '公共分析运行')
112
+ # 保留原分析异常与取消类型;其他业务错误通过cause说明最初失败位置。
113
+ if isinstance(exc, (AnalysisError, KeyboardInterrupt, SystemExit)):
114
+ raise
115
+ error = AnalysisError('分析运行失败:' + str(exc))
116
+ recovery = getattr(exc, 'runner_cleanup_owner', None)
117
+ if recovery is not None:
118
+ error.runner_cleanup_owner = recovery
119
+ for note in getattr(exc, '__notes__', ()):
120
+ error.add_note(note)
121
+ raise error from exc
@@ -0,0 +1,23 @@
1
+ """公开内存来源、已解码信号表及公共批次协议。
2
+
3
+ MemorySourceAdapter接收已有内存原行,SignalCSVSourceAdapter接收明确格式
4
+ 的已解码CSV配置;二者逐批输出SignalSeries和SignalBatch,并共用
5
+ SourceDescription、ReadRequest及BatchValidator的身份与进度检查。
6
+ 导入只加载类型和计算模块,不打开输入文件或DBC,也不创建工作目录。
7
+ CAN配置与原报文定位在can_spec,公共AnalysisRunner已接单BLF/单DBC的旧公开链;
8
+ 本模块的内存/CSV入口不代替CAN运行包装,也不代表其他旧入口已迁移。
9
+ """
10
+
11
+ # 内存适配器传送已有原行的更新,不构造完整历史保持序列。
12
+ from .memory import MemorySourceAdapter
13
+ # CSV配置与逐样本定位用于明确的已解码表,不根据后缀猜原始报文。
14
+ from .csv_spec import CSVSourceRef, SignalCSVSpec
15
+ # 静态导入不会打开CSV,读取由实际迭代器执行。
16
+ from .signal_csv import SignalCSVSourceAdapter
17
+ # 对外暴露有结构校验的类型,不用object占位。
18
+ from .models import FieldDescription, FieldLocation, ReadRequest, SignalBatch, SignalSeries, SourceCapabilities, SourceDescription
19
+ # 生命周期协议和跨批校验可由其他已解码来源适配器共用。
20
+ from .protocol import BatchValidator, SourceAdapter, SourceClosedError, SourceReadError
21
+
22
+ # 保留内存/CSV与通用批次的公开名单;CAN通过计划与AnalysisRunner入口执行。
23
+ __all__ = ['MemorySourceAdapter', 'SignalCSVSpec', 'CSVSourceRef', 'SignalCSVSourceAdapter', 'FieldDescription', 'FieldLocation', 'ReadRequest', 'SignalBatch', 'SignalSeries', 'SourceCapabilities', 'SourceDescription', 'BatchValidator', 'SourceAdapter', 'SourceClosedError', 'SourceReadError']