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,250 @@
1
+ """从请求结果收集实际输入需求,不把全部信号声明当作运行任务。
2
+
3
+ 输入为已完成静态检查的 AnalysisPlan,输出有限、冻结的来源需求。规则、
4
+ 窗口和两类指标都是结果根;表达式依赖已经展开到原信号,未引用的派生项
5
+ 不单独成为根。普通时序样本与逐消息字段分开,方向字段和纯参数指标的
6
+ 报文选择器独立保留。预设按已展开的公共节点处理,不按全部角色增加需求。
7
+ 本模块不读取日志、CSV、DBC,不执行归一化或数值计算,也不创建运行证明。
8
+ 普通分析来源保留既定会话观测范围;纯消息总计按实际需求省去时间或仅保留
9
+ 相关记录时间。原帧导出单独列出,不能用空信号依赖推断原始帧可以丢弃。
10
+ 完整声明的语法、单位、名称和循环校验不由此替代。
11
+ """
12
+
13
+ from dataclasses import dataclass
14
+
15
+ from ..sources.can_spec import LegacyCANSpec, can_field_from_key
16
+
17
+
18
+ @dataclass(frozen=True)
19
+ class SourceInputRequirements:
20
+ """保存一个来源的有限需求,不持有输入行、表达式树或可变配置。
21
+
22
+ 别名按 signals 原声明序;字段和 ID 按首次出现顺序去重。decode_frame_ids
23
+ 包含所需 CAN 字段的 ID 和所有逐消息选择器 ID,不是实际观测到的 ID 集合。
24
+ 非 CAN 来源的两个 ID 字段为空,required_fields 仍为原字段定位字符串。
25
+ """
26
+
27
+ source: str # 原来源名。
28
+ ordinary_sample_aliases: tuple[str, ...] # 普通时序结果实际读取的别名。
29
+ message_aliases: tuple[str, ...] # 当次消息公式及方向使用的别名。
30
+ required_aliases: tuple[str, ...] # 两类消费者的字段并集。
31
+ required_fields: tuple[str, ...] # 去重后的原规范定位,不重新解释信号名。
32
+ decode_frame_ids: tuple[int, ...] # 所需字段和消息触发ID;非CAN为空。
33
+ selector_ids: tuple[int, ...] # 即使公式无字段也保留的触发ID。
34
+ time_scope: str = 'source' # none不采时间;selected仅相关记录;source保全部来源时间。
35
+ input_check: str = 'auto' # 实际选择:auto按需检查;full完整诊断,含显式all覆盖。
36
+ reasons: tuple[str, ...] = () # 计划阶段选择原因,不冒充实际执行或观测证明。
37
+ active: bool = True # 只为实际消费者打开来源。
38
+ clock_aliases: tuple[str, ...] = () # 只用于推进周期的定位,不因此读取该信号数值。
39
+
40
+
41
+ @dataclass(frozen=True)
42
+ class InputRequirements:
43
+ """保存同一计划的样本、逐消息、观测及原帧需求,保留原声明顺序。
44
+
45
+ ordinary_sample_aliases 供普通信号批和历史使用;message_aliases 供同条
46
+ 消息求值使用。required_aliases 是二者并集,不能用它强制生成普通样本。
47
+ sources保留全部声明;observation_sources仅列实际需要完整来源观测的来源。
48
+ raw_sources 只来自显式原帧导出请求,不由解码或指标依赖推导。
49
+ """
50
+
51
+ ordinary_sample_aliases: tuple[str, ...] # 全计划所需普通样本,保原声明序。
52
+ message_aliases: tuple[str, ...] # 全计划所需逐消息字段。
53
+ required_aliases: tuple[str, ...] # 两类输入的声明序并集。
54
+ sources: tuple[SourceInputRequirements, ...] # 每来源独立需求,不省略观测来源。
55
+ observation_sources: tuple[str, ...] # time_scope=source的来源;不是目标记录时间范围。
56
+ raw_sources: tuple[str, ...] # 仅显式原始片段输出需要保存原帧的来源。
57
+
58
+ analysis_sample_aliases: tuple[str, ...] = () # 普通计算所需值,不含纯导出列。
59
+ constant_observation: bool = False # 无信号常量规则/统计需要会话观测范围。
60
+
61
+ def for_source(self, name: str) -> SourceInputRequirements:
62
+ """按来源名称取得本计划的需求,不创建新副本。
63
+
64
+ 参数: name为原生来源名称字符串。
65
+ 返回: 同一冻结 SourceInputRequirements。
66
+ 异常: TypeError 为非原生文本;ValueError 为未知来源。
67
+ """
68
+ if type(name) is not str:
69
+ raise TypeError('需求来源名称必须为原生str')
70
+ for source in self.sources:
71
+ if source.source == name:
72
+ return source
73
+ raise ValueError('未知需求来源:' + name)
74
+
75
+
76
+ def supports_unbounded_message_summary(plan) -> bool:
77
+ """检查计划是否只请求整文件逐消息累计,不据此读取或计算数据。
78
+
79
+ 参数: plan为已解析的AnalysisPlan;自由声明或未引用派生不产生运行消费者。
80
+ 返回: bool;True允许用户省略dataset.domain,仍需另选实际检查和时间范围。
81
+ 异常: 非法typed对象的属性错误原样传播;本函数不吞配置或来源错误。
82
+ """
83
+ # 消息表达式仅使用本条值和显式参数,没有普通TTL或窗口消费者。
84
+ needed = {item.source for item in plan.message_calculations}
85
+ source_ok = bool(needed) and all(item.source_type in ('can_blf', 'can_asc', 'asc_or_blf', 'raw_can_csv')
86
+ for item in plan.sources if item.name in needed)
87
+ return ((source_ok) and (bool(plan.message_calculations)) and (all(item.message_policy == 'current_message-v1' for item in plan.message_calculations)) and (not plan.rules) and (not plan.windows) and (not plan.calculations) and (plan.outputs.signal_csv is None) and (plan.outputs.can_frames is None))
88
+
89
+
90
+ def collect_input_requirements(plan) -> InputRequirements:
91
+ """从全部请求结果收集原始输入需求,不进行输入 I/O 或运行时值校验。
92
+
93
+ 参数:
94
+ plan: 已静态检查的 AnalysisPlan;不根据 raw_config 重新解析或猜测引用。
95
+ 返回:
96
+ InputRequirements。别名、来源和去重字段保留声明顺序,纯参数逐消息
97
+ 指标即使没有信号依赖,也保留 update_message.frame_id。
98
+ 异常:
99
+ TypeError 为非计划对象或依赖容器错误;ValueError 为未声明依赖、
100
+ 缺少规则/窗口/来源引用或错误 CAN 字段。模型属性错误原样传播。
101
+ 边界:
102
+ 仅收集依赖,不替代完整配置校验;不用的声明仍由计划构建器校验。
103
+ 所有声明规则和窗口本身都是输出根,不只收集被指标引用的节点。
104
+ """
105
+ # 延迟导入避免计划构建器与需求报告之间形成模块循环。
106
+ from .plan import AnalysisPlan
107
+
108
+ if not isinstance(plan, AnalysisPlan):
109
+ raise TypeError('输入需求需要AnalysisPlan')
110
+ definitions = tuple(item.definition for item in plan.signals)
111
+ names = {item.name for item in definitions}
112
+ ordinary, messages = set(), set()
113
+ rules = {item.rule_id: item for item in plan.rules}
114
+ windows = {item.window_id: item for item in plan.windows}
115
+ sources = {item.name: item for item in plan.sources}
116
+ selectors = {name: [] for name in sources}
117
+
118
+ def add(expression, destination):
119
+ """将已展开依赖加入本次有限集合,拒绝未知别名。
120
+
121
+ 参数: expression为原静态表达式;destination为本次局部set。
122
+ 返回: None。异常: 依赖类型错误或未声明名称抛 TypeError/ValueError。
123
+ """
124
+ dependencies = expression.dependencies
125
+ if type(dependencies) is not tuple or any(type(name) is not str for name in dependencies):
126
+ raise TypeError('表达式依赖必须为原生str tuple')
127
+ if not set(dependencies) <= names:
128
+ raise ValueError('表达式依赖包含未声明信号')
129
+ destination.update(dependencies)
130
+
131
+ def add_rule(rule_id):
132
+ """收集定义结果范围的原规则条件,不用空依赖掩盖缺失引用。
133
+
134
+ 参数: rule_id为本计划规则ID。返回: None。
135
+ 异常: ValueError 为未知规则;条件依赖错误沿 add 原样传播。
136
+ """
137
+ if rule_id not in rules:
138
+ raise ValueError('输入需求引用未知规则:' + str(rule_id))
139
+ for expression in rules[rule_id].expressions:
140
+ add(expression, ordinary)
141
+
142
+ for rule in plan.rules:
143
+ for expression in rule.expressions:
144
+ add(expression, ordinary)
145
+ for window in plan.windows:
146
+ add_rule(window.event)
147
+ for calculation in plan.calculations:
148
+ for expression in (calculation.signal, calculation.condition):
149
+ if expression is not None:
150
+ add(expression, ordinary)
151
+ if calculation.scope != 'session':
152
+ prefix, separator, target = calculation.scope.partition(':')
153
+ if not separator or prefix not in ('event', 'segment'):
154
+ raise ValueError('输入需求需要合法指标范围')
155
+ if prefix == 'segment':
156
+ if target not in windows:
157
+ raise ValueError('输入需求引用未知窗口:' + target)
158
+ target = windows[target].event
159
+ add_rule(target)
160
+ for calculation in plan.message_calculations:
161
+ add(calculation.expr, messages)
162
+ if calculation.disjunction is not None:
163
+ alias = calculation.disjunction.signal
164
+ if alias not in names:
165
+ raise ValueError('逐消息方向引用未声明信号')
166
+ messages.add(alias)
167
+ if calculation.source not in sources or sources[calculation.source].source_type not in ('can_blf', 'can_asc', 'asc_or_blf', 'raw_can_csv'):
168
+ raise ValueError('逐消息选择器需要本计划CAN来源')
169
+ selectors[calculation.source].append(calculation.update_message.frame_id)
170
+
171
+ analysis = set(ordinary)
172
+ choices = dict(() if plan.intervals is None else plan.intervals.resolved)
173
+ constant_observation = (any(not rule.dependencies and
174
+ (rule.rule_id not in choices or choices[rule.rule_id].driver is None) for rule in plan.rules) or any(
175
+ calculation.scope=='session' and (calculation.calculation_id not in choices or choices[calculation.calculation_id].driver is None) and
176
+ not any(e.dependencies for e in (calculation.signal,calculation.condition) if e is not None) for calculation in plan.calculations))
177
+ # 导出是实际消费者:原始信号表所需字段进入普通历史,不依赖表达式恰好引用它。
178
+ if plan.outputs.signal_csv is not None:
179
+ exported=set(plan.outputs.signal_csv.spec.signals)
180
+ if not exported<=names:
181
+ raise ValueError('信号导出引用未定义别名')
182
+ ordinary.update(exported)
183
+ clocks = {choice.driver for _, choice in (() if plan.intervals is None else plan.intervals.resolved)
184
+ if choice.driver is not None}
185
+ if not clocks <= names:
186
+ raise ValueError('间隔驱动引用未声明信号')
187
+ required = ordinary | messages | clocks
188
+ # 只有整文件消息总计可完全省时间;显式时间域始终保留筛选所需时间。
189
+ summary_only = supports_unbounded_message_summary(plan)
190
+ if type(plan.dataset.domain_explicit) is not bool:
191
+ raise TypeError('dataset.domain_explicit需要原生bool')
192
+ if plan.dataset.domain_explicit != (plan.dataset.domain is not None):
193
+ raise ValueError('dataset.domain_explicit必须与实际domain声明是否存在一致')
194
+ entries = []
195
+ for source in plan.sources:
196
+ selected = tuple(item for item in definitions if item.source == source.name and item.name in required)
197
+ fields = tuple(dict.fromkeys(item.field for item in selected if item.name in ordinary | messages))
198
+ clock_ids = tuple(can_field_from_key(item.field).frame_id for item in selected
199
+ if item.name in clocks and source.source_type in ('can_blf','can_asc','asc_or_blf','raw_can_csv'))
200
+ selector_ids = tuple(dict.fromkeys((*selectors[source.name], *clock_ids)))
201
+ frame_output=plan.outputs.can_frames
202
+ export_ids=tuple(rule.frame_id for rule in frame_output.rules) if frame_output is not None and frame_output.source==source.name else ()
203
+ frame_ids = (tuple(dict.fromkeys(
204
+ (*[can_field_from_key(field).frame_id for field in fields], *selector_ids,*export_ids)))
205
+ if source.source_type in ('can_blf','can_asc','asc_or_blf','raw_can_csv') else ())
206
+ # 非CAN与混合任务保留原观测契约;完整诊断不随空依赖被裁剪。
207
+ input_check, time_scope = 'auto', 'source'
208
+ reasons = ('普通分析、混合任务或非CAN来源保留全来源观测时间。',)
209
+ if source.source_type == 'can_blf' and isinstance(source.config, LegacyCANSpec):
210
+ input_check = source.config.input_check
211
+ if type(input_check) is not str or input_check not in ('auto', 'full'):
212
+ raise ValueError('CAN input_check需要auto或full')
213
+ if input_check == 'full' or source.config.decode_scope == 'all':
214
+ input_check = 'full'
215
+ reasons = ('显式完整输入检查或all解码保留全部原帧与时间诊断。',)
216
+ elif summary_only:
217
+ time_scope = 'selected' if plan.dataset.domain_explicit else 'none'
218
+ reasons = (('用户显式配置domain,仅处理所需记录时间以执行时间筛选。',)
219
+ if plan.dataset.domain_explicit else
220
+ ('整文件固定周期当前消息总计无时间消费者,不采集报文时间。',))
221
+ if source.source_type in ('can_asc','asc_or_blf','raw_can_csv'):
222
+ input_check=source.config.input_check
223
+ if input_check=='full':
224
+ reasons=('显式完整输入检查保留全部原帧时间顺序检查。',)
225
+ active = True
226
+ raw_needed=frame_output is not None and frame_output.source==source.name
227
+ active=bool(selected or selectors[source.name] or constant_observation or raw_needed)
228
+ if not active:
229
+ time_scope='none'; reasons=('未被计算、观测或导出引用,不打开来源。',)
230
+ elif source.source_type in ('can_blf','can_asc','asc_or_blf','raw_can_csv') and input_check!='full':
231
+ observed=bool(set(item.name for item in selected)&(ordinary|clocks) or constant_observation or raw_needed)
232
+ time_scope='source' if observed else 'selected' if plan.dataset.domain is not None or source.source_type!='can_blf' else 'none'
233
+ reasons=(('所需时序计算/导出使用实际来源观测范围。' if observed else
234
+ '逐消息累计只检查时间筛选所需记录。' if time_scope=='selected' else
235
+ '整文件逐消息累计无时间消费者,不采时间。'),)
236
+ if (active and source.source_type in ('can_asc','asc_or_blf')
237
+ and input_check=='auto' and not raw_needed):
238
+ reasons=('按原顺序读取;仅检查所需通道/ID的时间先后顺序,无关帧不进入计算;观测范围按time_scope所列需求处理。',)
239
+ entries.append(SourceInputRequirements(
240
+ source.name, tuple(item.name for item in selected if item.name in ordinary),
241
+ tuple(item.name for item in selected if item.name in messages),
242
+ tuple(item.name for item in selected), fields, frame_ids, selector_ids,
243
+ time_scope, input_check, reasons, active, tuple(item.name for item in selected if item.name in clocks)))
244
+ return InputRequirements(
245
+ tuple(item.name for item in definitions if item.name in ordinary),
246
+ tuple(item.name for item in definitions if item.name in messages),
247
+ tuple(item.name for item in definitions if item.name in required),
248
+ tuple(entries), tuple(item.source for item in entries if item.time_scope == 'source'),
249
+ (() if plan.outputs.can_frames is None else (plan.outputs.can_frames.source,)),
250
+ tuple(item.name for item in definitions if item.name in analysis), constant_observation)
@@ -0,0 +1,306 @@
1
+ """检查来源和信号配置,建立静态定位与显式转换声明。
2
+
3
+ 输入是当前配置的sources、signals数组和相对路径基准,输出SourcePlan
4
+ 与SignalPlan元组。内存原行已在配置中,可核对原顺序和已出现字段;CSV
5
+ 只保存有序路径和格式,不读取文件表头。时间使用明确单位、公共起点或时区,
6
+ 原字段保持原文,整数值不先转浮点。valid_for声明有效值最多保持的时间,
7
+ 省略时取本信号period或运行期DBC周期的三倍。
8
+ CAN支持既有单BLF profile与新ASC/原始CSV静态规格,完整原定位保存为规范字段键;
9
+ 旧表格profile仍报告capability_unavailable。仅需补齐信号元数据时读取DBC,不读日志。
10
+ """
11
+
12
+ # 配置基准和时基身份使用标准库,无输入扫描。
13
+ from hashlib import sha256
14
+ from pathlib import Path
15
+ # 原模型负责声明范围/值类型/时序顺序门槛。
16
+ from ..core.binding import SignalDefinition
17
+ from ..core.models import MemoryRow, SourceSpec, TimebaseSpec
18
+ from ..core.types import SignalDType, TimeType
19
+ # CSV只构造配置,不实例化文件读取器。
20
+ from ..sources.csv_spec import SignalCSVSpec
21
+ from ..sources.can_spec import LegacyCANSpec
22
+ from ..sources.text_can_spec import CANTextSpec
23
+ from ..legacy.records import PROFILE_ID, field_from_dict
24
+ # 配置校验严格定位并深冻结元数据。
25
+ from .checks import (PlanValidationError, absolute_path, array_at, canonical, choice_at, coordinate_at,
26
+ duration_at, metadata_at, model_at, number_at, object_at, text_at, timezone_at)
27
+ from .models import SignalPlan, SourcePlan
28
+ from .signal_validity import declared_valid_for
29
+ from .input_defaults import source_defaults, source_reference
30
+ from .input_paths import expand_source_files
31
+ from .dbc_defaults import DBCDefaults
32
+
33
+
34
+ def parse_sources(value, base: Path) -> tuple[SourcePlan, ...]:
35
+ """按声明顺序解析内存、已解码CSV或原始CAN规格,不读取分析文件。
36
+
37
+ 参数:
38
+ value (list): sources配置数组,每项含名称、来源种类和时间声明。
39
+ base (Path): 相对CSV、BLF及DBC路径的词法解释基准。
40
+ 返回:
41
+ tuple[SourcePlan, ...]。至少含一个来源;路径转为绝对定位并保留原顺序。
42
+ 内存原行按声明顺序构造,CSV/CAN仅构造配置,文件、表头及DBC尚未核实。
43
+ 异常:
44
+ PlanValidationError: 字段、格式、名称、时序、时间基准或来源能力错误,
45
+ 保存对应配置位置;未接入来源使用capability_unavailable错误码。
46
+ 副作用:
47
+ 不打开CSV或DBC;地区时区解析可能访问本机时区数据库。
48
+ """
49
+ # 来源数组保持声明顺序,只有用户明确的目录/通配符会枚举文件名。
50
+ items = array_at(value, '$.sources')
51
+ # dataset分析基准需要至少一个明确来源。
52
+ if not items:
53
+ # 空来源计划无法声明时间坐标。
54
+ raise PlanValidationError('$.sources', '至少需要一个来源')
55
+ # 当前计划内登记唯一来源名称。
56
+ result, names = [], set()
57
+ # 原文件和来源顺序保持调用者声明。
58
+ for index, raw in enumerate(items):
59
+ # 每个错误准确定位数组项。
60
+ path = f'$.sources[{index}]'
61
+ # 在种类分派前确认基本对象与kind,不忽略未知顶层键。
62
+ if type(raw) is not dict:
63
+ # 不从类名或字符串构建来源。
64
+ raise PlanValidationError(path, 'source必须为对象')
65
+ # 仅显式目录/通配符枚举文件名;完整路径仍不stat、不打开业务输入。
66
+ if raw.get('source_type') != 'memory' and ('path' in raw or 'paths' in raw):
67
+ paths, shifts = expand_source_files(raw, base, path)
68
+ raw = dict(raw, paths=[str(item) for item in paths])
69
+ raw.pop('path', None)
70
+ if shifts is not None:
71
+ raw['offsets'] = list(shifts)
72
+ # 默认仅识别ASC/BLF,CSV/内存保持明确种类;省略时间不代表自动校时。
73
+ raw = source_defaults(raw, index)
74
+ # 解析补齐后的来源类型,未知值仍由统一选择检查报告。
75
+ source_type = choice_at(raw.get('source_type'), ('memory', 'signal_csv', 'can_asc', 'asc_or_blf', 'can_blf', 'legacy_raw_csv','raw_can_csv'), path + '.source_type')
76
+ if source_type in ('can_asc','asc_or_blf','raw_can_csv'):
77
+ # 新路径独立声明格式和连续文件,不冒充旧profile或把原始表当信号表。
78
+ from .text_inputs import parse_text_source
79
+ source=parse_text_source(raw,base,path)
80
+ if source.name in names:
81
+ raise PlanValidationError(path+'.name','来源重复:'+source.name)
82
+ names.add(source.name); result.append(source)
83
+ continue
84
+ # 其余来源只接受内存、信号CSV及受控BLF读取路径。
85
+ if source_type not in ('memory', 'signal_csv', 'can_blf'):
86
+ # 未支持的来源应在配置阶段拒绝。
87
+ raise PlanValidationError(path + '.source_type', f'{source_type}不支持;原始CSV请使用can_raw_csv来源', 'capability_unavailable')
88
+ # 格式特有字段必须按种类严格限定。
89
+ if source_type == 'can_blf':
90
+ # BLF来源使用固定profile、单通道DBC和有序文件路径,只接受声明的读取选项。
91
+ raw = object_at(raw, path, ('name', 'source_type', 'time', 'dbc_by_channel'),
92
+ ('path', 'paths', 'reader_options', 'metadata', 'decode_scope', 'input_check', 'legacy_profile'))
93
+ else:
94
+ optional = ('metadata',) if source_type == 'memory' else ('path', 'paths', 'encoding', 'delimiter', 'missing_values', 'metadata')
95
+ # memory行或CSV时间列不能省略。
96
+ raw = object_at(raw, path, ('name', 'source_type', 'time', 'rows' if source_type == 'memory' else 'time_column'), optional)
97
+ # 来源名与DSL别名采用统一安全标识规则。
98
+ name = text_at(raw['name'], path + '.name', identifier=True)
99
+ # 重名不能选首项/覆盖。
100
+ if name in names:
101
+ # 精确指出第二次定义位置。
102
+ raise PlanValidationError(path + '.name', f'来源重复:{name}')
103
+ # 只登记当前计划名称。
104
+ names.add(name)
105
+ # 不接受漂移/隐式机器时区等未定义字段。
106
+ clock = object_at(raw['time'], path + '.time', ('time_type', 'unit'), ('origin', 'offset', 'timezone'))
107
+ # 时间坐标种类与单位独立。
108
+ time_type = choice_at(clock['time_type'], ('relative', 'absolute'), path + '.time.time_type')
109
+ # ISO表示只允许absolute。
110
+ unit = choice_at(clock['unit'], ('s', 'ms', 'us', 'ns', 'ISO8601'), path + '.time.unit')
111
+ if source_type == 'can_blf':
112
+ # 原CAN timestamp固定为秒;不接受不会参与该转换的timezone声明。
113
+ choice_at(unit, ('s',), path + '.time.unit')
114
+ if 'timezone' in clock:
115
+ raise PlanValidationError(path + '.time.timezone', '固定CAN秒时间不接受timezone')
116
+ # 首版relative必须有明确公共起点声明。
117
+ if time_type == 'relative' and ('origin' not in clock or unit == 'ISO8601' or 'timezone' in clock):
118
+ # 不把原首点0视为公共origin。
119
+ raise PlanValidationError(path + '.time', 'relative必须origin,不接受ISO8601或timezone')
120
+ # absolute坐标已经UTC,不接相对origin。
121
+ if time_type == 'absolute' and 'origin' in clock:
122
+ # 防止一来源同时声明两种坐标含义。
123
+ raise PlanValidationError(path + '.time.origin', 'absolute不接受relative origin')
124
+ # 同一完整relative origin生成相同ID,absolute统一UTC。
125
+ origin = text_at(clock['origin'], path + '.time.origin') if time_type == 'relative' else None
126
+ # ID来自声明内容,不来自机器、文件名或实际首点。
127
+ clock_id = 'relative_' + sha256(origin.encode('utf-8')).hexdigest()[:16] if origin is not None else 'utc'
128
+ # 固定映射坐标保持定宽纳秒,负offset允许。
129
+ offset = coordinate_at(clock.get('offset', '0s'), path + '.time.offset')
130
+ # naive日期是否可解析由实际显式tz决定。
131
+ tz = timezone_at(clock.get('timezone'), path + '.time.timezone')
132
+ # 型别与origin契约沿用已验时间模型。
133
+ timebase = model_at(TimebaseSpec, path + '.time', clock_id, TimeType(time_type), origin)
134
+ # 规范定位身份包括完整原格式与时间声明。
135
+ identity_input = dict(raw)
136
+ # memory行在配置中已经可见,允许检查原顺序但不补数据。
137
+ if source_type == 'memory':
138
+ # memory行time必须明确单位,不用source.unit解释裸数。
139
+ rows = []
140
+ # 行序号由声明原序生成,不排序。
141
+ for row_index, row in enumerate(array_at(raw['rows'], path + '.rows')):
142
+ # 行仅time与values,未知字段不忽略。
143
+ row_path = f'{path}.rows[{row_index}]'
144
+ # 保留原字段值且拒绝自由行选项。
145
+ row = object_at(row, row_path, ('time', 'values'))
146
+ # 原值对象不是自由元数据,但字段名称允许完整原文。
147
+ if type(row['values']) is not dict:
148
+ # 不接受不明列排列或假默认值。
149
+ raise PlanValidationError(row_path + '.values', '必须为原字段对象')
150
+ # 单位/日期与时基种类显式配合。
151
+ time_ns = coordinate_at(row['time'], row_path + '.time', absolute=time_type == 'absolute', tz=tz)
152
+ # 原标量模型复制只读值映射,不将None补0。
153
+ rows.append(model_at(MemoryRow, row_path, time_ns=time_ns, values=row['values'], sequence=row_index))
154
+ # SourceSpec检查来源内回退/offset溢出,不重排原行。
155
+ config = model_at(SourceSpec, path, name=name, timebase=timebase, rows=tuple(rows), offset_ns=offset)
156
+ else:
157
+ # 文件路径必须且只能使用一种明确写法。
158
+ if ('path' in raw) == ('paths' in raw):
159
+ # 文件选择已在前面展开,不在这里重复扫描目录或拼接两组路径。
160
+ raise PlanValidationError(path, 'path与paths必须且只能提供一个')
161
+ # path单项和paths数组归一为严格原序tuple。
162
+ raw_paths = [raw['path']] if 'path' in raw else array_at(raw['paths'], path + '.paths')
163
+ # 词法绝对化不检查文件存在,配置目录作为明确基准。
164
+ paths = tuple(absolute_path(item, base, f'{path}.paths[{i}]') for i, item in enumerate(raw_paths))
165
+ if source_type == 'can_blf':
166
+ # 每个来源按声明顺序读取1至4096个BLF文件,不扫描目录或忽略额外路径。
167
+ if not 1 <= len(paths) <= (4096):
168
+ raise PlanValidationError(path + '.paths', 'BLF来源需要1至4096个有序文件路径')
169
+ profile = choice_at(raw.get('legacy_profile', PROFILE_ID), (PROFILE_ID,), path + '.legacy_profile')
170
+ options = object_at(raw.get('reader_options', {}), path + '.reader_options', (),
171
+ ('decode_policy',))
172
+ dbc = raw['dbc_by_channel']
173
+ if type(dbc) is not dict or len(dbc) != 1:
174
+ raise PlanValidationError(path + '.dbc_by_channel', '当前CAN必须恰有一个通道到DBC路径声明')
175
+ channel_text = next(iter(dbc))
176
+ from .channels import channel_index
177
+ channel = channel_index(channel_text, path + '.dbc_by_channel', key=True)
178
+ dbc_path = absolute_path(dbc[channel_text], base, path + '.dbc_by_channel.' + channel_text)
179
+ # model_at的path参数表示错误位置;源模型path按位置传递,避免同名冲突。
180
+ config = model_at(LegacyCANSpec, path, name, paths[0], dbc_path,
181
+ channel, timebase, unit, offset, profile,
182
+ choice_at(raw.get('decode_scope', 'requested'), ('all', 'requested'), path + '.decode_scope'),
183
+ choice_at(raw.get('input_check', 'auto'), ('auto', 'full'), path + '.input_check'),
184
+ paths if len(paths)>1 else (),
185
+ choice_at(options.get('decode_policy','strict'),
186
+ ('strict','partial','legacy'),path+'.reader_options.decode_policy'))
187
+ # 默认按实际需求执行,不回填raw;实际执行策略还进入来源描述和运行证明。
188
+ # 实际绝对定位进入来源声明身份,不读取路径内容或猜测DBC元数据。
189
+ identity_input['dbc_by_channel'] = {channel_text: str(dbc_path)}
190
+ else:
191
+ # missing标记精确匹配,包括空字符串,不strip或猜NA。
192
+ missing = array_at(raw.get('missing_values', ['']), path + '.missing_values')
193
+ # SignalCSVSpec检查空paths/编码/分隔符/重复标记,无输入I/O。
194
+ config = model_at(SignalCSVSpec, path, name=name, paths=paths, timebase=timebase,
195
+ time_column=text_at(raw['time_column'], path + '.time_column'), unit=unit, offset_ns=offset,
196
+ timezone=tz, encoding=raw.get('encoding', 'utf-8'), delimiter=raw.get('delimiter', ','), missing_values=tuple(missing))
197
+ # 实际定位身份使用已解析绝对路径,仍保留数组原序。
198
+ identity_input['paths'] = [str(item) for item in paths]
199
+ # 两种等价路径输入形式不保留冗余path键。
200
+ identity_input.pop('path', None)
201
+ # 自由元数据深冻结,不向reader转发未定义键。
202
+ metadata = metadata_at(raw.get('metadata', {}), path + '.metadata')
203
+ # 构造来源声明模型;文件存在性和实际列仍留待读取核实。
204
+ result.append(SourcePlan(name, source_type, config, unit, clock.get('timezone'), canonical(identity_input), metadata))
205
+ # 不保留用户可变列表引用。
206
+ return tuple(result)
207
+
208
+
209
+ def parse_signals(value, sources: tuple[SourcePlan, ...]) -> tuple[SignalPlan, ...]:
210
+ """检查原字段到简单别名的转换与有效期声明。
211
+
212
+ 参数:
213
+ value (list): signals配置数组,声明来源、原字段、类型、单位及可选period/valid_for。
214
+ sources (tuple[SourcePlan, ...]): 当前计划已经解析的来源。
215
+ 返回:
216
+ tuple[SignalPlan, ...]。保持信号顺序,choices原编码类型保留,
217
+ valid_for转为正整数纳秒;缺省且等待DBC时保存None,转换和可选语义按核心模型检查。
218
+ 异常:
219
+ PlanValidationError: 结构、来源、字段、类型、单位、有效期或转换契约错误。
220
+ 边界:
221
+ 非空内存可检查字段;CSV/CAN日志不读。缺省CAN元数据只读取DBC。
222
+ 本函数保存有效期声明,不保持信号值或执行过期判断。
223
+ """
224
+ # 来源定位表仅当前计划有效。
225
+ source_map = {item.name: item for item in sources}
226
+ defaults = DBCDefaults()
227
+ # 信号原顺序保留,唯一性由声明绑定统一检查。
228
+ result = []
229
+ # 可选项来自当前配置schema,不开放自由质量或额外有效期政策。
230
+ optional = ('valid_for', 'period', 'input_unit', 'scale', 'offset', 'sample_policy', 'same_time_policy', 'choices', 'valid_range', 'invalid_values',
231
+ 'sign_convention', 'measurement_location', 'mapping_version', 'semantic_id', 'semantic_contract_version', 'metadata')
232
+ # 不将字符串解释为signal迭代器。
233
+ from .signal_groups import signal_entries
234
+ for raw, path in signal_entries(value):
235
+ # 未登记的字段明确报错,不能静默忽略拼写错误或已删除的旧参数。
236
+ raw = object_at(raw, path, ('name', 'field'), optional + ('source','dtype','unit'))
237
+ if 'dtype' in raw:
238
+ choice_at(raw['dtype'],tuple(item.value for item in SignalDType),path+'.dtype')
239
+ if 'unit' in raw:
240
+ text_at(raw['unit'],path+'.unit')
241
+ # 来源名本身是简单标识符。
242
+ source = source_reference(raw, sources, path)
243
+ # 不靠相同semantic_id推测来源。
244
+ if source not in source_map:
245
+ # static也必须唯一定位当前来源。
246
+ raise PlanValidationError(path + '.source', f'未知来源:{source}','invalid_reference',
247
+ hint='填写sources中已声明的name:'+', '.join(source_map))
248
+ # memory行已在配置内可见时检查实际字段,不为CSV额外读表头。
249
+ config = source_map[source].config
250
+ if isinstance(config, (LegacyCANSpec,CANTextSpec)):
251
+ # 原CAN定位严格复用六字段模型;只保存规范键,不把点号原名变成DSL属性。
252
+ # 当前来源只有一个DBC通道;省略时继承,显式错误仍由原模型检查。
253
+ field_raw = raw['field']
254
+ if type(field_raw) is dict:
255
+ field_raw = dict(field_raw)
256
+ from .channels import channel_index
257
+ field_raw['channel'] = (channel_index(field_raw['channel'], path + '.field.channel')
258
+ if 'channel' in field_raw else config.channel)
259
+ locator = model_at(field_from_dict, path + '.field', field_raw)
260
+ if locator.channel != config.channel:
261
+ raise PlanValidationError(path + '.field.channel', '信号通道必须与来源唯一DBC通道一致')
262
+ raw = defaults.fill(raw,config,locator,path)
263
+ try:
264
+ # 规范定位也受CAN读取协议的有界JSON约束;生成失败仍归为当前位置的配置错误。
265
+ field = locator.key
266
+ except (TypeError, ValueError) as error:
267
+ raise PlanValidationError(path + '.field', str(error)) from error
268
+ else:
269
+ # memory/CSV仍只接受原字段文本,不能借CAN对象扩展其他来源的定位语义。
270
+ field = text_at(raw['field'], path + '.field')
271
+ for key in ('dtype', 'unit'):
272
+ if key not in raw:
273
+ raise PlanValidationError(path + '.' + key,'已解析数据没有DBC元数据,请提供' + key, 'missing_field')
274
+ # 空memory无实际字段证明,保留空观测状态供报告。
275
+ if isinstance(config, SourceSpec) and config.rows and not any(field in row.values for row in config.rows):
276
+ # 不造虚拟字段通过T39。
277
+ raise PlanValidationError(path + '.field', f'原memory字段不存在:{field}')
278
+ # CAN缺省值已由DBC元数据推导;不扫描日志猜数据类型。
279
+ dtype = choice_at(raw['dtype'], tuple(item.value for item in SignalDType), path + '.dtype')
280
+ # choices用二元JSON数组保存int/bool/str编码类型,避免对象键字符串化。
281
+ choices = []
282
+ # 每个明确映射均保留原序和原类型。
283
+ for choice_index, pair in enumerate(array_at(raw.get('choices', []), path + '.choices')):
284
+ # 不接无类型字典编码或错长度配对。
285
+ if type(pair) is not list or len(pair) != 2:
286
+ # 核心随后继续检查标签域与重复编码。
287
+ raise PlanValidationError(f'{path}.choices[{choice_index}]', 'choices项必须为[原编码, 标签]二元数组')
288
+ # 仅冻结结构,不做bool truthiness或整数float转换。
289
+ choices.append(tuple(pair))
290
+ # 范围若存在必须保持二端点原数值。
291
+ valid_range = tuple(array_at(raw['valid_range'], path + '.valid_range')) if 'valid_range' in raw else None
292
+ # 用户有效期优先;信号周期乘三只决定保持上限,不改报文实际时间。
293
+ valid_for_ns = declared_valid_for(raw, path,
294
+ dbc_available=isinstance(config, (LegacyCANSpec, CANTextSpec)))
295
+ # core检查所有声明转换及语义,额外factor只在解码输出之后应用一次。
296
+ definition = model_at(SignalDefinition, path, name=raw['name'], source=source, field=field,
297
+ dtype=SignalDType(dtype), unit=raw['unit'], valid_for_ns=valid_for_ns,
298
+ input_unit=raw.get('input_unit'), scale=raw.get('scale', 1), offset=raw.get('offset', 0), choices=tuple(choices),
299
+ valid_range=valid_range, invalid_values=tuple(array_at(raw.get('invalid_values', []), path + '.invalid_values')),
300
+ sample_policy=raw.get('sample_policy', 'backward_hold'), same_time_policy=raw.get('same_time_policy', 'error'),
301
+ semantic_id=raw.get('semantic_id'), semantic_contract_version=raw.get('semantic_contract_version'),
302
+ mapping_version=raw.get('mapping_version'), sign_convention=raw.get('sign_convention'), measurement_location=raw.get('measurement_location'))
303
+ # 自由metadata不作为隐藏转换或质量策略。
304
+ result.append(SignalPlan(definition, metadata_at(raw.get('metadata', {}), path + '.metadata')))
305
+ # 全部契约已经冻结,不依赖用户列表生命周期。
306
+ return tuple(result)