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,373 @@
|
|
|
1
|
+
"""保存条件在各时刻的证据、检测规则及已确认事件,供两个检测后端共用。
|
|
2
|
+
|
|
3
|
+
输入为整数纳秒区间、条件状态、实际更新与观测结束证据;输出不可变且经过
|
|
4
|
+
检查的模型。TRUE和FALSE必须没有结果质量原因,UNKNOWN必须保留原因。
|
|
5
|
+
连续区间左闭右开;真实末点可单独观察,但不延长活动。来源或会话输入结束
|
|
6
|
+
不自动等于条件变假。事件以稳定内容生成标识,并保存SourceRef用于追溯。
|
|
7
|
+
本模块只依赖标准库及核心模型,不读取来源、不执行检测、不持有规则状态。
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
# 冻结模型与默认字段便于保留显式证据。
|
|
11
|
+
from dataclasses import dataclass
|
|
12
|
+
# 稳定内容身份,不用秒数文件名充当事件ID。
|
|
13
|
+
from hashlib import sha256
|
|
14
|
+
# 已有规范身份与来源定位结构,不读旧资源。
|
|
15
|
+
from .binding import _identity
|
|
16
|
+
# 区间模型已检查跨度和来源引用结构。
|
|
17
|
+
from .models import Interval, SourceRef
|
|
18
|
+
# 三值状态不得隐式bool化。
|
|
19
|
+
from .types import QualityFlag as Q, Truth
|
|
20
|
+
# 数据标识规则复用,无静默改名。
|
|
21
|
+
from .validation import require_identifier, require_text
|
|
22
|
+
# 所有时间仍为显式int64纳秒。
|
|
23
|
+
from ..timebase.conversion import require_int64_ns
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def _require_truth(state, quality):
|
|
27
|
+
"""检查已知结果无质量原因与UNKNOWN有原因的基础契约。
|
|
28
|
+
|
|
29
|
+
参数: state为Truth,quality为已知Q组合。
|
|
30
|
+
返回: None,不把UNKNOWN变False。
|
|
31
|
+
异常: TypeError/ValueError为类型或质量矛盾。
|
|
32
|
+
"""
|
|
33
|
+
# 已知结果不能携带基础策略禁止的质量位。
|
|
34
|
+
if not isinstance(state, Truth) or not isinstance(quality, Q):
|
|
35
|
+
# 裸bool或任意质量数值不能替代经过检查的条件证据。
|
|
36
|
+
raise TypeError('条件需要Truth及QualityFlag')
|
|
37
|
+
# unknown原因不能空,正常真/假质量只能NONE。
|
|
38
|
+
if (state is Truth.UNKNOWN) != (quality != Q.NONE):
|
|
39
|
+
# 诊断与结果质量通过独立字段保留。
|
|
40
|
+
raise ValueError('条件truth与quality矛盾')
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
@dataclass(frozen=True)
|
|
44
|
+
class ConditionSpan:
|
|
45
|
+
"""保存条件连续成立、不成立或无法确定的一段纳秒区间。
|
|
46
|
+
|
|
47
|
+
start_ns包含起点,end_ns排除终点;区间必须为正长度且跨度可由int64表示。
|
|
48
|
+
state和quality共同说明条件及未知原因。模型不可变,不根据消息周期补齐间隙。
|
|
49
|
+
"""
|
|
50
|
+
|
|
51
|
+
start_ns: int # 连续区间包含起点。
|
|
52
|
+
end_ns: int # 连续区间不包含终点。
|
|
53
|
+
state: Truth # 真/假/未知,不靠数值truthiness。
|
|
54
|
+
quality: Q = Q.NONE # UNKNOWN原因,known为NONE。
|
|
55
|
+
|
|
56
|
+
def __post_init__(self):
|
|
57
|
+
"""检查正区间与truth质量,禁止补齐缺观测。
|
|
58
|
+
|
|
59
|
+
参数: 无;读取四个字段。
|
|
60
|
+
返回: None,保持原声明。
|
|
61
|
+
异常: TypeError/ValueError/OverflowError为结构/区间/质量。
|
|
62
|
+
"""
|
|
63
|
+
# 复用已有半开时间区间不变量。
|
|
64
|
+
interval = Interval(self.start_ns, self.end_ns)
|
|
65
|
+
# 零长度不是连续条件区间。
|
|
66
|
+
if interval.end_ns == interval.start_ns:
|
|
67
|
+
# 真实点由ConditionTick.point_state另表达。
|
|
68
|
+
raise ValueError('ConditionSpan需正长度')
|
|
69
|
+
# 区间状态和原因严格一致。
|
|
70
|
+
_require_truth(self.state, self.quality)
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
@dataclass(frozen=True)
|
|
74
|
+
class ConditionTick:
|
|
75
|
+
"""保存一个完整时间组的连续状态、点状态及实际更新证据。
|
|
76
|
+
|
|
77
|
+
state描述从当前时刻到下一时刻的连续状态;point_state描述当前点,包括真实
|
|
78
|
+
末点。actual_unknown表示真实更新明确导致点结果未知,用于区分实际中断与
|
|
79
|
+
同刻发生的有效期到期。observation_end和terminal分别表示依赖来源及会话
|
|
80
|
+
观测结束。字段不可变,默认点状态继承连续状态,不制造实际更新。
|
|
81
|
+
"""
|
|
82
|
+
|
|
83
|
+
time_ns: int # 已归一化int64纳秒。
|
|
84
|
+
state: Truth # 连续右侧状态,不扩展终点。
|
|
85
|
+
quality: Q = Q.NONE # 连续unknown原因。
|
|
86
|
+
actual_update: bool = True # 完整组确有条件依赖更新/明确条件证据。
|
|
87
|
+
observation_end: bool = False # 当前有依赖来源观测结束。
|
|
88
|
+
terminal: bool = False # 当前会话真实连续终点,只能全输入末组。
|
|
89
|
+
point_state: Truth | None = None # None表示与continuous同证据。
|
|
90
|
+
point_quality: Q | None = None # None采用continuous质量。
|
|
91
|
+
actual_unknown: bool = False # 实际无效/实际更新导致未知,优先interrupted。
|
|
92
|
+
diagnostic_quality: Q = Q.NONE # 全部依赖和边界原因,保留原异常诊断。
|
|
93
|
+
|
|
94
|
+
def __post_init__(self):
|
|
95
|
+
"""规范默认点证据并检查actual/terminal/quality结构。
|
|
96
|
+
|
|
97
|
+
参数: 无,读取上述字段。
|
|
98
|
+
返回: None,默认point只继承显式state,不制造新更新。
|
|
99
|
+
异常: TypeError/ValueError为类型、状态或实际未知证据冲突。
|
|
100
|
+
"""
|
|
101
|
+
# 精确纳秒,bool不作整数时间。
|
|
102
|
+
require_int64_ns(self.time_ns)
|
|
103
|
+
# 连续known/unknown契约独立校验。
|
|
104
|
+
_require_truth(self.state, self.quality)
|
|
105
|
+
# 每个证据标志严格bool。
|
|
106
|
+
for value in (self.actual_update, self.observation_end, self.terminal, self.actual_unknown):
|
|
107
|
+
# 不用任意字符串或整数真值推测证据。
|
|
108
|
+
if type(value) is not bool:
|
|
109
|
+
# 结构错误先于检测。
|
|
110
|
+
raise TypeError('时序证据标志需bool')
|
|
111
|
+
# 未提供point时继承当前明确状态。
|
|
112
|
+
object.__setattr__(self, 'point_state', self.state if self.point_state is None else self.point_state)
|
|
113
|
+
# 未提供point原因时只继承连续原因。
|
|
114
|
+
object.__setattr__(self, 'point_quality', self.quality if self.point_quality is None else self.point_quality)
|
|
115
|
+
# point与continuous质量政策相同,但范围语义不同。
|
|
116
|
+
_require_truth(self.point_state, self.point_quality)
|
|
117
|
+
# 诊断也需已知组合,不得存任意负位。
|
|
118
|
+
if not isinstance(self.diagnostic_quality, Q):
|
|
119
|
+
# 不静默cast非法mask。
|
|
120
|
+
raise TypeError('diagnostic_quality需要QualityFlag')
|
|
121
|
+
# 明确actual_unknown只能针对真正更新的点未知。
|
|
122
|
+
if self.actual_unknown and (not self.actual_update or self.point_state is not Truth.UNKNOWN):
|
|
123
|
+
# 有效期到期或观测结束而没有实际更新证据,不能算作实际中断。
|
|
124
|
+
raise ValueError('actual_unknown需实际更新且点UNKNOWN')
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
@dataclass(frozen=True)
|
|
128
|
+
class TemporalRule:
|
|
129
|
+
"""声明一个数据集会话中的持续条件或边沿检测规则。
|
|
130
|
+
|
|
131
|
+
rule_type接受condition_duration、rising_edge、falling_edge和start_only。minimum_duration_ns是非负int64阈值,
|
|
132
|
+
边沿规则必须为0;rising_edge/start_only可用emit_initial输出首次已知TRUE初始化点。
|
|
133
|
+
start_only的window_duration_ns必须为正,真实触发后的固定时长内抑制新边沿。
|
|
134
|
+
对象不可变,只保存配置,不初始化检测器状态。
|
|
135
|
+
"""
|
|
136
|
+
|
|
137
|
+
rule_id: str # 稳定规则ID,与同名不同会话隔离。
|
|
138
|
+
dataset_id: str # 事件ID范围,不按秒数命名。
|
|
139
|
+
session_id: str # 当前分析会话。
|
|
140
|
+
rule_type: str # condition_duration/rising_edge/falling_edge/start_only实际已实现白名单。
|
|
141
|
+
minimum_duration_ns: int = 0 # condition_duration阈值;edge必须0。
|
|
142
|
+
emit_initial: bool = False # rising_edge/start_only首次已知TRUE初始化策略。
|
|
143
|
+
window_duration_ns: int = 0 # 仅start_only的固定抑制时长,其他模式必须0。
|
|
144
|
+
duration_comparison: str = '>=' # 持续时长门槛:达到或严格超过;不改变实际起止。
|
|
145
|
+
|
|
146
|
+
def __post_init__(self):
|
|
147
|
+
"""校验规则范围、非负时间及基础rule_type参数。
|
|
148
|
+
|
|
149
|
+
参数: 无,读取规则字段。
|
|
150
|
+
返回: None,不初始化任何全局运行状态。
|
|
151
|
+
异常: TypeError/ValueError/OverflowError为配置错误。
|
|
152
|
+
"""
|
|
153
|
+
# 独立命名范围不使用任意路径作为ID。
|
|
154
|
+
for field in ('rule_id', 'dataset_id', 'session_id'):
|
|
155
|
+
# 复用现有简单identifier协议。
|
|
156
|
+
require_identifier(getattr(self, field), field)
|
|
157
|
+
# 阈值精确ns,不猜秒或消息周期。
|
|
158
|
+
require_int64_ns(self.minimum_duration_ns, 'minimum_duration_ns')
|
|
159
|
+
# 严格比较只属于持续规则;其他规则不能携带无效开关。
|
|
160
|
+
if self.duration_comparison not in ('>=', '>') or (self.rule_type != 'condition_duration' and self.duration_comparison != '>='):
|
|
161
|
+
raise ValueError('duration_comparison仅持续条件支持>=或>')
|
|
162
|
+
# 固定窗口和持续确认门槛不同,不能复用一个字段猜旧模式意义。
|
|
163
|
+
object.__setattr__(self, 'window_duration_ns', require_int64_ns(self.window_duration_ns, 'window_duration_ns'))
|
|
164
|
+
# 不负时长/隐式bool策略/未实现kind。
|
|
165
|
+
if self.minimum_duration_ns < 0 or type(self.emit_initial) is not bool or self.rule_type not in ('condition_duration', 'rising_edge', 'falling_edge', 'start_only'):
|
|
166
|
+
# sequence使用独立规则模型,不由本模型承载。
|
|
167
|
+
raise ValueError('非法首版时序规则/阈值/初始化策略')
|
|
168
|
+
# edge不能暗带持续门槛,falling_edge/condition_duration无初始化点参数。
|
|
169
|
+
if self.rule_type != 'condition_duration' and self.minimum_duration_ns != 0 or self.emit_initial and self.rule_type not in ('rising_edge', 'start_only'):
|
|
170
|
+
# 参数不混为旧模式的不同condition_duration。
|
|
171
|
+
raise ValueError('规则参数与kind不匹配')
|
|
172
|
+
# start_only窗口为正;其他kind不能暗带抑制或改变已有事件ID。
|
|
173
|
+
if (self.rule_type == 'start_only' and self.window_duration_ns <= 0) or (self.rule_type != 'start_only' and self.window_duration_ns != 0):
|
|
174
|
+
raise ValueError('window_duration_ns仅且必须用于正时长start_only')
|
|
175
|
+
|
|
176
|
+
@property
|
|
177
|
+
def qualifying_duration_ns(self):
|
|
178
|
+
"""返回最早满足比较的整数纳秒时长,不改变用户声明的门槛。
|
|
179
|
+
|
|
180
|
+
参数: 无。返回: Python整数;严格大于最大int64时可超出int64,表示域内不可达到。
|
|
181
|
+
异常: 无。时间模型精度为1ns,因此>60s的首个可表示时长为60000000001ns;
|
|
182
|
+
这不是把用户阈值粗略提高到60.1秒,固定/DBC模式仍只随实际驱动记录确认。
|
|
183
|
+
"""
|
|
184
|
+
return self.minimum_duration_ns + (self.duration_comparison == '>')
|
|
185
|
+
|
|
186
|
+
|
|
187
|
+
@dataclass(frozen=True)
|
|
188
|
+
class Event:
|
|
189
|
+
"""保存一段已确认活动或一个真实触发点,并关联检测规则和原来源。
|
|
190
|
+
|
|
191
|
+
point事件的start_ns等于confirmed_ns,end_ns为None,status为point。
|
|
192
|
+
activity事件为正长度左闭右开区间;confirmed_ns可以恰好等于end_ns。
|
|
193
|
+
活动的closed表示条件已知结束,interrupted表示连续性中断,truncated表示
|
|
194
|
+
观测结束而没有实际结束证据。边界、质量、诊断和来源引用均不可变。
|
|
195
|
+
timeout表示开始/结束规则在结束条件可判断时达到时限,结束质量必须为NONE。
|
|
196
|
+
"""
|
|
197
|
+
|
|
198
|
+
event_id: str # 按稳定内容SHA,不依批次/遍历次序。
|
|
199
|
+
rule: TemporalRule # 完整规则及dataset/session身份。
|
|
200
|
+
event_type: str # point或activity。
|
|
201
|
+
start_ns: int # 真实onset或点时间。
|
|
202
|
+
confirmed_ns: int # 精确门槛时间,不当活动起点。
|
|
203
|
+
end_ns: int | None # point为None,activity结束边界。
|
|
204
|
+
status: str # closed/timeout/interrupted/truncated/point;timeout用于开始结束时限。
|
|
205
|
+
trigger_kind: str # condition_duration/rising_edge/falling_edge/initial。
|
|
206
|
+
quality: Q # 结束原因质量,不用0恢复失败。
|
|
207
|
+
dependency_quality: Q # 期间及结束证据的完整诊断。
|
|
208
|
+
source_refs: tuple[SourceRef, ...] = () # 真实绑定原来源定位,合成span可空。
|
|
209
|
+
|
|
210
|
+
def __post_init__(self):
|
|
211
|
+
"""检查事件时间不变量、范围与来源,保留确认=end。
|
|
212
|
+
|
|
213
|
+
参数: 无,读取事件字段。
|
|
214
|
+
返回: None,不修改边界或生成片段。
|
|
215
|
+
异常: TypeError/ValueError/OverflowError为事件结构/时间/身份错误。
|
|
216
|
+
"""
|
|
217
|
+
# 正常输出须携带真实规则/质量及来源容器。
|
|
218
|
+
if not isinstance(self.rule, TemporalRule) or not isinstance(self.quality, Q) or not isinstance(self.dependency_quality, Q) or not isinstance(self.source_refs, tuple):
|
|
219
|
+
# 不接无类型事件字典作为完成事实。
|
|
220
|
+
raise TypeError('Event字段需typed模型')
|
|
221
|
+
# start/confirmed都是明确ns。
|
|
222
|
+
require_int64_ns(self.start_ns, 'start_ns')
|
|
223
|
+
# 确认不能先于真实onset。
|
|
224
|
+
require_int64_ns(self.confirmed_ns, 'confirmed_ns')
|
|
225
|
+
# ID需真实非空文本,稳定SHA由make_event产生。
|
|
226
|
+
require_text(self.event_id, 'event_id')
|
|
227
|
+
# 缺数据不能伪装已证实的超时;依赖诊断仍可保留不影响结束判断的原因。
|
|
228
|
+
if self.status == 'timeout' and self.quality != Q.NONE:
|
|
229
|
+
raise ValueError('timeout不能带未知结束质量')
|
|
230
|
+
# 点事件只有单时刻,无连续范围。
|
|
231
|
+
if self.event_type == 'point':
|
|
232
|
+
# 新模式的触发种类与规则一致,不允许自由组装相反边沿或伪初始化。
|
|
233
|
+
if self.rule.rule_type == 'start_only' and (self.trigger_kind not in ('start_only', 'initial') or self.trigger_kind == 'initial' and not self.rule.emit_initial) or self.rule.rule_type != 'start_only' and self.trigger_kind == 'start_only':
|
|
234
|
+
raise ValueError('start_only点触发种类与规则不匹配')
|
|
235
|
+
# 初始点/边沿都不能增面积。
|
|
236
|
+
if self.status != 'point' or self.end_ns is not None or self.start_ns != self.confirmed_ns or self.trigger_kind not in ('rising_edge', 'falling_edge', 'initial', 'start_only') or self.rule.rule_type == 'condition_duration' or self.quality != Q.NONE:
|
|
237
|
+
# 不把point伪装零长度活动。
|
|
238
|
+
raise ValueError('point事件边界/类型矛盾')
|
|
239
|
+
else:
|
|
240
|
+
# 活动严格正长,已确认且终点可相等。
|
|
241
|
+
if self.event_type != 'activity' or self.status not in ('closed', 'timeout', 'interrupted', 'truncated') or self.trigger_kind != 'condition_duration' or self.end_ns is None or self.rule.rule_type != 'condition_duration':
|
|
242
|
+
# 不输出内部pending/active占位。
|
|
243
|
+
raise ValueError('activity事件结构非法')
|
|
244
|
+
# 区间跨度也需合法int64。
|
|
245
|
+
interval = Interval(self.start_ns, self.end_ns)
|
|
246
|
+
# 终点真实新TRUE不得建立零长度活动。
|
|
247
|
+
if interval.start_ns == interval.end_ns or not self.start_ns <= self.confirmed_ns <= self.end_ns:
|
|
248
|
+
# 门槛恰好end仍合法确认。
|
|
249
|
+
raise ValueError('activity确认/连续边界矛盾')
|
|
250
|
+
# 来源属于该会话,不能继承其他任务引用。
|
|
251
|
+
for ref in self.source_refs:
|
|
252
|
+
# 合成ConditionSpan允许无原SourceRef,但非空必须真实typed。
|
|
253
|
+
if not isinstance(ref, SourceRef) or ref.session_id != self.rule.session_id:
|
|
254
|
+
# 不接受仅同名来源作为归属证明。
|
|
255
|
+
raise ValueError('Event来源与session不一致')
|
|
256
|
+
|
|
257
|
+
|
|
258
|
+
def make_event(rule, start_ns, confirmed_ns, end_ns, status, quality, diagnostic, refs=(), *, trigger='condition_duration') -> Event:
|
|
259
|
+
"""根据规则和时间事实生成稳定事件标识,再构造已确认事件。
|
|
260
|
+
|
|
261
|
+
参数:
|
|
262
|
+
rule (TemporalRule): 当前检测规则,包含数据集和会话身份。
|
|
263
|
+
start_ns、confirmed_ns (int): 活动起点和确认时间,或触发点时间,单位为纳秒。
|
|
264
|
+
end_ns (int | None): 活动结束时间,单位为纳秒;点事件使用None。
|
|
265
|
+
status (str): closed、timeout、interrupted、truncated或point。
|
|
266
|
+
quality、diagnostic (QualityFlag): 结束质量和完整依赖诊断。
|
|
267
|
+
refs (tuple[SourceRef, ...]): 当前实际来源引用,默认空tuple。
|
|
268
|
+
trigger (str): 触发种类,默认condition_duration,边沿或初始化点另行声明。
|
|
269
|
+
返回:
|
|
270
|
+
Event: 通过模型检查的事件。标识由规则及时间事实生成,不受批次切分、
|
|
271
|
+
质量诊断或可选语义元数据变化影响。
|
|
272
|
+
异常:
|
|
273
|
+
TypeError、ValueError或OverflowError: 事件模型或身份材料不符合约束。
|
|
274
|
+
副作用:
|
|
275
|
+
无,不加载来源,不修改规则或检测器状态。
|
|
276
|
+
"""
|
|
277
|
+
# 规则范围和事件内容稳定,质量/metadata变化不冒充另一时间事实。
|
|
278
|
+
payload = (rule.dataset_id, rule.session_id, rule.rule_id, rule.rule_type, rule.minimum_duration_ns, rule.emit_initial, start_ns, confirmed_ns, end_ns, status, trigger)
|
|
279
|
+
# 仅新模式增加固定窗口身份材料;已有三个kind的SHA内容逐字保持。
|
|
280
|
+
if rule.rule_type == 'start_only':
|
|
281
|
+
payload += (rule.window_duration_ns,)
|
|
282
|
+
# 旧默认事件ID保持;严格比较作为新的规则身份,避免同端点混淆。
|
|
283
|
+
if rule.duration_comparison != '>=':
|
|
284
|
+
payload += (rule.duration_comparison,)
|
|
285
|
+
# 完整SHA避免同起止秒数/不同规则碰撞。
|
|
286
|
+
identity = sha256(_identity(payload).encode('utf-8')).hexdigest()
|
|
287
|
+
# source_refs保留当前真实来源,不参与规则时间事实的隐式改写。
|
|
288
|
+
return Event(identity, rule, 'point' if status == 'point' else 'activity', start_ns, confirmed_ns, end_ns, status, trigger, quality, diagnostic, refs)
|
|
289
|
+
|
|
290
|
+
|
|
291
|
+
@dataclass(frozen=True)
|
|
292
|
+
class ConditionTimeline:
|
|
293
|
+
"""保存一个完整会话的条件时间轴,检测器可以按批消费其中的时间组。
|
|
294
|
+
|
|
295
|
+
首末时间组必须对应start_ns和end_ns;最后一组是唯一的terminal。时间严格
|
|
296
|
+
递增,同刻更新已经归并;模型不会排序或补齐缺口。source_refs保存原来源,
|
|
297
|
+
与规则会话的归属关系由检测器检查。批次切分不改变条件证据。
|
|
298
|
+
"""
|
|
299
|
+
|
|
300
|
+
start_ns: int # 连续分析起点。
|
|
301
|
+
end_ns: int # 连续分析终点,真实点仍可观察。
|
|
302
|
+
ticks: tuple[ConditionTick, ...] # 完整时间组,含TTL/source/EOF证据。
|
|
303
|
+
source_refs: tuple[SourceRef, ...] = () # 实际condition依赖源定位。
|
|
304
|
+
|
|
305
|
+
def __post_init__(self):
|
|
306
|
+
"""检查时间轴完整性,不填充未知间隙或末周期。
|
|
307
|
+
|
|
308
|
+
参数: 无,读取domain/ticks/source_refs。
|
|
309
|
+
返回: None,保持显式时间证据。
|
|
310
|
+
异常: TypeError/ValueError/OverflowError为结构/边界/顺序。
|
|
311
|
+
"""
|
|
312
|
+
# 域跨度必须可表示,零域只含真实末点。
|
|
313
|
+
Interval(self.start_ns, self.end_ns)
|
|
314
|
+
# 不能用可变列表或空轴冒充完整会话。
|
|
315
|
+
if not isinstance(self.ticks, tuple) or not self.ticks or not isinstance(self.source_refs, tuple):
|
|
316
|
+
# 空观测可显式一个terminal UNKNOWN点,不自动补。
|
|
317
|
+
raise TypeError('timeline需非空tuple ticks及tuple refs')
|
|
318
|
+
# typed组本身已检查continuous/point质量。
|
|
319
|
+
if any(not isinstance(tick, ConditionTick) for tick in self.ticks):
|
|
320
|
+
# 不接自由字典作为完整证据。
|
|
321
|
+
raise TypeError('timeline需要ConditionTick')
|
|
322
|
+
# 真实domain首末完整,不丢EOF边界。
|
|
323
|
+
if self.ticks[0].time_ns != self.start_ns or self.ticks[-1].time_ns != self.end_ns or not self.ticks[-1].terminal:
|
|
324
|
+
# 保证检测finish只发生真正会话末点。
|
|
325
|
+
raise ValueError('timeline首末/terminal与domain不一致')
|
|
326
|
+
# 全轴严格递增,原子同时间组已在上游收齐。
|
|
327
|
+
for index, tick in enumerate(self.ticks):
|
|
328
|
+
# terminal只能出现在真实末组。
|
|
329
|
+
if index < len(self.ticks)-1 and tick.terminal or index and tick.time_ns <= self.ticks[index-1].time_ns:
|
|
330
|
+
# 不将batch/file尾当EOF或排序掩盖回退。
|
|
331
|
+
raise ValueError('timeline中途terminal/时间回退/重复组')
|
|
332
|
+
# 来源结构真实typed,归属稍后与rule.session核对。
|
|
333
|
+
if any(not isinstance(ref, SourceRef) for ref in self.source_refs):
|
|
334
|
+
# 不用名字字符串冒充定位。
|
|
335
|
+
raise TypeError('timeline source_refs需SourceRef')
|
|
336
|
+
|
|
337
|
+
|
|
338
|
+
def timeline_from_spans(spans: tuple[ConditionSpan, ...], *, terminal_state: Truth | None = None,
|
|
339
|
+
terminal_quality: Q = Q.NONE, terminal_actual: bool = False) -> ConditionTimeline:
|
|
340
|
+
"""把完整手算半开区间转换为明确边界证据,不伪造EOF FALSE。
|
|
341
|
+
|
|
342
|
+
参数: spans为正长度、相邻、完整tuple;terminal_state/quality为可选真实
|
|
343
|
+
末点状态,terminal_actual明确是否真实更新,默认EOF沿用历史点状态。
|
|
344
|
+
返回: ConditionTimeline;末端continuous UNKNOWN/MISSING,仅point保留证据。
|
|
345
|
+
异常: TypeError/ValueError为结构/缺口/point更新声明矛盾。
|
|
346
|
+
"""
|
|
347
|
+
# 合成条件资料也必须typed完整,不填补missing域。
|
|
348
|
+
if not isinstance(spans, tuple) or not spans or any(not isinstance(item, ConditionSpan) for item in spans):
|
|
349
|
+
# 零域用ConditionTick直接声明,无正区间不能猜范围。
|
|
350
|
+
raise TypeError('spans需要非空tuple ConditionSpan')
|
|
351
|
+
# 手算明确条件更新可作为边沿证据。
|
|
352
|
+
ticks = []
|
|
353
|
+
# 区间边界是静态输入协议,不是参考/数组状态算法。
|
|
354
|
+
for index, span in enumerate(spans):
|
|
355
|
+
# 间隙/重叠都不能静默补齐或合并真实活动。
|
|
356
|
+
if index and spans[index-1].end_ns != span.start_ns:
|
|
357
|
+
# 用显式UNKNOWN span表达缺口。
|
|
358
|
+
raise ValueError('ConditionSpan需完整相邻,不自动填充')
|
|
359
|
+
# 给定边界是真实状态证据;unknown说明实际无效。
|
|
360
|
+
ticks.append(ConditionTick(span.start_ns, span.state, span.quality, actual_unknown=span.state is Truth.UNKNOWN, diagnostic_quality=span.quality))
|
|
361
|
+
# 默认末点沿用最后明示span的历史状态,不制造更新。
|
|
362
|
+
point_state = spans[-1].state if terminal_state is None else terminal_state
|
|
363
|
+
# 未覆写point时保留末span的原质量。
|
|
364
|
+
point_quality = spans[-1].quality if terminal_state is None else terminal_quality
|
|
365
|
+
# 真实末点覆写必须明确actual,不能冒充纯EOF。
|
|
366
|
+
if terminal_actual and terminal_state is None:
|
|
367
|
+
# 默认历史值不算新末点证据。
|
|
368
|
+
raise ValueError('terminal_actual需明确terminal_state')
|
|
369
|
+
# 连续EOF排除而point包含,真实false/invalid优先结束事实。
|
|
370
|
+
ticks.append(ConditionTick(spans[-1].end_ns, Truth.UNKNOWN, Q.MISSING, terminal_actual, True, True,
|
|
371
|
+
point_state, point_quality, terminal_actual and point_state is Truth.UNKNOWN, Q.MISSING | point_quality))
|
|
372
|
+
# 域与完整时间组由模型统一校验。
|
|
373
|
+
return ConditionTimeline(spans[0].start_ns, spans[-1].end_ns, tuple(ticks))
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"""检查本批实际边界对应的计时增量,不构造另一条时间轴。
|
|
2
|
+
|
|
3
|
+
实际模式不传增量;固定/DBC模式由上游仅在所选驱动更新时传入一个周期,
|
|
4
|
+
其余有效期、EOF等边界传0。增量仅供检测器当前候选计时,不进入事件输出。
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def require_clock_advances(ticks, advances, record_clock, previous):
|
|
9
|
+
"""核对计时模式和有限批增量。
|
|
10
|
+
|
|
11
|
+
参数: ticks为已校验完整组、advances为非负整数tuple或None,previous为上次实际时间。
|
|
12
|
+
返回: None。异常: TypeError/ValueError,不推进任何状态;首点不能虚构前序周期。
|
|
13
|
+
"""
|
|
14
|
+
if type(record_clock) is not bool:
|
|
15
|
+
raise TypeError('record_clock需要bool')
|
|
16
|
+
if not record_clock:
|
|
17
|
+
if advances is not None:
|
|
18
|
+
raise ValueError('实际计时不能混入固定周期增量')
|
|
19
|
+
return
|
|
20
|
+
if type(advances) is not tuple or len(advances) != len(ticks):
|
|
21
|
+
raise TypeError('记录计时需要与完整组等长的增量tuple')
|
|
22
|
+
if any(type(value) is not int or not 0 <= value < (1 << 63) for value in advances):
|
|
23
|
+
raise ValueError('计时增量需要非负int64整数')
|
|
24
|
+
if previous is None and advances and advances[0] != 0:
|
|
25
|
+
raise ValueError('首条记录不能增加尚不存在的间隔')
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
"""通过NumPy保持和表达式计算内存信号的条件时间轴,再检测事件。
|
|
2
|
+
|
|
3
|
+
输入为当前会话已绑定的布尔计划和规则;输出完整条件轴或稳定Event tuple。
|
|
4
|
+
归一化、二分时间索引、条件计算及TRUE起点的阈值安排按列执行。连续、
|
|
5
|
+
当前点和更新前点三个视图在相同时间检查有效期,区分真实更新与同刻到期。
|
|
6
|
+
输出装箱循环只恢复ConditionTick模型,数值计算不调用标量参考算法。
|
|
7
|
+
本模块依赖NumPy和当前核心模型,不读取旧来源或DBC,不修改输入,也没有
|
|
8
|
+
全局绑定。完整内存历史和时间轴需占用内存,不保证生产资源预算。
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
# 实际数组计算,不用object数组或vectorize包装标量算法。
|
|
12
|
+
import numpy as np
|
|
13
|
+
# 独立整列表达式解释。
|
|
14
|
+
from .expression_numpy import evaluate_numpy
|
|
15
|
+
# 独立原行归一化,typed列包装不做重复转换。
|
|
16
|
+
from .normalize_numpy import memory_series_numpy
|
|
17
|
+
# 输出valid/quality与enum域保持明确。
|
|
18
|
+
from .numeric_numpy import NumericArray
|
|
19
|
+
# 新分析轴协议复用,不调用参考保持算法。
|
|
20
|
+
from .state import common_timeline
|
|
21
|
+
# NumPy保持通过searchsorted/列掩码实现。
|
|
22
|
+
from .state_numpy import align_numpy, build_signal_array
|
|
23
|
+
# 实际条件证据与域模型。
|
|
24
|
+
from .temporal import ConditionTick, ConditionTimeline
|
|
25
|
+
# 仅复用静态BOOL/归属检查,不调用参考计算/检测。
|
|
26
|
+
from .temporal_memory_reference import require_memory_rule
|
|
27
|
+
# 独立数组run/edge检测器。
|
|
28
|
+
from .temporal_numpy import detect_numpy
|
|
29
|
+
# 明确三值、质量标志。
|
|
30
|
+
from .types import QualityFlag as Q, Truth
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def _evidence_numpy(compiled, histories, arrays, times):
|
|
34
|
+
"""按列计算连续状态、当前点和更新前点,保留实际未知的因果证据。
|
|
35
|
+
|
|
36
|
+
参数:
|
|
37
|
+
compiled (CompiledExpression): 当前已绑定的布尔表达式。
|
|
38
|
+
histories (dict): 当前依赖名称到SignalSeries的映射。
|
|
39
|
+
arrays (dict): 同一依赖名称到SignalArray的映射。
|
|
40
|
+
times (ndarray[int64], shape=(N,)): 当前完整查询轴,单位为纳秒。
|
|
41
|
+
返回:
|
|
42
|
+
tuple[ConditionTick, ...]: 每个查询时刻的完整状态、质量及更新证据。
|
|
43
|
+
状态和原因先按列计算,最后恢复不可变模型。
|
|
44
|
+
异常:
|
|
45
|
+
TypeError、ValueError或OverflowError: 列类型、形状、计划或数值协议错误。
|
|
46
|
+
MemoryError: 数组分配失败;不丢弃数据继续执行。
|
|
47
|
+
"""
|
|
48
|
+
# 三视图同时间检查TTL,strict_before不计算time-1。
|
|
49
|
+
views = [
|
|
50
|
+
{name: align_numpy(array, times, point=point, strict_before=before) for name, array in arrays.items()}
|
|
51
|
+
for point, before in ((False, False), (True, False), (True, True))]
|
|
52
|
+
# 表达式每视图独立批量执行,无参考数值调用。
|
|
53
|
+
results = []
|
|
54
|
+
# 循环静态三个视图,不逐样本解释。
|
|
55
|
+
for view in views:
|
|
56
|
+
# 列dtype/enum域来自当前计划及归一化历史。
|
|
57
|
+
context = {name: NumericArray(compiled.bindings.resolve(name).dtype, states.values, states.valid, states.quality,
|
|
58
|
+
arrays[name].labels) for name, states in view.items()}
|
|
59
|
+
# 核对实际绑定身份和数组形状后,执行NumPy数值运算及逻辑掩码。
|
|
60
|
+
results.append(evaluate_numpy(compiled, context, compiled.bindings, size=len(times)))
|
|
61
|
+
# 无依赖也明确N,不依赖数组truthiness。
|
|
62
|
+
actual = np.zeros(len(times), dtype=bool)
|
|
63
|
+
# 真实invalid和TTL旧值失效分离。
|
|
64
|
+
invalid = np.zeros(len(times), dtype=bool)
|
|
65
|
+
# 每依赖来源结束仅影响当前规则,空依赖没有来源边界。
|
|
66
|
+
source_end = np.zeros(len(times), dtype=bool)
|
|
67
|
+
# 循环维度是依赖信号,采样列掩码整体执行。
|
|
68
|
+
for name, states in views[1].items():
|
|
69
|
+
# 同时刻原子多列更新汇总,不使用处理顺序。
|
|
70
|
+
actual |= states.actual_update
|
|
71
|
+
# 只有有真实更新位置访问历史valid,避免-1取末项。
|
|
72
|
+
positions = np.flatnonzero(states.actual_update)
|
|
73
|
+
# 真实invalid是完整样本valid,旧TTL不混入此证据。
|
|
74
|
+
invalid[positions] |= ~arrays[name].valid[states.sample_indices[positions]]
|
|
75
|
+
# 当前来源的结束边界在分析坐标。
|
|
76
|
+
source_end |= times == histories[name].observation_end_ns
|
|
77
|
+
# known更新前结果或新增质量位证明actual导致未知。
|
|
78
|
+
causal = invalid | results[2].value.valid | ((results[1].value.quality & ~results[2].value.quality) != 0)
|
|
79
|
+
# 只有真实更新且当前点结果未知时才记录实际中断;被决定性逻辑屏蔽的未知依赖不结束已知活动。
|
|
80
|
+
actual_unknown = actual & ~results[1].value.valid & causal
|
|
81
|
+
# Session终点只有点含真实更新,连续区间仍半开。
|
|
82
|
+
terminal = times == compiled.bindings.session.domain_end_ns
|
|
83
|
+
# 连续known/unknown按结果valid决定,不以诊断强行改truth。
|
|
84
|
+
continuous = np.where(results[0].value.valid, np.where(results[0].value.values, 0, 1), 2)
|
|
85
|
+
# 真实terminal连续UNKNOWN,没有终点之后活动。
|
|
86
|
+
continuous[terminal] = 2
|
|
87
|
+
# 状态质量复制后叠加EOF,无原位修改只读计算结果。
|
|
88
|
+
quality = results[0].value.quality.copy()
|
|
89
|
+
# EOF并列TTL诊断保留。
|
|
90
|
+
quality[terminal] |= np.uint16(Q.MISSING)
|
|
91
|
+
# point保留闭区间真实更新与TTL右端排除。
|
|
92
|
+
point = np.where(results[1].value.valid, np.where(results[1].value.values, 0, 1), 2)
|
|
93
|
+
# 反事实更新前诊断不属于真实发生的质量。
|
|
94
|
+
diagnostic = results[0].dependency_quality | results[1].dependency_quality
|
|
95
|
+
# 仅在最后装箱阶段恢复枚举/原生bool/int,检测计算已整列完成。
|
|
96
|
+
truths = (Truth.TRUE, Truth.FALSE, Truth.UNKNOWN)
|
|
97
|
+
# 输入原时间/来源/质量均保留,不用数组invalid占位当值。
|
|
98
|
+
return tuple(ConditionTick(int(time), truths[int(continuous[index])], Q(int(quality[index])),
|
|
99
|
+
bool(actual[index]), bool(source_end[index]), bool(terminal[index]),
|
|
100
|
+
truths[int(point[index])], Q(int(results[1].value.quality[index])),
|
|
101
|
+
bool(actual_unknown[index]), Q(int(diagnostic[index]))) for index, time in enumerate(times))
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def build_timeline_numpy(compiled, rule):
|
|
105
|
+
"""独立数组安排TRUE起点deadline并生成完整实际条件证据。
|
|
106
|
+
|
|
107
|
+
参数: compiled当前BOOL计划,rule当前规则,时间均int64 ns。
|
|
108
|
+
返回: ConditionTimeline;计时器没有actual更新,不产生假边沿。
|
|
109
|
+
异常: 输入/同步/类型/时间错误传播;超域deadline不会wrap。
|
|
110
|
+
"""
|
|
111
|
+
# 仅共享配置协议,不参考被测数值内核。
|
|
112
|
+
require_memory_rule(compiled, rule)
|
|
113
|
+
# 当前真实依赖,不从上次绑定或原DBC重新取数据。
|
|
114
|
+
histories = {name: memory_series_numpy(compiled.bindings, name) for name in compiled.dependencies}
|
|
115
|
+
# 完整当前多源同步门槛,偏移独自不是证据。
|
|
116
|
+
compiled.bindings.require_synchronized(compiled.dependencies)
|
|
117
|
+
# 归一化历史只转换一次,三个视图复用当前typed输入列。
|
|
118
|
+
arrays = {name: build_signal_array(history) for name, history in histories.items()}
|
|
119
|
+
# 纯常量也用明示当前会话范围。
|
|
120
|
+
session = compiled.bindings.session
|
|
121
|
+
# 分析共同轴共享时间协议,不重新排序原行/旧文件。
|
|
122
|
+
base = common_timeline(tuple(histories.values())) if histories else tuple(sorted({session.domain_start_ns, session.domain_end_ns}))
|
|
123
|
+
# 真int64数组,没有大绝对时间先转float。
|
|
124
|
+
times = np.array(base, dtype=np.int64)
|
|
125
|
+
# 真实独立整列三视图条件计算。
|
|
126
|
+
ticks = _evidence_numpy(compiled, histories, arrays, times)
|
|
127
|
+
# edge规则没有持续deadline。
|
|
128
|
+
if rule.rule_type == 'condition_duration':
|
|
129
|
+
# 存储打包truth后独立整列定位新的TRUE区间。
|
|
130
|
+
true = np.array([tick.state is Truth.TRUE and not tick.terminal for tick in ticks], dtype=bool)
|
|
131
|
+
# 只新起点安排计时器,未知缺口不累计旧候选。
|
|
132
|
+
onsets = times[true & ~np.concatenate((np.array([False]), true[:-1]))]
|
|
133
|
+
# 当前域跨度已证明int64可表示,remaining减法安全。
|
|
134
|
+
remaining = np.int64(session.domain_end_ns) - onsets
|
|
135
|
+
# 先筛域内deadline,再加法,不依赖wrap后的比较。
|
|
136
|
+
eligible = onsets[remaining > rule.minimum_duration_ns] if rule.duration_comparison == ">" else onsets[remaining >= rule.minimum_duration_ns]
|
|
137
|
+
# 已证明onset+d≤end,整列精确int64加法。
|
|
138
|
+
deadlines = eligible + np.int64(rule.qualifying_duration_ns) if len(eligible) else eligible
|
|
139
|
+
# 同刻update/TTL/计时器只构造一个完整组。
|
|
140
|
+
extended = np.union1d(times, deadlines)
|
|
141
|
+
# 没有新增时间避免无意义重复计算。
|
|
142
|
+
if len(extended) != len(times):
|
|
143
|
+
# 整列重新保持保证deadline处TTL/观测范围真实有效。
|
|
144
|
+
times = extended
|
|
145
|
+
# 不把旧TRUE复制到失效timer,更不伪造actual。
|
|
146
|
+
ticks = _evidence_numpy(compiled, histories, arrays, times)
|
|
147
|
+
# 每事件保存完整当前来源字段身份。
|
|
148
|
+
refs = tuple(compiled.bindings.source_ref(name) for name in compiled.dependencies)
|
|
149
|
+
# typed完整轴原封不动交给独立数组状态检测。
|
|
150
|
+
return ConditionTimeline(session.domain_start_ns, session.domain_end_ns, ticks, refs)
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
def detect_memory_numpy(compiled, rule, *, batch_rows=65536):
|
|
154
|
+
"""从原内存行通过实际数组保持/表达式/run检测输出事件。
|
|
155
|
+
|
|
156
|
+
参数: compiled/rule当前计划,batch_rows正原生int的完整组批大小。
|
|
157
|
+
返回: Event tuple;结果/质量/来源/稳定ID可与独立参考比较。
|
|
158
|
+
异常: 当前模型/时间/配置/批大小错误传播,不静默截断。
|
|
159
|
+
"""
|
|
160
|
+
# 将时间轴更新和到期时间交给规则检测器。
|
|
161
|
+
timeline = build_timeline_numpy(compiled, rule)
|
|
162
|
+
# 独立NumPy detector跨批状态,没有reference算法调用。
|
|
163
|
+
return detect_numpy(rule, timeline, batch_rows=batch_rows)
|