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,205 @@
1
+ """用真实数组处理有限块时间极值、规范化时间均值及BOOL TRUE时长。
2
+
3
+ push把有限CalculationSeries装成(N,)typed列,区间使用(N-1,)int64纳秒差与bool掩码。
4
+ min/max保留原dtype;duration用TRUE掩码精确累计纳秒;mean先独立检查整数
5
+ 浮点精度,第二遍以全窗有效时长规范化权重,再推进本数组原序误差归约。
6
+ 最终单位仅finish转换一次,不读旧来源、不保存全轴,也不调用参考数值核。
7
+ 装箱和未知Interval恢复循环只处理协议;数值裁剪、掩码、权重和极值用数组。
8
+ 状态驱动累计少量标量事实;数组及误差状态预算由外层owner提前预约。
9
+ 指定step_ns只接收所选驱动真实点;时长/均值按实际交集折算,另有一份有限权重
10
+ 求和状态。接线者须预约这份状态和当前权重数组,不能沿用actual的费用冒充已计费。
11
+ """
12
+
13
+ # 本后端只复用数组原序核与静态模型,数值不委托参考实现。
14
+ import numpy as np
15
+ from .integral_sum_numpy import NumpyIntegralSum
16
+ from .models import Interval
17
+ from .numeric_numpy import NumericArray, DTYPES, to_float_numpy
18
+ from .types import QualityFlag as Q
19
+ from .time_reduction import (TimeCalculationFacts, TimeReductionResult,
20
+ require_time_config, require_time_series, require_time_options)
21
+
22
+ from .time_reduction import MeanTimeBlock
23
+ from .mean_weights_numpy import normalized_mean_terms
24
+
25
+
26
+ class NumpyTimeReduction:
27
+ """保留单候选、精确时长计数及有限误差数组,不保留历史输入列。
28
+
29
+ mean分母为None时只处理第一遍事实,不能finish;第二遍须逐块消费同一历史。
30
+ 原序浮点累计属于state_driver,每项误差推进与块掩码均是实际数组运算。
31
+ """
32
+
33
+ def __init__(self, spec, input_unit, dtype, *, selected_duration_ns=None, partial_limit=4096,
34
+ step_ns=None, selected_weight_seconds=None):
35
+ """检查无条件时间配置并建立本数组后端状态。
36
+
37
+ 参数: spec/单位/dtype为原配置;selected_duration_ns为均值全窗有效时长;
38
+ partial_limit为误差容量;step_ns可选周期,周期均值第二遍改用
39
+ selected_weight_seconds。返回: None。异常: 配置、数组分配错误传播。
40
+ """
41
+ self._unit, self._factor = require_time_config(spec, input_unit, dtype, selected_duration_ns, partial_limit,
42
+ step_ns=step_ns, selected_weight_seconds=selected_weight_seconds)
43
+ self._spec, self._input_unit, self._dtype = spec, input_unit, dtype
44
+ self._step_ns = step_ns
45
+ self._denominator = selected_duration_ns if step_ns is None else selected_weight_seconds
46
+ # 固定状态不随输入块数增长,输入列生命周期只限当前push。
47
+ self._identity = self._candidate = None
48
+ self._value_duration = self._selected_duration = self._terms = 0
49
+ self._numeric_quality = Q.NONE
50
+ self._sum = NumpyIntegralSum(partial_limit) if spec.operation == 'time_weighted_mean' and self._denominator is not None else None
51
+ self._weight_sum = NumpyIntegralSum(partial_limit) if step_ns is not None and spec.operation in ('duration', 'time_weighted_mean') else None
52
+
53
+ @property
54
+ def selected_weight_seconds(self):
55
+ """读取必要的周期累计权重。参数: 无。返回: float或不适用None。异常: 数值故障。"""
56
+ if self._weight_sum is None:
57
+ return None
58
+ result = self._weight_sum.finish('s')
59
+ if result.calculation_failed:
60
+ raise OverflowError('周期权重累计失败')
61
+ return 0.0 if result.value is None else result.value
62
+
63
+ @property
64
+ def selected_duration_ns(self):
65
+ """读取累计选择时长。参数: 无。返回: 原生int纳秒。异常: 无。"""
66
+ return self._selected_duration
67
+
68
+ @property
69
+ def value_valid_duration_ns(self):
70
+ """读取累计有效时长。参数: 无。返回: 原生int纳秒。异常: 无。"""
71
+ return self._value_duration
72
+
73
+ def push(self, series, *, valid_until_ns=None, retain_unknown_ranges=True, retain_mean_terms=False):
74
+ """数组计算有限块事实,并推进对应原单位数值状态。
75
+
76
+ 参数: series为无条件、同dtype和原单位CalculationSeries;末点不贡献区间或样本。
77
+ valid_until_ns按实际时间截断;retain_unknown_ranges=False省去未知位置构造。
78
+ retain_mean_terms仅均值首遍返回MeanTimeBlock,其他调用返回事实。
79
+ 返回: TimeCalculationFacts;数值权重故障与输入覆盖有效性分别记录。
80
+ 异常: 结构、身份、容量或分配错误传播;外层异常后只能清理owner。
81
+ 内存: 新数组都是当前(N,)或(N-1,)有限列,不修改输入,也不存入跨块状态。
82
+ """
83
+ actual = require_time_series(series, self._spec, self._input_unit, self._dtype)
84
+ require_time_options(series, self._step_ns, valid_until_ns, retain_unknown_ranges)
85
+ if type(retain_mean_terms) is not bool or retain_mean_terms and (self._spec.operation != 'time_weighted_mean' or self._denominator is not None):
86
+ raise ValueError('仅均值首遍可请求必要回读项')
87
+ if self._identity is not None and self._identity != series.binding_identity:
88
+ raise ValueError('时间归约不能跨绑定身份累计')
89
+ self._identity = series.binding_identity
90
+ # 装箱仅恢复typed列;无效位置0需要显式valid和quality,不能作为正常值。
91
+ column = NumericArray(self._dtype,
92
+ np.array([value.value if value.valid else 0 for value in series.values], dtype=DTYPES[self._dtype]),
93
+ np.array([value.valid for value in series.values], dtype=bool),
94
+ np.array([int(value.quality) for value in series.values], dtype=np.uint16))
95
+ values = to_float_numpy(column) if self._spec.operation == 'time_weighted_mean' else column
96
+ times = np.array(series.times_ns, dtype=np.int64)
97
+ start, end = (actual.start_ns, actual.end_ns) if actual is not None else (0, 0)
98
+ # 先裁剪整数端点,仅在正交集做差,避免域外反序减法wrap。
99
+ left = np.maximum(times[:-1], np.int64(start))
100
+ right = np.minimum(times[1:], np.int64(end))
101
+ observed = right > left
102
+ deadlines = np.array([2**63-1 if item is None else item for item in valid_until_ns], dtype=np.int64) if valid_until_ns is not None else None
103
+ value_end = right.copy() if deadlines is None else np.minimum(right, deadlines[:-1])
104
+ value_end = np.maximum(left, np.where(values.valid[:-1], value_end, left))
105
+ durations = np.zeros(len(left), dtype=np.int64)
106
+ usable = observed & (value_end > left)
107
+ np.subtract(value_end, left, out=durations, where=usable)
108
+ selected = usable & values.values[:-1] if self._spec.operation == 'duration' else usable
109
+ # 非负时长总和不超过已校验观测跨度,int64不会wrap;全窗由Python整数累加。
110
+ value_duration = int(np.sum(durations[usable], dtype=np.int64))
111
+ selected_duration = int(np.sum(durations[selected], dtype=np.int64))
112
+ seconds = None
113
+ if self._weight_sum is not None:
114
+ # 只计算当前有限块;求和后列只读,后续归一化另生成数值结果。
115
+ seconds = durations[selected].astype(np.float64)
116
+ seconds /= np.diff(times)[selected]
117
+ seconds *= self._step_ns / 1_000_000_000
118
+ weight_valid = np.ones(len(seconds), dtype=bool)
119
+ seconds.setflags(write=False)
120
+ weight_valid.setflags(write=False)
121
+ self._weight_sum.push_values(seconds, weight_valid)
122
+ terms = int(np.count_nonzero(usable))
123
+ samples = (times >= start) & (times < end) & np.array(series.actual_value_updates, dtype=bool) & values.valid
124
+ if deadlines is not None:
125
+ samples &= times < deadlines
126
+ if self._spec.operation == 'duration':
127
+ samples &= values.values
128
+ # 依赖诊断覆盖正区间与实际更新点;EOF右端不凭点增加时长或样本。
129
+ relevant = np.concatenate((observed, np.array([False]))) | ((times >= start) & (times < end) & np.array(series.actual_value_updates, dtype=bool))
130
+ diagnostics = np.array([int(item) for item in series.diagnostics], dtype=np.uint16) | values.quality
131
+ quality = Q(int(np.bitwise_or.reduce(diagnostics[relevant], initial=np.uint16(0))))
132
+ if np.any(observed & values.valid[:-1] & (value_end < right)):
133
+ quality |= Q.STALE
134
+ unknown = (tuple(Interval(int(value_end[index]), int(right[index])) for index in np.flatnonzero(observed & (value_end < right)))
135
+ if retain_unknown_ranges else ())
136
+ if self._spec.operation in ('min_time', 'max_time') and terms:
137
+ # 每块极值由原dtype数组归约,跨块仅保存一个精确原生候选。
138
+ candidate = (np.min if self._spec.operation == 'min_time' else np.max)(values.values[:-1][usable])
139
+ if self._candidate is not None:
140
+ previous = DTYPES[self._dtype].type(self._candidate)
141
+ candidate = (np.minimum if self._spec.operation == 'min_time' else np.maximum)(previous, candidate)
142
+ self._candidate = candidate.item()
143
+ elif self._spec.operation == 'time_weighted_mean' and self._denominator is not None:
144
+ chosen = values.values[:-1][usable]
145
+ measures = durations[usable].astype(np.float64) if self._step_ns is None else seconds
146
+ weighted, weight_quality = normalized_mean_terms(chosen, measures, self._denominator)
147
+ self._numeric_quality |= weight_quality
148
+ if self._numeric_quality == Q.NONE:
149
+ keep = np.ones(len(weighted), dtype=bool)
150
+ keep.setflags(write=False)
151
+ self._sum.push_values(weighted, keep)
152
+ self._value_duration += value_duration
153
+ self._selected_duration += selected_duration
154
+ self._terms += terms
155
+ facts = TimeCalculationFacts(self._spec, actual, value_duration, selected_duration,
156
+ int(np.count_nonzero(samples)), unknown, quality, self._input_unit,
157
+ self._dtype, series.binding_identity, series.source_refs, retain_unknown_ranges)
158
+ if retain_mean_terms:
159
+ selected_values = values.values[:-1][usable]
160
+ selected_weights = durations[usable].copy() if self._step_ns is None else seconds
161
+ selected_values.setflags(write=False)
162
+ selected_weights.setflags(write=False)
163
+ return MeanTimeBlock(facts, selected_values, selected_weights)
164
+ return facts
165
+
166
+ def finish(self):
167
+ """正确舍入并做一次最终转换,生成本后端数值快照。
168
+
169
+ 参数: 无。返回: TimeReductionResult,不执行覆盖状态分类。
170
+ 异常: RuntimeError为mean第一遍;ValueError为有效时长与全窗分母不符;
171
+ 分配或取消传播,数值溢出与非零下溢写成计算失败。
172
+ """
173
+ if self._spec.operation == 'time_weighted_mean':
174
+ if self._denominator is None:
175
+ raise RuntimeError('时间均值第一遍只收事实,不能生成数值')
176
+ measured = self._selected_duration if self._step_ns is None else self.selected_weight_seconds
177
+ if measured != self._denominator:
178
+ raise ValueError('时间均值第二遍有效时长与整窗分母不同')
179
+ if self._numeric_quality != Q.NONE:
180
+ return TimeReductionResult(None, self._unit, True, self._numeric_quality, self._terms)
181
+ # 数组原序核直接执行一次输出转换;映射冻结结果不再次做数值处理。
182
+ number = self._sum.finish(self._unit, self._factor)
183
+ return TimeReductionResult(number.value, number.unit, number.calculation_failed, number.quality, self._terms)
184
+ if self._terms == 0:
185
+ return TimeReductionResult(None, self._unit, False, Q.NONE, 0)
186
+ # BOOL时长先保持精确整数纳秒,再最终换成秒;极值保持原native dtype。
187
+ value = ((float(np.divide(np.float64(self._selected_duration), np.float64(1_000_000_000)))
188
+ if self._step_ns is None else self.selected_weight_seconds)
189
+ if self._spec.operation == 'duration' else self._candidate)
190
+ quality = Q.NONE
191
+ if self._factor != 1 and type(value) is int:
192
+ converted = to_float_numpy(NumericArray(self._dtype,
193
+ np.array([value], dtype=DTYPES[self._dtype]), np.array([True]), np.array([0], dtype=np.uint16)))
194
+ if not converted.valid[0]:
195
+ quality |= Q(int(converted.quality[0]))
196
+ else:
197
+ value = converted.values[0].item()
198
+ if quality == Q.NONE and self._factor != 1:
199
+ original = value
200
+ with np.errstate(over='ignore', under='ignore', invalid='ignore'):
201
+ value = np.multiply(np.float64(value), np.float64(self._factor)).item()
202
+ if not np.isfinite(value) or value == 0 and original != 0:
203
+ quality |= Q.NONFINITE if not np.isfinite(value) else Q.PRECISION_LOSS
204
+ return TimeReductionResult(None if quality != Q.NONE else value, self._unit,
205
+ quality != Q.NONE, quality, self._terms)
@@ -0,0 +1,203 @@
1
+ """独立用标量处理有限块时间极值、规范化时间均值和BOOL TRUE时长。
2
+
3
+ push接收原单位CalculationSeries,返回该块的覆盖、更新、未知及来源事实。
4
+ min/max保留原整数;duration精确累计纳秒;mean第一遍只查有效性,第二遍
5
+ 使用已知全窗有效时长计算每项x*(dt/D),并由本参考后端原序误差核归约。
6
+ 最终单位只在finish转换一次,不先求块均值或块面积、不保存全窗列。
7
+ 指定step_ns时只接收所选驱动真实记录对,按实际交集折算周期;时长/均值额外
8
+ 使用一份有界权重求和状态,不把浮点权重冒充实际纳秒覆盖。外层须为其预付费用。
9
+ 本纯核只依赖标准库与参考算法,不执行I/O、资源预约或关闭;有限临时列表、
10
+ 误差状态及返回事实必须由外层owner预先计费,推进异常后外层须放弃该状态。
11
+ """
12
+
13
+ # 参考核不导入NumPy;复用同后端已验证的原序误差状态,不复用数组算法。
14
+ from math import isfinite
15
+ from .integral_sum_reference import ReferenceIntegralSum
16
+ from .models import Interval
17
+ from .numeric import ScalarValue, to_float_reference
18
+ from .types import QualityFlag as Q
19
+ from .time_reduction import (TimeCalculationFacts, TimeReductionResult,
20
+ require_time_config, require_time_series, require_time_options)
21
+ from .record_intervals import clipped_record_seconds
22
+
23
+ from .time_reduction import MeanTimeBlock
24
+ from .mean_weights_reference import normalized_mean_terms
25
+
26
+
27
+ class ReferenceTimeReduction:
28
+ """保留有限数值状态,第一遍与第二遍的mean实例不能混用。
29
+
30
+ 极值只保留一个原生候选,actual时长只保留整数;周期权重与均值误差项
31
+ 分别受partial_limit限制,原调用方的费用估算不能直接沿用到新周期模式。
32
+ finish为不破坏状态的快照,未指定均值全窗分母时禁止生成候选数值。
33
+ """
34
+
35
+ def __init__(self, spec, input_unit, dtype, *, selected_duration_ns=None, partial_limit=4096,
36
+ step_ns=None, selected_weight_seconds=None):
37
+ """检查明确配置,再建立本后端有限状态。
38
+
39
+ 参数: spec/单位/dtype为原输入;selected_duration_ns为均值第二遍整窗有效时长;
40
+ partial_limit为误差容量;step_ns可选周期;周期均值第二遍使用
41
+ selected_weight_seconds。返回: None。异常: 配置或分配错误原样传播。
42
+ """
43
+ self._unit, self._factor = require_time_config(spec, input_unit, dtype, selected_duration_ns, partial_limit,
44
+ step_ns=step_ns, selected_weight_seconds=selected_weight_seconds)
45
+ self._spec, self._input_unit, self._dtype = spec, input_unit, dtype
46
+ self._step_ns = step_ns
47
+ self._denominator = selected_duration_ns if step_ns is None else selected_weight_seconds
48
+ # 常量状态不随着输入块数增长;输入身份在第一块确认后禁止变化。
49
+ self._identity = self._candidate = None
50
+ self._value_duration = self._selected_duration = self._terms = 0
51
+ self._numeric_quality = Q.NONE
52
+ self._sum = ReferenceIntegralSum(partial_limit) if spec.operation == 'time_weighted_mean' and self._denominator is not None else None
53
+ # 只在周期时长/均值确实需要时保存有限权重误差项;不存逐条时间或输入。
54
+ self._weight_sum = ReferenceIntegralSum(partial_limit) if step_ns is not None and spec.operation in ('duration', 'time_weighted_mean') else None
55
+
56
+ @property
57
+ def selected_weight_seconds(self):
58
+ """读取周期模式的必要累计权重。参数: 无。返回: float或不适用None。异常: 数值故障。"""
59
+ if self._weight_sum is None:
60
+ return None
61
+ result = self._weight_sum.finish('s')
62
+ if result.calculation_failed:
63
+ raise OverflowError('周期权重累计失败')
64
+ return 0.0 if result.value is None else result.value
65
+
66
+ @property
67
+ def selected_duration_ns(self):
68
+ """读取累计已选时长。参数: 无。返回: 原生int纳秒。异常: 无。"""
69
+ return self._selected_duration
70
+
71
+ @property
72
+ def value_valid_duration_ns(self):
73
+ """读取累计有效时长。参数: 无。返回: 原生int纳秒。异常: 无。"""
74
+ return self._value_duration
75
+
76
+ def push(self, series, *, valid_until_ns=None, retain_unknown_ranges=True, retain_mean_terms=False):
77
+ """独立消费有限块并返回事实,不跨块保存输入列。
78
+
79
+ 参数: series为同dtype/原单位的无条件CalculationSeries,末点不参与正区间或样本。
80
+ valid_until_ns按实际时间截断;retain_unknown_ranges=False省去未知位置构造。
81
+ retain_mean_terms仅均值首遍返回MeanTimeBlock,其他调用返回事实。
82
+ 返回: TimeCalculationFacts;mean权重故障另记数值失败,不改变有效覆盖。
83
+ step_ns模式只接受驱动真实点,不把合成TTL/窗口点当新周期。
84
+ 异常: 结构、身份、容量或分配错误原样传播;外层不得继续使用异常前缀。
85
+ """
86
+ actual = require_time_series(series, self._spec, self._input_unit, self._dtype)
87
+ require_time_options(series, self._step_ns, valid_until_ns, retain_unknown_ranges)
88
+ if type(retain_mean_terms) is not bool or retain_mean_terms and (self._spec.operation != 'time_weighted_mean' or self._denominator is not None):
89
+ raise ValueError('仅均值首遍可请求必要回读项')
90
+ if self._identity is not None and self._identity != series.binding_identity:
91
+ raise ValueError('时间归约不能跨绑定身份累计')
92
+ self._identity = series.binding_identity
93
+ # 仅mean需要浮点精度门槛,极值不把大整数无声转成浮点数。
94
+ values = tuple(to_float_reference(value) for value in series.values) if self._spec.operation == 'time_weighted_mean' else series.values
95
+ start = actual.start_ns if actual is not None else 0
96
+ end = actual.end_ns if actual is not None else 0
97
+ value_duration = selected_duration = samples = terms = 0
98
+ unknown, weighted = [], []
99
+ period_weights = [] if self._weight_sum is not None else None
100
+ mean_values = [] if self._spec.operation == 'time_weighted_mean' and (self._denominator is not None or retain_mean_terms) else None
101
+ mean_weights = [] if mean_values is not None else None
102
+ quality, weight_quality = Q.NONE, Q.NONE
103
+ # 逐正区间独立计算整数裁剪差与有效性,完全不调用NumPy。
104
+ for index in range(len(series.times_ns) - 1):
105
+ left, right = max(series.times_ns[index], start), min(series.times_ns[index + 1], end)
106
+ if left >= right:
107
+ continue
108
+ value = values[index]
109
+ quality |= series.diagnostics[index] | value.quality
110
+ deadline = None if valid_until_ns is None else valid_until_ns[index]
111
+ value_end = max(left, min(right, deadline)) if deadline is not None else right
112
+ if not value.valid:
113
+ value_end = left
114
+ if value_end < right:
115
+ if retain_unknown_ranges:
116
+ unknown.append(Interval(value_end, right))
117
+ if value.valid:
118
+ quality |= Q.STALE
119
+ if value_end <= left:
120
+ continue
121
+ dt = value_end - left
122
+ value_duration += dt
123
+ terms += 1
124
+ # FALSE是有效主BOOL,仍提供零时长证据;只有TRUE增加选择时长。
125
+ selected_duration += dt if self._spec.operation != 'duration' or value.value else 0
126
+ measure = dt
127
+ if period_weights is not None and (self._spec.operation != 'duration' or value.value):
128
+ measure = clipped_record_seconds(series.times_ns[index], series.times_ns[index + 1],
129
+ Interval(left, value_end), step_ns=self._step_ns)
130
+ period_weights.append(measure)
131
+ if self._spec.operation in ('min_time', 'max_time'):
132
+ if self._candidate is None:
133
+ self._candidate = value.value
134
+ elif self._spec.operation == 'min_time':
135
+ self._candidate = min(self._candidate, value.value)
136
+ else:
137
+ self._candidate = max(self._candidate, value.value)
138
+ elif mean_values is not None:
139
+ mean_values.append(value.value)
140
+ mean_weights.append(measure)
141
+ # 真实更新的点诊断与计数独立于保持区间,不把右端重复计算。
142
+ for index, time in enumerate(series.times_ns):
143
+ if not start <= time < end or not series.actual_value_updates[index]:
144
+ continue
145
+ value = values[index]
146
+ quality |= series.diagnostics[index] | value.quality
147
+ deadline = None if valid_until_ns is None else valid_until_ns[index]
148
+ if value.valid and (deadline is None or time < deadline) and (self._spec.operation != 'duration' or value.value):
149
+ samples += 1
150
+ # 原序状态只接受正常权重项;任一权重失败使整次均值失败,覆盖仍完整保留。
151
+ if self._denominator is not None:
152
+ weighted, weight_quality = normalized_mean_terms(mean_values, mean_weights, self._denominator)
153
+ self._numeric_quality |= weight_quality
154
+ if period_weights is not None:
155
+ self._weight_sum.push_values(tuple(period_weights), (True,) * len(period_weights))
156
+ if self._sum is not None and self._numeric_quality == Q.NONE:
157
+ self._sum.push_values(tuple(weighted), (True,) * len(weighted))
158
+ self._value_duration += value_duration
159
+ self._selected_duration += selected_duration
160
+ self._terms += terms
161
+ facts = TimeCalculationFacts(self._spec, actual, value_duration, selected_duration, samples,
162
+ tuple(unknown), quality, self._input_unit, self._dtype,
163
+ series.binding_identity, series.source_refs, retain_unknown_ranges)
164
+ return MeanTimeBlock(facts, tuple(mean_values), tuple(mean_weights)) if retain_mean_terms else facts
165
+
166
+ def finish(self):
167
+ """仅完整调用者确认后生成数值快照,最终转换一次。
168
+
169
+ 参数: 无。返回: TimeReductionResult,覆盖分类由外层负责。
170
+ 异常: RuntimeError为mean第一遍;ValueError为第二遍有效时长与分母不符;
171
+ 配置/分配错误传播,数值范围错误按calculation_failed返回。
172
+ """
173
+ if self._spec.operation == 'time_weighted_mean':
174
+ if self._denominator is None:
175
+ raise RuntimeError('时间均值第一遍只收事实,不能生成数值')
176
+ measured = self._selected_duration if self._step_ns is None else self.selected_weight_seconds
177
+ if measured != self._denominator:
178
+ raise ValueError('时间均值第二遍有效时长与整窗分母不同')
179
+ if self._numeric_quality != Q.NONE:
180
+ return TimeReductionResult(None, self._unit, True, self._numeric_quality, self._terms)
181
+ # 本参考原序核finish直接执行一次转换;输出映射不再乘因子。
182
+ number = self._sum.finish(self._unit, self._factor)
183
+ return TimeReductionResult(number.value, number.unit, number.calculation_failed, number.quality, self._terms)
184
+ # 没有有效正区间不能借sum空输入产生正常零。
185
+ if self._terms == 0:
186
+ return TimeReductionResult(None, self._unit, False, Q.NONE, 0)
187
+ value = ((self._selected_duration / 1_000_000_000 if self._step_ns is None else self.selected_weight_seconds)
188
+ if self._spec.operation == 'duration' else self._candidate)
189
+ quality = Q.NONE
190
+ # 非1倍率的整数极值先校验精确float表示,再转换;倍率1保持原生整数。
191
+ if self._factor != 1 and type(value) is int:
192
+ converted = to_float_reference(ScalarValue(value, self._dtype))
193
+ if not converted.valid:
194
+ quality |= converted.quality
195
+ else:
196
+ value = converted.value
197
+ if quality == Q.NONE:
198
+ original = value
199
+ value = value * self._factor if self._factor != 1 else value
200
+ if type(value) is float and (not isfinite(value) or value == 0 and original != 0):
201
+ quality |= Q.NONFINITE if not isfinite(value) else Q.PRECISION_LOSS
202
+ return TimeReductionResult(None if quality != Q.NONE else value, self._unit,
203
+ quality != Q.NONE, quality, self._terms)
@@ -0,0 +1,105 @@
1
+ """定义信号类型、时间坐标、三值条件和质量原因,供模型及计算层共用。
2
+
3
+ 模型接收明确的枚举成员;质量原因以固定的整数位保存,允许组合已知位,
4
+ 拒绝未知位。Truth区分条件成立、不成立和无法确定三种结果,禁止直接转为
5
+ Python布尔值。SignalDType声明值类型,TimeType区分相对坐标与UTC绝对坐标。
6
+ 本模块只依赖标准库,不读取数据或文件,不持有会话状态;SourceType当前
7
+ 只描述内存输入。
8
+ """
9
+
10
+ # 严格位边界防止未知质量位被误认为已校验策略。
11
+ from enum import Enum, FlagBoundary, IntFlag
12
+
13
+
14
+ class Truth(Enum):
15
+ """保存条件成立、不成立或无法确定的三种结果。
16
+
17
+ TRUE和FALSE表示已有充分证据;UNKNOWN表示缺失、过期或无法有效求值。
18
+ 成员不可变,任何成员都禁止隐式转为Python布尔值,调用者须明确处理三种结果。
19
+ """
20
+
21
+ TRUE = "true" # 已知且条件成立。
22
+ FALSE = "false" # 已知且条件不成立。
23
+ UNKNOWN = "unknown" # 缺失、过期或无法有效求值。
24
+
25
+ def __bool__(self) -> bool:
26
+ """阻止三个枚举成员被Python统一当作True。
27
+
28
+ 参数: 无额外参数;当前三值结果。
29
+ 返回: 无正常返回;须显式比较Truth成员。
30
+ 异常: TypeError;三值逻辑尚未由普通Python bool表达。
31
+ """
32
+ # 对TRUE/FALSE也统一拒绝,避免逻辑分支误用枚举默认真值。
33
+ raise TypeError("Truth不能隐式转bool,请显式处理TRUE/FALSE/UNKNOWN")
34
+
35
+
36
+ class QualityFlag(IntFlag, boundary=FlagBoundary.STRICT):
37
+ """用固定整数位保存样本无效或质量受限的原因。
38
+
39
+ 多个原因可以组合;基础策略拒绝所有非零位。NONE表示没有记录原因,
40
+ 仍需结合valid判断有效性。最高位为256,数组至少需要16位保存全部标志;
41
+ 构造时拒绝负值和未知位。
42
+ """
43
+
44
+ NONE = 0 # 没有已记录原因,不证明来源能力完整。
45
+ MISSING = 1 # 缺少所需观测。
46
+ STALE = 2 # 观测超过有效期。
47
+ DECODE_ERROR = 4 # 来源解析或解码失败。
48
+ NONFINITE = 8 # 数值NaN或无穷。
49
+ OUT_OF_RANGE = 16 # 超过明确业务范围。
50
+ ESTIMATED = 32 # 显式估计值,首版基础策略也禁止。
51
+ OVERFLOW = 64 # 定宽运算上溢或下溢,回绕结果不能作为有效值。
52
+ PRECISION_LOSS = 128 # 不能精确表示的数值转换。
53
+ DOMAIN_ERROR = 256 # 除零等值域错误。
54
+
55
+ @classmethod
56
+ def _missing_(cls, value):
57
+ """检查候选质量位值,再由标准库构造合法的位组合。
58
+
59
+ 参数:
60
+ value: 没有对应单一成员的候选位值;合法组合必须是非负整数。
61
+ 返回:
62
+ QualityFlag或None: 合法组合由IntFlag构造;其他输入遵循标准库协议。
63
+ 异常:
64
+ ValueError: 候选值为负数、包含未知位或不能构造为合法质量值。
65
+ """
66
+ # STRICT仍会归一化负值;须在该标准库过程之前显式拒绝。
67
+ if isinstance(value, int) and value < 0:
68
+ # -512不能被隐藏为NONE,非法原因不进入有效模型。
69
+ raise ValueError("quality mask必须非负")
70
+ # 非负已知组合沿用标准位构造,未知正位由STRICT拒绝。
71
+ return super()._missing_(value)
72
+
73
+
74
+ class SignalDType(Enum):
75
+ """声明信号值的逻辑类型,供模型和数值运算检查使用。
76
+
77
+ 整数明确分为int64和uint64,浮点使用float64。bool独立于整数,enum使用
78
+ 显式标签域;类型不会根据Python继承关系或NumPy自动类型提升推断。
79
+ """
80
+
81
+ INT64 = "int64" # 有符号64位整数。
82
+ UINT64 = "uint64" # 无符号64位整数。
83
+ FLOAT64 = "float64" # 有限双精度浮点,不隐式转大整数。
84
+ BOOL = "bool" # 明确布尔值,不按任意数值的Python真值判断。
85
+ ENUM = "enum" # 显式枚举标签,不参与一般数值运算。
86
+
87
+
88
+ class TimeType(Enum):
89
+ """区分相对来源坐标和UTC绝对坐标,保留显式起点依据。
90
+
91
+ 不读取机器时区,不自动把相对0当作UTC epoch。
92
+ """
93
+
94
+ RELATIVE = "relative" # 需要来源声明origin。
95
+ ABSOLUTE = "absolute" # 已规范化UTC epoch纳秒。
96
+
97
+
98
+ class SourceType(Enum):
99
+ """标明当前内存模型接受的数据来源种类。
100
+
101
+ MEMORY表示调用者直接提供已转换为纳秒的内存行。本枚举没有可变注册表,
102
+ 不会因为声明一个外部来源名称就自动读取或解码该来源。
103
+ """
104
+
105
+ MEMORY = "memory" # 已声明纳秒的内存行,不执行旧读写或解码。
@@ -0,0 +1,81 @@
1
+ """检查信号声明的线性单位转换是否与已知单位关系一致。
2
+
3
+ 输入为原单位、目标单位、scale、offset和方向因子;输出verified或unverified。
4
+ 已知单位用精确分数核对倍率,未知单位保留未校验状态。本模块检查转换声明,
5
+ 不转换样本值,也不推断物理方向。仅依赖标准库,没有文件操作或会话状态;
6
+ 温度和复杂量纲不在当前单位表中。
7
+ """
8
+
9
+ # 分数用于校验声明系数,避免0.001的二进制近似误报配置冲突。
10
+ from fractions import Fraction
11
+ from math import isfinite
12
+ # 单位表不可由调用者原地修改,否则已编译转换身份会失去依据。
13
+ from types import MappingProxyType
14
+
15
+ # 每项为物理类别及相对于该类别基准的精确倍率;不据名称推测方向。
16
+ UNIT_TABLE = MappingProxyType({"1": ("dimensionless", Fraction(1)), "V": ("voltage", Fraction(1)),
17
+ "mV": ("voltage", Fraction(1, 1000)), "A": ("current", Fraction(1)),
18
+ "mA": ("current", Fraction(1, 1000)), "W": ("power", Fraction(1)),
19
+ "kW": ("power", Fraction(1000)), "J": ("energy", Fraction(1)),
20
+ "Wh": ("energy", Fraction(3600)), "kWh": ("energy", Fraction(3600000)),
21
+ "s": ("time", Fraction(1)), "ms": ("time", Fraction(1, 1000)),
22
+ "Ah": ("charge", Fraction(3600)), "A·s": ("charge", Fraction(1))})
23
+
24
+
25
+ def require_number(value: int | float, field: str) -> int | float:
26
+ """要求有限原生数值,拒绝bool及未经声明的隐式标量转换。
27
+
28
+ 参数: value为原生int或有限float;field用于诊断位置。
29
+ 返回: 原数值,不改变整数精度。
30
+ 异常: TypeError为其他类型;ValueError为非有限float。
31
+ """
32
+ # bool不能作为工程转换系数或范围端点。
33
+ if type(value) not in (int, float):
34
+ # 配置层负责显式解析,不从任意对象取数值。
35
+ raise TypeError(f"{field}必须为原生int或float")
36
+ # 无界int本身有限,不能先转float造成伪溢出。
37
+ if type(value) is float and not isfinite(value):
38
+ # 非有限系数会污染全部输入,在执行前拒绝。
39
+ raise ValueError(f"{field}必须有限")
40
+ # 返回原值供精确配置和后续数值层使用。
41
+ return value
42
+
43
+
44
+ def validate_conversion(input_unit: str, unit: str, scale: int | float,
45
+ offset: int | float, direction_factor: int) -> str:
46
+ """核对已知单位的转换系数,无法识别单位时返回unverified。
47
+
48
+ 参数:
49
+ input_unit (str): 已校验的非空原单位标签。
50
+ unit (str): 已校验的非空目标单位标签。
51
+ scale (int | float): 显式倍率,必须已经包含direction_factor。
52
+ offset (int | float): 显式偏移;已知单位的当前转换只接受0。
53
+ direction_factor (int): 已声明的1或-1,表示方向保持或反转。
54
+ 返回:
55
+ str: 已知单位关系通过时为verified,任一单位未知时为unverified。
56
+ 函数不会补全系数、推断方向或执行样本转换。
57
+ 异常:
58
+ ValueError: 已知单位量纲不兼容,倍率不符合单位关系,或偏移不为0。
59
+ """
60
+ # 未知标签只能按显式声明使用,不能宣称量纲校验成功。
61
+ if input_unit not in UNIT_TABLE or unit not in UNIT_TABLE:
62
+ # 同名未知标签也不冒充已知单位。
63
+ return "unverified"
64
+ # 同维度单位才存在首版线性单位换算。
65
+ input_dimension, input_factor = UNIT_TABLE[input_unit]
66
+ # 目标倍率与输入同样使用精确分数。
67
+ output_dimension, output_factor = UNIT_TABLE[unit]
68
+ # 不把电压等不同物理量以一个scale伪装成相同。
69
+ if input_dimension != output_dimension:
70
+ # 编译前明确拒绝单位冲突。
71
+ raise ValueError(f"已知单位不兼容:{input_unit}→{unit}")
72
+ # 用户声明的scale须已经包含显式方向因子。
73
+ expected = input_factor / output_factor * direction_factor
74
+ # 十进制精确倍率或精确倍率唯一的float64舍入值均合法,不放宽任意容差。
75
+ matches = Fraction(str(scale)) == expected or (type(scale) is float and scale == float(expected))
76
+ # 非终止倍率如J→Wh允许标准float64表示;实际样本仍由数值层检查精度损失和质量原因。
77
+ if not matches or offset != 0:
78
+ # 不自动修正错误系数或再次施加DBC缩放。
79
+ raise ValueError(f"已知单位转换需要scale={expected}、offset=0")
80
+ # 这里只证明单位关系,尚不证明预设角色或样本数值有效。
81
+ return "verified"