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,294 @@
1
+ """独立计算保持值积分、时间统计、TRUE时长和真实样本统计。
2
+
3
+ compute_reference接收CalculationSeries和CalculationDefinition,先裁剪观测与请求窗口,
4
+ 再独立计算面积、样本归约、覆盖时长及未知区间,输出CalculationResult。
5
+ 积分使用零阶保持:左端值乘以相邻区间裁剪后的时长。先对整数纳秒端点
6
+ 求差,再换算秒,不把较大的绝对时间先转成浮点数。
7
+ 时间极值包含裁剪边界的保持值,time_weighted_mean按有效选择时长加权;duration
8
+ 累计有效主BOOL为TRUE的区间。select_reference保留真实TRUE/UNKNOWN更新行。
9
+
10
+ 样本统计只取actual_value_updates为True的真实数值更新,不包含窗口或
11
+ 有效期到期边界,也不包括半开窗口末点。值有效与条件已知分别统计,
12
+ 条件FALSE是已知未选中,UNKNOWN(未知)不能视作FALSE或补成零。
13
+
14
+ 本实现只使用标准库与核心模型,数值和覆盖不调用NumPy。可共享输入
15
+ 检查、单位与结果分类,但归约独立实现。保留完整内存输入,不读写文件,
16
+ 不修改原数据或持有跨任务状态;本模块不提供流式内存预算保证。
17
+ """
18
+
19
+ # 独立标量有限性/稳定求和,不调用数组归约。
20
+ from math import fsum, isfinite
21
+ # 共享模型、单位与条件始终为FALSE时的空选择规则,不共享数值计算。
22
+ from .calculations import CalculationSeries, CalculationDefinition, make_calculation_result, calculation_unit
23
+ # 诊断区间与请求都保持精确纳秒。
24
+ from .models import Interval
25
+ # 独立参考定宽到float转换先检查精度。
26
+ from .numeric import ScalarValue, to_float_reference
27
+ # 未知/计算质量与正常零严格分开。
28
+ from .types import QualityFlag as Q, SignalDType as D, Truth
29
+ # 选择只共享冻结协议,标量筛选独立于NumPy掩码。
30
+ from .selection import SelectionRow, require_selection
31
+ from .record_intervals import clipped_record_seconds, require_record_step
32
+
33
+
34
+ def require_calculation(series, spec, *, step_ns=None):
35
+ """验证实际指标输入模型,不执行任何面积或统计。
36
+
37
+ 参数: series真实CalculationSeries,spec真实CalculationDefinition;step_ns可指定记录对周期,
38
+ 仅连续统计算子可用,输入必须是所选驱动真实更新。
39
+ 返回: None,模型内部完整轴和dtype已校验。
40
+ 异常: TypeError为无类型占位输入;ValueError为select标量执行或dtype不匹配。
41
+ """
42
+ # 后端共享typed协议,不复用被测数值。
43
+ if not isinstance(series, CalculationSeries) or not isinstance(spec, CalculationDefinition):
44
+ # 不猜dict内不完整状态。
45
+ raise TypeError('指标执行需CalculationSeries和CalculationDefinition')
46
+ # 行流具有独立返回类型,不能作为标量统计执行。
47
+ if spec.operation == 'select':
48
+ raise ValueError('select需选择行流入口')
49
+ # 布尔只用于TRUE时长;数值统计不接受布尔或枚举编码。
50
+ allowed = (D.BOOL,) if spec.operation == 'duration' else (D.INT64, D.UINT64, D.FLOAT64)
51
+ if series.values[0].dtype not in allowed:
52
+ raise ValueError('指标算子与输入dtype不匹配')
53
+ if step_ns is not None and spec.operation not in ('integral', 'duration', 'time_weighted_mean', 'min_time', 'max_time'):
54
+ raise ValueError('样本统计不接受记录对周期')
55
+ require_record_step(step_ns, series.actual_value_updates)
56
+
57
+
58
+ def select_reference(series, spec):
59
+ """按真实更新逐行返回TRUE与UNKNOWN选择结果,不累计输出列表。
60
+
61
+ 参数: series完整内存CalculationSeries;spec为select请求。
62
+ 返回: SelectionRow迭代器;UNKNOWN保留诊断,FALSE排除,窗口右端不输出。
63
+ 异常: 开始迭代时传播模型/算子/单位错误。
64
+ 流程: 遍历完整时间轴,只处理请求与观测交集内的真实目标依赖更新。
65
+ 合成边界与条件独自更新不产生行;无效值保持原质量,不填正常零。
66
+ """
67
+ # 生成器检查发生在消费时;只共享输入门槛。
68
+ require_selection(series, spec)
69
+ start = max(spec.window.start_ns, series.observation.start_ns)
70
+ end = min(spec.window.end_ns, series.observation.end_ns)
71
+ # 输入已经完整物化,输出每次只创建当前行。
72
+ for index, time in enumerate(series.times_ns):
73
+ # 不插入保持值行、不读取EOF之后的数据。
74
+ if not start <= time < end or not series.actual_value_updates[index]:
75
+ continue
76
+ # 未提供条件就是明确TRUE,未知条件单独诊断。
77
+ condition = series.conditions[index] if series.conditions is not None else ScalarValue(True, D.BOOL)
78
+ selection = Truth.UNKNOWN if not condition.valid else Truth.TRUE if condition.value else Truth.FALSE
79
+ if selection is Truth.FALSE:
80
+ continue
81
+ # 原值保持dtype/质量/标签与绑定,UNKNOWN不是自动选择成功。
82
+ value = series.values[index]
83
+ yield SelectionRow(time, value, selection, series.diagnostics[index] | value.quality | condition.quality,
84
+ series.binding_identity, series.source_refs, series.unit)
85
+
86
+
87
+ def compute_reference(series, spec, *, step_ns=None):
88
+ """独立计算请求窗口内的积分、样本/时间统计或BOOL TRUE时长。
89
+
90
+ 参数:
91
+ series: 完整CalculationSeries;数值统计需同一数值dtype,duration需BOOL。
92
+ spec: CalculationDefinition,给出左闭右开纳秒窗口、算子、输出单位和部分结果政策。
93
+ step_ns: 可选固定/DBC周期,仅用于所选驱动的真实记录对;按交集比例
94
+ 计算面积、时长和均值权重,不改变实际坐标或输出第二套时间。
95
+ 返回:
96
+ CalculationResult。未换单位的整数极值可保持精确整数;积分和样本平均
97
+ 返回浮点值;时间平均先规范化时长权重,duration输出秒。无法核实时
98
+ 为None,并保留覆盖、来源与质量原因;select使用独立行流入口。
99
+ 异常:
100
+ 输入模型或单位配置错误直接传播TypeError或ValueError。
101
+ 非有限结果、下溢或转换丢精度作为质量原因返回,不吞配置错误。
102
+ 流程:
103
+ 裁剪窗口后逐区间计算保持面积与三值选择交集,再按真实更新归约样本,
104
+ 最后应用一次输出单位转换并分类结果。正常零与未知占位分别处理。
105
+ 临时值和诊断列表只用于本次计算,不修改调用者的CalculationSeries。
106
+ """
107
+ # 配置错误不能吞成未知数据。
108
+ require_calculation(series, spec, step_ns=step_ns)
109
+ # 仅显式已知维度转换,保留有符号面积。
110
+ unit, factor = calculation_unit(spec, series.unit)
111
+ # 先求真实观测与请求交集,不外推末点/EOF。
112
+ start = max(spec.window.start_ns, series.observation.start_ns)
113
+ # 半开窗口右端实际观测不足必须裁剪。
114
+ end = min(spec.window.end_ns, series.observation.end_ns)
115
+ # 完全无交集与零域分别由政策解释。
116
+ actual = Interval(start, end) if start <= end else None
117
+ # 整数输入进入float面积/mean前先严格验证,不影响精确min/max。
118
+ values = [to_float_reference(value) if spec.operation in ('integral', 'sample_mean', 'time_weighted_mean') else value for value in series.values]
119
+ # 全部覆盖时长使用Python精确整数,不按样本数量估算。
120
+ value_duration, known_duration, selected_duration, selected_unknown = 0, 0, 0, 0
121
+ # 明确FALSE时长用来证明充分观测空选择,不靠sum空数组。
122
+ false_duration = 0
123
+ # 真实未知区间按原因类型分别记录,不改变原输入。
124
+ value_unknown, condition_unknown, areas = [], [], []
125
+ # 时间统计保留每个正裁剪区间的左端保持值和整数纳秒时长。
126
+ timed_values = []
127
+ # duration必须至少有可核实的主布尔值与TRUE选择区间,不能靠外部UNKNOWN补零。
128
+ duration_evidence = 0
129
+ # 原诊断与计算原因完整OR,不将KNOWN逻辑结果改成UNKNOWN。
130
+ quality = Q.NONE
131
+ # 独立参考逐区间求裁剪/面积/三值交集。
132
+ for index in range(len(series.times_ns)-1):
133
+ # 先裁剪精确整数端点,不先转float绝对坐标。
134
+ left, right = max(series.times_ns[index], start), min(series.times_ns[index+1], end)
135
+ # 窗口外或零区间不产生面积/未知时长。
136
+ if left >= right:
137
+ # 边界point不是额外周期。
138
+ continue
139
+ # 先整数差再换算秒,保留大绝对时间的小间隔。
140
+ duration = right - left
141
+ # 当前ZOH值与当前选择独立有效性。
142
+ value = values[index]
143
+ # 无条件表示明确选择全部,而不是未知选择。
144
+ condition = series.conditions[index] if series.conditions is not None else ScalarValue(True, D.BOOL)
145
+ # 原依赖、数值与条件质量均可追溯。
146
+ quality |= series.diagnostics[index] | value.quality | condition.quality
147
+ # 正常积分面积先计算,非有限/下溢不变成正常0。
148
+ area = None
149
+ # 只计算真实选择的有效值,FALSE不制造所选值缺失。
150
+ if spec.operation == 'integral' and value.valid and condition.valid and condition.value:
151
+ # 相对dt转秒,默认ZOH保持当前左端值。
152
+ seconds = (duration / 1_000_000_000 if step_ns is None else
153
+ clipped_record_seconds(series.times_ns[index], series.times_ns[index + 1],
154
+ spec.window, step_ns=step_ns))
155
+ area = value.value * seconds
156
+ # 有限输入乘积溢出和非零乘积下溢显式失效。
157
+ failure = Q.NONFINITE if not isfinite(area) else Q.PRECISION_LOSS if area == 0 and value.value != 0 else Q.NONE
158
+ # 不参与不可信面积的正常归约。
159
+ if failure != Q.NONE:
160
+ # 元数据值仍保留,只有计算输出置未知。
161
+ value = ScalarValue(value.value, D.FLOAT64, False, failure)
162
+ # 相同真实样本的积分可用性也更新。
163
+ values[index] = value
164
+ # 新原因不覆盖原诊断。
165
+ quality |= failure
166
+ # 值有效时长与条件真假独立统计。
167
+ if value.valid:
168
+ # 有效零值计入覆盖,区别于UNKNOWN。
169
+ value_duration += duration
170
+ else:
171
+ # 不跨窗口外范围保存未知。
172
+ value_unknown.append(Interval(left, right))
173
+ # 条件UNKNOWN独立保存;FALSE属于已知条件覆盖。
174
+ if condition.valid:
175
+ # 真假都可判断,不把FALSE当缺失。
176
+ known_duration += duration
177
+ # 只有明确FALSE累计空选择证据。
178
+ if not condition.value:
179
+ # 不凭无选中结果推测FALSE。
180
+ false_duration += duration
181
+ # 真与有效值交集才算选中时长。
182
+ elif value.valid:
183
+ # FALSE主值仍证明已知零时长;外部条件未知不提供该证据。
184
+ duration_evidence += duration
185
+ # 所选面积和时长分别保留。
186
+ selected_duration += duration if spec.operation != 'duration' or value.value else 0
187
+ # 其他样本算子没有连续面积。
188
+ if spec.operation == 'integral':
189
+ # 正常零面积合法进入归约。
190
+ areas.append(area)
191
+ # min/max_time包含裁剪左边界保持值,time_weighted_mean使用同一有效选择集合。
192
+ if spec.operation in ('min_time', 'max_time', 'time_weighted_mean'):
193
+ weight = (clipped_record_seconds(series.times_ns[index], series.times_ns[index + 1],
194
+ spec.window, step_ns=step_ns)
195
+ if spec.operation == 'time_weighted_mean' and step_ns is not None else duration)
196
+ timed_values.append((value.value, weight))
197
+ elif spec.operation == 'duration' and value.value and step_ns is not None:
198
+ areas.append(clipped_record_seconds(series.times_ns[index], series.times_ns[index + 1],
199
+ spec.window, step_ns=step_ns))
200
+ else:
201
+ # 所选值未知时strict/report有必要覆盖不足。
202
+ selected_unknown += duration
203
+ else:
204
+ # 条件未知不能当FALSE产生空选择零。
205
+ condition_unknown.append(Interval(left, right))
206
+ # 样本口径只计真实原依赖更新,不计TTL/裁剪合成边界。
207
+ selected_samples = []
208
+ # 参考逐原完整时间组统计当前值/条件,不跨域复制末点。
209
+ for index, time in enumerate(series.times_ns):
210
+ # 半开实际窗口内真实更新,末点排除。
211
+ if not start <= time < end or not series.actual_value_updates[index]:
212
+ # 不把窗口左端保持值伪装成真实样本。
213
+ continue
214
+ # 未知样本保留在诊断,只有有效/TRUE进入样本统计。
215
+ value = values[index]
216
+ # 无选择条件全部真实有效样本可用。
217
+ condition = series.conditions[index] if series.conditions is not None else ScalarValue(True, D.BOOL)
218
+ # 完整实际样本的质量也纳入诊断。
219
+ quality |= series.diagnostics[index] | value.quality | condition.quality
220
+ # 不将无效原数据存储占位0当正常样本。
221
+ if value.valid and condition.valid and condition.value and (spec.operation != 'duration' or value.value):
222
+ # 仅恢复当前原生逻辑数值,未改原输入。
223
+ selected_samples.append(value.value)
224
+ # 空归约保持None;仅明确all_false时按空选择规则处理。
225
+ result, failed = None, False
226
+ # 已选可核实面积或样本才计算正常值。
227
+ try:
228
+ # 面积与样本统计使用不同明确口径。
229
+ if spec.operation == 'integral' and areas:
230
+ # fsum减少标量累计舍入,但不替代NumPy归约。
231
+ result = fsum(areas)
232
+ # 精确整数极值无需浮点转换。
233
+ elif selected_samples and spec.operation == 'sample_minimum':
234
+ # 窗口裁剪不增加边界合成样本。
235
+ result = min(selected_samples)
236
+ # 同样保留uint64大整数精度。
237
+ elif selected_samples and spec.operation == 'sample_maximum':
238
+ # min/max不按时间加权。
239
+ result = max(selected_samples)
240
+ # mean明确样本算术平均,不叫模糊mean。
241
+ elif selected_samples and spec.operation == 'sample_mean':
242
+ # 有效样本数量作分母,不能用时长替代。
243
+ result = fsum(selected_samples) / len(selected_samples)
244
+ # 时间极值只计正时长保持区间,保留大整数的原生精度。
245
+ elif timed_values and spec.operation == 'min_time':
246
+ result = min(value for value, _ in timed_values)
247
+ elif timed_values and spec.operation == 'max_time':
248
+ result = max(value for value, _ in timed_values)
249
+ # 先规范化权重,避免平均值有限但值乘纳秒的中间面积溢出。
250
+ elif timed_values and spec.operation == 'time_weighted_mean':
251
+ denominator = selected_duration if step_ns is None else fsum(weight for _, weight in timed_values)
252
+ terms = [value * (duration / denominator) for value, duration in timed_values]
253
+ if any(not isfinite(term) for term in terms):
254
+ failed, quality = True, quality | Q.NONFINITE
255
+ elif any(term == 0 and value != 0 for term, (value, _) in zip(terms, timed_values)):
256
+ failed, quality = True, quality | Q.PRECISION_LOSS
257
+ else:
258
+ result = fsum(terms)
259
+ # 已知FALSE可核实为零;全未知没有候选值,不能返回正常零。
260
+ elif spec.operation == 'duration' and duration_evidence > 0:
261
+ result = selected_duration / 1_000_000_000 if step_ns is None else fsum(areas)
262
+ # 只把明确浮点累计溢出转计算质量,不吞接口错误。
263
+ except OverflowError:
264
+ # 无法核实总值不报正常Inf。
265
+ failed, quality = True, quality | Q.NONFINITE
266
+ # 输出转换仅一次;未转换整数极值保持整数。
267
+ if result is not None and not failed:
268
+ # 非单位1倍率转换整数前仍检查精度。
269
+ if factor != 1 and type(result) is int:
270
+ # 静态单位不会授权无声丢大整数精度。
271
+ converted = to_float_reference(ScalarValue(result, series.values[0].dtype))
272
+ # 失败输出null且原覆盖/来源诊断保留。
273
+ if not converted.valid:
274
+ # 明确PRECISION_LOSS,不截断原整数。
275
+ failed, quality = True, quality | converted.quality
276
+ else:
277
+ # 仅已证明正常整数才浮点换单位。
278
+ result = converted.value
279
+ # 不把失败结果继续乘因子。
280
+ if not failed:
281
+ # factor1保留整数,避免无必要cast。
282
+ original = result
283
+ # 数学单位转换,不改变符号方向。
284
+ result = result * factor if factor != 1 else result
285
+ # 非有限和非零下溢都不能报正常0。
286
+ if type(result) is float and (not isfinite(result) or result == 0 and original != 0):
287
+ # 明确归约/转换失败;不修改coverage来伪造通过。
288
+ failed, quality = True, quality | (Q.NONFINITE if not isfinite(result) else Q.PRECISION_LOSS)
289
+ # 完整全FALSE证明需要非零实际域,最后政策还检查请求充分覆盖。
290
+ all_false = series.conditions is not None and actual is not None and end > start and false_duration == end-start
291
+ # 共同政策仅包装各独立内核已计算的事实。
292
+ return make_calculation_result(spec, series, result, unit, actual, value_duration, known_duration, selected_duration,
293
+ selected_unknown, len(selected_samples), value_unknown, condition_unknown, quality,
294
+ all_false=all_false, calculation_failed=failed)
@@ -0,0 +1,182 @@
1
+ """把同轴的更新前点、连续后态及当前点求值结果组装成条件证据。
2
+
3
+ 输入为调用方已经求出的三个BOOL视图、整数纳秒轴,以及实际更新、真实无效更新、
4
+ 来源结束和会话terminal四种独立标志;输出冻结ConditionTick tuple。更新前点只用于
5
+ 证明真实更新是否导致UNKNOWN,不把其反事实诊断加入当前真实诊断。terminal强制
6
+ 连续状态UNKNOWN并叠加MISSING,当前点仍可保留真正末点的TRUE或FALSE。
7
+ 参考实现逐点使用标量结果,数组实现独立执行valid/quality与因果掩码运算,最后装箱。
8
+ 本模块不求值表达式、不读取来源、不访问state或时钟、不生成时间轴,也不更新检测器。
9
+ 数组临时列及输出规模随N增长,后续调用方必须先申请预算;本纯内核不是有限执行器。
10
+ NumPy只在数组入口加载,参考入口及模块导入保持标准库核心的依赖边界。
11
+ """
12
+
13
+ # 已求值结果和冻结证据共享协议;这里不调用任一表达式或保持数值核。
14
+ from .expression_reference import Evaluation
15
+ from .numeric import ScalarValue
16
+ from .temporal import ConditionTick
17
+ from .types import QualityFlag as Q, SignalDType as D, Truth
18
+ # 参考轴先要求原生int,再沿用已有int64端点检查,不进行t-1或差分运算。
19
+ from ..timebase.conversion import require_int64_ns
20
+
21
+
22
+ def _reference_truth(result):
23
+ """把已经验证的BOOL标量转为三值,未知存储占位不参加真假判断。
24
+
25
+ 参数: result当前Evaluation,调用入口已检查ScalarValue及BOOL声明。
26
+ 返回: Truth.TRUE、Truth.FALSE或Truth.UNKNOWN。
27
+ 异常: 无主动异常;调用者必须先完成typed结果校验。
28
+ """
29
+ # valid先于值解释,无效None/False等占位都只表示UNKNOWN。
30
+ if not result.value.valid:
31
+ return Truth.UNKNOWN
32
+ # 只有已验证的原生BOOL正常值进入二值分支,不对任意数值使用truthiness。
33
+ return Truth.TRUE if result.value.value else Truth.FALSE
34
+
35
+
36
+ def condition_ticks_reference(times, before, continuous, point, actual_updates,
37
+ invalid_updates, observation_ends, terminals):
38
+ """独立逐点组装完整条件证据,不从来源推断更新标志或补造时间。
39
+
40
+ 参数:
41
+ times: 原生int构成的tuple,单位ns,int64范围内严格递增。
42
+ before/continuous/point: 同长Evaluation tuple,三个视图的结果dtype均为BOOL。
43
+ actual_updates: 同长原生bool tuple,当前条件依赖中是否有真实更新。
44
+ invalid_updates: 同长原生bool tuple,实际选中的更新样本是否无效;
45
+ 不把保持值因TTL到期而无效算作真实无效更新,True必须同时有actual。
46
+ observation_ends: 同长原生bool tuple,条件依赖的来源是否在此刻结束观测。
47
+ terminals: 同长原生bool tuple,会话连续域是否结束;至多唯一末项,
48
+ 不要求同时存在来源EOF,普通批次全False与空输入均合法。
49
+ 返回:
50
+ tuple[ConditionTick, ...],保留连续/点质量、真实因果及当前依赖诊断。
51
+ 异常:
52
+ TypeError为容器、原生元素、模型或非BOOL;ValueError为长度、回退/重复时间、
53
+ 非末terminal或invalid缺actual;OverflowError为时间越界;MemoryError为分配失败。
54
+ 副作用:
55
+ 只创建当前有限输入的输出模型,不修改任何输入;申请预算由调用者负责。
56
+ """
57
+ # 明确固定tuple协议,不能从任意迭代器隐式收集全量来源。
58
+ columns = (before, continuous, point, actual_updates, invalid_updates, observation_ends, terminals)
59
+ if type(times) is not tuple or any(type(column) is not tuple for column in columns):
60
+ raise TypeError('参考条件证据需要时间、三视图及四标志tuple')
61
+ # 行数必须已经对齐,禁止zip静默截断或广播修补错位证据。
62
+ size = len(times)
63
+ if any(len(column) != size for column in columns):
64
+ raise ValueError('条件证据各输入长度必须相同')
65
+ # 时间不接受bool/NumPy标量;直接比较避免极值差分或t-1溢出。
66
+ previous = None
67
+ for time in times:
68
+ if type(time) is not int:
69
+ raise TypeError('参考条件证据时间需要原生int纳秒')
70
+ require_int64_ns(time)
71
+ if previous is not None and time <= previous:
72
+ raise ValueError('条件证据时间必须严格递增')
73
+ previous = time
74
+ # 四种标志不能用整数或字符串真假代替真实证据。
75
+ for column in (actual_updates, invalid_updates, observation_ends, terminals):
76
+ if any(type(value) is not bool for value in column):
77
+ raise TypeError('参考条件证据标志需要原生bool')
78
+ # 任一前置terminal都会违反唯一末组契约;普通批次允许完全没有terminal。
79
+ if any(terminals[index] for index in range(max(0, size - 1))):
80
+ raise ValueError('terminal只能唯一出现在输入末项')
81
+ if any(invalid and not actual for invalid, actual in zip(invalid_updates, actual_updates)):
82
+ raise ValueError('真实无效更新必须同时有actual_update')
83
+ # Evaluation自身不验证字段,先核对真实标量/诊断协议与BOOL声明再解释值。
84
+ for column in (before, continuous, point):
85
+ for result in column:
86
+ if (not isinstance(result, Evaluation) or not isinstance(result.value, ScalarValue)
87
+ or not isinstance(result.dependency_quality, Q)):
88
+ raise TypeError('参考三视图需要typed Evaluation/ScalarValue/QualityFlag')
89
+ if result.value.dtype is not D.BOOL:
90
+ raise TypeError('条件证据三视图必须为BOOL,数值不能隐式转bool')
91
+ # 参考逐点只使用当前三个结果;不调用数组实现或重新查询历史。
92
+ ticks = []
93
+ for index, time in enumerate(times):
94
+ old, current, observed = before[index], continuous[index], point[index]
95
+ old_state = _reference_truth(old)
96
+ state, point_state = _reference_truth(current), _reference_truth(observed)
97
+ # known更新前点、实际无效或新增结果质量位证明未知来自真实更新。
98
+ causal = (invalid_updates[index] or old_state is not Truth.UNKNOWN
99
+ or bool(observed.value.quality & ~old.value.quality))
100
+ actual_unknown = actual_updates[index] and point_state is Truth.UNKNOWN and causal
101
+ # 半开连续域在真实terminal结束,但不更改闭区间当前点的证据。
102
+ quality = current.value.quality
103
+ if terminals[index]:
104
+ state, quality = Truth.UNKNOWN, quality | Q.MISSING
105
+ # 仅当前连续与当前点的依赖原因属于真实诊断,before反事实原因排除。
106
+ diagnostic = current.dependency_quality | observed.dependency_quality
107
+ ticks.append(ConditionTick(time, state, quality, actual_updates[index],
108
+ observation_ends[index], terminals[index], point_state,
109
+ observed.value.quality, actual_unknown, diagnostic))
110
+ # 冻结输出供检测器按完整组推进;空输入自然得到空tuple。
111
+ return tuple(ticks)
112
+
113
+
114
+ def condition_ticks_numpy(times, before, continuous, point, actual_updates,
115
+ invalid_updates, observation_ends, terminals):
116
+ """独立按列构造因果与三值证据,最后仅恢复不可变ConditionTick模型。
117
+
118
+ 参数:
119
+ times: 精确ndarray,一维int64纳秒轴,严格递增。
120
+ before/continuous/point: 同轴ArrayEvaluation,NumericArray逻辑dtype为BOOL。
121
+ actual_updates: 精确ndarray,形状(N,)的bool真实更新列。
122
+ invalid_updates: 同形状bool列,实际选中更新样本无效;TTL不属于真实更新,
123
+ True必须有同时刻actual_updates=True。
124
+ observation_ends: 同形状bool列,条件依赖的来源观测结束标志。
125
+ terminals: 同形状bool列,会话连续域结束标志,至多唯一末项;
126
+ 不要求来源EOF同时成立,空轴及无terminal合法。
127
+ 返回:
128
+ tuple[ConditionTick, ...];数值/因果计算整列完成,装箱不调用参考实现。
129
+ 异常:
130
+ TypeError为数组布局、模型或非BOOL;ValueError为shape、非递增时间或矛盾标志;
131
+ MemoryError为列/输出分配失败。不隐式cast、不调用vectorize或标量参考数值核。
132
+ 内存与副作用:
133
+ 临时状态/quality/因果/诊断列均为(N,),不修改借用的输入;预算须由调用者先申请。
134
+ """
135
+ # 延迟加载数组依赖,使只导入/使用参考入口时不引入NumPy。
136
+ import numpy as np
137
+ from .expression_numpy import ArrayEvaluation
138
+ from .numeric_numpy import NumericArray
139
+ # 轴的物理布局明确,不用asarray/astype隐式转换任意输入。
140
+ if type(times) is not np.ndarray or times.ndim != 1 or times.dtype != np.dtype('int64'):
141
+ raise TypeError('数组条件证据时间需要一维精确int64 ndarray')
142
+ # 比较相邻坐标而非np.diff,INT64_MIN到INT64_MAX的合法递增不会回绕。
143
+ if np.any(times[1:] <= times[:-1]):
144
+ raise ValueError('条件证据时间必须严格递增')
145
+ # 四标志是同形状bool列;禁止广播或对象数组真值进入因果运算。
146
+ for column in (actual_updates, invalid_updates, observation_ends, terminals):
147
+ if type(column) is not np.ndarray or column.ndim != 1 or column.dtype != np.dtype('bool'):
148
+ raise TypeError('数组条件证据标志需要一维精确bool ndarray')
149
+ if column.shape != times.shape:
150
+ raise ValueError('条件证据标志与时间shape必须相同')
151
+ # 终点只能是当前输入末项,真实无效标志必须有同时刻实际更新。
152
+ if np.any(terminals[:-1]):
153
+ raise ValueError('terminal只能唯一出现在输入末项')
154
+ if np.any(invalid_updates & ~actual_updates):
155
+ raise ValueError('真实无效更新必须同时有actual_update')
156
+ # 三个静态视图复用已校验模型,仅检查本次BOOL和同轴布局;不复制或重新求值。
157
+ for result in (before, continuous, point):
158
+ if not isinstance(result, ArrayEvaluation) or not isinstance(result.value, NumericArray):
159
+ raise TypeError('数组三视图需要typed ArrayEvaluation/NumericArray')
160
+ if result.value.dtype is not D.BOOL:
161
+ raise TypeError('条件证据三视图必须为BOOL,数值不能隐式转bool')
162
+ if result.value.values.shape != times.shape or result.dependency_quality.shape != times.shape:
163
+ raise ValueError('条件证据三视图与时间shape必须相同')
164
+ # 因果来自实际invalid、更新前known或点结果新增质量位,整列掩码独立于参考。
165
+ causal = (invalid_updates | before.value.valid
166
+ | ((point.value.quality & ~before.value.quality) != 0))
167
+ actual_unknown = actual_updates & ~point.value.valid & causal
168
+ # 形状(N,)的整数状态列使用0/1/2对应TRUE/FALSE/UNKNOWN;无效False占位不决定真值。
169
+ continuous_states = np.where(continuous.value.valid, np.where(continuous.value.values, 0, 1), 2)
170
+ point_states = np.where(point.value.valid, np.where(point.value.values, 0, 1), 2)
171
+ # 只修改新建连续列,terminal不延长面积;借用的点结果与质量保持原样。
172
+ continuous_states[terminals] = 2
173
+ quality = continuous.value.quality.copy()
174
+ quality[terminals] |= np.uint16(Q.MISSING)
175
+ # 当前实际诊断整列合并,刻意排除更新前反事实诊断。
176
+ diagnostic = continuous.dependency_quality | point.dependency_quality
177
+ # 列运算已完成,只在末端把形状(N,)存储恢复为原生int/bool及枚举模型。
178
+ truths = (Truth.TRUE, Truth.FALSE, Truth.UNKNOWN)
179
+ return tuple(ConditionTick(int(time), truths[int(continuous_states[index])], Q(int(quality[index])),
180
+ bool(actual_updates[index]), bool(observation_ends[index]), bool(terminals[index]),
181
+ truths[int(point_states[index])], Q(int(point.value.quality[index])),
182
+ bool(actual_unknown[index]), Q(int(diagnostic[index]))) for index, time in enumerate(times))
@@ -0,0 +1,43 @@
1
+ """组合完整条件积分事实与已换单位数值,复用既有结果政策。
2
+
3
+ 只有正请求完整观测且条件全程已知FALSE才能证明空选择为0。
4
+ UNKNOWN、无实际观测和零窗口保持无法判断,部分值按report/strict政策交付。
5
+ 本模块只核对模型、单位和项数,不重复面积、求和或单位转换。
6
+ 输入须来自同一实际归约owner,纯结构不能证明该配对;分类需要复制有限
7
+ 未知诊断容器,外层必须提前预约元数据内存。本模块不读文件或改变输入。
8
+ """
9
+
10
+ # 共用的非数值分类不影响参考/NumPy面积及原序归约的独立性。
11
+ from .conditional_integral_terms import ConditionalIntegralFacts
12
+ from .integral_sum import IntegralSumResult
13
+ from .calculations import CalculationResult, calculation_unit, make_calculation_result
14
+
15
+
16
+ def make_conditional_integral_result(facts: ConditionalIntegralFacts, number: IntegralSumResult) -> CalculationResult:
17
+ """把完整覆盖与数值快照分类,保留TRUE/FALSE/UNKNOWN和原来源。
18
+
19
+ 参数: facts为整窗真实事实,number为同一owner最终换单位后的数值快照。
20
+ 返回: CalculationResult;原数值质量与输入原因完整合并,FALSE零由既有政策产生。
21
+ 异常: TypeError/ValueError为类型、单位或样本/面积项数矛盾;分配错误传播。
22
+ """
23
+ if not isinstance(facts, ConditionalIntegralFacts) or not isinstance(number, IntegralSumResult):
24
+ raise TypeError('条件积分分类需要ConditionalIntegralFacts和IntegralSumResult')
25
+ if not facts.ranges_retained:
26
+ raise ValueError('完整结果不能将未保留范围当成没有未知区间')
27
+ unit, _ = calculation_unit(facts.spec, facts.input_unit)
28
+ if number.unit != unit:
29
+ raise ValueError('条件积分数值单位与原请求不一致')
30
+ # 每项只对应正整数纳秒区间;样本不是TTL/条件单独更新,不能超过正常面积项数。
31
+ if (not facts.valid_sample_count <= number.valid_term_count <= facts.selected_duration_ns
32
+ or (number.valid_term_count == 0) != (facts.selected_duration_ns == 0)):
33
+ raise ValueError('条件积分样本、正常面积项数与选择时长不一致')
34
+ actual = facts.actual_window
35
+ span = 0 if actual is None else actual.end_ns - actual.start_ns
36
+ all_false = actual is not None and span > 0 and actual == facts.spec.window and facts.false_duration_ns == span
37
+ # facts本身带身份/来源;无需伪造完整CalculationSeries或把无条件事实改成条件事实。
38
+ return make_calculation_result(facts.spec, facts, number.value, number.unit, actual,
39
+ facts.value_valid_duration_ns, facts.condition_known_duration_ns,
40
+ facts.selected_duration_ns, facts.selected_value_unknown_duration_ns,
41
+ facts.valid_sample_count, facts.value_unknown_ranges, facts.condition_unknown_ranges,
42
+ facts.quality | number.quality, all_false=all_false,
43
+ calculation_failed=number.calculation_failed)