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.
- chronaxis/__init__.py +72 -0
- chronaxis/__main__.py +12 -0
- chronaxis/analysis_cli.py +181 -0
- chronaxis/batch/__init__.py +14 -0
- chronaxis/batch/api.py +46 -0
- chronaxis/batch/cli.py +48 -0
- chronaxis/batch/config.py +37 -0
- chronaxis/batch/models.py +202 -0
- chronaxis/batch/process_transport.py +149 -0
- chronaxis/batch/process_tree.py +72 -0
- chronaxis/batch/publication.py +41 -0
- chronaxis/batch/runner.py +236 -0
- chronaxis/batch/templates.py +42 -0
- chronaxis/can_dependencies.py +42 -0
- chronaxis/cli.py +193 -0
- chronaxis/configuration/__init__.py +46 -0
- chronaxis/configuration/cli.py +41 -0
- chronaxis/configuration/diagnostics.py +107 -0
- chronaxis/configuration/explanation.py +233 -0
- chronaxis/configuration/file_tools.py +140 -0
- chronaxis/configuration/imports.py +144 -0
- chronaxis/configuration/initialization.py +36 -0
- chronaxis/configuration/json_parser.py +114 -0
- chronaxis/configuration/models.py +74 -0
- chronaxis/configuration/origins.py +90 -0
- chronaxis/configuration/overrides.py +55 -0
- chronaxis/configuration/resolution.py +150 -0
- chronaxis/configuration/template_catalog.py +68 -0
- chronaxis/configuration/templates/batch/analysis-annotated.yaml +18 -0
- chronaxis/configuration/templates/batch/analysis-minimal.yaml +18 -0
- chronaxis/configuration/templates/batch/annotated.yaml +6 -0
- chronaxis/configuration/templates/batch/minimal.yaml +6 -0
- chronaxis/configuration/templates/can-asc/annotated.yaml +18 -0
- chronaxis/configuration/templates/can-asc/minimal.yaml +18 -0
- chronaxis/configuration/templates/can-blf/annotated.yaml +18 -0
- chronaxis/configuration/templates/can-blf/minimal.yaml +18 -0
- chronaxis/configuration/templates/can-export/annotated.yaml +23 -0
- chronaxis/configuration/templates/can-export/minimal.yaml +23 -0
- chronaxis/configuration/templates/catalog.json +233 -0
- chronaxis/configuration/templates/charge-session/annotated.yaml +38 -0
- chronaxis/configuration/templates/charge-session/minimal.yaml +38 -0
- chronaxis/configuration/templates/command-response/annotated.yaml +32 -0
- chronaxis/configuration/templates/command-response/minimal.yaml +36 -0
- chronaxis/configuration/templates/fault-window/annotated.yaml +25 -0
- chronaxis/configuration/templates/fault-window/minimal.yaml +27 -0
- chronaxis/configuration/templates/ini-mapping/annotated.yaml +20 -0
- chronaxis/configuration/templates/ini-mapping/minimal.yaml +20 -0
- chronaxis/configuration/templates/raw-can-csv/annotated.yaml +34 -0
- chronaxis/configuration/templates/raw-can-csv/minimal.yaml +35 -0
- chronaxis/configuration/templates/shared/charge-session.asc +5 -0
- chronaxis/configuration/templates/shared/command-response.asc +8 -0
- chronaxis/configuration/templates/shared/fault-window.asc +5 -0
- chronaxis/configuration/templates/shared/power.asc +7 -0
- chronaxis/configuration/templates/shared/sample.asc +6 -0
- chronaxis/configuration/templates/shared/sample.blf +0 -0
- chronaxis/configuration/templates/shared/sample.csv +5 -0
- chronaxis/configuration/templates/shared/sample.dbc +11 -0
- chronaxis/configuration/templates/shared/signals.csv +6 -0
- chronaxis/configuration/templates/shared/source.ini +5 -0
- chronaxis/configuration/templates/shared/stability.asc +9 -0
- chronaxis/configuration/templates/shared/teaching.dbc +27 -0
- chronaxis/configuration/templates/shared/threshold.asc +7 -0
- chronaxis/configuration/templates/signal-csv/annotated.yaml +27 -0
- chronaxis/configuration/templates/signal-csv/minimal.yaml +27 -0
- chronaxis/configuration/templates/signal-export/annotated.yaml +27 -0
- chronaxis/configuration/templates/signal-export/minimal.yaml +29 -0
- chronaxis/configuration/templates/stability/annotated.yaml +35 -0
- chronaxis/configuration/templates/stability/minimal.yaml +35 -0
- chronaxis/configuration/templates/threshold/annotated.yaml +22 -0
- chronaxis/configuration/templates/threshold/minimal.yaml +22 -0
- chronaxis/configuration/yaml_parser.py +125 -0
- chronaxis/core/__init__.py +71 -0
- chronaxis/core/binding.py +449 -0
- chronaxis/core/calculation_series_join.py +106 -0
- chronaxis/core/calculations.py +435 -0
- chronaxis/core/calculations_memory_numpy.py +136 -0
- chronaxis/core/calculations_memory_reference.py +165 -0
- chronaxis/core/calculations_numpy.py +298 -0
- chronaxis/core/calculations_reference.py +294 -0
- chronaxis/core/condition_evidence.py +182 -0
- chronaxis/core/conditional_integral_result.py +43 -0
- chronaxis/core/conditional_integral_terms.py +146 -0
- chronaxis/core/conditional_integral_terms_numpy.py +148 -0
- chronaxis/core/conditional_integral_terms_reference.py +111 -0
- chronaxis/core/conditional_time_reduction.py +118 -0
- chronaxis/core/conditional_time_reduction_numpy.py +223 -0
- chronaxis/core/conditional_time_reduction_reference.py +213 -0
- chronaxis/core/declarations.py +192 -0
- chronaxis/core/decoded_binding.py +197 -0
- chronaxis/core/direct_message.py +387 -0
- chronaxis/core/export_interpolation.py +54 -0
- chronaxis/core/expression.py +642 -0
- chronaxis/core/expression_numpy.py +314 -0
- chronaxis/core/expression_reference.py +272 -0
- chronaxis/core/integral_result.py +53 -0
- chronaxis/core/integral_sum.py +77 -0
- chronaxis/core/integral_sum_numpy.py +224 -0
- chronaxis/core/integral_sum_reference.py +148 -0
- chronaxis/core/integral_terms.py +119 -0
- chronaxis/core/integral_terms_numpy.py +127 -0
- chronaxis/core/integral_terms_reference.py +91 -0
- chronaxis/core/mean_weights_numpy.py +29 -0
- chronaxis/core/mean_weights_reference.py +27 -0
- chronaxis/core/message_binding.py +305 -0
- chronaxis/core/models.py +485 -0
- chronaxis/core/normalize_numpy.py +396 -0
- chronaxis/core/numeric.py +472 -0
- chronaxis/core/numeric_numpy.py +440 -0
- chronaxis/core/record_intervals.py +115 -0
- chronaxis/core/sample_reduction.py +161 -0
- chronaxis/core/sample_reduction_numpy.py +160 -0
- chronaxis/core/sample_reduction_reference.py +154 -0
- chronaxis/core/selection.py +74 -0
- chronaxis/core/sequence.py +160 -0
- chronaxis/core/sequence_reference.py +248 -0
- chronaxis/core/stability.py +249 -0
- chronaxis/core/start_end.py +169 -0
- chronaxis/core/state.py +494 -0
- chronaxis/core/state_numpy.py +296 -0
- chronaxis/core/temporal.py +373 -0
- chronaxis/core/temporal_clock.py +25 -0
- chronaxis/core/temporal_memory_numpy.py +163 -0
- chronaxis/core/temporal_memory_reference.py +161 -0
- chronaxis/core/temporal_numpy.py +345 -0
- chronaxis/core/temporal_reference.py +304 -0
- chronaxis/core/time_reduction.py +190 -0
- chronaxis/core/time_reduction_numpy.py +205 -0
- chronaxis/core/time_reduction_reference.py +203 -0
- chronaxis/core/types.py +105 -0
- chronaxis/core/units.py +81 -0
- chronaxis/core/validation.py +94 -0
- chronaxis/core/window_delta.py +123 -0
- chronaxis/core/window_delta_numpy.py +78 -0
- chronaxis/core/window_delta_reference.py +69 -0
- chronaxis/core/windows.py +224 -0
- chronaxis/core/windows_numpy.py +78 -0
- chronaxis/core/windows_reference.py +61 -0
- chronaxis/execution/__init__.py +6 -0
- chronaxis/execution/batch_signal_groups.py +122 -0
- chronaxis/execution/bindings.py +296 -0
- chronaxis/execution/boundaries.py +568 -0
- chronaxis/execution/calculation_blocks.py +338 -0
- chronaxis/execution/calculation_values.py +55 -0
- chronaxis/execution/can_batch_reader.py +356 -0
- chronaxis/execution/can_reader.py +948 -0
- chronaxis/execution/can_reference_template.py +61 -0
- chronaxis/execution/condition_evidence.py +370 -0
- chronaxis/execution/conditional_integral_facts.py +310 -0
- chronaxis/execution/conditional_integral_reduction.py +216 -0
- chronaxis/execution/csv_observation.py +524 -0
- chronaxis/execution/csv_reader.py +662 -0
- chronaxis/execution/current_message_calculation.py +225 -0
- chronaxis/execution/driver_expression.py +274 -0
- chronaxis/execution/expressions.py +618 -0
- chronaxis/execution/frame_capture.py +245 -0
- chronaxis/execution/groups.py +236 -0
- chronaxis/execution/historical_conditional_blocks.py +264 -0
- chronaxis/execution/historical_conditional_integral.py +226 -0
- chronaxis/execution/historical_conditional_time_calculation.py +368 -0
- chronaxis/execution/historical_integral.py +219 -0
- chronaxis/execution/historical_observation.py +372 -0
- chronaxis/execution/historical_sample_calculation.py +338 -0
- chronaxis/execution/historical_selection_rows.py +300 -0
- chronaxis/execution/historical_time_calculation.py +341 -0
- chronaxis/execution/history.py +572 -0
- chronaxis/execution/history_records.py +225 -0
- chronaxis/execution/hold.py +448 -0
- chronaxis/execution/integral_facts.py +311 -0
- chronaxis/execution/integral_reduction.py +216 -0
- chronaxis/execution/legacy_frame_samples.py +94 -0
- chronaxis/execution/memory_reader.py +247 -0
- chronaxis/execution/message_bindings.py +293 -0
- chronaxis/execution/message_delivery.py +37 -0
- chronaxis/execution/observed_ingestion.py +551 -0
- chronaxis/execution/raw_signal_groups.py +192 -0
- chronaxis/execution/record_alarm_duration.py +114 -0
- chronaxis/execution/record_delta_condition.py +167 -0
- chronaxis/execution/record_diagnostics.py +87 -0
- chronaxis/execution/record_event_durations.py +143 -0
- chronaxis/execution/record_export_samples.py +94 -0
- chronaxis/execution/record_exports.py +155 -0
- chronaxis/execution/record_integral.py +196 -0
- chronaxis/execution/record_point_buffer.py +101 -0
- chronaxis/execution/record_rule_timeline.py +344 -0
- chronaxis/execution/record_sample.py +46 -0
- chronaxis/execution/record_sample_series.py +29 -0
- chronaxis/execution/record_scope_calculations.py +290 -0
- chronaxis/execution/record_selection.py +62 -0
- chronaxis/execution/record_sequences.py +199 -0
- chronaxis/execution/record_session_calculations.py +778 -0
- chronaxis/execution/record_signal_export.py +133 -0
- chronaxis/execution/record_source_cursor.py +295 -0
- chronaxis/execution/record_time_calculation.py +322 -0
- chronaxis/execution/record_time_indexes.py +143 -0
- chronaxis/execution/record_value_history.py +160 -0
- chronaxis/execution/record_windows.py +229 -0
- chronaxis/execution/required_expression.py +52 -0
- chronaxis/execution/retained_metadata.py +71 -0
- chronaxis/execution/run_session.py +402 -0
- chronaxis/execution/scanned_signal_proof.py +550 -0
- chronaxis/execution/signal_validity.py +40 -0
- chronaxis/execution/state.py +280 -0
- chronaxis/execution/temporal_buffer.py +508 -0
- chronaxis/execution/text_can_reader.py +359 -0
- chronaxis/execution/timeline.py +309 -0
- chronaxis/execution/timeline_multi.py +415 -0
- chronaxis/execution/window_delta_events.py +220 -0
- chronaxis/execution/window_replay.py +350 -0
- chronaxis/execution/windows.py +173 -0
- chronaxis/guide/README.md +70 -0
- chronaxis/guide/api/AnalysisError.md +14 -0
- chronaxis/guide/api/AnalysisPlan.md +96 -0
- chronaxis/guide/api/AnalysisResult.md +398 -0
- chronaxis/guide/api/AnalysisRunner.md +155 -0
- chronaxis/guide/api/BatchJob.md +19 -0
- chronaxis/guide/api/BatchJobResult.md +61 -0
- chronaxis/guide/api/BatchPlan.md +48 -0
- chronaxis/guide/api/BatchReport.md +108 -0
- chronaxis/guide/api/BatchRunner.md +84 -0
- chronaxis/guide/api/OutputManifest.md +23 -0
- chronaxis/guide/api/PlanFragment.md +47 -0
- chronaxis/guide/api/PlanValidationError.md +98 -0
- chronaxis/guide/api/PresetSpec.md +63 -0
- chronaxis/guide/api/ResultClosedError.md +14 -0
- chronaxis/guide/api/RunMetadata.md +100 -0
- chronaxis/guide/api/TimeConversion.md +29 -0
- chronaxis/guide/api/TimeOverflowError.md +17 -0
- chronaxis/guide/api/build_preset.md +36 -0
- chronaxis/guide/api/checked_add_ns.md +30 -0
- chronaxis/guide/api/convert_time.md +40 -0
- chronaxis/guide/api/explain_analysis_plan.md +38 -0
- chronaxis/guide/api/index.json +185 -0
- chronaxis/guide/api/load_analysis_plan.md +34 -0
- chronaxis/guide/api/load_batch_plan.md +36 -0
- chronaxis/guide/api/parse_datetime_ns.md +35 -0
- chronaxis/guide/api/parse_duration.md +30 -0
- chronaxis/guide/api/resolve_preset_roles.md +37 -0
- chronaxis/guide/api/run_batch.md +38 -0
- chronaxis/guide/api/shift_times_reference.md +33 -0
- chronaxis/guide/api/time_deltas_reference.md +37 -0
- chronaxis/guide/api/validate_analysis_plan.md +38 -0
- chronaxis/guide/en/README.md +74 -0
- chronaxis/guide/en/api/AnalysisError.md +14 -0
- chronaxis/guide/en/api/AnalysisPlan.md +93 -0
- chronaxis/guide/en/api/AnalysisResult.md +398 -0
- chronaxis/guide/en/api/AnalysisRunner.md +191 -0
- chronaxis/guide/en/api/BatchJob.md +17 -0
- chronaxis/guide/en/api/BatchJobResult.md +43 -0
- chronaxis/guide/en/api/BatchPlan.md +37 -0
- chronaxis/guide/en/api/BatchReport.md +52 -0
- chronaxis/guide/en/api/BatchRunner.md +51 -0
- chronaxis/guide/en/api/OutputManifest.md +23 -0
- chronaxis/guide/en/api/PlanFragment.md +33 -0
- chronaxis/guide/en/api/PlanValidationError.md +58 -0
- chronaxis/guide/en/api/PresetSpec.md +51 -0
- chronaxis/guide/en/api/ResultClosedError.md +14 -0
- chronaxis/guide/en/api/RunMetadata.md +100 -0
- chronaxis/guide/en/api/TimeConversion.md +23 -0
- chronaxis/guide/en/api/TimeOverflowError.md +14 -0
- chronaxis/guide/en/api/build_preset.md +23 -0
- chronaxis/guide/en/api/checked_add_ns.md +21 -0
- chronaxis/guide/en/api/convert_time.md +25 -0
- chronaxis/guide/en/api/explain_analysis_plan.md +30 -0
- chronaxis/guide/en/api/index.json +185 -0
- chronaxis/guide/en/api/load_analysis_plan.md +27 -0
- chronaxis/guide/en/api/load_batch_plan.md +28 -0
- chronaxis/guide/en/api/parse_datetime_ns.md +23 -0
- chronaxis/guide/en/api/parse_duration.md +20 -0
- chronaxis/guide/en/api/resolve_preset_roles.md +23 -0
- chronaxis/guide/en/api/run_batch.md +39 -0
- chronaxis/guide/en/api/shift_times_reference.md +21 -0
- chronaxis/guide/en/api/time_deltas_reference.md +22 -0
- chronaxis/guide/en/api/validate_analysis_plan.md +29 -0
- chronaxis/guide/en/fields/analysis/calculations-all-1.json +345 -0
- chronaxis/guide/en/fields/analysis/calculations-all-2.json +300 -0
- chronaxis/guide/en/fields/analysis/calculations-all-3.json +84 -0
- chronaxis/guide/en/fields/analysis/config_version-all-1.json +24 -0
- chronaxis/guide/en/fields/analysis/dataset-all-1.json +344 -0
- chronaxis/guide/en/fields/analysis/derived-all-1.json +147 -0
- chronaxis/guide/en/fields/analysis/diagnostics-all-1.json +69 -0
- chronaxis/guide/en/fields/analysis/execution-all-1.json +167 -0
- chronaxis/guide/en/fields/analysis/imports-all-1.json +39 -0
- chronaxis/guide/en/fields/analysis/intervals-all-1.json +173 -0
- chronaxis/guide/en/fields/analysis/message_calculations-all-1.json +345 -0
- chronaxis/guide/en/fields/analysis/message_calculations-all-2.json +270 -0
- chronaxis/guide/en/fields/analysis/metadata-all-1.json +24 -0
- chronaxis/guide/en/fields/analysis/outputs-all-1.json +332 -0
- chronaxis/guide/en/fields/analysis/outputs-all-2.json +319 -0
- chronaxis/guide/en/fields/analysis/outputs-all-3.json +321 -0
- chronaxis/guide/en/fields/analysis/outputs-all-4.json +236 -0
- chronaxis/guide/en/fields/analysis/outputs-all-5.json +246 -0
- chronaxis/guide/en/fields/analysis/outputs-all-6.json +214 -0
- chronaxis/guide/en/fields/analysis/overrides-all-1.json +104 -0
- chronaxis/guide/en/fields/analysis/presets-charge_session-1.json +398 -0
- chronaxis/guide/en/fields/analysis/presets-charge_session-2.json +114 -0
- chronaxis/guide/en/fields/analysis/presets-command_response-1.json +376 -0
- chronaxis/guide/en/fields/analysis/presets-fault_context-1.json +285 -0
- chronaxis/guide/en/fields/analysis/presets-threshold_excursion-1.json +317 -0
- chronaxis/guide/en/fields/analysis/rules-condition_duration-1.json +344 -0
- chronaxis/guide/en/fields/analysis/rules-condition_duration-2.json +27 -0
- chronaxis/guide/en/fields/analysis/rules-debounce-1.json +335 -0
- chronaxis/guide/en/fields/analysis/rules-falling_edge-1.json +317 -0
- chronaxis/guide/en/fields/analysis/rules-hysteresis-1.json +334 -0
- chronaxis/guide/en/fields/analysis/rules-hysteresis-2.json +27 -0
- chronaxis/guide/en/fields/analysis/rules-rising_edge-1.json +317 -0
- chronaxis/guide/en/fields/analysis/rules-start_end-1.json +333 -0
- chronaxis/guide/en/fields/analysis/rules-start_end-2.json +60 -0
- chronaxis/guide/en/fields/analysis/rules-start_only-1.json +334 -0
- chronaxis/guide/en/fields/analysis/rules-window_delta-1.json +338 -0
- chronaxis/guide/en/fields/analysis/rules-window_delta-2.json +96 -0
- chronaxis/guide/en/fields/analysis/sequences-all-1.json +378 -0
- chronaxis/guide/en/fields/analysis/sequences-all-2.json +70 -0
- chronaxis/guide/en/fields/analysis/signals-variant-1-1.json +349 -0
- chronaxis/guide/en/fields/analysis/signals-variant-1-2.json +297 -0
- chronaxis/guide/en/fields/analysis/signals-variant-1-3.json +323 -0
- chronaxis/guide/en/fields/analysis/signals-variant-1-4.json +192 -0
- chronaxis/guide/en/fields/analysis/signals-variant-2-1.json +327 -0
- chronaxis/guide/en/fields/analysis/signals-variant-2-2.json +312 -0
- chronaxis/guide/en/fields/analysis/signals-variant-2-3.json +294 -0
- chronaxis/guide/en/fields/analysis/signals-variant-2-4.json +253 -0
- chronaxis/guide/en/fields/analysis/signals-variant-2-5.json +44 -0
- chronaxis/guide/en/fields/analysis/sources-can_asc-1.json +318 -0
- chronaxis/guide/en/fields/analysis/sources-can_asc-2.json +310 -0
- chronaxis/guide/en/fields/analysis/sources-can_asc-3.json +311 -0
- chronaxis/guide/en/fields/analysis/sources-can_asc-4.json +69 -0
- chronaxis/guide/en/fields/analysis/sources-can_blf-1.json +317 -0
- chronaxis/guide/en/fields/analysis/sources-can_blf-2.json +310 -0
- chronaxis/guide/en/fields/analysis/sources-can_blf-3.json +317 -0
- chronaxis/guide/en/fields/analysis/sources-memory-1.json +332 -0
- chronaxis/guide/en/fields/analysis/sources-memory-2.json +125 -0
- chronaxis/guide/en/fields/analysis/sources-raw_can_csv-1.json +330 -0
- chronaxis/guide/en/fields/analysis/sources-raw_can_csv-10.json +233 -0
- chronaxis/guide/en/fields/analysis/sources-raw_can_csv-11.json +225 -0
- chronaxis/guide/en/fields/analysis/sources-raw_can_csv-12.json +228 -0
- chronaxis/guide/en/fields/analysis/sources-raw_can_csv-13.json +226 -0
- chronaxis/guide/en/fields/analysis/sources-raw_can_csv-14.json +230 -0
- chronaxis/guide/en/fields/analysis/sources-raw_can_csv-15.json +227 -0
- chronaxis/guide/en/fields/analysis/sources-raw_can_csv-16.json +230 -0
- chronaxis/guide/en/fields/analysis/sources-raw_can_csv-17.json +238 -0
- chronaxis/guide/en/fields/analysis/sources-raw_can_csv-18.json +239 -0
- chronaxis/guide/en/fields/analysis/sources-raw_can_csv-19.json +233 -0
- chronaxis/guide/en/fields/analysis/sources-raw_can_csv-2.json +310 -0
- chronaxis/guide/en/fields/analysis/sources-raw_can_csv-20.json +242 -0
- chronaxis/guide/en/fields/analysis/sources-raw_can_csv-21.json +230 -0
- chronaxis/guide/en/fields/analysis/sources-raw_can_csv-22.json +228 -0
- chronaxis/guide/en/fields/analysis/sources-raw_can_csv-23.json +230 -0
- chronaxis/guide/en/fields/analysis/sources-raw_can_csv-24.json +223 -0
- chronaxis/guide/en/fields/analysis/sources-raw_can_csv-25.json +290 -0
- chronaxis/guide/en/fields/analysis/sources-raw_can_csv-26.json +131 -0
- chronaxis/guide/en/fields/analysis/sources-raw_can_csv-3.json +297 -0
- chronaxis/guide/en/fields/analysis/sources-raw_can_csv-4.json +226 -0
- chronaxis/guide/en/fields/analysis/sources-raw_can_csv-5.json +230 -0
- chronaxis/guide/en/fields/analysis/sources-raw_can_csv-6.json +227 -0
- chronaxis/guide/en/fields/analysis/sources-raw_can_csv-7.json +230 -0
- chronaxis/guide/en/fields/analysis/sources-raw_can_csv-8.json +238 -0
- chronaxis/guide/en/fields/analysis/sources-raw_can_csv-9.json +239 -0
- chronaxis/guide/en/fields/analysis/sources-signal_csv-1.json +331 -0
- chronaxis/guide/en/fields/analysis/sources-signal_csv-2.json +307 -0
- chronaxis/guide/en/fields/analysis/sources-signal_csv-3.json +315 -0
- chronaxis/guide/en/fields/analysis/sources-variant-6-1.json +319 -0
- chronaxis/guide/en/fields/analysis/sources-variant-6-2.json +307 -0
- chronaxis/guide/en/fields/analysis/sources-variant-6-3.json +312 -0
- chronaxis/guide/en/fields/analysis/sources-variant-6-4.json +113 -0
- chronaxis/guide/en/fields/analysis/windows-all-1.json +361 -0
- chronaxis/guide/en/fields/analysis/windows-all-2.json +187 -0
- chronaxis/guide/en/fields/batch/backend-all-1.json +26 -0
- chronaxis/guide/en/fields/batch/batch_version-all-1.json +22 -0
- chronaxis/guide/en/fields/batch/fail_fast-all-1.json +22 -0
- chronaxis/guide/en/fields/batch/inputs-all-1.json +161 -0
- chronaxis/guide/en/fields/batch/jobs-all-1.json +58 -0
- chronaxis/guide/en/fields/batch/process_count-all-1.json +23 -0
- chronaxis/guide/en/fields/batch/source-all-1.json +22 -0
- chronaxis/guide/en/fields/batch/template-all-1.json +22 -0
- chronaxis/guide/en/fields/definitions/derived-all-1.json +121 -0
- chronaxis/guide/en/fields/definitions/signals-all-1.json +336 -0
- chronaxis/guide/en/fields/definitions/signals-all-2.json +307 -0
- chronaxis/guide/en/fields/definitions/signals-all-3.json +290 -0
- chronaxis/guide/en/fields/definitions/signals-all-4.json +347 -0
- chronaxis/guide/en/fields/definitions/signals-all-5.json +297 -0
- chronaxis/guide/en/fields/definitions/signals-all-6.json +259 -0
- chronaxis/guide/en/fields/definitions/signals-all-7.json +117 -0
- chronaxis/guide/en/fields/definitions/sources-all-1.json +332 -0
- chronaxis/guide/en/fields/definitions/sources-all-10.json +306 -0
- chronaxis/guide/en/fields/definitions/sources-all-11.json +294 -0
- chronaxis/guide/en/fields/definitions/sources-all-12.json +212 -0
- chronaxis/guide/en/fields/definitions/sources-all-13.json +217 -0
- chronaxis/guide/en/fields/definitions/sources-all-14.json +213 -0
- chronaxis/guide/en/fields/definitions/sources-all-15.json +214 -0
- chronaxis/guide/en/fields/definitions/sources-all-16.json +215 -0
- chronaxis/guide/en/fields/definitions/sources-all-17.json +213 -0
- chronaxis/guide/en/fields/definitions/sources-all-18.json +214 -0
- chronaxis/guide/en/fields/definitions/sources-all-19.json +213 -0
- chronaxis/guide/en/fields/definitions/sources-all-2.json +323 -0
- chronaxis/guide/en/fields/definitions/sources-all-20.json +217 -0
- chronaxis/guide/en/fields/definitions/sources-all-21.json +210 -0
- chronaxis/guide/en/fields/definitions/sources-all-22.json +214 -0
- chronaxis/guide/en/fields/definitions/sources-all-23.json +218 -0
- chronaxis/guide/en/fields/definitions/sources-all-24.json +209 -0
- chronaxis/guide/en/fields/definitions/sources-all-25.json +215 -0
- chronaxis/guide/en/fields/definitions/sources-all-26.json +218 -0
- chronaxis/guide/en/fields/definitions/sources-all-27.json +224 -0
- chronaxis/guide/en/fields/definitions/sources-all-28.json +215 -0
- chronaxis/guide/en/fields/definitions/sources-all-29.json +205 -0
- chronaxis/guide/en/fields/definitions/sources-all-3.json +303 -0
- chronaxis/guide/en/fields/definitions/sources-all-30.json +298 -0
- chronaxis/guide/en/fields/definitions/sources-all-31.json +315 -0
- chronaxis/guide/en/fields/definitions/sources-all-32.json +306 -0
- chronaxis/guide/en/fields/definitions/sources-all-33.json +209 -0
- chronaxis/guide/en/fields/definitions/sources-all-4.json +336 -0
- chronaxis/guide/en/fields/definitions/sources-all-5.json +299 -0
- chronaxis/guide/en/fields/definitions/sources-all-6.json +307 -0
- chronaxis/guide/en/fields/definitions/sources-all-7.json +320 -0
- chronaxis/guide/en/fields/definitions/sources-all-8.json +303 -0
- chronaxis/guide/en/fields/definitions/sources-all-9.json +315 -0
- chronaxis/guide/en/fields/index.json +3450 -0
- chronaxis/guide/en/fields/mapping/aliases-all-1.json +91 -0
- chronaxis/guide/en/fields/mapping/analysis-all-1.json +382 -0
- chronaxis/guide/en/fields/mapping/analysis-all-10.json +301 -0
- chronaxis/guide/en/fields/mapping/analysis-all-11.json +312 -0
- chronaxis/guide/en/fields/mapping/analysis-all-12.json +311 -0
- chronaxis/guide/en/fields/mapping/analysis-all-13.json +314 -0
- chronaxis/guide/en/fields/mapping/analysis-all-14.json +310 -0
- chronaxis/guide/en/fields/mapping/analysis-all-15.json +297 -0
- chronaxis/guide/en/fields/mapping/analysis-all-16.json +226 -0
- chronaxis/guide/en/fields/mapping/analysis-all-17.json +230 -0
- chronaxis/guide/en/fields/mapping/analysis-all-18.json +227 -0
- chronaxis/guide/en/fields/mapping/analysis-all-19.json +230 -0
- chronaxis/guide/en/fields/mapping/analysis-all-2.json +323 -0
- chronaxis/guide/en/fields/mapping/analysis-all-20.json +221 -0
- chronaxis/guide/en/fields/mapping/analysis-all-21.json +237 -0
- chronaxis/guide/en/fields/mapping/analysis-all-22.json +233 -0
- chronaxis/guide/en/fields/mapping/analysis-all-23.json +222 -0
- chronaxis/guide/en/fields/mapping/analysis-all-24.json +231 -0
- chronaxis/guide/en/fields/mapping/analysis-all-25.json +225 -0
- chronaxis/guide/en/fields/mapping/analysis-all-26.json +230 -0
- chronaxis/guide/en/fields/mapping/analysis-all-27.json +228 -0
- chronaxis/guide/en/fields/mapping/analysis-all-28.json +230 -0
- chronaxis/guide/en/fields/mapping/analysis-all-29.json +223 -0
- chronaxis/guide/en/fields/mapping/analysis-all-3.json +318 -0
- chronaxis/guide/en/fields/mapping/analysis-all-30.json +233 -0
- chronaxis/guide/en/fields/mapping/analysis-all-31.json +218 -0
- chronaxis/guide/en/fields/mapping/analysis-all-32.json +239 -0
- chronaxis/guide/en/fields/mapping/analysis-all-33.json +233 -0
- chronaxis/guide/en/fields/mapping/analysis-all-34.json +225 -0
- chronaxis/guide/en/fields/mapping/analysis-all-35.json +228 -0
- chronaxis/guide/en/fields/mapping/analysis-all-36.json +226 -0
- chronaxis/guide/en/fields/mapping/analysis-all-37.json +244 -0
- chronaxis/guide/en/fields/mapping/analysis-all-38.json +326 -0
- chronaxis/guide/en/fields/mapping/analysis-all-39.json +299 -0
- chronaxis/guide/en/fields/mapping/analysis-all-4.json +297 -0
- chronaxis/guide/en/fields/mapping/analysis-all-40.json +311 -0
- chronaxis/guide/en/fields/mapping/analysis-all-41.json +310 -0
- chronaxis/guide/en/fields/mapping/analysis-all-42.json +346 -0
- chronaxis/guide/en/fields/mapping/analysis-all-43.json +267 -0
- chronaxis/guide/en/fields/mapping/analysis-all-44.json +327 -0
- chronaxis/guide/en/fields/mapping/analysis-all-45.json +279 -0
- chronaxis/guide/en/fields/mapping/analysis-all-46.json +327 -0
- chronaxis/guide/en/fields/mapping/analysis-all-47.json +312 -0
- chronaxis/guide/en/fields/mapping/analysis-all-48.json +294 -0
- chronaxis/guide/en/fields/mapping/analysis-all-49.json +253 -0
- chronaxis/guide/en/fields/mapping/analysis-all-5.json +312 -0
- chronaxis/guide/en/fields/mapping/analysis-all-50.json +346 -0
- chronaxis/guide/en/fields/mapping/analysis-all-51.json +324 -0
- chronaxis/guide/en/fields/mapping/analysis-all-52.json +335 -0
- chronaxis/guide/en/fields/mapping/analysis-all-53.json +317 -0
- chronaxis/guide/en/fields/mapping/analysis-all-54.json +316 -0
- chronaxis/guide/en/fields/mapping/analysis-all-55.json +302 -0
- chronaxis/guide/en/fields/mapping/analysis-all-56.json +319 -0
- chronaxis/guide/en/fields/mapping/analysis-all-57.json +334 -0
- chronaxis/guide/en/fields/mapping/analysis-all-58.json +333 -0
- chronaxis/guide/en/fields/mapping/analysis-all-59.json +359 -0
- chronaxis/guide/en/fields/mapping/analysis-all-6.json +327 -0
- chronaxis/guide/en/fields/mapping/analysis-all-60.json +303 -0
- chronaxis/guide/en/fields/mapping/analysis-all-61.json +326 -0
- chronaxis/guide/en/fields/mapping/analysis-all-62.json +301 -0
- chronaxis/guide/en/fields/mapping/analysis-all-63.json +326 -0
- chronaxis/guide/en/fields/mapping/analysis-all-64.json +367 -0
- chronaxis/guide/en/fields/mapping/analysis-all-65.json +334 -0
- chronaxis/guide/en/fields/mapping/analysis-all-66.json +358 -0
- chronaxis/guide/en/fields/mapping/analysis-all-67.json +349 -0
- chronaxis/guide/en/fields/mapping/analysis-all-68.json +331 -0
- chronaxis/guide/en/fields/mapping/analysis-all-69.json +304 -0
- chronaxis/guide/en/fields/mapping/analysis-all-7.json +303 -0
- chronaxis/guide/en/fields/mapping/analysis-all-70.json +349 -0
- chronaxis/guide/en/fields/mapping/analysis-all-71.json +288 -0
- chronaxis/guide/en/fields/mapping/analysis-all-72.json +316 -0
- chronaxis/guide/en/fields/mapping/analysis-all-73.json +266 -0
- chronaxis/guide/en/fields/mapping/analysis-all-74.json +227 -0
- chronaxis/guide/en/fields/mapping/analysis-all-75.json +239 -0
- chronaxis/guide/en/fields/mapping/analysis-all-76.json +274 -0
- chronaxis/guide/en/fields/mapping/analysis-all-77.json +380 -0
- chronaxis/guide/en/fields/mapping/analysis-all-78.json +313 -0
- chronaxis/guide/en/fields/mapping/analysis-all-79.json +338 -0
- chronaxis/guide/en/fields/mapping/analysis-all-8.json +292 -0
- chronaxis/guide/en/fields/mapping/analysis-all-80.json +304 -0
- chronaxis/guide/en/fields/mapping/analysis-all-81.json +140 -0
- chronaxis/guide/en/fields/mapping/analysis-all-9.json +332 -0
- chronaxis/guide/en/fields/mapping/io_policy-all-1.json +19 -0
- chronaxis/guide/en/fields/mapping/mapping_version-all-1.json +19 -0
- chronaxis/guide/en/fields/mapping/path_base-all-1.json +19 -0
- chronaxis/guide/en/fields/mapping/sections-all-1.json +402 -0
- chronaxis/guide/en/fields/mapping/sections-all-2.json +232 -0
- chronaxis/guide/en/semantics.md +70 -0
- chronaxis/guide/en/tasks.json +290 -0
- chronaxis/guide/en/workflow.md +41 -0
- chronaxis/guide/examples/analysis-imports.yaml +22 -0
- chronaxis/guide/examples/analysis.yaml +23 -0
- chronaxis/guide/examples/batch-minimal.yaml +3 -0
- chronaxis/guide/examples/conditional-energy.yaml +36 -0
- chronaxis/guide/examples/data/activity.csv +6 -0
- chronaxis/guide/examples/data/can/activity.asc +11 -0
- chronaxis/guide/examples/data/can/calculation-minimal.asc +6 -0
- chronaxis/guide/examples/data/can/conditional-energy/part-1.asc +92 -0
- chronaxis/guide/examples/data/can/conditional-energy/part-2.asc +36 -0
- chronaxis/guide/examples/data/can/conditional-energy/signals.dbc +10 -0
- chronaxis/guide/examples/data/can/execution-comparison.asc +12 -0
- chronaxis/guide/examples/data/can/execution-report.asc +4 -0
- chronaxis/guide/examples/data/can/expression-extended.asc +11 -0
- chronaxis/guide/examples/data/can/interval-actual.asc +6 -0
- chronaxis/guide/examples/data/can/preset-charge-energy.asc +15 -0
- chronaxis/guide/examples/data/can/preset-charge-minimal.asc +11 -0
- chronaxis/guide/examples/data/can/preset-command-automatic.asc +11 -0
- chronaxis/guide/examples/data/can/preset-fault-context.asc +7 -0
- chronaxis/guide/examples/data/can/preset-threshold-delay.asc +7 -0
- chronaxis/guide/examples/data/can/preset-threshold-partial.asc +7 -0
- chronaxis/guide/examples/data/can/quality.asc +6 -0
- chronaxis/guide/examples/data/can/quickstart-parts/part1.asc +4 -0
- chronaxis/guide/examples/data/can/quickstart-parts/part2.asc +3 -0
- chronaxis/guide/examples/data/can/quickstart.asc +6 -0
- chronaxis/guide/examples/data/can/rule-condition_duration-extended.asc +35 -0
- chronaxis/guide/examples/data/can/rule-condition_duration-minimal.asc +19 -0
- chronaxis/guide/examples/data/can/rule-debounce-extended.asc +19 -0
- chronaxis/guide/examples/data/can/rule-falling_edge-extended.asc +35 -0
- chronaxis/guide/examples/data/can/rule-hysteresis-extended.asc +19 -0
- chronaxis/guide/examples/data/can/rule-start_end-extended.asc +35 -0
- chronaxis/guide/examples/data/can/rule-start_only-extended.asc +19 -0
- chronaxis/guide/examples/data/can/rule-window_delta-extended.asc +19 -0
- chronaxis/guide/examples/data/can/sequence-outcomes.asc +19 -0
- chronaxis/guide/examples/data/can/signal-types.asc +13 -0
- chronaxis/guide/examples/data/can/start-end.asc +30 -0
- chronaxis/guide/examples/data/can/teaching-base.asc +58 -0
- chronaxis/guide/examples/data/can/teaching.dbc +53 -0
- chronaxis/guide/examples/data/joint-current.csv +5 -0
- chronaxis/guide/examples/data/joint.asc +5 -0
- chronaxis/guide/examples/data/joint.dbc +7 -0
- chronaxis/guide/examples/data/message-clean.asc +6 -0
- chronaxis/guide/examples/data/message-direction.asc +7 -0
- chronaxis/guide/examples/data/message-direction.dbc +7 -0
- chronaxis/guide/examples/data/power.blf +0 -0
- chronaxis/guide/examples/data/power.dbc +6 -0
- chronaxis/guide/examples/data/quality.csv +5 -0
- chronaxis/guide/examples/data/raw-can-example.csv +5 -0
- chronaxis/guide/examples/data/signal-types.csv +5 -0
- chronaxis/guide/examples/data/signals.csv +6 -0
- chronaxis/guide/examples/data/timing.asc +6 -0
- chronaxis/guide/examples/data/timing.dbc +11 -0
- chronaxis/guide/examples/export-can-minimal.yaml +24 -0
- chronaxis/guide/examples/input-csv-minimal.yaml +23 -0
- chronaxis/guide/examples/preset-charge-energy.yaml +41 -0
- chronaxis/guide/examples/preset-charge-minimal.yaml +31 -0
- chronaxis/guide/examples/preset-fault-context.yaml +27 -0
- chronaxis/guide/examples/quality.yaml +19 -0
- chronaxis/guide/examples/sequence-outcomes.yaml +39 -0
- chronaxis/guide/examples/shared/definitions.yaml +14 -0
- chronaxis/guide/examples/signal-enum-minimal.yaml +19 -0
- chronaxis/guide/examples/signal-number-conversion.yaml +24 -0
- chronaxis/guide/examples/window-merged.yaml +28 -0
- chronaxis/guide/fields/analysis/calculations-all-1.json +360 -0
- chronaxis/guide/fields/analysis/calculations-all-2.json +299 -0
- chronaxis/guide/fields/analysis/calculations-all-3.json +70 -0
- chronaxis/guide/fields/analysis/config_version-all-1.json +24 -0
- chronaxis/guide/fields/analysis/dataset-all-1.json +344 -0
- chronaxis/guide/fields/analysis/derived-all-1.json +147 -0
- chronaxis/guide/fields/analysis/diagnostics-all-1.json +69 -0
- chronaxis/guide/fields/analysis/execution-all-1.json +167 -0
- chronaxis/guide/fields/analysis/imports-all-1.json +39 -0
- chronaxis/guide/fields/analysis/intervals-all-1.json +173 -0
- chronaxis/guide/fields/analysis/message_calculations-all-1.json +360 -0
- chronaxis/guide/fields/analysis/message_calculations-all-2.json +255 -0
- chronaxis/guide/fields/analysis/metadata-all-1.json +24 -0
- chronaxis/guide/fields/analysis/outputs-all-1.json +349 -0
- chronaxis/guide/fields/analysis/outputs-all-2.json +302 -0
- chronaxis/guide/fields/analysis/outputs-all-3.json +321 -0
- chronaxis/guide/fields/analysis/outputs-all-4.json +253 -0
- chronaxis/guide/fields/analysis/outputs-all-5.json +244 -0
- chronaxis/guide/fields/analysis/outputs-all-6.json +199 -0
- chronaxis/guide/fields/analysis/overrides-all-1.json +104 -0
- chronaxis/guide/fields/analysis/presets-charge_session-1.json +398 -0
- chronaxis/guide/fields/analysis/presets-charge_session-2.json +114 -0
- chronaxis/guide/fields/analysis/presets-command_response-1.json +376 -0
- chronaxis/guide/fields/analysis/presets-fault_context-1.json +285 -0
- chronaxis/guide/fields/analysis/presets-threshold_excursion-1.json +317 -0
- chronaxis/guide/fields/analysis/rules-condition_duration-1.json +344 -0
- chronaxis/guide/fields/analysis/rules-condition_duration-2.json +27 -0
- chronaxis/guide/fields/analysis/rules-debounce-1.json +335 -0
- chronaxis/guide/fields/analysis/rules-falling_edge-1.json +317 -0
- chronaxis/guide/fields/analysis/rules-hysteresis-1.json +334 -0
- chronaxis/guide/fields/analysis/rules-hysteresis-2.json +27 -0
- chronaxis/guide/fields/analysis/rules-rising_edge-1.json +317 -0
- chronaxis/guide/fields/analysis/rules-start_end-1.json +349 -0
- chronaxis/guide/fields/analysis/rules-start_end-2.json +44 -0
- chronaxis/guide/fields/analysis/rules-start_only-1.json +334 -0
- chronaxis/guide/fields/analysis/rules-window_delta-1.json +356 -0
- chronaxis/guide/fields/analysis/rules-window_delta-2.json +78 -0
- chronaxis/guide/fields/analysis/sequences-all-1.json +394 -0
- chronaxis/guide/fields/analysis/sequences-all-2.json +54 -0
- chronaxis/guide/fields/analysis/signals-variant-1-1.json +349 -0
- chronaxis/guide/fields/analysis/signals-variant-1-2.json +297 -0
- chronaxis/guide/fields/analysis/signals-variant-1-3.json +340 -0
- chronaxis/guide/fields/analysis/signals-variant-1-4.json +175 -0
- chronaxis/guide/fields/analysis/signals-variant-2-1.json +327 -0
- chronaxis/guide/fields/analysis/signals-variant-2-2.json +335 -0
- chronaxis/guide/fields/analysis/signals-variant-2-3.json +289 -0
- chronaxis/guide/fields/analysis/signals-variant-2-4.json +270 -0
- chronaxis/guide/fields/analysis/sources-can_asc-1.json +318 -0
- chronaxis/guide/fields/analysis/sources-can_asc-2.json +310 -0
- chronaxis/guide/fields/analysis/sources-can_asc-3.json +311 -0
- chronaxis/guide/fields/analysis/sources-can_asc-4.json +69 -0
- chronaxis/guide/fields/analysis/sources-can_blf-1.json +317 -0
- chronaxis/guide/fields/analysis/sources-can_blf-2.json +310 -0
- chronaxis/guide/fields/analysis/sources-can_blf-3.json +317 -0
- chronaxis/guide/fields/analysis/sources-memory-1.json +347 -0
- chronaxis/guide/fields/analysis/sources-memory-2.json +110 -0
- chronaxis/guide/fields/analysis/sources-raw_can_csv-1.json +330 -0
- chronaxis/guide/fields/analysis/sources-raw_can_csv-10.json +233 -0
- chronaxis/guide/fields/analysis/sources-raw_can_csv-11.json +225 -0
- chronaxis/guide/fields/analysis/sources-raw_can_csv-12.json +228 -0
- chronaxis/guide/fields/analysis/sources-raw_can_csv-13.json +226 -0
- chronaxis/guide/fields/analysis/sources-raw_can_csv-14.json +230 -0
- chronaxis/guide/fields/analysis/sources-raw_can_csv-15.json +227 -0
- chronaxis/guide/fields/analysis/sources-raw_can_csv-16.json +230 -0
- chronaxis/guide/fields/analysis/sources-raw_can_csv-17.json +238 -0
- chronaxis/guide/fields/analysis/sources-raw_can_csv-18.json +239 -0
- chronaxis/guide/fields/analysis/sources-raw_can_csv-19.json +233 -0
- chronaxis/guide/fields/analysis/sources-raw_can_csv-2.json +310 -0
- chronaxis/guide/fields/analysis/sources-raw_can_csv-20.json +242 -0
- chronaxis/guide/fields/analysis/sources-raw_can_csv-21.json +230 -0
- chronaxis/guide/fields/analysis/sources-raw_can_csv-22.json +228 -0
- chronaxis/guide/fields/analysis/sources-raw_can_csv-23.json +230 -0
- chronaxis/guide/fields/analysis/sources-raw_can_csv-24.json +223 -0
- chronaxis/guide/fields/analysis/sources-raw_can_csv-25.json +290 -0
- chronaxis/guide/fields/analysis/sources-raw_can_csv-26.json +131 -0
- chronaxis/guide/fields/analysis/sources-raw_can_csv-3.json +297 -0
- chronaxis/guide/fields/analysis/sources-raw_can_csv-4.json +226 -0
- chronaxis/guide/fields/analysis/sources-raw_can_csv-5.json +230 -0
- chronaxis/guide/fields/analysis/sources-raw_can_csv-6.json +227 -0
- chronaxis/guide/fields/analysis/sources-raw_can_csv-7.json +230 -0
- chronaxis/guide/fields/analysis/sources-raw_can_csv-8.json +238 -0
- chronaxis/guide/fields/analysis/sources-raw_can_csv-9.json +239 -0
- chronaxis/guide/fields/analysis/sources-signal_csv-1.json +331 -0
- chronaxis/guide/fields/analysis/sources-signal_csv-2.json +327 -0
- chronaxis/guide/fields/analysis/sources-signal_csv-3.json +295 -0
- chronaxis/guide/fields/analysis/sources-variant-6-1.json +319 -0
- chronaxis/guide/fields/analysis/sources-variant-6-2.json +327 -0
- chronaxis/guide/fields/analysis/sources-variant-6-3.json +314 -0
- chronaxis/guide/fields/analysis/sources-variant-6-4.json +91 -0
- chronaxis/guide/fields/analysis/windows-all-1.json +361 -0
- chronaxis/guide/fields/analysis/windows-all-2.json +187 -0
- chronaxis/guide/fields/batch/backend-all-1.json +26 -0
- chronaxis/guide/fields/batch/batch_version-all-1.json +22 -0
- chronaxis/guide/fields/batch/fail_fast-all-1.json +22 -0
- chronaxis/guide/fields/batch/inputs-all-1.json +161 -0
- chronaxis/guide/fields/batch/jobs-all-1.json +58 -0
- chronaxis/guide/fields/batch/process_count-all-1.json +23 -0
- chronaxis/guide/fields/batch/source-all-1.json +22 -0
- chronaxis/guide/fields/batch/template-all-1.json +22 -0
- chronaxis/guide/fields/definitions/derived-all-1.json +121 -0
- chronaxis/guide/fields/definitions/signals-all-1.json +336 -0
- chronaxis/guide/fields/definitions/signals-all-2.json +307 -0
- chronaxis/guide/fields/definitions/signals-all-3.json +305 -0
- chronaxis/guide/fields/definitions/signals-all-4.json +352 -0
- chronaxis/guide/fields/definitions/signals-all-5.json +311 -0
- chronaxis/guide/fields/definitions/signals-all-6.json +254 -0
- chronaxis/guide/fields/definitions/signals-all-7.json +88 -0
- chronaxis/guide/fields/definitions/sources-all-1.json +332 -0
- chronaxis/guide/fields/definitions/sources-all-10.json +307 -0
- chronaxis/guide/fields/definitions/sources-all-11.json +280 -0
- chronaxis/guide/fields/definitions/sources-all-12.json +209 -0
- chronaxis/guide/fields/definitions/sources-all-13.json +219 -0
- chronaxis/guide/fields/definitions/sources-all-14.json +213 -0
- chronaxis/guide/fields/definitions/sources-all-15.json +212 -0
- chronaxis/guide/fields/definitions/sources-all-16.json +232 -0
- chronaxis/guide/fields/definitions/sources-all-17.json +213 -0
- chronaxis/guide/fields/definitions/sources-all-18.json +212 -0
- chronaxis/guide/fields/definitions/sources-all-19.json +217 -0
- chronaxis/guide/fields/definitions/sources-all-2.json +336 -0
- chronaxis/guide/fields/definitions/sources-all-20.json +228 -0
- chronaxis/guide/fields/definitions/sources-all-21.json +212 -0
- chronaxis/guide/fields/definitions/sources-all-22.json +232 -0
- chronaxis/guide/fields/definitions/sources-all-23.json +213 -0
- chronaxis/guide/fields/definitions/sources-all-24.json +212 -0
- chronaxis/guide/fields/definitions/sources-all-25.json +217 -0
- chronaxis/guide/fields/definitions/sources-all-26.json +228 -0
- chronaxis/guide/fields/definitions/sources-all-27.json +212 -0
- chronaxis/guide/fields/definitions/sources-all-28.json +217 -0
- chronaxis/guide/fields/definitions/sources-all-29.json +227 -0
- chronaxis/guide/fields/definitions/sources-all-3.json +306 -0
- chronaxis/guide/fields/definitions/sources-all-30.json +333 -0
- chronaxis/guide/fields/definitions/sources-all-31.json +302 -0
- chronaxis/guide/fields/definitions/sources-all-32.json +319 -0
- chronaxis/guide/fields/definitions/sources-all-33.json +89 -0
- chronaxis/guide/fields/definitions/sources-all-4.json +336 -0
- chronaxis/guide/fields/definitions/sources-all-5.json +313 -0
- chronaxis/guide/fields/definitions/sources-all-6.json +292 -0
- chronaxis/guide/fields/definitions/sources-all-7.json +319 -0
- chronaxis/guide/fields/definitions/sources-all-8.json +315 -0
- chronaxis/guide/fields/definitions/sources-all-9.json +318 -0
- chronaxis/guide/fields/index.json +3432 -0
- chronaxis/guide/fields/mapping/aliases-all-1.json +91 -0
- chronaxis/guide/fields/mapping/analysis-all-1.json +382 -0
- chronaxis/guide/fields/mapping/analysis-all-10.json +307 -0
- chronaxis/guide/fields/mapping/analysis-all-11.json +311 -0
- chronaxis/guide/fields/mapping/analysis-all-12.json +329 -0
- chronaxis/guide/fields/mapping/analysis-all-13.json +294 -0
- chronaxis/guide/fields/mapping/analysis-all-14.json +311 -0
- chronaxis/guide/fields/mapping/analysis-all-15.json +280 -0
- chronaxis/guide/fields/mapping/analysis-all-16.json +227 -0
- chronaxis/guide/fields/mapping/analysis-all-17.json +230 -0
- chronaxis/guide/fields/mapping/analysis-all-18.json +221 -0
- chronaxis/guide/fields/mapping/analysis-all-19.json +237 -0
- chronaxis/guide/fields/mapping/analysis-all-2.json +342 -0
- chronaxis/guide/fields/mapping/analysis-all-20.json +233 -0
- chronaxis/guide/fields/mapping/analysis-all-21.json +244 -0
- chronaxis/guide/fields/mapping/analysis-all-22.json +228 -0
- chronaxis/guide/fields/mapping/analysis-all-23.json +226 -0
- chronaxis/guide/fields/mapping/analysis-all-24.json +230 -0
- chronaxis/guide/fields/mapping/analysis-all-25.json +227 -0
- chronaxis/guide/fields/mapping/analysis-all-26.json +230 -0
- chronaxis/guide/fields/mapping/analysis-all-27.json +221 -0
- chronaxis/guide/fields/mapping/analysis-all-28.json +237 -0
- chronaxis/guide/fields/mapping/analysis-all-29.json +233 -0
- chronaxis/guide/fields/mapping/analysis-all-3.json +322 -0
- chronaxis/guide/fields/mapping/analysis-all-30.json +244 -0
- chronaxis/guide/fields/mapping/analysis-all-31.json +228 -0
- chronaxis/guide/fields/mapping/analysis-all-32.json +226 -0
- chronaxis/guide/fields/mapping/analysis-all-33.json +230 -0
- chronaxis/guide/fields/mapping/analysis-all-34.json +227 -0
- chronaxis/guide/fields/mapping/analysis-all-35.json +230 -0
- chronaxis/guide/fields/mapping/analysis-all-36.json +221 -0
- chronaxis/guide/fields/mapping/analysis-all-37.json +291 -0
- chronaxis/guide/fields/mapping/analysis-all-38.json +315 -0
- chronaxis/guide/fields/mapping/analysis-all-39.json +304 -0
- chronaxis/guide/fields/mapping/analysis-all-4.json +312 -0
- chronaxis/guide/fields/mapping/analysis-all-40.json +307 -0
- chronaxis/guide/fields/mapping/analysis-all-41.json +292 -0
- chronaxis/guide/fields/mapping/analysis-all-42.json +333 -0
- chronaxis/guide/fields/mapping/analysis-all-43.json +296 -0
- chronaxis/guide/fields/mapping/analysis-all-44.json +322 -0
- chronaxis/guide/fields/mapping/analysis-all-45.json +298 -0
- chronaxis/guide/fields/mapping/analysis-all-46.json +347 -0
- chronaxis/guide/fields/mapping/analysis-all-47.json +302 -0
- chronaxis/guide/fields/mapping/analysis-all-48.json +263 -0
- chronaxis/guide/fields/mapping/analysis-all-49.json +301 -0
- chronaxis/guide/fields/mapping/analysis-all-5.json +313 -0
- chronaxis/guide/fields/mapping/analysis-all-50.json +336 -0
- chronaxis/guide/fields/mapping/analysis-all-51.json +335 -0
- chronaxis/guide/fields/mapping/analysis-all-52.json +335 -0
- chronaxis/guide/fields/mapping/analysis-all-53.json +334 -0
- chronaxis/guide/fields/mapping/analysis-all-54.json +339 -0
- chronaxis/guide/fields/mapping/analysis-all-55.json +335 -0
- chronaxis/guide/fields/mapping/analysis-all-56.json +336 -0
- chronaxis/guide/fields/mapping/analysis-all-57.json +335 -0
- chronaxis/guide/fields/mapping/analysis-all-58.json +333 -0
- chronaxis/guide/fields/mapping/analysis-all-59.json +325 -0
- chronaxis/guide/fields/mapping/analysis-all-6.json +323 -0
- chronaxis/guide/fields/mapping/analysis-all-60.json +334 -0
- chronaxis/guide/fields/mapping/analysis-all-61.json +311 -0
- chronaxis/guide/fields/mapping/analysis-all-62.json +289 -0
- chronaxis/guide/fields/mapping/analysis-all-63.json +383 -0
- chronaxis/guide/fields/mapping/analysis-all-64.json +357 -0
- chronaxis/guide/fields/mapping/analysis-all-65.json +375 -0
- chronaxis/guide/fields/mapping/analysis-all-66.json +351 -0
- chronaxis/guide/fields/mapping/analysis-all-67.json +346 -0
- chronaxis/guide/fields/mapping/analysis-all-68.json +317 -0
- chronaxis/guide/fields/mapping/analysis-all-69.json +313 -0
- chronaxis/guide/fields/mapping/analysis-all-7.json +306 -0
- chronaxis/guide/fields/mapping/analysis-all-70.json +326 -0
- chronaxis/guide/fields/mapping/analysis-all-71.json +316 -0
- chronaxis/guide/fields/mapping/analysis-all-72.json +264 -0
- chronaxis/guide/fields/mapping/analysis-all-73.json +228 -0
- chronaxis/guide/fields/mapping/analysis-all-74.json +241 -0
- chronaxis/guide/fields/mapping/analysis-all-75.json +273 -0
- chronaxis/guide/fields/mapping/analysis-all-76.json +382 -0
- chronaxis/guide/fields/mapping/analysis-all-77.json +328 -0
- chronaxis/guide/fields/mapping/analysis-all-78.json +338 -0
- chronaxis/guide/fields/mapping/analysis-all-79.json +304 -0
- chronaxis/guide/fields/mapping/analysis-all-8.json +309 -0
- chronaxis/guide/fields/mapping/analysis-all-80.json +140 -0
- chronaxis/guide/fields/mapping/analysis-all-9.json +329 -0
- chronaxis/guide/fields/mapping/io_policy-all-1.json +19 -0
- chronaxis/guide/fields/mapping/mapping_version-all-1.json +19 -0
- chronaxis/guide/fields/mapping/path_base-all-1.json +19 -0
- chronaxis/guide/fields/mapping/sections-all-1.json +402 -0
- chronaxis/guide/fields/mapping/sections-all-2.json +232 -0
- chronaxis/guide/lookup.py +90 -0
- chronaxis/guide/manifest.json +614 -0
- chronaxis/guide/run_analysis.py +34 -0
- chronaxis/guide/schemas/analysis.schema.json +8451 -0
- chronaxis/guide/schemas/batch-v1.schema.json +172 -0
- chronaxis/guide/schemas/definitions.schema.json +29 -0
- chronaxis/guide/schemas/legacy-import-v1.schema.json +143 -0
- chronaxis/guide/semantics.md +62 -0
- chronaxis/guide/tasks.json +290 -0
- chronaxis/guide/workflow.md +38 -0
- chronaxis/legacy/__init__.py +46 -0
- chronaxis/legacy/batch_read.py +412 -0
- chronaxis/legacy/batch_validation.py +134 -0
- chronaxis/legacy/batch_wire.py +264 -0
- chronaxis/legacy/batch_worker.py +417 -0
- chronaxis/legacy/binding.py +154 -0
- chronaxis/legacy/dbc_cycles.py +47 -0
- chronaxis/legacy/decode_policy.py +28 -0
- chronaxis/legacy/disjunction.py +79 -0
- chronaxis/legacy/export_worker.py +147 -0
- chronaxis/legacy/export_write.py +378 -0
- chronaxis/legacy/message_store.py +562 -0
- chronaxis/legacy/process_read.py +526 -0
- chronaxis/legacy/raw_store.py +341 -0
- chronaxis/legacy/records.py +709 -0
- chronaxis/legacy/required_records.py +122 -0
- chronaxis/legacy/sum.py +403 -0
- chronaxis/legacy/sum_numpy.py +43 -0
- chronaxis/legacy/updates.py +277 -0
- chronaxis/legacy/vendor/sclicer_functions_v1/can_processor.py +138 -0
- chronaxis/legacy/vendor/sclicer_functions_v1/file_processor.py +218 -0
- chronaxis/legacy/vendor/sclicer_functions_v1/utils.py +447 -0
- chronaxis/legacy/worker.py +352 -0
- chronaxis/migration/__init__.py +11 -0
- chronaxis/migration/api.py +270 -0
- chronaxis/migration/ini.py +110 -0
- chronaxis/migration/legacy_sum.py +304 -0
- chronaxis/migration/models.py +83 -0
- chronaxis/migration/publication.py +230 -0
- chronaxis/migration/sclicer.py +241 -0
- chronaxis/migration/slope.py +78 -0
- chronaxis/migration/start_end.py +48 -0
- chronaxis/planning/__init__.py +19 -0
- chronaxis/planning/channels.py +30 -0
- chronaxis/planning/checks.py +447 -0
- chronaxis/planning/config_groups.py +215 -0
- chronaxis/planning/dbc_defaults.py +88 -0
- chronaxis/planning/export_options.py +247 -0
- chronaxis/planning/input_defaults.py +62 -0
- chronaxis/planning/input_paths.py +124 -0
- chronaxis/planning/input_requirements.py +250 -0
- chronaxis/planning/inputs.py +306 -0
- chronaxis/planning/intervals.py +242 -0
- chronaxis/planning/legacy_execution.py +38 -0
- chronaxis/planning/message_calculations.py +171 -0
- chronaxis/planning/models.py +369 -0
- chronaxis/planning/nodes.py +355 -0
- chronaxis/planning/plan.py +294 -0
- chronaxis/planning/preset_models.py +211 -0
- chronaxis/planning/record_execution.py +76 -0
- chronaxis/planning/reports.py +523 -0
- chronaxis/planning/sequences.py +91 -0
- chronaxis/planning/signal_groups.py +61 -0
- chronaxis/planning/signal_validity.py +46 -0
- chronaxis/planning/text_inputs.py +110 -0
- chronaxis/presets.py +270 -0
- chronaxis/results/__init__.py +34 -0
- chronaxis/results/analysis_outcome.py +67 -0
- chronaxis/results/artifact_exports.py +212 -0
- chronaxis/results/binding_metadata.py +54 -0
- chronaxis/results/budget.py +138 -0
- chronaxis/results/can_metadata.py +247 -0
- chronaxis/results/codec.py +246 -0
- chronaxis/results/errors.py +25 -0
- chronaxis/results/export_files.py +216 -0
- chronaxis/results/frame_exports.py +299 -0
- chronaxis/results/frame_patch.py +186 -0
- chronaxis/results/frame_rebuild.py +458 -0
- chronaxis/results/frame_sort.py +223 -0
- chronaxis/results/input_diagnostics.py +51 -0
- chronaxis/results/manifest.py +343 -0
- chronaxis/results/merge_runs.py +207 -0
- chronaxis/results/owned_directory.py +32 -0
- chronaxis/results/raw_exports.py +689 -0
- chronaxis/results/readable.py +355 -0
- chronaxis/results/readable_format.py +94 -0
- chronaxis/results/result.py +734 -0
- chronaxis/results/rows.py +57 -0
- chronaxis/results/signal_exports.py +209 -0
- chronaxis/results/signal_grid.py +219 -0
- chronaxis/results/spool.py +421 -0
- chronaxis/results/summary.py +350 -0
- chronaxis/results/text_can_metadata.py +64 -0
- chronaxis/results/threshold_metadata.py +105 -0
- chronaxis/runner.py +121 -0
- chronaxis/sources/__init__.py +23 -0
- chronaxis/sources/asc.py +412 -0
- chronaxis/sources/blf.py +101 -0
- chronaxis/sources/can_spec.py +179 -0
- chronaxis/sources/can_updates.py +160 -0
- chronaxis/sources/csv_spec.py +133 -0
- chronaxis/sources/descriptions.py +65 -0
- chronaxis/sources/memory.py +299 -0
- chronaxis/sources/models.py +497 -0
- chronaxis/sources/packing.py +170 -0
- chronaxis/sources/protocol.py +221 -0
- chronaxis/sources/raw_can.py +62 -0
- chronaxis/sources/raw_csv.py +470 -0
- chronaxis/sources/raw_csv_layout.py +310 -0
- chronaxis/sources/signal_csv.py +608 -0
- chronaxis/sources/text_can_decode.py +421 -0
- chronaxis/sources/text_can_ref.py +48 -0
- chronaxis/sources/text_can_spec.py +61 -0
- chronaxis/timebase/__init__.py +19 -0
- chronaxis/timebase/conversion.py +364 -0
- chronaxis/timebase/numpy_ops.py +104 -0
- chronaxis/user_guide.py +81 -0
- chronaxis-0.1.0.dev0.dist-info/METADATA +172 -0
- chronaxis-0.1.0.dev0.dist-info/RECORD +917 -0
- chronaxis-0.1.0.dev0.dist-info/WHEEL +5 -0
- chronaxis-0.1.0.dev0.dist-info/entry_points.txt +2 -0
- chronaxis-0.1.0.dev0.dist-info/licenses/LICENSE +21 -0
- chronaxis-0.1.0.dev0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
"""从开始条件到结束条件记录活动,并区分超时与缺观测。
|
|
2
|
+
|
|
3
|
+
输入是同一会话中按时间严格递增的两组ConditionTick。开始采用已知上升沿,
|
|
4
|
+
可选择首次已知TRUE也启动;活动期间只等待结束条件或时限,不排队重复开始。
|
|
5
|
+
输出沿用正长度Event,status=timeout表示在可判断的结束条件下等到时限。
|
|
6
|
+
UNKNOWN/真实失效与EOF继续区分interrupted/truncated,不能凭缺数据判超时。
|
|
7
|
+
这是有界有序状态转换,不读取来源、不保留全量历史,也不属于数值数组核。
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from dataclasses import dataclass
|
|
11
|
+
from .temporal import make_event
|
|
12
|
+
from .temporal_reference import require_batch, require_detector
|
|
13
|
+
from .types import QualityFlag as Q, Truth as T
|
|
14
|
+
from ..timebase.conversion import require_int64_ns
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@dataclass(frozen=True)
|
|
18
|
+
class StartEndSpec:
|
|
19
|
+
"""保存最长等待时长与首次启动策略;None明确表示不限时。"""
|
|
20
|
+
|
|
21
|
+
timeout_ns: int | None = None # 从开始时刻算起;正纳秒或显式不限时。
|
|
22
|
+
emit_initial: bool = True # 首次已知开始条件为TRUE时允许启动。
|
|
23
|
+
|
|
24
|
+
def __post_init__(self):
|
|
25
|
+
"""拒绝零/负时限及假布尔。参数: 无。返回: None。异常: 类型/范围错误。"""
|
|
26
|
+
if self.timeout_ns is not None:
|
|
27
|
+
value = require_int64_ns(self.timeout_ns, 'timeout_ns')
|
|
28
|
+
if value <= 0:
|
|
29
|
+
raise ValueError('start_end时限必须为正或None')
|
|
30
|
+
object.__setattr__(self, 'timeout_ns', value)
|
|
31
|
+
if type(self.emit_initial) is not bool:
|
|
32
|
+
raise TypeError('emit_initial必须为bool')
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class StartEndDetector:
|
|
36
|
+
"""为单个规则保存至多一段活动和开始条件前态;批次边界不重置。
|
|
37
|
+
|
|
38
|
+
活动中忽略重复开始;首次真实结束优先同刻时限。结束条件未知会终止已知
|
|
39
|
+
活动,恢复后需要新的开始边沿;当前开始和结束同时成立不制造零长度活动。
|
|
40
|
+
source_refs在构造时固定,输出可drain移交,未移交事件才留在实例中。
|
|
41
|
+
"""
|
|
42
|
+
|
|
43
|
+
def __init__(self, rule, start_ns, end_ns, spec, source_refs=(), *, backend='reference', record_clock=False):
|
|
44
|
+
"""建立独立的活动状态,规则沿用condition_duration=0输出模型。
|
|
45
|
+
|
|
46
|
+
参数: rule为TemporalRule;start_ns/end_ns为会话域;spec为StartEndSpec;
|
|
47
|
+
source_refs为真实依赖引用;backend验证reference/numpy入口。
|
|
48
|
+
返回: None;初始化实例状态。异常: 规则/范围/参数错误。状态算法没有数值后端分叉。
|
|
49
|
+
"""
|
|
50
|
+
require_detector(rule, start_ns, end_ns, source_refs)
|
|
51
|
+
if not isinstance(spec, StartEndSpec) or rule.rule_type != 'condition_duration' or rule.minimum_duration_ns != 0:
|
|
52
|
+
raise ValueError('start_end需要StartEndSpec和duration=0输出规则')
|
|
53
|
+
if backend not in ('reference', 'numpy'):
|
|
54
|
+
raise ValueError('start_end后端需reference或numpy')
|
|
55
|
+
if type(record_clock) is not bool:
|
|
56
|
+
raise TypeError('record_clock需要bool')
|
|
57
|
+
self.record_clock, self.remaining = record_clock, None
|
|
58
|
+
self.rule, self.spec, self.source_refs = rule, spec, source_refs
|
|
59
|
+
self.start_ns, self.end_ns = int(start_ns), int(end_ns)
|
|
60
|
+
self.active_start, self.deadline = None, None
|
|
61
|
+
self.previous_start, self.seen_start = T.UNKNOWN, False
|
|
62
|
+
self.diagnostic = Q.NONE
|
|
63
|
+
self.last_time, self.ended, self.finished = None, False, False
|
|
64
|
+
self.events = []
|
|
65
|
+
|
|
66
|
+
@property
|
|
67
|
+
def next_deadline_ns(self):
|
|
68
|
+
"""提供域内时限供时间线推进。参数: 无。返回: int或None。异常: 无。"""
|
|
69
|
+
return self.deadline if not self.record_clock and self.deadline is not None and self.deadline <= self.end_ns else None
|
|
70
|
+
|
|
71
|
+
def _close(self, time_ns, status, quality=Q.NONE):
|
|
72
|
+
"""保存有正长度的活动后清理计时,绝不延长零长度点。
|
|
73
|
+
|
|
74
|
+
参数: time_ns结束纳秒;status/quality表示实际结束原因。返回: None。
|
|
75
|
+
异常: Event结构或分配错误;失败后调用方丢弃实例。
|
|
76
|
+
"""
|
|
77
|
+
if self.active_start is not None and time_ns > self.active_start:
|
|
78
|
+
self.events.append(make_event(self.rule, self.active_start, self.active_start,
|
|
79
|
+
time_ns, status, quality, self.diagnostic, self.source_refs))
|
|
80
|
+
self.active_start, self.deadline = None, None
|
|
81
|
+
self.remaining = None
|
|
82
|
+
self.diagnostic = Q.NONE
|
|
83
|
+
|
|
84
|
+
@staticmethod
|
|
85
|
+
def _unknown_status(end_condition):
|
|
86
|
+
"""按真实失效与观测结束区分原因。参数: end_condition证据。返回: str。异常: 无。"""
|
|
87
|
+
return ('truncated' if (end_condition.terminal or end_condition.observation_end) and not end_condition.actual_unknown
|
|
88
|
+
else 'interrupted')
|
|
89
|
+
|
|
90
|
+
def _advance(self, start_condition, end_condition, advance=None):
|
|
91
|
+
"""推进一个完整时间组,先补精确时限,再处理实际结束和新开始。
|
|
92
|
+
|
|
93
|
+
参数: 同刻start_condition/end_condition条件证据。返回: None。异常: 输出构造错误。
|
|
94
|
+
边界: 跨过时限前未出现其它组,表示此前连续结束条件已知不成立;
|
|
95
|
+
同刻未知则不能证明截止点没有end_condition,保留未知/EOF原因。
|
|
96
|
+
"""
|
|
97
|
+
time_ns = int(start_condition.time_ns)
|
|
98
|
+
if self.record_clock and self.remaining is not None:
|
|
99
|
+
self.remaining = max(0, self.remaining - advance)
|
|
100
|
+
if self.deadline is not None and self.deadline < time_ns:
|
|
101
|
+
self._close(self.deadline, 'timeout')
|
|
102
|
+
diagnostic = (start_condition.diagnostic_quality | end_condition.diagnostic_quality | start_condition.quality
|
|
103
|
+
| end_condition.quality | start_condition.point_quality | end_condition.point_quality)
|
|
104
|
+
was_active = self.active_start is not None
|
|
105
|
+
if was_active:
|
|
106
|
+
self.diagnostic |= diagnostic
|
|
107
|
+
# 只有结束条件决定已启动活动;开始信号后来失效不抹去已确认的开始。
|
|
108
|
+
if end_condition.point_state is T.TRUE:
|
|
109
|
+
self._close(time_ns, 'closed')
|
|
110
|
+
elif end_condition.point_state is T.UNKNOWN:
|
|
111
|
+
self._close(time_ns, self._unknown_status(end_condition), end_condition.point_quality)
|
|
112
|
+
elif end_condition.state is T.TRUE and not end_condition.terminal:
|
|
113
|
+
# 右侧连续条件已经成立时,结束边界就在当前时刻,不等下条采样。
|
|
114
|
+
self._close(time_ns, 'closed')
|
|
115
|
+
elif (self.remaining == 0 if self.record_clock else self.deadline is not None and self.deadline == time_ns):
|
|
116
|
+
self._close(time_ns, 'timeout')
|
|
117
|
+
elif end_condition.terminal or end_condition.observation_end:
|
|
118
|
+
self._close(time_ns, 'truncated', end_condition.quality | Q.MISSING)
|
|
119
|
+
elif end_condition.state is T.UNKNOWN:
|
|
120
|
+
self._close(time_ns, 'interrupted', end_condition.quality)
|
|
121
|
+
# 不在结束同刻抢占新的开始,也不把持续TRUE或UNKNOWN恢复当新上升沿。
|
|
122
|
+
# 首次策略也适用于常量TRUE:有实际观测域即可,不要求常量收到信号更新。
|
|
123
|
+
initial = not self.seen_start and self.spec.emit_initial
|
|
124
|
+
edge = self.previous_start is T.FALSE and start_condition.actual_update
|
|
125
|
+
begins = start_condition.point_state is T.TRUE and (initial or edge)
|
|
126
|
+
if (not was_active and self.active_start is None and begins and not start_condition.terminal
|
|
127
|
+
and end_condition.point_state is T.FALSE and end_condition.state is T.FALSE and not end_condition.observation_end):
|
|
128
|
+
self.active_start = time_ns
|
|
129
|
+
# Python整数避免跨int64上界回绕;域外时限不会交给时间推进器。
|
|
130
|
+
self.deadline = None if self.record_clock or self.spec.timeout_ns is None else time_ns + self.spec.timeout_ns
|
|
131
|
+
self.remaining = self.spec.timeout_ns
|
|
132
|
+
self.diagnostic = diagnostic
|
|
133
|
+
if start_condition.point_state is not T.UNKNOWN:
|
|
134
|
+
self.seen_start = True
|
|
135
|
+
self.previous_start = start_condition.state
|
|
136
|
+
|
|
137
|
+
def push(self, ticks, end_ticks, *, advances=None):
|
|
138
|
+
"""消费同域、同刻、完整的开始/结束条件批。
|
|
139
|
+
|
|
140
|
+
参数: ticks/end_ticks为ConditionTick tuple,可为空;advances仅record_clock模式
|
|
141
|
+
提供本组周期增量,不改变开始/结束的实际时间。返回: 本批新增Event tuple;
|
|
142
|
+
同时保留到drain。异常: 协议/排序/结束后推进错误;输入失败不排序或补齐。
|
|
143
|
+
"""
|
|
144
|
+
if self.finished:
|
|
145
|
+
raise ValueError('start_end检测器已finish')
|
|
146
|
+
require_batch(ticks, self.start_ns, self.end_ns, self.last_time, self.ended)
|
|
147
|
+
from .temporal_clock import require_clock_advances
|
|
148
|
+
require_clock_advances(ticks, advances, self.record_clock, self.last_time)
|
|
149
|
+
require_batch(end_ticks, self.start_ns, self.end_ns, self.last_time, self.ended)
|
|
150
|
+
if len(ticks) != len(end_ticks) or any(a.time_ns != b.time_ns for a, b in zip(ticks, end_ticks)):
|
|
151
|
+
raise ValueError('start_end两个条件必须在相同完整时间组求值')
|
|
152
|
+
first = len(self.events)
|
|
153
|
+
for index, (start, end) in enumerate(zip(ticks, end_ticks)):
|
|
154
|
+
self._advance(start, end, None if advances is None else advances[index])
|
|
155
|
+
self.last_time, self.ended = int(start.time_ns), start.terminal
|
|
156
|
+
return tuple(self.events[first:])
|
|
157
|
+
|
|
158
|
+
def drain_events(self):
|
|
159
|
+
"""转交当前输出,不清活动状态。参数: 无。返回: Event tuple。异常: 分配错误。"""
|
|
160
|
+
result = tuple(self.events)
|
|
161
|
+
self.events.clear()
|
|
162
|
+
return result
|
|
163
|
+
|
|
164
|
+
def finish(self):
|
|
165
|
+
"""仅在已收到真实末组后封闭。参数: 无。返回: 未移交Event tuple。异常: 协议错误。"""
|
|
166
|
+
if self.finished or not self.ended:
|
|
167
|
+
raise ValueError('start_end需要唯一finish且已有真实terminal')
|
|
168
|
+
self.finished = True
|
|
169
|
+
return tuple(self.events)
|
chronaxis/core/state.py
ADDED
|
@@ -0,0 +1,494 @@
|
|
|
1
|
+
"""检查内存样本的原行身份,并按有限有效期查询最新观测或提交同刻更新。
|
|
2
|
+
|
|
3
|
+
输入为当前SignalBindings下的规范样本和纳秒查询轴;输出SignalSeries、
|
|
4
|
+
StateValue或完整TimeGroup。先检查身份、声明类型及同时间冲突,再取最新更新,
|
|
5
|
+
结合有效期和来源、会话范围判断能否使用。无效更新同样覆盖历史,不能回退
|
|
6
|
+
取更早有效值。同刻多列更新先收齐,再交给调用者求值一次。
|
|
7
|
+
本模块只依赖标准库,没有文件操作或全局状态;不执行单位转换或表达式计算。
|
|
8
|
+
NumPy保持实现位于state_numpy,数值对齐算法独立。
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
# 冻结结构承载已检查输入;heap只归并内存样本,不调整旧文件读取顺序。
|
|
12
|
+
from dataclasses import dataclass, field
|
|
13
|
+
# 合并已排序来源,不排序或重排原始输入。
|
|
14
|
+
from heapq import merge
|
|
15
|
+
# 无效NaN同时间证据需明确判断,不能普通相等比较。
|
|
16
|
+
from math import isnan
|
|
17
|
+
|
|
18
|
+
# 两后端可共享模型校验/提交协议,参考查询不调用NumPy对齐。
|
|
19
|
+
from .binding import SignalBindings
|
|
20
|
+
# 来源与规范样本定位保存原行身份。
|
|
21
|
+
from .models import SignalSample, SourceSpec
|
|
22
|
+
# 有效性/类型策略不由原值truthiness决定。
|
|
23
|
+
from .types import QualityFlag, SignalDType
|
|
24
|
+
# 精确整数时间先校验再运算,不允许wrap。
|
|
25
|
+
from ..timebase.conversion import checked_add_ns, require_int64_ns
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def _collapse(bindings: SignalBindings, samples: tuple[SignalSample, ...]) -> tuple[SignalSample, int]:
|
|
29
|
+
"""解析同一别名同时间候选,保留稳定原序号及冲突数量。
|
|
30
|
+
|
|
31
|
+
参数: bindings为当前冻结引用;samples为非空、同名同时间typed候选。
|
|
32
|
+
返回: 选定SignalSample及不同事实被显式覆盖的候选数。
|
|
33
|
+
异常: ValueError为默认error下不同事实冲突;不静默按遍历顺序选值。
|
|
34
|
+
"""
|
|
35
|
+
# 每候选序号是来源内稳定身份,最大序号与遍历顺序无关。
|
|
36
|
+
chosen = max(samples, key=lambda sample: sample.sequence)
|
|
37
|
+
# 基线取首条仅用于判断是否一致,不作为冲突时默认结果。
|
|
38
|
+
first = samples[0]
|
|
39
|
+
# 无效NaN诊断可以与相同原因的NaN一致,不使用其普通比较结果。
|
|
40
|
+
same = all(item.valid == first.valid and item.quality == first.quality and
|
|
41
|
+
type(item.value) is type(first.value) and
|
|
42
|
+
(item.value == first.value or (type(item.value) is float and isnan(item.value) and isnan(first.value)))
|
|
43
|
+
for item in samples)
|
|
44
|
+
# 不同值/质量/有效性属于真实同信号冲突。
|
|
45
|
+
if not same and bindings.resolve(first.name).same_time_policy == "error":
|
|
46
|
+
# 未配置last_by_sequence时不能依赖输入遍历顺序。
|
|
47
|
+
raise ValueError(f"同信号同时间冲突:{first.name}@{first.time_ns}ns")
|
|
48
|
+
# 明确选最后稳定序号,记录被处理的不同候选数量。
|
|
49
|
+
return chosen, 0 if same else len(samples) - 1
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
@dataclass(frozen=True)
|
|
53
|
+
class SignalSeries:
|
|
54
|
+
"""保存一个信号别名的规范内存观测,以及来源范围和同刻冲突计数。
|
|
55
|
+
|
|
56
|
+
样本先按原顺序检查时间非递减,再按声明策略处理同刻候选,构造结果时间
|
|
57
|
+
严格递增。有效值符合声明类型,无效原值保留作诊断。未声明的来源端点取
|
|
58
|
+
实际首末行,不补采样周期。序列使用当前冻结绑定,没有全局执行缓存;
|
|
59
|
+
原行转换由数值层提供。
|
|
60
|
+
"""
|
|
61
|
+
|
|
62
|
+
bindings: SignalBindings # 当前计划与会话引用。
|
|
63
|
+
name: str # 当前原信号别名。
|
|
64
|
+
samples: tuple[SignalSample, ...] # 已规范化typed样本,包含无效更新。
|
|
65
|
+
source: SourceSpec = field(init=False) # 校验所得实际来源。
|
|
66
|
+
observation_start_ns: int = field(init=False) # 分析坐标来源首端。
|
|
67
|
+
observation_end_ns: int = field(init=False) # 分析坐标来源末端。
|
|
68
|
+
conflict_count: int = field(init=False) # last_by_sequence显式覆盖数量。
|
|
69
|
+
|
|
70
|
+
def __post_init__(self) -> None:
|
|
71
|
+
"""校验样本原身份、dtype、顺序,规范同时间候选并冻结来源域。
|
|
72
|
+
|
|
73
|
+
参数: 无;bindings/name为真实引用,samples为tuple规范化观测。
|
|
74
|
+
返回: None;只在构造时规范同时间组,不丢失无效状态。
|
|
75
|
+
异常: TypeError为结构/dtype;ValueError为归属/原序号/顺序/冲突;
|
|
76
|
+
时间溢出异常由既有时间协议传播。
|
|
77
|
+
"""
|
|
78
|
+
# 只接受当前真实绑定和冻结样本容器。
|
|
79
|
+
if not isinstance(self.bindings, SignalBindings) or not isinstance(self.samples, tuple):
|
|
80
|
+
# 不接可变列表或未校验字典。
|
|
81
|
+
raise TypeError("SignalSeries需要SignalBindings和tuple samples")
|
|
82
|
+
# 别名先在当前计划解析,不能继承其他会话。
|
|
83
|
+
definition = self.bindings.resolve(self.name)
|
|
84
|
+
# 实际来源已经由绑定证明唯一。
|
|
85
|
+
source = next(item for item in self.bindings.session.sources if item.name == definition.source)
|
|
86
|
+
# 原行序号到字段/时间,用于证明规范化观测对应实际原行。
|
|
87
|
+
rows = {row.sequence: row for row in source.rows}
|
|
88
|
+
# 枚举逻辑域按第一次出现稳定去重,编码映射原样保留在定义。
|
|
89
|
+
labels = tuple(dict.fromkeys(label for _, label in definition.choices)) if definition.dtype is SignalDType.ENUM else ()
|
|
90
|
+
# 局部稳定身份和待提交时间组,不跨会话共享。
|
|
91
|
+
seen, groups, pending = set(), [], []
|
|
92
|
+
# 冲突计数只记录显式政策处理的不同事实。
|
|
93
|
+
conflicts = 0
|
|
94
|
+
# 输入顺序不自动修补,逐项检查后才规范同时间。
|
|
95
|
+
for sample in self.samples:
|
|
96
|
+
# typed样本已校验质量矛盾,当前入口仍拒绝占位对象。
|
|
97
|
+
if not isinstance(sample, SignalSample):
|
|
98
|
+
# 不把自由dict当作可计算观测。
|
|
99
|
+
raise TypeError("samples必须包含SignalSample")
|
|
100
|
+
# 会话/来源/字段范围必须属于当前冻结输入。
|
|
101
|
+
self.bindings.session.validate_sample(sample)
|
|
102
|
+
# 同别名的来源引用完整匹配,不能用另一字段冒充。
|
|
103
|
+
if sample.name != self.name or sample.source_ref != self.bindings.source_ref(self.name):
|
|
104
|
+
# 原引用冲突不是普通缺失值。
|
|
105
|
+
raise ValueError("样本别名/来源与当前序列不一致")
|
|
106
|
+
# 声明dtype只检查有效值,无效占位保留原诊断。
|
|
107
|
+
sample.validate_dtype(definition.dtype, labels)
|
|
108
|
+
# 同来源原序号必须真实且不能重复消费。
|
|
109
|
+
if sample.sequence not in rows or sample.sequence in seen:
|
|
110
|
+
# 不重编号或生成不存在的行。
|
|
111
|
+
raise ValueError("样本原序号不存在或重复")
|
|
112
|
+
# 定位实际行,再证明偏移映射与字段暴露事实。
|
|
113
|
+
row = rows[sample.sequence]
|
|
114
|
+
# 单个样本只能关联真正含该原字段的行。
|
|
115
|
+
if definition.field not in row.values or sample.time_ns != checked_add_ns(row.time_ns, source.offset_ns):
|
|
116
|
+
# 已归一化值可变化,但原时间/字段身份不能伪造。
|
|
117
|
+
raise ValueError("样本不能定位对应原行时间/字段")
|
|
118
|
+
# 来源序号只在当前序列登记,另一别名可引用同一原行。
|
|
119
|
+
seen.add(sample.sequence)
|
|
120
|
+
# 时间回退不排序以掩盖上游错误。
|
|
121
|
+
if pending and sample.time_ns < pending[-1].time_ns:
|
|
122
|
+
# 不提交回退之后的计算结果。
|
|
123
|
+
raise ValueError("序列时间必须非递减")
|
|
124
|
+
# 更大时间才证明上一时间组收齐。
|
|
125
|
+
if pending and sample.time_ns != pending[-1].time_ns:
|
|
126
|
+
# 公共校验协议处理同信号同时间冲突。
|
|
127
|
+
selected, count = _collapse(self.bindings, tuple(pending))
|
|
128
|
+
# 规范结果保留实际原样本,不伪造值。
|
|
129
|
+
groups.append(selected)
|
|
130
|
+
# 显式政策处理数量可追溯。
|
|
131
|
+
conflicts += count
|
|
132
|
+
# 仅结束上一组,不重置来源或会话状态。
|
|
133
|
+
pending = []
|
|
134
|
+
# 当前真实更新进入待规范组,无效样本同样保留。
|
|
135
|
+
pending.append(sample)
|
|
136
|
+
# 完整内存输入结束可以提交最后一组。
|
|
137
|
+
if pending:
|
|
138
|
+
# 该收尾是全序列结束,不是batch EOF。
|
|
139
|
+
selected, count = _collapse(self.bindings, tuple(pending))
|
|
140
|
+
# 末点仍保存为真实观测。
|
|
141
|
+
groups.append(selected)
|
|
142
|
+
# 最后一组冲突同样记录。
|
|
143
|
+
conflicts += count
|
|
144
|
+
# 未声明范围时只取实际来源首行/末行,绑定已保证来源非空。
|
|
145
|
+
start = source.rows[0].time_ns if source.observation_start_ns is None else source.observation_start_ns
|
|
146
|
+
# 实际末行不得加假设周期。
|
|
147
|
+
end = source.rows[-1].time_ns if source.observation_end_ns is None else source.observation_end_ns
|
|
148
|
+
# 构造冻结规范样本,不保留可变临时分组列表。
|
|
149
|
+
object.__setattr__(self, "samples", tuple(groups))
|
|
150
|
+
# 保存真实来源引用,后续两个对齐器共享该校验事实。
|
|
151
|
+
object.__setattr__(self, "source", source)
|
|
152
|
+
# 来源原坐标显式映射到分析时间。
|
|
153
|
+
object.__setattr__(self, "observation_start_ns", checked_add_ns(start, source.offset_ns))
|
|
154
|
+
# 点/连续对末端的使用由对齐入口明确指定。
|
|
155
|
+
object.__setattr__(self, "observation_end_ns", checked_add_ns(end, source.offset_ns))
|
|
156
|
+
# 结果数量只描述显式冲突政策,不称为旧帧去重。
|
|
157
|
+
object.__setattr__(self, "conflict_count", conflicts)
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
@dataclass(frozen=True)
|
|
161
|
+
class StateValue:
|
|
162
|
+
"""保存某个查询时刻的最新观测、可用性和质量原因。
|
|
163
|
+
|
|
164
|
+
sample用于追溯原时间、序号和来源;最新更新无效时保留它,不回退旧值。
|
|
165
|
+
没有历史时value为None。actual_update只表示查询点恰好有真实样本更新,
|
|
166
|
+
有效期到期或观测结束不能伪造更新。point模式可以包含真实末点,连续模式
|
|
167
|
+
排除末端,两者均在有效期右端失效。结果不会修改原样本。
|
|
168
|
+
"""
|
|
169
|
+
|
|
170
|
+
time_ns: int # 本次查询的分析纳秒坐标。
|
|
171
|
+
value: int | float | bool | str | None # 最新观测或没有历史时None。
|
|
172
|
+
valid: bool # 质量/TTL/观测范围均满足才可使用。
|
|
173
|
+
quality: QualityFlag # 保留输入原因并叠加缺失/过期。
|
|
174
|
+
sample: SignalSample | None # 最新实际观测;不回退旧有效值。
|
|
175
|
+
actual_update: bool # 该点是否真正发生更新。
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
def align_reference(series: SignalSeries, times_ns: tuple[int, ...], *, point: bool = False, strict_before: bool = False) -> tuple[StateValue, ...]:
|
|
179
|
+
"""逐查询点取得最新历史观测,再检查有效期和来源、会话范围。
|
|
180
|
+
|
|
181
|
+
参数:
|
|
182
|
+
series (SignalSeries): 当前绑定下已经检查的规范序列。
|
|
183
|
+
times_ns (tuple[int, ...]): 非递减int64纳秒查询轴,允许空轴和重复点。
|
|
184
|
+
point (bool): 默认False,使用左闭右开连续范围;True包含来源及会话
|
|
185
|
+
的真实末端,但有效期右端始终排除。
|
|
186
|
+
strict_before (bool): 默认False;True只取sample_time < t的样本,
|
|
187
|
+
仍在当前t检查有效期,用来区分实际更新与同刻到期。
|
|
188
|
+
返回:
|
|
189
|
+
tuple[StateValue, ...]: 每个查询点一个结果;无历史为MISSING,过期为STALE。
|
|
190
|
+
最新无效更新不会被更早有效值替代,空轴返回空tuple。
|
|
191
|
+
异常:
|
|
192
|
+
TypeError: 序列、查询容器或模式标志类型错误,或者时间不是非布尔整数。
|
|
193
|
+
ValueError: 查询时间回退。
|
|
194
|
+
TimeOverflowError: 查询坐标超出int64范围。
|
|
195
|
+
副作用:
|
|
196
|
+
仅使用局部游标和结果集合,不调用NumPy对齐,不修改输入。
|
|
197
|
+
"""
|
|
198
|
+
# 不接受未校验序列或可变查询容器。
|
|
199
|
+
if not isinstance(series, SignalSeries) or not isinstance(times_ns, tuple) or type(point) is not bool or type(strict_before) is not bool:
|
|
200
|
+
# point不能以数值truthiness切换契约。
|
|
201
|
+
raise TypeError("参考对齐需要SignalSeries、tuple时间及bool point")
|
|
202
|
+
# 只用精确Python整数,参考不调用NumPy索引/掩码内核。
|
|
203
|
+
times = tuple(require_int64_ns(time, "query.time_ns") for time in times_ns)
|
|
204
|
+
# 保证时间推进不回退,重复查询点允许。
|
|
205
|
+
if any(right < left for left, right in zip(times, times[1:])):
|
|
206
|
+
# 不排序查询掩盖执行器错误。
|
|
207
|
+
raise ValueError("查询时间必须非递减")
|
|
208
|
+
# 每次查询调用只有局部游标,不继承其他会话状态。
|
|
209
|
+
cursor, result = -1, []
|
|
210
|
+
# 当前会话范围明确,不延长来源保持。
|
|
211
|
+
session = series.bindings.session
|
|
212
|
+
# 有效期纳秒来自当前冻结定义,不根据消息周期推测。
|
|
213
|
+
age = series.bindings.resolve(series.name).valid_for_ns
|
|
214
|
+
# 小规模参考按时间逐点计算,数值/对齐独立于数组后端。
|
|
215
|
+
for time in times:
|
|
216
|
+
# 最新更新包含无效观测,不能只搜索有效值。
|
|
217
|
+
while cursor + 1 < len(series.samples) and (series.samples[cursor + 1].time_ns < time if strict_before else series.samples[cursor + 1].time_ns <= time):
|
|
218
|
+
# 精确取不晚于当前时刻的最新样本。
|
|
219
|
+
cursor += 1
|
|
220
|
+
# 连续域末端排除;point显式包含真实终点。
|
|
221
|
+
in_domain = session.domain_start_ns <= time and (time <= session.domain_end_ns if point else time < session.domain_end_ns)
|
|
222
|
+
# 会话外或无历史没有可用观测,不能取末元素。
|
|
223
|
+
if not in_domain or cursor < 0:
|
|
224
|
+
# 没有可用历史时保留None和MISSING原因,不用数值0代替未知结果。
|
|
225
|
+
result.append(StateValue(time, None, False, QualityFlag.MISSING, None, False))
|
|
226
|
+
# 当前点没有样本参与TTL或边沿。
|
|
227
|
+
continue
|
|
228
|
+
# 即使最新更新无效也取它,不回退到更早有效观测。
|
|
229
|
+
sample = series.samples[cursor]
|
|
230
|
+
# 质量在局部结果叠加,原样本原因保持不变。
|
|
231
|
+
quality = sample.quality
|
|
232
|
+
# TTL始终右端排除,Python整数差避免绝对时间浮点损失。
|
|
233
|
+
if time - sample.time_ns >= age:
|
|
234
|
+
# 自动计时失效无需等待新报文。
|
|
235
|
+
quality |= QualityFlag.STALE
|
|
236
|
+
# 来源末端与会话一样按point/连续显式区分。
|
|
237
|
+
in_source = series.observation_start_ns <= time and (time <= series.observation_end_ns if point else time < series.observation_end_ns)
|
|
238
|
+
# 更长的其他来源不能延长当前来源保持。
|
|
239
|
+
if not in_source:
|
|
240
|
+
# 来源观测不足与输入无效/TTL原因一起保留。
|
|
241
|
+
quality |= QualityFlag.MISSING
|
|
242
|
+
# 所有非零质量基础策略禁止使用,正常0仍然有效。
|
|
243
|
+
valid = sample.valid and quality == QualityFlag.NONE
|
|
244
|
+
# 只有真正实际更新可触发后续点事件。
|
|
245
|
+
result.append(StateValue(time, sample.value, valid, quality, sample, time == sample.time_ns))
|
|
246
|
+
# 冻结结果容器,不暴露局部列表。
|
|
247
|
+
return tuple(result)
|
|
248
|
+
|
|
249
|
+
|
|
250
|
+
def _require_series_group(series: tuple[SignalSeries, ...]) -> SignalBindings:
|
|
251
|
+
"""检查局部依赖结构、同绑定和同步,不分配完整时间轴。
|
|
252
|
+
|
|
253
|
+
参数: series为同一冻结绑定下非空tuple SignalSeries。
|
|
254
|
+
返回: 当前SignalBindings;空间只与局部依赖列数有关。
|
|
255
|
+
异常: TypeError为结构;ValueError为不同绑定或同步缺项。
|
|
256
|
+
"""
|
|
257
|
+
# 只处理显式局部依赖,不建立全信号宽表。
|
|
258
|
+
if not isinstance(series, tuple) or not series or not all(isinstance(item, SignalSeries) for item in series):
|
|
259
|
+
# 空依赖需要由调用者明确给出纯常量轴,本入口不猜会话。
|
|
260
|
+
raise TypeError("共同轴需要非空tuple SignalSeries")
|
|
261
|
+
# 同一绑定身份才能形成联合任务轴。
|
|
262
|
+
binding = series[0].bindings
|
|
263
|
+
# 来源输入变化不能只因同别名而共用时间轴。
|
|
264
|
+
if any(item.bindings.identity != binding.identity for item in series):
|
|
265
|
+
# 不把不同会话串接计算。
|
|
266
|
+
raise ValueError("共同轴序列必须来自同一绑定")
|
|
267
|
+
# 参与联合计算的原信号必须通过公共时基检查。
|
|
268
|
+
binding.require_synchronized(tuple(item.name for item in series))
|
|
269
|
+
# 仅返回校验后的绑定,不遍历全历史生成索引或轴。
|
|
270
|
+
return binding
|
|
271
|
+
|
|
272
|
+
|
|
273
|
+
def common_timeline(series: tuple[SignalSeries, ...], extra_ns: tuple[int, ...] = ()) -> tuple[int, ...]:
|
|
274
|
+
"""构造当前依赖的更新、TTL及来源/会话边界共同轴。
|
|
275
|
+
|
|
276
|
+
参数: series为同一绑定下所需序列tuple;extra_ns为后续规则deadline/window边界。
|
|
277
|
+
返回: 排序唯一tuple int64纳秒,限制在会话闭域以保留末点上下文。
|
|
278
|
+
异常: TypeError/ValueError为结构或不同绑定;时间错误传播。
|
|
279
|
+
副作用: 显式分配当前依赖共同轴,归并入口不调用本生成操作。
|
|
280
|
+
"""
|
|
281
|
+
# 校验协议与完整轴构造分开,局部归并不额外分配全历史轴。
|
|
282
|
+
binding = _require_series_group(series)
|
|
283
|
+
# 不接无限或可变边界容器。
|
|
284
|
+
if not isinstance(extra_ns, tuple):
|
|
285
|
+
# 调用侧显式提供后续规则边界。
|
|
286
|
+
raise TypeError("extra_ns必须为tuple")
|
|
287
|
+
# 会话闭域只保留真实终点,不增加连续持续时间。
|
|
288
|
+
start, end = binding.session.domain_start_ns, binding.session.domain_end_ns
|
|
289
|
+
# 当前任务必要端点都保留,纯EOF不是实际更新。
|
|
290
|
+
axis = {start, end}
|
|
291
|
+
# 显式规则边界使用同一精确时间校验。
|
|
292
|
+
axis.update(require_int64_ns(time, "extra_ns") for time in extra_ns)
|
|
293
|
+
# 每信号的保持边界进入轴,不等新更新才失效。
|
|
294
|
+
for item in series:
|
|
295
|
+
# 来源起止是局部覆盖事实,不能借其他列延长。
|
|
296
|
+
axis.update((item.observation_start_ns, item.observation_end_ns))
|
|
297
|
+
# 有效期从明示定义读取。
|
|
298
|
+
age = binding.resolve(item.name).valid_for_ns
|
|
299
|
+
# 更新和TTL用精确整数计算,不先转绝对float秒。
|
|
300
|
+
for sample in item.samples:
|
|
301
|
+
# 真实更新时刻用于原子提交及点事件。
|
|
302
|
+
axis.add(sample.time_ns)
|
|
303
|
+
# 超出会话的TTL不进入int64轴,先在Python整数域裁剪。
|
|
304
|
+
expiry = sample.time_ns + age
|
|
305
|
+
# 只保存会话内可发生的deadline。
|
|
306
|
+
if start <= expiry <= end:
|
|
307
|
+
# 包含与EOF并列的TTL,后续状态机可保留并列诊断。
|
|
308
|
+
axis.add(expiry)
|
|
309
|
+
# 排序仅作用于新核心共同轴,不排序修补来源输入。
|
|
310
|
+
return tuple(sorted(time for time in axis if start <= time <= end))
|
|
311
|
+
|
|
312
|
+
|
|
313
|
+
@dataclass(frozen=True)
|
|
314
|
+
class TimeGroup:
|
|
315
|
+
"""保存一个分析时刻所有信号真实更新,供求值一次使用。
|
|
316
|
+
|
|
317
|
+
不在逐条样本之间求值;updates按冻结定义顺序排列,保持原样本身份。
|
|
318
|
+
"""
|
|
319
|
+
|
|
320
|
+
time_ns: int # 该组公共分析坐标。
|
|
321
|
+
updates: tuple[SignalSample, ...] # 各信号最多一项,冲突已处理。
|
|
322
|
+
conflict_count: int = 0 # 本组显式last_by_sequence处理数量。
|
|
323
|
+
|
|
324
|
+
|
|
325
|
+
class AtomicUpdateBuffer:
|
|
326
|
+
"""跨批收集同时间的信号更新,收齐后输出一次完整求值组。
|
|
327
|
+
|
|
328
|
+
看到更大时间或完整输入finish后才提交当前组,普通批末保留_pending。
|
|
329
|
+
输入须已经按时间归并并完成归一化;本类不读取来源或排序。finish后实例
|
|
330
|
+
关闭,新会话须创建新实例。缓冲大小取决于同刻更新数量;生产预算由上层
|
|
331
|
+
执行入口约束,不能只凭分批就认为整体内存有界。
|
|
332
|
+
"""
|
|
333
|
+
|
|
334
|
+
def __init__(self, bindings: SignalBindings):
|
|
335
|
+
"""创建当前会话的空原子提交缓冲。
|
|
336
|
+
|
|
337
|
+
参数: bindings为当前真实冻结引用。
|
|
338
|
+
返回: None;pending空,closed=False,无全局状态。
|
|
339
|
+
异常: TypeError为非绑定输入。
|
|
340
|
+
"""
|
|
341
|
+
# 缓冲不能关联无类型计划。
|
|
342
|
+
if not isinstance(bindings, SignalBindings):
|
|
343
|
+
# 不从上一个任务继承会话。
|
|
344
|
+
raise TypeError("buffer需要SignalBindings")
|
|
345
|
+
# 当前绑定不会随运行中值更新改变。
|
|
346
|
+
self.bindings = bindings
|
|
347
|
+
# 只缓存当前未证明收齐的同时间组。
|
|
348
|
+
self._pending = []
|
|
349
|
+
# 真正会话完成后禁止继续输入。
|
|
350
|
+
self._closed = False
|
|
351
|
+
# 已见时间用于拒绝跨batch回退。
|
|
352
|
+
self._last_time = None
|
|
353
|
+
|
|
354
|
+
def _commit(self) -> TimeGroup:
|
|
355
|
+
"""将已收齐的pending原子规范为一次求值组。
|
|
356
|
+
|
|
357
|
+
参数: 无;pending须非空且同时间。
|
|
358
|
+
返回: TimeGroup,信号按定义顺序,显式冲突有计数。
|
|
359
|
+
异常: ValueError为默认冲突;只修改当前pending。
|
|
360
|
+
"""
|
|
361
|
+
# 当前组各别名候选先收齐再决策,不在采集过程中求值。
|
|
362
|
+
grouped = {}
|
|
363
|
+
# 原观测顺序仅用于采集,冲突选择依稳定sequence。
|
|
364
|
+
for sample in self._pending:
|
|
365
|
+
# 不同别名更新各自收集。
|
|
366
|
+
grouped.setdefault(sample.name, []).append(sample)
|
|
367
|
+
# 求值组顺序由当前计划定义决定,不受批次切法影响。
|
|
368
|
+
updates, conflicts = [], 0
|
|
369
|
+
# 只处理本时刻确有更新的别名。
|
|
370
|
+
for definition in self.bindings.signals:
|
|
371
|
+
# 未更新列继续保持,不能伪造当前新样本。
|
|
372
|
+
if definition.name in grouped:
|
|
373
|
+
# 统一已定义冲突政策,不改变数值对齐内核独立性。
|
|
374
|
+
sample, count = _collapse(self.bindings, tuple(grouped[definition.name]))
|
|
375
|
+
# 一列最多一项原子更新。
|
|
376
|
+
updates.append(sample)
|
|
377
|
+
# 记录显式覆盖的候选数。
|
|
378
|
+
conflicts += count
|
|
379
|
+
# 所有原候选都处于同一个时间。
|
|
380
|
+
time = self._pending[0].time_ns
|
|
381
|
+
# 只在组实际完成后清空pending,不销毁会话绑定。
|
|
382
|
+
self._pending = []
|
|
383
|
+
# 冻结本组供后续状态驱动器求值一次。
|
|
384
|
+
return TimeGroup(time, tuple(updates), conflicts)
|
|
385
|
+
|
|
386
|
+
def push(self, samples: tuple[SignalSample, ...]) -> tuple[TimeGroup, ...]:
|
|
387
|
+
"""消费一批已归并更新,返回已经收齐的更早时间组。
|
|
388
|
+
|
|
389
|
+
参数: samples为非递减tuple样本,可为空,batch尾可处于未完成同时间组。
|
|
390
|
+
返回: tuple TimeGroup;最后时间仍留pending,不能在batch尾提前求值。
|
|
391
|
+
异常: TypeError为结构;ValueError为已finish、归属/回退/冲突。
|
|
392
|
+
"""
|
|
393
|
+
# 整个会话EOF才关闭,不把普通批次当成会话结束。
|
|
394
|
+
if self._closed:
|
|
395
|
+
# 不能在新会话复用旧执行状态。
|
|
396
|
+
raise ValueError("buffer已finish,需新会话实例")
|
|
397
|
+
# 可变或无限批次容器不进入已定义内存协议。
|
|
398
|
+
if not isinstance(samples, tuple):
|
|
399
|
+
# 当前入口显式有界批次。
|
|
400
|
+
raise TypeError("samples batch必须为tuple")
|
|
401
|
+
# 完成组结果只属于当前调用。
|
|
402
|
+
result = []
|
|
403
|
+
# 每条样本先校验当前归属,再推进原子组。
|
|
404
|
+
for sample in samples:
|
|
405
|
+
# 完整样本类型/会话检查,不允许旧引用污染新任务。
|
|
406
|
+
self.bindings.session.validate_sample(sample)
|
|
407
|
+
# 当前别名必须实际绑定到同来源字段。
|
|
408
|
+
if sample.source_ref != self.bindings.source_ref(sample.name):
|
|
409
|
+
# 绑定冲突不能被吞为无效数值。
|
|
410
|
+
raise ValueError("buffer样本绑定不匹配")
|
|
411
|
+
# 已规范化有效值仍须与当前声明dtype和域一致。
|
|
412
|
+
definition = self.bindings.resolve(sample.name)
|
|
413
|
+
# enum目标逻辑域与编码映射分开,重复标签只保留一个。
|
|
414
|
+
labels = tuple(dict.fromkeys(label for _, label in definition.choices)) if definition.dtype is SignalDType.ENUM else ()
|
|
415
|
+
# 无效更新允许保留原诊断占位,不参与正常数值校验。
|
|
416
|
+
sample.validate_dtype(definition.dtype, labels)
|
|
417
|
+
# 同组同别名不能重复消费同一稳定原样本。
|
|
418
|
+
if any(item.name == sample.name and item.sequence == sample.sequence for item in self._pending):
|
|
419
|
+
# 不把重复输入吞成一次正常更新。
|
|
420
|
+
raise ValueError("buffer同组原序号重复")
|
|
421
|
+
# 跨batch同样禁止时间回退。
|
|
422
|
+
if self._last_time is not None and sample.time_ns < self._last_time:
|
|
423
|
+
# 不重排上游样本。
|
|
424
|
+
raise ValueError("buffer时间回退")
|
|
425
|
+
# 更大时间证明上一组已收齐。
|
|
426
|
+
if self._pending and sample.time_ns > self._last_time:
|
|
427
|
+
# 一组的所有列先提交,调用侧随后求值一次。
|
|
428
|
+
result.append(self._commit())
|
|
429
|
+
# 当前样本纳入未完成组,无效更新也要覆盖旧状态。
|
|
430
|
+
self._pending.append(sample)
|
|
431
|
+
# 记录最新输入时间,普通batch边界保留。
|
|
432
|
+
self._last_time = sample.time_ns
|
|
433
|
+
# 冻结结果,最后pending保留到下一批或真正finish。
|
|
434
|
+
return tuple(result)
|
|
435
|
+
|
|
436
|
+
def finish(self) -> tuple[TimeGroup, ...]:
|
|
437
|
+
"""在完整输入EOF提交最后时间组并关闭当前会话缓冲。
|
|
438
|
+
|
|
439
|
+
参数: 无;调用者已证明所有参与来源输入结束。
|
|
440
|
+
返回: 剩余一个TimeGroup或空tuple。
|
|
441
|
+
异常: ValueError为重复finish或未处理冲突;batch尾不能调用本方法。
|
|
442
|
+
"""
|
|
443
|
+
# 不接受重复收尾,否则可能重复积分或事件。
|
|
444
|
+
if self._closed:
|
|
445
|
+
# 新任务必须创建独立状态对象。
|
|
446
|
+
raise ValueError("buffer不能重复finish")
|
|
447
|
+
# 真EOF才允许提交最终同时间组。
|
|
448
|
+
result = (self._commit(),) if self._pending else ()
|
|
449
|
+
# 当前会话输入不可继续复用。
|
|
450
|
+
self._closed = True
|
|
451
|
+
# 空输入合法,不伪造末点更新。
|
|
452
|
+
return result
|
|
453
|
+
|
|
454
|
+
|
|
455
|
+
def iter_time_groups(series: tuple[SignalSeries, ...], batch_rows: int = 65536):
|
|
456
|
+
"""对当前局部memory序列有界归并并跨batch原子提交。
|
|
457
|
+
|
|
458
|
+
参数: series为同绑定、不同别名的规范序列tuple;batch_rows为正原生整数。
|
|
459
|
+
返回: 逐个yield TimeGroup;完整内存输入结束后才提交最后组。
|
|
460
|
+
异常: TypeError/ValueError为结构/不同绑定/重复列/批次参数或冲突。
|
|
461
|
+
副作用: 只维护局部heap/一批/pending,不读取旧日志或改样本顺序。
|
|
462
|
+
"""
|
|
463
|
+
# 纯依赖校验不生成完整共同轴,不调用任何数值对齐内核。
|
|
464
|
+
_require_series_group(series)
|
|
465
|
+
# 同别名的两个序列不能当成不同输入列重复消费。
|
|
466
|
+
if len({item.name for item in series}) != len(series):
|
|
467
|
+
# 不自动选择某一输入序列。
|
|
468
|
+
raise ValueError("归并序列别名重复")
|
|
469
|
+
# bool不能伪装成批次行数1。
|
|
470
|
+
if type(batch_rows) is not int or batch_rows <= 0:
|
|
471
|
+
# 不接受无界或无效批次参数。
|
|
472
|
+
raise ValueError("batch_rows必须为正原生整数")
|
|
473
|
+
# 缓冲只属于本次输入,不在批次之间重建。
|
|
474
|
+
buffer = AtomicUpdateBuffer(series[0].bindings)
|
|
475
|
+
# heap归并每列已经排序的规范样本,不排序修补任何来源。
|
|
476
|
+
stream = merge(*(item.samples for item in series), key=lambda sample: sample.time_ns)
|
|
477
|
+
# 当前局部批次最多batch_rows条,组可跨边界。
|
|
478
|
+
batch = []
|
|
479
|
+
# 依来源真实更新时间逐项收集。
|
|
480
|
+
for sample in stream:
|
|
481
|
+
# 当前样本保留原稳定身份。
|
|
482
|
+
batch.append(sample)
|
|
483
|
+
# 达到批次预算才将批交给同一个状态缓冲。
|
|
484
|
+
if len(batch) == batch_rows:
|
|
485
|
+
# 已证明收齐的时间组可逐个消费。
|
|
486
|
+
yield from buffer.push(tuple(batch))
|
|
487
|
+
# 普通批次完成只清批,不清pending或会话状态。
|
|
488
|
+
batch = []
|
|
489
|
+
# 完整输入最后不满批同样进入状态缓冲。
|
|
490
|
+
if batch:
|
|
491
|
+
# 同时刻更新可与上一批pending合并。
|
|
492
|
+
yield from buffer.push(tuple(batch))
|
|
493
|
+
# 所有memory来源结束后才执行最后组收尾。
|
|
494
|
+
yield from buffer.finish()
|