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,497 @@
1
+ """定义分析层接收的来源描述、读取请求和独立信号批次。
2
+
3
+ 调用者提供来源元数据和已经归一化的信号数组,本模块检查名称、类型、
4
+ 时间、序号与质量,再输出冻结模型。数组复制为模型自身拥有的只读数据,
5
+ 嵌套元数据深度复制为只读映射和元组;不读取文件或DBC,也不注册全局来源。
6
+
7
+ SignalSeries只表示一次传输中的一列,区别于core.state中的完整内存历史。
8
+ 每列允许为空,时间非递减,同时间更新完整保留;跨批身份和完整时间组
9
+ 由BatchValidator及后续执行层处理。valid是有效性掩码,quality保存无效
10
+ 原因;无效值的存储占位不能参与正常计算,original_values可另存原始诊断。
11
+ nbytes只统计五个数值数组的存储,Python容器和全任务预算须另外核算。
12
+ """
13
+
14
+ # 标准库冻结结构和JSON元数据,元数据不含任意可执行对象。
15
+ from collections.abc import Mapping
16
+ # 数据类字段冻结不替代数组所有权与内容校验。
17
+ from dataclasses import dataclass, field
18
+ # JSON浮点元数据必须有限,原始无效样本另有专用诊断字段。
19
+ from math import isfinite
20
+ # 深冻结断开调用者后续字典修改。
21
+ from types import MappingProxyType
22
+ # 联合类型表明元数据不是无类型object占位。
23
+ from typing import TypeAlias
24
+ # NumPy只负责列布局,不负责CAN解码。
25
+ import numpy as np
26
+
27
+ # 原样本身份和半开范围使用既有已验证逻辑模型。
28
+ from ..core.models import Interval, SourceRef
29
+ # 复用数组结构校验,不把其数值计算作为独立参考内核。
30
+ from ..core.numeric_numpy import NumericArray
31
+ # dtype和质量是通用类型,来源模型不绑定业务信号名称。
32
+ from ..core.types import SignalDType
33
+ # 共享名称/不可变标量校验,不隐式cast错误输入。
34
+ from ..core.validation import require_identifier, require_scalar, require_text
35
+ # 所有观测和watermark坐标均为明确int64纳秒。
36
+ from ..timebase.conversion import require_int64_ns
37
+
38
+ # 冻结后的自由元数据只包含JSON标量、tuple数组和字符串键Mapping。
39
+ JsonValue: TypeAlias = str | int | float | bool | None | tuple['JsonValue', ...] | Mapping[str, 'JsonValue']
40
+
41
+
42
+ def freeze_metadata(value: JsonValue) -> JsonValue:
43
+ """递归复制JSON元数据,避免共享调用者的可变容器。
44
+
45
+ 参数:
46
+ value (JsonValue): JSON标量、字符串键映射、list或tuple;不接受任意对象。
47
+ 返回:
48
+ JsonValue。映射变为新的只读Mapping,数组变为tuple,标量保持原值。
49
+ 异常:
50
+ TypeError: 出现非JSON对象或非字符串键。
51
+ ValueError: 浮点元数据包含NaN或无穷值。
52
+ 副作用:
53
+ 无。复制容器,不修改传入结构。
54
+ """
55
+ # JSON对象逐层冻结,不能仅冻结外层而共享嵌套字典。
56
+ if isinstance(value, Mapping):
57
+ # 所有键必须原生字符串,不把整数键静默变成文本。
58
+ if any(type(key) is not str for key in value):
59
+ # 与字段定位及JSON序列化含义保持一致。
60
+ raise TypeError('metadata键必须为字符串')
61
+ # 新字典与调用者脱离;递归只接受明确JSON类型。
62
+ return MappingProxyType({key: freeze_metadata(item) for key, item in value.items()})
63
+ # 元数据数组冻结为tuple,不产生object数值数组。
64
+ if type(value) in (list, tuple):
65
+ # 顺序是元数据身份,不能排序或去重。
66
+ return tuple(freeze_metadata(item) for item in value)
67
+ # 只有原生JSON标量可保留;bool与int分别明确支持。
68
+ if type(value) not in (str, int, float, bool, type(None)):
69
+ # 禁止任意对象repr或反射序列化。
70
+ raise TypeError('metadata仅接受JSON类型')
71
+ # JSON数值不能包含NaN/Infinity,避免清单不兼容。
72
+ if type(value) is float and not isfinite(value):
73
+ # 无效采样值不通过metadata伪装正常配置。
74
+ raise ValueError('metadata浮点必须有限')
75
+ # 已验证不可变标量不需要改变原值。
76
+ return value
77
+
78
+
79
+ @dataclass(frozen=True)
80
+ class FieldLocation:
81
+ """保存原字段在来源中的位置,区分原字段与表达式别名。
82
+
83
+ source是来源名,field保存表列或内存字段原文,允许含点号。
84
+ locator保存额外的JSON定位信息,并在构造时深度冻结。
85
+ 定位信息只说明如何查找字段,不能证明对应文件或旧来源能力已经核实。
86
+ """
87
+
88
+ source: str # 来源名,不从路径猜测。
89
+ field: str # 列或已解码字段原文,允许点号。
90
+ locator: Mapping[str, JsonValue] = field(default_factory=dict) # profile额外定位证据。
91
+
92
+ def __post_init__(self) -> None:
93
+ """检查来源和原字段,冻结附加定位信息。
94
+
95
+ 参数:
96
+ 无。读取source、field和locator。
97
+ 返回:
98
+ None。将locator替换为独立的只读快照。
99
+ 异常:
100
+ TypeError或ValueError: 名称、字段文本或JSON定位信息不合法。
101
+ """
102
+ # 来源名参与当前计划名称空间,原字段不改名。
103
+ require_identifier(self.source, 'field.source')
104
+ # 字段文本保持原定位,不能解释为DSL属性。
105
+ require_text(self.field, 'field.field')
106
+ # 定位必须是对象,不能接孤立列表或字符串。
107
+ if not isinstance(self.locator, Mapping):
108
+ # 错误结构不假装为空定位。
109
+ raise TypeError('locator必须为Mapping')
110
+ # 所有嵌套层与外部调用者断开共享。
111
+ object.__setattr__(self, 'locator', freeze_metadata(self.locator))
112
+
113
+
114
+ @dataclass(frozen=True)
115
+ class FieldDescription:
116
+ """描述一个可请求的输出别名及其原字段、类型和单位。
117
+
118
+ name是输出别名,field保留原定位;dtype与unit描述归一化后的输出。
119
+ metadata保存只读转换和可选语义声明,不强制普通分析加入领域目录。
120
+ 枚举类型必须在metadata.labels中声明非空、唯一的标签集合,供跨批核对。
121
+ 同一原字段可以有不同显式转换,各别名分别保存描述。
122
+ """
123
+
124
+ name: str # iter_batches可请求的输出别名。
125
+ field: FieldLocation # 完整原定位,区别于semantic_id。
126
+ dtype: SignalDType # 已归一化输出的逻辑类型。
127
+ unit: str # 已归一化输出单位,未知标签不自动verified。
128
+ metadata: Mapping[str, JsonValue] = field(default_factory=dict) # 可选声明与转换证据。
129
+
130
+ def __post_init__(self) -> None:
131
+ """校验字段描述,并冻结用于跨批核对的元数据。
132
+
133
+ 参数:
134
+ 无。读取name、field、dtype、unit和metadata。
135
+ 返回:
136
+ None。metadata成为只读快照;不会读取来源来核实单位或定位。
137
+ 异常:
138
+ TypeError或ValueError: 名称、定位、类型、单位文本、JSON结构或枚举标签域错误。
139
+ """
140
+ # 输出别名遵守首版安全名称规则。
141
+ require_identifier(self.name, 'field.name')
142
+ # 字段位置和dtype不可用无类型字典/字符串代替。
143
+ if not isinstance(self.field, FieldLocation) or not isinstance(self.dtype, SignalDType):
144
+ # 配置层应先显式解析类型。
145
+ raise TypeError('field需要FieldLocation和SignalDType')
146
+ # 标签保留原文;物理单位契约另由绑定检查。
147
+ require_text(self.unit, 'field.unit')
148
+ # 自由元数据只接受对象结构。
149
+ if not isinstance(self.metadata, Mapping):
150
+ # 不自动将错误输入转换为空对象。
151
+ raise TypeError('metadata必须为Mapping')
152
+ # 深冻结先规范元数据数组,enum标签域必须可跨批核对。
153
+ metadata = freeze_metadata(self.metadata)
154
+ # enum的逻辑标签在描述中明确,不能每批重新猜编码顺序。
155
+ if self.dtype is SignalDType.ENUM:
156
+ # labels属于该dtype的必要元数据,普通业务键仍可自由声明。
157
+ labels = metadata.get('labels', ())
158
+ # 只接受非空唯一文本域,不放行字符串本身或重复码。
159
+ if not isinstance(labels, tuple) or not labels or any(type(item) is not str or not item.strip() for item in labels) or len(set(labels)) != len(labels):
160
+ # enum无域就无法证明跨批类型契约。
161
+ raise ValueError('enum描述metadata需要非空唯一labels')
162
+ # 保存不可变描述,不从上一次计划继承。
163
+ object.__setattr__(self, 'metadata', metadata)
164
+
165
+
166
+ @dataclass(frozen=True)
167
+ class SourceCapabilities:
168
+ """逐项记录来源适配器声明的能力和限制。
169
+
170
+ decoded_output、raw_export、repeat_scan和random_access分别表示已解码输出、
171
+ 原始导出、可重复读取和随机访问能力,必须使用真实布尔值。
172
+ diagnostics与limitations是不可变说明元组。模型只校验声明结构,
173
+ 不会运行来源来证明能力,也不因repeat_scan为True自动增加旧日志扫描。
174
+ """
175
+
176
+ decoded_output: bool # 是否实际能返回逐次已解码信号。
177
+ raw_export: bool # 原路径已支持原始导出时才可为True。
178
+ repeat_scan: bool # 可重复调用的能力,不授权多次旧扫描。
179
+ random_access: bool # 是否可随机定位,普通迭代不等同此能力。
180
+ diagnostics: tuple[str, ...] = () # 已实际暴露的诊断。
181
+ limitations: tuple[str, ...] = () # 未获得的元数据或兼容限制。
182
+
183
+ def __post_init__(self) -> None:
184
+ """检查能力开关及诊断、限制文本的结构。
185
+
186
+ 参数:
187
+ 无。读取四个能力开关、diagnostics和limitations。
188
+ 返回:
189
+ None。保留原声明,不推断或测试来源能力。
190
+ 异常:
191
+ TypeError或ValueError: 开关不是bool,文本列表不是tuple,或说明文本为空。
192
+ """
193
+ # 禁止把整数1当作已经审核的能力。
194
+ if any(type(value) is not bool for value in (self.decoded_output, self.raw_export, self.repeat_scan, self.random_access)):
195
+ # 不用truthiness扩大声明。
196
+ raise TypeError('capability必须为bool')
197
+ # 诊断和限制只作为事实文本,不能执行。
198
+ for items in (self.diagnostics, self.limitations):
199
+ # 不共享可变列表或不明确顺序的集合。
200
+ if not isinstance(items, tuple):
201
+ # 错误形状在构造前拒绝。
202
+ raise TypeError('diagnostics/limitations必须为tuple')
203
+ # 每条非空说明保留大小写及原语义。
204
+ for item in items:
205
+ # 不能用空文本冒充限制已说明。
206
+ require_text(item, 'capability说明')
207
+
208
+
209
+ @dataclass(frozen=True)
210
+ class SourceDescription:
211
+ """保存一个来源的静态字段、时钟及能力声明。
212
+
213
+ name标识来源,fields保存唯一输出别名,timebase_id标识声明的时间基准。
214
+ observation_start_ns和observation_end_ns保存已知观测边界,未知端点各自为None。
215
+ capabilities记录能力说明,legacy_profile可保存旧来源的契约标识。
216
+ metadata_status区分'verified'已核实、'declared'仅声明和'unavailable'不可用。
217
+ 模型校验不会读取来源,也不会自动将声明状态升级为已核实。
218
+ """
219
+
220
+ name: str # 当前计划来源名。
221
+ fields: tuple[FieldDescription, ...] # 已描述的输出别名和原定位。
222
+ timebase_id: str # 明确来源时基ID。
223
+ observation_start_ns: int | None # 未知开始保留None。
224
+ observation_end_ns: int | None # 未知终点不补周期。
225
+ capabilities: SourceCapabilities # 逐项审核能力。
226
+ legacy_profile: str | None = None # 仅旧来源需要冻结profile身份。
227
+ metadata_status: str = 'declared' # verified/declared/unavailable。
228
+
229
+ def __post_init__(self) -> None:
230
+ """检查描述归属、别名唯一性和已知的观测范围。
231
+
232
+ 参数:
233
+ 无。读取来源名称、字段元组、时钟、观测端点、能力和证据状态。
234
+ 返回:
235
+ None。已知双端点按时间区间检查,未知端点保持None。
236
+ 异常:
237
+ TypeError或ValueError: 描述类型、归属、重复名称、状态或旧契约标识错误。
238
+ OverflowError: 时间坐标或区间跨度超出范围。
239
+ 副作用:
240
+ 无输入读取;名称合法不表示来源实际存在。
241
+ """
242
+ # 来源和时基各有明确安全名称。
243
+ require_identifier(self.name, 'description.name')
244
+ # 相同ID不等于共同起点,同步仍由计划验证。
245
+ require_identifier(self.timebase_id, 'description.timebase_id')
246
+ # 全部字段有类型,不能只有类名和dict占位。
247
+ if not isinstance(self.fields, tuple) or any(not isinstance(item, FieldDescription) for item in self.fields) or not isinstance(self.capabilities, SourceCapabilities):
248
+ # 错误描述不能进入执行能力检查。
249
+ raise TypeError('description需要typed fields/capabilities')
250
+ # 输出别名唯一且原字段确实属于当前来源。
251
+ if len({item.name for item in self.fields}) != len(self.fields) or any(item.field.source != self.name for item in self.fields):
252
+ # 不取第一个冲突或使用他源字段。
253
+ raise ValueError('description字段重名或来源冲突')
254
+ # 未知边界分别保留;已知才规范精确纳秒。
255
+ for value in (self.observation_start_ns, self.observation_end_ns):
256
+ # None不是0,也不表示完整覆盖。
257
+ if value is not None:
258
+ # bool/float坐标在模型边界拒绝。
259
+ require_int64_ns(value)
260
+ # 双端都有事实才判断完整范围。
261
+ if self.observation_start_ns is not None and self.observation_end_ns is not None:
262
+ # 同时检查反向和跨度溢出。
263
+ Interval(self.observation_start_ns, self.observation_end_ns)
264
+ # 证据状态是固定词汇,不能自由标verified。
265
+ if self.metadata_status not in ('verified', 'declared', 'unavailable'):
266
+ # 错误版本/状态应执行前失败。
267
+ raise ValueError('未知metadata_status')
268
+ # 旧profile非空,但不假装已经登记/可调用。
269
+ if self.legacy_profile is not None:
270
+ # profile登记和哈希是adapter的另一个责任。
271
+ require_text(self.legacy_profile, 'legacy_profile')
272
+
273
+
274
+ @dataclass(frozen=True)
275
+ class ReadRequest:
276
+ """说明本次会话要读取的信号别名、分析范围和批次上限。
277
+
278
+ session_id绑定当前会话,signal_names指定列顺序并允许空投影。
279
+ domain_start_ns与domain_end_ns是分析请求坐标,不表示来源实际观测范围。
280
+ batch_rows限制每批全部信号列的样本数之和,不能按宽表行数计算。
281
+ 请求范围不授权修改旧读取链;适配器保留分析开始前的必要更新及真实终点。
282
+ 同一时间组可以跨批,分批上限不代表该组已经完整。
283
+ """
284
+
285
+ session_id: str # 明确会话身份。
286
+ signal_names: tuple[str, ...] # 当前绑定输出别名,允许空投影。
287
+ domain_start_ns: int | None # 分析域起点;纯消息整文件请求可未声明。
288
+ domain_end_ns: int | None # 分析域终点;与起点同时未声明。
289
+ batch_rows: int # 所有series样本数总和上限。
290
+
291
+ def __post_init__(self) -> None:
292
+ """检查请求会话、唯一别名、时间范围和正整数批次上限。
293
+
294
+ 参数:
295
+ 无。读取session_id、signal_names、domain_start_ns、domain_end_ns和batch_rows。
296
+ 返回:
297
+ None。保持别名顺序,不去重或裁剪来源数据。
298
+ 异常:
299
+ TypeError或ValueError: 名称、容器、重复别名、时间范围或批次大小错误。
300
+ OverflowError: 时间范围超出整数纳秒约束。
301
+ """
302
+ # 会话不能从全局当前任务猜测。
303
+ require_identifier(self.session_id, 'request.session_id')
304
+ # 投影顺序明确,同一别名不能重复计样本。
305
+ if not isinstance(self.signal_names, tuple) or len(set(self.signal_names)) != len(self.signal_names):
306
+ # 不自动去重。
307
+ raise ValueError('signal_names需要唯一tuple')
308
+ # 每个名字必须是当前计划可以安全绑定的简单别名。
309
+ for name in self.signal_names:
310
+ # 来源字段的点号不是表达式别名。
311
+ require_identifier(name, 'request.signal_name')
312
+ # 半开范围和极值跨度按统一时间契约。
313
+ if self.domain_start_ns is None or self.domain_end_ns is None:
314
+ if self.domain_start_ns is not None or self.domain_end_ns is not None:
315
+ raise ValueError('未声明时间域请求必须双端同时为None')
316
+ else:
317
+ Interval(self.domain_start_ns, self.domain_end_ns)
318
+ # 不能把True当成单行预算,也不能允许零缓冲。
319
+ if type(self.batch_rows) is not int or self.batch_rows <= 0:
320
+ # 限额不靠默认值掩盖错误。
321
+ raise ValueError('batch_rows必须为正整数')
322
+
323
+
324
+ @dataclass(frozen=True)
325
+ class SignalSeries:
326
+ """保存一批中的单个信号列及每个样本的来源身份。
327
+
328
+ time_ns、values、valid、quality和sequence都是等长一维数组,形状为(N,)。
329
+ time_ns与sequence使用int64,时间单位为纳秒;时间非递减,序号非负且列内唯一。
330
+ valid明确值是否有效,quality保存原因;不能凭values中的占位判断有效性。
331
+ name、dtype和unit说明别名、逻辑类型及输出单位;枚举用整数码和labels表示。
332
+ source_ref与可选original_values均与样本等长,保留位置及原始诊断。
333
+
334
+ 构造时复制数组并设为只读,调用者修改原数组不影响本列。
335
+ 本类不折叠同时间冲突,也不执行valid_for保持或过期判断;这些属于后续时间驱动。
336
+ """
337
+
338
+ name: str # 简单表达式别名。
339
+ dtype: SignalDType # 逻辑类型,enum存储int64 code。
340
+ unit: str # 已显式归一化输出单位。
341
+ time_ns: np.ndarray # shape(N,), int64,当前会话分析坐标ns。
342
+ values: np.ndarray # shape(N,), 精确dtype。
343
+ valid: np.ndarray # shape(N,), bool,不能单用值占位判断。
344
+ quality: np.ndarray # shape(N,), uint16九位原因。
345
+ sequence: np.ndarray # shape(N,), int64,原来源稳定非负序号。
346
+ source_ref: tuple[SourceRef, ...] # 每行实际来源/字段/会话。
347
+ labels: tuple[str, ...] = () # enum固定域,其他类型为空。
348
+ original_values: tuple[int | float | bool | str | None, ...] | None = None # 原无效诊断可保留。
349
+
350
+ def __post_init__(self) -> None:
351
+ """检查单列布局、有效性和样本身份,再复制为只读数组。
352
+
353
+ 参数:
354
+ 无。读取信号描述、五个数组、source_ref、labels和original_values。
355
+ 返回:
356
+ None。时间、序号及数值数组成为本模型独立拥有的只读数据。
357
+ 异常:
358
+ TypeError或ValueError: 名称、数组形状或类型、质量、时间顺序、序号、
359
+ 来源引用或原始诊断不符合要求;不通过广播或隐式转换修正。
360
+ 副作用:
361
+ 分配数组副本,不修改调用者输入。无效原浮点可保留在诊断中。
362
+ """
363
+ # 输出别名和单位仍需明确,不推断字段语义。
364
+ require_identifier(self.name, 'series.name')
365
+ # 标签有效性与转换一致性由上游绑定提供。
366
+ require_text(self.unit, 'series.unit')
367
+ # 数值结构校验包括enum域、非有限正常值与禁止原因。
368
+ numeric = NumericArray(self.dtype, self.values, self.valid, self.quality, self.labels)
369
+ # 时间与稳定序号始终分列int64,禁止混宽表float。
370
+ for array in (self.time_ns, self.sequence):
371
+ # ndarray子类或隐式cast均不接受。
372
+ if type(array) is not np.ndarray or array.ndim != 1 or array.dtype != np.dtype('int64') or len(array) != len(numeric.values):
373
+ # 错误shape不能广播补齐。
374
+ raise TypeError('time/sequence需要同长1维int64列')
375
+ # 先比较不相减,避免极值坐标之差wrap。
376
+ if np.any(self.time_ns[1:] < self.time_ns[:-1]):
377
+ # 不排序输入来掩盖来源乱序。
378
+ raise ValueError('series时间回退')
379
+ # 来源序号非负且列内唯一;无需用时间替代它。
380
+ if np.any(self.sequence < 0) or len(np.unique(self.sequence)) != len(self.sequence):
381
+ # 保留相同时间不同序号,拒绝重复同一观测身份。
382
+ raise ValueError('series sequence负值或重复')
383
+ # 原定位每行等长,批次归属另外在SignalBatch检查。
384
+ if not isinstance(self.source_ref, tuple) or len(self.source_ref) != len(self.time_ns) or any(not isinstance(ref, SourceRef) for ref in self.source_ref):
385
+ # 少一个来源位置也不能假设复用第一条。
386
+ raise ValueError('source_ref需要同长typed tuple')
387
+ # 原诊断可省略,但存在时必须严格等长且不可变。
388
+ if self.original_values is not None:
389
+ # 不接受可变list或不同长度的原始事实。
390
+ if not isinstance(self.original_values, tuple) or len(self.original_values) != len(self.time_ns):
391
+ # 不能截断诊断或用值占位重建。
392
+ raise ValueError('original_values长度/容器错误')
393
+ # 无效原浮点可保留NaN,正常数值已由valid校验。
394
+ for value in self.original_values:
395
+ # 禁止可变对象进入跨规则共享输入。
396
+ require_scalar(value)
397
+ # NumericArray已复制校验列,不再重复制相同三个数组。
398
+ for name in ('values', 'valid', 'quality'):
399
+ # 安全只读列仍携带各自精确dtype。
400
+ object.__setattr__(self, name, getattr(numeric, name))
401
+ # 时间与序号独立复制,调用者更改原数组无影响。
402
+ for name in ('time_ns', 'sequence'):
403
+ # 新数组独立拥有存储,其复制后大小由nbytes反映。
404
+ copied = getattr(self, name).copy()
405
+ # 只读约定防止普通写操作污染其他规则。
406
+ copied.flags.writeable = False
407
+ # 只在构造期安装新数组。
408
+ object.__setattr__(self, name, copied)
409
+
410
+ @property
411
+ def nbytes(self) -> int:
412
+ """统计本列五个数组的存储字节数。
413
+
414
+ 参数:
415
+ 无。读取time_ns、values、valid、quality和sequence的nbytes。
416
+ 返回:
417
+ int。数组字节总和;不含枚举标签、来源引用、原诊断或其他Python容器。
418
+ 异常:
419
+ 无主动异常;数组结构已在构造时检查。
420
+ """
421
+ # 时间与序号各占8字节,有效性占1字节、质量占2字节;值按类型占1或8字节,标签另计。
422
+ return sum(array.nbytes for array in (self.time_ns, self.values, self.valid, self.quality, self.sequence))
423
+
424
+
425
+ @dataclass(frozen=True)
426
+ class SignalBatch:
427
+ """传送一个来源在当前会话中的异步信号列和读取进度。
428
+
429
+ source与session_id确定归属,series按输出别名保存列,允许零列。
430
+ watermark_ns是进度承诺:后续不会再出现小于或等于该坐标的更新。
431
+ 它可以落后于当前尚未完整的时间组,不能当作实际观测终点。
432
+ source_eof只表示整个配置来源耗尽;observed_end_ns保存观测终点事实,
433
+ 未知时保留None。单批结构检查不替代BatchValidator的跨批校验。
434
+ """
435
+
436
+ source: str # 已解码来源名称。
437
+ session_id: str # 本次读取的明确会话。
438
+ series: Mapping[str, SignalSeries] # 输出别名到真实列,允许零列。
439
+ watermark_ns: int | None # 已完整的时间组进度,否则None。
440
+ source_eof: bool # 整个来源终点,不能仅单文件EOF。
441
+ observed_end_ns: int | None # 观测未知保留None,不补周期。
442
+
443
+ def __post_init__(self) -> None:
444
+ """检查批次归属、列名称和观测终点,冻结列映射。
445
+
446
+ 参数:
447
+ 无。读取来源、会话、series、watermark_ns、source_eof和observed_end_ns。
448
+ 返回:
449
+ None。series成为新只读映射,列数组保持已有独立所有权。
450
+ 异常:
451
+ TypeError或ValueError: 映射或结束标记类型、别名、样本归属或观测边界错误。
452
+ OverflowError: 已知时间坐标超出整数纳秒范围。
453
+ """
454
+ # 来源与会话必须真实、明确。
455
+ require_identifier(self.source, 'batch.source')
456
+ # 会话边界不会从上个请求继承。
457
+ require_identifier(self.session_id, 'batch.session_id')
458
+ # 列须为已定义的信号模型,来源结束标记须为bool,不能用整数代替。
459
+ if not isinstance(self.series, Mapping) or type(self.source_eof) is not bool:
460
+ # 不将未知输入当作空批或已结束。
461
+ raise TypeError('batch需要Mapping series与bool EOF')
462
+ # 所有输出名字与列自己的绑定一致。
463
+ for name, column in self.series.items():
464
+ # 未绑定名字/错误列结构在执行前拒绝。
465
+ if not isinstance(column, SignalSeries) or name != column.name:
466
+ # 不能用键映射把其他信号冒充当前列。
467
+ raise ValueError('batch列类型/名称冲突')
468
+ # 每个样本来源引用都属于本batch会话和来源。
469
+ if any(ref.session_id != self.session_id or ref.source_name != self.source for ref in column.source_ref):
470
+ # 即使值相同也不能丢失真实归属。
471
+ raise ValueError('batch sample来源/会话冲突')
472
+ # unknown端点和watermark独立保留None。
473
+ for value in (self.watermark_ns, self.observed_end_ns):
474
+ # 不将None转成0或当前时间。
475
+ if value is not None:
476
+ # 所有进度和观测时间遵守精确ns协议。
477
+ require_int64_ns(value)
478
+ # 已知观测终点必须包含该批真实末点。
479
+ if self.observed_end_ns is not None and any(len(column.time_ns) and int(column.time_ns[-1]) > self.observed_end_ns for column in self.series.values()):
480
+ # 不能在自称结束之后继续提供真实样本。
481
+ raise ValueError('样本超出observed_end')
482
+ # 冻结外部别名字典,列内容已复制只读。
483
+ object.__setattr__(self, 'series', MappingProxyType(dict(self.series)))
484
+
485
+ @property
486
+ def sample_count(self) -> int:
487
+ """按所有列的样本数总和计算本批大小。
488
+
489
+ 参数:
490
+ 无。读取series中各列的长度。
491
+ 返回:
492
+ int。空批为0;同一时间的多个信号分别计数,用于核对batch_rows上限。
493
+ 异常:
494
+ 无主动异常;列结构已在构造时检查。
495
+ """
496
+ # 同时间多信号仍各算一个样本,同刻可跨传输批次。
497
+ return sum(len(column.time_ns) for column in self.series.values())
@@ -0,0 +1,170 @@
1
+ """把一批已解码标量归一化为可传送的独立信号列。
2
+
3
+ 输入是一个SignalDefinition、整数纳秒时间、原行序号及原值记录,另有
4
+ 当前来源引用和后端选择。输出SignalSeries包含数值、有效性掩码、质量原因、
5
+ 时间、序号和逐样本来源;原始值另存为诊断,不依靠无效值占位判断有效性。
6
+
7
+ reference逐样本调用独立标量归一化函数。numpy先按最多五种原生类型
8
+ 组织同质数组,再批量归一化,最后按索引放回原输入位置。
9
+ 分组循环负责布局和身份,不使用object数组进行数值计算。
10
+ pack_message_values只返回没有时间轴的NumericArray,供固定周期逐消息累计;
11
+ 它不构造虚假时间、原序号或来源列。两个入口共享布局及归一化选择,保留
12
+ reference与NumPy数值实现独立。输出复制为自身拥有的只读数组;
13
+ 本模块不读取文件或调用旧解码路径。
14
+ """
15
+
16
+ # NumPy承担真实定宽存储,数值归一化选择显式后端。
17
+ import numpy as np
18
+ # 当前转换定义不含全历史,逐批转换不会构造包含全量历史的SignalBindings。
19
+ from ..core.binding import SignalDefinition
20
+ # 当前完整会话/来源/字段身份来自调用者已校验输入。
21
+ from ..core.models import SourceRef
22
+ # 参考归一化独立于NumPy实现。
23
+ from ..core.numeric import normalize_reference
24
+ # 静态dtype和结构布局可共享,参考仍不调用数组数值核。
25
+ from ..core.numeric_numpy import DTYPES, NumericArray
26
+ # NumPy原生类型组分别经过批量归一化。
27
+ from ..core.normalize_numpy import normalize_numpy
28
+ # 基础质量与枚举域从公共契约读取。
29
+ from ..core.types import QualityFlag, SignalDType
30
+ # 非原生/可变值在适配边界拒绝。
31
+ from ..core.validation import require_scalar
32
+ # 输出是传输列,不是已折叠的全历史保持序列。
33
+ from .models import SignalSeries
34
+
35
+
36
+ def _pack_numeric_columns(definition: SignalDefinition, originals: tuple, backend: str) -> tuple:
37
+ """把原值批次归一化为数值、有效性、质量及枚举标签,不建立时间轴。
38
+
39
+ 参数:
40
+ definition (SignalDefinition): 当前别名的输出类型、单位及显式转换。
41
+ originals (tuple): 原生标量或None的有限批次,位置保持输入顺序。
42
+ backend (str): 'reference'使用标量实现,'numpy'使用数组实现。
43
+ 返回:
44
+ tuple: values、valid、quality三个可写独立数组及labels枚举域;
45
+ 数组形状为(N,),后续输出模型负责复制冻结,无效占位不能当正常值。
46
+ 异常:
47
+ TypeError或ValueError: 原值不合法;调用者已校验声明、tuple与后端。
48
+ OverflowError或MemoryError: 数值转换或批次数组分配失败。
49
+ 副作用:
50
+ 分配批次数组,不修改输入原值;不读取时间、来源或原序号。
51
+ """
52
+ # 固定枚举域按声明顺序,空批也保留完整标签。
53
+ labels = tuple(dict.fromkeys(label for _, label in definition.choices)) if definition.dtype is SignalDType.ENUM else ()
54
+ # 所有列按本批N分配,非法占位只有掩码确认后才可使用。
55
+ values, valid, quality = np.zeros(len(originals), dtype=DTYPES[definition.dtype]), np.zeros(len(originals), dtype=bool), np.zeros(len(originals), dtype=np.uint16)
56
+ # 非原生对象禁止进入输入分组,防止隐式object计算。
57
+ for value in originals:
58
+ # None/非有限允许作无效原诊断。
59
+ require_scalar(value)
60
+ # 参考逐样本用独立精确标量契约,装箱仍保持目标dtype。
61
+ if backend == 'reference':
62
+ # N次基线求值不被称为数组实现。
63
+ for index, original in enumerate(originals):
64
+ # 独立参考不调用被测normalize_numpy。
65
+ normalized = normalize_reference(definition, original)
66
+ # 无效值仅保留原因,不参与正常数值存储。
67
+ if normalized.valid:
68
+ # enum以固定域code存储,不生成object列。
69
+ values[index] = labels.index(normalized.value) if labels else normalized.value
70
+ # 基础valid与quality各自完整保存。
71
+ valid[index], quality[index] = normalized.valid, int(normalized.quality)
72
+ else:
73
+ # 原类型分组是布局操作,不是逐样本数值归一化。
74
+ groups = {}
75
+ # 每行登记原物理类型/输出位置和已有错误占位。
76
+ for index, original in enumerate(originals):
77
+ # 缺失必须带MISSING,不把0占位变成正常输入。
78
+ if original is None:
79
+ # 缺失打包成带原因的int64占位,内核不使用它。
80
+ key, packed, flag = 'i', 0, QualityFlag.MISSING
81
+ # 原整数宽度保持,不能先转float。
82
+ elif type(original) is int:
83
+ # 超64位协议的原值作为OVERFLOW诊断保留。
84
+ flag = QualityFlag.NONE if -(2 ** 63) <= original <= 2 ** 64 - 1 else QualityFlag.OVERFLOW
85
+ # 合法unsigned高端与signed分组,非法值仅存0占位。
86
+ key, packed = ('i' if original <= 2 ** 63 - 1 else 'u'), original if flag == QualityFlag.NONE else 0
87
+ else:
88
+ # bool/str/float各自物理域,不使用隐式promotion。
89
+ key, packed, flag = {float: 'f', bool: 'b', str: 'U'}[type(original)], original, QualityFlag.NONE
90
+ # 每组保存原索引,用于将归一化结果放回原输入位置。
91
+ groups.setdefault(key, []).append((index, packed, int(flag)))
92
+ # 循环次数至多五,整个数值组实际批量归一化。
93
+ for key, items in groups.items():
94
+ # 物理类型由原值契约确定而非目标类型倒推。
95
+ raw_dtype = {'i': np.int64, 'u': np.uint64, 'f': np.float64, 'b': bool, 'U': str}[key]
96
+ # 每组原值和质量原因都组成长度为该组样本数的一维数组,类型明确。
97
+ raw, reasons = np.array([value for _, value, _ in items], dtype=raw_dtype), np.array([flag for _, _, flag in items], dtype=np.uint16)
98
+ # 数值转换用已验独立NumPy核,没有逐样本reference回调。
99
+ normalized = normalize_numpy(definition, raw, reasons)
100
+ # 放回索引只恢复原批次布局,不重排原文件或时间。
101
+ positions = np.array([index for index, _, _ in items], dtype=np.int64)
102
+ # 数值、有效性和质量三列放回相同位置;无效占位仍携带掩码与原因。
103
+ values[positions], valid[positions], quality[positions] = normalized.values, normalized.valid, normalized.quality
104
+ # 两种输出只共享无时间的数值列,避免逐消息路径装箱无用身份列。
105
+ return values, valid, quality, labels
106
+
107
+
108
+ def pack_message_values(definition: SignalDefinition, originals: tuple, backend: str) -> NumericArray:
109
+ """归一化逐消息原值,供无需时间轴的固定周期累计复用现有数值核。
110
+
111
+ 参数:
112
+ definition (SignalDefinition): 别名的显式dtype、单位与转换规则。
113
+ originals (tuple): 原生不可变标量或None,顺序为实际求值顺序。
114
+ backend (str): reference逐样本独立归一化,numpy按原生类型批量归一化。
115
+ 返回:
116
+ NumericArray: 形状(N,)的只读values、valid、quality以及固定枚举标签;
117
+ 空批次合法,不包含时间、来源、序号或虚假SignalSeries。
118
+ 异常:
119
+ TypeError或ValueError: 声明、后端、tuple或原值不合法。
120
+ OverflowError或MemoryError: 转换或数组分配失败,原输入不变。
121
+ 副作用:
122
+ 仅分配并冻结输出数组,不读写文件,不建立跨批缓存。
123
+ """
124
+ # 无时间入口也维持明确声明与后端,不接受隐式fallback或任意迭代器。
125
+ if not isinstance(definition, SignalDefinition) or not isinstance(originals, tuple) or backend not in ('reference', 'numpy'):
126
+ raise TypeError('pack_message_values需要typed声明/tuple原值及明确后端')
127
+ # 数值列与原有pack_decoded走同一布局,未借助SignalSeries或假时间归一化。
128
+ values, valid, quality, labels = _pack_numeric_columns(definition, originals, backend)
129
+ return NumericArray(definition.dtype, values, valid, quality, labels)
130
+
131
+
132
+ def pack_decoded(definition: SignalDefinition, records: tuple[tuple[int, int, int | float | bool | str | None], ...], source_ref: SourceRef | tuple[SourceRef, ...], backend: str, *, retain_original=True, clock_only=False) -> SignalSeries:
133
+ """归一化当前有限批次,保留同时间的不同观测及原始诊断。
134
+
135
+ 参数:
136
+ definition (SignalDefinition): 当前别名的输出类型、单位及显式转换。
137
+ records (tuple): 每项为(time_ns, sequence, 原值),时间为纳秒。
138
+ source_ref (SourceRef | tuple[SourceRef, ...]): 共用引用或等长逐样本引用。
139
+ backend (str): reference为独立标量实现,numpy为原生类型分组数组实现。
140
+ retain_original (bool): 默认保留原值;新按需路径关闭时不把原值传入结果列。
141
+ clock_only (bool): 只传更新时间,跳过取值、归一化和原值保留;无效占位不参与计算。
142
+ 返回:
143
+ SignalSeries: (N,)数值、有效性、质量、时间、序号及逐样本来源;
144
+ 原值仅在请求时保留,空批保留声明的类型与枚举域。
145
+ 异常:
146
+ TypeError或ValueError: 输入结构、后端、原值、列布局或身份不合法。
147
+ OverflowError或MemoryError: 转换、时间装箱或批次数组分配失败。
148
+ 副作用:
149
+ 分配独立只读批次,不修改输入;有效期保持由后续时间驱动层执行。
150
+ """
151
+ # 原接口先检查声明、行、来源与后端,继续保留原有拒绝边界。
152
+ if not isinstance(definition, SignalDefinition) or not isinstance(records, tuple) or not (isinstance(source_ref, SourceRef) or isinstance(source_ref, tuple) and len(source_ref) == len(records) and all(isinstance(ref, SourceRef) for ref in source_ref)) or backend not in ('reference', 'numpy'):
153
+ raise TypeError('pack_decoded需要typed声明/原行/ref及明确后端')
154
+ # 原始诊断仍由SignalSeries保存,归一化列不会改变原顺序或原值。
155
+ if type(retain_original) is not bool or type(clock_only) is not bool:
156
+ raise TypeError('原值保留与纯时钟选项需要bool')
157
+ originals=None
158
+ if clock_only:
159
+ # 列协议的无效占位不参与计算;不读取、转换或核验用户的无关数值。
160
+ values=np.zeros(len(records),dtype=DTYPES[definition.dtype])
161
+ valid=np.zeros(len(records),dtype=bool)
162
+ quality=np.full(len(records),int(QualityFlag.MISSING),dtype=np.uint16)
163
+ labels=tuple(dict.fromkeys(label for _,label in definition.choices)) if definition.dtype is SignalDType.ENUM else ()
164
+ else:
165
+ originals = tuple(item[2] for item in records)
166
+ values, valid, quality, labels = _pack_numeric_columns(definition, originals, backend)
167
+ # 精确时间与原序号分别int64,公共模型随后验证非递减/唯一。
168
+ times, sequences = np.array([item[0] for item in records], dtype=np.int64), np.array([item[1] for item in records], dtype=np.int64)
169
+ # 每行保持实际SourceRef,不从别名或semantic_id猜定位。
170
+ return SignalSeries(definition.name, definition.dtype, definition.unit, times, values, valid, quality, sequences, (source_ref,) * len(records) if isinstance(source_ref, SourceRef) else source_ref, labels, originals if retain_original else None)