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,338 @@
1
+ """从有限历史块得到完整的样本极值或算术均值,可附独立BOOL选择条件。
2
+
3
+ 输入是已封存的新解码历史、原保持上下文、实际绑定、编译表达式和原指标请求。
4
+ 每次step最多消费一个有限块;均值不建立第二遍块源,也不重新扫描原来源。
5
+ 样本均值累计原序真实更新的原单位总和,完整EOF后除总样本数并换单位一次。
6
+ TTL、条件更新和裁剪保持不增加样本;完整双覆盖、未知和来源动态先预约费用。
7
+ observation显式限制原domain内的计算观测域,样本只取该域半开范围内真实更新;
8
+ None兼容原domain及原预算,不证明实际观测。原context、绑定和请求窗口不改变。
9
+ 自有分块者、当前块、数值状态和结果由close释放;借用历史、上下文与绑定保持。
10
+ 预算是新分析层保守估算,超限明确失败,不承诺进程RSS或旧来源缓冲受控。
11
+ """
12
+
13
+ # 只组合新分析分块者、独立样本核和既有结果政策,历史读写与解码保持原样。
14
+ from ..core.decoded_binding import DecodedBindings
15
+ from ..core.expression import CompiledExpression
16
+ from ..core.calculations import CalculationDefinition, make_calculation_result
17
+ from ..core.models import Interval
18
+ from ..core.sample_reduction import SampleCalculationFacts
19
+ from ..core.types import QualityFlag as Q
20
+ from ..results.errors import ResultClosedError
21
+ from .history import DecodedHistoryStore, _metadata_bytes
22
+ from .hold import HoldContext
23
+ from .calculation_blocks import HistoricalCalculationBlocks, _calculation_observation
24
+ from .historical_conditional_blocks import HistoricalConditionalBlocks
25
+
26
+
27
+ def _append_ranges(existing, incoming):
28
+ """合并同一种未知的相邻范围,保留真实已知间隔。
29
+
30
+ 参数: existing/incoming为已校验有序Interval tuple。返回: 冻结有序tuple。
31
+ 异常: ValueError为重叠;分配错误传播,调用方须先预约全部候选元数据。
32
+ """
33
+ # 仅合并首尾相接的诊断,不填补中间已知值或可判断条件。
34
+ result = list(existing)
35
+ for item in incoming:
36
+ if result and item.start_ns < result[-1].end_ns:
37
+ raise ValueError('样本指标未知范围重叠')
38
+ if result and item.start_ns == result[-1].end_ns:
39
+ result[-1] = Interval(result[-1].start_ns, item.end_ns)
40
+ else:
41
+ result.append(item)
42
+ return tuple(result)
43
+
44
+
45
+ class HistoricalSampleCalculation:
46
+ """拥有一次有限回读及整窗事实,完整EOF后才开放最终CalculationResult。
47
+
48
+ 极值只留单候选,均值只留有界误差项和真实样本数,不累计全窗值列。
49
+ 数值故障与覆盖事实分开;操作异常后只可close,清理取消保留重试金额和句柄。
50
+ """
51
+
52
+ def __init__(self, history, context, bindings, compiled, spec, condition=None, *,
53
+ backend='numpy', batch_intervals=64, partial_limit=4096, observation=None):
54
+ """校验输入,预留固定状态,再创建自有分块者和纯样本核。
55
+
56
+ 参数: history/context/bindings/compiled为真实新历史及原运行契约;spec为三samples请求;
57
+ condition为可选BOOL表达式,None表示全TRUE;backend为reference或numpy;
58
+ batch_intervals为有限正区间数,partial_limit为浮点误差项容量。
59
+ observation为原domain内已核实Interval;None保留原domain,不是观测证明。
60
+ 返回: 尚未消费历史的新owner。
61
+ 异常: 类型、能力、预算或构造错误;持续清理失败的原异常附
62
+ historical_sample_calculation_cleanup_owner,恢复环境后可调用其close。
63
+ """
64
+ # 来源身份与BOOL条件仍由真实分块者校验;本层先拒绝模型和能力错误。
65
+ if (not isinstance(history, DecodedHistoryStore) or not isinstance(context, HoldContext)
66
+ or not isinstance(bindings, DecodedBindings) or not isinstance(compiled, CompiledExpression)
67
+ or not isinstance(spec, CalculationDefinition)
68
+ or condition is not None and not isinstance(condition, CompiledExpression)):
69
+ raise TypeError('历史样本指标需真实历史、保持上下文、绑定、表达式和CalculationDefinition')
70
+ if spec.operation not in ('sample_minimum', 'sample_maximum', 'sample_mean'):
71
+ raise ValueError('当前样本归约只接三种samples算子')
72
+ if (backend not in ('reference', 'numpy') or type(batch_intervals) is not int
73
+ or batch_intervals < 1 or type(partial_limit) is not int or partial_limit < 1):
74
+ raise ValueError('历史样本指标需合法后端、正块大小与误差项容量')
75
+ # 冻结原请求的真实交集和初始自有状态,借用资源只保存引用,不接管其生命周期。
76
+ observed = _calculation_observation(context, observation)
77
+ left = max(observed.start_ns, spec.window.start_ns)
78
+ right = min(observed.end_ns, spec.window.end_ns)
79
+ self._actual = Interval(left, right) if left <= right else None
80
+ self._history, self._context, self._bindings = history, context, bindings
81
+ self._observation = observation
82
+ self._compiled, self._spec, self._condition, self._backend = compiled, spec, condition, backend
83
+ self._batch_intervals, self._partial_limit = batch_intervals, partial_limit
84
+ self._budget, self._held_cost = history.budget, 0
85
+ self._blocks = self._current = self._reducer = self._result = None
86
+ self._closed = self._closing = self._failed = self._finished = False
87
+ self._fact_cost = 0
88
+ self._cursor = None if self._actual is None else self._actual.start_ns
89
+ self._value_duration = self._selected_duration = self._sample_count = 0
90
+ self._known_duration = self._selected_value_unknown = self._false_duration = 0
91
+ self._unknown, self._condition_unknown, self._refs, self._quality = (), (), (), Q.NONE
92
+ try:
93
+ # 固定有界误差状态与原契约先计费,动态诊断与有限核工作区另行预约。
94
+ identity = None if condition is None else condition.identity
95
+ self._reserve(131072 + 1024 * partial_limit +
96
+ 16 * _metadata_bytes((context, bindings.sources, compiled.identity, identity, spec))
97
+ + (0 if observation is None else 16 * _metadata_bytes(observation)))
98
+ self._reducer = self._make_reducer()
99
+ self._blocks = self._make_blocks()
100
+ except BaseException as exc:
101
+ # 子构造未返回时接管其原异常上的实际自有恢复句柄,不关闭借用历史。
102
+ attr = 'calculation_blocks_cleanup_owner' if condition is None else 'conditional_blocks_cleanup_owner'
103
+ child = getattr(exc, attr, None)
104
+ if child is not None:
105
+ self._blocks = child
106
+ try:
107
+ self.close()
108
+ except BaseException as cleanup:
109
+ exc.add_note(f'历史样本指标构造清理失败: {type(cleanup).__name__}')
110
+ if not self._closed:
111
+ try:
112
+ self.close()
113
+ except BaseException as retry:
114
+ exc.add_note(f'历史样本指标构造清理重试失败: {type(retry).__name__}')
115
+ if not self._closed:
116
+ exc.historical_sample_calculation_cleanup_owner = self
117
+ raise
118
+
119
+ def _make_reducer(self):
120
+ """创建所选后端的独立样本核,不需要预先知道均值分母。
121
+
122
+ 参数: 无。返回: 对应SampleReduction。异常: 原配置、数值模型或分配错误。
123
+ """
124
+ if self._backend == 'reference':
125
+ from ..core.sample_reduction_reference import ReferenceSampleReduction
126
+ factory = ReferenceSampleReduction
127
+ else:
128
+ from ..core.sample_reduction_numpy import NumpySampleReduction
129
+ factory = NumpySampleReduction
130
+ # 实际每块仍校验unit/dtype,均值计数来自原值实际更新,不能按块数平均。
131
+ return factory(self._spec, self._compiled.root.unit, self._compiled.root.dtype,
132
+ partial_limit=self._partial_limit)
133
+
134
+ def _make_blocks(self):
135
+ """创建一次自有历史回读者,按可选条件选择单源或联合边界。
136
+
137
+ 参数: 无。返回: HistoricalCalculationBlocks或HistoricalConditionalBlocks。
138
+ 异常: 原构造、身份、条件或预算错误;持续清理入口由构造调用方接管。
139
+ """
140
+ # 同一观测域决定半开真实样本截止;条件两路不能回退到原domain。
141
+ if self._condition is None:
142
+ return HistoricalCalculationBlocks(self._history, self._context, self._bindings,
143
+ self._compiled, self._spec, backend=self._backend, batch_intervals=self._batch_intervals,
144
+ observation=self._observation)
145
+ return HistoricalConditionalBlocks(self._history, self._context, self._bindings,
146
+ self._compiled, self._spec, self._condition, backend=self._backend,
147
+ batch_intervals=self._batch_intervals, observation=self._observation)
148
+
149
+ @property
150
+ def closed(self):
151
+ """读取实际关闭状态。参数: 无。返回: bool。异常: 无。"""
152
+ return self._closed
153
+
154
+ @property
155
+ def failed(self):
156
+ """读取操作失败状态。参数: 无。返回: bool。异常: 无。"""
157
+ return self._failed
158
+
159
+ @property
160
+ def finished(self):
161
+ """读取完整分类状态。参数: 无。返回: bool。异常: 无。"""
162
+ return self._finished
163
+
164
+ @property
165
+ def result(self):
166
+ """借出完整窗口结果,关闭或失败后不再开放。
167
+
168
+ 参数: 无。返回: CalculationResult。异常: 未完成/失败/关闭时拒绝。
169
+ """
170
+ self._require_open()
171
+ if self._failed or not self._finished:
172
+ raise RuntimeError('历史样本指标尚未成功完成')
173
+ return self._result
174
+
175
+ def _require_open(self):
176
+ """拒绝半关闭或已关闭操作。参数: 无。返回: None。异常: ResultClosedError。"""
177
+ if self._closed or self._closing:
178
+ raise ResultClosedError('历史样本指标已关闭或正在清理')
179
+
180
+ def _reserve(self, amount):
181
+ """先申请本owner费用,按实际账本接管成功后取消。
182
+
183
+ 参数: amount为bytes。返回: None。异常: 预算或取消错误。
184
+ """
185
+ before = self._budget.ram_bytes
186
+ try:
187
+ self._budget.reserve_ram(amount)
188
+ finally:
189
+ if self._budget.ram_bytes == before + amount:
190
+ self._held_cost += amount
191
+
192
+ def _release(self, amount):
193
+ """扣账后即更新自有金额,释放前取消保留重试。
194
+
195
+ 参数: amount为bytes。返回: None。异常: 原释放或取消错误。
196
+ """
197
+ before = self._budget.ram_bytes
198
+ try:
199
+ self._budget.release_ram(amount)
200
+ finally:
201
+ if self._budget.ram_bytes == before - amount:
202
+ self._held_cost -= amount
203
+
204
+ def _append_facts(self, facts):
205
+ """核对连续完整划分,先计费再保存双未知和完整来源。
206
+
207
+ 参数: facts为纯核当前有限SampleCalculationFacts。返回: None。
208
+ 异常: 结构、身份、重复范围、预算或复制失败,此后只可关闭。
209
+ """
210
+ if (not isinstance(facts, SampleCalculationFacts) or facts.spec != self._spec
211
+ or facts.input_unit != self._compiled.root.unit or facts.dtype != self._compiled.root.dtype
212
+ or facts.binding_identity != self._compiled.identity):
213
+ raise ValueError('样本块事实与原请求或真实表达式不同')
214
+ actual = facts.actual_window
215
+ if actual is None:
216
+ if self._actual is not None:
217
+ raise ValueError('样本块缺失真实交集')
218
+ elif self._actual is None or actual.start_ns != self._cursor or actual.end_ns > self._actual.end_ns:
219
+ raise ValueError('样本块必须按真实交集连续推进')
220
+ # 候选复制时旧事实仍存在,动态计费含双未知及完整SourceRef子类的全部定位。
221
+ candidate_cost = 65536 + 16 * (_metadata_bytes((self._unknown, self._condition_unknown, self._refs))
222
+ + _metadata_bytes(facts))
223
+ self._reserve(candidate_cost)
224
+ value_unknown = _append_ranges(self._unknown, facts.value_unknown_ranges)
225
+ condition_unknown = _append_ranges(self._condition_unknown, facts.condition_unknown_ranges)
226
+ refs = list(self._refs)
227
+ for item in facts.source_refs:
228
+ if not any(type(item) is type(previous) and item == previous for previous in refs):
229
+ refs.append(item)
230
+ # 只安装已校验候选;释放旧费用取消时,全部金额仍归本owner,不能交付前缀结果。
231
+ old_cost = self._fact_cost
232
+ self._unknown, self._condition_unknown, self._refs = value_unknown, condition_unknown, tuple(refs)
233
+ self._value_duration += facts.value_valid_duration_ns
234
+ self._selected_duration += facts.selected_duration_ns
235
+ self._sample_count += facts.valid_sample_count
236
+ self._known_duration += facts.condition_known_duration_ns
237
+ self._selected_value_unknown += facts.selected_value_unknown_duration_ns
238
+ self._false_duration += facts.false_duration_ns
239
+ self._quality |= facts.quality
240
+ self._cursor = None if actual is None else actual.end_ns
241
+ self._fact_cost = candidate_cost
242
+ self._release(old_cost)
243
+
244
+ def _facts_snapshot(self):
245
+ """完整EOF后构造整窗事实,不以未完成前缀冒充整窗。
246
+
247
+ 参数: 无。返回: SampleCalculationFacts。异常: 完整范围或双覆盖矛盾。
248
+ """
249
+ if self._actual is not None and self._cursor != self._actual.end_ns:
250
+ raise ValueError('样本指标尚未完整消费真实交集')
251
+ duration = 0 if self._actual is None else self._actual.end_ns - self._actual.start_ns
252
+ # 两个独立分区均需覆盖实际域,FALSE已知,不能计入条件未知。
253
+ if self._value_duration + sum(item.end_ns - item.start_ns for item in self._unknown) != duration:
254
+ raise ValueError('样本全窗值覆盖不完整')
255
+ if self._known_duration + sum(item.end_ns - item.start_ns for item in self._condition_unknown) != duration:
256
+ raise ValueError('样本全窗条件覆盖不完整')
257
+ return SampleCalculationFacts(self._spec, self._actual, self._value_duration,
258
+ self._known_duration, self._selected_duration, self._selected_value_unknown,
259
+ self._false_duration, self._sample_count, self._unknown, self._condition_unknown,
260
+ self._quality, self._compiled.root.unit, self._compiled.root.dtype,
261
+ self._compiled.identity, self._refs)
262
+
263
+ def _finish(self):
264
+ """按完整事实和最终数值分类一次,原序样本和无需第二遍。
265
+
266
+ 参数: 无。返回: False表示最终完成。异常: 覆盖、数值快照、预算或取消错误。
267
+ """
268
+ # 快照与分类复制前先预约完整双未知和来源;费用持有至close,不是临时裸分配。
269
+ self._reserve(65536 + 16 * _metadata_bytes((self._unknown, self._condition_unknown, self._refs)))
270
+ facts = self._facts_snapshot()
271
+ number = self._reducer.finish()
272
+ duration = 0 if facts.actual_window is None else facts.actual_window.end_ns - facts.actual_window.start_ns
273
+ # 只有请求全窗充分FALSE才证明空选择;无真实样本与UNKNOWN仍按既有政策区分。
274
+ all_false = (facts.actual_window == self._spec.window and duration > 0
275
+ and facts.false_duration_ns == duration)
276
+ self._result = make_calculation_result(self._spec, facts, number.value, number.unit, facts.actual_window,
277
+ facts.value_valid_duration_ns, facts.condition_known_duration_ns, facts.selected_duration_ns,
278
+ facts.selected_value_unknown_duration_ns, facts.valid_sample_count,
279
+ facts.value_unknown_ranges, facts.condition_unknown_ranges, facts.quality | number.quality,
280
+ all_false=all_false, calculation_failed=number.calculation_failed)
281
+ self._finished = True
282
+ return False
283
+
284
+ def step(self):
285
+ """处理至多一个有限块,完整EOF分类后才返回False。
286
+
287
+ 参数: 无。返回: bool;完成后重复False。异常: 读取/数值/预算/取消错误,随后仅close。
288
+ """
289
+ self._require_open()
290
+ if self._failed:
291
+ raise RuntimeError('失败的样本指标只能关闭')
292
+ if self._finished:
293
+ return False
294
+ try:
295
+ try:
296
+ self._current = next(self._blocks)
297
+ except StopIteration:
298
+ return self._finish()
299
+ # 有限N行数组、掩码和样本临时先预约;不累积全窗值,原单位总和只留有界状态。
300
+ series = self._current.series
301
+ workspace = 65536 + 2048 * len(series.times_ns) + 16 * _metadata_bytes(series.source_refs)
302
+ self._reserve(workspace)
303
+ facts = self._reducer.push(series)
304
+ self._append_facts(facts)
305
+ del facts, series
306
+ self._current.close()
307
+ self._current = None
308
+ self._release(workspace)
309
+ return True
310
+ except BaseException:
311
+ self._failed = True
312
+ raise
313
+
314
+ def close(self):
315
+ """关闭自有当前块、分块者和金额,保留借用历史及原调用方状态。
316
+
317
+ 参数: 无。返回: None,重复关闭安全。异常: 关闭或释放取消可重试。
318
+ """
319
+ if self._closed:
320
+ return
321
+ # 进入清理即禁止结果访问;每个自有句柄仅在close成功后移除,取消时留待重试。
322
+ self._closing = True
323
+ try:
324
+ if self._current is not None:
325
+ self._current.close()
326
+ self._current = None
327
+ if self._blocks is not None:
328
+ self._blocks.close()
329
+ self._blocks = None
330
+ self._release(self._held_cost)
331
+ finally:
332
+ # 所有句柄已释放且实际自有金额为0才清空状态;不拿借用账本总额充当关闭证明。
333
+ if self._current is None and self._blocks is None and self._held_cost == 0:
334
+ self._result = self._reducer = None
335
+ self._history = self._context = self._bindings = self._compiled = self._condition = None
336
+ self._observation = None
337
+ self._unknown = self._condition_unknown = self._refs = ()
338
+ self._closed = True
@@ -0,0 +1,300 @@
1
+ """从有限历史输入逐行借出真实更新的SelectionRow,保留TRUE与UNKNOWN。
2
+
3
+ 输入为已封存的新解码历史、保持上下文、实际绑定、值表达式、select请求和可选
4
+ BOOL条件。只回读新历史,由原单值/联合分块者保留TTL、同刻和半开更新标志;
5
+ 每块复用独立select_reference或select_numpy,不重扫来源adapter,不物化全窗行表。
6
+ FALSE过滤,UNKNOWN诊断行保留;原数值、BOOL、ENUM的dtype/标签/单位/质量不转换。
7
+ observation显式限制原domain内的计算域;该域右端点及之后的真实更新和UNKNOWN行
8
+ 不再输出。None兼容原domain及预算,不证明实际观测,不改变原context、绑定或请求。
9
+
10
+ 资源分为七类:借用history、context、bindings及共享budget不由本owner关闭;自有
11
+ 分块者及其回读/登记归_blocks,单当前CalculationBlock归_current,选择核生成器及有限
12
+ 数组/索引归_rows;固定描述费用由_held_cost持有,核workspace归_workspace_cost,
13
+ 单当前借出行及完整定位归_row/_row_cost。核和行分配前预约费用,取消按真实账本
14
+ 更新归属,生成器close成功才丢句柄。返回行只借出至下一次next或close;外部独立
15
+ 保存行须另计预算,ResultSpool编码/写入费用也另付。不承诺旧来源缓冲或进程RSS。
16
+ """
17
+
18
+ # 仅组合有限新历史分块与现有独立选择核,不修改完整核或结果schema。
19
+ from dataclasses import replace
20
+ from ..core.decoded_binding import DecodedBindings
21
+ from ..core.expression import CompiledExpression
22
+ from ..core.calculations import CalculationDefinition
23
+ from ..core.calculations_memory_reference import require_calculation_plan
24
+ from ..results.errors import ResultClosedError
25
+ from .history import DecodedHistoryStore, _metadata_bytes
26
+ from .hold import HoldContext
27
+ from .calculation_blocks import HistoricalCalculationBlocks, _calculation_observation
28
+ from .historical_conditional_blocks import HistoricalConditionalBlocks
29
+
30
+
31
+ class HistoricalSelectionRows:
32
+ """拥有单当前块、有限核生成器和当前行费用,失败后只可重试关闭。
33
+
34
+ 数值与筛选由所选独立核完成,strict/minimum_coverage沿原行流语义,不造伪标量。
35
+ exhausted为正常EOF,与显式closed不同;EOF释放回读、当前块、核与行,固定描述费用保留至close。
36
+ 再次next仍StopIteration,不将耗尽当作显式关闭。
37
+ 任何清理失败保留实际句柄及金额,半关闭后不再交付行,不关闭借用历史或原状态。
38
+ """
39
+
40
+ def __init__(self, history, context, bindings, compiled, spec, condition=None, *,
41
+ backend='numpy', batch_intervals=64, observation=None):
42
+ """检查真实select契约,先计费固定描述,再构造自有分块者。
43
+
44
+ 参数: history/context/bindings/compiled为真实新历史及原执行契约,spec为select;
45
+ condition为可选同绑定BOOL条件;backend为reference/numpy,batch_intervals为正区间上限。
46
+ observation为原domain内已核实Interval;None兼容原domain及原预算。
47
+ 返回: 尚未消费历史的行owner。异常: 类型、能力、同步、预算、构造或取消错误;
48
+ 持续清理失败时原异常附historical_selection_rows_cleanup_owner用于恢复close。
49
+ """
50
+ # 真实身份与联合同步在构造资源前检查,选择行不允许隐式输出单位转换。
51
+ if (not isinstance(history, DecodedHistoryStore) or not isinstance(context, HoldContext)
52
+ or not isinstance(bindings, DecodedBindings) or not isinstance(compiled, CompiledExpression)
53
+ or not isinstance(spec, CalculationDefinition)
54
+ or condition is not None and not isinstance(condition, CompiledExpression)):
55
+ raise TypeError('历史选择行需真实历史、上下文、绑定、表达式和CalculationDefinition')
56
+ if spec.operation != 'select' or spec.output_unit not in (None, compiled.root.unit):
57
+ raise ValueError('历史选择行需select且保留原表达式单位')
58
+ if (backend not in ('reference', 'numpy') or type(batch_intervals) is not int or batch_intervals < 1):
59
+ raise ValueError('历史选择行需合法后端与正原生int块大小')
60
+ if compiled.bindings.identity != bindings.identity:
61
+ raise ValueError('选择行表达式与实际绑定不同')
62
+ require_calculation_plan(compiled, spec, condition)
63
+ # 只验证显式范围,不创建派生context;块层按半开实际域裁剪原值更新和UNKNOWN行。
64
+ _calculation_observation(context, observation)
65
+ # 构造失败前准备可清理字段;借用引用与自有句柄明确区分,金额从0开始。
66
+ self._history, self._context, self._bindings = history, context, bindings
67
+ self._observation = observation
68
+ self._compiled, self._spec, self._condition, self._backend = compiled, spec, condition, backend
69
+ self._batch_intervals, self._budget = batch_intervals, history.budget
70
+ self._blocks = self._current = self._rows = self._row = None
71
+ self._held_cost = self._workspace_cost = self._row_cost = self._row_estimate = 0
72
+ self._closed = self._closing = self._failed = self._exhausted = False
73
+ try:
74
+ # 固定描述费用在自有子对象创建前预约,动态完整refs和核/行费用按当前块另计。
75
+ identity = None if condition is None else condition.identity
76
+ self._reserve(65536 + 16 * _metadata_bytes((context, bindings.sources, compiled.identity, identity, spec))
77
+ + (0 if observation is None else 16 * _metadata_bytes(observation)))
78
+ self._blocks = self._make_blocks()
79
+ except BaseException as exc:
80
+ # 子构造未返回也可能拥有历史读取句柄,接管原异常上的真实恢复入口。
81
+ attr = 'calculation_blocks_cleanup_owner' if condition is None else 'conditional_blocks_cleanup_owner'
82
+ child = getattr(exc, attr, None)
83
+ if child is not None:
84
+ self._blocks = child
85
+ for attempt in range(2):
86
+ try:
87
+ self.close()
88
+ break
89
+ except BaseException as cleanup:
90
+ exc.add_note(f'历史选择行构造清理第{attempt+1}次失败: {type(cleanup).__name__}')
91
+ if not self._closed:
92
+ exc.historical_selection_rows_cleanup_owner = self
93
+ exc.add_note('释放恢复后调用historical_selection_rows_cleanup_owner.close()')
94
+ raise
95
+
96
+ def _make_blocks(self):
97
+ """创建一次自有单值或联合回读者,借用资源不接管关闭。
98
+
99
+ 参数: 无。返回: HistoricalCalculationBlocks或HistoricalConditionalBlocks。
100
+ 异常: 原构造/身份/同步/预算错误,恢复句柄由父构造接管。
101
+ """
102
+ # 两输入能力已明确支持select,条件BOOL内部保持与原分块/TTL行为相同。
103
+ if self._condition is None:
104
+ return HistoricalCalculationBlocks(self._history, self._context, self._bindings,
105
+ self._compiled, self._spec, backend=self._backend, batch_intervals=self._batch_intervals,
106
+ observation=self._observation)
107
+ return HistoricalConditionalBlocks(self._history, self._context, self._bindings,
108
+ self._compiled, self._spec, self._condition, backend=self._backend, batch_intervals=self._batch_intervals,
109
+ observation=self._observation)
110
+
111
+ @property
112
+ def closed(self):
113
+ """读取全部自有资源关闭事实。参数: 无。返回: bool。异常: 无。"""
114
+ return self._closed
115
+
116
+ @property
117
+ def failed(self):
118
+ """读取操作失败状态。参数: 无。返回: bool。异常: 无。"""
119
+ return self._failed
120
+
121
+ @property
122
+ def exhausted(self):
123
+ """读取正常EOF事实。参数: 无。返回: bool。异常: 无。"""
124
+ return self._exhausted
125
+
126
+ def __iter__(self):
127
+ """返回本行owner。参数: 无。返回: self。异常: 无。"""
128
+ return self
129
+
130
+ def _reserve(self, amount, *, slot=None):
131
+ """申请固定/工作区/当前行费用,并接管预约成功后取消的真实金额。
132
+
133
+ 参数: amount为bytes,slot可为_workspace_cost或_row_cost;None为固定描述。
134
+ 返回: None。异常: 预算或取消传播,未真正增加账本时不记所有权。
135
+ """
136
+ before = self._budget.ram_bytes
137
+ try:
138
+ self._budget.reserve_ram(amount)
139
+ finally:
140
+ # 本次预约不含子操作,只按真实新增amount同时登记总额与费用所属槽位。
141
+ if self._budget.ram_bytes == before + amount:
142
+ self._held_cost += amount
143
+ if slot is not None:
144
+ setattr(self, slot, getattr(self, slot) + amount)
145
+
146
+ def _release(self, amount, *, slot=None):
147
+ """抵销实际自有费用,释放前取消保留金额,释放后取消立即更新归属。
148
+
149
+ 参数: amount为bytes,slot为对应工作区/行槽位或None。返回: None。
150
+ 异常: 原释放/取消传播,恢复后close不能再次抵销已释放费用。
151
+ """
152
+ before = self._budget.ram_bytes
153
+ try:
154
+ self._budget.release_ram(amount)
155
+ finally:
156
+ if self._budget.ram_bytes == before - amount:
157
+ self._held_cost -= amount
158
+ if slot is not None:
159
+ setattr(self, slot, getattr(self, slot) - amount)
160
+
161
+ def _drop_row(self):
162
+ """结束当前借出行生命周期,释放取消时保留真实未抵销金额。
163
+
164
+ 参数: 无。返回: None。异常: 行费用释放或取消传播,之后只允许close。
165
+ """
166
+ # 先丢自有行引用,再按实际账本释放;外部独立保留引用须由外部另行计费。
167
+ self._row = None
168
+ if self._row_cost:
169
+ self._release(self._row_cost, slot='_row_cost')
170
+
171
+ def _drop_current(self):
172
+ """先关闭核生成器再关当前块,全部成功后释放当前核workspace。
173
+
174
+ 参数: 无。返回: None。异常: generator/block关闭、释放或取消传播,可重试。
175
+ """
176
+ # 生成器可能仍持有当前series和数组,close成功前不能丢句柄或归还工作区费用。
177
+ if self._rows is not None:
178
+ self._rows.close()
179
+ self._rows = None
180
+ if self._current is not None:
181
+ self._current.close()
182
+ self._current = None
183
+ if self._workspace_cost:
184
+ self._release(self._workspace_cost, slot='_workspace_cost')
185
+ self._row_estimate = 0
186
+
187
+ def _load_current(self):
188
+ """取得一个有限块,在第一次消费选择核前预约全部核及行上界元数据。
189
+
190
+ 参数: 无。返回: None。异常: EOF为StopIteration;读取、预算、核构造或取消传播。
191
+ """
192
+ # 自有分块者被外部关闭/失败时明确拒绝,不能把损坏生命周期当正常EOF。
193
+ if self._blocks.closed or self._blocks.failed or self._blocks._closing:
194
+ raise ResultClosedError('选择行自有分块者已关闭、失败或正在清理')
195
+ self._current = next(self._blocks)
196
+ series = self._current.series
197
+ # N行数组/布尔掩码/索引和完整refs动态费用先预约;不会累计全窗行列表。
198
+ workspace = 65536 + 2048 * len(series.times_ns) + 16 * _metadata_bytes(series.source_refs)
199
+ self._reserve(workspace, slot='_workspace_cost')
200
+ if self._condition is not None:
201
+ # 联合身份沿既有内存select入口;replace只在workspace已取得后复制冻结模型。
202
+ identity = self._compiled.identity + ':' + self._condition.identity
203
+ series = replace(series, binding_identity=identity)
204
+ # 当前行上界含最长原值/枚举标签、单位、联合身份和完整来源,分配前按此费用预约。
205
+ value_metadata = max(_metadata_bytes(value) for value in series.values)
206
+ self._row_estimate = 4096 + 16 * (_metadata_bytes((series.source_refs, series.binding_identity, series.unit)) + value_metadata)
207
+ if self._backend == 'reference':
208
+ from ..core.calculations_reference import select_reference
209
+ self._rows = select_reference(series, self._spec)
210
+ else:
211
+ from ..core.calculations_numpy import select_numpy
212
+ self._rows = select_numpy(series, self._spec)
213
+
214
+ def _finish_exhaustion(self):
215
+ """正常EOF释放当前核/行/块费用,保留固定描述至explicit close。
216
+
217
+ 参数: 无。返回: None。异常: 关闭/释放取消传播,失败后仅可close恢复。
218
+ """
219
+ # EOF不等于显式close,但自有当前行、生成器、当前块和分块者都不再需要。
220
+ self._drop_row()
221
+ self._drop_current()
222
+ if self._blocks is not None:
223
+ self._blocks.close()
224
+ self._blocks = None
225
+ # 原配置、identity和exhausted状态仍由owner持有,固定描述费用只在explicit close归还。
226
+ self._exhausted = True
227
+
228
+ def __next__(self):
229
+ """借出至下一次推进/close的单SelectionRow,TRUE/UNKNOWN原样交付。
230
+
231
+ 参数: 无。返回: 一个SelectionRow;FALSE、非实际更新和半开右端由原核过滤。
232
+ 异常: 正常EOF可重复StopIteration;关闭/半关闭ResultClosedError;其他操作失败后仅close。
233
+ """
234
+ if self._closed or self._closing:
235
+ raise ResultClosedError('历史选择行已关闭或正在清理')
236
+ if self._failed:
237
+ raise RuntimeError('失败的历史选择行只能关闭')
238
+ if self._exhausted:
239
+ raise StopIteration
240
+ try:
241
+ # 当前核可能仍持有已关闭输入的series;子owner/块失效后不得继续借出悬挂前缀行。
242
+ if (self._blocks is not None and (self._blocks.closed or self._blocks.failed or self._blocks._closing)
243
+ or self._current is not None and (self._current.closed or self._current._closing)):
244
+ raise ResultClosedError('选择行自有输入已关闭、失败或正在清理')
245
+ # 下一次推进结束上一行借出费用;块内只留一行,不积累输出历史。
246
+ self._drop_row()
247
+ while True:
248
+ if self._rows is None:
249
+ try:
250
+ self._load_current()
251
+ except StopIteration:
252
+ self._finish_exhaustion()
253
+ raise StopIteration
254
+ # 生成器第一次next会执行NumPy数组与索引;workspace和当前行费用已先取得。
255
+ self._reserve(self._row_estimate, slot='_row_cost')
256
+ try:
257
+ row = next(self._rows)
258
+ except StopIteration:
259
+ self._drop_row()
260
+ self._drop_current()
261
+ continue
262
+ self._row = row
263
+ return row
264
+ except StopIteration:
265
+ raise
266
+ except BaseException:
267
+ self._failed = True
268
+ raise
269
+
270
+ def close(self):
271
+ """关闭核、当前块、分块者和自有费用,借用资源保持,重复关闭安全。
272
+
273
+ 参数: 无。返回: None。异常: generator/block/分块者关闭或金额释放取消可重试。
274
+ """
275
+ if self._closed:
276
+ return
277
+ # 进入清理后禁推进;句柄只在对应close成功后丢弃,不让持续取消丢失恢复入口。
278
+ self._closing = True
279
+ try:
280
+ # 先结束自有行引用并关闭generator;其frame/数组仍在时不释放任何核费用。
281
+ self._row = None
282
+ if self._rows is not None:
283
+ self._rows.close()
284
+ self._rows = None
285
+ if self._current is not None:
286
+ self._current.close()
287
+ self._current = None
288
+ if self._blocks is not None:
289
+ self._blocks.close()
290
+ self._blocks = None
291
+ # 自有句柄全关后统一抵销固定/核/当前行金额;前后取消由实际held账本恢复。
292
+ if self._held_cost:
293
+ self._release(self._held_cost)
294
+ finally:
295
+ # 自有各句柄和实际持有金额全部清零才closed,不以借用账本全局余额代替证明。
296
+ if self._rows is None and self._current is None and self._blocks is None and self._held_cost == 0:
297
+ self._workspace_cost = self._row_cost = self._row_estimate = 0
298
+ self._history = self._context = self._bindings = self._compiled = self._condition = None
299
+ self._observation = None
300
+ self._closed = True