chronaxis 0.1.0.dev0__tar.gz

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 (485) hide show
  1. chronaxis-0.1.0.dev0/Docs/AI/README.md +70 -0
  2. chronaxis-0.1.0.dev0/Docs/AI/en/README.md +74 -0
  3. chronaxis-0.1.0.dev0/Docs/AI/en/semantics.md +70 -0
  4. chronaxis-0.1.0.dev0/Docs/AI/en/tasks.json +290 -0
  5. chronaxis-0.1.0.dev0/Docs/AI/en/workflow.md +41 -0
  6. chronaxis-0.1.0.dev0/Docs/AI/inputs.lock.json +144 -0
  7. chronaxis-0.1.0.dev0/Docs/AI/lookup.py +90 -0
  8. chronaxis-0.1.0.dev0/Docs/AI/run_analysis.py +34 -0
  9. chronaxis-0.1.0.dev0/Docs/AI/semantics.md +62 -0
  10. chronaxis-0.1.0.dev0/Docs/AI/tasks.json +290 -0
  11. chronaxis-0.1.0.dev0/Docs/AI/workflow.md +38 -0
  12. chronaxis-0.1.0.dev0/Docs/Current/documentation.json +7 -0
  13. chronaxis-0.1.0.dev0/Docs/Current/en/public-api/AnalysisError.md +18 -0
  14. chronaxis-0.1.0.dev0/Docs/Current/en/public-api/AnalysisPlan.md +103 -0
  15. chronaxis-0.1.0.dev0/Docs/Current/en/public-api/AnalysisResult.md +434 -0
  16. chronaxis-0.1.0.dev0/Docs/Current/en/public-api/AnalysisRunner.md +209 -0
  17. chronaxis-0.1.0.dev0/Docs/Current/en/public-api/BatchJob.md +21 -0
  18. chronaxis-0.1.0.dev0/Docs/Current/en/public-api/BatchJobResult.md +53 -0
  19. chronaxis-0.1.0.dev0/Docs/Current/en/public-api/BatchPlan.md +47 -0
  20. chronaxis-0.1.0.dev0/Docs/Current/en/public-api/BatchReport.md +66 -0
  21. chronaxis-0.1.0.dev0/Docs/Current/en/public-api/BatchRunner.md +63 -0
  22. chronaxis-0.1.0.dev0/Docs/Current/en/public-api/OutputManifest.md +31 -0
  23. chronaxis-0.1.0.dev0/Docs/Current/en/public-api/PlanFragment.md +43 -0
  24. chronaxis-0.1.0.dev0/Docs/Current/en/public-api/PlanValidationError.md +72 -0
  25. chronaxis-0.1.0.dev0/Docs/Current/en/public-api/PresetSpec.md +61 -0
  26. chronaxis-0.1.0.dev0/Docs/Current/en/public-api/ResultClosedError.md +18 -0
  27. chronaxis-0.1.0.dev0/Docs/Current/en/public-api/RunMetadata.md +112 -0
  28. chronaxis-0.1.0.dev0/Docs/Current/en/public-api/TimeConversion.md +27 -0
  29. chronaxis-0.1.0.dev0/Docs/Current/en/public-api/TimeOverflowError.md +18 -0
  30. chronaxis-0.1.0.dev0/Docs/Current/en/public-api/build_preset.md +27 -0
  31. chronaxis-0.1.0.dev0/Docs/Current/en/public-api/checked_add_ns.md +25 -0
  32. chronaxis-0.1.0.dev0/Docs/Current/en/public-api/convert_time.md +29 -0
  33. chronaxis-0.1.0.dev0/Docs/Current/en/public-api/explain_analysis_plan.md +34 -0
  34. chronaxis-0.1.0.dev0/Docs/Current/en/public-api/load_analysis_plan.md +31 -0
  35. chronaxis-0.1.0.dev0/Docs/Current/en/public-api/load_batch_plan.md +32 -0
  36. chronaxis-0.1.0.dev0/Docs/Current/en/public-api/parse_datetime_ns.md +27 -0
  37. chronaxis-0.1.0.dev0/Docs/Current/en/public-api/parse_duration.md +24 -0
  38. chronaxis-0.1.0.dev0/Docs/Current/en/public-api/resolve_preset_roles.md +27 -0
  39. chronaxis-0.1.0.dev0/Docs/Current/en/public-api/run_batch.md +43 -0
  40. chronaxis-0.1.0.dev0/Docs/Current/en/public-api/shift_times_reference.md +25 -0
  41. chronaxis-0.1.0.dev0/Docs/Current/en/public-api/time_deltas_reference.md +26 -0
  42. chronaxis-0.1.0.dev0/Docs/Current/en/public-api/validate_analysis_plan.md +33 -0
  43. chronaxis-0.1.0.dev0/Docs/Current/en/public-api.json +284 -0
  44. chronaxis-0.1.0.dev0/Docs/Current/en/schema-translations.json +309 -0
  45. chronaxis-0.1.0.dev0/Docs/Current/examples/analysis-imports.yaml +22 -0
  46. chronaxis-0.1.0.dev0/Docs/Current/examples/analysis.yaml +23 -0
  47. chronaxis-0.1.0.dev0/Docs/Current/examples/batch-minimal.yaml +3 -0
  48. chronaxis-0.1.0.dev0/Docs/Current/examples/conditional-energy.yaml +36 -0
  49. chronaxis-0.1.0.dev0/Docs/Current/examples/data/activity.csv +6 -0
  50. chronaxis-0.1.0.dev0/Docs/Current/examples/data/can/activity.asc +11 -0
  51. chronaxis-0.1.0.dev0/Docs/Current/examples/data/can/calculation-minimal.asc +6 -0
  52. chronaxis-0.1.0.dev0/Docs/Current/examples/data/can/conditional-energy/part-1.asc +92 -0
  53. chronaxis-0.1.0.dev0/Docs/Current/examples/data/can/conditional-energy/part-2.asc +36 -0
  54. chronaxis-0.1.0.dev0/Docs/Current/examples/data/can/conditional-energy/signals.dbc +10 -0
  55. chronaxis-0.1.0.dev0/Docs/Current/examples/data/can/execution-comparison.asc +12 -0
  56. chronaxis-0.1.0.dev0/Docs/Current/examples/data/can/execution-report.asc +4 -0
  57. chronaxis-0.1.0.dev0/Docs/Current/examples/data/can/expression-extended.asc +11 -0
  58. chronaxis-0.1.0.dev0/Docs/Current/examples/data/can/interval-actual.asc +6 -0
  59. chronaxis-0.1.0.dev0/Docs/Current/examples/data/can/preset-charge-energy.asc +15 -0
  60. chronaxis-0.1.0.dev0/Docs/Current/examples/data/can/preset-charge-minimal.asc +11 -0
  61. chronaxis-0.1.0.dev0/Docs/Current/examples/data/can/preset-command-automatic.asc +11 -0
  62. chronaxis-0.1.0.dev0/Docs/Current/examples/data/can/preset-fault-context.asc +7 -0
  63. chronaxis-0.1.0.dev0/Docs/Current/examples/data/can/preset-threshold-delay.asc +7 -0
  64. chronaxis-0.1.0.dev0/Docs/Current/examples/data/can/preset-threshold-partial.asc +7 -0
  65. chronaxis-0.1.0.dev0/Docs/Current/examples/data/can/quality.asc +6 -0
  66. chronaxis-0.1.0.dev0/Docs/Current/examples/data/can/quickstart-parts/part1.asc +4 -0
  67. chronaxis-0.1.0.dev0/Docs/Current/examples/data/can/quickstart-parts/part2.asc +3 -0
  68. chronaxis-0.1.0.dev0/Docs/Current/examples/data/can/quickstart.asc +6 -0
  69. chronaxis-0.1.0.dev0/Docs/Current/examples/data/can/rule-condition_duration-extended.asc +35 -0
  70. chronaxis-0.1.0.dev0/Docs/Current/examples/data/can/rule-condition_duration-minimal.asc +19 -0
  71. chronaxis-0.1.0.dev0/Docs/Current/examples/data/can/rule-debounce-extended.asc +19 -0
  72. chronaxis-0.1.0.dev0/Docs/Current/examples/data/can/rule-falling_edge-extended.asc +35 -0
  73. chronaxis-0.1.0.dev0/Docs/Current/examples/data/can/rule-hysteresis-extended.asc +19 -0
  74. chronaxis-0.1.0.dev0/Docs/Current/examples/data/can/rule-start_end-extended.asc +35 -0
  75. chronaxis-0.1.0.dev0/Docs/Current/examples/data/can/rule-start_only-extended.asc +19 -0
  76. chronaxis-0.1.0.dev0/Docs/Current/examples/data/can/rule-window_delta-extended.asc +19 -0
  77. chronaxis-0.1.0.dev0/Docs/Current/examples/data/can/sequence-outcomes.asc +19 -0
  78. chronaxis-0.1.0.dev0/Docs/Current/examples/data/can/signal-types.asc +13 -0
  79. chronaxis-0.1.0.dev0/Docs/Current/examples/data/can/start-end.asc +30 -0
  80. chronaxis-0.1.0.dev0/Docs/Current/examples/data/can/teaching-base.asc +58 -0
  81. chronaxis-0.1.0.dev0/Docs/Current/examples/data/can/teaching.dbc +53 -0
  82. chronaxis-0.1.0.dev0/Docs/Current/examples/data/joint-current.csv +5 -0
  83. chronaxis-0.1.0.dev0/Docs/Current/examples/data/joint.asc +5 -0
  84. chronaxis-0.1.0.dev0/Docs/Current/examples/data/joint.dbc +7 -0
  85. chronaxis-0.1.0.dev0/Docs/Current/examples/data/message-clean.asc +6 -0
  86. chronaxis-0.1.0.dev0/Docs/Current/examples/data/message-direction.asc +7 -0
  87. chronaxis-0.1.0.dev0/Docs/Current/examples/data/message-direction.dbc +7 -0
  88. chronaxis-0.1.0.dev0/Docs/Current/examples/data/power.blf +0 -0
  89. chronaxis-0.1.0.dev0/Docs/Current/examples/data/power.dbc +6 -0
  90. chronaxis-0.1.0.dev0/Docs/Current/examples/data/quality.csv +5 -0
  91. chronaxis-0.1.0.dev0/Docs/Current/examples/data/raw-can-example.csv +5 -0
  92. chronaxis-0.1.0.dev0/Docs/Current/examples/data/signal-types.csv +5 -0
  93. chronaxis-0.1.0.dev0/Docs/Current/examples/data/signals.csv +6 -0
  94. chronaxis-0.1.0.dev0/Docs/Current/examples/data/timing.asc +6 -0
  95. chronaxis-0.1.0.dev0/Docs/Current/examples/data/timing.dbc +11 -0
  96. chronaxis-0.1.0.dev0/Docs/Current/examples/export-can-minimal.yaml +24 -0
  97. chronaxis-0.1.0.dev0/Docs/Current/examples/input-csv-minimal.yaml +23 -0
  98. chronaxis-0.1.0.dev0/Docs/Current/examples/preset-charge-energy.yaml +41 -0
  99. chronaxis-0.1.0.dev0/Docs/Current/examples/preset-charge-minimal.yaml +31 -0
  100. chronaxis-0.1.0.dev0/Docs/Current/examples/preset-fault-context.yaml +27 -0
  101. chronaxis-0.1.0.dev0/Docs/Current/examples/quality.yaml +19 -0
  102. chronaxis-0.1.0.dev0/Docs/Current/examples/sequence-outcomes.yaml +39 -0
  103. chronaxis-0.1.0.dev0/Docs/Current/examples/shared/definitions.yaml +14 -0
  104. chronaxis-0.1.0.dev0/Docs/Current/examples/signal-enum-minimal.yaml +19 -0
  105. chronaxis-0.1.0.dev0/Docs/Current/examples/signal-number-conversion.yaml +24 -0
  106. chronaxis-0.1.0.dev0/Docs/Current/examples/window-merged.yaml +28 -0
  107. chronaxis-0.1.0.dev0/Docs/Current/public-api/AnalysisError.md +23 -0
  108. chronaxis-0.1.0.dev0/Docs/Current/public-api/AnalysisPlan.md +111 -0
  109. chronaxis-0.1.0.dev0/Docs/Current/public-api/AnalysisResult.md +434 -0
  110. chronaxis-0.1.0.dev0/Docs/Current/public-api/AnalysisRunner.md +210 -0
  111. chronaxis-0.1.0.dev0/Docs/Current/public-api/BatchJob.md +27 -0
  112. chronaxis-0.1.0.dev0/Docs/Current/public-api/BatchJobResult.md +71 -0
  113. chronaxis-0.1.0.dev0/Docs/Current/public-api/BatchPlan.md +58 -0
  114. chronaxis-0.1.0.dev0/Docs/Current/public-api/BatchReport.md +122 -0
  115. chronaxis-0.1.0.dev0/Docs/Current/public-api/BatchRunner.md +96 -0
  116. chronaxis-0.1.0.dev0/Docs/Current/public-api/OutputManifest.md +31 -0
  117. chronaxis-0.1.0.dev0/Docs/Current/public-api/PlanFragment.md +57 -0
  118. chronaxis-0.1.0.dev0/Docs/Current/public-api/PlanValidationError.md +112 -0
  119. chronaxis-0.1.0.dev0/Docs/Current/public-api/PresetSpec.md +78 -0
  120. chronaxis-0.1.0.dev0/Docs/Current/public-api/ResultClosedError.md +23 -0
  121. chronaxis-0.1.0.dev0/Docs/Current/public-api/RunMetadata.md +112 -0
  122. chronaxis-0.1.0.dev0/Docs/Current/public-api/TimeConversion.md +37 -0
  123. chronaxis-0.1.0.dev0/Docs/Current/public-api/TimeOverflowError.md +26 -0
  124. chronaxis-0.1.0.dev0/Docs/Current/public-api/build_preset.md +44 -0
  125. chronaxis-0.1.0.dev0/Docs/Current/public-api/checked_add_ns.md +38 -0
  126. chronaxis-0.1.0.dev0/Docs/Current/public-api/convert_time.md +48 -0
  127. chronaxis-0.1.0.dev0/Docs/Current/public-api/explain_analysis_plan.md +54 -0
  128. chronaxis-0.1.0.dev0/Docs/Current/public-api/load_analysis_plan.md +49 -0
  129. chronaxis-0.1.0.dev0/Docs/Current/public-api/load_batch_plan.md +48 -0
  130. chronaxis-0.1.0.dev0/Docs/Current/public-api/parse_datetime_ns.md +43 -0
  131. chronaxis-0.1.0.dev0/Docs/Current/public-api/parse_duration.md +38 -0
  132. chronaxis-0.1.0.dev0/Docs/Current/public-api/resolve_preset_roles.md +45 -0
  133. chronaxis-0.1.0.dev0/Docs/Current/public-api/run_batch.md +50 -0
  134. chronaxis-0.1.0.dev0/Docs/Current/public-api/shift_times_reference.md +41 -0
  135. chronaxis-0.1.0.dev0/Docs/Current/public-api/time_deltas_reference.md +45 -0
  136. chronaxis-0.1.0.dev0/Docs/Current/public-api/validate_analysis_plan.md +55 -0
  137. chronaxis-0.1.0.dev0/Docs/Current/public-api.json +283 -0
  138. chronaxis-0.1.0.dev0/Docs/Release/ThirdParty/highlight.js-LICENSE.txt +29 -0
  139. chronaxis-0.1.0.dev0/Docs/Release/ThirdParty/marked-LICENSE.txt +44 -0
  140. chronaxis-0.1.0.dev0/Docs/Release/distribution.md +39 -0
  141. chronaxis-0.1.0.dev0/Docs/Release/publishing.en.md +101 -0
  142. chronaxis-0.1.0.dev0/Docs/Release/publishing.md +103 -0
  143. chronaxis-0.1.0.dev0/Docs/Release/release-notes-0.1.0.dev0.md +33 -0
  144. chronaxis-0.1.0.dev0/Docs/Release/security.md +11 -0
  145. chronaxis-0.1.0.dev0/Docs/Release/third-party.md +23 -0
  146. chronaxis-0.1.0.dev0/Docs/Release/versioning.md +21 -0
  147. chronaxis-0.1.0.dev0/Docs/Schema/analysis.schema.json +8451 -0
  148. chronaxis-0.1.0.dev0/Docs/Schema/batch-v1.schema.json +172 -0
  149. chronaxis-0.1.0.dev0/Docs/Schema/definitions.schema.json +29 -0
  150. chronaxis-0.1.0.dev0/Docs/Schema/legacy-import-v1.schema.json +143 -0
  151. chronaxis-0.1.0.dev0/LICENSE +21 -0
  152. chronaxis-0.1.0.dev0/MANIFEST.in +158 -0
  153. chronaxis-0.1.0.dev0/PKG-INFO +172 -0
  154. chronaxis-0.1.0.dev0/README.en.md +143 -0
  155. chronaxis-0.1.0.dev0/README.md +143 -0
  156. chronaxis-0.1.0.dev0/pyproject.toml +51 -0
  157. chronaxis-0.1.0.dev0/setup.cfg +4 -0
  158. chronaxis-0.1.0.dev0/setup.py +38 -0
  159. chronaxis-0.1.0.dev0/src/chronaxis/__init__.py +72 -0
  160. chronaxis-0.1.0.dev0/src/chronaxis/__main__.py +12 -0
  161. chronaxis-0.1.0.dev0/src/chronaxis/analysis_cli.py +181 -0
  162. chronaxis-0.1.0.dev0/src/chronaxis/batch/__init__.py +14 -0
  163. chronaxis-0.1.0.dev0/src/chronaxis/batch/api.py +46 -0
  164. chronaxis-0.1.0.dev0/src/chronaxis/batch/cli.py +48 -0
  165. chronaxis-0.1.0.dev0/src/chronaxis/batch/config.py +37 -0
  166. chronaxis-0.1.0.dev0/src/chronaxis/batch/models.py +202 -0
  167. chronaxis-0.1.0.dev0/src/chronaxis/batch/process_transport.py +149 -0
  168. chronaxis-0.1.0.dev0/src/chronaxis/batch/process_tree.py +72 -0
  169. chronaxis-0.1.0.dev0/src/chronaxis/batch/publication.py +41 -0
  170. chronaxis-0.1.0.dev0/src/chronaxis/batch/runner.py +236 -0
  171. chronaxis-0.1.0.dev0/src/chronaxis/batch/templates.py +42 -0
  172. chronaxis-0.1.0.dev0/src/chronaxis/can_dependencies.py +42 -0
  173. chronaxis-0.1.0.dev0/src/chronaxis/cli.py +193 -0
  174. chronaxis-0.1.0.dev0/src/chronaxis/configuration/__init__.py +46 -0
  175. chronaxis-0.1.0.dev0/src/chronaxis/configuration/cli.py +41 -0
  176. chronaxis-0.1.0.dev0/src/chronaxis/configuration/diagnostics.py +107 -0
  177. chronaxis-0.1.0.dev0/src/chronaxis/configuration/explanation.py +233 -0
  178. chronaxis-0.1.0.dev0/src/chronaxis/configuration/file_tools.py +140 -0
  179. chronaxis-0.1.0.dev0/src/chronaxis/configuration/imports.py +144 -0
  180. chronaxis-0.1.0.dev0/src/chronaxis/configuration/initialization.py +36 -0
  181. chronaxis-0.1.0.dev0/src/chronaxis/configuration/json_parser.py +114 -0
  182. chronaxis-0.1.0.dev0/src/chronaxis/configuration/models.py +74 -0
  183. chronaxis-0.1.0.dev0/src/chronaxis/configuration/origins.py +90 -0
  184. chronaxis-0.1.0.dev0/src/chronaxis/configuration/overrides.py +55 -0
  185. chronaxis-0.1.0.dev0/src/chronaxis/configuration/resolution.py +150 -0
  186. chronaxis-0.1.0.dev0/src/chronaxis/configuration/template_catalog.py +68 -0
  187. chronaxis-0.1.0.dev0/src/chronaxis/configuration/templates/batch/analysis-annotated.yaml +18 -0
  188. chronaxis-0.1.0.dev0/src/chronaxis/configuration/templates/batch/analysis-minimal.yaml +18 -0
  189. chronaxis-0.1.0.dev0/src/chronaxis/configuration/templates/batch/annotated.yaml +6 -0
  190. chronaxis-0.1.0.dev0/src/chronaxis/configuration/templates/batch/minimal.yaml +6 -0
  191. chronaxis-0.1.0.dev0/src/chronaxis/configuration/templates/can-asc/annotated.yaml +18 -0
  192. chronaxis-0.1.0.dev0/src/chronaxis/configuration/templates/can-asc/minimal.yaml +18 -0
  193. chronaxis-0.1.0.dev0/src/chronaxis/configuration/templates/can-blf/annotated.yaml +18 -0
  194. chronaxis-0.1.0.dev0/src/chronaxis/configuration/templates/can-blf/minimal.yaml +18 -0
  195. chronaxis-0.1.0.dev0/src/chronaxis/configuration/templates/can-export/annotated.yaml +23 -0
  196. chronaxis-0.1.0.dev0/src/chronaxis/configuration/templates/can-export/minimal.yaml +23 -0
  197. chronaxis-0.1.0.dev0/src/chronaxis/configuration/templates/catalog.json +233 -0
  198. chronaxis-0.1.0.dev0/src/chronaxis/configuration/templates/charge-session/annotated.yaml +38 -0
  199. chronaxis-0.1.0.dev0/src/chronaxis/configuration/templates/charge-session/minimal.yaml +38 -0
  200. chronaxis-0.1.0.dev0/src/chronaxis/configuration/templates/command-response/annotated.yaml +32 -0
  201. chronaxis-0.1.0.dev0/src/chronaxis/configuration/templates/command-response/minimal.yaml +36 -0
  202. chronaxis-0.1.0.dev0/src/chronaxis/configuration/templates/fault-window/annotated.yaml +25 -0
  203. chronaxis-0.1.0.dev0/src/chronaxis/configuration/templates/fault-window/minimal.yaml +27 -0
  204. chronaxis-0.1.0.dev0/src/chronaxis/configuration/templates/ini-mapping/annotated.yaml +20 -0
  205. chronaxis-0.1.0.dev0/src/chronaxis/configuration/templates/ini-mapping/minimal.yaml +20 -0
  206. chronaxis-0.1.0.dev0/src/chronaxis/configuration/templates/raw-can-csv/annotated.yaml +34 -0
  207. chronaxis-0.1.0.dev0/src/chronaxis/configuration/templates/raw-can-csv/minimal.yaml +35 -0
  208. chronaxis-0.1.0.dev0/src/chronaxis/configuration/templates/shared/charge-session.asc +5 -0
  209. chronaxis-0.1.0.dev0/src/chronaxis/configuration/templates/shared/command-response.asc +8 -0
  210. chronaxis-0.1.0.dev0/src/chronaxis/configuration/templates/shared/fault-window.asc +5 -0
  211. chronaxis-0.1.0.dev0/src/chronaxis/configuration/templates/shared/power.asc +7 -0
  212. chronaxis-0.1.0.dev0/src/chronaxis/configuration/templates/shared/sample.asc +6 -0
  213. chronaxis-0.1.0.dev0/src/chronaxis/configuration/templates/shared/sample.blf +0 -0
  214. chronaxis-0.1.0.dev0/src/chronaxis/configuration/templates/shared/sample.csv +5 -0
  215. chronaxis-0.1.0.dev0/src/chronaxis/configuration/templates/shared/sample.dbc +11 -0
  216. chronaxis-0.1.0.dev0/src/chronaxis/configuration/templates/shared/signals.csv +6 -0
  217. chronaxis-0.1.0.dev0/src/chronaxis/configuration/templates/shared/source.ini +5 -0
  218. chronaxis-0.1.0.dev0/src/chronaxis/configuration/templates/shared/stability.asc +9 -0
  219. chronaxis-0.1.0.dev0/src/chronaxis/configuration/templates/shared/teaching.dbc +27 -0
  220. chronaxis-0.1.0.dev0/src/chronaxis/configuration/templates/shared/threshold.asc +7 -0
  221. chronaxis-0.1.0.dev0/src/chronaxis/configuration/templates/signal-csv/annotated.yaml +27 -0
  222. chronaxis-0.1.0.dev0/src/chronaxis/configuration/templates/signal-csv/minimal.yaml +27 -0
  223. chronaxis-0.1.0.dev0/src/chronaxis/configuration/templates/signal-export/annotated.yaml +27 -0
  224. chronaxis-0.1.0.dev0/src/chronaxis/configuration/templates/signal-export/minimal.yaml +29 -0
  225. chronaxis-0.1.0.dev0/src/chronaxis/configuration/templates/stability/annotated.yaml +35 -0
  226. chronaxis-0.1.0.dev0/src/chronaxis/configuration/templates/stability/minimal.yaml +35 -0
  227. chronaxis-0.1.0.dev0/src/chronaxis/configuration/templates/threshold/annotated.yaml +22 -0
  228. chronaxis-0.1.0.dev0/src/chronaxis/configuration/templates/threshold/minimal.yaml +22 -0
  229. chronaxis-0.1.0.dev0/src/chronaxis/configuration/yaml_parser.py +125 -0
  230. chronaxis-0.1.0.dev0/src/chronaxis/core/__init__.py +71 -0
  231. chronaxis-0.1.0.dev0/src/chronaxis/core/binding.py +449 -0
  232. chronaxis-0.1.0.dev0/src/chronaxis/core/calculation_series_join.py +106 -0
  233. chronaxis-0.1.0.dev0/src/chronaxis/core/calculations.py +435 -0
  234. chronaxis-0.1.0.dev0/src/chronaxis/core/calculations_memory_numpy.py +136 -0
  235. chronaxis-0.1.0.dev0/src/chronaxis/core/calculations_memory_reference.py +165 -0
  236. chronaxis-0.1.0.dev0/src/chronaxis/core/calculations_numpy.py +298 -0
  237. chronaxis-0.1.0.dev0/src/chronaxis/core/calculations_reference.py +294 -0
  238. chronaxis-0.1.0.dev0/src/chronaxis/core/condition_evidence.py +182 -0
  239. chronaxis-0.1.0.dev0/src/chronaxis/core/conditional_integral_result.py +43 -0
  240. chronaxis-0.1.0.dev0/src/chronaxis/core/conditional_integral_terms.py +146 -0
  241. chronaxis-0.1.0.dev0/src/chronaxis/core/conditional_integral_terms_numpy.py +148 -0
  242. chronaxis-0.1.0.dev0/src/chronaxis/core/conditional_integral_terms_reference.py +111 -0
  243. chronaxis-0.1.0.dev0/src/chronaxis/core/conditional_time_reduction.py +118 -0
  244. chronaxis-0.1.0.dev0/src/chronaxis/core/conditional_time_reduction_numpy.py +223 -0
  245. chronaxis-0.1.0.dev0/src/chronaxis/core/conditional_time_reduction_reference.py +213 -0
  246. chronaxis-0.1.0.dev0/src/chronaxis/core/declarations.py +192 -0
  247. chronaxis-0.1.0.dev0/src/chronaxis/core/decoded_binding.py +197 -0
  248. chronaxis-0.1.0.dev0/src/chronaxis/core/direct_message.py +387 -0
  249. chronaxis-0.1.0.dev0/src/chronaxis/core/export_interpolation.py +54 -0
  250. chronaxis-0.1.0.dev0/src/chronaxis/core/expression.py +642 -0
  251. chronaxis-0.1.0.dev0/src/chronaxis/core/expression_numpy.py +314 -0
  252. chronaxis-0.1.0.dev0/src/chronaxis/core/expression_reference.py +272 -0
  253. chronaxis-0.1.0.dev0/src/chronaxis/core/integral_result.py +53 -0
  254. chronaxis-0.1.0.dev0/src/chronaxis/core/integral_sum.py +77 -0
  255. chronaxis-0.1.0.dev0/src/chronaxis/core/integral_sum_numpy.py +224 -0
  256. chronaxis-0.1.0.dev0/src/chronaxis/core/integral_sum_reference.py +148 -0
  257. chronaxis-0.1.0.dev0/src/chronaxis/core/integral_terms.py +119 -0
  258. chronaxis-0.1.0.dev0/src/chronaxis/core/integral_terms_numpy.py +127 -0
  259. chronaxis-0.1.0.dev0/src/chronaxis/core/integral_terms_reference.py +91 -0
  260. chronaxis-0.1.0.dev0/src/chronaxis/core/mean_weights_numpy.py +29 -0
  261. chronaxis-0.1.0.dev0/src/chronaxis/core/mean_weights_reference.py +27 -0
  262. chronaxis-0.1.0.dev0/src/chronaxis/core/message_binding.py +305 -0
  263. chronaxis-0.1.0.dev0/src/chronaxis/core/models.py +485 -0
  264. chronaxis-0.1.0.dev0/src/chronaxis/core/normalize_numpy.py +396 -0
  265. chronaxis-0.1.0.dev0/src/chronaxis/core/numeric.py +472 -0
  266. chronaxis-0.1.0.dev0/src/chronaxis/core/numeric_numpy.py +440 -0
  267. chronaxis-0.1.0.dev0/src/chronaxis/core/record_intervals.py +115 -0
  268. chronaxis-0.1.0.dev0/src/chronaxis/core/sample_reduction.py +161 -0
  269. chronaxis-0.1.0.dev0/src/chronaxis/core/sample_reduction_numpy.py +160 -0
  270. chronaxis-0.1.0.dev0/src/chronaxis/core/sample_reduction_reference.py +154 -0
  271. chronaxis-0.1.0.dev0/src/chronaxis/core/selection.py +74 -0
  272. chronaxis-0.1.0.dev0/src/chronaxis/core/sequence.py +160 -0
  273. chronaxis-0.1.0.dev0/src/chronaxis/core/sequence_reference.py +248 -0
  274. chronaxis-0.1.0.dev0/src/chronaxis/core/stability.py +249 -0
  275. chronaxis-0.1.0.dev0/src/chronaxis/core/start_end.py +169 -0
  276. chronaxis-0.1.0.dev0/src/chronaxis/core/state.py +494 -0
  277. chronaxis-0.1.0.dev0/src/chronaxis/core/state_numpy.py +296 -0
  278. chronaxis-0.1.0.dev0/src/chronaxis/core/temporal.py +373 -0
  279. chronaxis-0.1.0.dev0/src/chronaxis/core/temporal_clock.py +25 -0
  280. chronaxis-0.1.0.dev0/src/chronaxis/core/temporal_memory_numpy.py +163 -0
  281. chronaxis-0.1.0.dev0/src/chronaxis/core/temporal_memory_reference.py +161 -0
  282. chronaxis-0.1.0.dev0/src/chronaxis/core/temporal_numpy.py +345 -0
  283. chronaxis-0.1.0.dev0/src/chronaxis/core/temporal_reference.py +304 -0
  284. chronaxis-0.1.0.dev0/src/chronaxis/core/time_reduction.py +190 -0
  285. chronaxis-0.1.0.dev0/src/chronaxis/core/time_reduction_numpy.py +205 -0
  286. chronaxis-0.1.0.dev0/src/chronaxis/core/time_reduction_reference.py +203 -0
  287. chronaxis-0.1.0.dev0/src/chronaxis/core/types.py +105 -0
  288. chronaxis-0.1.0.dev0/src/chronaxis/core/units.py +81 -0
  289. chronaxis-0.1.0.dev0/src/chronaxis/core/validation.py +94 -0
  290. chronaxis-0.1.0.dev0/src/chronaxis/core/window_delta.py +123 -0
  291. chronaxis-0.1.0.dev0/src/chronaxis/core/window_delta_numpy.py +78 -0
  292. chronaxis-0.1.0.dev0/src/chronaxis/core/window_delta_reference.py +69 -0
  293. chronaxis-0.1.0.dev0/src/chronaxis/core/windows.py +224 -0
  294. chronaxis-0.1.0.dev0/src/chronaxis/core/windows_numpy.py +78 -0
  295. chronaxis-0.1.0.dev0/src/chronaxis/core/windows_reference.py +61 -0
  296. chronaxis-0.1.0.dev0/src/chronaxis/execution/__init__.py +6 -0
  297. chronaxis-0.1.0.dev0/src/chronaxis/execution/batch_signal_groups.py +122 -0
  298. chronaxis-0.1.0.dev0/src/chronaxis/execution/bindings.py +296 -0
  299. chronaxis-0.1.0.dev0/src/chronaxis/execution/boundaries.py +568 -0
  300. chronaxis-0.1.0.dev0/src/chronaxis/execution/calculation_blocks.py +338 -0
  301. chronaxis-0.1.0.dev0/src/chronaxis/execution/calculation_values.py +55 -0
  302. chronaxis-0.1.0.dev0/src/chronaxis/execution/can_batch_reader.py +356 -0
  303. chronaxis-0.1.0.dev0/src/chronaxis/execution/can_reader.py +948 -0
  304. chronaxis-0.1.0.dev0/src/chronaxis/execution/can_reference_template.py +61 -0
  305. chronaxis-0.1.0.dev0/src/chronaxis/execution/condition_evidence.py +370 -0
  306. chronaxis-0.1.0.dev0/src/chronaxis/execution/conditional_integral_facts.py +310 -0
  307. chronaxis-0.1.0.dev0/src/chronaxis/execution/conditional_integral_reduction.py +216 -0
  308. chronaxis-0.1.0.dev0/src/chronaxis/execution/csv_observation.py +524 -0
  309. chronaxis-0.1.0.dev0/src/chronaxis/execution/csv_reader.py +662 -0
  310. chronaxis-0.1.0.dev0/src/chronaxis/execution/current_message_calculation.py +225 -0
  311. chronaxis-0.1.0.dev0/src/chronaxis/execution/driver_expression.py +274 -0
  312. chronaxis-0.1.0.dev0/src/chronaxis/execution/expressions.py +618 -0
  313. chronaxis-0.1.0.dev0/src/chronaxis/execution/frame_capture.py +245 -0
  314. chronaxis-0.1.0.dev0/src/chronaxis/execution/groups.py +236 -0
  315. chronaxis-0.1.0.dev0/src/chronaxis/execution/historical_conditional_blocks.py +264 -0
  316. chronaxis-0.1.0.dev0/src/chronaxis/execution/historical_conditional_integral.py +226 -0
  317. chronaxis-0.1.0.dev0/src/chronaxis/execution/historical_conditional_time_calculation.py +368 -0
  318. chronaxis-0.1.0.dev0/src/chronaxis/execution/historical_integral.py +219 -0
  319. chronaxis-0.1.0.dev0/src/chronaxis/execution/historical_observation.py +372 -0
  320. chronaxis-0.1.0.dev0/src/chronaxis/execution/historical_sample_calculation.py +338 -0
  321. chronaxis-0.1.0.dev0/src/chronaxis/execution/historical_selection_rows.py +300 -0
  322. chronaxis-0.1.0.dev0/src/chronaxis/execution/historical_time_calculation.py +341 -0
  323. chronaxis-0.1.0.dev0/src/chronaxis/execution/history.py +572 -0
  324. chronaxis-0.1.0.dev0/src/chronaxis/execution/history_records.py +225 -0
  325. chronaxis-0.1.0.dev0/src/chronaxis/execution/hold.py +448 -0
  326. chronaxis-0.1.0.dev0/src/chronaxis/execution/integral_facts.py +311 -0
  327. chronaxis-0.1.0.dev0/src/chronaxis/execution/integral_reduction.py +216 -0
  328. chronaxis-0.1.0.dev0/src/chronaxis/execution/legacy_frame_samples.py +94 -0
  329. chronaxis-0.1.0.dev0/src/chronaxis/execution/memory_reader.py +247 -0
  330. chronaxis-0.1.0.dev0/src/chronaxis/execution/message_bindings.py +293 -0
  331. chronaxis-0.1.0.dev0/src/chronaxis/execution/message_delivery.py +37 -0
  332. chronaxis-0.1.0.dev0/src/chronaxis/execution/observed_ingestion.py +551 -0
  333. chronaxis-0.1.0.dev0/src/chronaxis/execution/raw_signal_groups.py +192 -0
  334. chronaxis-0.1.0.dev0/src/chronaxis/execution/record_alarm_duration.py +114 -0
  335. chronaxis-0.1.0.dev0/src/chronaxis/execution/record_delta_condition.py +167 -0
  336. chronaxis-0.1.0.dev0/src/chronaxis/execution/record_diagnostics.py +87 -0
  337. chronaxis-0.1.0.dev0/src/chronaxis/execution/record_event_durations.py +143 -0
  338. chronaxis-0.1.0.dev0/src/chronaxis/execution/record_export_samples.py +94 -0
  339. chronaxis-0.1.0.dev0/src/chronaxis/execution/record_exports.py +155 -0
  340. chronaxis-0.1.0.dev0/src/chronaxis/execution/record_integral.py +196 -0
  341. chronaxis-0.1.0.dev0/src/chronaxis/execution/record_point_buffer.py +101 -0
  342. chronaxis-0.1.0.dev0/src/chronaxis/execution/record_rule_timeline.py +344 -0
  343. chronaxis-0.1.0.dev0/src/chronaxis/execution/record_sample.py +46 -0
  344. chronaxis-0.1.0.dev0/src/chronaxis/execution/record_sample_series.py +29 -0
  345. chronaxis-0.1.0.dev0/src/chronaxis/execution/record_scope_calculations.py +290 -0
  346. chronaxis-0.1.0.dev0/src/chronaxis/execution/record_selection.py +62 -0
  347. chronaxis-0.1.0.dev0/src/chronaxis/execution/record_sequences.py +199 -0
  348. chronaxis-0.1.0.dev0/src/chronaxis/execution/record_session_calculations.py +778 -0
  349. chronaxis-0.1.0.dev0/src/chronaxis/execution/record_signal_export.py +133 -0
  350. chronaxis-0.1.0.dev0/src/chronaxis/execution/record_source_cursor.py +295 -0
  351. chronaxis-0.1.0.dev0/src/chronaxis/execution/record_time_calculation.py +322 -0
  352. chronaxis-0.1.0.dev0/src/chronaxis/execution/record_time_indexes.py +143 -0
  353. chronaxis-0.1.0.dev0/src/chronaxis/execution/record_value_history.py +160 -0
  354. chronaxis-0.1.0.dev0/src/chronaxis/execution/record_windows.py +229 -0
  355. chronaxis-0.1.0.dev0/src/chronaxis/execution/required_expression.py +52 -0
  356. chronaxis-0.1.0.dev0/src/chronaxis/execution/retained_metadata.py +71 -0
  357. chronaxis-0.1.0.dev0/src/chronaxis/execution/run_session.py +402 -0
  358. chronaxis-0.1.0.dev0/src/chronaxis/execution/scanned_signal_proof.py +550 -0
  359. chronaxis-0.1.0.dev0/src/chronaxis/execution/signal_validity.py +40 -0
  360. chronaxis-0.1.0.dev0/src/chronaxis/execution/state.py +280 -0
  361. chronaxis-0.1.0.dev0/src/chronaxis/execution/temporal_buffer.py +508 -0
  362. chronaxis-0.1.0.dev0/src/chronaxis/execution/text_can_reader.py +359 -0
  363. chronaxis-0.1.0.dev0/src/chronaxis/execution/timeline.py +309 -0
  364. chronaxis-0.1.0.dev0/src/chronaxis/execution/timeline_multi.py +415 -0
  365. chronaxis-0.1.0.dev0/src/chronaxis/execution/window_delta_events.py +220 -0
  366. chronaxis-0.1.0.dev0/src/chronaxis/execution/window_replay.py +350 -0
  367. chronaxis-0.1.0.dev0/src/chronaxis/execution/windows.py +173 -0
  368. chronaxis-0.1.0.dev0/src/chronaxis/legacy/__init__.py +46 -0
  369. chronaxis-0.1.0.dev0/src/chronaxis/legacy/batch_read.py +412 -0
  370. chronaxis-0.1.0.dev0/src/chronaxis/legacy/batch_validation.py +134 -0
  371. chronaxis-0.1.0.dev0/src/chronaxis/legacy/batch_wire.py +264 -0
  372. chronaxis-0.1.0.dev0/src/chronaxis/legacy/batch_worker.py +417 -0
  373. chronaxis-0.1.0.dev0/src/chronaxis/legacy/binding.py +154 -0
  374. chronaxis-0.1.0.dev0/src/chronaxis/legacy/dbc_cycles.py +47 -0
  375. chronaxis-0.1.0.dev0/src/chronaxis/legacy/decode_policy.py +28 -0
  376. chronaxis-0.1.0.dev0/src/chronaxis/legacy/disjunction.py +79 -0
  377. chronaxis-0.1.0.dev0/src/chronaxis/legacy/export_worker.py +147 -0
  378. chronaxis-0.1.0.dev0/src/chronaxis/legacy/export_write.py +378 -0
  379. chronaxis-0.1.0.dev0/src/chronaxis/legacy/message_store.py +562 -0
  380. chronaxis-0.1.0.dev0/src/chronaxis/legacy/process_read.py +526 -0
  381. chronaxis-0.1.0.dev0/src/chronaxis/legacy/raw_store.py +341 -0
  382. chronaxis-0.1.0.dev0/src/chronaxis/legacy/records.py +709 -0
  383. chronaxis-0.1.0.dev0/src/chronaxis/legacy/required_records.py +122 -0
  384. chronaxis-0.1.0.dev0/src/chronaxis/legacy/sum.py +403 -0
  385. chronaxis-0.1.0.dev0/src/chronaxis/legacy/sum_numpy.py +43 -0
  386. chronaxis-0.1.0.dev0/src/chronaxis/legacy/updates.py +277 -0
  387. chronaxis-0.1.0.dev0/src/chronaxis/legacy/vendor/sclicer_functions_v1/can_processor.py +138 -0
  388. chronaxis-0.1.0.dev0/src/chronaxis/legacy/vendor/sclicer_functions_v1/file_processor.py +218 -0
  389. chronaxis-0.1.0.dev0/src/chronaxis/legacy/vendor/sclicer_functions_v1/utils.py +447 -0
  390. chronaxis-0.1.0.dev0/src/chronaxis/legacy/worker.py +352 -0
  391. chronaxis-0.1.0.dev0/src/chronaxis/migration/__init__.py +11 -0
  392. chronaxis-0.1.0.dev0/src/chronaxis/migration/api.py +270 -0
  393. chronaxis-0.1.0.dev0/src/chronaxis/migration/ini.py +110 -0
  394. chronaxis-0.1.0.dev0/src/chronaxis/migration/legacy_sum.py +304 -0
  395. chronaxis-0.1.0.dev0/src/chronaxis/migration/models.py +83 -0
  396. chronaxis-0.1.0.dev0/src/chronaxis/migration/publication.py +230 -0
  397. chronaxis-0.1.0.dev0/src/chronaxis/migration/sclicer.py +241 -0
  398. chronaxis-0.1.0.dev0/src/chronaxis/migration/slope.py +78 -0
  399. chronaxis-0.1.0.dev0/src/chronaxis/migration/start_end.py +48 -0
  400. chronaxis-0.1.0.dev0/src/chronaxis/planning/__init__.py +19 -0
  401. chronaxis-0.1.0.dev0/src/chronaxis/planning/channels.py +30 -0
  402. chronaxis-0.1.0.dev0/src/chronaxis/planning/checks.py +447 -0
  403. chronaxis-0.1.0.dev0/src/chronaxis/planning/config_groups.py +215 -0
  404. chronaxis-0.1.0.dev0/src/chronaxis/planning/dbc_defaults.py +88 -0
  405. chronaxis-0.1.0.dev0/src/chronaxis/planning/export_options.py +247 -0
  406. chronaxis-0.1.0.dev0/src/chronaxis/planning/input_defaults.py +62 -0
  407. chronaxis-0.1.0.dev0/src/chronaxis/planning/input_paths.py +124 -0
  408. chronaxis-0.1.0.dev0/src/chronaxis/planning/input_requirements.py +250 -0
  409. chronaxis-0.1.0.dev0/src/chronaxis/planning/inputs.py +306 -0
  410. chronaxis-0.1.0.dev0/src/chronaxis/planning/intervals.py +242 -0
  411. chronaxis-0.1.0.dev0/src/chronaxis/planning/legacy_execution.py +38 -0
  412. chronaxis-0.1.0.dev0/src/chronaxis/planning/message_calculations.py +171 -0
  413. chronaxis-0.1.0.dev0/src/chronaxis/planning/models.py +369 -0
  414. chronaxis-0.1.0.dev0/src/chronaxis/planning/nodes.py +355 -0
  415. chronaxis-0.1.0.dev0/src/chronaxis/planning/plan.py +294 -0
  416. chronaxis-0.1.0.dev0/src/chronaxis/planning/preset_models.py +211 -0
  417. chronaxis-0.1.0.dev0/src/chronaxis/planning/record_execution.py +76 -0
  418. chronaxis-0.1.0.dev0/src/chronaxis/planning/reports.py +523 -0
  419. chronaxis-0.1.0.dev0/src/chronaxis/planning/sequences.py +91 -0
  420. chronaxis-0.1.0.dev0/src/chronaxis/planning/signal_groups.py +61 -0
  421. chronaxis-0.1.0.dev0/src/chronaxis/planning/signal_validity.py +46 -0
  422. chronaxis-0.1.0.dev0/src/chronaxis/planning/text_inputs.py +110 -0
  423. chronaxis-0.1.0.dev0/src/chronaxis/presets.py +270 -0
  424. chronaxis-0.1.0.dev0/src/chronaxis/results/__init__.py +34 -0
  425. chronaxis-0.1.0.dev0/src/chronaxis/results/analysis_outcome.py +67 -0
  426. chronaxis-0.1.0.dev0/src/chronaxis/results/artifact_exports.py +212 -0
  427. chronaxis-0.1.0.dev0/src/chronaxis/results/binding_metadata.py +54 -0
  428. chronaxis-0.1.0.dev0/src/chronaxis/results/budget.py +138 -0
  429. chronaxis-0.1.0.dev0/src/chronaxis/results/can_metadata.py +247 -0
  430. chronaxis-0.1.0.dev0/src/chronaxis/results/codec.py +246 -0
  431. chronaxis-0.1.0.dev0/src/chronaxis/results/errors.py +25 -0
  432. chronaxis-0.1.0.dev0/src/chronaxis/results/export_files.py +216 -0
  433. chronaxis-0.1.0.dev0/src/chronaxis/results/frame_exports.py +299 -0
  434. chronaxis-0.1.0.dev0/src/chronaxis/results/frame_patch.py +186 -0
  435. chronaxis-0.1.0.dev0/src/chronaxis/results/frame_rebuild.py +458 -0
  436. chronaxis-0.1.0.dev0/src/chronaxis/results/frame_sort.py +223 -0
  437. chronaxis-0.1.0.dev0/src/chronaxis/results/input_diagnostics.py +51 -0
  438. chronaxis-0.1.0.dev0/src/chronaxis/results/manifest.py +343 -0
  439. chronaxis-0.1.0.dev0/src/chronaxis/results/merge_runs.py +207 -0
  440. chronaxis-0.1.0.dev0/src/chronaxis/results/owned_directory.py +32 -0
  441. chronaxis-0.1.0.dev0/src/chronaxis/results/raw_exports.py +689 -0
  442. chronaxis-0.1.0.dev0/src/chronaxis/results/readable.py +355 -0
  443. chronaxis-0.1.0.dev0/src/chronaxis/results/readable_format.py +94 -0
  444. chronaxis-0.1.0.dev0/src/chronaxis/results/result.py +734 -0
  445. chronaxis-0.1.0.dev0/src/chronaxis/results/rows.py +57 -0
  446. chronaxis-0.1.0.dev0/src/chronaxis/results/signal_exports.py +209 -0
  447. chronaxis-0.1.0.dev0/src/chronaxis/results/signal_grid.py +219 -0
  448. chronaxis-0.1.0.dev0/src/chronaxis/results/spool.py +421 -0
  449. chronaxis-0.1.0.dev0/src/chronaxis/results/summary.py +350 -0
  450. chronaxis-0.1.0.dev0/src/chronaxis/results/text_can_metadata.py +64 -0
  451. chronaxis-0.1.0.dev0/src/chronaxis/results/threshold_metadata.py +105 -0
  452. chronaxis-0.1.0.dev0/src/chronaxis/runner.py +121 -0
  453. chronaxis-0.1.0.dev0/src/chronaxis/sources/__init__.py +23 -0
  454. chronaxis-0.1.0.dev0/src/chronaxis/sources/asc.py +412 -0
  455. chronaxis-0.1.0.dev0/src/chronaxis/sources/blf.py +101 -0
  456. chronaxis-0.1.0.dev0/src/chronaxis/sources/can_spec.py +179 -0
  457. chronaxis-0.1.0.dev0/src/chronaxis/sources/can_updates.py +160 -0
  458. chronaxis-0.1.0.dev0/src/chronaxis/sources/csv_spec.py +133 -0
  459. chronaxis-0.1.0.dev0/src/chronaxis/sources/descriptions.py +65 -0
  460. chronaxis-0.1.0.dev0/src/chronaxis/sources/memory.py +299 -0
  461. chronaxis-0.1.0.dev0/src/chronaxis/sources/models.py +497 -0
  462. chronaxis-0.1.0.dev0/src/chronaxis/sources/packing.py +170 -0
  463. chronaxis-0.1.0.dev0/src/chronaxis/sources/protocol.py +221 -0
  464. chronaxis-0.1.0.dev0/src/chronaxis/sources/raw_can.py +62 -0
  465. chronaxis-0.1.0.dev0/src/chronaxis/sources/raw_csv.py +470 -0
  466. chronaxis-0.1.0.dev0/src/chronaxis/sources/raw_csv_layout.py +310 -0
  467. chronaxis-0.1.0.dev0/src/chronaxis/sources/signal_csv.py +608 -0
  468. chronaxis-0.1.0.dev0/src/chronaxis/sources/text_can_decode.py +421 -0
  469. chronaxis-0.1.0.dev0/src/chronaxis/sources/text_can_ref.py +48 -0
  470. chronaxis-0.1.0.dev0/src/chronaxis/sources/text_can_spec.py +61 -0
  471. chronaxis-0.1.0.dev0/src/chronaxis/timebase/__init__.py +19 -0
  472. chronaxis-0.1.0.dev0/src/chronaxis/timebase/conversion.py +364 -0
  473. chronaxis-0.1.0.dev0/src/chronaxis/timebase/numpy_ops.py +104 -0
  474. chronaxis-0.1.0.dev0/src/chronaxis/user_guide.py +81 -0
  475. chronaxis-0.1.0.dev0/src/chronaxis.egg-info/PKG-INFO +172 -0
  476. chronaxis-0.1.0.dev0/src/chronaxis.egg-info/SOURCES.txt +483 -0
  477. chronaxis-0.1.0.dev0/src/chronaxis.egg-info/dependency_links.txt +1 -0
  478. chronaxis-0.1.0.dev0/src/chronaxis.egg-info/entry_points.txt +2 -0
  479. chronaxis-0.1.0.dev0/src/chronaxis.egg-info/requires.txt +10 -0
  480. chronaxis-0.1.0.dev0/src/chronaxis.egg-info/top_level.txt +1 -0
  481. chronaxis-0.1.0.dev0/tools/ai_field_views.py +104 -0
  482. chronaxis-0.1.0.dev0/tools/build_ai_guide.py +244 -0
  483. chronaxis-0.1.0.dev0/tools/english_docs.py +162 -0
  484. chronaxis-0.1.0.dev0/tools/public_docs.py +14 -0
  485. chronaxis-0.1.0.dev0/tools/pypi_readme.py +61 -0
@@ -0,0 +1,70 @@
1
+ # 用 AI 编写 Chronaxis 分析
2
+
3
+ [English guide](en/README.md)
4
+
5
+ 从这份README开始,再按[任务索引](tasks.json)选择相关示例,只读任务需要的说明。阅读源码中的指南无需先安装Chronaxis、生成文件或导出ZIP;保留仓库目录结构即可。独立资料ZIP使用同一正文,解压时保留完整目录结构。
6
+
7
+ 先向AI提供本README和[资料版本信息](../Current/documentation.json),再按需提供示例、接口或字段说明。未另行注明的相对命令以本README所在目录为起点;已安装环境使用下方工作目录示例;配置内部的ASC、DBC路径相对配置文件所在目录。运行分析需要安装匹配版本的Chronaxis,可用 `python -c "from importlib.metadata import version; print(version('chronaxis'))"` 核对。安装包已经附带普通指南文件,`python -m chronaxis guide`只显示中文README的路径,`--language en`选择英文,不写入或解压资料。源码指南同样直接阅读。资料版本与合成示例不代表私人日志已通过验证。
8
+
9
+ ### 在已安装环境中直接使用
10
+
11
+ 从自己的工作目录执行下列PowerShell命令。它直接读取安装目录的指南和示例,结果写到当前工作目录,不复制或修改安装资料:
12
+
13
+ ```powershell
14
+ $guide = Split-Path (python -m chronaxis guide)
15
+ python "$guide/lookup.py" task CONDITION_ENERGY
16
+ python "$guide/run_analysis.py" "$guide/examples/conditional-energy.yaml" result-energy
17
+ ```
18
+
19
+ 下文的相对命令展示源码/独立指南目录用法;在安装环境执行时,也可像上面一样使用完整输入路径和自己的输出目录。
20
+
21
+ ## 安装Chronaxis及默认运行依赖
22
+
23
+ 普通安装本地 wheel 就会自动安装完整运行依赖,支持 BLF、ASC、原始报文 CSV、DBC 解码、已解码信号 CSV 和内存任务;无需添加 `[can]`。下面是在 Windows PowerShell 中创建环境并安装的完整命令;将 wheel 路径替换为实际收到的文件:
24
+
25
+ ```powershell
26
+ py -3.12 -m venv .venv
27
+ .\.venv\Scripts\python.exe -m pip install ".\chronaxis-0.1.0.dev0-py3-none-any.whl"
28
+ .\.venv\Scripts\python.exe -m pip check
29
+ ```
30
+
31
+ 在后续命令中用同一个 `.venv\Scripts\python.exe`;无需激活环境。该版本声明并已验证的 CAN 依赖为 `python-can==4.6.1`、`cantools==39.4.3`、`natsort==8.4.0`,由 wheel 的默认依赖统一安装。不要为了消除缺模块错误单独安装任意最新版,也不要更改信号、阈值或 DBC。其他依赖版本不代表已验证支持;实际发布物以其安装元数据为准。本项目未声明发布到在线包索引,不能假定 `pip install chronaxis` 会取得这个包。离线安装须事先备齐依赖。
32
+
33
+ `dependency_missing` 表示运行环境缺少 CAN 依赖,不是信号绑定内容错误;按错误中的本地 wheel 安装命令修复。即使全部信号元数据已经手填、静态校验通过,实际运行仍需要相应读取/解码依赖。
34
+
35
+ ## 我该读哪几份文件?
36
+
37
+ 第一次使用时先读[从输入到结果](workflow.md),决定走单次计划、预设还是批量。
38
+
39
+ 1. 从 [任务索引](tasks.json) 找中文需求,只读命中条目的范例、适用条件和相关字段。先用 BLF/ASC+DBC 场景;已解码信号表用 CSV,不需要 DBC。不要把别的发布版的配置或内部函数混进来。
40
+ 2. 写分析配置,使用 YAML 或 JSON,分析版本为整数 3。范例是完整文件;保留 ../Current/examples/data 相对位置。示例工程数值只适用于合成输入。缺真实时间基准、工程阈值、编码、单位或方向依据时,指出哪项缺失以及它会改变什么结果。
41
+ 3. 写 Python,查 [公开 API 索引](../Current/public-api.json),再读对应单个 API 文件。文件用 load_analysis_plan,已展开字典用 AnalysisPlan.from_dict。预设构建得到 PlanFragment,不能直接交给 run。批量返回时逐任务核对状态。
42
+ 4. 配置加载 → 检查声明 → 查看依赖 → 运行 → 写出结果。可用命令见下方;Python方式见 [完整调用](run_analysis.py)。报告实际输入、单位、边界、质量和未验证项。计算返回不代表发布完成。
43
+
44
+ ## 一个从输入到结果的任务
45
+
46
+ 需要具体参数时,用标准 Python 在本README所在目录查询,不用读取整份规范:
47
+
48
+ ```text
49
+ python lookup.py task 持续
50
+ python lookup.py api AnalysisRunner
51
+ python lookup.py field valid_for --schema analysis
52
+ python lookup.py field source_type --schema analysis --branch can_asc
53
+ ```
54
+
55
+ 字段表给出原规范位置及分支。参见[高风险语义与真实诊断](semantics.md)及[完整字段参考](../Current/reference/configuration-schema.md)。条件必填、引用、时间单位和工程契约以完整规范及运行校验为准,不应把独立分片用作验证器。没有匹配项返回退出码1;先查正确的版本、名称或分支,不自动猜同义字段。
56
+
57
+ 在这份资料的目录运行(Windows/Python 3.12,已安装项目默认运行依赖):
58
+
59
+ ```text
60
+ python -m chronaxis config init --list
61
+ python -m chronaxis validate ../Current/examples/conditional-energy.yaml --format json
62
+ python -m chronaxis explain ../Current/examples/conditional-energy.yaml --format json
63
+ python run_analysis.py ../Current/examples/conditional-energy.yaml result-energy
64
+ ```
65
+
66
+ 这个例子连续读取两卷ASC,用DBC解码状态、电流和电压,要求`state == 0x2 and current >= 10`连续严格超过60秒,再对整个合格事件积分。恰好60秒的第一段被排除;第二段跨越分卷,实际区间为[61,122)秒,结果4000×61/3600000=0.06777777777777777kWh。默认从条件开始时刻积分,包括最初60秒;`confirmed_ns=121000000001`表示严格超过60秒的确认时刻,不是积分起点。完整配置位于任务`CONDITION_ENERGY`;预设`CHARGE`采用不同电流比较时,不能替代这个任务。
67
+
68
+ 结果目录必须是新的。默认readable_csv在`事件结果.csv`同一行给出精确秒起止和energy_kwh(kWh),先检查每项指标的状态和说明;从run_manifest.json.outputs找到实际文件。原程序交换格式须显式设置outputs.tables为csv或jsonl,才按parent_id关联原表;CLI与清单中的`analysis_outcome`区分无观测、未知、条件未成立、时长不足和已有事件。没有事件不等于能量为0。换成自己的数据时按实际DBC替换路径、ID、信号和条件;已解码信号表仍可选`CSV`任务,不应用合成阈值替用户决定生产参数。
69
+
70
+ 分析命令和配置解释只证明声明和执行路径;加载按需可读 DBC 元数据、展开来源目录,不扫描业务记录。真实运行、输出和关闭完成后才报告成功。独立样例不能证明其他设备具有相同含义。
@@ -0,0 +1,74 @@
1
+ <a id="用-ai-编写-chronaxis-分析"></a>
2
+ # Use AI to write a Chronaxis analysis
3
+
4
+ Start with this README, select an example from the [task index](tasks.json), and read only the material needed for the task. Reading the guide in a source checkout requires no installation, generated files, or ZIP export; keep the repository layout intact. The standalone documentation ZIP uses the same text with its own complete directory layout.
5
+
6
+ Give the AI this README and the [documentation version](../../Current/documentation.json), then supply examples, API descriptions, or field references as needed. Relative commands use the directory containing this README unless noted otherwise; installed users can use the working-directory example below. ASC and DBC paths inside a configuration are relative to that configuration file. Running an analysis requires the matching Chronaxis version; check it with `python -c "from importlib.metadata import version; print(version('chronaxis'))"`. The installed package includes the guide as ordinary files. `python -m chronaxis guide --language en` prints this English README path without writing or extracting anything. Open it directly; source documentation is also directly readable. Version metadata and synthetic examples do not establish that private logs have been verified.
7
+
8
+ <a id="安装chronaxis及默认运行依赖"></a>
9
+ ### Use the installed guide directly
10
+
11
+ Run these PowerShell commands from your own working directory. They read the installed guide and example directly and put results in your working directory, without copying or modifying the installed material:
12
+
13
+ ```powershell
14
+ $guide = Split-Path (python -m chronaxis guide)
15
+ python "$guide/lookup.py" --language en task CONDITION_ENERGY
16
+ python "$guide/run_analysis.py" "$guide/examples/conditional-energy.yaml" result-energy
17
+ ```
18
+
19
+ The relative commands below illustrate a source or standalone guide directory. For installed examples, use full input paths and your own output directory as above.
20
+
21
+ ## Install Chronaxis and its default dependencies
22
+
23
+ Installing the local wheel installs the runtime dependencies for BLF, ASC, raw-message CSV, DBC decoding, decoded-signal CSV, and memory tasks. No `[can]` suffix is required. On Windows PowerShell, replace the wheel path with the actual file:
24
+
25
+ ```powershell
26
+ py -3.12 -m venv .venv
27
+ .\.venv\Scripts\python.exe -m pip install ".\chronaxis-0.1.0.dev0-py3-none-any.whl"
28
+ .\.venv\Scripts\python.exe -m pip check
29
+ ```
30
+
31
+ Use the same `.venv\Scripts\python.exe` for subsequent commands; activation is optional. This version declares and has been checked with `python-can==4.6.1`, `cantools==39.4.3`, and `natsort==8.4.0`, installed through the wheel's default dependencies. Do not install an arbitrary latest version to fix a missing module, or change signals, thresholds, or the DBC. Other dependency versions are not thereby verified; use the actual distribution's installation metadata. Prepare dependency wheels in advance for offline installation.
32
+
33
+ `dependency_missing` means the environment lacks required CAN dependencies, not that a signal binding is wrong. Follow the local-wheel installation command in the error. Even if every signal's metadata is supplied manually and static validation passes, execution still needs the appropriate reading and decoding dependencies.
34
+
35
+ <a id="我该读哪几份文件"></a>
36
+ ## Which files should I read?
37
+
38
+ First read [from input to results](workflow.md) to choose a single analysis, preset, or independent batch.
39
+
40
+ 1. Search the [task index](tasks.json) for the requested task. Read that entry's example, applicability, and related fields. Start with BLF/ASC plus DBC for CAN tasks. Decoded CSV tables do not need a DBC. Do not mix configuration or internal functions from another release.
41
+ 2. Write YAML or JSON using integer `config_version: 3`. Examples are complete files; preserve the layout under `../../Current/examples/data`. Their engineering values apply only to the synthetic inputs. If the real time basis, thresholds, encoding, units, or direction are missing, explain which fact is missing and how it changes the result.
42
+ 3. For Python, consult the [public API index](../../Current/en/public-api.json), then the individual API page. Use `load_analysis_plan` for files and `AnalysisPlan.from_dict` for expanded dictionaries. Preset construction returns a `PlanFragment`, which cannot be passed directly to `run`. Inspect every task status after a batch returns.
43
+ 4. Load the configuration, validate declarations, inspect dependencies, run, and write the output. Commands are below; the [complete Python call](../run_analysis.py) provides the executable path. Report actual inputs, units, boundaries, quality, and unverified parts. Returning from calculation is not the same as publishing results.
44
+
45
+ <a id="一个从输入到结果的任务"></a>
46
+ ## A complete task
47
+
48
+ Query the material with standard Python from this README's directory instead of reading the whole specification:
49
+
50
+ ```text
51
+ python ../lookup.py --language en task energy
52
+ python ../lookup.py --language en api AnalysisRunner
53
+ python ../lookup.py --language en field valid_for --schema analysis
54
+ python ../lookup.py --language en field source_type --schema analysis --branch can_asc
55
+ ```
56
+
57
+ Field tables identify their specification location and branch. See [semantics and diagnostics](semantics.md) and the [complete field reference](../../Current/en/reference/configuration-schema.md). Conditional requirements, references, time units, and engineering requirements depend on the complete specification and runtime validation. Individual field extracts are not standalone validators. A query without matches exits with code 1: check the version, name, or branch instead of inventing an equivalent field.
58
+
59
+ On Windows with Python 3.12 and the package's default runtime dependencies installed:
60
+
61
+ ```text
62
+ python -m chronaxis config init --list
63
+ python -m chronaxis validate ../../Current/examples/conditional-energy.yaml --format json
64
+ python -m chronaxis explain ../../Current/examples/conditional-energy.yaml --format json
65
+ python ../run_analysis.py ../../Current/examples/conditional-energy.yaml result-energy
66
+ ```
67
+
68
+ This example reads two continuous ASC volumes and decodes state, current, and voltage with a DBC. It requires `state == 0x2 and current >= 10` for strictly more than 60 seconds, then integrates over the entire qualifying event. The first activity lasts exactly 60 seconds and is excluded. The second crosses the file boundary, covers `[61,122)` seconds, and gives `4000 × 61 / 3600000 = 0.06777777777777777 kWh`. Integration starts at condition onset by default, including the first 60 seconds. `confirmed_ns=121000000001` is the strict-duration confirmation time, not the integration start. Use task `CONDITION_ENERGY`; `CHARGE` is not a replacement when its current comparison differs.
69
+
70
+ The output directory must be new. Default `readable_csv` output places exact-second boundaries and `energy_kwh(kWh)` on the same row in `事件结果.csv` (event results). Check each metric's status and explanation. Discover actual file paths through `run_manifest.json.outputs`. To consume original interchange tables linked by `parent_id`, explicitly select `outputs.tables: csv` or `jsonl`. CLI and manifest `analysis_outcome` distinguish no observation, unknown conditions, conditions not met, insufficient duration, and detected events. No event does not mean zero energy.
71
+
72
+ For your own data, replace paths, IDs, signals, and conditions using the actual DBC. Decoded tables can use task `CSV`. Do not treat synthetic thresholds as the user's production parameters.
73
+
74
+ Validation and explanation establish declaration validity and supported execution paths. Loading may read DBC metadata or enumerate directories as needed, but it does not scan business records. Report success only after actual execution, publication, and cleanup finish. An independent example does not establish that another device has the same business meaning.
@@ -0,0 +1,70 @@
1
+ <a id="先决定什么能算再生成配置"></a>
2
+ # Establish what can be calculated before generating configuration
3
+
4
+ | Task | Facts to establish | How to decide |
5
+ |---|---|---|
6
+ | Identify inputs | BLF/ASC logs, DBC, channel, message, and signal; actual CSV headers and time units. | Joint analysis of different clocks needs a common origin, offset, or other explicit synchronization evidence. Both files starting at zero is insufficient. |
7
+ | Bind names | Locate the original input field. `name` is its analysis name; `semantic_id` is optional business metadata. | If `BMS_I` is bound as `pack_current` with semantic ID `battery.current`, write `pack_current > 5`. A dotted semantic ID is not an object attribute. Require an explicit choice when multiple candidates match. |
8
+ | Units and direction | Existing DBC conversion, physical unit, positive direction, and measurement point. | Converting decoded 2000 mA to 2 A needs only the additional unit conversion. Unit labels and `sign_convention` do not change values. There is no public `direction_factor`; same-unit `scale=-1` is not a general sign-flip mechanism. |
9
+ | State codes | The business meaning of each code. | Whether 2 means charging depends on the equipment. Preserve numeric types for a user-supplied comparison such as `state == 0x2`. Use Boolean/enumeration mappings only when true/false or named states are needed. Unknown mapping codes do not mean nonzero=true. Without definitions, identify the missing facts rather than claiming a production-ready charging detector. |
10
+ | Validity | `valid_for` is a positive duration. An explicit value wins; otherwise use three times this signal's `period`, obtaining a DBC message period at runtime where applicable. Do not guess without a basis. Explicit null is not omission. | With an update at 0 and `period=100ms`, the value remains valid at 0.299 s and becomes unknown at 0.300 s. An invalid update at 0.2 s makes it unknown from 0.2 s. Validity does not set a sample rate or create records. |
11
+ | Conditions and statistics | Requested range, observed range, selected data, and `partial_policy`. | A fully observed, known-false condition may yield zero conditional integral. Minimum/maximum/mean of an empty selection are null. No observations or all-unknown input must not become a normal zero. Explain partial values together with `status`, `reason`, and `quality`. |
12
+ | Events and segments | Two activities can merge into one surrounding segment without making their gap an activity. | `segments.parent_event_ids` may reference several `events.event_id` values in the same run. Link calculations using `scope` and `parent_id`, not row number or rule name alone. |
13
+ | Timing and output | Batch size changes execution chunks only. Unknown response differs from decidable timeout. Actual-time integration differs from per-message accumulation. | Inspect dependencies, intervals, output units, and requested ranges in `explain`. `coverage_status` exists only for applicable result types and thresholds; it is not a numerical coverage ratio. Do not invent a `coverage` field. |
14
+ | Business presets | Charging, for example, needs `mode`/`current` and `voltage` when energy is requested. Direction, units, and measurement point must meet role requirements. | Missing facts or two matching candidates do not authorize choosing the first. Explicit bindings still undergo role validation. Example thresholds and codes do not transfer automatically to another vehicle. |
15
+
16
+ <a id="从报告定位错误"></a>
17
+ ## Diagnose using actual reports
18
+
19
+ Record the user's required signals, conditions, scope, and outputs first. Request JSON from `validate`. For a constructed plan, inspect `valid`, `execution_ready`, `errors`, `warnings`, and `capability_status`. For loading failure, use the actual fields supplied in the single `error`, such as `code`, `source`, `path`, `line`, `column`, `message`, and `hint`. In `explain`, the validation report is under `validation`, with dependencies under `nodes` and `input_requirements`. Environment, I/O, or argument errors may produce only a nonzero exit code and stderr; missing JSON does not mean success.
20
+
21
+ For example, string `config_version: "3"` is rejected. Change only that value to integer 3, preserve the calculation, and recheck. Do not remove a filter, extend validity, ignore unknown data, or reverse a sign to “fix” a diagnostic. If two correction rounds still fail, report the real error and unresolved facts rather than fabricate runnable output.
22
+
23
+ ```text
24
+ python -m chronaxis config origins ../../Current/examples/analysis-imports.yaml --fields --format json
25
+ python -m chronaxis config resolve ../../Current/examples/analysis-imports.yaml --defaults --format json
26
+ python -m chronaxis validate ../../Current/examples/input-csv-minimal.yaml --format json
27
+ python -m chronaxis explain ../../Current/examples/input-csv-minimal.yaml --format json
28
+ ```
29
+
30
+ `origins` identifies the declaration supplying a field. `resolve` shows expanded configuration and defaults that can currently be determined; it must not invent a fixed period awaiting DBC lookup. `load_analysis_plan` resolves paths relative to the defining file; `AnalysisPlan.from_dict` takes an already expanded dictionary. Validation does not establish actual observation coverage, real units, or correct results. Deliver the version, inputs, key assumptions, checks actually performed, and unverified conditions.
31
+
32
+ <a id="持续门槛与积分起点"></a>
33
+ ## Duration thresholds and integration starts
34
+
35
+ For `condition_duration`, `minimum_duration: 60s` means reaching 60 seconds by default. For “more than 60 seconds,” add `duration_comparison: ">"`, not 60.1 seconds. Default `selection_origin: onset` includes the entire qualifying interval. Select `confirmed` only when the user asks to start after confirmation. An exactly 60-second activity produces an event in the default mode and no event in strict mode. Time precision is 1 ns. Actual-time strict comparison can confirm at threshold plus 1 ns; fixed/DBC mode waits for the next driving message that takes accumulated duration strictly past the threshold.
36
+
37
+ <a id="资源不足时保留原任务"></a>
38
+ ## Preserve the task when resources are insufficient
39
+
40
+ Sample minimum, maximum, and mean use chunked reductions within the shared memory budget; their result does not depend on chunk size. Do not add unrequested statistics for debugging. For a budget error, first inspect the named calculation, workspace, or read buffer instead of attributing every failure to machine RAM. If even the smallest statistical chunk does not fit, execution fails explicitly. Reducing read batches changes processing chunks, not conditions, validity, or retained input. Increase budgets only with an actual resource basis. Managed budget estimates and process RSS are different quantities.
41
+
42
+ <a id="can通道连续文件与检查范围"></a>
43
+ ## CAN channels, continuous files, and check scope
44
+
45
+ DBC mapping keys, explicit signal channels, per-message selectors, and raw-frame resampling channels all start at 1 in public configuration. Channel 1 in ASC is channel 1 in configuration; do not subtract 1. Signal/selector `channel` can be omitted when the source channel is unambiguous. The program converts internal zero-based numbering. For raw CSV, `reader.channel_origin` still describes whether the input column itself starts at 0 or 1. Migrate old zero-based configuration rather than editing the original log.
46
+
47
+ Configuration paths are relative to the file containing that field, including shared definitions. Dictionary APIs use `base_dir`, defaulting to the current directory. `chronaxis explain PLAN --format json` shows plan information; `chronaxis config resolve PLAN --format json` shows expanded configuration. Files within one source are continuous in listed order, retaining candidate state across boundaries. Directory matching uses natural order. Sharing a folder does not prove sharing a session: use batch tasks for independent experiments, and do not invent offsets to concatenate them.
48
+
49
+ ASC checks timestamp order only for required channels/IDs by default. The source's earliest and latest frame times are still collected during that same read. Required records moving backwards remain errors; full checks or raw-frame export require the whole source to be ordered. Do not add a separate full-file scan followed by automatic cleaning. A small difference of microseconds does not authorize changing the input.
50
+
51
+ <a id="默认可读结果"></a>
52
+ ## Default readable results
53
+
54
+ Omitting `outputs.tables` selects `readable_csv`: Chinese filenames and headers, exact seconds, and one row containing the metrics for each event or window. Discover actual files through `run_manifest.json.outputs`; do not hard-code `events.csv` or `calculations.csv`. Explicit `outputs.tables: csv` or `jsonl` selects the original interchange format and integer nanoseconds. Only the selected table format is produced.
55
+
56
+ Readable tables retain calculation names and units. Empty cells are not zero. Each metric independently reports `完整` (complete), `部分有效` (partial), or `无法确定` (indeterminate), with its reason. Inspect interval status separately from metric status. Global `has_unknown` does not invalidate a complete calculation within a known interval. For no events, inspect manifest `result_messages`; do not create a false zero-energy result. Preserve the original analysis time coordinates without inventing dates or shifting to zero. Do not duplicate seconds and nanoseconds. Python iterators such as `iter_events` and `iter_calculations` continue to return original typed rows.
57
+
58
+ <a id="独立批量的进程数"></a>
59
+ ## Process count for independent batch tasks
60
+
61
+ Root-level batch `process_count` is a positive integer, default 1, limiting analysis worker processes. It excludes the scheduler and CAN reader subprocesses. `run_batch(plan, output, process_count=4)` and CLI `--process-count 4` override it. Only the Python API accepts `None` to inherit the plan; configuration rejects null and Booleans. Call from a Python script inside `if __name__ == "__main__":`. Ordinary `AnalysisRunner` has no such parameter. Continuous `paths` in one session are not split into independent processes.
62
+
63
+ Each task has its own budgets and output. Cancellation prevents tasks that have not started; in-flight tasks finish and close. `report.close()` can retry remote cleanup. Unstarted tasks and worker crashes are not successes. Legacy `workers`, `max_workers`, and `--workers` are rejected.
64
+
65
+ <a id="迁移数值与后端核对"></a>
66
+ ## Migrated numbers and backend comparisons
67
+
68
+ Historical INI seconds accept scientific notation. Import preserves compact representation and checks representable durations; do not expand huge exponents for display. A rejection report is not a successfully generated analysis plan. Both backends must agree on event boundaries, statuses, and diagnostics. Compare floating-point metrics using their unit and agreed error tolerance, without requiring bitwise equality or attributing event/quality differences to rounding.
69
+
70
+ Ordinary scalar calculations, including sample statistics, can return `coverage_status` when `minimum_coverage > 0`. It records the threshold decision, not a ratio, and does not change the equal weighting of `sample_mean`. Initial-edge `emit_initial` concerns the first known state, not an arbitrary first `True` anywhere in the analysis. A requested endpoint can produce a point event only when it is actually observed and satisfies the rule.
@@ -0,0 +1,290 @@
1
+ {
2
+ "device_label": "home",
3
+ "revision": 1,
4
+ "tasks": [
5
+ {
6
+ "id": "CAN",
7
+ "intent": "Integrate power from BLF / ASC messages",
8
+ "example": "../../Current/examples/analysis.yaml",
9
+ "requires": "Logs, channel, matching DBC, power unit, and clock.",
10
+ "check": "Check joules (J) and the actual observed range.",
11
+ "fields": [
12
+ "sources",
13
+ "signals",
14
+ "calculations"
15
+ ],
16
+ "templates": [
17
+ "can-blf",
18
+ "can-asc"
19
+ ],
20
+ "api": [
21
+ "load_analysis_plan",
22
+ "AnalysisRunner"
23
+ ],
24
+ "verify": "python -m chronaxis validate ../../Current/examples/analysis.yaml --format json"
25
+ },
26
+ {
27
+ "id": "CONDITION_ENERGY",
28
+ "intent": "Continuous BLF/ASC volumes: require multiple conditions for longer than a threshold, then integrate energy over the full qualifying interval in kWh",
29
+ "example": "../../Current/examples/conditional-energy.yaml",
30
+ "requires": "Raw ASC/BLF and matching DBC; target signals, codes, units, comparisons, continuous duration, and integration scope. Do not require types, units, or periods to be repeated when the DBC supplies them.",
31
+ "applicable": "Custom state and numeric conditions; inclusive or strict duration thresholds; integration from condition onset; optional energy unit. The example uses strict >60s, default onset, and actual elapsed time.",
32
+ "not_applicable": "For a direct sum using a fixed period per message, consult message_calculations. Use BATCH for independent files.",
33
+ "alternative": "charge_session applies only to its strict current > comparison, duration >= comparison, Wh/Ah outputs, and direction/measurement-point requirements. Do not choose it merely because a task mentions charging.",
34
+ "check": "Exactly 60 seconds produces no event. The cross-file 61-second interval is [61,122), giving 4000W*61s/3600000=0.06777777777777777kWh. Link parent_id to event_id and check status/reason. Do not replace strict comparison with 60.1 seconds.",
35
+ "fields": [
36
+ "sources",
37
+ "signals",
38
+ "rules",
39
+ "calculations"
40
+ ],
41
+ "templates": [],
42
+ "api": [
43
+ "load_analysis_plan",
44
+ "AnalysisRunner"
45
+ ],
46
+ "verify": "python -m chronaxis validate ../../Current/examples/conditional-energy.yaml --format json"
47
+ },
48
+ {
49
+ "id": "CSV",
50
+ "intent": "Power table integrated using actual elapsed time",
51
+ "example": "../../Current/examples/input-csv-minimal.yaml",
52
+ "requires": "Time column, units, power column, and validity period.",
53
+ "check": "Compare with the hand-calculated 38 J.",
54
+ "fields": [
55
+ "sources",
56
+ "signals",
57
+ "calculations"
58
+ ],
59
+ "templates": [
60
+ "signal-csv"
61
+ ],
62
+ "api": [
63
+ "load_analysis_plan",
64
+ "AnalysisRunner"
65
+ ],
66
+ "verify": "python -m chronaxis validate ../../Current/examples/input-csv-minimal.yaml --format json"
67
+ },
68
+ {
69
+ "id": "CHARGE",
70
+ "intent": "Charging activities, electric charge, and charging energy",
71
+ "example": "../../Current/examples/preset-charge-energy.yaml",
72
+ "requires": "Mode codes, positive current direction, terminal measurement point, voltage, thresholds, and duration. The teaching example uses ASC; for BLF replace the logs, DBC, and bindings with your own.",
73
+ "check": "Check each activity boundary and Wh/Ah result. Current exactly equal to current_min is excluded; duration exactly equal to minimum_duration qualifies. The default start is onset. Check applicability rather than matching only the word charging.",
74
+ "fields": [
75
+ "presets",
76
+ "signals"
77
+ ],
78
+ "templates": [
79
+ "charge-session"
80
+ ],
81
+ "api": [
82
+ "load_analysis_plan",
83
+ "resolve_preset_roles",
84
+ "build_preset"
85
+ ],
86
+ "verify": "python -m chronaxis validate ../../Current/examples/preset-charge-energy.yaml --format json",
87
+ "applicable": "Mode equals the specified integer code and current is strictly greater than current_min. After reaching minimum_duration, calculate from condition onset. Outputs are Wh for energy and Ah for electric charge. Positive current means charging, and the measurement point is the battery-pack terminal.",
88
+ "not_applicable": "Do not directly apply charge_session when the task needs current >= threshold, a strict duration threshold, direct kWh output, another state combination, or unconfirmed preset direction/measurement-point requirements.",
89
+ "alternative": "Use CONDITION_ENERGY and ../../Current/examples/conditional-energy.yaml with an ordinary condition_duration rule and event-scope integral. Preserve the comparisons, duration comparison, and output unit. Ordinary U*I integration needs no extra direction/measurement-point metadata or 95% coverage threshold."
90
+ },
91
+ {
92
+ "id": "EVENT",
93
+ "intent": "Sustained activities, exit grouping, and event relationships",
94
+ "example": "../../Current/examples/window-merged.yaml",
95
+ "requires": "Condition, time units, window, and allowed gap.",
96
+ "check": "Preserve event boundaries; a segment may contain multiple parent_event_ids.",
97
+ "fields": [
98
+ "rules",
99
+ "windows"
100
+ ],
101
+ "templates": [],
102
+ "api": [
103
+ "load_analysis_plan",
104
+ "AnalysisRunner"
105
+ ],
106
+ "verify": "python -m chronaxis validate ../../Current/examples/window-merged.yaml --format json"
107
+ },
108
+ {
109
+ "id": "ALARM",
110
+ "intent": "Alarm context and rising edges",
111
+ "example": "../../Current/examples/preset-fault-context.yaml",
112
+ "requires": "An explicitly defined Boolean alarm and before/after durations.",
113
+ "check": "Check point events separately from surrounding segments.",
114
+ "fields": [
115
+ "presets",
116
+ "windows"
117
+ ],
118
+ "templates": [
119
+ "fault-window"
120
+ ],
121
+ "api": [
122
+ "load_analysis_plan",
123
+ "AnalysisRunner"
124
+ ],
125
+ "verify": "python -m chronaxis validate ../../Current/examples/preset-fault-context.yaml --format json"
126
+ },
127
+ {
128
+ "id": "PAIR",
129
+ "intent": "Request/response pairs, timeout, and insufficient observation",
130
+ "example": "../../Current/examples/sequence-outcomes.yaml",
131
+ "requires": "Comparable request and response clocks, with explicit minimum and maximum delays.",
132
+ "check": "Unknown observations must not become a definite no-response outcome.",
133
+ "fields": [
134
+ "sequences",
135
+ "rules"
136
+ ],
137
+ "templates": [
138
+ "command-response"
139
+ ],
140
+ "api": [
141
+ "load_analysis_plan",
142
+ "AnalysisRunner"
143
+ ],
144
+ "verify": "python -m chronaxis validate ../../Current/examples/sequence-outcomes.yaml --format json"
145
+ },
146
+ {
147
+ "id": "ENCODING",
148
+ "intent": "Boolean and enumeration codes, and expression aliases",
149
+ "example": "../../Current/examples/signal-enum-minimal.yaml",
150
+ "requires": "Equipment code definitions; undefined codes must not use nonzero=true.",
151
+ "check": "Expressions reference bound names. Semantic IDs are not attribute paths.",
152
+ "fields": [
153
+ "signals",
154
+ "derived"
155
+ ],
156
+ "templates": [],
157
+ "api": [
158
+ "load_analysis_plan",
159
+ "AnalysisRunner"
160
+ ],
161
+ "verify": "python -m chronaxis validate ../../Current/examples/signal-enum-minimal.yaml --format json"
162
+ },
163
+ {
164
+ "id": "UNITS",
165
+ "intent": "Conversions, units, and scales",
166
+ "example": "../../Current/examples/signal-number-conversion.yaml",
167
+ "requires": "Input/output units, existing decoder scaling, and direction declarations.",
168
+ "check": "Apply DBC scaling once. Unit labels alone do not convert values.",
169
+ "fields": [
170
+ "signals"
171
+ ],
172
+ "templates": [],
173
+ "api": [
174
+ "load_analysis_plan",
175
+ "AnalysisRunner"
176
+ ],
177
+ "verify": "python -m chronaxis validate ../../Current/examples/signal-number-conversion.yaml --format json"
178
+ },
179
+ {
180
+ "id": "QUALITY",
181
+ "intent": "Expired data, zero values, and partial results",
182
+ "example": "../../Current/examples/quality.yaml",
183
+ "requires": "Period or validity, required observation range, and missing-data policy.",
184
+ "check": "Read status/reason/quality together with the value.",
185
+ "fields": [
186
+ "signals",
187
+ "execution",
188
+ "calculations"
189
+ ],
190
+ "templates": [],
191
+ "api": [
192
+ "load_analysis_plan",
193
+ "AnalysisRunner"
194
+ ],
195
+ "verify": "python -m chronaxis validate ../../Current/examples/quality.yaml --format json"
196
+ },
197
+ {
198
+ "id": "BATCH",
199
+ "intent": "Run independent tasks in a batch",
200
+ "example": "../../Current/examples/batch-minimal.yaml",
201
+ "requires": "Independent input and output for each plan, without shared task state.",
202
+ "check": "Use batch run. process_count is a positive integer, default 1, overridable with --process-count. Inspect worker_process_count and each task worker_pid in batch_report. Continuous volumes belong in one task's paths.",
203
+ "fields": [
204
+ "jobs",
205
+ "process_count"
206
+ ],
207
+ "templates": [
208
+ "batch"
209
+ ],
210
+ "api": [
211
+ "load_batch_plan",
212
+ "run_batch",
213
+ "BatchReport"
214
+ ],
215
+ "verify": "python -m chronaxis batch run ../../Current/examples/batch-minimal.yaml --output new-batch"
216
+ },
217
+ {
218
+ "id": "IMPORT",
219
+ "intent": "Shared definitions, field origins, and relative paths",
220
+ "example": "../../Current/examples/analysis-imports.yaml",
221
+ "requires": "Both the main configuration and referenced shared-definition files.",
222
+ "check": "Use config origins --fields to inspect declaration origins.",
223
+ "fields": [
224
+ "imports"
225
+ ],
226
+ "templates": [],
227
+ "api": [
228
+ "load_analysis_plan"
229
+ ],
230
+ "verify": "python -m chronaxis validate ../../Current/examples/analysis-imports.yaml --format json"
231
+ },
232
+ {
233
+ "id": "EXPORT",
234
+ "intent": "Export raw messages around events",
235
+ "example": "../../Current/examples/export-can-minimal.yaml",
236
+ "requires": "A supported CAN source, explicit window, and new output directory.",
237
+ "check": "Check actual windows, output format, and manifest.",
238
+ "fields": [
239
+ "outputs",
240
+ "windows"
241
+ ],
242
+ "templates": [
243
+ "can-export"
244
+ ],
245
+ "api": [
246
+ "load_analysis_plan",
247
+ "AnalysisRunner"
248
+ ],
249
+ "verify": "python -m chronaxis validate ../../Current/examples/export-can-minimal.yaml --format json"
250
+ },
251
+ {
252
+ "id": "PYTHON",
253
+ "intent": "Load, publish, and close results in Python",
254
+ "example": "../../Current/examples/input-csv-minimal.yaml",
255
+ "requires": "The matching installed version, complete plan, and new result directory.",
256
+ "check": "Run ../run_analysis.py. Validate before execution, read rows, and close resources.",
257
+ "fields": [
258
+ "outputs"
259
+ ],
260
+ "templates": [
261
+ "signal-csv"
262
+ ],
263
+ "api": [
264
+ "load_analysis_plan",
265
+ "AnalysisRunner",
266
+ "AnalysisResult"
267
+ ],
268
+ "verify": "python -m chronaxis validate ../../Current/examples/input-csv-minimal.yaml --format json"
269
+ },
270
+ {
271
+ "id": "FIX",
272
+ "intent": "Correct configuration using diagnostics",
273
+ "example": "../../Current/examples/input-csv-minimal.yaml",
274
+ "requires": "The user's original intent, original files, and actual diagnostics.",
275
+ "check": "Fix field placement, types, or references. Do not remove conditions or change validity to suppress errors.",
276
+ "fields": [
277
+ "config_version"
278
+ ],
279
+ "templates": [
280
+ "signal-csv"
281
+ ],
282
+ "api": [
283
+ "validate_analysis_plan",
284
+ "explain_analysis_plan",
285
+ "PlanValidationError"
286
+ ],
287
+ "verify": "python -m chronaxis validate ../../Current/examples/input-csv-minimal.yaml --format json"
288
+ }
289
+ ]
290
+ }
@@ -0,0 +1,41 @@
1
+ <a id="从用户输入到结果"></a>
2
+ # From the user's inputs to results
3
+
4
+ | Task | Public entry point | Result and boundaries |
5
+ |---|---|---|
6
+ | Connect logs | BLF/ASC with the matching DBC; raw-message CSV with an explicit record format; decoded CSV with column declarations; memory input for controlled data. | Source identity, clocks, and entity scope are input requirements. Combine sources only when the available evidence supports it. |
7
+ | Build an analysis | Version 3 YAML/JSON for a single task, with at most one level of shared definitions. Use `load_analysis_plan` for files and `AnalysisPlan.from_dict` for dictionaries. | Checks references, types, units, and clocks; may enumerate directories or read DBC metadata. This does not verify business meaning in actual records. |
8
+ | Choose calculations | Use bound names in conditions, derived expressions, rules, windows, and `calculations`. Use `message_calculations` for per-message accumulation. | Activities and windows can have separate calculations. Integration method, interval basis, and quality affect results. |
9
+ | Use business presets | Declare roles and parameters in a complete plan's `presets`. Python construction returns a `PlanFragment`. | Presets expand into ordinary declarations. Role validation does not determine engineering thresholds; a fragment is not a complete plan. |
10
+ | Explain before running | `validate_analysis_plan`, `explain_analysis_plan`, then `AnalysisRunner.run`. | Explanation shows dependencies, time requirements, and budgets, not records already read. `run` calculates from real inputs and returns an `AnalysisResult`. |
11
+ | Read or deliver results | Stream rows from `AnalysisResult`; close cursors after exhaustion or early exit. Call `write` with a new directory, then close the result. | Follow each row type's relationship keys and quality fields. Null is not zero. Failed publication is not delivery. |
12
+ | Run independent tasks | `load_batch_plan`, `run_batch`, or `python -m chronaxis batch run`. | Each task is independent. Inspect individual statuses even after a normal return. Do not split one stateful session into independent tasks. |
13
+
14
+ Evidence for final output publication in this version is limited to Windows / Python 3.12. Historical formats, channels, exports, and profiles have specific conditions. Retain capability restrictions reported by `validate`/`explain` rather than promising every historical path works. Example values are synthetic; platform behavior, budgets, speed, and real business results require their own verification.
15
+
16
+ <a id="写配置前保留用户原意"></a>
17
+ ## Preserve the user's meaning before writing configuration
18
+
19
+ Map the requirements already supplied by the user to configuration without asking them to reconfirm those facts. Consider: “state is `0x2`, current is at least `10A`, continuously for more than `60s`; integrate current times voltage over each qualifying interval, in `kWh`.”
20
+
21
+ | Requirement to preserve | Configuration and handling |
22
+ |---|---|
23
+ | Signals and expression | Bind `BMS_ChrgSta`, `BMS_BatPackActCur`, and `BMS_BatPackActVol`. Calculate current times voltage; do not substitute another measurement point. |
24
+ | Comparisons and logic | Use `state == 0x2 and current >= 10`, binding aliases to those signals. Preserve equality, inclusive `>=`, and logical AND. |
25
+ | Continuously longer than 60 seconds | Use `condition_duration`, `minimum_duration: 60s`, and `duration_comparison: ">"`. Exactly 60 seconds does not qualify. Do not replace it with 60.1 seconds or omit continuity by merely filtering frames. |
26
+ | Integration boundaries | “Within the qualifying interval” uses default `selection_origin: onset`, from first satisfaction to the interval end. Do not discard the first 60 seconds. Use `confirmed` only when explicitly requested. |
27
+ | Unit | Confirm A and V from the DBC or established definitions, and request `kWh` output. Do not relabel a J or Wh value as kWh. |
28
+ | File relationships and timing | Put continuous volumes in one source so state continues across files. Batch only independent tasks. Preserve the chosen actual, fixed, or DBC period; do not edit timestamps instead of configuring it correctly. |
29
+
30
+ Aliases may be short, but explain their original signal mappings. Obtain facts from inputs, DBC metadata, matching examples, and the user's existing instructions. Ask only when a missing fact can change the result, such as an ambiguous signal match or uncertainty about whether files are continuous volumes or independent experiments. Use supported defaults and explain them where relevant; do not turn every optional field into a question.
31
+
32
+ Ordinary expression integration does not require current direction or measurement-point metadata used only by a business preset. If the user specifies a raw-current comparison and product, do not add sign conversion merely to label the result “charging” or “discharging.” Ask about that interpretation only when the task actually needs it and the available information is insufficient.
33
+
34
+ <a id="报错修复与核验范围"></a>
35
+ ## Fix errors within the task's scope
36
+
37
+ For installation, missing dependencies, paths, or field errors, fix the actual cause while preserving the requested signals, condition, duration threshold, integration start, and unit. Do not add direction/measurement restrictions, a `95%` coverage threshold, extra minimum/maximum statistics, or change validity, thresholds, or timing just to make execution succeed. Do not automatically sort, deduplicate, filter, or rewrite input after backwards timestamps or similar data errors. Report the actual diagnostic and explain any proposed data treatment's effect on results.
38
+
39
+ Read, calculate, and deliver only what the task needs. Once installation and entry-point validation pass, run the requested analysis. Contributions, tracing, raw-frame copies, additional statistics, and repeated scans that neither the user nor calculation needs must not be constructed, scanned, saved, or output. Explain empty results using their diagnostics; do not silently loosen conditions and rerun.
40
+
41
+ Choose independent verification for a specific verification goal; it is not a prerequisite for every normal run. If you write a separate checker, explain whether it preserves original order, how it handles validity (TTL), invalid updates and boundaries, and which files, signals, and results it checks. A script that sorts records and holds the latest voltage forever is not equivalent to an analysis that preserves order and expires voltage. Similar total energy alone does not verify the entire feature. Checking only integration values does not establish event selection, cross-file state, or all quality rules. Investigate discrepancies rather than changing business conditions to fit a reference value.