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,523 @@
|
|
|
1
|
+
"""解释已构建计划的声明检查结果、计算依赖和当前能力限制。
|
|
2
|
+
|
|
3
|
+
输入为AnalysisPlan,validate_analysis_plan生成ValidationReport,explain_analysis_plan
|
|
4
|
+
生成ExplainReport,列出依赖节点、需要保留的历史时长和预算声明。
|
|
5
|
+
报告不重新读取CSV或DBC,不运行旧reader或数值内核。
|
|
6
|
+
valid与execution_ready表示当前声明使用已接入的公共执行路径;typed计划被
|
|
7
|
+
替换为不支持的来源、算子或后端时会报告明确errors。静态可执行不证明来源
|
|
8
|
+
已读、真实字段已核实或峰值RAM一定满足预算。预算与历史需求不是实测结果。
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
# 冻结报告与只读映射,不维护跨任务状态。
|
|
12
|
+
from dataclasses import dataclass
|
|
13
|
+
from types import MappingProxyType
|
|
14
|
+
from collections.abc import Mapping
|
|
15
|
+
# 报告只消费已经静态校验的计划。
|
|
16
|
+
from .plan import AnalysisPlan
|
|
17
|
+
from .models import MessageCalculationPlan
|
|
18
|
+
from .message_calculations import require_message_calculation
|
|
19
|
+
from .legacy_execution import require_can_decode_scope
|
|
20
|
+
from .input_requirements import InputRequirements, collect_input_requirements
|
|
21
|
+
from .sequences import sequence_dependencies
|
|
22
|
+
from .intervals import IntervalPlan, DiagnosticPlan, require_interval_declarations
|
|
23
|
+
from .export_options import require_export_options,SignalCSVOutput,CANFramesOutput
|
|
24
|
+
# 只检查原冻结来源配置的类型,不导入会读输入的adapter或重建原memory行。
|
|
25
|
+
from ..core.models import SourceSpec
|
|
26
|
+
from ..sources.csv_spec import SignalCSVSpec
|
|
27
|
+
from ..sources.can_spec import LegacyCANSpec, can_field_from_key
|
|
28
|
+
from ..sources.text_can_spec import CANTextSpec
|
|
29
|
+
from ..legacy.records import PROFILE_ID
|
|
30
|
+
|
|
31
|
+
# 静态校验和explain共用同一真实能力表,显式后端覆盖由调用方的有效plan view传入。
|
|
32
|
+
_BACKENDS = ('reference', 'numpy')
|
|
33
|
+
_RULES = ('condition_duration', 'rising_edge', 'falling_edge', 'start_only', 'window_delta', 'debounce', 'hysteresis', 'start_end')
|
|
34
|
+
_MERGES = ('none', 'overlap', 'overlap_and_adjacent', 'exit_delay')
|
|
35
|
+
_CALCULATIONS = ('integral', 'sample_minimum', 'sample_maximum', 'sample_mean', 'min_time',
|
|
36
|
+
'max_time', 'time_weighted_mean', 'duration', 'select')
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
@dataclass(frozen=True)
|
|
40
|
+
class ValidationReport:
|
|
41
|
+
"""区分静态有效、来源元数据未核实及产品执行接线状态。
|
|
42
|
+
|
|
43
|
+
warnings保存事实限制;capability_status不以类名或schema字段存在冒充支持。
|
|
44
|
+
"""
|
|
45
|
+
|
|
46
|
+
valid: bool # 静态配置检查结果。
|
|
47
|
+
errors: tuple[str, ...] # 不支持的typed替换声明等静态能力错误;合法计划为空。
|
|
48
|
+
warnings: tuple[str, ...] # 实际字段/范围/角色尚未核实等限制。
|
|
49
|
+
capability_status: Mapping[str, str] # 明确implemented/partial/unavailable/declared状态。
|
|
50
|
+
execution_ready: bool # 当前声明是否有公共执行路径,不代表输入已读或RAM实测通过。
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
@dataclass(frozen=True)
|
|
54
|
+
class ExplainNode:
|
|
55
|
+
"""保存单声明节点的实际依赖和预计执行层。
|
|
56
|
+
|
|
57
|
+
backend说明数组/状态驱动或未接线,不把整个NumPy计划假称全数组化。
|
|
58
|
+
"""
|
|
59
|
+
|
|
60
|
+
node_id: str # 当前计划节点身份。
|
|
61
|
+
node_type: str # derived/rule/window/calculation/message_calculation。
|
|
62
|
+
dependencies: tuple[str, ...] # 展开原信号别名。
|
|
63
|
+
unit: str | None # 单位适用时保留。
|
|
64
|
+
backend: str # numpy/reference/state_driver/unavailable。
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
@dataclass(frozen=True)
|
|
68
|
+
class ExplainReport:
|
|
69
|
+
"""保存计划依赖、历史需求和未执行的预算声明。
|
|
70
|
+
|
|
71
|
+
validation沿用静态能力报告,plan_identity只识别配置和来源定位声明。
|
|
72
|
+
source_names保持来源顺序,nodes保存计算节点和展开的原信号依赖。
|
|
73
|
+
history_ns仅对实际普通样本依赖,按valid_for_ns和窗口pre取需要保留的时长;
|
|
74
|
+
显式all额外产生的诊断样本不计作结果需求,warnings单独说明其读取与核验范围。
|
|
75
|
+
budget原样报告资源限额。实例不保存运行状态,也不估算实测峰值内存。
|
|
76
|
+
input_requirements保存各来源实际选择的检查策略和时间范围;它是计划声明,
|
|
77
|
+
不能代替运行结果记录的实际检查计数和来源观测证明。
|
|
78
|
+
"""
|
|
79
|
+
|
|
80
|
+
validation: ValidationReport # 同一静态校验限制。
|
|
81
|
+
plan_identity: str # 声明身份,不等于实际文件内容身份。
|
|
82
|
+
source_names: tuple[str, ...] # 来源原序。
|
|
83
|
+
nodes: tuple[ExplainNode, ...] # 可解释依赖节点。
|
|
84
|
+
history_ns: Mapping[str, int | None] # TTL/pre纳秒;None表示还需DBC周期,不能伪造估计值。
|
|
85
|
+
budget: Mapping[str, int | None] # 配置预算,尚未实测峰值。
|
|
86
|
+
input_requirements: InputRequirements | None = None # 来源检查和时间范围声明;非法typed计划为空。
|
|
87
|
+
intervals: IntervalPlan | None = None # 当前有限声明;不含实际DBC周期或运行记录。
|
|
88
|
+
diagnostics: DiagnosticPlan | None = None # 独立诊断开关;声明不证明已执行。
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
def _window_available(window, rules) -> bool:
|
|
92
|
+
"""核窗口是否引用当前支持的真实规则、锚点与合并路径。
|
|
93
|
+
|
|
94
|
+
参数: window为原WindowPlan;rules为本计划rule_id到原RulePlan的映射。
|
|
95
|
+
返回: bool,同一判断供validation和explain节点使用。异常: 非法typed属性错误原样传播。
|
|
96
|
+
副作用: 无,不构造窗口、事件或遍历输入样本。
|
|
97
|
+
"""
|
|
98
|
+
# 未知规则没有产生父事件的执行路径,不能只靠窗口类名声明支持。
|
|
99
|
+
rule = rules.get(window.event)
|
|
100
|
+
if rule is None or rule.rule_type not in _RULES:
|
|
101
|
+
return False
|
|
102
|
+
# 活动规则保完整活动区间,其他已支持规则产生时间点;锚点须沿原含义。
|
|
103
|
+
expected_anchor = 'activity' if rule.temporal_rule_type == 'condition_duration' else 'point'
|
|
104
|
+
return window.merge in _MERGES and window.anchor == expected_anchor
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
def _can_source_available(source) -> bool:
|
|
108
|
+
"""核一个typed来源是否具有当前单BLF固定profile的声明能力。
|
|
109
|
+
|
|
110
|
+
参数: source为当前SourcePlan,允许调用方以typed replace制造不匹配声明。
|
|
111
|
+
返回: bool,供来源、raw输出和能力表共享。异常: 非法外部对象属性错误原样传播。
|
|
112
|
+
副作用: 只查有限模型字段,不打开输入、DBC、writer或重建原始配置。
|
|
113
|
+
"""
|
|
114
|
+
config = source.config
|
|
115
|
+
return (source.source_type == 'can_blf' and isinstance(config, LegacyCANSpec)
|
|
116
|
+
and config.name == source.name and config.legacy_profile == PROFILE_ID and config.unit == 's'
|
|
117
|
+
and source.time_unit == 's' and source.timezone_text is None)
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
def _static_errors(plan: AnalysisPlan) -> tuple[str, ...]:
|
|
121
|
+
"""依据已构建typed声明检查公共执行路径,不重新解析配置或输入。
|
|
122
|
+
|
|
123
|
+
参数: plan为已确认类型的AnalysisPlan,可含测试明确替换的不支持声明。
|
|
124
|
+
返回: 错误tuple;已支持的构建计划为空。异常: 非法模型属性错误原样传播。
|
|
125
|
+
边界: 这不是第二套配置解析器,不重算AST、原rows、绑定或计划identity。
|
|
126
|
+
"""
|
|
127
|
+
# 当前只执行配置3和两个已接入后端;不以原raw_config覆盖typed替换。
|
|
128
|
+
errors = []
|
|
129
|
+
if type(plan.config_version) is not int or plan.config_version != 3:
|
|
130
|
+
errors.append('当前执行只支持config_version=3')
|
|
131
|
+
try:
|
|
132
|
+
require_interval_declarations(plan)
|
|
133
|
+
require_export_options(plan)
|
|
134
|
+
from .record_execution import record_execution_errors
|
|
135
|
+
errors.extend(record_execution_errors(plan))
|
|
136
|
+
except (TypeError, ValueError, KeyError, StopIteration) as error:
|
|
137
|
+
errors.append('间隔/诊断声明无效:' + str(error))
|
|
138
|
+
if plan.execution.backend not in _BACKENDS:
|
|
139
|
+
errors.append(f'未支持的执行backend:{plan.execution.backend}')
|
|
140
|
+
# 类型与kind须同时对应实际reader路径,legacy/profile不会借memory配置冒充支持。
|
|
141
|
+
source_types = {'memory': SourceSpec, 'signal_csv': SignalCSVSpec, 'can_blf': LegacyCANSpec,
|
|
142
|
+
'can_asc':CANTextSpec,'asc_or_blf':CANTextSpec,'raw_can_csv':CANTextSpec}
|
|
143
|
+
if len({source.name for source in plan.sources}) != len(plan.sources):
|
|
144
|
+
errors.append('来源名称不能重复')
|
|
145
|
+
for source in plan.sources:
|
|
146
|
+
expected = source_types.get(source.source_type)
|
|
147
|
+
if expected is None or not isinstance(source.config, expected):
|
|
148
|
+
errors.append(f'{source.name}:未支持或不匹配的来源kind:{source.source_type}')
|
|
149
|
+
elif source.source_type == 'can_blf':
|
|
150
|
+
# typed替换也不能跳过本profile的时间/名称能力限制;不重新读取或解析DBC。
|
|
151
|
+
if not _can_source_available(source):
|
|
152
|
+
errors.append(f'{source.name}:CAN只支持固定单BLF profile与无timezone的原秒时间')
|
|
153
|
+
elif source.source_type in ('can_asc','asc_or_blf','raw_can_csv') and (source.config.source_type!=source.source_type or source.config.name!=source.name):
|
|
154
|
+
errors.append(f'{source.name}:文本CAN种类或名称与实际声明不符')
|
|
155
|
+
source_map = {source.name: source for source in plan.sources}
|
|
156
|
+
for signal in plan.signals:
|
|
157
|
+
source = source_map.get(signal.definition.source)
|
|
158
|
+
if source is not None and isinstance(source.config, (LegacyCANSpec,CANTextSpec)):
|
|
159
|
+
try:
|
|
160
|
+
field = can_field_from_key(signal.definition.field)
|
|
161
|
+
if field.channel != source.config.channel:
|
|
162
|
+
errors.append(f'{signal.definition.name}:CAN字段通道与来源不符')
|
|
163
|
+
except (TypeError, ValueError):
|
|
164
|
+
errors.append(f'{signal.definition.name}:CAN字段不是规范六字段定位')
|
|
165
|
+
# 仅建立当前有限节点引用表,既不重编译表达式,也不访问来源内容。
|
|
166
|
+
rules = {rule.rule_id: rule for rule in plan.rules}
|
|
167
|
+
windows = {window.window_id: window for window in plan.windows}
|
|
168
|
+
# 未支持状态机不能借已经构建的condition冒充可运行规则。
|
|
169
|
+
for rule in plan.rules:
|
|
170
|
+
if rule.rule_type not in _RULES:
|
|
171
|
+
errors.append(f'{rule.rule_id}:未支持的规则kind:{rule.rule_type}')
|
|
172
|
+
if type(plan.sequences) is not tuple:
|
|
173
|
+
errors.append('sequences需要冻结tuple')
|
|
174
|
+
else:
|
|
175
|
+
sequence_ids = set(rules) | set(windows) | {item.calculation_id for item in plan.calculations}
|
|
176
|
+
sequence_ids.update(item.calculation_id for item in plan.message_calculations)
|
|
177
|
+
for sequence in plan.sequences:
|
|
178
|
+
try:
|
|
179
|
+
sequence_dependencies(sequence, plan.rules, plan.bindings)
|
|
180
|
+
if sequence.sequence_id in sequence_ids:
|
|
181
|
+
raise ValueError('计划ID重复:' + sequence.sequence_id)
|
|
182
|
+
sequence_ids.add(sequence.sequence_id)
|
|
183
|
+
except (TypeError, ValueError) as error:
|
|
184
|
+
errors.append('sequences:' + str(error))
|
|
185
|
+
# 窗口路径和explain沿同一能力判断,缺父引用明确报告而不触发字典索引异常。
|
|
186
|
+
for window in plan.windows:
|
|
187
|
+
if not _window_available(window, rules):
|
|
188
|
+
errors.append(f'{window.window_id}:未支持的窗口merge/anchor或规则引用')
|
|
189
|
+
# 数值与选择仅有明确九种口径,积分固定使用左侧保持;不接受legacy_sum或新插值。
|
|
190
|
+
for calculation in plan.calculations:
|
|
191
|
+
if calculation.operation not in _CALCULATIONS:
|
|
192
|
+
errors.append(f'{calculation.calculation_id}:未支持的指标operation:{calculation.operation}')
|
|
193
|
+
if calculation.method != ('zoh' if calculation.operation == 'integral' else None):
|
|
194
|
+
errors.append(f'{calculation.calculation_id}:未支持的指标method:{calculation.method}')
|
|
195
|
+
# 未知范围不进入explain的字典索引,不能让unsupported报告变成KeyError。
|
|
196
|
+
if calculation.scope != 'session':
|
|
197
|
+
scope, separator, target = calculation.scope.partition(':') if type(calculation.scope) is str else ('', '', '')
|
|
198
|
+
known_event = scope == 'event' and target in rules
|
|
199
|
+
known_segment = scope == 'segment' and target in windows
|
|
200
|
+
if not separator or not (known_event or known_segment):
|
|
201
|
+
errors.append(f'{calculation.calculation_id}:未支持的指标scope:{calculation.scope}')
|
|
202
|
+
# 新消息域独立于普通指标;typed替换仍核实际来源、完整定位和原声明身份。
|
|
203
|
+
if type(plan.message_calculations) is not tuple:
|
|
204
|
+
errors.append('message_calculations需要冻结tuple')
|
|
205
|
+
elif plan.message_calculations:
|
|
206
|
+
ids = {item.rule_id for item in plan.rules} | {item.window_id for item in plan.windows}
|
|
207
|
+
ids.update(item.calculation_id for item in plan.calculations)
|
|
208
|
+
for calculation in plan.message_calculations:
|
|
209
|
+
try:
|
|
210
|
+
require_message_calculation(calculation, plan.sources, plan.bindings)
|
|
211
|
+
except (TypeError, ValueError) as error:
|
|
212
|
+
name = calculation.calculation_id if type(calculation) is MessageCalculationPlan else 'message_calculations'
|
|
213
|
+
errors.append(f'{name}:未支持的逐消息指标:{error}')
|
|
214
|
+
continue
|
|
215
|
+
if calculation.calculation_id in ids:
|
|
216
|
+
errors.append(f'{calculation.calculation_id}:计划ID重复')
|
|
217
|
+
ids.add(calculation.calculation_id)
|
|
218
|
+
# 新结果表/清单与原始BLF请求分别检查,不让typed错误靠原raw_config冒充合法。
|
|
219
|
+
if plan.outputs.tables not in ('readable_csv', 'csv', 'jsonl') or plan.outputs.manifest != 'json':
|
|
220
|
+
errors.append('未支持的结果表或manifest格式')
|
|
221
|
+
if type(plan.outputs.contributions) is not str or plan.outputs.contributions not in ('none', 'full'):
|
|
222
|
+
errors.append('outputs.contributions需要none或full')
|
|
223
|
+
# typed替换不能借旧raw_config绕过requested门禁;这里只收集静态错误,不打开来源。
|
|
224
|
+
try:
|
|
225
|
+
require_can_decode_scope(plan)
|
|
226
|
+
except (TypeError, ValueError) as error:
|
|
227
|
+
errors.append(str(error))
|
|
228
|
+
return tuple(errors)
|
|
229
|
+
|
|
230
|
+
|
|
231
|
+
def validate_analysis_plan(plan: AnalysisPlan) -> ValidationReport:
|
|
232
|
+
"""报告静态配置有效性及当前读取、执行和发布能力限制。
|
|
233
|
+
|
|
234
|
+
参数:
|
|
235
|
+
plan (AnalysisPlan): from_dict或load_analysis_plan已经构建的不可变计划。
|
|
236
|
+
返回:
|
|
237
|
+
ValidationReport。合法已接入计划valid为True且errors为空;warnings保留尚未核实的
|
|
238
|
+
字段、观测范围和单位状态,capability_status记录当前接入情况。
|
|
239
|
+
execution_ready随静态能力错误为False或True,不表示已读取或保证实际RAM。
|
|
240
|
+
异常:
|
|
241
|
+
TypeError: 输入不是AnalysisPlan;配置构建错误应由构建入口先报告。
|
|
242
|
+
副作用:
|
|
243
|
+
无来源读取,不重新核实CSV、BLF/DBC、实际字段或物理测量含义。
|
|
244
|
+
"""
|
|
245
|
+
# 不把自由配置或类名占位当已校验计划。
|
|
246
|
+
if not isinstance(plan, AnalysisPlan):
|
|
247
|
+
# 用户应先调用严格构建入口。
|
|
248
|
+
raise TypeError('validate_analysis_plan需要AnalysisPlan')
|
|
249
|
+
# 限制逐来源保留,不以dataset.domain冒充观测范围。
|
|
250
|
+
errors, warnings = _static_errors(plan), []
|
|
251
|
+
# 明示待查周期,静态报告不能把None误解为无限保持或完成了DBC核实。
|
|
252
|
+
pending_validity = tuple(item.definition.name for item in plan.signals
|
|
253
|
+
if item.definition.valid_for_ns is None)
|
|
254
|
+
if pending_validity:
|
|
255
|
+
warnings.append('这些信号的valid_for将在运行时取DBC周期的3倍:'
|
|
256
|
+
+ ', '.join(pending_validity) + ';DBC缺少周期时须填写period或valid_for。')
|
|
257
|
+
requirements = None
|
|
258
|
+
if not errors:
|
|
259
|
+
try:
|
|
260
|
+
requirements = collect_input_requirements(plan)
|
|
261
|
+
except (TypeError, ValueError) as error:
|
|
262
|
+
errors += ('输入需求无法确定:' + str(error),)
|
|
263
|
+
# 状态来自当前实际接线,没有导入旧reader。
|
|
264
|
+
capabilities = {'configuration_static': 'implemented', 'memory': 'implemented', 'signal_csv': 'implemented',
|
|
265
|
+
'can_blf': 'implemented', PROFILE_ID: 'implemented', 'can_asc': 'implemented','asc_or_blf':'implemented','raw_can_csv':'implemented',
|
|
266
|
+
'runner': 'implemented', 'bounded_result_publish': 'implemented',
|
|
267
|
+
'legacy_profiles': 'partial' if any(item.source_type == 'can_blf' for item in plan.sources) else 'unavailable',
|
|
268
|
+
'preset_expansion': 'implemented', 'legacy_sum': 'unavailable',
|
|
269
|
+
'time_calculations': 'implemented', 'selection_rows': 'implemented',
|
|
270
|
+
'window_segments': 'implemented', 'start_only': 'implemented'}
|
|
271
|
+
if plan.sequences:
|
|
272
|
+
capabilities['sequence_timeout'] = 'implemented' if not errors else 'unavailable'
|
|
273
|
+
warnings.append('sequence按点事件FIFO配对;延迟包含两端。只有完整响应观测才能判未响应;缺数据或提前EOF为indeterminate。')
|
|
274
|
+
if any(rule.stability is not None for rule in plan.rules):
|
|
275
|
+
capabilities['stability'] = 'implemented' if not errors else 'unavailable'
|
|
276
|
+
warnings.append('迟滞/防抖输出转换确认后的活动;中间区间保留前态,无前序证据为UNKNOWN,进出条件重叠时报错。连续文件/批次不重置;当前不能直接作为sequence输入。')
|
|
277
|
+
if any(preset.preset_type == 'threshold_excursion' for preset in plan.presets):
|
|
278
|
+
capabilities['threshold_excursion'] = 'implemented' if not errors else 'unavailable'
|
|
279
|
+
warnings.append('threshold_excursion:高阈值进入、低阈值退出,均含等号;逐段duration输出秒,'
|
|
280
|
+
'run.threshold_durations保存同次已知报警累计及未知时长;有未知时完整总数为null,'
|
|
281
|
+
'无观测为no_observation。自定义单位仅核显式同名无转换,保留unverified状态。')
|
|
282
|
+
if any(rule.start_end is not None for rule in plan.rules):
|
|
283
|
+
capabilities['start_end'] = 'implemented' if not errors else 'unavailable'
|
|
284
|
+
warnings.append('start_end从开始条件的新上升沿记录到结束条件或时限;首次启动可配置。timeout表示可判断结束条件下超时,缺数据保留interrupted/truncated;活动中不排队重复开始,文件/批次不重置。')
|
|
285
|
+
if any(rule.rule_type == 'window_delta' for rule in plan.rules):
|
|
286
|
+
capabilities['window_delta'] = 'implemented' if not errors else 'unavailable'
|
|
287
|
+
warnings.append('window_delta按完整有限ZOH窗口判断;不足或缺口为UNKNOWN。输出为rising点事件,窗口参数保留在原计划;当前不能作为sequence输入。')
|
|
288
|
+
if plan.message_calculations:
|
|
289
|
+
# 只在显式请求新模式时增加能力事实;旧空计划报告不因新模型出现而改变。
|
|
290
|
+
available = type(plan.message_calculations) is tuple
|
|
291
|
+
if available:
|
|
292
|
+
for calculation in plan.message_calculations:
|
|
293
|
+
try:
|
|
294
|
+
require_message_calculation(calculation, plan.sources, plan.bindings)
|
|
295
|
+
except (TypeError, ValueError):
|
|
296
|
+
available = False
|
|
297
|
+
capabilities.update(legacy_sum='partial',
|
|
298
|
+
legacy_sum_current_message='implemented' if available else 'unavailable',
|
|
299
|
+
legacy_sum_profile_compat='unavailable')
|
|
300
|
+
scope_text = '按原请求[start,end)逐条匹配' if plan.dataset.domain_explicit else '整文件逐条匹配,不施时间筛选'
|
|
301
|
+
warnings.append('legacy_sum:仅显式current_message-v1、session范围,' + scope_text + ';'
|
|
302
|
+
'本条缺值记无效并跳过,不沿用上一条值、不施普通TTL、不再乘真实dt')
|
|
303
|
+
warnings.append('legacy_sum:profile仅原解码路径;原legacy_evaluation_output=false不变,'
|
|
304
|
+
'旧ChrgInfo完整触发/缓存兼容未接线,静态通过不证明同次CAN捕获或结果已经验证')
|
|
305
|
+
warnings.append('legacy_sum:原始贡献不舍入,摘要仅最终round(raw_sum,6);无求值/全skip为None,'
|
|
306
|
+
'不填连续时间覆盖率;history_ns只解释普通分析的保持需求')
|
|
307
|
+
if type(plan.message_calculations) is tuple and any(
|
|
308
|
+
type(item) is MessageCalculationPlan and item.disjunction is not None for item in plan.message_calculations):
|
|
309
|
+
capabilities['legacy_sum_disjunction'] = 'implemented' if available else 'unavailable'
|
|
310
|
+
warnings.append('disjunction:按本条原解码字段正负路由原贡献,不取绝对值、不施额外scale/offset;'
|
|
311
|
+
'零和另一桶跳过,缺方向及非有限方向保原因;静态声明不证明实际桶结果')
|
|
312
|
+
# CSV表头/实际范围尚未打开,memory空也无观测证明。
|
|
313
|
+
for source in plan.sources:
|
|
314
|
+
# 所有来源实际观测范围须由运行进度另证明。
|
|
315
|
+
if plan.dataset.domain_explicit:
|
|
316
|
+
warnings.append(f'{source.name}:请求domain不证明实际观测范围')
|
|
317
|
+
else:
|
|
318
|
+
warnings.append(f'{source.name}:未声明时间筛选;domain=None不表示空文件或无观测数据')
|
|
319
|
+
# file source尚未核实列/文件,metadata声明不等于verified。
|
|
320
|
+
if source.source_type == 'signal_csv':
|
|
321
|
+
# 无额外reader/DBC加载兑现静态字段验证。
|
|
322
|
+
warnings.append(f'{source.name}:文件存在性与实际表头尚未读取,metadata_status=declared')
|
|
323
|
+
elif source.source_type == 'can_blf':
|
|
324
|
+
# 声明路径可执行不等于实际DBC字段/单位已核实,也不补旧parse没有的错误原因。
|
|
325
|
+
warnings.append(f'{source.name}:仅单BLF与原样{PROFILE_ID};输入/DBC字段及运行单位核对deferred,metadata_status=declared')
|
|
326
|
+
warnings.append(f'{source.name}:旧parse返回空字典无法区分未知ID/解码失败;同类报文缺信号记None/MISSING,其他帧不更新,不猜DECODE_ERROR')
|
|
327
|
+
warnings.append(f'{source.name}:旧reader不保证关闭所有内部文件句柄;本包装由进程退出回收FD,旧路径和进程RSS不在新层账本保证内')
|
|
328
|
+
if isinstance(source.config, LegacyCANSpec) and source.config.decode_scope == 'requested':
|
|
329
|
+
warnings.append(f'{source.name}:只解码本次结果实际需要的信号和逐消息选择器对应报文;'
|
|
330
|
+
'所有报文仍按原顺序读取,其他报文不调用DBC解码;时间按实际消费者处理。')
|
|
331
|
+
elif isinstance(source.config, LegacyCANSpec) and source.config.decode_scope == 'all':
|
|
332
|
+
warnings.append(f'{source.name}:显式all解码全部报文,并为本来源全部声明生成普通样本、'
|
|
333
|
+
'核对实际字段和单位;history_ns仍只列结果需要的TTL/pre,不表示这些诊断样本已裁剪。')
|
|
334
|
+
elif source.source_type == 'memory' and isinstance(source.config, SourceSpec) and not source.config.rows:
|
|
335
|
+
# 空memory也不伪造字段/覆盖。
|
|
336
|
+
warnings.append(f'{source.name}:空memory,无实际字段或观测证明')
|
|
337
|
+
# 未注册单位标签保留unverified事实。
|
|
338
|
+
for signal in plan.signals:
|
|
339
|
+
# 普通分析允许未知单位标签,但不能称已核实转换。
|
|
340
|
+
if signal.definition.unit_status != 'verified':
|
|
341
|
+
# 预设角色契约后续需要额外严格检查。
|
|
342
|
+
warnings.append(f'{signal.definition.name}:单位关系unverified')
|
|
343
|
+
if requirements is not None:
|
|
344
|
+
# 完整声明仍通过静态检查;这里不把声明、消息字段和实际普通样本混为一谈。
|
|
345
|
+
used = set(requirements.required_aliases)
|
|
346
|
+
diagnostic_sources = {source.name for source in plan.sources
|
|
347
|
+
if source.source_type == 'can_blf' and isinstance(source.config, LegacyCANSpec)
|
|
348
|
+
and source.config.decode_scope == 'all'}
|
|
349
|
+
diagnostic_aliases = {item.definition.name for item in plan.signals
|
|
350
|
+
if item.definition.source in diagnostic_sources}
|
|
351
|
+
unused = tuple(item.definition.name for item in plan.signals
|
|
352
|
+
if item.definition.name not in used and item.definition.name not in diagnostic_aliases)
|
|
353
|
+
message_only = tuple(name for name in requirements.message_aliases
|
|
354
|
+
if name not in requirements.ordinary_sample_aliases and name not in diagnostic_aliases)
|
|
355
|
+
warnings.append('信号声明与实际输入需求分开;结果仅在普通分析依赖上需要时序样本,'
|
|
356
|
+
'逐消息依赖按当前消息求值;本报告尚未核验任何运行时值。')
|
|
357
|
+
if unused:
|
|
358
|
+
warnings.append('未被结果引用的信号仅保留静态声明检查,不请求其运行时值:' + '、'.join(unused))
|
|
359
|
+
if message_only:
|
|
360
|
+
warnings.append('仅供逐消息计算,不生成普通样本或TTL历史:' + '、'.join(message_only))
|
|
361
|
+
for source_requirement in requirements.sources:
|
|
362
|
+
warnings.append(f'{source_requirement.source}:input_check={source_requirement.input_check},'
|
|
363
|
+
f'time_scope={source_requirement.time_scope};' + ' '.join(source_requirement.reasons))
|
|
364
|
+
if source_requirement.time_scope == 'none':
|
|
365
|
+
warnings.append(f'{source_requirement.source}:未采集报文时间,不生成全文件观测时间范围或全部时间校验摘要。')
|
|
366
|
+
elif source_requirement.time_scope == 'selected':
|
|
367
|
+
warnings.append(f'{source_requirement.source}:仅所需记录参与时间筛选,目标记录范围不能冒充全文件观测范围。')
|
|
368
|
+
else:
|
|
369
|
+
warnings.append(f'{source_requirement.source}:保留全来源时间观测;没有信号依赖不代表可以跳过来源。')
|
|
370
|
+
if plan.message_calculations:
|
|
371
|
+
warnings.append('逐消息计算使用当前记录流;贡献明细仅在outputs.contributions=full时生成。')
|
|
372
|
+
# ready只说明代码路径可用;真实输入、实际预算及发布成功仍由运行与write分别验证。
|
|
373
|
+
warnings.append('公共AnalysisRunner及有限结果暂存/Windows发布已接线;静态可执行不证明输入已读取或实际RAM峰值满足预算')
|
|
374
|
+
# 所有输出容器只读,调用者不能改能力状态。
|
|
375
|
+
capabilities['interval_execution'] = 'implemented'
|
|
376
|
+
capabilities['demand_lifecycle'] = 'implemented'
|
|
377
|
+
warnings.append('当前配置默认不生成贡献、追溯或完整性摘要;间隔与按需执行已接线,实际输入及结果仍须运行验证。')
|
|
378
|
+
return ValidationReport(not errors, errors, tuple(warnings), MappingProxyType(capabilities), not errors)
|
|
379
|
+
|
|
380
|
+
|
|
381
|
+
def explain_analysis_plan(plan: AnalysisPlan) -> ExplainReport:
|
|
382
|
+
"""列出计划依赖、各节点计算方式、历史需求和预算声明。
|
|
383
|
+
|
|
384
|
+
参数:
|
|
385
|
+
plan (AnalysisPlan): 已通过静态构建的不可变计划。
|
|
386
|
+
返回:
|
|
387
|
+
ExplainReport。包括同一校验限制、依赖节点、history_ns和budget只读映射。
|
|
388
|
+
已有数值内核与尚未接入节点分别标记,不能将整份计划当作全数组执行。
|
|
389
|
+
异常:
|
|
390
|
+
TypeError: 输入不是AnalysisPlan。
|
|
391
|
+
处理流程:
|
|
392
|
+
展开派生、规则、窗口和指标依赖;事件或片段范围的条件也参与依赖收集。
|
|
393
|
+
原信号有效期与所需窗口pre取较大时长,只报告需求,不修改输入读取范围。
|
|
394
|
+
副作用:
|
|
395
|
+
不运行分析、不读取数据,也不测量内存峰值。
|
|
396
|
+
"""
|
|
397
|
+
# 与validate使用同一能力判断,避免两个入口不一致。
|
|
398
|
+
validation = validate_analysis_plan(plan)
|
|
399
|
+
requirements = collect_input_requirements(plan) if validation.valid else None
|
|
400
|
+
# 节点依赖由实际白名单编译结果提供;有效view仅覆盖backend,不重建声明身份。
|
|
401
|
+
nodes = []
|
|
402
|
+
backend = plan.execution.backend if plan.execution.backend in _BACKENDS else 'unavailable'
|
|
403
|
+
# 派生运算使用已实现标量/真实数组核,但当前树仍是静态声明。
|
|
404
|
+
for item, expression in zip(plan.derived, plan.derived_expressions):
|
|
405
|
+
# 不把semantic名称当原依赖。
|
|
406
|
+
nodes.append(ExplainNode(item.definition.name, 'derived', expression.dependencies, expression.root.unit, backend))
|
|
407
|
+
# 活动/边沿生命周期允许状态驱动,不伪称数组ufunc。
|
|
408
|
+
for rule in plan.rules:
|
|
409
|
+
# 已接线规则保持state_driver,未知typed kind不能被名称占位冒充真实检测器。
|
|
410
|
+
nodes.append(ExplainNode(rule.rule_id, 'rule:' + rule.rule_type, rule.dependencies, None,
|
|
411
|
+
'state_driver' if rule.rule_type in _RULES else 'unavailable'))
|
|
412
|
+
if type(plan.sequences) is tuple:
|
|
413
|
+
for sequence in plan.sequences:
|
|
414
|
+
try:
|
|
415
|
+
dependencies = sequence_dependencies(sequence, plan.rules, plan.bindings)
|
|
416
|
+
except (TypeError, ValueError):
|
|
417
|
+
dependencies = ()
|
|
418
|
+
nodes.append(ExplainNode(getattr(sequence, 'sequence_id', 'sequences'), 'sequence:timeout',
|
|
419
|
+
dependencies, 'ns', 'state_driver' if validation.valid else 'unavailable'))
|
|
420
|
+
# 窗口引用的实际规则依赖明确。
|
|
421
|
+
rules = {item.rule_id: item for item in plan.rules}
|
|
422
|
+
# 两个独立窗口扩展/合并/裁剪算法已有入口,原始导出能力另行报告。
|
|
423
|
+
for window in plan.windows:
|
|
424
|
+
# 原规则与窗口依赖明确保留。
|
|
425
|
+
rule = rules.get(window.event)
|
|
426
|
+
available = _window_available(window, rules)
|
|
427
|
+
nodes.append(ExplainNode(window.window_id, 'window:' + window.merge,
|
|
428
|
+
() if rule is None else rule.dependencies, None, backend if available else 'unavailable'))
|
|
429
|
+
# segment范围必须定位产生窗口的原规则。
|
|
430
|
+
windows = {item.window_id: item for item in plan.windows}
|
|
431
|
+
# 结果统计范围的联合依赖已由解析器检查。
|
|
432
|
+
for calculation in plan.calculations:
|
|
433
|
+
# 值/条件依赖在报告中保留,不包含其他无关来源。
|
|
434
|
+
used = {name for expression in (calculation.signal, calculation.condition) if expression is not None for name in expression.dependencies}
|
|
435
|
+
# event/segment范围条件也是指标的真实依赖。
|
|
436
|
+
available = calculation.operation in _CALCULATIONS and calculation.method == ('zoh' if calculation.operation == 'integral' else None)
|
|
437
|
+
if calculation.scope != 'session':
|
|
438
|
+
# 正常配置已验证;typed负例仍报告unavailable及errors,不以缺引用触发KeyError。
|
|
439
|
+
scope, _, target = calculation.scope.partition(':') if type(calculation.scope) is str else ('', '', '')
|
|
440
|
+
# segment间接关联原活动/点事件条件。
|
|
441
|
+
window = windows.get(target) if scope == 'segment' else None
|
|
442
|
+
event = target if scope == 'event' else None if window is None else window.event
|
|
443
|
+
# 不遗漏仅用于定义统计范围的来源。
|
|
444
|
+
rule = rules.get(event)
|
|
445
|
+
if rule is None:
|
|
446
|
+
available = False
|
|
447
|
+
else:
|
|
448
|
+
used.update(rule.dependencies)
|
|
449
|
+
if rule.rule_type not in _RULES or window is not None and not _window_available(window, rules):
|
|
450
|
+
available = False
|
|
451
|
+
# 排序只用于规范报告,不改变来源调用顺序。
|
|
452
|
+
dependencies = tuple(sorted(used))
|
|
453
|
+
# 数值节点采用有效backend;范围或算子不支持时明确保留unavailable。
|
|
454
|
+
nodes.append(ExplainNode(calculation.calculation_id, 'calculation:' + calculation.operation, dependencies, calculation.unit,
|
|
455
|
+
backend if available else 'unavailable'))
|
|
456
|
+
if type(plan.message_calculations) is tuple:
|
|
457
|
+
for calculation in plan.message_calculations:
|
|
458
|
+
if type(calculation) is not MessageCalculationPlan:
|
|
459
|
+
continue
|
|
460
|
+
try:
|
|
461
|
+
require_message_calculation(calculation, plan.sources, plan.bindings)
|
|
462
|
+
available = True
|
|
463
|
+
except (TypeError, ValueError):
|
|
464
|
+
available = False
|
|
465
|
+
# 参数不伪装成来源列;状态/累计为有序驱动,表达式使用本次真实后端。
|
|
466
|
+
dependencies = calculation.expr.dependencies
|
|
467
|
+
if calculation.disjunction is not None:
|
|
468
|
+
dependencies = tuple(sorted(set((*dependencies, calculation.disjunction.signal))))
|
|
469
|
+
nodes.append(ExplainNode(calculation.calculation_id, 'message_calculation:legacy_sum',
|
|
470
|
+
dependencies, calculation.unit, backend if available else 'unavailable'))
|
|
471
|
+
# 普通样本才有TTL/pre历史;逐消息字段与未引用声明不产生此项需求。
|
|
472
|
+
for name,expected in (('signal_csv',SignalCSVOutput),('can_frames',CANFramesOutput)):
|
|
473
|
+
option=getattr(plan.outputs,name)
|
|
474
|
+
if type(option) is expected:
|
|
475
|
+
dependencies=option.spec.signals if name=='signal_csv' else (option.source,)
|
|
476
|
+
if option.window is not None:
|
|
477
|
+
dependencies=(*dependencies,option.window)
|
|
478
|
+
nodes.append(ExplainNode('outputs.'+name,'output:'+name,dependencies,None,
|
|
479
|
+
backend if validation.execution_ready else 'unavailable'))
|
|
480
|
+
ordinary = () if requirements is None else requirements.ordinary_sample_aliases
|
|
481
|
+
history = {item.definition.name: item.definition.valid_for_ns for item in plan.signals
|
|
482
|
+
if item.definition.name in ordinary}
|
|
483
|
+
# 回看窗口也是必要历史,不能只报告TTL而漏掉新条件保留的片段。
|
|
484
|
+
for rule in plan.rules:
|
|
485
|
+
if rule.rule_type == 'window_delta':
|
|
486
|
+
for name in rule.dependencies:
|
|
487
|
+
if name in history and history[name] is not None:
|
|
488
|
+
history[name] = max(history[name], rule.window_delta.window_ns)
|
|
489
|
+
# pre上下文可能需要原依赖更多历史,仅声明需求,不影响旧读范围。
|
|
490
|
+
for window in plan.windows:
|
|
491
|
+
rule = rules.get(window.event)
|
|
492
|
+
if rule is None:
|
|
493
|
+
continue
|
|
494
|
+
# 同一原依赖保留更大必要上下文。
|
|
495
|
+
for name in rule.dependencies:
|
|
496
|
+
# typed非法计划没有可执行需求,不靠缺失依赖制造历史证明。
|
|
497
|
+
if name in history and history[name] is not None:
|
|
498
|
+
history[name] = max(history[name], window.pre_ns)
|
|
499
|
+
# 片段内指标值/选择条件也可能需要pre历史。
|
|
500
|
+
for calculation in plan.calculations:
|
|
501
|
+
# 仅segment请求会把窗口pre应用于该指标。
|
|
502
|
+
if type(calculation.scope) is str and calculation.scope.startswith('segment:'):
|
|
503
|
+
# 引用已由严格解析器验证。
|
|
504
|
+
window = windows.get(calculation.scope.partition(':')[2])
|
|
505
|
+
if window is None:
|
|
506
|
+
continue
|
|
507
|
+
# 值及选择条件都保留必要历史声明。
|
|
508
|
+
for expression in (calculation.signal, calculation.condition):
|
|
509
|
+
# 未配置选择不制造依赖。
|
|
510
|
+
if expression is not None:
|
|
511
|
+
# 原依赖的有效期与前置上下文pre取较大时长,声明必要历史范围。
|
|
512
|
+
for name in expression.dependencies:
|
|
513
|
+
# 不宣称整任务峰值内存或读取下推。
|
|
514
|
+
if name in history and history[name] is not None:
|
|
515
|
+
history[name] = max(history[name], window.pre_ns)
|
|
516
|
+
# 原样报告配置限额,不能假称其已执行。
|
|
517
|
+
budget = {'memory_budget_bytes': plan.execution.memory_budget_bytes, 'batch_rows': plan.execution.batch_rows,
|
|
518
|
+
'result_buffer_rows': plan.execution.result_buffer_rows, 'spool_quota_bytes': plan.execution.spool_quota_bytes}
|
|
519
|
+
# 冻结所有结果容器以保留当前计划身份。
|
|
520
|
+
return ExplainReport(validation, plan.identity, tuple(item.name for item in plan.sources),
|
|
521
|
+
tuple(nodes), MappingProxyType(history), MappingProxyType(budget), requirements,
|
|
522
|
+
plan.intervals if type(plan.intervals) is IntervalPlan else None,
|
|
523
|
+
plan.diagnostics if type(plan.diagnostics) is DiagnosticPlan else None)
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
"""检查请求/响应点事件配对的公开声明,不读取信号或执行配对。
|
|
2
|
+
|
|
3
|
+
输入是JSON节点或冻结SequencePlan;输出为已验证的计划和联合依赖。
|
|
4
|
+
只引用同计划的点规则,拒绝活动、跨时钟、重名和非法延迟。观测条件直接
|
|
5
|
+
采用响应规则的条件,用户不需要重复配置另一份观测表达式。
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from dataclasses import dataclass
|
|
9
|
+
from .checks import array_at, duration_at, model_at, number_at, object_at, text_at
|
|
10
|
+
from .nodes import register_id
|
|
11
|
+
from ..core.validation import require_identifier
|
|
12
|
+
from ..core.types import TimeType
|
|
13
|
+
from ..timebase.conversion import require_int64_ns
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
@dataclass(frozen=True)
|
|
17
|
+
class SequencePlan:
|
|
18
|
+
"""保存一个FIFO配对声明;延迟包含两端,max_pending限制同时等待的请求数。"""
|
|
19
|
+
|
|
20
|
+
sequence_id: str
|
|
21
|
+
start_rule: str
|
|
22
|
+
response_rule: str
|
|
23
|
+
min_delay_ns: int
|
|
24
|
+
max_delay_ns: int
|
|
25
|
+
max_pending: int = 65536
|
|
26
|
+
|
|
27
|
+
def __post_init__(self):
|
|
28
|
+
"""检查独立字段,不读取其他规则。
|
|
29
|
+
|
|
30
|
+
参数: 无。返回: None。异常: TypeError/ValueError为名称或整数边界错误。
|
|
31
|
+
"""
|
|
32
|
+
for name in (self.sequence_id, self.start_rule, self.response_rule):
|
|
33
|
+
require_identifier(name, 'sequence节点名称')
|
|
34
|
+
if any(type(value) is not int for value in (self.min_delay_ns, self.max_delay_ns, self.max_pending)):
|
|
35
|
+
raise TypeError('sequence延迟和容量须为原生整数')
|
|
36
|
+
if not 0 <= self.min_delay_ns <= self.max_delay_ns or self.max_pending < 1:
|
|
37
|
+
raise ValueError('sequence需要0<=min_delay<=max_delay及正max_pending')
|
|
38
|
+
require_int64_ns(self.min_delay_ns, 'min_delay_ns')
|
|
39
|
+
require_int64_ns(self.max_delay_ns, 'max_delay_ns')
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def sequence_dependencies(item, rules, bindings):
|
|
43
|
+
"""检查两端引用和时钟,返回两规则实际原信号依赖。
|
|
44
|
+
|
|
45
|
+
参数: item为SequencePlan,rules为RulePlan元组,bindings为声明或运行绑定。
|
|
46
|
+
返回: 去重且稳定排序的别名tuple。异常: TypeError/ValueError为不支持的引用或时钟。
|
|
47
|
+
"""
|
|
48
|
+
if type(item) is not SequencePlan:
|
|
49
|
+
raise TypeError('sequences需要SequencePlan')
|
|
50
|
+
catalog = {rule.rule_id: rule for rule in rules}
|
|
51
|
+
dependencies = set()
|
|
52
|
+
for name in (item.start_rule, item.response_rule):
|
|
53
|
+
rule = catalog.get(name)
|
|
54
|
+
if rule is None or rule.rule_type not in ('rising_edge', 'falling_edge', 'start_only'):
|
|
55
|
+
raise ValueError('sequence只引用本计划rising/falling/start_only点规则:' + name)
|
|
56
|
+
dependencies.update(rule.condition.dependencies)
|
|
57
|
+
result = tuple(sorted(dependencies))
|
|
58
|
+
bindings.require_synchronized(result)
|
|
59
|
+
# 常量条件没有信号依赖,但使用dataset观测轴;其隐含时钟也必须与另一端相同。
|
|
60
|
+
if any(not catalog[name].condition.dependencies for name in (item.start_rule, item.response_rule)):
|
|
61
|
+
declared = getattr(bindings, 'declarations', bindings)
|
|
62
|
+
evidenced = {proof.source for proof in declared.synchronization}
|
|
63
|
+
sources = {source.name: source for source in declared.sources}
|
|
64
|
+
for name in result:
|
|
65
|
+
source = sources[bindings.resolve(name).source]
|
|
66
|
+
mapped = (source.timebase == declared.timebase or source.name in evidenced
|
|
67
|
+
or source.timebase.time_type is TimeType.ABSOLUTE and declared.timebase.time_type is TimeType.ABSOLUTE)
|
|
68
|
+
if not mapped:
|
|
69
|
+
raise ValueError('常量规则与响应/请求信号没有共同dataset时钟:' + source.name)
|
|
70
|
+
return result
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def parse_sequences(value, rules, bindings, ids):
|
|
74
|
+
"""解析独立sequences数组,节点ID与规则/窗口/指标共用名称空间。
|
|
75
|
+
|
|
76
|
+
参数: value为JSON数组,rules/bindings为已验证声明,ids为本计划名称集合。
|
|
77
|
+
返回: SequencePlan tuple。异常: PlanValidationError保留非法字段或引用的位置。
|
|
78
|
+
"""
|
|
79
|
+
result = []
|
|
80
|
+
for index, raw in enumerate(array_at(value, '$.sequences')):
|
|
81
|
+
path = f'$.sequences[{index}]'
|
|
82
|
+
raw = object_at(raw, path, ('name', 'start', 'response', 'max_delay'), ('min_delay', 'max_pending'))
|
|
83
|
+
item = model_at(SequencePlan, path, register_id(raw['name'], path + '.name', ids),
|
|
84
|
+
text_at(raw['start'], path + '.start', identifier=True),
|
|
85
|
+
text_at(raw['response'], path + '.response', identifier=True),
|
|
86
|
+
duration_at(raw.get('min_delay', '0s'), path + '.min_delay'),
|
|
87
|
+
duration_at(raw['max_delay'], path + '.max_delay'),
|
|
88
|
+
number_at(raw.get('max_pending', 65536), path + '.max_pending', integer=True, minimum=1))
|
|
89
|
+
model_at(sequence_dependencies, path, item, rules, bindings)
|
|
90
|
+
result.append(item)
|
|
91
|
+
return tuple(result)
|