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,223 @@
1
+ """用真实NumPy掩码归约有限条件时间极值、规范化均值和主BOOL时长。
2
+
3
+ typed值及外BOOL为(N,)列,正区间为(N-1,)精确int64差与独立bool掩码。极值在原
4
+ dtype上归约;duration同时保留外TRUE主FALSE零证据;mean首遍仅确认值精度和
5
+ TRUE有效选择,次遍计算x*(dt/D),由本数组原序误差核推进。数值weight故障不改
6
+ 双覆盖,最终单位只finish转换一次。装箱、恢复未知和固定标量状态驱动不冒充
7
+ 数组数值核;不调用参考算法、不读来源、不存全轴,有限内存由外层owner预约。
8
+ """
9
+
10
+ # 原序推进复用独立数组误差状态,只共享结构/typed协议,不调用标量后端。
11
+ import numpy as np
12
+ from .conditional_time_reduction import ConditionalTimeCalculationFacts, require_conditional_time_series
13
+ from .integral_sum_numpy import NumpyIntegralSum
14
+ from .calculations import merge_ranges
15
+ from .models import Interval
16
+ from .numeric_numpy import DTYPES, NumericArray, to_float_numpy
17
+ from .time_reduction import TimeReductionResult, require_time_config, require_time_options
18
+ from .integral_terms import require_valid_until
19
+ from .types import QualityFlag as Q
20
+
21
+ from .time_reduction import MeanTimeBlock
22
+ from .mean_weights_numpy import normalized_mean_terms
23
+
24
+
25
+ class NumpyConditionalTimeReduction:
26
+ """保存单原dtype候选、整数时长与有界误差列,不存跨块输入数组。"""
27
+
28
+ def __init__(self, spec, input_unit, dtype, *, selected_duration_ns=None, partial_limit=4096,
29
+ step_ns=None, selected_weight_seconds=None):
30
+ """校验原配置并建立本数组后端固定状态。
31
+
32
+ 参数: spec/input_unit/dtype为原配置;selected_duration_ns为mean次遍全TRUE有效分母;
33
+ partial_limit为误差容量;step_ns选周期,周期均值次遍传selected_weight_seconds。返回: None。异常: 配置、数组分配错误传播。
34
+ """
35
+ # 静态门槛只检查明确配置,两个后端不共享后续数值或覆盖计算。
36
+ self._unit, self._factor = require_time_config(spec, input_unit, dtype, selected_duration_ns, partial_limit,
37
+ step_ns=step_ns, selected_weight_seconds=selected_weight_seconds)
38
+ self._spec, self._input_unit, self._dtype = spec, input_unit, dtype
39
+ self._step_ns = step_ns
40
+ self._denominator = selected_duration_ns if step_ns is None else selected_weight_seconds
41
+ # mean首遍不建立误差列,固定候选/计数不随块数增长。
42
+ self._identity = self._candidate = None
43
+ self._value_duration = self._selected_duration = self._terms = 0
44
+ self._numeric_quality = Q.NONE
45
+ self._sum = NumpyIntegralSum(partial_limit) if spec.operation == 'time_weighted_mean' and self._denominator is not None else None
46
+ self._weight_sum = NumpyIntegralSum(partial_limit) if step_ns is not None and spec.operation in ('duration', 'time_weighted_mean') else None
47
+
48
+ @property
49
+ def selected_weight_seconds(self):
50
+ """读取必要周期权重。参数: 无。返回: float或不适用None。异常: 权重求和故障。"""
51
+ if self._weight_sum is None:
52
+ return None
53
+ result = self._weight_sum.finish('s')
54
+ if result.calculation_failed:
55
+ raise OverflowError('条件周期权重累计失败')
56
+ return 0.0 if result.value is None else result.value
57
+
58
+ @property
59
+ def selected_duration_ns(self):
60
+ """读取累计已选时长。参数: 无。返回: 原生int纳秒。异常: 无。"""
61
+ return self._selected_duration # duration仅主TRUE;mean为规范化分母事实。
62
+
63
+ @property
64
+ def value_valid_duration_ns(self):
65
+ """读取累计值有效时长。参数: 无。返回: 原生int纳秒。异常: 无。"""
66
+ return self._value_duration # 独立于外条件FALSE/UNKNOWN。
67
+
68
+ def push(self, series, *, valid_until_ns=None, condition_valid_until_ns=None, retain_unknown_ranges=True, retain_mean_terms=False):
69
+ """计算有限块双覆盖并按原序推进本后端数值候选。
70
+
71
+ 参数: series为同dtype/原单位且显式BOOL条件的有限CalculationSeries。
72
+ valid_until_ns/condition_valid_until_ns分别截断实际有效期;
73
+ retain_unknown_ranges=False省去两类未知范围。
74
+ retain_mean_terms仅均值首遍返回MeanTimeBlock,其他调用返回事实。
75
+ 返回: ConditionalTimeCalculationFacts;权重故障仅改变数值失败状态,不改输入覆盖。
76
+ 异常: 结构、身份、容量、分配或取消错误传播,外层异常后只能清理owner。
77
+ 内存: 所有新输入/掩码列形状N或N-1,仅当前push存活,不修改调用者输入。
78
+ """
79
+ # 当前输入先核对显式条件/单位/dtype和交集,跨块原值绑定不能变化。
80
+ actual = require_conditional_time_series(series, self._spec, self._input_unit, self._dtype)
81
+ require_time_options(series, self._step_ns, valid_until_ns, retain_unknown_ranges)
82
+ require_valid_until(series.times_ns, condition_valid_until_ns)
83
+ if type(retain_mean_terms) is not bool or retain_mean_terms and (self._spec.operation != 'time_weighted_mean' or self._denominator is not None):
84
+ raise ValueError('仅均值首遍可请求必要回读项')
85
+ if self._identity is not None and self._identity != series.binding_identity:
86
+ raise ValueError('条件时间归约不能跨绑定身份累计')
87
+ self._identity = series.binding_identity
88
+ # typed装箱仅恢复协议,值精度转换只对mean执行,极值保持int64/uint64原数组。
89
+ column = NumericArray(self._dtype,
90
+ np.array([value.value if value.valid else 0 for value in series.values], dtype=DTYPES[self._dtype]),
91
+ np.array([value.valid for value in series.values], dtype=bool),
92
+ np.array([int(value.quality) for value in series.values], dtype=np.uint16))
93
+ values = to_float_numpy(column) if self._spec.operation == 'time_weighted_mean' else column
94
+ known = np.array([condition.valid for condition in series.conditions], dtype=bool)
95
+ truth = np.array([condition.value if condition.valid else False for condition in series.conditions], dtype=bool)
96
+ condition_quality = np.array([int(condition.quality) for condition in series.conditions], dtype=np.uint16)
97
+ times = np.array(series.times_ns, dtype=np.int64)
98
+ start, end = (actual.start_ns, actual.end_ns) if actual is not None else (0, 0)
99
+ # 整数端点先裁剪,只对正区间做差,域外反序不发生int64减法wrap。
100
+ left, right = np.maximum(times[:-1], np.int64(start)), np.minimum(times[1:], np.int64(end))
101
+ observed = right > left
102
+ deadlines = np.array([2**63-1 if item is None else item for item in valid_until_ns], dtype=np.int64) if valid_until_ns is not None else None
103
+ condition_deadlines = np.array([2**63-1 if item is None else item for item in condition_valid_until_ns], dtype=np.int64) if condition_valid_until_ns is not None else None
104
+ value_end = right.copy() if deadlines is None else np.minimum(right, deadlines[:-1])
105
+ condition_end = right.copy() if condition_deadlines is None else np.minimum(right, condition_deadlines[:-1])
106
+ value_end = np.maximum(left, np.where(values.valid[:-1], value_end, left))
107
+ condition_end = np.maximum(left, np.where(known[:-1], condition_end, left))
108
+ # 三种交集独立做安全整数差,原始记录对仍留作周期权重分母。
109
+ value_dt = np.zeros(len(left), dtype=np.int64)
110
+ condition_dt = np.zeros(len(left), dtype=np.int64)
111
+ durations = np.zeros(len(left), dtype=np.int64)
112
+ np.subtract(value_end, left, out=value_dt, where=observed)
113
+ np.subtract(condition_end, left, out=condition_dt, where=observed)
114
+ np.subtract(np.minimum(value_end, condition_end), left, out=durations, where=observed)
115
+ usable = observed & (durations > 0) & truth[:-1]
116
+ selected = usable & values.values[:-1] if self._spec.operation == 'duration' else usable
117
+ selected_false_mask = usable & ~values.values[:-1] if self._spec.operation == 'duration' else np.zeros(len(left), dtype=bool)
118
+ # 所有非负dt归约不超过已检查int64实际跨度,跨块由Python整数累加。
119
+ value_duration = int(np.sum(value_dt, dtype=np.int64))
120
+ known_duration = int(np.sum(condition_dt, dtype=np.int64))
121
+ selected_duration = int(np.sum(durations, where=selected, dtype=np.int64))
122
+ selected_unknown = int(np.sum(condition_dt - durations, where=truth[:-1], dtype=np.int64))
123
+ false_duration = int(np.sum(condition_dt, where=~truth[:-1], dtype=np.int64))
124
+ selected_false = int(np.sum(durations, where=selected_false_mask, dtype=np.int64))
125
+ terms = int(np.count_nonzero(usable))
126
+ seconds = None
127
+ if self._weight_sum is not None:
128
+ seconds = durations[selected].astype(np.float64)
129
+ seconds /= np.diff(times)[selected]
130
+ seconds *= self._step_ns / 1_000_000_000
131
+ keep_weights = np.ones(len(seconds), dtype=bool)
132
+ seconds.setflags(write=False)
133
+ keep_weights.setflags(write=False)
134
+ self._weight_sum.push_values(seconds, keep_weights)
135
+ # 半开原值真实更新且外TRUE才成为样本;duration另要求主TRUE,条件更新不计。
136
+ actual_samples = (times >= start) & (times < end) & np.array(series.actual_value_updates, dtype=bool)
137
+ samples = actual_samples & values.valid & known & truth
138
+ if deadlines is not None:
139
+ samples &= times < deadlines
140
+ if condition_deadlines is not None:
141
+ samples &= times < condition_deadlines
142
+ if self._spec.operation == 'duration':
143
+ samples &= values.values
144
+ relevant = actual_samples.copy()
145
+ relevant[:-1] |= observed
146
+ diagnostics = np.array([int(flag) for flag in series.diagnostics], dtype=np.uint16) | values.quality | condition_quality
147
+ quality = Q(int(np.bitwise_or.reduce(diagnostics, where=relevant, initial=0)))
148
+ # 元数据循环只恢复两种未知Interval,覆盖和数值运算均已由真实数组完成。
149
+ if np.any(observed & ((values.valid[:-1] & (value_end < right)) | (known[:-1] & (condition_end < right)))):
150
+ quality |= Q.STALE
151
+ value_unknown = (tuple(Interval(int(value_end[index]), int(right[index])) for index in np.flatnonzero(observed & (value_end < right)))
152
+ if retain_unknown_ranges else ())
153
+ condition_unknown = (tuple(Interval(int(condition_end[index]), int(right[index])) for index in np.flatnonzero(observed & (condition_end < right)))
154
+ if retain_unknown_ranges else ())
155
+ if self._spec.operation in ('min_time', 'max_time') and terms:
156
+ # 当前块原dtype极值,跨块仅比较一个同dtype候选,避免uint64精度舍入。
157
+ candidate = (np.min if self._spec.operation == 'min_time' else np.max)(values.values[:-1][usable])
158
+ if self._candidate is not None:
159
+ previous = DTYPES[self._dtype].type(self._candidate)
160
+ candidate = (np.minimum if self._spec.operation == 'min_time' else np.maximum)(previous, candidate)
161
+ self._candidate = candidate.item()
162
+ elif self._spec.operation == 'time_weighted_mean' and self._denominator is not None:
163
+ chosen = values.values[:-1][usable]
164
+ measures = durations[usable].astype(np.float64) if self._step_ns is None else seconds
165
+ weighted, weight_quality = normalized_mean_terms(chosen, measures, self._denominator)
166
+ self._numeric_quality |= weight_quality
167
+ if self._numeric_quality == Q.NONE:
168
+ keep = np.ones(len(weighted), dtype=bool)
169
+ keep.setflags(write=False)
170
+ self._sum.push_values(weighted, keep)
171
+ self._value_duration += value_duration
172
+ self._selected_duration += selected_duration
173
+ self._terms += terms
174
+ facts = ConditionalTimeCalculationFacts(self._spec, actual, value_duration, known_duration, selected_duration,
175
+ selected_unknown, false_duration, selected_false, int(np.count_nonzero(samples)), merge_ranges(value_unknown),
176
+ merge_ranges(condition_unknown), quality, self._input_unit, self._dtype, series.binding_identity, series.source_refs, retain_unknown_ranges)
177
+ if retain_mean_terms:
178
+ selected_values = values.values[:-1][usable]
179
+ selected_weights = durations[usable].copy() if self._step_ns is None else seconds
180
+ selected_values.setflags(write=False)
181
+ selected_weights.setflags(write=False)
182
+ return MeanTimeBlock(facts, selected_values, selected_weights)
183
+ return facts
184
+
185
+ def finish(self):
186
+ """生成原序统计快照并做一次最终换单位,双覆盖由外层分类。
187
+
188
+ 参数: 无。返回: 既有TimeReductionResult。异常: mean首遍RuntimeError、次遍分母不符ValueError;
189
+ 配置/分配/取消传播,数值溢出和非零下溢返回计算失败。
190
+ """
191
+ # mean首遍禁交付数值;次遍需要实际TRUE有效累计时长与全窗D相等。
192
+ if self._spec.operation == 'time_weighted_mean':
193
+ if self._denominator is None:
194
+ raise RuntimeError('条件时间均值首遍只收事实,不能生成数值')
195
+ measured = self._selected_duration if self._step_ns is None else self.selected_weight_seconds
196
+ if measured != self._denominator:
197
+ raise ValueError('条件均值次遍选择时长与全窗分母不同')
198
+ if self._numeric_quality != Q.NONE:
199
+ return TimeReductionResult(None, self._unit, True, self._numeric_quality, self._terms)
200
+ number = self._sum.finish(self._unit, self._factor)
201
+ return TimeReductionResult(number.value, number.unit, number.calculation_failed, number.quality, self._terms)
202
+ # 没有正区间数值证据不补0;全外FALSE空0由外层完整请求分类证明。
203
+ if self._terms == 0:
204
+ return TimeReductionResult(None, self._unit, False, Q.NONE, 0)
205
+ # 主FALSE为有效duration项而时长0;极值未换单位时保持原生精确整数。
206
+ value = ((float(np.divide(np.float64(self._selected_duration), np.float64(1_000_000_000)))
207
+ if self._step_ns is None else self.selected_weight_seconds)
208
+ if self._spec.operation == 'duration' else self._candidate)
209
+ quality = Q.NONE
210
+ if self._factor != 1 and type(value) is int:
211
+ converted = to_float_numpy(NumericArray(self._dtype,
212
+ np.array([value], dtype=DTYPES[self._dtype]), np.array([True]), np.array([0], dtype=np.uint16)))
213
+ if not converted.valid[0]:
214
+ quality |= Q(int(converted.quality[0]))
215
+ else:
216
+ value = converted.values[0].item()
217
+ if quality == Q.NONE and self._factor != 1:
218
+ original = value
219
+ with np.errstate(over='ignore', under='ignore', invalid='ignore'):
220
+ value = np.multiply(np.float64(value), np.float64(self._factor)).item()
221
+ if not np.isfinite(value) or value == 0 and original != 0:
222
+ quality |= Q.NONFINITE if not np.isfinite(value) else Q.PRECISION_LOSS
223
+ return TimeReductionResult(None if quality != Q.NONE else value, self._unit, quality != Q.NONE, quality, self._terms)
@@ -0,0 +1,213 @@
1
+ """独立标量归约有限条件极值、规范化时间均值和主BOOL持续时间。
2
+
3
+ push保留值与外条件各自的覆盖、真实更新、未知及完整来源;跨块仅保存候选与时长。
4
+ min/max保留原整数,duration累计外TRUE主TRUE的精确ns并保留主FALSE零证据。
5
+ mean首遍只查有效/选择事实,次遍以全窗TRUE有效时长D计算x*(dt/D),不先算面积。
6
+ 权重及原序求和故障与输入覆盖分开;单位仅finish转换一次。纯核不读来源、不预约
7
+ 预算或保存全轴,有限临时列及误差项须由外层owner计费,推进异常后须放弃状态。
8
+ """
9
+
10
+ # 仅使用标量及同后端原序误差核,不调用数组面积、对齐或归约。
11
+ from math import isfinite
12
+ from .conditional_time_reduction import ConditionalTimeCalculationFacts, require_conditional_time_series
13
+ from .integral_sum_reference import ReferenceIntegralSum
14
+ from .calculations import merge_ranges
15
+ from .models import Interval
16
+ from .numeric import ScalarValue, to_float_reference
17
+ from .time_reduction import TimeReductionResult, require_time_config, require_time_options
18
+ from .integral_terms import require_valid_until
19
+ from .record_intervals import clipped_record_seconds
20
+ from .types import QualityFlag as Q
21
+
22
+ from .time_reduction import MeanTimeBlock
23
+ from .mean_weights_reference import normalized_mean_terms
24
+
25
+
26
+ class ReferenceConditionalTimeReduction:
27
+ """保存一个原dtype候选、精确时长与有界误差项,mean两遍实例不能混用。"""
28
+
29
+ def __init__(self, spec, input_unit, dtype, *, selected_duration_ns=None, partial_limit=4096,
30
+ step_ns=None, selected_weight_seconds=None):
31
+ """验证原配置并建立本后端有限状态。
32
+
33
+ 参数: spec/input_unit/dtype为原配置;selected_duration_ns为mean次遍全TRUE有效分母;
34
+ partial_limit为误差项容量;step_ns选周期,周期均值次遍传selected_weight_seconds。返回: None。异常: 配置或分配错误传播。
35
+ """
36
+ # 共享的静态门槛先核对算子、类型、单位及mean分母,不执行数值计算。
37
+ self._unit, self._factor = require_time_config(spec, input_unit, dtype, selected_duration_ns, partial_limit,
38
+ step_ns=step_ns, selected_weight_seconds=selected_weight_seconds)
39
+ self._spec, self._input_unit, self._dtype = spec, input_unit, dtype
40
+ self._step_ns = step_ns
41
+ self._denominator = selected_duration_ns if step_ns is None else selected_weight_seconds
42
+ # 固定状态不随块数增加;mean首遍不建立数值误差状态。
43
+ self._identity = self._candidate = None
44
+ self._value_duration = self._selected_duration = self._terms = 0
45
+ self._numeric_quality = Q.NONE
46
+ self._sum = ReferenceIntegralSum(partial_limit) if spec.operation == 'time_weighted_mean' and self._denominator is not None else None
47
+ self._weight_sum = ReferenceIntegralSum(partial_limit) if step_ns is not None and spec.operation in ('duration', 'time_weighted_mean') else None
48
+
49
+ @property
50
+ def selected_weight_seconds(self):
51
+ """读取必要周期权重。参数: 无。返回: float或不适用None。异常: 权重求和故障。"""
52
+ if self._weight_sum is None:
53
+ return None
54
+ result = self._weight_sum.finish('s')
55
+ if result.calculation_failed:
56
+ raise OverflowError('条件周期权重累计失败')
57
+ return 0.0 if result.value is None else result.value
58
+
59
+ @property
60
+ def selected_duration_ns(self):
61
+ """读取累计选择时长。参数: 无。返回: 原生int纳秒。异常: 无。"""
62
+ return self._selected_duration # duration仅主TRUE;mean为全TRUE有效分母事实。
63
+
64
+ @property
65
+ def value_valid_duration_ns(self):
66
+ """读取累计值有效时长。参数: 无。返回: 原生int纳秒。异常: 无。"""
67
+ return self._value_duration # 外FALSE/UNKNOWN不改变原值可用性。
68
+
69
+ def push(self, series, *, valid_until_ns=None, condition_valid_until_ns=None, retain_unknown_ranges=True, retain_mean_terms=False):
70
+ """独立消费有限联合块,返回完整双覆盖并推进原单位候选。
71
+
72
+ 参数: series为同单位/dtype且有显式BOOL条件的有限CalculationSeries。
73
+ valid_until_ns/condition_valid_until_ns分别截断实际有效期;
74
+ retain_unknown_ranges=False省去两类未知范围。
75
+ retain_mean_terms仅均值首遍返回MeanTimeBlock,其他调用返回事实。
76
+ 返回: ConditionalTimeCalculationFacts;mean权重故障只记数值质量,不改覆盖。
77
+ 异常: 结构、身份、容量或分配错误传播;外层不得继续使用异常前缀状态。
78
+ """
79
+ # 输入先过明确条件/单位/dtype与交集门槛,跨块不能更换原值绑定身份。
80
+ actual = require_conditional_time_series(series, self._spec, self._input_unit, self._dtype)
81
+ require_time_options(series, self._step_ns, valid_until_ns, retain_unknown_ranges)
82
+ require_valid_until(series.times_ns, condition_valid_until_ns)
83
+ if type(retain_mean_terms) is not bool or retain_mean_terms and (self._spec.operation != 'time_weighted_mean' or self._denominator is not None):
84
+ raise ValueError('仅均值首遍可请求必要回读项')
85
+ if self._identity is not None and self._identity != series.binding_identity:
86
+ raise ValueError('条件时间归约不能跨绑定身份累计')
87
+ self._identity = series.binding_identity
88
+ # 只有mean检查to_float精度;极值和主BOOL不被提升成浮点类型。
89
+ values = tuple(to_float_reference(value) for value in series.values) if self._spec.operation == 'time_weighted_mean' else series.values
90
+ start, end = (actual.start_ns, actual.end_ns) if actual is not None else (0, 0)
91
+ value_duration = known_duration = selected_duration = selected_unknown = false_duration = selected_false = samples = terms = 0
92
+ value_unknown, condition_unknown, weighted = [], [], []
93
+ period_weights = [] if self._weight_sum is not None else None
94
+ mean_values = [] if self._spec.operation == 'time_weighted_mean' and (self._denominator is not None or retain_mean_terms) else None
95
+ mean_weights = [] if mean_values is not None else None
96
+ quality, weight_quality = Q.NONE, Q.NONE
97
+ # 每个正区间先核对双覆盖,再决定TRUE有效数值是否推进,末点没有区间。
98
+ for index in range(len(series.times_ns) - 1):
99
+ left, right = max(series.times_ns[index], start), min(series.times_ns[index+1], end)
100
+ if left >= right:
101
+ continue
102
+ value, condition = values[index], series.conditions[index]
103
+ quality |= series.diagnostics[index] | value.quality | condition.quality
104
+ deadline = None if valid_until_ns is None else valid_until_ns[index]
105
+ condition_deadline = None if condition_valid_until_ns is None else condition_valid_until_ns[index]
106
+ value_end = max(left, min(right, deadline)) if deadline is not None else right
107
+ condition_end = max(left, min(right, condition_deadline)) if condition_deadline is not None else right
108
+ value_end = value_end if value.valid else left
109
+ condition_end = condition_end if condition.valid else left
110
+ value_duration += value_end - left
111
+ known_duration += condition_end - left
112
+ if value_end < right:
113
+ if retain_unknown_ranges:
114
+ value_unknown.append(Interval(value_end, right))
115
+ if value.valid:
116
+ quality |= Q.STALE
117
+ if condition_end < right:
118
+ if retain_unknown_ranges:
119
+ condition_unknown.append(Interval(condition_end, right))
120
+ if condition.valid:
121
+ quality |= Q.STALE
122
+ if condition_end <= left:
123
+ continue
124
+ if not condition.value:
125
+ false_duration += condition_end - left
126
+ continue
127
+ chosen_end = min(value_end, condition_end)
128
+ selected_unknown += condition_end - chosen_end
129
+ if chosen_end <= left:
130
+ continue
131
+ dt = chosen_end - left
132
+ # 外TRUE主FALSE仍是duration正常0证据,但不增加已选时长与真实样本。
133
+ terms += 1
134
+ if self._spec.operation == 'duration' and not value.value:
135
+ selected_false += dt
136
+ else:
137
+ selected_duration += dt
138
+ measure = dt
139
+ if period_weights is not None and (self._spec.operation != 'duration' or value.value):
140
+ measure = clipped_record_seconds(series.times_ns[index], series.times_ns[index+1],
141
+ Interval(left, chosen_end), step_ns=self._step_ns)
142
+ period_weights.append(measure)
143
+ if self._spec.operation in ('min_time', 'max_time'):
144
+ # 每次只比较一个原dtype候选,跨块不转float,保留大整数的精确极值。
145
+ self._candidate = value.value if self._candidate is None else (min if self._spec.operation == 'min_time' else max)(self._candidate, value.value)
146
+ elif mean_values is not None:
147
+ mean_values.append(value.value)
148
+ mean_weights.append(measure)
149
+ # 原值真实更新才计样本,外条件TRUE且duration另须主TRUE;右端与条件更新不计。
150
+ for index, time in enumerate(series.times_ns):
151
+ if not start <= time < end or not series.actual_value_updates[index]:
152
+ continue
153
+ value, condition = values[index], series.conditions[index]
154
+ quality |= series.diagnostics[index] | value.quality | condition.quality
155
+ deadline = None if valid_until_ns is None else valid_until_ns[index]
156
+ condition_deadline = None if condition_valid_until_ns is None else condition_valid_until_ns[index]
157
+ if (value.valid and condition.valid and condition.value
158
+ and (deadline is None or time < deadline) and (condition_deadline is None or time < condition_deadline)
159
+ and (self._spec.operation != 'duration' or value.value)):
160
+ samples += 1
161
+ # 任意权重故障使整次数值失败,不清除前述可核实覆盖;正常权重按原序推进。
162
+ if self._denominator is not None:
163
+ weighted, weight_quality = normalized_mean_terms(mean_values, mean_weights, self._denominator)
164
+ self._numeric_quality |= weight_quality
165
+ if period_weights is not None:
166
+ self._weight_sum.push_values(tuple(period_weights), (True,)*len(period_weights))
167
+ if self._sum is not None and self._numeric_quality == Q.NONE:
168
+ self._sum.push_values(tuple(weighted), (True,)*len(weighted))
169
+ self._value_duration += value_duration
170
+ self._selected_duration += selected_duration
171
+ self._terms += terms
172
+ facts = ConditionalTimeCalculationFacts(self._spec, actual, value_duration, known_duration, selected_duration,
173
+ selected_unknown, false_duration, selected_false, samples, merge_ranges(value_unknown),
174
+ merge_ranges(condition_unknown), quality, self._input_unit, self._dtype, series.binding_identity, series.source_refs, retain_unknown_ranges)
175
+ return MeanTimeBlock(facts, tuple(mean_values), tuple(mean_weights)) if retain_mean_terms else facts
176
+
177
+ def finish(self):
178
+ """生成数值快照并只转换一次,覆盖与全外FALSE分类由外层处理。
179
+
180
+ 参数: 无。返回: 既有TimeReductionResult。异常: mean首遍RuntimeError、次遍分母不符ValueError;
181
+ 配置/分配错误传播,数值故障保留None和质量。
182
+ """
183
+ # mean首遍没有候选;次遍只有累计选择时长与原确认分母一致才能交付。
184
+ if self._spec.operation == 'time_weighted_mean':
185
+ if self._denominator is None:
186
+ raise RuntimeError('条件时间均值首遍只收事实,不能生成数值')
187
+ measured = self._selected_duration if self._step_ns is None else self.selected_weight_seconds
188
+ if measured != self._denominator:
189
+ raise ValueError('条件均值次遍选择时长与全窗分母不同')
190
+ if self._numeric_quality != Q.NONE:
191
+ return TimeReductionResult(None, self._unit, True, self._numeric_quality, self._terms)
192
+ # 同后端原序核负责一次最终单位转换,不在映射结果时再次乘因子。
193
+ number = self._sum.finish(self._unit, self._factor)
194
+ return TimeReductionResult(number.value, number.unit, number.calculation_failed, number.quality, self._terms)
195
+ # 外FALSE/UNKNOWN或值全未知没有有效项,空证据分类由外层负责。
196
+ if self._terms == 0:
197
+ return TimeReductionResult(None, self._unit, False, Q.NONE, 0)
198
+ value = ((self._selected_duration / 1_000_000_000 if self._step_ns is None else self.selected_weight_seconds)
199
+ if self._spec.operation == 'duration' else self._candidate)
200
+ quality = Q.NONE
201
+ # 极值factor=1保留精确整数;显式换单位先检查整数浮点可表示性。
202
+ if self._factor != 1 and type(value) is int:
203
+ converted = to_float_reference(ScalarValue(value, self._dtype))
204
+ if not converted.valid:
205
+ quality |= converted.quality
206
+ else:
207
+ value = converted.value
208
+ if quality == Q.NONE:
209
+ original = value
210
+ value = value * self._factor if self._factor != 1 else value
211
+ if type(value) is float and (not isfinite(value) or value == 0 and original != 0):
212
+ quality |= Q.NONFINITE if not isfinite(value) else Q.PRECISION_LOSS
213
+ return TimeReductionResult(None if quality != Q.NONE else value, self._unit, quality != Q.NONE, quality, self._terms)
@@ -0,0 +1,192 @@
1
+ """在读取数据之前检查来源、信号和派生名称声明,生成不可变的声明绑定。
2
+
3
+ 输入为来源定位、时基、请求范围、信号定义和同步证据;输出DeclarationBindings
4
+ 及其SHA-256身份。函数只检查配置关系,不证明文件、DBC字段或实际观测存在,
5
+ 也不创建虚拟样本。静态表达式检查可使用这些声明;实际解释器仍需包含内存数据
6
+ 的SignalBindings。本模块只依赖标准库和核心模型,没有文件操作、样本计算、
7
+ 全局注册或执行计划缓存。
8
+ """
9
+
10
+ # 冻结声明并为规范身份计算稳定摘要。
11
+ from dataclasses import dataclass, field
12
+ from hashlib import sha256
13
+ # 复用已验契约与同步证据,不放宽实际绑定校验。
14
+ from .binding import SignalDefinition, SynchronizationEvidence, _identity
15
+ # 时基和范围已经独立验证,不借空SessionSpec制造实际来源。
16
+ from .models import Interval, TimebaseSpec
17
+ from .types import TimeType
18
+ from .validation import require_identifier, require_text
19
+ from ..timebase.conversion import require_int64_ns
20
+
21
+
22
+ @dataclass(frozen=True)
23
+ class DeclaredSource:
24
+ """保存一个尚未读取的来源定位,以及其声明的固定时间映射。
25
+
26
+ input_identity包含规范配置中的路径顺序、格式和处理配置标识,不是文件内容
27
+ 哈希。offset_ns是整数纳秒偏移;模型不会估计漂移。字段实际存在性由来源执行
28
+ 接口另行检查,不能凭声明认定数据已读取。全部字段不可变。
29
+ """
30
+
31
+ name: str # 当前计划来源名。
32
+ timebase: TimebaseSpec # 原始来源坐标。
33
+ input_identity: str # 规范声明身份,与实际数据身份分别保存。
34
+ offset_ns: int = 0 # 显式固定偏移,不自动估计漂移。
35
+
36
+ def __post_init__(self) -> None:
37
+ """校验声明结构,保持声明身份与实际内容证据保持分开。
38
+
39
+ 参数: 无;读取name/timebase/input_identity/offset_ns。
40
+ 返回: None,冻结声明。
41
+ 异常: TypeError/ValueError/TimeOverflowError为配置错误。
42
+ """
43
+ # 所有名称遵守统一安全规则。
44
+ require_identifier(self.name, 'source.name')
45
+ # 规范身份必须明确提供,不凭文件名猜测。
46
+ require_text(self.input_identity, 'source.input_identity')
47
+ # offset必须保持定宽整数。
48
+ require_int64_ns(self.offset_ns)
49
+ # 时基不得使用未校验字典。
50
+ if not isinstance(self.timebase, TimebaseSpec):
51
+ # 静态接口也不接无类型占位。
52
+ raise TypeError('声明来源需要TimebaseSpec')
53
+
54
+
55
+ @dataclass(frozen=True)
56
+ class DeclarationBindings:
57
+ """冻结一个计划的来源、信号名称和同步关系,供执行前检查使用。
58
+
59
+ signals与derived_names共用名称空间。identity只证明配置声明;来源路径、
60
+ 处理配置、转换或有效期变化会改变它。模型不验证文件内容、实际列或DBC
61
+ 元数据,不能代替执行数据绑定。同步检查只针对当前节点实际使用的来源。
62
+ """
63
+
64
+ session_id: str # 当前会话声明。
65
+ timebase: TimebaseSpec # 计划分析坐标。
66
+ domain: Interval | None # 用户请求范围;None声明整文件无时间筛选,不表示无观测。
67
+ sources: tuple[DeclaredSource, ...] # 保留声明原顺序。
68
+ signals: tuple[SignalDefinition, ...] # 已校验单信号契约。
69
+ derived_names: tuple[str, ...] = () # signals统一名称空间。
70
+ synchronization: tuple[SynchronizationEvidence, ...] = () # 显式核实依据。
71
+ identity: str = field(init=False) # 配置身份,不是执行绑定SHA。
72
+
73
+ def __post_init__(self) -> None:
74
+ """检查名称、来源和显式同步关系,并生成声明身份。
75
+
76
+ 参数: 无;输入均为已经校验的不可变声明模型。
77
+ 返回: None;不读取任何样本、文件或DBC。
78
+ 异常: TypeError/ValueError为结构错误、名称冲突、来源错误或同步关系冲突。
79
+ """
80
+ # 会话名采用同一标识符规则。
81
+ require_identifier(self.session_id, 'dataset.session')
82
+ # 容器不得在构造后被调用者改写。
83
+ if (not isinstance(self.timebase, TimebaseSpec)
84
+ or self.domain is not None and not isinstance(self.domain, Interval)
85
+ or any(type(items) is not tuple for items in (self.sources, self.signals, self.derived_names, self.synchronization))):
86
+ # 不冻结任意迭代器或未知对象。
87
+ raise TypeError('声明绑定需要typed时基/范围与tuple容器')
88
+ # 单项必须由对应模型校验,不使用duck typing。
89
+ if any(not isinstance(item, DeclaredSource) for item in self.sources) or any(not isinstance(item, SignalDefinition) for item in self.signals):
90
+ # 静态编译也不接受伪造类名。
91
+ raise TypeError('声明绑定需要DeclaredSource/SignalDefinition')
92
+ # 来源表只属于当前计划。
93
+ sources = {item.name: item for item in self.sources}
94
+ # 重复来源不能字典覆盖。
95
+ if len(sources) != len(self.sources):
96
+ # 没有自动选取第一个来源的回退。
97
+ raise ValueError('source.name重复')
98
+ # 所有原信号和派生名称必须唯一。
99
+ names = set()
100
+ # 原字段只检查已声明来源,不声称实际存在。
101
+ for definition in self.signals:
102
+ # 完整单信号契约已经校验。
103
+ if definition.source not in sources or definition.name in names:
104
+ # 定位声明中实际冲突的信号。
105
+ raise ValueError(f'{definition.name}来源不存在或别名重复')
106
+ # 防止派生与当前信号重名。
107
+ names.add(definition.name)
108
+ # 派生名称不以点号或函数名绕过白名单。
109
+ for name in self.derived_names:
110
+ # 与实际执行绑定使用同一规则。
111
+ require_identifier(name, 'derived.name')
112
+ # 声明整个名称空间,未引用也不能隐藏冲突。
113
+ if name in names:
114
+ # 保留用户名称,不加后缀。
115
+ raise ValueError(f'signals/derived名称冲突:{name}')
116
+ # 登记下一个冲突校验点。
117
+ names.add(name)
118
+ # 同步声明必须唯一且指向当前计划。
119
+ evidenced = set()
120
+ # 不从机器时钟或两文件首点为0推断同步。
121
+ for evidence in self.synchronization:
122
+ # 正确类型和目标是声明有效性的必要条件。
123
+ if not isinstance(evidence, SynchronizationEvidence):
124
+ # 不以文字字符串冒充typed同步说明。
125
+ raise TypeError('同步需要SynchronizationEvidence')
126
+ # 重复/未知来源及不同分析时基都拒绝。
127
+ if evidence.source not in sources or evidence.source in evidenced or evidence.analysis_timebase != self.timebase:
128
+ # 不静默选一个映射。
129
+ raise ValueError('同步来源重复/未知或目标时基不一致')
130
+ # 保留已核实来源声明集合。
131
+ evidenced.add(evidence.source)
132
+ # 静态身份显式使用独立版本前缀,不与真实绑定共用证明。
133
+ # 已有显式Interval仍使用原v1字节;无筛选声明以独立v2前缀和None端点表示。
134
+ version = 'declaration-v1' if self.domain is not None else 'declaration-v2-no-time-request'
135
+ payload = (version, self.session_id, self.timebase.timebase_id, self.timebase.time_type.value, self.timebase.origin,
136
+ None if self.domain is None else self.domain.start_ns,
137
+ None if self.domain is None else self.domain.end_ns,
138
+ tuple((item.name, item.timebase.timebase_id, item.timebase.time_type.value, item.timebase.origin, item.offset_ns, item.input_identity) for item in self.sources),
139
+ tuple(item.identity() for item in self.signals), self.derived_names,
140
+ tuple((item.source, item.evidence) for item in self.synchronization))
141
+ # 所有身份材料是已校验结构,不调用外部对象repr。
142
+ object.__setattr__(self, 'identity', sha256(_identity(payload).encode('utf-8')).hexdigest())
143
+
144
+ def resolve(self, name: str) -> SignalDefinition:
145
+ """定位当前声明中的唯一信号别名。
146
+
147
+ 参数: name简单别名。
148
+ 返回: 当前计划SignalDefinition。
149
+ 异常: ValueError为名称非法或未知。
150
+ """
151
+ # 不把semantic点号转换成别名。
152
+ require_identifier(name, 'signal alias')
153
+ # 只查当前声明集合。
154
+ for definition in self.signals:
155
+ # 保留大小写敏感身份。
156
+ if definition.name == name:
157
+ # 不继承上个任务的输入。
158
+ return definition
159
+ # 未知信号不能通过空数据隐式创建。
160
+ raise ValueError(f'未知信号别名:{name}')
161
+
162
+ def require_synchronized(self, names: tuple[str, ...]) -> None:
163
+ """按实际联合依赖检查声明的公共时间基准。
164
+
165
+ 参数: names为原信号简单别名tuple。
166
+ 返回: None,单来源或公共起点/显式同步依据齐备时通过。
167
+ 异常: TypeError/ValueError为容器、别名或同步缺项。
168
+ """
169
+ # 与实际绑定保持相同的依赖接口。
170
+ if type(names) is not tuple:
171
+ # 不接受可变或无限依赖列表。
172
+ raise TypeError('联合依赖names必须为tuple')
173
+ # 单来源多个信号只产生一个同步成员。
174
+ used = {self.resolve(name).source for name in names}
175
+ # 独立来源可在自己坐标中校验。
176
+ if len(used) <= 1:
177
+ # 未使用来源不参与当前声明的证据检查。
178
+ return
179
+ # 构造已校验所有证据的来源/目标关系。
180
+ evidenced = {item.source for item in self.synchronization}
181
+ # 联合计算只检查实际参与来源。
182
+ for source in self.sources:
183
+ # 未参与或已有显式固定映射的来源无需重复声明公共起点。
184
+ if source.name not in used or source.name in evidenced:
185
+ # 不自动估计其他来源的漂移。
186
+ continue
187
+ # absolute坐标已统一为UTC;relative坐标须有相同的完整起点声明。
188
+ same = source.timebase.time_type is self.timebase.time_type and (source.timebase.time_type is TimeType.ABSOLUTE or source.timebase == self.timebase)
189
+ # 数值offset本身不能证明同步。
190
+ if not same:
191
+ # 提供具体缺项位置供配置修正。
192
+ raise ValueError(f'联合依赖缺少同步依据:{source.name};需要公共起点或固定offset核实证据')