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,161 @@
1
+ """声明有限样本统计事实、数值快照与结构门槛,不执行样本归约。
2
+
3
+ 支持sample_minimum/sample_maximum/sample_mean,BOOL条件可省略为全TRUE。值有效与条件
4
+ 已知分别完整划分实际窗口;FALSE不选择,UNKNOWN不当FALSE。真实样本仅计半开
5
+ 窗口内原值实际更新且有效/TRUE,TTL、条件更新和裁剪保持边界不能成为样本。
6
+ mean的值覆盖包含整数转float精度门槛,求和、除法和单位故障单独记数值失败。
7
+ 纯协议不读来源、不管理预算、不保存全轴;有限元数据及结果由外层owner计费。
8
+ """
9
+
10
+ # 两数值后端仅共享冻结协议、单位和几何校验,数值与覆盖计算各自独立。
11
+ from dataclasses import dataclass
12
+ from math import isfinite
13
+ from .integral_sum import require_partial_limit
14
+ from .calculations import CalculationSeries, CalculationDefinition, calculation_unit
15
+ from .models import Interval, SourceRef
16
+ from .types import QualityFlag as Q, SignalDType as D
17
+ from .validation import require_text
18
+
19
+
20
+ def _unknown_duration(ranges, actual):
21
+ """校验一种未知范围并精确累计纳秒,不用总长度掩盖重复位置。
22
+
23
+ 参数: ranges为冻结正Interval tuple;actual为原请求内交集或None。
24
+ 返回: 原生int未知总时长。异常: TypeError/ValueError为类型、反序、重叠或越界。
25
+ """
26
+ # 值和条件各自执行本结构检查,不能互相补充另一种覆盖缺口。
27
+ if type(ranges) is not tuple:
28
+ raise TypeError('样本事实未知范围需要tuple')
29
+ cursor, total = (actual.start_ns if actual is not None else 0), 0
30
+ for item in ranges:
31
+ if (not isinstance(item, Interval) or actual is None or item.start_ns < cursor
32
+ or item.start_ns >= item.end_ns or item.end_ns > actual.end_ns):
33
+ raise ValueError('样本未知范围必须有序、不重叠且在实际窗口内')
34
+ cursor, total = item.end_ns, total + item.end_ns - item.start_ns
35
+ return total
36
+
37
+
38
+ @dataclass(frozen=True)
39
+ class SampleCalculationFacts:
40
+ """保存有限块双覆盖与真实选中样本,样本数不代替区间数或时长。
41
+
42
+ selected只计条件TRUE且数值可用的正时长,selected_value_unknown只计TRUE值未知。
43
+ 无条件known等于实际跨度、false为0;mean精度失败属于值未知,数值累计失败不改事实。
44
+ """
45
+
46
+ spec: CalculationDefinition # 原samples请求、scope与覆盖政策。
47
+ actual_window: Interval | None # 当前块真实交集,不外推EOF。
48
+ value_valid_duration_ns: int # 通过本算子值门槛的有效纳秒。
49
+ condition_known_duration_ns: int # 条件可判断TRUE/FALSE的纳秒。
50
+ selected_duration_ns: int # 条件TRUE且值有效的保持纳秒,不是样本分母。
51
+ selected_value_unknown_duration_ns: int # TRUE但值未知的纳秒。
52
+ false_duration_ns: int # 明确FALSE纳秒,不包含条件UNKNOWN。
53
+ valid_sample_count: int # 半开窗口中有效/TRUE的原值真实更新。
54
+ value_unknown_ranges: tuple[Interval, ...] # 原值和mean精度未知位置。
55
+ condition_unknown_ranges: tuple[Interval, ...] # 独立BOOL UNKNOWN位置。
56
+ quality: Q # 输入、精度与依赖原因,不含归约数值故障。
57
+ input_unit: str # 原分析工程单位,未最终转换。
58
+ dtype: D # 原数值声明,极值保持int64/uint64精确整数。
59
+ binding_identity: str # 原值联合输入实际身份。
60
+ source_refs: tuple[SourceRef, ...] # 完整来源定位,保留真实子类。
61
+
62
+ def __post_init__(self):
63
+ """核对完整双分区、选择交集及typed字段,不修补事实。
64
+
65
+ 参数: 无。返回: None。异常: TypeError/ValueError为配置、覆盖、类型或几何矛盾。
66
+ """
67
+ # 结构配置不执行数值转换,只检查样本统计能力与单位。
68
+ require_sample_config(self.spec, self.input_unit, self.dtype, 4096)
69
+ if self.actual_window is not None and not isinstance(self.actual_window, Interval):
70
+ raise TypeError('样本实际范围需要Interval或None')
71
+ actual, request = self.actual_window, self.spec.window
72
+ span = 0 if actual is None else actual.end_ns - actual.start_ns
73
+ if actual is not None and not request.start_ns <= actual.start_ns <= actual.end_ns <= request.end_ns:
74
+ raise ValueError('样本事实实际范围超出原请求')
75
+ durations = (self.value_valid_duration_ns, self.condition_known_duration_ns, self.selected_duration_ns,
76
+ self.selected_value_unknown_duration_ns, self.false_duration_ns)
77
+ # 原生整数纳秒与计数不能接受bool/浮点;TRUE值未知不能超过全部值未知。
78
+ if (any(type(value) is not int or not 0 <= value <= span for value in durations)
79
+ or type(self.valid_sample_count) is not int or not 0 <= self.valid_sample_count <= self.selected_duration_ns
80
+ or self.selected_duration_ns > self.value_valid_duration_ns
81
+ or self.selected_value_unknown_duration_ns > span - self.value_valid_duration_ns
82
+ or self.false_duration_ns > self.condition_known_duration_ns
83
+ or self.selected_duration_ns + self.selected_value_unknown_duration_ns
84
+ != self.condition_known_duration_ns - self.false_duration_ns):
85
+ raise ValueError('样本事实计数、选择与双覆盖交集矛盾')
86
+ if _unknown_duration(self.value_unknown_ranges, actual) + self.value_valid_duration_ns != span:
87
+ raise ValueError('样本值有效与未知未完整划分实际窗口')
88
+ if _unknown_duration(self.condition_unknown_ranges, actual) + self.condition_known_duration_ns != span:
89
+ raise ValueError('样本条件已知与未知未完整划分实际窗口')
90
+ # 完整来源和质量保持真实类型,不将文件名或自由文字当作来源证据。
91
+ if not isinstance(self.quality, Q) or type(self.source_refs) is not tuple or any(not isinstance(ref, SourceRef) for ref in self.source_refs):
92
+ raise TypeError('样本事实需要typed质量和完整来源tuple')
93
+ require_text(self.binding_identity, 'sample.binding_identity')
94
+
95
+
96
+ @dataclass(frozen=True)
97
+ class SampleReductionResult:
98
+ """保存最终单位数值与真实样本数,不复用时间统计的区间项数语义。
99
+
100
+ 极值可保留精确int,均值为float;有效零、无样本None和数值失败分别表示。
101
+ 输入覆盖与最终report/strict/空选择分类由外层负责,数值快照不补正常零。
102
+ """
103
+
104
+ value: int | float | None # 最终单位有限候选,无法核实为None。
105
+ unit: str # 最终输出标签,已换单位一次。
106
+ calculation_failed: bool # 原序和、除法或最终转换失败。
107
+ quality: Q # 仅数值故障,输入原因另存facts。
108
+ valid_sample_count: int # 实际参与候选的有效真实样本数。
109
+
110
+ def __post_init__(self):
111
+ """拒绝样本数、正常数值和失败状态之间的矛盾。
112
+
113
+ 参数: 无。返回: None。异常: TypeError/ValueError为字段类型或不可能数值状态。
114
+ """
115
+ # 非有限/bool不能成为正常候选,原整数不被float检查造成舍入。
116
+ require_text(self.unit, 'sample.output_unit')
117
+ if self.value is not None and (type(self.value) not in (int, float)
118
+ or type(self.value) is float and not isfinite(self.value)):
119
+ raise ValueError('样本结果需要有限int/float或None')
120
+ if (type(self.calculation_failed) is not bool or not isinstance(self.quality, Q)
121
+ or type(self.valid_sample_count) is not int or self.valid_sample_count < 0):
122
+ raise TypeError('样本结果需要真实失败状态、质量和非负原生int计数')
123
+ # 空样本只能无值;有效失败须有样本及原因,成功不带数值故障位。
124
+ if self.calculation_failed:
125
+ if self.value is not None or self.quality == Q.NONE or self.valid_sample_count == 0:
126
+ raise ValueError('样本数值失败需要有效样本、None与明确原因')
127
+ elif self.quality != Q.NONE or (self.valid_sample_count == 0) != (self.value is None):
128
+ raise ValueError('样本成功结果数值、计数或质量矛盾')
129
+
130
+
131
+ def require_sample_config(spec, input_unit, dtype, partial_limit):
132
+ """校验三samples能力、数值dtype与明确单位,不计算样本。
133
+
134
+ 参数: 原spec/input_unit/dtype及正原生int误差容量partial_limit。
135
+ 返回: (output_unit, factor)。异常: TypeError/ValueError为类型、能力、单位或容量。
136
+ """
137
+ # BOOL/ENUM与时间算子各有独立口径,不在本核中暗自提升或扩展。
138
+ if not isinstance(spec, CalculationDefinition) or spec.operation not in ('sample_minimum', 'sample_maximum', 'sample_mean'):
139
+ raise TypeError('样本归约仅支持sample_minimum/sample_maximum/sample_mean')
140
+ if not isinstance(dtype, D) or dtype not in (D.INT64, D.UINT64, D.FLOAT64):
141
+ raise ValueError('样本统计只接受数值dtype')
142
+ require_text(input_unit, 'sample.input_unit')
143
+ require_partial_limit(partial_limit)
144
+ return calculation_unit(spec, input_unit)
145
+
146
+
147
+ def require_sample_series(series, spec, input_unit, dtype):
148
+ """核对有限输入unit/dtype及精确交集,保留可选BOOL条件。
149
+
150
+ 参数: series为有限CalculationSeries,其余为归约原配置。
151
+ 返回: 实际交集Interval或None。异常: TypeError/ValueError/OverflowError。
152
+ """
153
+ # CalculationSeries已校验可选条件列为BOOL;不自动换单位、转dtype或补原值更新。
154
+ if not isinstance(series, CalculationSeries):
155
+ raise TypeError('样本归约需要CalculationSeries')
156
+ if series.unit != input_unit or series.values[0].dtype is not dtype:
157
+ raise ValueError('样本归约只接受同unit及同dtype输入')
158
+ left, right = max(spec.window.start_ns, series.observation.start_ns), min(spec.window.end_ns, series.observation.end_ns)
159
+ if right-left > 2**63-1:
160
+ raise OverflowError('样本正交集跨度超过int64')
161
+ return Interval(left, right) if left <= right else None
@@ -0,0 +1,160 @@
1
+ """用真实NumPy样本与覆盖掩码归约有限min/max/sample_mean。
2
+
3
+ 输入值及可选BOOL为(N,)typed列,覆盖为(N-1,)精确int64差与bool掩码;真实样本
4
+ 按半开窗口原值actual更新、有效和条件TRUE选择。极值保持原dtype,mean只转换
5
+ 可核实值,并将原序样本推进本后端有界误差核。finish先完成原单位总和、除真实
6
+ 样本数,再转换输出一次;原量纲中间溢出不改为时间规范权重。输入覆盖与数值
7
+ 故障分开,不调用参考核、不重读来源、不保留全轴,有限临时内存由外层计费。
8
+ """
9
+
10
+ # 数值与覆盖均用独立真实数组运算,仅共享typed模型与本数组原序误差状态。
11
+ import numpy as np
12
+ from .integral_sum_numpy import NumpyIntegralSum
13
+ from .calculations import merge_ranges
14
+ from .models import Interval
15
+ from .numeric_numpy import DTYPES, NumericArray, to_float_numpy
16
+ from .sample_reduction import SampleCalculationFacts, SampleReductionResult, require_sample_config, require_sample_series
17
+ from .types import QualityFlag as Q
18
+
19
+
20
+ class NumpySampleReduction:
21
+ """保存单原dtype候选、真实样本数和有界误差列,不留存历史样本数组。"""
22
+
23
+ def __init__(self, spec, input_unit, dtype, *, partial_limit=4096):
24
+ """检查原配置并建立本数组后端有限状态。
25
+
26
+ 参数: spec/input_unit/dtype为原声明,partial_limit为正原生int误差容量。
27
+ 返回: None。异常: 配置、分配错误传播。
28
+ """
29
+ # 共享静态门槛不执行样本、浮点或覆盖计算。
30
+ self._unit, self._factor = require_sample_config(spec, input_unit, dtype, partial_limit)
31
+ self._spec, self._input_unit, self._dtype = spec, input_unit, dtype
32
+ self._identity = self._candidate = None
33
+ self._value_duration = self._selected_duration = self._samples = 0
34
+ self._sum = NumpyIntegralSum(partial_limit) if spec.operation == 'sample_mean' else None
35
+
36
+ @property
37
+ def selected_duration_ns(self):
38
+ """读取累计TRUE有效保持时长。参数: 无。返回: 原生int纳秒。异常: 无。"""
39
+ return self._selected_duration # 不是样本mean分母。
40
+
41
+ @property
42
+ def value_valid_duration_ns(self):
43
+ """读取累计值有效时长。参数: 无。返回: 原生int纳秒。异常: 无。"""
44
+ return self._value_duration # 与选择条件独立。
45
+
46
+ @property
47
+ def valid_sample_count(self):
48
+ """读取有效真实样本数。参数: 无。返回: 原生int。异常: 无。"""
49
+ return self._samples # 条件/TTL/边界更新不计入。
50
+
51
+ def push(self, series):
52
+ """独立数组计算双覆盖、真实样本掩码并推进对应候选。
53
+
54
+ 参数: series为同unit/dtype有限CalculationSeries,可选条件None表示全TRUE。
55
+ 返回: SampleCalculationFacts;mean精度入值覆盖,数值归约故障不改覆盖。
56
+ 异常: 结构、身份、容量、分配或取消传播;异常后外层只能清理owner。
57
+ 内存: 新列形状N/N-1或当前所选样本数,当前push存活,不修改输入列。
58
+ """
59
+ # 有限输入结构和整数交集先验证,禁止跨块更换原值绑定。
60
+ actual = require_sample_series(series, self._spec, self._input_unit, self._dtype)
61
+ if self._identity is not None and self._identity != series.binding_identity:
62
+ raise ValueError('样本归约不能跨绑定身份累计')
63
+ self._identity = series.binding_identity
64
+ # N个typed原值、有效性与uint16质量独立装箱;无效0只是掩码约束的存储占位。
65
+ column = NumericArray(self._dtype,
66
+ np.array([value.value if value.valid else 0 for value in series.values], dtype=DTYPES[self._dtype]),
67
+ np.array([value.valid for value in series.values], dtype=bool),
68
+ np.array([int(value.quality) for value in series.values], dtype=np.uint16))
69
+ # mean独立数组精度门槛,极值原int64/uint64保持;无条件显式全TRUE而非UNKNOWN。
70
+ values = to_float_numpy(column) if self._spec.operation == 'sample_mean' else column
71
+ size = len(series.times_ns)
72
+ known = np.ones(size, dtype=bool) if series.conditions is None else np.array([condition.valid for condition in series.conditions], dtype=bool)
73
+ truth = np.ones(size, dtype=bool) if series.conditions is None else np.array([condition.value if condition.valid else False for condition in series.conditions], dtype=bool)
74
+ condition_quality = np.zeros(size, dtype=np.uint16) if series.conditions is None else np.array([int(condition.quality) for condition in series.conditions], dtype=np.uint16)
75
+ times = np.array(series.times_ns, dtype=np.int64)
76
+ start, end = (actual.start_ns, actual.end_ns) if actual is not None else (0, 0)
77
+ # 覆盖只对正裁剪区间求int64差,绝对时间不转float,域外反序差不wrap。
78
+ left, right = np.maximum(times[:-1], np.int64(start)), np.minimum(times[1:], np.int64(end))
79
+ observed = right > left
80
+ durations = np.zeros(len(left), dtype=np.int64)
81
+ np.subtract(right, left, out=durations, where=observed)
82
+ value_valid = observed & values.valid[:-1]
83
+ selected = value_valid & known[:-1] & truth[:-1]
84
+ value_duration = int(np.sum(durations, where=value_valid, dtype=np.int64))
85
+ known_duration = int(np.sum(durations, where=observed & known[:-1], dtype=np.int64))
86
+ selected_duration = int(np.sum(durations, where=selected, dtype=np.int64))
87
+ selected_unknown = int(np.sum(durations, where=observed & known[:-1] & truth[:-1] & ~values.valid[:-1], dtype=np.int64))
88
+ false_duration = int(np.sum(durations, where=observed & known[:-1] & ~truth[:-1], dtype=np.int64))
89
+ # 样本(N,)掩码单独使用actual更新,不能由区间selected或条件变化推算。
90
+ actual_samples = (times >= start) & (times < end) & np.array(series.actual_value_updates, dtype=bool)
91
+ samples = actual_samples & values.valid & known & truth
92
+ sample_count = int(np.count_nonzero(samples))
93
+ relevant = actual_samples.copy()
94
+ relevant[:-1] |= observed
95
+ diagnostics = np.array([int(flag) for flag in series.diagnostics], dtype=np.uint16) | values.quality | condition_quality
96
+ quality = Q(int(np.bitwise_or.reduce(diagnostics, where=relevant, initial=0)))
97
+ # Python仅恢复有限未知定位;时长和样本计数均已由真实数组掩码归约。
98
+ value_unknown = tuple(Interval(int(left[index]), int(right[index])) for index in np.flatnonzero(observed & ~values.valid[:-1]))
99
+ condition_unknown = tuple(Interval(int(left[index]), int(right[index])) for index in np.flatnonzero(observed & ~known[:-1]))
100
+ if self._sum is not None:
101
+ # 按原(N,)位置顺序选择原单位样本,不先块求和或块均值;只读列交给本后端误差核。
102
+ chosen = values.values[samples]
103
+ keep = np.ones(len(chosen), dtype=bool)
104
+ chosen.setflags(write=False)
105
+ keep.setflags(write=False)
106
+ self._sum.push_values(chosen, keep)
107
+ elif sample_count:
108
+ # 极值当前样本列用原dtype数组归约,跨块仅保留一个同dtype候选。
109
+ candidate = (np.min if self._spec.operation == 'sample_minimum' else np.max)(values.values[samples])
110
+ if self._candidate is not None:
111
+ previous = DTYPES[self._dtype].type(self._candidate)
112
+ candidate = (np.minimum if self._spec.operation == 'sample_minimum' else np.maximum)(previous, candidate)
113
+ self._candidate = candidate.item()
114
+ # 跨块仅累计三个原生计数;冻结事实保留原请求、双未知与完整真实来源。
115
+ self._value_duration += value_duration
116
+ self._selected_duration += selected_duration
117
+ self._samples += sample_count
118
+ return SampleCalculationFacts(self._spec, actual, value_duration, known_duration, selected_duration,
119
+ selected_unknown, false_duration, sample_count, merge_ranges(value_unknown), merge_ranges(condition_unknown),
120
+ quality, self._input_unit, self._dtype, series.binding_identity, series.source_refs)
121
+
122
+ def finish(self):
123
+ """完成原单位样本总和后除计数,并仅一次转换最终单位。
124
+
125
+ 参数: 无。返回: SampleReductionResult快照,覆盖政策由外层分类。
126
+ 异常: 配置、分配或取消传播;原序和、除法、精度、换算故障写None与质量。
127
+ """
128
+ # 没有真实有效样本只能无候选,保持时长不能替代此计数证明0。
129
+ if self._samples == 0:
130
+ return SampleReductionResult(None, self._unit, False, Q.NONE, 0)
131
+ quality = Q.NONE
132
+ if self._sum is not None:
133
+ # 原单位factor=1先完成raw总和,原量纲中途溢出保持失败,不预规范化样本。
134
+ number = self._sum.finish(self._input_unit)
135
+ if number.calculation_failed:
136
+ return SampleReductionResult(None, self._unit, True, number.quality, self._samples)
137
+ with np.errstate(over='ignore', under='ignore', invalid='ignore'):
138
+ value = np.divide(np.float64(number.value), np.float64(self._samples)).item()
139
+ if not np.isfinite(value) or value == 0 and number.value != 0:
140
+ quality |= Q.NONFINITE if not np.isfinite(value) else Q.PRECISION_LOSS
141
+ else:
142
+ value = self._candidate
143
+ # 极值factor=1保留原生整数;明确换单位先用本数组精度核核对可表示性。
144
+ if quality == Q.NONE and self._factor != 1 and type(value) is int:
145
+ converted = to_float_numpy(NumericArray(self._dtype,
146
+ np.array([value], dtype=DTYPES[self._dtype]), np.array([True]), np.array([0], dtype=np.uint16)))
147
+ if not converted.valid[0]:
148
+ quality |= Q(int(converted.quality[0]))
149
+ else:
150
+ value = converted.values[0].item()
151
+ if quality == Q.NONE and self._factor != 1:
152
+ original = value
153
+ with np.errstate(over='ignore', under='ignore', invalid='ignore'):
154
+ value = np.multiply(np.float64(value), np.float64(self._factor)).item()
155
+ if not np.isfinite(value) or value == 0 and original != 0:
156
+ quality |= Q.NONFINITE if not np.isfinite(value) else Q.PRECISION_LOSS
157
+ # 只规范成功浮点零,不清除数值故障或改写真实样本/输入覆盖事实。
158
+ if quality == Q.NONE and type(value) is float and value == 0:
159
+ value = 0.0
160
+ return SampleReductionResult(None if quality != Q.NONE else value, self._unit, quality != Q.NONE, quality, self._samples)
@@ -0,0 +1,154 @@
1
+ """独立标量归约有限真实样本,保留原dtype极值与原序样本算术均值。
2
+
3
+ push分别计算值/条件覆盖,只将半开窗中有效/TRUE原值真实更新计入候选。极值
4
+ 保留原整数;mean先检查float精度,原单位样本按原序推进有界误差核,finish完成
5
+ 原量纲总和后除真实样本数,再换输出单位一次。原序中间溢出沿既有故障政策保持
6
+ 失败,不改为time_weighted_mean的规范化权重;除法/换算故障不改输入覆盖。不调用NumPy、
7
+ 不读来源、不保留全轴;有限临时样本和误差项须由外层owner计费,异常后须清理。
8
+ """
9
+
10
+ # 标量覆盖及候选独立于数组后端;仅复用本参考原序误差状态。
11
+ from math import isfinite
12
+ from .integral_sum_reference import ReferenceIntegralSum
13
+ from .calculations import merge_ranges
14
+ from .models import Interval
15
+ from .numeric import ScalarValue, to_float_reference
16
+ from .sample_reduction import SampleCalculationFacts, SampleReductionResult, require_sample_config, require_sample_series
17
+ from .types import QualityFlag as Q, SignalDType as D
18
+
19
+
20
+ class ReferenceSampleReduction:
21
+ """保存单原生候选、真实样本计数与有界误差项,不存历史输入列。"""
22
+
23
+ def __init__(self, spec, input_unit, dtype, *, partial_limit=4096):
24
+ """核对原配置并建立本参考后端有限状态。
25
+
26
+ 参数: spec/input_unit/dtype为原声明,partial_limit为正原生int误差容量。
27
+ 返回: None。异常: 配置或分配错误传播。
28
+ """
29
+ # 共享静态门槛先检查明确样本能力、数值类型和输出单位。
30
+ self._unit, self._factor = require_sample_config(spec, input_unit, dtype, partial_limit)
31
+ self._spec, self._input_unit, self._dtype = spec, input_unit, dtype
32
+ self._identity = self._candidate = None
33
+ self._value_duration = self._selected_duration = self._samples = 0
34
+ self._sum = ReferenceIntegralSum(partial_limit) if spec.operation == 'sample_mean' else None
35
+
36
+ @property
37
+ def selected_duration_ns(self):
38
+ """读取累计TRUE值有效时长。参数: 无。返回: 原生int纳秒。异常: 无。"""
39
+ return self._selected_duration # 不作为样本均值分母。
40
+
41
+ @property
42
+ def value_valid_duration_ns(self):
43
+ """读取累计值有效时长。参数: 无。返回: 原生int纳秒。异常: 无。"""
44
+ return self._value_duration # 与条件TRUE/FALSE/UNKNOWN独立。
45
+
46
+ @property
47
+ def valid_sample_count(self):
48
+ """读取有效真实样本数。参数: 无。返回: 原生int。异常: 无。"""
49
+ return self._samples # TTL/条件更新或裁剪保持不增加此数。
50
+
51
+ def push(self, series):
52
+ """消费有限块双覆盖与真实样本,不以保持区间代替样本。
53
+
54
+ 参数: series为同unit/dtype有限CalculationSeries,条件可省略为全TRUE。
55
+ 返回: SampleCalculationFacts;mean精度失败进入输入覆盖,求和故障不改覆盖。
56
+ 异常: 结构、身份、容量、分配或取消传播;外层异常后不能接着使用前缀状态。
57
+ """
58
+ # 输入结构和交集先核对,跨块原表达式绑定身份必须保持。
59
+ actual = require_sample_series(series, self._spec, self._input_unit, self._dtype)
60
+ if self._identity is not None and self._identity != series.binding_identity:
61
+ raise ValueError('样本归约不能跨绑定身份累计')
62
+ self._identity = series.binding_identity
63
+ # 只有mean走浮点精度门槛,min/max不把大整数舍入为float。
64
+ values = tuple(to_float_reference(value) for value in series.values) if self._spec.operation == 'sample_mean' else series.values
65
+ unconditional = ScalarValue(True, D.BOOL)
66
+ start, end = (actual.start_ns, actual.end_ns) if actual is not None else (0, 0)
67
+ value_duration = known_duration = selected_duration = selected_unknown = false_duration = samples = 0
68
+ value_unknown, condition_unknown, chosen = [], [], []
69
+ quality = Q.NONE
70
+ # 独立逐正区间计算双覆盖;这只说明保持事实,不向数值样本归约添加值。
71
+ for index in range(len(series.times_ns)-1):
72
+ left, right = max(series.times_ns[index], start), min(series.times_ns[index+1], end)
73
+ if left >= right:
74
+ continue
75
+ value = values[index]
76
+ condition = series.conditions[index] if series.conditions is not None else unconditional
77
+ dt = right-left
78
+ quality |= series.diagnostics[index] | value.quality | condition.quality
79
+ if value.valid:
80
+ value_duration += dt
81
+ else:
82
+ value_unknown.append(Interval(left, right))
83
+ if condition.valid:
84
+ known_duration += dt
85
+ if not condition.value:
86
+ false_duration += dt
87
+ elif value.valid:
88
+ selected_duration += dt
89
+ else:
90
+ selected_unknown += dt
91
+ else:
92
+ condition_unknown.append(Interval(left, right))
93
+ # 半开窗口真实原值更新才进入候选;外条件变化和共享右端不产生样本。
94
+ for index, time in enumerate(series.times_ns):
95
+ if not start <= time < end or not series.actual_value_updates[index]:
96
+ continue
97
+ value = values[index]
98
+ condition = series.conditions[index] if series.conditions is not None else unconditional
99
+ quality |= series.diagnostics[index] | value.quality | condition.quality
100
+ if not value.valid or not condition.valid or not condition.value:
101
+ continue
102
+ samples += 1
103
+ if self._spec.operation == 'sample_mean':
104
+ chosen.append(value.value)
105
+ else:
106
+ # 极值只存一个原dtype候选,不按时长加权或保留跨块样本集合。
107
+ self._candidate = value.value if self._candidate is None else (min if self._spec.operation == 'sample_minimum' else max)(self._candidate, value.value)
108
+ # raw原单位样本按原序推进;中间溢出不会因后续抵消恢复正常。
109
+ if self._sum is not None:
110
+ self._sum.push_values(tuple(chosen), (True,)*len(chosen))
111
+ # 跨块只留精确计数,返回的有限双未知和来源仍需外层owner计费及管理生命周期。
112
+ self._value_duration += value_duration
113
+ self._selected_duration += selected_duration
114
+ self._samples += samples
115
+ return SampleCalculationFacts(self._spec, actual, value_duration, known_duration, selected_duration,
116
+ selected_unknown, false_duration, samples, merge_ranges(value_unknown), merge_ranges(condition_unknown),
117
+ quality, self._input_unit, self._dtype, series.binding_identity, series.source_refs)
118
+
119
+ def finish(self):
120
+ """完成原单位总和、除真实样本数,再仅一次转换输出单位。
121
+
122
+ 参数: 无。返回: SampleReductionResult快照,不清空状态或分类覆盖政策。
123
+ 异常: 配置/分配错误传播;原序和、除法、精度或换算故障返回None及质量。
124
+ """
125
+ # 空真实样本没有数值证据,即使保持值长期有效也不能补正常零。
126
+ if self._samples == 0:
127
+ return SampleReductionResult(None, self._unit, False, Q.NONE, 0)
128
+ quality = Q.NONE
129
+ if self._sum is not None:
130
+ # 此处原单位factor=1先完成总和,不能先输出换单位或先归约块均值。
131
+ number = self._sum.finish(self._input_unit)
132
+ if number.calculation_failed:
133
+ return SampleReductionResult(None, self._unit, True, number.quality, self._samples)
134
+ value = number.value / self._samples
135
+ if not isfinite(value) or value == 0 and number.value != 0:
136
+ quality |= Q.NONFINITE if not isfinite(value) else Q.PRECISION_LOSS
137
+ else:
138
+ value = self._candidate
139
+ # 非1倍率极值先检查整数可精确float表示;倍率1保留原生整数。
140
+ if quality == Q.NONE and self._factor != 1 and type(value) is int:
141
+ converted = to_float_reference(ScalarValue(value, self._dtype))
142
+ if not converted.valid:
143
+ quality |= converted.quality
144
+ else:
145
+ value = converted.value
146
+ if quality == Q.NONE and self._factor != 1:
147
+ original = value
148
+ value *= self._factor
149
+ if not isfinite(value) or value == 0 and original != 0:
150
+ quality |= Q.NONFINITE if not isfinite(value) else Q.PRECISION_LOSS
151
+ # 成功浮点零统一+0.0;所有数值故障保留真实样本数而不改输入覆盖。
152
+ if quality == Q.NONE and type(value) is float and value == 0:
153
+ value = 0.0
154
+ return SampleReductionResult(None if quality != Q.NONE else value, self._unit, quality != Q.NONE, quality, self._samples)
@@ -0,0 +1,74 @@
1
+ """声明已解码信号层的选择行,保留时间、原值、三值状态和来源身份。
2
+
3
+ 输入为CalculationSeries和select请求,输出由各独立后端逐行迭代SelectionRow。
4
+ TRUE行是已知选中;UNKNOWN行用于保留无法决定的诊断,消费方必须检查selection。
5
+ FALSE行被过滤。只输出目标表达式依赖的真实时间组更新,不伪造裁剪或TTL样本。
6
+ 本模块仅验证不可变协议,不计算筛选掩码、不读写文件、不改变旧读取或解码。
7
+ 来源定位是绑定字段与时间组,不宣称保存旧日志的物理行号或逐消息求值序号。
8
+ 输入仍为完整内存历史;逐行输出不意味着AnalysisRunner的内存预算已经实现。
9
+ """
10
+
11
+ # 冻结行协议避免消费者修改结果身份。
12
+ from dataclasses import dataclass
13
+ # 只共享静态模型,不包含筛选数值内核。
14
+ from .calculations import CalculationSeries, CalculationDefinition
15
+ from .models import SourceRef
16
+ from .numeric import ScalarValue
17
+ from .types import Truth, QualityFlag as Q
18
+ from .validation import require_text
19
+ from ..timebase.conversion import require_int64_ns
20
+
21
+
22
+ @dataclass(frozen=True)
23
+ class SelectionRow:
24
+ """保存一个真实表达式更新时间组的选择结果。
25
+
26
+ value保持原dtype、枚举标签、有效性和质量;selection只允许TRUE或UNKNOWN。
27
+ quality汇总原依赖、值及条件原因;binding_identity与source_refs定位当前输入。
28
+ unit保留当前分析值单位;行流不执行隐式单位换算。
29
+ 所有字段不可变,没有跨任务状态;UNKNOWN不是已知选中,不能隐式转bool。
30
+ """
31
+
32
+ time_ns: int # 原子更新时间组的精确纳秒时间。
33
+ value: ScalarValue # 原typed值,未知不填正常零,枚举不输出内部整数编码。
34
+ selection: Truth # TRUE选中或UNKNOWN诊断,不包含明确FALSE行。
35
+ quality: Q # 原值、条件与依赖的完整质量原因。
36
+ binding_identity: str # 当前表达式/选择条件的实际执行身份。
37
+ source_refs: tuple[SourceRef, ...] # 当前所有依赖的原字段定位。
38
+ unit: str # 当前分析值单位,和原typed值一起保留。
39
+
40
+ def __post_init__(self):
41
+ """验证行类型、时间和当前来源身份,不执行筛选。
42
+
43
+ 参数: 无;读取冻结字段。
44
+ 返回: None。
45
+ 异常: TypeError/ValueError/OverflowError为不合法协议。
46
+ """
47
+ # 保持精确int64时间,不接受float或bool冒充坐标。
48
+ require_int64_ns(self.time_ns, 'selection.time_ns')
49
+ # FALSE不属于输出,value即使无效也必须有完整typed质量。
50
+ if not isinstance(self.value, ScalarValue) or self.selection not in (Truth.TRUE, Truth.UNKNOWN) or not isinstance(self.quality, Q):
51
+ raise TypeError('选择行需typed值、TRUE/UNKNOWN及QualityFlag')
52
+ # 身份不可为空;来源引用必须冻结且是完整字段模型。
53
+ require_text(self.binding_identity, 'selection.binding_identity')
54
+ require_text(self.unit, 'selection.unit')
55
+ if not isinstance(self.source_refs, tuple) or any(not isinstance(ref, SourceRef) for ref in self.source_refs):
56
+ raise TypeError('选择行来源需tuple SourceRef')
57
+ # 输出不能隐藏原值原因,UNKNOWN必须保留至少一个质量诊断。
58
+ if self.quality & self.value.quality != self.value.quality or self.selection is Truth.UNKNOWN and self.quality == Q.NONE:
59
+ raise ValueError('选择行质量不能隐藏无效值或UNKNOWN原因')
60
+
61
+
62
+ def require_selection(series, spec):
63
+ """验证选择行流的输入,不把行流当成标量或隐式换单位。
64
+
65
+ 参数: series为CalculationSeries,spec为operation=select的CalculationDefinition。
66
+ 返回: None。
67
+ 异常: TypeError为模型错误;ValueError为算子或单位转换请求。
68
+ """
69
+ # 两个后端共享已校验协议,筛选算法仍独立。
70
+ if not isinstance(series, CalculationSeries) or not isinstance(spec, CalculationDefinition):
71
+ raise TypeError('选择行流需CalculationSeries和CalculationDefinition')
72
+ # 此入口保留原值,转换需要先在分析表达式/绑定中明确完成。
73
+ if spec.operation != 'select' or spec.output_unit not in (None, series.unit):
74
+ raise ValueError('选择行流需select且保留输入单位')