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,77 @@
1
+ """声明整窗积分数值归约结果和容量门槛,不执行数值求和。
2
+
3
+ 两个独立数值核接收原序面积项,输出尚未分类覆盖状态的冻结数值结果。
4
+ 面积先在输入单位乘秒下累计,最终只转换一次;覆盖和来源另由事实 owner 保存。
5
+ 本模块不导入 NumPy、不读写文件,也不提供独立内存预算。
6
+ """
7
+
8
+ # 共享协议与输入门槛,不共享求和或浮点误差计算。
9
+ from dataclasses import dataclass
10
+ from math import isfinite
11
+ from .types import QualityFlag as Q
12
+ from .validation import require_text
13
+
14
+
15
+ class IntegralStateLimitError(ValueError):
16
+ """表示误差项超过显式容量,调用方须停止当前归约并清理资源。
17
+
18
+ 不截断误差项,也不把容量不足伪装为正常数值或 NONFINITE。
19
+ """
20
+
21
+
22
+ def require_partial_limit(limit: int) -> int:
23
+ """校验误差项数量的硬上限。
24
+
25
+ 参数: limit 为正原生整数。返回: 原值。异常: ValueError 为 bool、非整数或非正数。
26
+ """
27
+ # 容量是精确计数,拒绝布尔、浮点或无限制配置。
28
+ if type(limit) is not int or limit <= 0:
29
+ raise ValueError('积分误差项容量需要正原生int')
30
+ return limit
31
+
32
+
33
+ def require_sum_finish(unit: str, factor: float) -> tuple[str, float]:
34
+ """校验纯核的输出标签及一次性转换因子。
35
+
36
+ 参数: unit 为非空标签;factor 为正有限原生 float。返回: (unit, factor)。
37
+ 异常: TypeError/ValueError 为文字或因子错误;单位维度由外层 calculation_unit 校验。
38
+ """
39
+ # 纯核不能凭单位文本推导因子,外层须先核对已注册的维度转换。
40
+ require_text(unit, 'integral.output_unit')
41
+ if type(factor) is not float or not isfinite(factor) or factor <= 0:
42
+ raise ValueError('积分转换因子需要正有限原生float')
43
+ return unit, factor
44
+
45
+
46
+ @dataclass(frozen=True)
47
+ class IntegralSumResult:
48
+ """保存已换单位的数值快照,不代替覆盖和最终 CalculationResult 分类。
49
+
50
+ valid_term_count 统计参与累计的有效面积项,与实际信号更新样本数不同。
51
+ 无有效项时 value 为 None;有有效零面积时 value 为 0.0。
52
+ """
53
+
54
+ value: float | None # 最终单位下的有限面积,未知或计算失败为 None。
55
+ unit: str # 已由调用方声明的最终输出单位。
56
+ calculation_failed: bool # 数值求和或最终转换失败,不表示输入全部未知。
57
+ quality: Q # 本次数值归约诊断,输入覆盖质量另保留在 IntegralFacts。
58
+ valid_term_count: int # 原序有效面积项数,不冒充真实样本计数。
59
+
60
+ def __post_init__(self):
61
+ """拒绝矛盾的冻结结果,不自动补零或修正故障。
62
+
63
+ 参数: 无。返回: None。异常: TypeError/ValueError 为结构或状态不一致。
64
+ """
65
+ # 标签、计数和诊断保持真实类型,拒绝 bool 当作整数计数。
66
+ require_text(self.unit, 'integral.output_unit')
67
+ if (type(self.calculation_failed) is not bool or not isinstance(self.quality, Q)
68
+ or type(self.valid_term_count) is not int or self.valid_term_count < 0):
69
+ raise TypeError('积分数值结果需要真实状态、质量和非负整数计数')
70
+ if self.value is not None and (type(self.value) is not float or not isfinite(self.value)):
71
+ raise ValueError('积分数值结果只接受有限float或None')
72
+ # 未知与失败都不得借零值冒充成功,成功的有效项必须有明确数值。
73
+ if self.calculation_failed:
74
+ if self.value is not None or self.quality == Q.NONE or self.valid_term_count == 0:
75
+ raise ValueError('积分计算失败需要有效项、None值及明确质量原因')
76
+ elif ((self.valid_term_count == 0) != (self.value is None)) or self.quality != Q.NONE:
77
+ raise ValueError('积分成功结果的数值、计数或质量不一致')
@@ -0,0 +1,224 @@
1
+ """用独立 NumPy 误差数组归约原序积分面积,最后一次换算输出单位。
2
+
3
+ 输入是有限块 NumpyIntegralTerms,只消费 valid 为 True 的 float64 面积;
4
+ 面积已经带有 input_unit 乘秒的量纲,本核不重复乘区间时长、不累计覆盖事实。
5
+ 跨块保存按绝对值递增、互不重叠的误差项,默认最多 4096 项;不保留历史面积。
6
+ 原序面积推进属于 state_driver;每项内部用真实 accumulate、ufunc 和掩码处理
7
+ 误差数组,不调用参考模块或 math.fsum,也不把整窗宣称为无状态数组求和。
8
+ 状态与临时数组均受 partial_limit 限制,输入索引受当前有限块长度限制;
9
+ 本纯核不管理预算或关闭资源,调用方须先预约相应空间并负责异常后的生命周期。
10
+ finish 是不破坏状态的快照,单位换算故障只影响返回结果;原量纲累计溢出永久保留。
11
+ """
12
+
13
+ # 仅共享结果模型、参数门槛和输入模型;数值误差推进由本模块独立实现。
14
+ import numpy as np
15
+ from .integral_sum import (IntegralStateLimitError, IntegralSumResult,
16
+ require_partial_limit, require_sum_finish)
17
+ from .integral_terms_numpy import NumpyIntegralTerms
18
+ from .types import QualityFlag as Q
19
+
20
+
21
+ class NumpyIntegralSum:
22
+ """保存有限 float64 误差项和有效项计数,保持跨块原序及持久溢出状态。
23
+
24
+ partials 只在完整单项候选满足容量后安装,不按输入项数增长;中途溢出
25
+ 清空数值状态并永久标失败,但后续有效面积仍计数。输入和已返回结果不被修改。
26
+ """
27
+
28
+ def __init__(self, partial_limit: int = 4096):
29
+ """建立独立的空数组误差状态。
30
+
31
+ 参数: partial_limit 为正原生 int,表示误差状态的最大项数。
32
+ 返回: 无;初始化有效项数 0、累计故障 False 及空 float64 数组。
33
+ 异常: TypeError/ValueError 为限额不合法;内存分配错误直接传播。
34
+ """
35
+ # 状态容量受显式限额约束;预约责任属于调用方,纯核不另开预算。
36
+ self._partial_limit = require_partial_limit(partial_limit)
37
+ self._partials = np.empty(0, dtype=np.float64)
38
+ self._valid_term_count = 0
39
+ self._calculation_failed = False
40
+
41
+ @property
42
+ def valid_term_count(self) -> int:
43
+ """读取已消费的有效面积数,包含导致中途溢出的项及其后续项。
44
+
45
+ 参数: 无。返回: 非负原生 int。异常: 无。
46
+ """
47
+ # 计数不等同于有效时间或真实更新样本数,覆盖信息由外层独立累计。
48
+ return self._valid_term_count
49
+
50
+ @property
51
+ def calculation_failed(self) -> bool:
52
+ """读取原量纲累计中途非有限的持久标志。
53
+
54
+ 参数: 无。返回: bool;finish 的单位换算故障不修改本属性。异常: 无。
55
+ """
56
+ # 失败不能通过后来抵消或再调用 finish 恢复为成功。
57
+ return self._calculation_failed
58
+
59
+ @property
60
+ def partial_count(self) -> int:
61
+ """读取当前持有的非零误差项数,不暴露可修改的数组。
62
+
63
+ 参数: 无。返回: 不超过 partial_limit 的原生 int。异常: 无。
64
+ """
65
+ # 返回标量规模,调用方不能通过属性改写数值不变量。
66
+ return len(self._partials)
67
+
68
+ def push(self, terms: NumpyIntegralTerms) -> None:
69
+ """按输入顺序消费当前有限块的有效面积,不先对块求和。
70
+
71
+ 参数: terms 为已校验的只读 float64 面积、bool 掩码和 IntegralFacts。
72
+ 返回: None;安装成功的单项更新状态和有效计数,输入数组保持原样。
73
+ 异常: TypeError 为输入类型错误;IntegralStateLimitError 为候选容量超限;
74
+ 分配或取消错误传播。超限项不安装,其前面已成功消费的项保留。
75
+ """
76
+ try:
77
+ # typed 输入已保证同长有限面积;UNKNOWN 占位不能作为有效零参与归约。
78
+ if not isinstance(terms, NumpyIntegralTerms):
79
+ raise TypeError('数组积分归约需要 NumpyIntegralTerms')
80
+ # 保留原积分typed门槛,同后端通用入口承接完全相同的数值推进。
81
+ self.push_values(terms.areas, terms.valid)
82
+ finally:
83
+ # 原异常及TB仍交调用方;只断本层借入参数、视图和临时,不清外部帧。
84
+ self = terms = None
85
+
86
+ def push_values(self, values: np.ndarray, valid: np.ndarray) -> None:
87
+ """用本数组后端累计有限浮点项,不构造虚假的积分事实。
88
+
89
+ 参数: values/valid 为同长只读普通一维float64/bool数组;未知位置只能存0。
90
+ 返回: None;原序推进、容量、中间溢出及finish行为与积分入口相同。
91
+ 异常: TypeError/ValueError 为结构或写保护错误;容量、分配和取消传播。
92
+ 内存: 检查掩码与索引均为当前有限(N,)临时列,调用方必须先预约预算。
93
+ """
94
+ try:
95
+ # 拒绝自动cast、广播或可写别名;不把未知占位当正常数值。
96
+ if (type(values) is not np.ndarray or type(valid) is not np.ndarray
97
+ or values.ndim != 1 or valid.ndim != 1
98
+ or values.dtype != np.dtype('float64') or valid.dtype != np.dtype('bool')
99
+ or len(values) != len(valid) or values.flags.writeable or valid.flags.writeable):
100
+ raise TypeError('数组原序归约需要同长只读float64/bool一维列')
101
+ if np.any(~np.isfinite(values)) or np.any(values[~valid] != 0):
102
+ raise ValueError('数组原序项需有限,未知位置只能存0')
103
+ # 当前块的索引空间为 O(N),属于调用方有限块预约;不保存索引到跨块状态。
104
+ indices = np.flatnonzero(valid)
105
+ if self._calculation_failed:
106
+ self._valid_term_count += len(indices)
107
+ return
108
+ # 原序外层属于 state_driver;每项内的误差推进是独立的真实数组运算。
109
+ for index in indices:
110
+ if self._calculation_failed:
111
+ self._valid_term_count += 1
112
+ continue
113
+ candidate = self._advance(values[index])
114
+ # 容量检查已完成才安装;数值溢出单项仍计数,清空不再使用的误差状态。
115
+ if candidate is None:
116
+ self._partials = np.empty(0, dtype=np.float64)
117
+ self._calculation_failed = True
118
+ else:
119
+ self._partials = candidate
120
+ self._valid_term_count += 1
121
+ finally:
122
+ # 原异常及TB仍交调用方;只断本层借入参数、视图和临时,不清外部帧。
123
+ self = values = valid = indices = candidate = None
124
+
125
+ def _advance(self, area: np.float64) -> np.ndarray | None:
126
+ """生成一项的独立误差候选,不提前改写当前状态。
127
+
128
+ 参数: area 为有限 float64 面积,量纲仍为 input_unit 乘秒。
129
+ 返回: float64 形状 (K,) 的新候选,K 不超过限额;中途非有限返回 None。
130
+ 异常: IntegralStateLimitError 为候选超限;分配和取消错误传播。
131
+ """
132
+ try:
133
+ # (K+1,) accumulate 保留每一步 hi,递推顺序与原序 FastTwoSum 相同。
134
+ chain = np.concatenate((np.array([area], dtype=np.float64), self._partials))
135
+ with np.errstate(over='ignore', under='ignore', invalid='ignore'):
136
+ highs = np.add.accumulate(chain, dtype=np.float64)
137
+ if not np.all(np.isfinite(highs)):
138
+ return None
139
+ # 每一步的旧 x 与 partial 并列为 (K,);交换只用于找出绝对值较大的加数。
140
+ incoming, old = highs[:-1], self._partials
141
+ swap = np.abs(incoming) < np.abs(old)
142
+ large = np.where(swap, old, incoming)
143
+ small = np.where(swap, incoming, old)
144
+ with np.errstate(over='ignore', under='ignore', invalid='ignore'):
145
+ lows = np.subtract(small, np.subtract(highs[1:], large))
146
+ # 非零 lo 按原误差顺序压紧;末 hi 为零时不追加,保留全零的空状态。
147
+ kept = lows[lows != 0]
148
+ last = highs[-1]
149
+ count = len(kept) + int(last != 0)
150
+ if count > self._partial_limit:
151
+ raise IntegralStateLimitError('数组积分误差状态超过 partial_limit')
152
+ # 新数组不借用 chain 的底层空间,跨块状态容量只包含实际保留的 K 项。
153
+ if last != 0:
154
+ return np.concatenate((kept, np.array([last], dtype=np.float64)))
155
+ return kept.copy()
156
+ finally:
157
+ # 原异常及TB仍交调用方;只断本层借入参数、视图和临时,不清外部帧。
158
+ self = area = chain = highs = incoming = old = None
159
+ swap = large = small = lows = kept = last = None
160
+
161
+ def finish(self, unit: str, factor: float = 1.0) -> IntegralSumResult:
162
+ """正确舍入当前误差状态,再做一次输出单位换算,返回独立快照。
163
+
164
+ 参数: unit 为非空输出单位;factor 为正有限原生 float,仅在最后相乘。
165
+ 返回: IntegralSumResult;没有有效项为 None,有效全零为 +0.0;累计或
166
+ 换算非有限为 NONFINITE,非零换算下溢为 PRECISION_LOSS,均标计算失败。
167
+ 异常: TypeError/ValueError 为参数错误;分配或取消错误传播。
168
+ """
169
+ try:
170
+ # 参数先校验;快照不消费或清空状态,外层 owner 决定是否锁定后续输入。
171
+ unit, factor = require_sum_finish(unit, factor)
172
+ if self._calculation_failed:
173
+ return IntegralSumResult(None, unit, True, Q.NONFINITE, self._valid_term_count)
174
+ if self._valid_term_count == 0:
175
+ return IntegralSumResult(None, unit, False, Q.NONE, 0)
176
+ # 空误差状态表示有效面积精确抵消或全零,不等同于没有有效面积。
177
+ raw = self._rounded() if len(self._partials) else np.float64(0.0)
178
+ with np.errstate(over='ignore', under='ignore', invalid='ignore'):
179
+ converted = np.multiply(raw, np.float64(factor))
180
+ if not np.isfinite(raw) or not np.isfinite(converted):
181
+ return IntegralSumResult(None, unit, True, Q.NONFINITE, self._valid_term_count)
182
+ if raw != 0 and converted == 0:
183
+ return IntegralSumResult(None, unit, True, Q.PRECISION_LOSS, self._valid_term_count)
184
+ # 转为 Python float 仅用于冻结结果,不把数值推进交给参考或标量求和核。
185
+ return IntegralSumResult(float(converted), unit, False, Q.NONE, self._valid_term_count)
186
+ finally:
187
+ # 原异常及TB仍交调用方;只断本层借入参数、视图和临时,不清外部帧。
188
+ self = unit = factor = raw = converted = None
189
+
190
+ def _rounded(self) -> np.float64:
191
+ """从最大误差项向小项求和,在首个舍入误差处完成半偶修正。
192
+
193
+ 参数: 无;当前状态必须至少包含一个非零有限 partial。
194
+ 返回: 当前原量纲的正确舍入 float64;不修改误差数组。
195
+ 异常: 分配或取消错误传播;数值非有限由 finish 分类。
196
+ """
197
+ try:
198
+ # 逆序是只读视图;后续向量计算全部局限于 (K,) 或 (K-1,) 的固定容量。
199
+ reverse = self._partials[::-1]
200
+ with np.errstate(over='ignore', under='ignore', invalid='ignore'):
201
+ highs = np.add.accumulate(reverse, dtype=np.float64)
202
+ lows = np.subtract(reverse[1:], np.subtract(highs[1:], highs[:-1]))
203
+ inexact = np.flatnonzero(lows != 0)
204
+ if len(inexact) == 0:
205
+ return highs[-1]
206
+ # 首个非零 lo 已界定舍入位置,不能用后来多算的 hi 或故障污染这个结果。
207
+ position = int(inexact[0])
208
+ hi, lo = highs[position + 1], lows[position]
209
+ next_position = position + 2
210
+ if next_position < len(reverse):
211
+ smaller = reverse[next_position]
212
+ if (lo < 0 and smaller < 0) or (lo > 0 and smaller > 0):
213
+ # 与下一更小 partial 同号时探测半偶修正;比较差值确保只跨正确的 ULP。
214
+ with np.errstate(over='ignore', under='ignore', invalid='ignore'):
215
+ doubled = np.multiply(lo, np.float64(2.0))
216
+ corrected = np.add(hi, doubled)
217
+ difference = np.subtract(corrected, hi)
218
+ if doubled == difference:
219
+ hi = corrected
220
+ return hi
221
+ finally:
222
+ # 原异常及TB仍交调用方;只断本层借入参数、视图和临时,不清外部帧。
223
+ self = reverse = highs = lows = inexact = None
224
+ hi = lo = smaller = doubled = corrected = difference = None
@@ -0,0 +1,148 @@
1
+ """独立按原序累计积分面积,用有界浮点误差项保留大数抵消后的低位。
2
+
3
+ 输入为 ReferenceIntegralTerms,输出为最终单位下的 IntegralSumResult 快照。
4
+ 每项使用标量精确拆分,保存非重叠误差项;结束时用标准库 fsum 归约误差项。
5
+ 任何原序中间溢出永久失败;不会靠后续抵消恢复,也不会按块先求和。
6
+ 状态最多 partial_limit 项,不保存整窗面积;容量不足明确抛错而不截断。
7
+ 纯核无文件副作用,状态及候选内存由外层 owner 在调用前申请预算。
8
+ """
9
+
10
+ # 参考实现独立依赖标准库,不调用数组归约、数组面积或数组对齐实现。
11
+ from math import fsum, isfinite
12
+ from .integral_sum import (IntegralSumResult, IntegralStateLimitError,
13
+ require_partial_limit, require_sum_finish)
14
+ from .integral_terms import ReferenceIntegralTerms
15
+ from .types import QualityFlag as Q
16
+
17
+
18
+ class ReferenceIntegralSum:
19
+ """持有有界非重叠误差项、有效面积计数及持久累计故障。
20
+
21
+ push 为原序状态驱动;finish 不清空状态,最终转换故障仅影响返回快照。
22
+ 调用方在任意推进异常后须放弃当前累计并清理,不能接着使用半段输入。
23
+ """
24
+
25
+ def __init__(self, partial_limit: int = 4096):
26
+ """建立空累计状态。参数: partial_limit 为硬容量。返回: None。异常: 非法容量。
27
+ """
28
+ # 初始零项没有面积证据;不能提前返回正常零值。
29
+ self._limit = require_partial_limit(partial_limit)
30
+ self._partials = []
31
+ self._valid_terms = 0
32
+ self._failed = False
33
+
34
+ @property
35
+ def valid_term_count(self) -> int:
36
+ """读取有效面积项数。参数: 无。返回: int。异常: 无。"""
37
+ return self._valid_terms # 与真实更新样本计数分开。
38
+
39
+ @property
40
+ def calculation_failed(self) -> bool:
41
+ """读取持久累计故障。参数: 无。返回: bool。异常: 无。"""
42
+ return self._failed # 后续抵消不会清除此状态。
43
+
44
+ @property
45
+ def partial_count(self) -> int:
46
+ """读取当前误差项数量。参数: 无。返回: int。异常: 无。"""
47
+ return len(self._partials) # 仅报告有界数值状态,不含输入面积。
48
+
49
+ def push(self, terms: ReferenceIntegralTerms) -> None:
50
+ """按原顺序推进有效面积,保留块间误差状态。
51
+
52
+ 参数: terms 为有限冻结面积块。返回: None。
53
+ 异常: TypeError 为后端不符;IntegralStateLimitError/MemoryError 为状态容量或分配失败。
54
+ """
55
+ try:
56
+ # 后端模型必须明确,不隐式把 NumPy 数据搬入标量参考核。
57
+ if not isinstance(terms, ReferenceIntegralTerms):
58
+ raise TypeError('参考归约需要ReferenceIntegralTerms')
59
+ # 原积分入口仍检查真实模型;同后端数值推进可用于其他已定义的原序浮点项。
60
+ self.push_values(terms.areas, terms.valid)
61
+ finally:
62
+ # 原异常及TB仍交调用方;只断本层借入参数、视图和临时,不清外部帧。
63
+ self = terms = None
64
+
65
+ def push_values(self, values: tuple[float, ...], valid: tuple[bool, ...]) -> None:
66
+ """累计有限原序浮点项,不要求调用方伪造积分事实。
67
+
68
+ 参数: values/valid 为同长冻结tuple;数值为有限原生float,未知位置必须存0。
69
+ 返回: None;使用与原积分入口相同的误差状态、容量及中间失败规则。
70
+ 异常: TypeError/ValueError 为列结构;容量、分配或取消原样传播。
71
+ 边界: 仅复用本参考后端数值算法;调用方负责量纲、覆盖与候选内存预算。
72
+ """
73
+ try:
74
+ # 完整门槛在推进前检查,错误输入不能留下半段新增状态。
75
+ if type(values) is not tuple or type(valid) is not tuple or len(values) != len(valid):
76
+ raise TypeError('原序参考归约需要同长tuple数值与掩码')
77
+ # 显式循环保持原any的逐项/短路顺序;取消时没有genexpr的隐藏zip保留整列。
78
+ for value, keep in zip(values, valid):
79
+ if (type(value) is not float or not isfinite(value) or type(keep) is not bool
80
+ or not keep and value != 0):
81
+ raise ValueError('参考归约需有限float及bool,未知位置存0')
82
+ # 保留原积分算法、原序、中间溢出和有界误差状态,不先归约块和。
83
+ for area, keep in zip(values, valid):
84
+ # 无效存储零不是数值证据;累计失败后仍统计后续有效项。
85
+ if not keep:
86
+ continue
87
+ if self._failed or area == 0:
88
+ self._valid_terms += 1
89
+ continue
90
+ # state_driver: 每项在原序状态上拆分,不把块和作为新的输入。
91
+ candidate, current = [], area
92
+ for partial in self._partials:
93
+ large, small = (current, partial) if abs(current) >= abs(partial) else (partial, current)
94
+ high = large + small
95
+ if not isfinite(high):
96
+ # 原序中途溢出保持失败,后续负项不能把已失败计算恢复正常。
97
+ self._failed = True
98
+ candidate = []
99
+ break
100
+ low = small - (high - large)
101
+ if low != 0:
102
+ candidate.append(low)
103
+ current = high
104
+ if self._failed:
105
+ self._partials = []
106
+ self._valid_terms += 1
107
+ continue
108
+ # 零和不占用误差项;容量检查后才安装该项及其计数。
109
+ if current != 0:
110
+ candidate.append(current)
111
+ if len(candidate) > self._limit:
112
+ raise IntegralStateLimitError('积分误差项超过容量,不能截断继续')
113
+ self._partials = candidate
114
+ self._valid_terms += 1
115
+ finally:
116
+ # 原异常及TB仍交调用方;只断本层借入参数、视图和临时,不清外部帧。
117
+ self = values = valid = candidate = None
118
+ current = area = partial = large = small = high = low = None
119
+ value = keep = None
120
+
121
+ def finish(self, unit: str, factor: float = 1.0) -> IntegralSumResult:
122
+ """归约有界误差项并只转换一次,保留原累计状态。
123
+
124
+ 参数: unit/factor 为外层核实的最终单位及倍率。返回: 冻结数值快照。
125
+ 异常: 非法配置或分配错误传播;数值溢出/转换下溢写入失败结果。
126
+ """
127
+ try:
128
+ # 配置先校验,空证据和持久溢出保持 None,不能回退为零。
129
+ unit, factor = require_sum_finish(unit, factor)
130
+ if self._failed:
131
+ return IntegralSumResult(None, unit, True, Q.NONFINITE, self._valid_terms)
132
+ if self._valid_terms == 0:
133
+ return IntegralSumResult(None, unit, False, Q.NONE, 0)
134
+ try:
135
+ # 仅归约有界误差项;独立标准库求和不调用 NumPy 内核。
136
+ total = fsum(self._partials)
137
+ except OverflowError:
138
+ return IntegralSumResult(None, unit, True, Q.NONFINITE, self._valid_terms)
139
+ value = total * factor
140
+ if not isfinite(value):
141
+ return IntegralSumResult(None, unit, True, Q.NONFINITE, self._valid_terms)
142
+ if total != 0 and value == 0:
143
+ return IntegralSumResult(None, unit, True, Q.PRECISION_LOSS, self._valid_terms)
144
+ # 零值规范为 +0.0;成功的结果不混入输入未知质量。
145
+ return IntegralSumResult(0.0 if value == 0 else value, unit, False, Q.NONE, self._valid_terms)
146
+ finally:
147
+ # 原异常及TB仍交调用方;只断本层借入参数、视图和临时,不清外部帧。
148
+ self = unit = factor = total = value = None
@@ -0,0 +1,119 @@
1
+ """声明尚未归约的ZOH积分项及其覆盖、质量和来源事实。
2
+
3
+ 输入来自有限CalculationSeries块,输出按原区间顺序保留面积和有效掩码。
4
+ 面积单位为原输入单位乘秒,尚未应用输出单位因子;未知存储0必须结合掩码。
5
+ 本模块只校验冻结协议,不执行数值积分、文件读取或资源分配策略。
6
+ 纯核输出在调用方CalculationBlock的workspace内消费,独立留存须另计预算。
7
+ 参考模型用原生tuple;数组模型在对应NumPy模块定义,通用模型不导入NumPy。
8
+ """
9
+
10
+ # 只共享typed事实与门槛,两数值核各自计算面积、有效性及覆盖。
11
+ from dataclasses import dataclass
12
+ from math import isfinite
13
+ from .calculations import CalculationSeries, CalculationDefinition, calculation_unit
14
+ from .calculations_reference import require_calculation
15
+ from .models import Interval, SourceRef
16
+ from .types import QualityFlag as Q
17
+ from .validation import require_text
18
+
19
+
20
+ @dataclass(frozen=True)
21
+ class IntegralFacts:
22
+ """保留当前块的原请求、实际范围、可核实覆盖与来源,不负责最终归约。
23
+
24
+ 只有value_valid_duration_ns表示有效面积时长;源诊断与计算质量完整OR。
25
+ 此处没有条件FALSE证据,不能由空项推断条件空选择为零。
26
+ """
27
+
28
+ spec: CalculationDefinition # 原请求窗口及最终部分结果政策,不按块覆盖重写。
29
+ actual_window: Interval | None # 当前块与请求交集,无交集保持None。
30
+ value_valid_duration_ns: int # 可核实面积时长,整数ns。
31
+ valid_sample_count: int # 半开当前块内实际更新且可核实的样本数。
32
+ value_unknown_ranges: tuple[Interval, ...] # 请求明细时的连续未知范围;未请求为空,不据此推断覆盖完整。
33
+ quality: Q # 来源及精度/非有限/下溢等计算诊断。
34
+ input_unit: str # 输入工程单位,面积尚未换为J/Ah等输出单位。
35
+ binding_identity: str # 当前真实表达式身份。
36
+ source_refs: tuple[SourceRef, ...] # 当前块完整真实定位,保留子类。
37
+
38
+ def __post_init__(self):
39
+ """校验事实结构和覆盖边界,不更正错误事实。
40
+
41
+ 参数: 无。返回: None。异常: TypeError/ValueError为类型或不可能覆盖。
42
+ """
43
+ # 原请求和实际交集需真实类型;覆盖计数的上界由实际纳秒跨度决定。
44
+ if not isinstance(self.spec, CalculationDefinition) or self.spec.operation != 'integral':
45
+ raise TypeError('积分项事实需要integral CalculationDefinition')
46
+ if self.actual_window is not None and not isinstance(self.actual_window, Interval):
47
+ raise TypeError('积分项实际范围需要Interval或None')
48
+ duration = 0 if self.actual_window is None else self.actual_window.end_ns - self.actual_window.start_ns
49
+ # 原生非负整数与真实时长上界,不把bool或浮点秒当ns。
50
+ if (type(self.value_valid_duration_ns) is not int or not 0 <= self.value_valid_duration_ns <= duration
51
+ or type(self.valid_sample_count) is not int or self.valid_sample_count < 0):
52
+ raise ValueError('积分项覆盖或样本数不合法')
53
+ # 未知范围是正区间,不能越过当前实际窗口或凭空建立观测。
54
+ if (type(self.value_unknown_ranges) is not tuple
55
+ or any(not isinstance(item, Interval) or item.start_ns >= item.end_ns
56
+ or self.actual_window is None or item.start_ns < self.actual_window.start_ns
57
+ or item.end_ns > self.actual_window.end_ns for item in self.value_unknown_ranges)):
58
+ raise ValueError('积分项未知范围必须位于实际窗口')
59
+ # 保留typed质量和完整来源子类,不把任意文字当来源事实。
60
+ if not isinstance(self.quality, Q) or type(self.source_refs) is not tuple or any(not isinstance(item, SourceRef) for item in self.source_refs):
61
+ raise TypeError('积分项需要typed质量与完整来源tuple')
62
+ # 来源文字不作为绑定证明,保留上层已验证身份和单位。
63
+ require_text(self.input_unit, 'integral.input_unit')
64
+ require_text(self.binding_identity, 'integral.binding_identity')
65
+
66
+
67
+ @dataclass(frozen=True)
68
+ class ReferenceIntegralTerms:
69
+ """保存标量参考的原序面积和显式有效掩码,不累计全窗口项。"""
70
+
71
+ areas: tuple[float, ...] # 每个原区间的面积,未观察/无效位置为0存储占位。
72
+ valid: tuple[bool, ...] # 只有True位置可参与后续数值归约。
73
+ facts: IntegralFacts # 当前块覆盖/原请求/诊断,不是最终CalculationResult。
74
+
75
+ def __post_init__(self):
76
+ """校验同长冻结列及有限面积,拒绝用无效非零占位。
77
+
78
+ 参数: 无。返回: None。异常: TypeError/ValueError为列/掩码/面积错误。
79
+ """
80
+ # 面积/掩码必须同长冻结;有效与未知都不允许非有限存储。
81
+ if type(self.areas) is not tuple or type(self.valid) is not tuple or len(self.areas) != len(self.valid) or not isinstance(self.facts, IntegralFacts):
82
+ raise TypeError('参考积分项需要同长tuple及IntegralFacts')
83
+ if any(type(value) is not float or not isfinite(value) or type(keep) is not bool
84
+ or not keep and value != 0 for value, keep in zip(self.areas, self.valid)):
85
+ raise ValueError('参考积分面积需有限float,未知使用掩码及0存储')
86
+
87
+
88
+ def require_valid_until(times, valid_until_ns):
89
+ """校验有限块的必要有效截止列。参数: 时间tuple/可选截止tuple。返回: None。异常: 类型/长度/范围错误。"""
90
+ if valid_until_ns is not None:
91
+ if type(valid_until_ns) is not tuple or len(valid_until_ns) != len(times):
92
+ raise TypeError('有效截止需要与驱动点同长的tuple')
93
+ for deadline in valid_until_ns:
94
+ if deadline is not None and (type(deadline) is not int or not -(1 << 63) <= deadline < (1 << 63)):
95
+ raise ValueError('有效截止需要int64实际时间或None')
96
+
97
+
98
+ def require_integral_terms(series, spec, *, step_ns=None, valid_until_ns=None):
99
+ """共享输入/单位/可表示时长门槛,不共享数值内核。
100
+
101
+ 参数: series为CalculationSeries,spec为原integral请求;step_ns为可选固定/DBC周期。
102
+ valid_until_ns为可选同长实际截止tuple,None项表示无额外有效截止。
103
+ 指定周期时每点必须为所选驱动的真实更新,不能把TTL/窗口边界当报文。
104
+ 调用方负责选驱动;本接口不接受尚未分配权重的混合时间轴。返回: None。
105
+ 异常: 类型/dtype/算子/条件/单位配置错误;OverflowError为int64不可表示跨度。
106
+ """
107
+ # 沿用原输入类型门槛,条件与其他算子需待各自独立归约契约实现。
108
+ require_calculation(series, spec, step_ns=step_ns)
109
+ # 截止仅用于当前块的必要有效性计算;None沿用原无额外截止路径。
110
+ require_valid_until(series.times_ns, valid_until_ns)
111
+ if spec.operation != 'integral' or series.conditions is not None:
112
+ raise ValueError('当前积分项只支持无选择条件的integral')
113
+ # 预先验证最终单位配置,但本层不把返回因子应用到每块。
114
+ calculation_unit(spec, series.unit)
115
+ # 只防守正交集跨度,不以绝对坐标转浮点,也不延长原观测。
116
+ left = max(spec.window.start_ns, series.observation.start_ns)
117
+ right = min(spec.window.end_ns, series.observation.end_ns)
118
+ if right - left > 2 ** 63 - 1:
119
+ raise OverflowError('积分区间时长不能超过正int64')