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,78 @@
1
+ """独立用NumPy扩展、分组和裁剪事件窗口,再恢复片段模型。
2
+
3
+ 输入已排序Event tuple、WindowSpec和实际观测Interval,输出Segment tuple。
4
+ 时间端点为(N,) int64纳秒列,先检查扩展溢出,再执行UFUNC;按真实活动间隔
5
+ 或请求窗口重叠建立组边界,reduceat归约每组范围,数组裁剪并计算覆盖。
6
+ 输出循环只打包模型/元数据,不逐事件执行参考数值;不调用参考窗口算法。
7
+ 输入和数组完整物化,不读旧链、不写文件、不承诺整个AnalysisRunner的预算。
8
+ """
9
+
10
+ # 真正数组端点、掩码与分组归约,禁止object/vectorize替代。
11
+ import numpy as np
12
+ from ..timebase.conversion import INT64_MIN, INT64_MAX, TimeOverflowError
13
+ from .models import Interval
14
+ # 只共享已校验协议与ID/诊断包装。
15
+ from .windows import require_windows, make_segment, require_resolved_windows
16
+
17
+
18
+ def build_segments_numpy(events, spec, observation, *, bounds=None, compact=False):
19
+ """以数组计算请求与实际范围,输出保留原事件关联的片段。
20
+
21
+ 参数: events已排序真实事件;spec为WindowSpec;observation为真实Interval。
22
+ 返回: Segment或compact的CompactSegment tuple;bounds为已解析的实际边界。旧覆盖保持独立float64比值。
23
+ 异常: 配置/模型错误传播;端点或跨度溢出明确拒绝;分配失败不吞。
24
+ 流程: 扩展前校验int64上下界,批量建立连接掩码/组索引、归约、裁剪及覆盖。
25
+ 恢复Interval时校验请求跨度,再做安全整数差;不改变原事件。
26
+ """
27
+ # 共享的门槛没有窗口数值或归约。
28
+ require_windows(events, spec, observation)
29
+ require_resolved_windows(events,bounds,compact)
30
+ if not events:
31
+ return ()
32
+ # 每个时间列为(N,)纳秒,point的结束锚点等于真实触发时刻。
33
+ onsets = np.array([event.start_ns for event in events], dtype=np.int64)
34
+ endings = np.array([event.start_ns if event.end_ns is None else event.end_ns for event in events], dtype=np.int64)
35
+ extension = spec.exit_delay_ns if spec.merge == 'exit_delay' else spec.post_ns
36
+ if bounds is None:
37
+ if np.any(onsets < np.int64(INT64_MIN + spec.pre_ns)) or np.any(endings > np.int64(INT64_MAX - extension)):
38
+ raise TimeOverflowError('窗口请求扩展超出int64纳秒')
39
+ starts = np.subtract(onsets, np.int64(spec.pre_ns))
40
+ ends = np.add(endings, np.int64(extension))
41
+ left_clip=right_clip=np.zeros(len(events),dtype=bool)
42
+ else:
43
+ starts=np.array([item[0] for item in bounds],dtype=np.int64)
44
+ ends=np.array([item[1] for item in bounds],dtype=np.int64)
45
+ left_clip=np.array([item[2] for item in bounds],dtype=bool)
46
+ right_clip=np.array([item[3] for item in bounds],dtype=bool)
47
+ # 连接掩码(N-1,);single比较真实onset与前活动退出deadline,不使用pre。
48
+ if spec.merge == 'exit_delay':
49
+ connected = (onsets[1:] <= ends[:-1]) | right_clip[:-1]
50
+ elif spec.merge == 'overlap':
51
+ prior=np.maximum.accumulate(ends)[:-1]
52
+ connected = (starts[1:] < prior) | ((starts[1:] == prior) & (np.maximum.accumulate(right_clip)[:-1] | left_clip[1:]))
53
+ elif spec.merge == 'overlap_and_adjacent':
54
+ connected = starts[1:] <= np.maximum.accumulate(ends)[:-1]
55
+ else:
56
+ connected = np.zeros(len(events)-1, dtype=bool)
57
+ # 组首索引和结束索引只依赖本次真实事件,未重新排序旧输入。
58
+ first = np.concatenate((np.array([0], dtype=np.int64), np.flatnonzero(~connected)+1))
59
+ stop = np.concatenate((first[1:], np.array([len(events)], dtype=np.int64)))
60
+ group_starts = np.minimum.reduceat(starts, first)
61
+ group_ends = np.maximum.reduceat(ends, first)
62
+ # 模型恢复先验证合并请求跨度,之后整数求差才保证不wrap。
63
+ requests = tuple(Interval(int(start), int(end)) for start, end in zip(group_starts, group_ends))
64
+ left = np.maximum(group_starts, np.int64(observation.start_ns))
65
+ right = np.minimum(group_ends, np.int64(observation.end_ns))
66
+ observed = right >= left
67
+ actuals = tuple(Interval(int(start), int(end)) if flag else None for start, end, flag in zip(left, right, observed))
68
+ if compact:
69
+ coverages=[None]*len(first)
70
+ else:
71
+ requested_duration = np.subtract(group_ends, group_starts)
72
+ actual_duration = np.zeros(len(first), dtype=np.int64)
73
+ np.subtract(right, left, out=actual_duration, where=observed)
74
+ coverages = np.divide(actual_duration.astype(np.float64), requested_duration.astype(np.float64))
75
+ clipped=np.logical_or.reduceat(left_clip|right_clip,first)
76
+ # 输出循环只关联父事件和包装typed模型,全部边界/分组/覆盖已在数组完成。
77
+ return tuple(make_segment(spec, requests[index], actuals[index], None if compact else float(coverages[index]), events[int(start):int(end)],compact=compact,clipped=bool(clipped[index]))
78
+ for index, (start, end) in enumerate(zip(first, stop)))
@@ -0,0 +1,61 @@
1
+ """独立用Python精确整数扩展、合并并裁剪事件窗口,输出完整片段事实。
2
+
3
+ 输入已排序真实Event、WindowSpec和观测Interval,输出Segment tuple。
4
+ 先按onset/点锚点扩展请求,再按明确政策分组,最后裁剪并计算覆盖。
5
+ single按真实活动间隔判断,pre重叠不扩大分组;相等deadline重入合并。
6
+ 本实现不调用NumPy数值,只共享协议与元数据包装,不读写旧日志或重写事件。
7
+ 输入和输出均完整保存在内存中,调用方负责资源预算。
8
+ """
9
+
10
+ # 精确时间算术在Python整数域检查,不wrap或先转float。
11
+ from ..timebase.conversion import checked_add_ns
12
+ from .models import Interval
13
+ # 共享协议与ID/质量包装,不共享扩展、合并或覆盖算法。
14
+ from .windows import require_windows, make_segment, require_resolved_windows
15
+
16
+
17
+ def build_segments_reference(events, spec, observation, *, bounds=None, compact=False):
18
+ """根据真实事件构造请求窗口及其实际观测交集。
19
+
20
+ 参数: events为已排序Event tuple;spec为WindowSpec;observation为真实半开范围。
21
+ 返回: Segment或compact的CompactSegment tuple;bounds为按所选周期解析的真实边界。空事件返回空tuple。
22
+ 异常: 模型、排序、归属错误传播;请求端点或跨度溢出明确拒绝。
23
+ 流程: 逐事件精确扩展,按none/重叠/相邻/真实退出间隔分组,逐组裁剪。
24
+ 不改变原Event,不增加旧writer调用,不凭EOF外的请求补观测。
25
+ """
26
+ # 类型和原事件事实在数值执行前验证。
27
+ require_windows(events, spec, observation)
28
+ require_resolved_windows(events,bounds,compact)
29
+ groups = []
30
+ # 当前组的请求范围与末个真实活动分开保存,pre不参与退出间隔。
31
+ for index,event in enumerate(events):
32
+ start = checked_add_ns(event.start_ns, -spec.pre_ns) if bounds is None else bounds[index][0]
33
+ end_anchor = event.start_ns if event.end_ns is None else event.end_ns
34
+ extension = spec.exit_delay_ns if spec.merge == 'exit_delay' else spec.post_ns
35
+ end = checked_add_ns(end_anchor, extension) if bounds is None else bounds[index][1]
36
+ left_clip,right_clip=(False,False) if bounds is None else bounds[index][2:]
37
+ requested = Interval(start, end)
38
+ # 每组先有独立请求,再决定是否与已有组连接。
39
+ merge = False
40
+ if groups:
41
+ previous = groups[-1]
42
+ if spec.merge == 'exit_delay':
43
+ merge = event.start_ns <= (checked_add_ns(previous[2][-1].end_ns, spec.exit_delay_ns) if bounds is None else previous[1]) or previous[4]
44
+ elif spec.merge == 'overlap':
45
+ merge = start < previous[1] or start==previous[1] and (previous[4] or left_clip)
46
+ elif spec.merge == 'overlap_and_adjacent':
47
+ merge = start <= previous[1]
48
+ # 合并仅扩展片段,不写回原活动边界或真实状态。
49
+ if merge:
50
+ groups[-1] = (min(groups[-1][0], start), max(groups[-1][1], end), groups[-1][2] + (event,),groups[-1][3] or left_clip,groups[-1][4] or right_clip)
51
+ else:
52
+ groups.append((requested.start_ns, requested.end_ns, (event,),left_clip,right_clip))
53
+ results = []
54
+ # 逐组裁剪和覆盖为独立参考算术,不调用数组内核。
55
+ for start, end, parents,left_clip,right_clip in groups:
56
+ requested = Interval(start, end)
57
+ left, right = max(start, observation.start_ns), min(end, observation.end_ns)
58
+ actual = Interval(left, right) if left <= right else None
59
+ coverage = None if compact else (0 if actual is None else actual.duration_ns()) / requested.duration_ns()
60
+ results.append(make_segment(spec, requested, actual, coverage, parents,compact=compact,clipped=left_clip or right_clip))
61
+ return tuple(results)
@@ -0,0 +1,6 @@
1
+ """保存新执行层内部组件,公共入口由根包AnalysisRunner按需加载。
2
+
3
+ 输入为已解码批次,历史组件输出有限单行重放;模块本身不读取旧来源。
4
+ run_session协调来源创建、同组归并和已实现算子,资源账本复用结果层。
5
+ 本模块自身仅说明包职责,导入不读取来源、创建目录或保存运行状态。
6
+ """
@@ -0,0 +1,122 @@
1
+ """将已校验的解析信号批按watermark归为同刻组,不创建磁盘历史。
2
+
3
+ 来源适配器负责原输入及跨批合同。本层只保尚未完整的组,最大时间组等到
4
+ 后续时间或真实EOF才交付;超出预算直接失败,不拆散同刻更新。
5
+ """
6
+
7
+ import heapq
8
+ from ..core.models import SourceRef
9
+ from ..results.errors import ResultClosedError
10
+ from ..results.spool import _reserve_owned_ram, _release_owned_ram, _cleanup_owner
11
+ from .groups import DecodedTimeGroup
12
+ from .record_sample import RecordSample
13
+ from ..core.types import SignalDType as D
14
+ from .calculation_values import scalar_from_column
15
+ from .history import _metadata_bytes
16
+
17
+
18
+ class BatchSignalGroups:
19
+ """借用已验证批,拥有未完成样本与有限排序状态。"""
20
+
21
+ def __init__(self, budget, definitions, session_id, consumer):
22
+ """预付状态。参数: 预算、有限定义、会话、consumer。返回: owner。异常: 预算/取消原错。"""
23
+ self._budget, self._consumer = budget, consumer
24
+ self._held_cost = self._fixed_cost = self._sample_cost = self._work_cost = 0
25
+ self._heap = None
26
+ self._refs = None
27
+ self._serial = 0
28
+ self._maximum = self._last = None
29
+ self._closed = self._failed = self._finished = False
30
+ try:
31
+ _reserve_owned_ram(self, 65536 + 32*_metadata_bytes(definitions), '_fixed_cost')
32
+ self._refs = {item.name: SourceRef(session_id, item.source, item.field) for item in definitions}
33
+ self._heap = []
34
+ except BaseException as error:
35
+ _cleanup_owner(self, error, 'batch_groups_cleanup_owner', '解析信号归组')
36
+ raise
37
+
38
+ def consume(self, batch):
39
+ """保必要规范值,按完成进度交付组;丢弃原值/详细来源副本。
40
+
41
+ 参数: 可信适配器已校验SignalBatch。返回: None。异常: 预算/模型/回退,失败后只清理。
42
+ """
43
+ if self._closed or self._failed or self._finished:
44
+ raise ResultClosedError('解析信号组已关闭、失败或结束')
45
+ sample = value = column = None
46
+ try:
47
+ for column in batch.series.values():
48
+ for index in range(len(column.time_ns)):
49
+ time = int(column.time_ns[index])
50
+ if self._last is not None and time <= self._last:
51
+ raise ValueError('来源在已交付同刻组之后又返回旧样本')
52
+ _reserve_owned_ram(self, 8192, '_sample_cost')
53
+ value = scalar_from_column(column, index)
54
+ sample = RecordSample(column.name, time, int(column.sequence[index]),
55
+ value, column.unit,self._refs[column.name],
56
+ column.values[index].item() if value.dtype is D.ENUM else None)
57
+ heapq.heappush(self._heap, (time, self._serial, sample))
58
+ self._serial += 1
59
+ self._maximum = time if self._maximum is None else max(time, self._maximum)
60
+ if batch.watermark_ns is not None:
61
+ self._flush(batch.watermark_ns, keep_last=True)
62
+ except BaseException:
63
+ self._failed = True
64
+ raise
65
+ finally:
66
+ batch = sample = value = column = None
67
+
68
+ def _flush(self, watermark, *, keep_last):
69
+ """只交付完整组,费用在consumer返回后释放。参数: 进度/是否保末组。返回: None。异常: 原错。"""
70
+ while self._heap and (watermark is None or self._heap[0][0] <= watermark):
71
+ time = self._heap[0][0]
72
+ if keep_last and time == self._maximum:
73
+ return
74
+ samples = group = None
75
+ count = 0
76
+ primary = None
77
+ try:
78
+ # 当前组至多为已付费样本数量,先覆盖列表/tuple引用再构造。
79
+ _reserve_owned_ram(self, 4096 + len(self._heap)*32, '_work_cost')
80
+ samples = []
81
+ while self._heap and self._heap[0][0] == time:
82
+ samples.append(heapq.heappop(self._heap)[2])
83
+ count += 1
84
+ group = DecodedTimeGroup(time, tuple(samples))
85
+ self._consumer(group)
86
+ self._last = time
87
+ except BaseException as error:
88
+ primary = error
89
+ raise
90
+ finally:
91
+ samples = group = None
92
+ try:
93
+ _release_owned_ram(self, count*8192, '_sample_cost')
94
+ _release_owned_ram(self, self._work_cost, '_work_cost')
95
+ except BaseException as cleanup:
96
+ self._failed = True
97
+ if primary is None:
98
+ raise
99
+ primary.add_note('解析同刻组清理失败:'+type(cleanup).__name__)
100
+
101
+ def finish(self):
102
+ """调用方确认真实EOF及关闭后交最后组。参数: 无。返回: None。异常: 失败拒绝完成。"""
103
+ if self._closed or self._failed:
104
+ raise ResultClosedError('解析信号组不能完成')
105
+ if self._finished:
106
+ return
107
+ try:
108
+ self._flush(None, keep_last=False)
109
+ self._finished = True
110
+ except BaseException:
111
+ self._failed = True
112
+ raise
113
+
114
+ def close(self):
115
+ """丢待处理组并退款,不把提前close当EOF。参数: 无。返回: None。异常: 退款失败可重试。"""
116
+ if self._closed:
117
+ return
118
+ self._failed = True
119
+ self._heap = self._consumer = self._refs = None
120
+ for slot in ('_work_cost', '_sample_cost', '_fixed_cost'):
121
+ _release_owned_ram(self, getattr(self, slot), slot)
122
+ self._closed = True
@@ -0,0 +1,296 @@
1
+ """核对实际封存解码历史,建立可执行表达式所需的独立运行绑定。
2
+
3
+ 输入为当前DeclarationBindings和sealed DecodedHistoryStore,输出须close的元数据持有对象。
4
+ 先核对请求/字段/完整归一化与时基指纹,再逐源有限重放到实际文件EOF,校验原SHA和计数。
5
+ 运行身份同时包含声明、实际描述/投影/历史与原EOF范围;不以静态表达式或猜测SHA替代核对。
6
+ 只重放新解码历史,不重读旧原日志/DBC,不保留全样本,不重新转换或计算表达式。
7
+ 固定元数据和构造临时量先计账,单行读预算由历史游标拥有,失败/取消关闭自有游标。
8
+ 外部保存已取得bindings/CompiledExpression超过lease寿命时须另负责该元数据持有量。
9
+ 同一个真实DecodedBindingLease从首次预约前持有固定费、当前reader及有限临时状态;
10
+ 未返回且持续清理失败时由原异常decoded_binding_lease_cleanup_owner交接。
11
+ 单笔预约/释放返回后取消也按实际交易更新槽,不重复归还借用history或其他reader费用。
12
+ 纯契约校验入口供不保存普通历史的内部扫描复用;它不生成读取证据,公共工厂仍检查实际磁盘EOF。
13
+ """
14
+
15
+ # 受控类型树生成规范摘要,不执行任意对象repr或反射表达式。
16
+ from collections.abc import Mapping
17
+ from dataclasses import fields, is_dataclass
18
+ from enum import Enum
19
+ from hashlib import sha256
20
+ from ..core.binding import SignalDefinition, _identity
21
+ from ..core.decoded_binding import DecodedBindings, DecodedSourceEvidence
22
+ from ..core.declarations import DeclarationBindings, DeclaredSource
23
+ from ..core.types import SignalDType
24
+ from ..results.errors import ResultClosedError, ResultFormatError
25
+ from ..results.spool import _cleanup_owner, _reserve_owned_ram, _release_owned_ram
26
+ from ..sources.descriptions import describe_fields, source_timebase_identity
27
+ from ..sources.models import ReadRequest, SourceDescription
28
+ from .history import DecodedHistoryStore, _metadata_bytes
29
+ from .history_records import HistoryProgress, HistorySample
30
+
31
+
32
+ def _fingerprint_value(value):
33
+ """把已校验冻结元数据转换为纯标量/tuple,不丢字段或来源定位。
34
+
35
+ 参数: value为当前typed描述/请求元数据树。返回: _identity支持的不可变树。
36
+ 异常: TypeError为未声明结构;调用方已申请元数据构造预算。
37
+ """
38
+ if is_dataclass(value) and not isinstance(value, type):
39
+ return (type(value).__name__, tuple((item.name, _fingerprint_value(getattr(value, item.name))) for item in fields(value)))
40
+ if isinstance(value, Mapping):
41
+ # JSON键已检查为str;排序只用于身份,不改变读取/字段/文件次序。
42
+ return tuple((key, _fingerprint_value(value[key])) for key in sorted(value))
43
+ if type(value) is tuple:
44
+ return tuple(_fingerprint_value(item) for item in value)
45
+ if isinstance(value, Enum):
46
+ return (type(value).__name__, value.value)
47
+ if value is None or type(value) in (str, int, float, bool):
48
+ return value
49
+ raise TypeError('运行绑定元数据含未支持类型')
50
+
51
+
52
+ def _fingerprint(value):
53
+ """计算完整typed树摘要。参数: value冻结元数据。返回: SHA256文本。异常: 树/分配错误。"""
54
+ return sha256(_identity(_fingerprint_value(value)).encode('utf-8')).hexdigest()
55
+
56
+
57
+ class DecodedBindingLease:
58
+ """从首次预约到返回绑定持有唯一真实费用及当前回放reader。
59
+
60
+ _cost/_held_cost只含工厂原固定金额;_reader拥有独立FD及它自己的费用。
61
+ _bindings仅在完整EOF和当前reader清完后开放。_closing/_failed期间禁止借出,
62
+ 直到实际reader和固定费都清完才closed,不关闭借用history/scan或删除文件。
63
+ """
64
+
65
+ def __init__(self, budget):
66
+ """在首次外部操作前初始化真实责任槽,不申请预算或打开文件。
67
+
68
+ 参数: budget为调用方历史的共享预算。返回: 尚未取得固定费或完成绑定的lease。
69
+ 异常: 无主动异常;构造不接已经付费的裸金额,也不复制样本。
70
+ """
71
+ # 费用与子reader必须先可清理;工厂后续每笔真实交易才登记已取得金额。
72
+ self._budget, self._cost, self._held_cost = budget, 0, 0
73
+ self._bindings = self._reader = self._current = None
74
+ self._history = self._declarations = None
75
+ self._evidence = self._definitions = self._described = None
76
+ self._closed = self._closing = self._failed = False
77
+
78
+ @property
79
+ def bindings(self) -> DecodedBindings:
80
+ """读取不可变运行绑定。参数: 无。返回: DecodedBindings。异常: ResultClosedError为关闭。"""
81
+ if self._closed or self._closing or self._failed or self._bindings is None:
82
+ raise ResultClosedError('解码运行绑定未完成、已关闭或正在清理')
83
+ return self._bindings
84
+
85
+ @property
86
+ def closed(self) -> bool:
87
+ """读取lease状态。参数: 无。返回: bool。异常: 无。"""
88
+ return self._closed
89
+
90
+ def _close_reader(self):
91
+ """关闭本lease唯一实际reader,失败仍保留未完成的子责任。
92
+
93
+ 参数: 无。返回: None。异常: 原reader.close错误传播;完成后取消不留重复释放槽。
94
+ """
95
+ if self._reader is None:
96
+ return
97
+ # 正常返回即结束责任;真实reader已经closed后才抛错也已完成,不再二次抵销。
98
+ try:
99
+ self._reader.close()
100
+ except BaseException:
101
+ if getattr(self._reader, 'closed', False):
102
+ self._reader = None
103
+ raise
104
+ else:
105
+ self._reader = None
106
+
107
+ def _clear_temporary(self):
108
+ """结束有限工厂临时引用,不关闭借用对象。
109
+
110
+ 参数: 无。返回: None。异常: 无主动异常;不遍历原rows或删除历史。
111
+ """
112
+ self._current = self._evidence = self._definitions = self._described = None
113
+ self._history = self._declarations = None
114
+
115
+ def close(self):
116
+ """先关真实reader,再丢自有元数据并逐笔归还固定费。
117
+
118
+ 参数: 无。返回: None,完成后幂等。异常: 原FD/预算错误可重试,释放后取消不重复扣账。
119
+ 副作用: 只关闭本lease的当前reader,不关闭调用方history/scan/其他reader。
120
+ """
121
+ if self._closed:
122
+ return
123
+ # 一旦开始清理就拒绝借出绑定;子FD和子费用未清完时保留本固定费及全部责任。
124
+ self._closing = True
125
+ # 单行内容借reader费用存活,先结束引用,避免子释放后取消仍留下长样本。
126
+ self._current = None
127
+ self._close_reader()
128
+ self._bindings = None
129
+ self._clear_temporary()
130
+ _release_owned_ram(self, self._cost, '_cost')
131
+ self._closed = True
132
+
133
+
134
+ def _require_empty_source_scan(source, history, observed_scans):
135
+ """用本历史的真实扫描证明无字段来源的完整时钟,不从空描述猜测。
136
+
137
+ 参数: source为原DeclaredSource;history为sealed历史;observed_scans为真实扫描tuple。
138
+ 返回: None。异常: ValueError/ResultClosedError为缺失、重复、失效或不对应的证明。
139
+ 不重新读取原CSV,不复制原行;后续工厂仍须逐源核当前历史文件的真实EOF。
140
+ """
141
+ matches = 0
142
+ for scan in observed_scans:
143
+ # getter只在scan仍活且成功完成时可用;同名不同历史不能冒充本次读取。
144
+ if scan.closed or scan.failed or not scan.finished:
145
+ raise ValueError('无字段来源的扫描证明须真实完成且仍可用')
146
+ plan = scan.source_plan
147
+ if plan.name not in history.validators:
148
+ raise ValueError('无字段来源的扫描不能包含当前历史之外的来源')
149
+ if plan.name != source.name:
150
+ continue
151
+ matches += 1
152
+ validator = history.validators[source.name]
153
+ completion = history.source_completions[source.name]
154
+ observation = scan.observation
155
+ if (scan.history is not history or scan.request is not validator.request
156
+ or plan.input_identity != source.input_identity
157
+ or plan.config.timebase != source.timebase or plan.config.offset_ns != source.offset_ns
158
+ or scan.history_sha256 != history.hashes[source.name].hexdigest()
159
+ or scan.counts != tuple(history.counts[source.name])
160
+ or observation.source != source.name or observation.session_id != validator.request.session_id
161
+ or not observation.source_eof or not completion.source_eof
162
+ or observation.observed_end_ns != completion.observed_end_ns):
163
+ raise ValueError('无字段来源的真实扫描与当前声明、请求或历史证明不符')
164
+ if matches != 1:
165
+ raise ValueError('无字段来源需唯一真实扫描的完整时基偏移证明')
166
+
167
+
168
+ def require_decoded_source_contract(declarations: DeclarationBindings, source: DeclaredSource,
169
+ description: SourceDescription, request: ReadRequest) -> dict[str, SignalDefinition]:
170
+ """只核一来源的声明、实际描述和请求合同,保留所有原信号定义。
171
+
172
+ 参数: declarations/source为同一当前声明;description/request为调用方实际读取
173
+ 使用的原typed对象。未用声明可以保留,但无实际字段时投影必须为空;调用方仍须独立核实
174
+ 同一次真实扫描的完整时基/偏移/来源身份和完成事实,本函数不认证扫描或EOF。
175
+ 返回: 该来源全部别名到原SignalDefinition对象的dict;不裁成表达式依赖子集,
176
+ 不生成DecodedBindings、DecodedSourceEvidence或假历史SHA。
177
+ 异常: TypeError为非规定模型;ValueError为会话、domain、来源、完整时钟、
178
+ 投影或字段/类型/单位/完整转换指纹不符。分配和取消错误原样传播。
179
+ 副作用: 无文件、读取、预算或数值操作。调用方预付有限元数据工作区并负责后续
180
+ 样本、全量观测和真实EOF证明;公共历史绑定仍必须完整核验实际磁盘文件。
181
+ """
182
+ definitions = described = clock_identity = definition = field = expected = None
183
+ try:
184
+ # 模型构造已经保证名称唯一与字段来源一致;纯入口不能依赖某个历史构造器
185
+ # 曾替调用方做过类型检查,也不能接受同名却不属于当前声明的来源。
186
+ if (not isinstance(declarations, DeclarationBindings) or not isinstance(source, DeclaredSource)
187
+ or not isinstance(description, SourceDescription) or not isinstance(request, ReadRequest)):
188
+ raise TypeError('来源合同需要typed声明/来源/描述/请求')
189
+ if source not in declarations.sources or description.name != source.name:
190
+ raise ValueError('实际描述来源与当前声明不对应')
191
+ if (request.session_id != declarations.session_id or request.domain_start_ns != (declarations.domain.start_ns if declarations.domain is not None else None)
192
+ or request.domain_end_ns != (declarations.domain.end_ns if declarations.domain is not None else None) or description.timebase_id != source.timebase.timebase_id):
193
+ raise ValueError('实际读取会话/domain/时基与当前声明不符')
194
+ definitions = {item.name: item for item in declarations.signals if item.source == source.name}
195
+ described = {item.name: item for item in description.fields}
196
+ clock_identity = source_timebase_identity(source.timebase, source.offset_ns)
197
+ # 时钟检查覆盖全部描述字段,不因当前请求空投影或未使用某字段而跳过。
198
+ if not description.fields:
199
+ if request.signal_names:
200
+ raise ValueError('无实际字段描述时读取投影必须为空,时钟须另以真实扫描证明')
201
+ elif any(item.field.locator.get('source_timebase_sha256') != clock_identity
202
+ or item.field.locator.get('offset_ns') != source.offset_ns for item in description.fields):
203
+ raise ValueError('实际来源缺完整时基偏移证据或与当前声明不符')
204
+ if not set(request.signal_names) <= definitions.keys():
205
+ raise ValueError('实际读取投影包含当前未声明别名')
206
+ # 部分投影只核实际请求字段;未用声明保留为静态定义,不声称已经读取。
207
+ for name in request.signal_names:
208
+ definition = definitions[name]
209
+ field = described.get(name)
210
+ expected = describe_fields(source.name, (definition,))[0]
211
+ if (field is None or field.field.field != definition.field or field.dtype is not definition.dtype
212
+ or field.unit != definition.unit or any(field.metadata.get(key) != value for key, value in expected.metadata.items())):
213
+ raise ValueError('实际字段/完整转换/原时基偏移与当前声明不符或缺指纹')
214
+ return definitions
215
+ finally:
216
+ # 失败后调用方可释放其合同费用;本层原异常frame不额外保活新索引/描述副本。
217
+ definitions = described = clock_identity = definition = field = expected = None
218
+ declarations = source = description = request = None
219
+
220
+
221
+ def bind_decoded_history(declarations: DeclarationBindings, history: DecodedHistoryStore,
222
+ *, observed_scans=()) -> DecodedBindingLease:
223
+ """先核对当前契约,再完整重放所有来源,只有实际EOF校验后才返回运行绑定。
224
+
225
+ 参数: declarations当前配置声明;history该会话已seal的新历史,不能是building/closed;
226
+ observed_scans可选真实完成扫描tuple,只为无声明字段来源补完整时钟证明。
227
+ 返回: DecodedBindingLease,样本不保留,来源摘要/计数/投影/EOF事实纳入bindings身份。
228
+ 异常: 契约/损坏/预算/文件/取消错误原样传播;持续清理失败由原异常的
229
+ decoded_binding_lease_cleanup_owner持真实reader及费用,恢复后可close。
230
+ """
231
+ if not isinstance(declarations, DeclarationBindings) or not isinstance(history, DecodedHistoryStore):
232
+ raise TypeError('运行绑定需要DeclarationBindings和DecodedHistoryStore')
233
+ # 局部导入避免一般绑定入口提前加载来源读取协调器;不接受手造观测端点模型。
234
+ from .observed_ingestion import ObservedSourceScan
235
+ if type(observed_scans) is not tuple or any(type(scan) is not ObservedSourceScan for scan in observed_scans):
236
+ raise TypeError('无字段绑定证明需实际ObservedSourceScan tuple')
237
+ history._check('sealed')
238
+ if {item.name for item in declarations.sources} != set(history.validators):
239
+ raise ValueError('当前声明与实际历史来源不对应')
240
+ # 同一个真实owner贯穿预约、回放及返回,首次预算更新后取消不会落在保护块之外。
241
+ owner = DecodedBindingLease(history.budget)
242
+ try:
243
+ # 固定公式保持原额;单行读取另由原游标预算承担,不依据共享余额猜测所有权。
244
+ owner._history, owner._declarations = history, declarations
245
+ cost = 32768 + len(declarations.sources) * 8192 + len(declarations.signals) * 2048 + 16 * _metadata_bytes(
246
+ (declarations, tuple((item.description, item.request) for item in history.validators.values())))
247
+ _reserve_owned_ram(owner, cost, '_cost')
248
+ owner._evidence = []
249
+ completions = history.source_completions
250
+ for source in declarations.sources:
251
+ validator = history.validators[source.name]
252
+ description, request = validator.description, validator.request
253
+ owner._definitions = require_decoded_source_contract(declarations, source, description, request)
254
+ # 纯合同先拒绝无字段却有投影;随后仍以同一真实scan补完整空源时钟证明。
255
+ if not description.fields:
256
+ _require_empty_source_scan(source, history, observed_scans)
257
+ completion = completions[source.name]
258
+ if completion.session_id != declarations.session_id or not completion.source_eof:
259
+ raise ValueError('当前会话缺whole-source EOF事实')
260
+ sample_count, progress_count, final_progress = 0, 0, None
261
+ owner._reader = history.iter_records(source.name)
262
+ # 每次仅一条记录;样本经原游标核对来源/会话/投影/批次和实际SHA。
263
+ for owner._current in owner._reader:
264
+ if isinstance(owner._current, HistorySample):
265
+ definition = owner._definitions[owner._current.name]
266
+ labels = tuple(dict.fromkeys(label for _, label in definition.choices)) if definition.dtype is SignalDType.ENUM else ()
267
+ if (owner._current.source_ref.field != definition.field or owner._current.value.dtype is not definition.dtype
268
+ or owner._current.unit != definition.unit or owner._current.value.labels != labels):
269
+ raise ResultFormatError('实际历史样本与当前绑定契约不符')
270
+ sample_count += 1
271
+ elif isinstance(owner._current, HistoryProgress):
272
+ progress_count += 1
273
+ final_progress = owner._current
274
+ # 本行已完成校验;下次实际读可能自行EOF/清理,不跨该动作借留样本。
275
+ owner._current = None
276
+ # 提前close也会令for结束,但不能提供真实文件EOF证明。
277
+ if not owner._reader.verified_eof or final_progress != completion:
278
+ raise ResultFormatError('运行绑定未完成实际EOF核对或最终事实不一致')
279
+ owner._evidence.append(DecodedSourceEvidence(source=source.name, session_id=declarations.session_id,
280
+ description_sha256=_fingerprint(description), request_sha256=_fingerprint(request),
281
+ history_sha256=owner._reader.digest.hexdigest(), sample_count=sample_count, progress_count=progress_count,
282
+ projected_aliases=request.signal_names, observation_start_ns=description.observation_start_ns,
283
+ observation_end_ns=completion.observed_end_ns, source_eof=completion.source_eof))
284
+ # 原reader正常已在真实EOF处关闭;显式收尾成功后才结束唯一子责任槽。
285
+ owner._close_reader()
286
+ owner._bindings = DecodedBindings(declarations, tuple(owner._evidence))
287
+ owner._clear_temporary()
288
+ return owner
289
+ except BaseException as exc:
290
+ owner._failed = True
291
+ # reader构造/注册尚未返回时原工厂负责交出实际对象,禁止伪造半初始化owner。
292
+ child = getattr(exc, 'history_iterator_cleanup_owner', None)
293
+ if owner._reader is None and child is not None:
294
+ owner._reader = child
295
+ _cleanup_owner(owner, exc, 'decoded_binding_lease_cleanup_owner', '解码绑定工厂')
296
+ raise