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,449 @@
1
+ """将内存来源的原字段与当前计划的信号别名明确关联,并保存可追溯身份。
2
+
3
+ 输入为SessionSpec、SignalDefinition、派生名称和可选同步证据;输出不可变的
4
+ SignalBindings及SHA-256身份。先检查信号转换声明,再检查名称冲突、实际字段
5
+ 存在性和来源归属;联合计算另按实际依赖检查公共时间基准。身份包含实际内存
6
+ 内容、时间映射、转换、有效期和策略,避免同名不同输入混用。
7
+ 本模块只依赖标准库及核心模型,不读取文件,不加载DBC,不持有全局缓存;
8
+ 样本转换、保持和表达式计算由相应执行模块完成。
9
+ """
10
+
11
+ # 冻结数据类存元数据,哈希只处理明确的不可变原生输入。
12
+ from dataclasses import dataclass, field as dataclass_field
13
+ from hashlib import sha256
14
+
15
+ # 共享已校验模型和精确时间协议,不依赖被保护的旧链。
16
+ from .models import SessionSpec, SourceRef, SourceSpec, TimebaseSpec
17
+ from .types import QualityFlag, SignalDType, TimeType
18
+ from .units import require_number, validate_conversion
19
+ from .validation import require_identifier, require_scalar, require_text
20
+ from ..timebase.conversion import require_int64_ns
21
+
22
+
23
+ def _identity(value) -> str:
24
+ """把已知不可变元数据编码为带类型的确定身份文本。
25
+
26
+ 参数: value为本模块内部的原生标量或tuple,可含无效原NaN/Inf。
27
+ 返回: str;保留bool/int区别及浮点位值,tuple用长度前缀防歧义。
28
+ 异常: TypeError为内部未声明结构;不读取文件或执行任意对象repr。
29
+ """
30
+ # tuple逐项编码并保留结构,避免分隔符碰撞。
31
+ if isinstance(value, tuple):
32
+ # 局部输出只用于计划身份,不是产品JSON序列化。
33
+ parts = tuple(_identity(item) for item in value)
34
+ # 每段字符长度明确,字段中的点号/冒号不会改变层级。
35
+ return "t" + "".join(f"{len(item)}:{item}" for item in parts)
36
+ # None与缺失观测保留明确类型。
37
+ if value is None:
38
+ # 不将None等价为0或空文本。
39
+ return "n"
40
+ # 原生类型分别编码,不让True与1共享身份。
41
+ if type(value) is bool:
42
+ # 布尔身份只存在两个值。
43
+ return "b1" if value else "b0"
44
+ # Python整数保留全部位值,不经float。
45
+ if type(value) is int:
46
+ # 负号和十进制值构成精确身份。
47
+ return "i" + str(value)
48
+ # float.hex保留-0及有限浮点身份,诊断NaN/Inf可稳定表示。
49
+ if type(value) is float:
50
+ # NaN不参与普通有效计算,但可存在原始行的输入身份。
51
+ return "f" + value.hex()
52
+ # 已校验文本原样保留,大小写及semantic点号不归一化。
53
+ if type(value) is str:
54
+ # 字符串类型标记避免与整数文本同一身份。
55
+ return "s" + value
56
+ # 只允许本模块明确构造的身份值。
57
+ raise TypeError("绑定身份含未声明结构")
58
+
59
+
60
+ def _source_identity(source: SourceSpec) -> str:
61
+ """保存内存来源定位、时间映射、观测域和实际行内容的身份。
62
+
63
+ 参数: source为已校验SourceSpec;原时间单位ns,原sequence不变。
64
+ 返回: SHA256文本;不同原内容不会只因同名来源而复用绑定。
65
+ 异常: TypeError为内部结构错误;无文件或旧reader副作用。
66
+ """
67
+ # 字典字段按名称规范排列,仅用于身份,不改变更新顺序。
68
+ rows = tuple((row.time_ns, row.sequence, tuple(sorted(row.values.items()))) for row in source.rows)
69
+ # 保留原始坐标/offset/范围,不把局部从0开始视为公共起点。
70
+ payload = (source.name, source.source_type.value, source.timebase.timebase_id, source.timebase.time_type.value,
71
+ source.timebase.origin, source.offset_ns, source.observation_start_ns,
72
+ source.observation_end_ns, rows)
73
+ # SHA输入完全来源于冻结模型,不调用任意外部序列化器。
74
+ return sha256(_identity(payload).encode("utf-8")).hexdigest()
75
+
76
+
77
+ @dataclass(frozen=True)
78
+ class SignalDefinition:
79
+ """声明原字段如何映射为分析信号,以及转换后值的类型、单位和有效期。
80
+
81
+ name是表达式使用的简单别名,field保留原字段文本;valid_for_ns为正的有限
82
+ 有效期,None仅表示声明阶段等待DBC周期,不能交给实际状态计算。
83
+ choices保存不可变的原编码与目标标签或bool配对。基础质量策略
84
+ 拒绝全部非零质量位,不接受任意质量策略。方向、位置及可选语义信息只保存
85
+ 调用者声明,不推断业务含义;本对象不保存随时间变化的值。
86
+ input_sign_convention等方向证据属于核心模型元数据,不能据此认为公开JSON
87
+ 配置已经支持同名扩展字段。
88
+ """
89
+
90
+ name: str # 当前计划简单别名。
91
+ source: str # 会话内显式来源名称。
92
+ field: str # memory原字段,不替换点号。
93
+ dtype: SignalDType # 转换后逻辑类型。
94
+ unit: str # 转换后单位,未知标签保留未校验状态。
95
+ valid_for_ns: int | None # 有限有效期,单位纳秒;None为尚待DBC周期的声明。
96
+ input_unit: str | None = None # 缺省使用unit,不推测原DBC单位。
97
+ scale: int | float = 1 # 已解码值之后额外转换,包含方向因子。
98
+ offset: int | float = 0 # 已解码值之后额外偏移。
99
+ choices: tuple[tuple[int | bool | str, str | bool], ...] = () # 明示编码映射。
100
+ valid_range: tuple[int | float, int | float] | None = None # 转换后业务范围。
101
+ invalid_values: tuple[int | float | bool | str | None, ...] = () # 明示原输入无效值。
102
+ sample_policy: str = "backward_hold" # 首版只实施有限向后保持。
103
+ same_time_policy: str = "error" # 可显式选择last_by_sequence,由状态模块按来源序号取最后值。
104
+ semantic_id: str | None = None # 可选领域字符串,不是DSL路径。
105
+ semantic_contract_version: str | None = None # 声明身份,不证明契约通过。
106
+ mapping_version: str | None = None # 当前映射版本身份。
107
+ sign_convention: str | None = None # 转换后方向,由调用者声明。
108
+ measurement_location: str | None = None # 可选测量位置,不从名称猜测。
109
+ input_sign_convention: str | None = None # 转换前方向证据,core typed元数据。
110
+ direction_factor: int = 1 # 方向不变1,显式反转-1。
111
+ unit_status: str = dataclass_field(init=False) # 构造校验所得单位状态。
112
+
113
+ def __post_init__(self) -> None:
114
+ """校验完整声明并冻结默认输入单位及精确有效期。
115
+
116
+ 参数: 无额外参数;valid_for_ns为正int64纳秒,或尚待DBC周期的None。
117
+ 返回: None;unit_status为verified/unverified,未修改输入值。
118
+ 异常: TypeError为字段结构;ValueError为缺项/策略/映射/转换冲突;
119
+ TimeOverflowError为有效期超界。数值样本失败由数值层生成质量原因。
120
+ """
121
+ # 别名和来源都服从简单名称,不接受属性路径。
122
+ require_identifier(self.name, "signal.name")
123
+ # 当前会话显式定位来源,不能继承上次任务。
124
+ require_identifier(self.source, "signal.source")
125
+ # 原字段独立保留文本,合法同名绑定由名称空间校验。
126
+ require_text(self.field, "signal.field")
127
+ # dtype不是字符串占位,也不从值推断。
128
+ if not isinstance(self.dtype, SignalDType):
129
+ # 未解析的配置不能冒充typed定义。
130
+ raise TypeError("signal.dtype必须为SignalDType")
131
+ # 目标单位必填,未知标签可以显式未校验。
132
+ require_text(self.unit, "signal.unit")
133
+ # 默认表示没有额外单位变化,不补DBC信息。
134
+ input_unit = self.unit if self.input_unit is None else require_text(self.input_unit, "signal.input_unit")
135
+ # 声明可以等待DBC;已有数值仍须精确且有限,0不代表无限保持。
136
+ valid_for_ns = (None if self.valid_for_ns is None else
137
+ require_int64_ns(self.valid_for_ns, "valid_for_ns"))
138
+ if valid_for_ns is not None and valid_for_ns <= 0:
139
+ # 错误工程声明执行前失败。
140
+ raise ValueError("valid_for_ns必须大于0")
141
+ # 转换系数拒绝bool、非有限和任意对象。
142
+ require_number(self.scale, "signal.scale")
143
+ # 偏移同样在配置入口校验。
144
+ require_number(self.offset, "signal.offset")
145
+ # 方向因子只支持明确不变或反转。
146
+ if type(self.direction_factor) is not int or self.direction_factor not in (-1, 1):
147
+ # 不接受truthiness或任意工程倍率作为方向。
148
+ raise ValueError("direction_factor必须为1或-1")
149
+ # 可选领域/版本/位置只保存非空原字符串,不建立全局目录。
150
+ for key in ("semantic_id", "semantic_contract_version", "mapping_version", "sign_convention",
151
+ "measurement_location", "input_sign_convention"):
152
+ # 只读取已声明dataclass字段,不用于表达式对象访问。
153
+ value = getattr(self, key)
154
+ # None表示未声明,不伪造缺省契约。
155
+ if value is not None:
156
+ # 空声明不等于有效可选元数据。
157
+ require_text(value, f"signal.{key}")
158
+ # 契约版本没有语义声明时不能独立伪装为绑定证明。
159
+ if self.semantic_contract_version is not None and self.semantic_id is None:
160
+ # 版本须关联可选语义身份。
161
+ raise ValueError("semantic_contract_version需要semantic_id")
162
+ # 明示反转同时保留原/目标方向,不从负scale猜测业务。
163
+ if self.direction_factor == -1 and (self.input_sign_convention is None or self.sign_convention is None):
164
+ # 缺少方向证据的反转不能用于契约校验。
165
+ raise ValueError("方向反转必须声明转换前和转换后方向")
166
+ # 只接受向后保持及明确的同时间策略,行为由状态模块实现。
167
+ if self.sample_policy != "backward_hold" or self.same_time_policy not in ("error", "last_by_sequence"):
168
+ # 不接受插值/未实现策略作为已支持声明。
169
+ raise ValueError("首版仅支持backward_hold及error/last_by_sequence")
170
+ # 固定不可变容器,避免后续外部修改映射或无效值。
171
+ if not isinstance(self.choices, tuple) or not isinstance(self.invalid_values, tuple):
172
+ # 不隐式接受可变dict/list。
173
+ raise TypeError("choices/invalid_values必须为tuple")
174
+ # 输入无效值保留类型,不让bool自动等同整数编码。
175
+ for value in self.invalid_values:
176
+ # 无效原标量可含NaN,数值层另行标记NONFINITE。
177
+ require_scalar(value)
178
+ # 编码身份类型化,避免Python的True==1掩盖冲突。
179
+ keys = set()
180
+ # 每条映射都需明确原编码和目标标签。
181
+ for choice in self.choices:
182
+ # tuple配对之外的结构不可定位。
183
+ if not isinstance(choice, tuple) or len(choice) != 2:
184
+ # 配置层不能传入半个声明。
185
+ raise TypeError("choices各项必须为二元tuple")
186
+ # 明示映射两端,不按顺序自动编号。
187
+ code, label = choice
188
+ # 原编码只接可精确比较的固定类型。
189
+ if type(code) not in (int, bool, str):
190
+ # 浮点/容器不能作为首版枚举编码。
191
+ raise TypeError("choices原编码仅支持int/bool/str")
192
+ # 类型加值构成明确原编码身份。
193
+ key = (type(code), code)
194
+ # 重复编码无法唯一定位业务标签。
195
+ if key in keys:
196
+ # 不取第一条或最后一条隐式覆盖。
197
+ raise ValueError("choices原编码重复")
198
+ # 当前声明中的唯一编码在局部集合登记。
199
+ keys.add(key)
200
+ # enum目标是公开逻辑标签,不允许数值别名。
201
+ if self.dtype is SignalDType.ENUM:
202
+ # 标签保留大小写和领域文本。
203
+ require_text(label, "choices.label")
204
+ elif self.dtype is SignalDType.BOOL:
205
+ # 任意数值truthiness不属于声明布尔映射。
206
+ if type(label) is not bool:
207
+ # 1不是合法目标True。
208
+ raise TypeError("bool choices目标必须为bool")
209
+ else:
210
+ # 数值信号的编码可作为数值处理,不套业务标签映射。
211
+ raise ValueError("choices仅用于enum或bool")
212
+ # enum必须有明确编码/标签域,不接任意字符串。
213
+ if self.dtype is SignalDType.ENUM and not self.choices:
214
+ # 空域不是可执行枚举声明。
215
+ raise ValueError("enum需要非空choices")
216
+ # 标签可由多个编码指向同一含义,域按第一次出现顺序稳定保留。
217
+ if self.dtype in (SignalDType.BOOL, SignalDType.ENUM) and (self.scale != 1 or self.offset != 0):
218
+ # 不对逻辑值施加数值缩放。
219
+ raise ValueError("bool/enum不能声明数值转换")
220
+ # 范围只支持转换后数值,两个端点都要明确。
221
+ if self.valid_range is not None:
222
+ # 不接列表或不完整端点。
223
+ if not isinstance(self.valid_range, tuple) or len(self.valid_range) != 2:
224
+ # 配置结构必须完整。
225
+ raise TypeError("valid_range必须为二元tuple")
226
+ # 逻辑bool/enum不得以数值区间验证业务含义。
227
+ if self.dtype in (SignalDType.BOOL, SignalDType.ENUM):
228
+ # 使用choices声明逻辑域。
229
+ raise ValueError("bool/enum不能使用数值valid_range")
230
+ # 范围端点原生有限,保留整数精度。
231
+ lower = require_number(self.valid_range[0], "valid_range.lower")
232
+ # 上限与下限采用相同入口。
233
+ upper = require_number(self.valid_range[1], "valid_range.upper")
234
+ # 不自动交换反向范围。
235
+ if upper < lower:
236
+ # 声明冲突须执行前拒绝。
237
+ raise ValueError("valid_range上限必须不小于下限")
238
+ # 已知单位校验关系,未知单位明确保留状态。
239
+ status = validate_conversion(input_unit, self.unit, self.scale, self.offset, self.direction_factor)
240
+ # 冻结缺省输入单位,后续身份与转换都读取同一事实。
241
+ object.__setattr__(self, "input_unit", input_unit)
242
+ # 规范有效期为Python整数纳秒,不改变数值。
243
+ object.__setattr__(self, "valid_for_ns", valid_for_ns)
244
+ # 状态来自真实校验,不允许调用者填verified。
245
+ object.__setattr__(self, "unit_status", status)
246
+
247
+ def identity(self) -> tuple:
248
+ """返回声明字段完整身份,供执行计划缓存和追溯使用。
249
+
250
+ 参数: 无;读取当前冻结声明。
251
+ 返回: tuple;含实际定位、转换、有效期、质量及语义/版本元数据。
252
+ 异常: 无主动异常;不使用全局缓存或当前样本值。
253
+ """
254
+ # 全部影响绑定/质量/单位的字段进入身份,基础质量固定九位全禁。
255
+ return (self.name, self.source, self.field, self.dtype.value, self.unit, self.valid_for_ns,
256
+ self.input_unit, self.scale, self.offset, self.choices, self.valid_range,
257
+ self.invalid_values, self.sample_policy, self.same_time_policy, self.semantic_id,
258
+ self.semantic_contract_version, self.mapping_version, self.sign_convention,
259
+ self.measurement_location, self.input_sign_convention, self.direction_factor,
260
+ self.unit_status, int(QualityFlag(511)))
261
+
262
+
263
+ @dataclass(frozen=True)
264
+ class SynchronizationEvidence:
265
+ """保存来源使用固定时间偏移进入公共分析时基的核实说明。
266
+
267
+ source指定会话内来源,analysis_timebase指定目标时基,evidence保留调用者
268
+ 提供的依据。本模型检查声明结构,不检查物理设备、不估计漂移或改动偏移。
269
+ 来源缺少同步依据时仍可独立分析;参与联合计算时须满足同步检查。
270
+ """
271
+
272
+ source: str # 明确会话内来源。
273
+ analysis_timebase: TimebaseSpec # offset映射后的公共分析基准。
274
+ evidence: str # 调用者声明的核实依据,不自动生成业务事实。
275
+
276
+ def __post_init__(self) -> None:
277
+ """校验显式来源和时基证据结构。
278
+
279
+ 参数: 无;读取source、analysis_timebase及evidence。
280
+ 返回: None;不更改来源或推断时间映射。
281
+ 异常: TypeError/ValueError为无效声明。
282
+ """
283
+ # 来源必须能在当前会话唯一定位。
284
+ require_identifier(self.source, "synchronization.source")
285
+ # 空依据不能当作已核实同步。
286
+ require_text(self.evidence, "synchronization.evidence")
287
+ # 目标分析时基也必须通过模型构造门槛。
288
+ if not isinstance(self.analysis_timebase, TimebaseSpec):
289
+ # 字典或字符串不提供完整公共起点身份。
290
+ raise TypeError("analysis_timebase必须为TimebaseSpec")
291
+
292
+
293
+ @dataclass(frozen=True)
294
+ class SignalBindings:
295
+ """检查并冻结一个会话的信号定义、实际来源和同步证据。
296
+
297
+ signals与derived_names共用简单名称空间,每个原字段必须出现在本会话内存行中。
298
+ identity包含实际内容、时基、转换和策略,来源同名也不能替代完整身份。
299
+ 本对象没有全局注册表,不继承其他任务绑定;值更新由状态执行器读取冻结输入,
300
+ 不会修改本对象。
301
+ """
302
+
303
+ session: SessionSpec # 当前计划单会话来源上下文。
304
+ signals: tuple[SignalDefinition, ...] # 已声明原字段到别名的关联。
305
+ derived_names: tuple[str, ...] = () # 实际派生定义由表达式层提供,此处只检查名称冲突。
306
+ synchronization: tuple[SynchronizationEvidence, ...] = () # 明示固定offset依据。
307
+ identity: str = dataclass_field(init=False) # 实际校验所得完整绑定SHA。
308
+
309
+ def __post_init__(self) -> None:
310
+ """检查统一名称空间、来源定位和同步证据,再构建身份。
311
+
312
+ 参数: 无;session/signals及可选derived_names/synchronization均为已校验且不可变的模型输入。
313
+ 返回: None;通过后所有字段保持不可变。
314
+ 异常: TypeError为结构;ValueError为名称、来源字段或证据冲突。
315
+ """
316
+ # 顶层结构不能以可变列表或未校验对象进入计划。
317
+ if not isinstance(self.session, SessionSpec) or not all(isinstance(item, tuple) for item in
318
+ (self.signals, self.derived_names, self.synchronization)):
319
+ # 不隐式解析自由配置或无限迭代器。
320
+ raise TypeError("绑定需要SessionSpec及tuple声明")
321
+ # 来源名唯一性已由SessionSpec构造证明。
322
+ sources = {source.name: source for source in self.session.sources}
323
+ # 名称集合局部于当前计划,signals/derived不能各自重复。
324
+ names = set()
325
+ # 保留信号声明顺序,不取某个冲突项覆盖。
326
+ for definition in self.signals:
327
+ # 每项必须通过完整SignalDefinition校验。
328
+ if not isinstance(definition, SignalDefinition):
329
+ # 类名或dict占位不属于真实定义。
330
+ raise TypeError("signals必须包含SignalDefinition")
331
+ # 实际内存绑定没有待查询DBC,不允许未确定的有效期进入对齐内核。
332
+ if definition.valid_for_ns is None:
333
+ raise ValueError(f"{definition.name}有效期尚未确定;请提供period或valid_for")
334
+ # 重复别名不能解析为唯一原字段。
335
+ if definition.name in names:
336
+ # 不自动加后缀或取第一项。
337
+ raise ValueError(f"signal别名重复:{definition.name}")
338
+ # 登记唯一别名供派生名称冲突检查。
339
+ names.add(definition.name)
340
+ # 来源必须在本会话存在,不能靠语义名称补齐。
341
+ if definition.source not in sources:
342
+ # 错误定位在编译前拒绝。
343
+ raise ValueError(f"{definition.name}来源不存在:{definition.source}")
344
+ # memory字段必须已在实际行中暴露,不猜列或读旧DBC。
345
+ if not any(definition.field in row.values for row in sources[definition.source].rows):
346
+ # 空来源没有已声明字段schema,不能声称字段可解析。
347
+ raise ValueError(f"{definition.name}原字段不存在:{definition.field}")
348
+ # 派生声明也遵守同一简单别名规则。
349
+ for name in self.derived_names:
350
+ # 包括关键字及首版函数名冲突。
351
+ require_identifier(name, "derived.name")
352
+ # signals和derived统一校验,未生成表达式也不能隐藏同名。
353
+ if name in names:
354
+ # 不修改用户声明名称。
355
+ raise ValueError(f"signals/derived名称冲突:{name}")
356
+ # 保留派生名称登记事实,供后续表达式层接线。
357
+ names.add(name)
358
+ # 同步证据也只能一个来源一个明确目标。
359
+ evidence_names = set()
360
+ # 所有显式证据须关联实际来源和当前分析时基。
361
+ for evidence in self.synchronization:
362
+ # 保留typed证据结构,不接自由字典。
363
+ if not isinstance(evidence, SynchronizationEvidence):
364
+ # 不能以名称声明冒充完整同步依据。
365
+ raise TypeError("synchronization需要SynchronizationEvidence")
366
+ # 不存在/重复来源证据都是配置错误。
367
+ if evidence.source not in sources or evidence.source in evidence_names:
368
+ # 不默认选第一条同步说明。
369
+ raise ValueError("同步证据来源不存在或重复")
370
+ # 所有校准声明必须进入当前会话分析基准。
371
+ if evidence.analysis_timebase != self.session.timebase:
372
+ # 不接受指向其他会话时基的旧映射。
373
+ raise ValueError("同步证据目标与会话分析时基不一致")
374
+ # 记录该来源已有明确证据。
375
+ evidence_names.add(evidence.source)
376
+ # 完整实际输入身份避免跨任务同名不同数据误复用执行缓存。
377
+ payload = (self.session.session_id, self.session.timebase.timebase_id, self.session.timebase.time_type.value,
378
+ self.session.timebase.origin, self.session.domain_start_ns, self.session.domain_end_ns,
379
+ tuple(_source_identity(source) for source in self.session.sources),
380
+ tuple(definition.identity() for definition in self.signals), self.derived_names,
381
+ tuple((item.source, item.analysis_timebase.timebase_id, item.analysis_timebase.time_type.value,
382
+ item.analysis_timebase.origin, item.evidence) for item in self.synchronization))
383
+ # 身份由全部校验事实生成,不允许调用者提供假SHA。
384
+ object.__setattr__(self, "identity", sha256(_identity(payload).encode("utf-8")).hexdigest())
385
+
386
+ def resolve(self, name: str) -> SignalDefinition:
387
+ """解析当前计划真实信号别名,不自动寻找semantic候选。
388
+
389
+ 参数: name为简单别名;派生名称由表达式层另行处理。
390
+ 返回: 对应冻结SignalDefinition。
391
+ 异常: ValueError为非法或未知别名;不访问Python对象属性。
392
+ """
393
+ # 与声明使用相同名称规则,不转换点号。
394
+ require_identifier(name, "signal alias")
395
+ # 当前会话逐项查找明确唯一引用。
396
+ for definition in self.signals:
397
+ # 比较原大小写完整别名。
398
+ if definition.name == name:
399
+ # 不返回其他任务中同名定义。
400
+ return definition
401
+ # 未注册名字不能推断为字段或领域语义。
402
+ raise ValueError(f"未知信号别名:{name};可用:{', '.join(item.name for item in self.signals)}")
403
+
404
+ def source_ref(self, name: str) -> SourceRef:
405
+ """给出当前会话下解析后的完整memory字段引用。
406
+
407
+ 参数: name为已定义信号别名。
408
+ 返回: SourceRef;含当前session_id、source_name和原field。
409
+ 异常: ValueError为未定义或非法别名。
410
+ """
411
+ # 先证明引用属于当前定义,不从全局映射继承。
412
+ definition = self.resolve(name)
413
+ # 完整会话身份使跨会话同名输入可以明确区别。
414
+ return SourceRef(self.session.session_id, definition.source, definition.field)
415
+
416
+ def require_synchronized(self, names: tuple[str, ...]) -> None:
417
+ """在联合依赖执行前检查实际来源的公共分析基准。
418
+
419
+ 参数: names为参与同一表达式/指标的原信号别名tuple;单来源允许独立分析。
420
+ 返回: None;公共起点或显式固定offset依据齐全时通过。
421
+ 异常: TypeError为容器;ValueError为未知别名或同步缺项。
422
+ """
423
+ # 不接会被调用者更改的依赖容器。
424
+ if not isinstance(names, tuple):
425
+ # 编译器需显式给出当前节点依赖。
426
+ raise TypeError("联合依赖names必须为tuple")
427
+ # 同一来源多个信号不会制造额外同步要求。
428
+ used = {self.resolve(name).source for name in names}
429
+ # 单来源可在自己坐标上独立分析。
430
+ if len(used) <= 1:
431
+ # 未使用来源不参与当前绑定的证据检查。
432
+ return
433
+ # 只检查实际参与联合计算的来源。
434
+ sources = {source.name: source for source in self.session.sources if source.name in used}
435
+ # 显式证据已在构造时证明指向当前分析基准。
436
+ evidenced = {item.source for item in self.synchronization}
437
+ # 没有校准声明的来源需直接拥有相同公共起点。
438
+ for source in sources.values():
439
+ # 明示证据提供固定offset映射依据,不估计漂移。
440
+ if source.name in evidenced:
441
+ # offset在SourceSpec已检查范围,执行器按原映射应用。
442
+ continue
443
+ # absolute统一UTC;relative需timebase_id/origin共同一致。
444
+ same = source.timebase.time_type is self.session.timebase.time_type and (
445
+ source.timebase.time_type is TimeType.ABSOLUTE or source.timebase == self.session.timebase)
446
+ # 仅offset数值或各自首点0不证明公共起点。
447
+ if not same:
448
+ # 错误列出缺项来源,调用者可补核实声明或独立分析。
449
+ raise ValueError(f"联合依赖缺少同步依据:{source.name};需要公共起点或固定offset核实证据")
@@ -0,0 +1,106 @@
1
+ """把两段已经求值的有限列合成数值与三值条件共用的指标输入。
2
+
3
+ 输入是覆盖同一指定窗口的两个CalculationSeries,条件列必须是BOOL且无量纲。
4
+ 按双方更新/失效边界划分左闭右开区间;仅真实数值依赖更新成为样本。
5
+ 输出保留原数值类型、FALSE/UNKNOWN、双方依赖诊断和完整来源子类。
6
+ 末点只提供边界值;本模块不计算面积,不把未知替换为FALSE或0。
7
+
8
+ 先用双游标计数,超过max_intervals时在建立输出列前拒绝;不先拼整轴排序。
9
+ 这是有限输入的纯时间协议,不是历史读取器或预算owner。调用方必须事先
10
+ 校验真实表达式绑定/联合同步,并预约最大输出行、来源与诊断容器费用。
11
+ 数值列的binding_identity原样保留,不能单凭该字符串证明条件同属一个计划。
12
+ 不读取文件、不修改输入、不保留全局状态,不声称公共AnalysisRunner已支持条件。
13
+ """
14
+
15
+ # 整数纳秒轴只用有序查找和双游标,保持定宽值与三值对象原样。
16
+ from bisect import bisect_right
17
+ from .calculations import CalculationSeries
18
+ from .models import Interval
19
+ from .types import SignalDType as D
20
+
21
+
22
+ def _joint_times(value, condition, window):
23
+ """依次产生窗口首末及两轴内部边界,不保存合并轴。
24
+
25
+ 参数: value/condition为已校验有限列;window是共同覆盖的Interval。
26
+ 返回: 严格递增的整数纳秒生成器,点窗口只产生一点。
27
+ 异常: 已校验模型外的存储或分配异常原样传播。
28
+ """
29
+ # 左边界即便不是原更新也须存在;右边界不能形成额外正区间。
30
+ yield window.start_ns
31
+ if window.start_ns == window.end_ns:
32
+ return
33
+ i = bisect_right(value.times_ns, window.start_ns)
34
+ j = bisect_right(condition.times_ns, window.start_ns)
35
+ while True:
36
+ # 两个原轴均覆盖窗口;到终点后统一使用窗口末端作为哨兵。
37
+ a = value.times_ns[i] if i < len(value.times_ns) else window.end_ns
38
+ b = condition.times_ns[j] if j < len(condition.times_ns) else window.end_ns
39
+ time = min(a, b, window.end_ns)
40
+ yield time
41
+ if time == window.end_ns:
42
+ return
43
+ # 同刻双方更新只生成一个原子边界,不能重复结算或重计样本。
44
+ if a == time:
45
+ i += 1
46
+ if b == time:
47
+ j += 1
48
+
49
+
50
+ def join_calculation_series(value, condition, *, window=None, max_intervals=64):
51
+ """合并有限数值和BOOL输入,保留条件单独更新与真正样本的区别。
52
+
53
+ 参数: value是原值列;condition是BOOL列;window需被双方完整覆盖,
54
+ 省略时两列观测域必须相同;max_intervals是允许输出的正区间数。
55
+ 返回: 新冻结CalculationSeries,conditions包含TRUE/FALSE/UNKNOWN。
56
+ 异常: TypeError为模型或容量类型错误;ValueError为条件、窗口或容量超限。
57
+ 边界: 允许点窗口,但不外推EOF;调用方负责真实绑定/同步和先行预算预约。
58
+ """
59
+ # 嵌套选择不是本接口的语义;BOOL不能借整数继承关系成为容量。
60
+ if not isinstance(value, CalculationSeries) or not isinstance(condition, CalculationSeries):
61
+ raise TypeError('联合指标输入需要两个有限CalculationSeries')
62
+ if type(max_intervals) is not int:
63
+ raise TypeError('max_intervals需要原生int')
64
+ if max_intervals < 1:
65
+ raise ValueError('max_intervals必须为正整数')
66
+ if value.conditions is not None or condition.conditions is not None:
67
+ raise ValueError('联合输入不接受已经带选择条件的列')
68
+ if condition.values[0].dtype is not D.BOOL or condition.unit != '1':
69
+ raise ValueError('选择条件需要无量纲BOOL列')
70
+ if window is None:
71
+ if value.observation != condition.observation:
72
+ raise ValueError('不同观测域必须显式给出共同窗口')
73
+ window = value.observation
74
+ if not isinstance(window, Interval):
75
+ raise TypeError('联合窗口需要Interval')
76
+ if any(window.start_ns < series.observation.start_ns or
77
+ window.end_ns > series.observation.end_ns for series in (value, condition)):
78
+ raise ValueError('联合窗口必须由双方实际观测完整覆盖')
79
+
80
+ # 第一遍仅计数,不创建整轴或输出列;容量不足时不返回截断结果。
81
+ for index, _ in enumerate(_joint_times(value, condition, window)):
82
+ if index > max_intervals:
83
+ raise ValueError('联合指标输入超过max_intervals,不丢弃边界')
84
+ times, values, conditions, updates, diagnostics = [], [], [], [], []
85
+ i = bisect_right(value.times_ns, window.start_ns) - 1
86
+ j = bisect_right(condition.times_ns, window.start_ns) - 1
87
+ for time in _joint_times(value, condition, window):
88
+ # 在边界先采用该时刻真实更新/TTL的新状态,保持值只看现在和过去。
89
+ while i + 1 < len(value.times_ns) and value.times_ns[i + 1] <= time:
90
+ i += 1
91
+ while j + 1 < len(condition.times_ns) and condition.times_ns[j + 1] <= time:
92
+ j += 1
93
+ times.append(time)
94
+ values.append(value.values[i])
95
+ conditions.append(condition.values[j])
96
+ # 条件边界与裁剪左端不可凭保持值制造真实数值样本。
97
+ updates.append(time == value.times_ns[i] and value.actual_value_updates[i])
98
+ diagnostics.append(value.diagnostics[i] | condition.diagnostics[j])
99
+
100
+ # 原来源的具体子类和完整字段保留;不同子类即使文字相同也不合并。
101
+ refs = list(value.source_refs)
102
+ for ref in condition.source_refs:
103
+ if not any(type(old) is type(ref) and old == ref for old in refs):
104
+ refs.append(ref)
105
+ return CalculationSeries(window, tuple(times), tuple(values), tuple(updates), value.unit,
106
+ tuple(conditions), tuple(diagnostics), value.binding_identity, tuple(refs))