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,294 @@
|
|
|
1
|
+
"""把分析配置转换成经过静态检查的分析计划。
|
|
2
|
+
|
|
3
|
+
使用入口:
|
|
4
|
+
AnalysisPlan.from_dict(config, base_dir=...)接收一个配置字典。
|
|
5
|
+
load_analysis_plan(path)读取一个JSON/YAML配置文件,再调用from_dict检查内容。
|
|
6
|
+
输出都是AnalysisPlan,其中保存来源、信号、表达式、规则、窗口和指标,
|
|
7
|
+
以及计划采用的计算方式、资源预算和输出格式。
|
|
8
|
+
|
|
9
|
+
处理顺序是:检查字段与版本 → 复制配置 → 检查来源和信号声明
|
|
10
|
+
→ 检查表达式及相互引用 → 保存计划。静态检查是根据配置声明判断
|
|
11
|
+
是否合法,不读取待分析的日志或CSV;省略CAN信号元数据时按需读DBC,不执行计算。
|
|
12
|
+
|
|
13
|
+
from_dict的相对路径以base_dir为基准,省略时使用当前工作目录;
|
|
14
|
+
load_analysis_plan以各定义的声明文件所在目录为基准,一层imports先展开。路径只转换为绝对定位,不读取目标。
|
|
15
|
+
配置字典和列表会复制并冻结,调用者之后修改原配置不会改变计划快照。
|
|
16
|
+
|
|
17
|
+
当前计划支持的来源由parse_sources检查;预设先校验角色并合入公共节点;尚未接入的旧profile、
|
|
18
|
+
旧完整积分兼容和未接入原始输出格式会被拒绝。message_calculations仅显式
|
|
19
|
+
current_message-v1逐消息计算;原帧和重建帧统一由can_frames声明。
|
|
20
|
+
execution中的预算与outputs中的格式
|
|
21
|
+
只是经过检查的声明;实际执行由AnalysisRunner落实,文件发布由AnalysisResult.write负责。
|
|
22
|
+
配置通过不表示本次来源已读取、实际结果或输出已经验证。
|
|
23
|
+
identity用于区分配置和来源定位声明,不证明磁盘上的输入内容已经核实。
|
|
24
|
+
|
|
25
|
+
本模块依赖核心声明模型和planning中的字段检查、来源解析及节点解析。
|
|
26
|
+
from_dict不执行输入I/O;load_analysis_plan只打开指定配置及一层公共定义文件并及时关闭句柄。
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
# 创建不可变模型并计算声明哈希;语法解析交共享配置入口。
|
|
30
|
+
from dataclasses import dataclass
|
|
31
|
+
from hashlib import sha256
|
|
32
|
+
from pathlib import Path
|
|
33
|
+
from collections.abc import Mapping
|
|
34
|
+
# 核心模型提供本计划的名称、来源关系和时间范围检查。
|
|
35
|
+
from ..core.declarations import DeclarationBindings, DeclaredSource
|
|
36
|
+
from ..core.expression import DerivedDefinition, StaticExpression
|
|
37
|
+
from .config_groups import public_errors
|
|
38
|
+
from ..core.models import Interval
|
|
39
|
+
from ..core.types import TimeType
|
|
40
|
+
# 固定CAN配置和profile标识只含静态模型,不导入reader、writer或旧依赖。
|
|
41
|
+
from ..sources.can_spec import LegacyCANSpec
|
|
42
|
+
from ..legacy.records import PROFILE_ID
|
|
43
|
+
# 字段、来源和计算节点分别交给对应解析模块。
|
|
44
|
+
from ..configuration import load_configuration, ConfigurationError
|
|
45
|
+
from ..configuration.diagnostics import locate_error
|
|
46
|
+
from .checks import (PlanValidationError, configuration_error, array_at, canonical, choice_at, coordinate_at, json_value,
|
|
47
|
+
metadata_at, model_at, number_at, object_at, require_json_value, text_at, timezone_at)
|
|
48
|
+
from .inputs import parse_sources, parse_signals
|
|
49
|
+
from .models import DatasetPlan, DerivedPlan, ExecutionPlan, MessageCalculationPlan, CalculationPlan, OutputPlan, RulePlan, SignalPlan, SourcePlan, WindowPlan
|
|
50
|
+
from .message_calculations import parse_message_calculations
|
|
51
|
+
from .legacy_execution import require_can_decode_scope
|
|
52
|
+
from .nodes import expression_at, parse_calculations, parse_rules, parse_windows
|
|
53
|
+
from .preset_models import PresetSpec, RoleBinding
|
|
54
|
+
from .sequences import SequencePlan, parse_sequences
|
|
55
|
+
from .intervals import IntervalPlan, DiagnosticPlan
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
@dataclass(frozen=True)
|
|
59
|
+
class AnalysisPlan:
|
|
60
|
+
"""保存一个会话的分析配置,以及静态检查得到的对象。
|
|
61
|
+
|
|
62
|
+
通过from_dict或load_analysis_plan构建,依次保存输入来源、信号、派生计算、
|
|
63
|
+
条件规则、窗口与指标。实例字段不能重新赋值;原配置及自由元数据
|
|
64
|
+
保存为独立的只读快照,不保留调用者可变字典或列表的引用。
|
|
65
|
+
|
|
66
|
+
bindings只描述“哪个信号来自哪里”,derived_expressions是已检查的
|
|
67
|
+
表达式结构;二者不表示真实数据已经读取或能够直接运行。
|
|
68
|
+
execution与outputs保存执行及输出声明,创建本类不会启动计算或发布文件。
|
|
69
|
+
|
|
70
|
+
identity由配置和来源定位声明计算,用于区分计划;不能据此断言CSV内容、
|
|
71
|
+
实际列、内存使用或分析结果已核实。各次构建的绑定和声明相互独立。
|
|
72
|
+
"""
|
|
73
|
+
|
|
74
|
+
config_version: int # 唯一当前结构版本3;执行接线由能力报告约束。
|
|
75
|
+
dataset: DatasetPlan # 分析对象、会话和请求时间范围。
|
|
76
|
+
sources: tuple[SourcePlan, ...] # 已解析的来源配置,保持用户声明顺序。
|
|
77
|
+
signals: tuple[SignalPlan, ...] # 原字段与信号名称、类型、单位及有效期声明。
|
|
78
|
+
derived: tuple[DerivedPlan, ...] # 由已有信号计算的新信号,例如功率及其元数据。
|
|
79
|
+
rules: tuple[RulePlan, ...] # 已经检查的布尔条件和时序规则。
|
|
80
|
+
windows: tuple[WindowPlan, ...] # 已检查的活动或时间点窗口,以及所引用的规则。
|
|
81
|
+
calculations: tuple[CalculationPlan, ...] # 统计指标及其范围、计算口径、单位和缺失数据策略。
|
|
82
|
+
presets: tuple[PresetSpec, ...] # 原预设v1声明,冻结并保留生成参数。
|
|
83
|
+
preset_bindings: tuple[tuple[RoleBinding, ...], ...] # 本次解析角色的原定义与契约,不继承旧来源。
|
|
84
|
+
execution: ExecutionPlan # 计算方式、分批大小和资源预算声明,尚未实际执行。
|
|
85
|
+
outputs: OutputPlan # 结果表及清单的格式声明,尚未写出文件。
|
|
86
|
+
bindings: DeclarationBindings # 名称与来源之间的声明关系,不含实际读取的信号值。
|
|
87
|
+
derived_expressions: tuple[StaticExpression, ...] # 全部派生表达式的检查结果,已拒绝循环依赖。
|
|
88
|
+
metadata: Mapping # 调用者附加的只读元数据,不改变计算规则。
|
|
89
|
+
raw_config: Mapping # 原配置的独立只读副本。
|
|
90
|
+
base_dir: Path # 相对来源路径的解释基准,保存为绝对路径。
|
|
91
|
+
identity: str # 配置及来源定位声明的SHA-256哈希,不是文件内容哈希。
|
|
92
|
+
message_calculations: tuple[MessageCalculationPlan, ...] = () # 显式当前消息计算;旧位置参数及缺省行为保留。
|
|
93
|
+
sequences: tuple[SequencePlan, ...] = () # 可选点事件FIFO配对;旧计划不增加结果表。
|
|
94
|
+
intervals: 'IntervalPlan | None' = None # 当前记录流的有限间隔声明。
|
|
95
|
+
diagnostics: 'DiagnosticPlan | None' = None # 分别声明追溯、完整性检查与现场留存。
|
|
96
|
+
|
|
97
|
+
@classmethod
|
|
98
|
+
@public_errors
|
|
99
|
+
def from_dict(cls, config: dict, *, base_dir: Path | str | None = None) -> 'AnalysisPlan':
|
|
100
|
+
"""复制配置字典,检查版本3的静态要求;新版本执行能力另行验证。
|
|
101
|
+
|
|
102
|
+
参数:
|
|
103
|
+
config (dict): 使用Python原生字典、列表和标量的分析声明;可由YAML加载取得。
|
|
104
|
+
必填config_version、dataset、sources、signals;derived、rules、windows、
|
|
105
|
+
sequences、calculations、message_calculations、presets、execution、outputs、
|
|
106
|
+
intervals、diagnostics和metadata按需提供。完整结构见用户手册配置字段参考。
|
|
107
|
+
字段、名称、表达式和引用都按对应规则检查。
|
|
108
|
+
base_dir (Path | str | None): 相对来源路径的解释基准;默认None,
|
|
109
|
+
使用当前工作目录。传入Path或文本时转换为绝对路径。
|
|
110
|
+
返回:
|
|
111
|
+
AnalysisPlan: 保存经过静态检查的来源、信号及计算节点。
|
|
112
|
+
raw_config和metadata是独立的只读快照;创建计划不读取分析数据。
|
|
113
|
+
异常:
|
|
114
|
+
PlanValidationError: 字段或版本不合法,名称冲突、表达式或引用错误,
|
|
115
|
+
输入模型不合规,或配置请求尚未接入的能力;错误保留配置位置。
|
|
116
|
+
OSError: 获取当前工作目录或转换路径时发生系统错误,可原样传播。
|
|
117
|
+
处理流程:
|
|
118
|
+
1. 检查顶层字段、复制JSON结构,并核对当前配置结构版本。
|
|
119
|
+
2. 解析来源、会话范围和信号声明,建立本计划的名称与来源关系。
|
|
120
|
+
3. 检查全部派生表达式、规则、窗口、指标及执行和输出选项。
|
|
121
|
+
4. 计算声明哈希并返回计划;此阶段不打开来源文件或执行分析。
|
|
122
|
+
"""
|
|
123
|
+
# 先检查顶层必填项和允许项;附加信息只能放在metadata中。
|
|
124
|
+
if type(config) is dict and 'imports' in config:
|
|
125
|
+
raise PlanValidationError('$.imports','from_dict不读取公共定义文件','unresolved_imports',
|
|
126
|
+
hint='使用load_analysis_plan加载配置文件,或传入config resolve展开后的字典')
|
|
127
|
+
root = object_at(config, '$', ('config_version', 'dataset', 'sources', 'signals'),
|
|
128
|
+
('derived', 'rules', 'windows', 'calculations', 'presets', 'message_calculations', 'sequences', 'execution', 'outputs', 'metadata', 'intervals', 'diagnostics'))
|
|
129
|
+
# 复制并冻结配置,拒绝非JSON值、非有限数和非文本键。
|
|
130
|
+
# 先保留原JSON类型及循环诊断,再冻结,避免tuple被隐式转为合法数组。
|
|
131
|
+
require_json_value(root, '$')
|
|
132
|
+
frozen = metadata_at(root, '$')
|
|
133
|
+
# 用副本继续解析,避免调用者之后修改原配置影响本次检查。
|
|
134
|
+
root = json_value(frozen)
|
|
135
|
+
from .config_groups import normalize_configuration
|
|
136
|
+
root = normalize_configuration(root)
|
|
137
|
+
# 当前唯一结构采用记录间隔和按需输出默认值。
|
|
138
|
+
version = choice_at(root['config_version'], (3,), '$.config_version')
|
|
139
|
+
# 只接受Path或文本路径;这里不读取目标或解析符号链接。
|
|
140
|
+
if base_dir is not None and not isinstance(base_dir, (Path, str)):
|
|
141
|
+
# 拒绝其他对象,避免配置触发自定义路径转换代码。
|
|
142
|
+
raise PlanValidationError('$', 'base_dir必须为Path或文本')
|
|
143
|
+
# 省略base_dir时使用当前工作目录,否则将基准转为绝对路径。
|
|
144
|
+
base = Path.cwd() if base_dir is None else Path(base_dir).absolute()
|
|
145
|
+
# 解析来源配置,保存定位和格式声明;此时仍不打开CSV。
|
|
146
|
+
sources = parse_sources(root['sources'], base)
|
|
147
|
+
# 以首个来源声明的时钟作为分析基准,多源关系在依赖检查时核对。
|
|
148
|
+
timebase = sources[0].config.timebase
|
|
149
|
+
# dataset只接受规定的单对象、单会话和时间范围字段。
|
|
150
|
+
raw_dataset = object_at(root['dataset'], '$.dataset', ('name',), ('entity', 'session', 'domain', 'metadata'))
|
|
151
|
+
# 检查数据集名称,避免把路径或表达式当作标识。
|
|
152
|
+
dataset_id = text_at(raw_dataset['name'], '$.dataset.name', identifier=True)
|
|
153
|
+
# 普通单任务沿用数据集名;对象与会话仍由本次计划实例隔离,不共享状态。
|
|
154
|
+
entity = text_at(raw_dataset.get('entity', dataset_id), '$.dataset.entity', identifier=True)
|
|
155
|
+
session = text_at(raw_dataset.get('session', dataset_id), '$.dataset.session', identifier=True)
|
|
156
|
+
# 省略domain是真正的无时间筛选声明,不制造假端点或实际观测范围。
|
|
157
|
+
domain_explicit = 'domain' in raw_dataset
|
|
158
|
+
domain = None
|
|
159
|
+
if domain_explicit:
|
|
160
|
+
# 只有用户显式请求时间域才解析坐标;显式null仍是配置错误。
|
|
161
|
+
raw_domain = object_at(raw_dataset['domain'], '$.dataset.domain', ('start', 'end'))
|
|
162
|
+
tz = timezone_at(sources[0].timezone_text, '$.dataset.domain.timezone')
|
|
163
|
+
start = coordinate_at(raw_domain['start'], '$.dataset.domain.start', absolute=timebase.time_type is TimeType.ABSOLUTE, tz=tz)
|
|
164
|
+
end = coordinate_at(raw_domain['end'], '$.dataset.domain.end', absolute=timebase.time_type is TimeType.ABSOLUTE, tz=tz)
|
|
165
|
+
domain = model_at(Interval, '$.dataset.domain', start, end)
|
|
166
|
+
# 保存对象、会话、范围和只读元数据,供后续引用。
|
|
167
|
+
dataset = DatasetPlan(dataset_id, entity, session, domain, timebase,
|
|
168
|
+
metadata_at(raw_dataset.get('metadata', {}), '$.dataset.metadata'), domain_explicit)
|
|
169
|
+
# 检查每个信号的原字段、类型、单位转换、有效期和来源定位。
|
|
170
|
+
signals = parse_signals(root['signals'], sources)
|
|
171
|
+
# 延迟导入避免公开预设直接导入时产生模块循环;只对局部副本展开,无来源I/O。
|
|
172
|
+
from ..presets import expand_presets
|
|
173
|
+
presets, preset_bindings = expand_presets(root, tuple(item.definition for item in signals))
|
|
174
|
+
# 派生项按名称组织;类型由表达式推导,不单独指定有效期。
|
|
175
|
+
raw_derived = root.get('derived', {})
|
|
176
|
+
# 派生项必须是名称到配置的字典,不能由数组位置猜名称。
|
|
177
|
+
if type(raw_derived) is not dict:
|
|
178
|
+
# 在建立依赖图之前拒绝错误的派生配置结构。
|
|
179
|
+
raise PlanValidationError('$.derived', 'derived必须为别名对象')
|
|
180
|
+
# 保持用户声明顺序,收集已经检查的派生项。
|
|
181
|
+
derived = []
|
|
182
|
+
# 逐项检查字段与元数据;收集完成后再检查整个表达式依赖图。
|
|
183
|
+
for name, item in raw_derived.items():
|
|
184
|
+
# 记录当前派生项的配置位置,供错误信息定位。
|
|
185
|
+
path = f'$.derived.{name}'
|
|
186
|
+
# 先检查名称是否合法;表达式别名不能包含属性访问语法。
|
|
187
|
+
text_at(name, path, identifier=True)
|
|
188
|
+
# 只接受规定的表达式、单位和可选语义字段,拒绝未知字段。
|
|
189
|
+
item = object_at(item, path, ('expr',), ('unit', 'semantic_id', 'semantic_contract_version', 'sign_convention', 'measurement_location', 'metadata'))
|
|
190
|
+
# 建立派生声明,由核心检查表达式文本和单位是否有效。
|
|
191
|
+
unit = text_at(item['unit'], path + '.unit') if 'unit' in item else None
|
|
192
|
+
definition = model_at(DerivedDefinition, path, name, item['expr'], unit)
|
|
193
|
+
# 保存可选语义信息;名称相同不能证明测量含义一致。
|
|
194
|
+
annotations = tuple(text_at(item[key], path + '.' + key) if key in item else None for key in ('semantic_id', 'semantic_contract_version', 'sign_convention', 'measurement_location'))
|
|
195
|
+
# 保存只读元数据;表达式不能通过对象属性访问这些信息。
|
|
196
|
+
derived.append(DerivedPlan(definition, *annotations, metadata_at(item.get('metadata', {}), path + '.metadata')))
|
|
197
|
+
# 将来源名称、时钟、定位声明和偏移组合为检查用对象。
|
|
198
|
+
declared_sources = tuple(DeclaredSource(item.name, item.config.timebase, item.input_identity, item.config.offset_ns) for item in sources)
|
|
199
|
+
# 在当前会话内统一检查来源、信号和派生名称,建立声明关系。
|
|
200
|
+
bindings = model_at(DeclarationBindings, '$.signals/derived', session, timebase, domain, declared_sources,
|
|
201
|
+
tuple(item.definition for item in signals), tuple(item.definition.name for item in derived))
|
|
202
|
+
# 检查所有派生定义,包括未被引用的项,拒绝未知名称或循环依赖。
|
|
203
|
+
definitions = tuple(item.definition for item in derived)
|
|
204
|
+
# 保存已经检查的表达式结构,不把配置文本当作Python代码执行。
|
|
205
|
+
expressions = tuple(expression_at(item.name, f'$.derived.{item.name}.expr', bindings, definitions, unit=item.unit) for item in definitions)
|
|
206
|
+
# 逐项检查执行选项及默认值;资源预算由实际执行器落实。
|
|
207
|
+
raw_execution = object_at(root.get('execution', {}), '$.execution', (), ('backend', 'batch_rows', 'memory_budget_bytes', 'result_buffer_rows', 'partial_policy', 'on_budget_exceeded', 'spool_quota_bytes'))
|
|
208
|
+
# 只允许'numpy'或'reference',不为未知实现名称自动回退。
|
|
209
|
+
backend = choice_at(raw_execution.get('backend', 'numpy'), ('numpy', 'reference'), '$.execution.backend')
|
|
210
|
+
# 分批行数、内存预算和结果缓冲行数必须为正整数,不能是布尔值。
|
|
211
|
+
limits = tuple(number_at(raw_execution.get(key, default), '$.execution.' + key, integer=True, minimum=1) for key, default in (('batch_rows', 65536), ('memory_budget_bytes', 268435456), ('result_buffer_rows', 4096)))
|
|
212
|
+
# 检查数据覆盖不完整时采用'report'还是'strict'策略。
|
|
213
|
+
partial = choice_at(raw_execution.get('partial_policy', 'report'), ('report', 'strict'), '$.execution.partial_policy')
|
|
214
|
+
# 超出资源预算的处理只接受'error',不允许静默丢数据。
|
|
215
|
+
choice_at(raw_execution.get('on_budget_exceeded', 'error'), ('error',), '$.execution.on_budget_exceeded')
|
|
216
|
+
# 磁盘配额若给出则必须为正整数;None表示没有配置该配额。
|
|
217
|
+
quota = number_at(raw_execution['spool_quota_bytes'], '$.execution.spool_quota_bytes', integer=True, minimum=1) if raw_execution.get('spool_quota_bytes') is not None else None
|
|
218
|
+
# 保存检查后的执行选项,包含本次实际采用的默认值。
|
|
219
|
+
execution = ExecutionPlan(backend, *limits, partial, quota)
|
|
220
|
+
# 规则、窗口和指标共用标识集合,避免同一计划出现重复ID。
|
|
221
|
+
ids = set()
|
|
222
|
+
# 先检查条件和规则,供窗口按当前规则名称建立引用。
|
|
223
|
+
rules = parse_rules(root.get('rules', []), bindings, definitions, ids)
|
|
224
|
+
# 检查活动合并或固定窗口的边界与引用关系。
|
|
225
|
+
windows = parse_windows(root.get('windows', []), rules, ids)
|
|
226
|
+
# 检查指标所用值、条件、统计范围、联合来源依赖和单位。
|
|
227
|
+
calculations = parse_calculations(root.get('calculations', []), bindings, definitions, rules, windows, execution, ids)
|
|
228
|
+
# 新消息模式在同一ID空间解析;不向原配置副本补默认,旧plan身份recipe保持。
|
|
229
|
+
message_calculations = parse_message_calculations(root.get('message_calculations', []), sources, bindings, ids)
|
|
230
|
+
sequences = parse_sequences(root.get('sequences', []), rules, bindings, ids)
|
|
231
|
+
# 检查结果输出配置,此处仅保存格式,不创建输出文件。
|
|
232
|
+
raw_outputs = object_at(root.get('outputs', {}), '$.outputs', (), ('tables', 'manifest', 'contributions','signal_csv','can_frames'))
|
|
233
|
+
# 结果表只接受CSV或JSONL,清单只接受JSON。
|
|
234
|
+
outputs = OutputPlan(choice_at(raw_outputs.get('tables', 'readable_csv'), ('readable_csv', 'csv', 'jsonl'), '$.outputs.tables'), choice_at(raw_outputs.get('manifest', 'json'), ('json',), '$.outputs.manifest'),
|
|
235
|
+
choice_at(raw_outputs.get('contributions', 'none'), ('none', 'full'), '$.outputs.contributions'))
|
|
236
|
+
# 新导出默认关闭;解析只核引用和时间政策,不创建原始读取器或加载DBC。
|
|
237
|
+
from dataclasses import replace
|
|
238
|
+
from .export_options import parse_signal_output,parse_frame_output
|
|
239
|
+
outputs=replace(outputs,signal_csv=parse_signal_output(raw_outputs.get('signal_csv'),signals,windows,sources=sources),
|
|
240
|
+
can_frames=parse_frame_output(raw_outputs.get('can_frames'),sources,windows))
|
|
241
|
+
# 对配置副本和来源定位声明计算哈希,不读取文件内容。
|
|
242
|
+
identity = sha256(canonical({'plan_version': 'config3-static-v1', 'config': frozen, 'sources': [item.input_identity for item in sources]}).encode('utf-8')).hexdigest()
|
|
243
|
+
# 返回完整计划;原配置和附加元数据均保存为独立的只读副本。
|
|
244
|
+
plan = cls(version, dataset, sources, signals, tuple(derived), rules, windows, calculations, presets, preset_bindings, execution, outputs,
|
|
245
|
+
bindings, expressions, metadata_at(root.get('metadata', {}), '$.metadata'), frozen, base, identity,
|
|
246
|
+
message_calculations=message_calculations, sequences=sequences)
|
|
247
|
+
# 在全部消费者已确定后解析有限间隔选择,DBC实际周期留运行初始化。
|
|
248
|
+
from .intervals import parse_intervals, parse_diagnostics
|
|
249
|
+
plan = replace(plan, intervals=parse_intervals(root.get('intervals', {}), plan),
|
|
250
|
+
diagnostics=parse_diagnostics(root.get('diagnostics', {})))
|
|
251
|
+
# 省略范围由同一次读取的实际观测确定,不提前扫描或补造时间端点。
|
|
252
|
+
# 来源策略依赖最终输出与全部节点;完整计划确定后再拒绝不支持的requested组合。
|
|
253
|
+
require_can_decode_scope(plan)
|
|
254
|
+
return plan
|
|
255
|
+
|
|
256
|
+
|
|
257
|
+
|
|
258
|
+
def load_analysis_plan(path: Path | str) -> AnalysisPlan:
|
|
259
|
+
"""读取JSON/YAML配置及一层公共定义,按各自声明目录解释相对来源路径。
|
|
260
|
+
|
|
261
|
+
参数:
|
|
262
|
+
path (Path | str): 配置文件路径;不接受目录扫描或任意路径对象。
|
|
263
|
+
配置按UTF-8读取,允许文件开头带BOM。
|
|
264
|
+
返回:
|
|
265
|
+
AnalysisPlan: 经过from_dict静态检查的计划。只读取主配置和显式公共定义文件,
|
|
266
|
+
不打开其中声明的日志、CSV或DBC。
|
|
267
|
+
异常:
|
|
268
|
+
PlanValidationError: 路径类型错误、文件读取或编码错误、JSON/YAML语法错误、
|
|
269
|
+
重复键、非有限常量或配置声明错误。加载错误带配置文件定位,
|
|
270
|
+
通过原异常链保留更详细的原因。
|
|
271
|
+
副作用:
|
|
272
|
+
打开指定配置文件,正常或异常退出时均关闭句柄;不写文件。
|
|
273
|
+
"""
|
|
274
|
+
# 与from_dict一致,只接受Path或文本配置路径。
|
|
275
|
+
if not isinstance(path, (Path, str)):
|
|
276
|
+
# 类型错误直接定位到配置路径参数。
|
|
277
|
+
raise PlanValidationError('$', '配置路径必须为Path或文本')
|
|
278
|
+
# 转为绝对路径,用于打开指定配置及关联错误位置。
|
|
279
|
+
target = Path(path).absolute()
|
|
280
|
+
# 将文件读取、编码、语法和配置检查错误统一关联到该文件。
|
|
281
|
+
try:
|
|
282
|
+
document = load_configuration(target)
|
|
283
|
+
from ..configuration.imports import expand_document_imports
|
|
284
|
+
document = expand_document_imports(document)
|
|
285
|
+
# 配置文件的词法父目录继续作为相对来源定位基准,不读取来源。
|
|
286
|
+
return AnalysisPlan.from_dict(document.data, base_dir=target.parent)
|
|
287
|
+
except ConfigurationError as error:
|
|
288
|
+
raise configuration_error(error) from error
|
|
289
|
+
except PlanValidationError as error:
|
|
290
|
+
raise locate_error(error,document)
|
|
291
|
+
# 包装读取与配置检查异常,并保留原异常链。
|
|
292
|
+
except (OSError, UnicodeError, ValueError, TypeError) as error:
|
|
293
|
+
# 已有配置错误保留错误码,其他加载错误使用'load_error'。
|
|
294
|
+
raise PlanValidationError('$',str(error),'load_error',source=str(target)) from error
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
"""保存预设v1的公开不可变声明、角色契约及可序列化计划片段。
|
|
2
|
+
|
|
3
|
+
输入JSON参数及类型化信号引用,输出冻结spec、角色追溯和公共节点声明。
|
|
4
|
+
先校验spec结构并深复制参数,再由外部构建器检查工程契约;本模块不运行I/O或分析。
|
|
5
|
+
声明模型独立于构建器/AnalysisPlan,两个入口共用真实类型,避免循环导入及不可解析注解。
|
|
6
|
+
候选语义名仅是领域预设v1本地协议;不建立核心目录,不伪造时钟/来源/工程结论。
|
|
7
|
+
序列化产生独立JSON副本,节点仍须由正常公共编译器检查依赖与单位。
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
# 不可变模型及结构校验不依赖预设算法或公开计划。
|
|
11
|
+
from collections.abc import Mapping
|
|
12
|
+
from dataclasses import dataclass
|
|
13
|
+
from ..core.binding import SignalDefinition
|
|
14
|
+
from ..core.expression import DerivedDefinition
|
|
15
|
+
from ..core.types import SignalDType as D
|
|
16
|
+
from ..core.windows import WindowSpec
|
|
17
|
+
from .checks import (PlanValidationError, choice_at, json_value, metadata_at,
|
|
18
|
+
object_at, require_json_value, text_at)
|
|
19
|
+
from .sequences import SequencePlan
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
@dataclass(frozen=True)
|
|
23
|
+
class RoleContract:
|
|
24
|
+
"""公开本预设版本的角色类型、单位、语义候选、方向与位置要求。
|
|
25
|
+
|
|
26
|
+
有效期必须由SignalDefinition明确提供且正;基础质量使用其固定九位禁用策略。
|
|
27
|
+
semantic_id/version仅用于自动查找,显式绑定仍逐字段检查,不能只凭版本宣称符合。
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
role: str # mode/current/voltage/alarm;不注册全量领域名称。
|
|
31
|
+
dtypes: tuple[D, ...] # 转换后的可接受逻辑类型。
|
|
32
|
+
unit: str # 精确目标单位,关系须verified。
|
|
33
|
+
semantic_id: str # 本模块v1候选标识,大小写敏感。
|
|
34
|
+
sign_convention: str | None = None # 需要时为明确转换后方向。
|
|
35
|
+
measurement_location: str | None = None # 需要时为明确测量位置。
|
|
36
|
+
version: str = '1' # 本公开候选契约版本。
|
|
37
|
+
forbidden_quality: int = 511 # 核心已定义九位基础质量全部禁止。
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
# 每个角色仅声明预设实际需要的内容;无通用汽车/电池本体。
|
|
41
|
+
CHARGE_ROLES = (
|
|
42
|
+
RoleContract('mode', (D.INT64, D.UINT64), '1', 'battery.mode'),
|
|
43
|
+
RoleContract('current', (D.FLOAT64,), 'A', 'battery.current', 'positive_is_charge', 'pack_terminal'),
|
|
44
|
+
RoleContract('voltage', (D.FLOAT64,), 'V', 'battery.voltage', measurement_location='pack_terminal'),
|
|
45
|
+
)
|
|
46
|
+
FAULT_ROLES = (RoleContract('alarm', (D.BOOL,), '1', 'fault.alarm'),)
|
|
47
|
+
COMMAND_ROLES = (RoleContract('request', (D.BOOL,), '1', 'command.request'),
|
|
48
|
+
RoleContract('response', (D.BOOL,), '1', 'command.response'))
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
@dataclass(frozen=True)
|
|
52
|
+
class PresetSpec:
|
|
53
|
+
"""冻结预设ID、preset_type/version、角色别名及工程参数的独立JSON快照。
|
|
54
|
+
|
|
55
|
+
id只用简单标识;role_bindings值只引用当前计划简单别名,不能写领域属性路径。
|
|
56
|
+
parameters不保留调用者可变对象,实际preset_type参数在build_preset中统一校验。
|
|
57
|
+
"""
|
|
58
|
+
|
|
59
|
+
id: str # 生成节点的明确前缀,不自动加后缀解冲突。
|
|
60
|
+
preset_type: str # charge_session、fault_context、command_response或threshold_excursion。
|
|
61
|
+
version: str # 当前仅'1'。
|
|
62
|
+
role_bindings: Mapping # 只读角色→简单别名。
|
|
63
|
+
parameters: Mapping # 深冻结JSON工程声明。
|
|
64
|
+
|
|
65
|
+
def __post_init__(self):
|
|
66
|
+
"""检查公开spec结构并复制冻结,不运行数据计算。
|
|
67
|
+
|
|
68
|
+
参数: 无;读取构造字段。
|
|
69
|
+
返回: None,字段保存独立只读副本。
|
|
70
|
+
异常: PlanValidationError为名称、版本、JSON结构或角色别名错误。
|
|
71
|
+
"""
|
|
72
|
+
# 公共入口与JSON路径使用同一严格名称/版本检查。
|
|
73
|
+
text_at(self.id, '$.preset.name', identifier=True)
|
|
74
|
+
choice_at(self.preset_type, ('charge_session', 'fault_context', 'command_response', 'threshold_excursion'), '$.preset.preset_type')
|
|
75
|
+
choice_at(self.version, ('1',), '$.preset.version')
|
|
76
|
+
# Mapping只用于冻结后再构建;不接受数组或任意对象作声明。
|
|
77
|
+
if not isinstance(self.role_bindings, Mapping) or not isinstance(self.parameters, Mapping):
|
|
78
|
+
raise PlanValidationError('$.preset', 'role_bindings/parameters必须为对象')
|
|
79
|
+
roles = dict(self.role_bindings)
|
|
80
|
+
parameters = dict(self.parameters) if type(self.parameters) is dict else json_value(self.parameters)
|
|
81
|
+
require_json_value(roles, '$.preset.role_bindings')
|
|
82
|
+
require_json_value(parameters, '$.preset.parameters')
|
|
83
|
+
for role, alias in roles.items():
|
|
84
|
+
text_at(role, '$.preset.role_bindings', identifier=True)
|
|
85
|
+
text_at(alias, '$.preset.role_bindings.' + role, identifier=True)
|
|
86
|
+
object.__setattr__(self, 'role_bindings', metadata_at(roles, '$.preset.role_bindings'))
|
|
87
|
+
object.__setattr__(self, 'parameters', metadata_at(parameters, '$.preset.parameters'))
|
|
88
|
+
|
|
89
|
+
@classmethod
|
|
90
|
+
def from_dict(cls, value):
|
|
91
|
+
"""从当前配置的预设对象构造公开不可变声明。
|
|
92
|
+
|
|
93
|
+
参数: value为原生JSON对象,必填name/preset_type/parameters,可选version/role_bindings。
|
|
94
|
+
返回: PresetSpec,role_bindings缺省为空。
|
|
95
|
+
异常: PlanValidationError为未知键、缺项或构造协议错误。
|
|
96
|
+
"""
|
|
97
|
+
# 自由元数据不能借预设参数绕过契约。
|
|
98
|
+
raw = object_at(value, '$.preset', ('name', 'preset_type', 'parameters'), ('version', 'role_bindings'))
|
|
99
|
+
return cls(raw['name'], raw['preset_type'], raw.get('version', '1'), raw.get('role_bindings', {}), raw['parameters'])
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
@dataclass(frozen=True)
|
|
103
|
+
class RoleBinding:
|
|
104
|
+
"""保存已通过字段契约的角色及其原信号定义,供调用者追溯转换与来源。
|
|
105
|
+
|
|
106
|
+
自动/显式查找方式不同,但definition保留完整来源、单位、方向转换和质量身份。
|
|
107
|
+
不保存样本值,也不伪称元数据的物理事实已由系统测量核实。
|
|
108
|
+
"""
|
|
109
|
+
|
|
110
|
+
contract: RoleContract # 本次实际校验的v1角色。
|
|
111
|
+
definition: SignalDefinition # 原不可变完整绑定,包含转换证据。
|
|
112
|
+
resolution: str # explicit或semantic_unique。
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
@dataclass(frozen=True)
|
|
116
|
+
class PresetRule:
|
|
117
|
+
"""保存生成的持续、rising_edge或迟滞声明,尚未绑定来源时钟或执行状态。
|
|
118
|
+
|
|
119
|
+
condition是由合法简单别名/原生有限常量生成的受限DSL;正常计划编译仍检查类型和依赖。
|
|
120
|
+
selection_origin仅持续规则为onset,point没有持续选择;实例不产生事件。
|
|
121
|
+
"""
|
|
122
|
+
|
|
123
|
+
id: str # 生成节点ID。
|
|
124
|
+
rule_type: str # condition_duration、rising_edge或hysteresis。
|
|
125
|
+
condition: str | None # 公共DSL;迟滞改用两个明确条件。
|
|
126
|
+
minimum_duration_ns: int | None = None # condition_duration门槛,单位ns。
|
|
127
|
+
selection_origin: str | None = None # condition_duration为onset。
|
|
128
|
+
emit_initial: bool = False # rising_edge首次初始化政策。
|
|
129
|
+
enter_condition: str | None = None # 迟滞进入条件,普通规则不使用。
|
|
130
|
+
exit_condition: str | None = None # 迟滞退出条件。
|
|
131
|
+
enter_delay_ns: int = 0 # 进入确认等待,纳秒。
|
|
132
|
+
exit_delay_ns: int = 0 # 退出确认等待,纳秒。
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
@dataclass(frozen=True)
|
|
136
|
+
class PresetCalculation:
|
|
137
|
+
"""保存按原活动范围计算的积分或时长声明及独立覆盖/部分结果政策。
|
|
138
|
+
|
|
139
|
+
积分signal是公共信号或派生别名,unit为Wh/Ah;condition_duration用明确BOOL条件和秒。
|
|
140
|
+
partial_policy=None表示继承execution,不是默认强制strict;覆盖质量由既有CalculationDefinition判断。
|
|
141
|
+
"""
|
|
142
|
+
|
|
143
|
+
id: str # 生成指标ID。
|
|
144
|
+
scope: str # event:生成活动ID。
|
|
145
|
+
signal: str | None # 简单别名;condition-only duration不提供。
|
|
146
|
+
unit: str # 明确积分输出单位。
|
|
147
|
+
minimum_coverage: int | float = 0 # 0—1,只影响覆盖质量判断。
|
|
148
|
+
partial_policy: str | None = None # 未提供则由完整计划执行选项继承。
|
|
149
|
+
operation: str = 'integral' # integral或按实际事件区间计算duration。
|
|
150
|
+
condition: str | None = None # duration可用恒真条件计整个已知活动区间。
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
@dataclass(frozen=True)
|
|
154
|
+
class PlanFragment:
|
|
155
|
+
"""保存预设生成的公共节点,不含来源、执行器或真实样本。
|
|
156
|
+
|
|
157
|
+
derived/rules/windows/calculations/sequences为类型化不可变tuple;序列化只是声明副本。
|
|
158
|
+
ID不隐式改变,合入完整计划时继续检查用户节点及其他预设冲突。
|
|
159
|
+
"""
|
|
160
|
+
|
|
161
|
+
derived: tuple[DerivedDefinition, ...] = ()
|
|
162
|
+
rules: tuple[PresetRule, ...] = ()
|
|
163
|
+
windows: tuple[WindowSpec, ...] = ()
|
|
164
|
+
calculations: tuple[PresetCalculation, ...] = ()
|
|
165
|
+
sequences: tuple[SequencePlan, ...] = () # 可选点事件配对声明;空值不输出sequences键。
|
|
166
|
+
|
|
167
|
+
def to_dict(self):
|
|
168
|
+
"""将类型化片段序列化为当前配置节点副本;没有配对时省略空sequences键。
|
|
169
|
+
|
|
170
|
+
参数: 无;读取生成的不可变声明。
|
|
171
|
+
返回: dict,可合入AnalysisPlan.from_dict;不含伪造来源或执行结果。
|
|
172
|
+
异常: 无主动异常;实例由build_preset构造。
|
|
173
|
+
"""
|
|
174
|
+
# 派生元数据不伪造领域意义,公共名称与表达式保持。
|
|
175
|
+
derived = {item.name: {'expr': item.expr, 'unit': item.unit} for item in self.derived}
|
|
176
|
+
rules, windows, calculations = [], [], []
|
|
177
|
+
for item in self.rules:
|
|
178
|
+
row = {'name': item.id, 'rule_type': item.rule_type}
|
|
179
|
+
if item.rule_type == 'hysteresis':
|
|
180
|
+
row.update(enter_condition=item.enter_condition, exit_condition=item.exit_condition,
|
|
181
|
+
enter_delay=f'{item.enter_delay_ns}ns', exit_delay=f'{item.exit_delay_ns}ns')
|
|
182
|
+
rules.append(row)
|
|
183
|
+
continue
|
|
184
|
+
row['condition'] = item.condition
|
|
185
|
+
if item.rule_type == 'condition_duration':
|
|
186
|
+
row.update(minimum_duration=f'{item.minimum_duration_ns}ns', selection_origin=item.selection_origin)
|
|
187
|
+
else:
|
|
188
|
+
row['emit_initial'] = item.emit_initial
|
|
189
|
+
rules.append(row)
|
|
190
|
+
for item in self.windows:
|
|
191
|
+
windows.append({'name': item.window_id, 'rule': item.event_rule_id, 'anchor': item.anchor,
|
|
192
|
+
'pre': f'{item.pre_ns}ns', 'post': f'{item.post_ns}ns', 'merge': item.merge})
|
|
193
|
+
for item in self.calculations:
|
|
194
|
+
row = {'name': item.id, 'scope': item.scope, 'operation': item.operation, 'unit': item.unit,
|
|
195
|
+
'minimum_coverage': item.minimum_coverage}
|
|
196
|
+
if item.signal is not None:
|
|
197
|
+
row['expr'] = item.signal
|
|
198
|
+
if item.condition is not None:
|
|
199
|
+
row['condition'] = item.condition
|
|
200
|
+
if item.operation == 'integral':
|
|
201
|
+
row['method'] = 'zoh'
|
|
202
|
+
if item.partial_policy is not None:
|
|
203
|
+
row['partial_policy'] = item.partial_policy
|
|
204
|
+
calculations.append(row)
|
|
205
|
+
result = {'derived': derived, 'rules': rules, 'windows': windows, 'calculations': calculations}
|
|
206
|
+
if self.sequences:
|
|
207
|
+
result['sequences'] = [dict(name=item.sequence_id, start=item.start_rule, response=item.response_rule,
|
|
208
|
+
min_delay=f'{item.min_delay_ns}ns', max_delay=f'{item.max_delay_ns}ns', max_pending=item.max_pending)
|
|
209
|
+
for item in self.sequences]
|
|
210
|
+
from .config_groups import public_configuration
|
|
211
|
+
return public_configuration(result)
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"""声明新记录流当前可执行范围;静态报告与实际会话共用同一检查。
|
|
2
|
+
|
|
3
|
+
这里只检查有限配置,不读取来源,不把尚未接线的能力报为已支持。
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def is_event_duration(request):
|
|
8
|
+
"""识别事件总时长的静态声明,不导入执行层。参数: 指标请求。返回: bool。异常: 无。"""
|
|
9
|
+
return (request.scope.startswith('event:') and request.operation=='duration' and request.signal is None
|
|
10
|
+
and request.condition is not None and request.condition.root.operator=='const'
|
|
11
|
+
and request.condition.root.value is True)
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def record_execution_errors(plan):
|
|
15
|
+
"""检查会话时间指标的已接线路径。
|
|
16
|
+
|
|
17
|
+
参数: 已编译计划。返回: 错误tuple,空值表示当前组合可执行。
|
|
18
|
+
异常: 非法typed对象属性错误传播;不访问文件或修改计划。
|
|
19
|
+
"""
|
|
20
|
+
errors = []
|
|
21
|
+
# typed计划也不能让无DBC来源携带未确定的有效期;不靠读取数据猜周期。
|
|
22
|
+
sources = {source.name: source for source in plan.sources}
|
|
23
|
+
for signal in plan.signals:
|
|
24
|
+
definition = signal.definition
|
|
25
|
+
source = sources.get(definition.source)
|
|
26
|
+
if definition.valid_for_ns is None and (source is None or
|
|
27
|
+
source.source_type not in ('can_blf', 'can_asc', 'asc_or_blf', 'raw_can_csv')):
|
|
28
|
+
errors.append(definition.name + '没有DBC周期依据;请填写本信号period或valid_for')
|
|
29
|
+
if not (plan.calculations or plan.message_calculations or plan.rules or plan.outputs.can_frames or plan.outputs.signal_csv) or any((item.scope != 'session' and not item.scope.startswith(('event:','segment:'))) or item.operation not in
|
|
30
|
+
('integral', 'duration', 'min_time', 'max_time', 'time_weighted_mean','sample_minimum','sample_maximum','sample_mean','select') for item in plan.calculations):
|
|
31
|
+
errors.append('当前配置当前接入会话积分及时间统计')
|
|
32
|
+
choices = dict(plan.intervals.resolved)
|
|
33
|
+
if any(item.calculation_id not in choices for item in plan.calculations if item.operation not in ('sample_minimum','sample_maximum','sample_mean','select')):
|
|
34
|
+
errors.append('当前配置指标缺少已解析间隔选择')
|
|
35
|
+
names, value_names = set(), set()
|
|
36
|
+
for request in plan.rules:
|
|
37
|
+
names.update(request.dependencies)
|
|
38
|
+
value_names.update(request.dependencies)
|
|
39
|
+
choice=choices.get(request.rule_id)
|
|
40
|
+
if choice is None and request.rule_type not in ('rising_edge','falling_edge'):
|
|
41
|
+
errors.append('当前配置规则缺少已解析间隔选择')
|
|
42
|
+
elif choice is not None and choice.driver is not None:
|
|
43
|
+
names.add(choice.driver)
|
|
44
|
+
for calculation in plan.calculations:
|
|
45
|
+
for expression in (calculation.signal, calculation.condition):
|
|
46
|
+
if expression is not None:
|
|
47
|
+
names.update(expression.dependencies)
|
|
48
|
+
value_names.update(expression.dependencies)
|
|
49
|
+
choice = choices.get(calculation.calculation_id)
|
|
50
|
+
if choice is not None and choice.driver is not None:
|
|
51
|
+
names.add(choice.driver)
|
|
52
|
+
for request in plan.sequences:
|
|
53
|
+
choice=choices.get(request.sequence_id)
|
|
54
|
+
if choice is None:
|
|
55
|
+
errors.append('当前配置配对缺少已解析间隔选择')
|
|
56
|
+
elif choice.driver is not None:
|
|
57
|
+
names.add(choice.driver)
|
|
58
|
+
for window in plan.windows:
|
|
59
|
+
choice=choices.get(window.window_id)
|
|
60
|
+
if choice is not None and choice.driver is not None:
|
|
61
|
+
names.add(choice.driver)
|
|
62
|
+
if plan.outputs.signal_csv is not None:
|
|
63
|
+
names.update(plan.outputs.signal_csv.spec.signals)
|
|
64
|
+
needed = {item.definition.source for item in plan.signals if item.definition.name in names}
|
|
65
|
+
needed.update(item.source for item in plan.message_calculations)
|
|
66
|
+
if plan.outputs.can_frames is not None:
|
|
67
|
+
needed.add(plan.outputs.can_frames.source)
|
|
68
|
+
if any(not rule.dependencies and (choices.get(rule.rule_id) is None or
|
|
69
|
+
choices[rule.rule_id].driver is None) for rule in plan.rules) or any(
|
|
70
|
+
calculation.scope=='session' and (choices.get(calculation.calculation_id) is None or choices[calculation.calculation_id].driver is None)
|
|
71
|
+
and not any(e.dependencies for e in (calculation.signal,calculation.condition) if e is not None) for calculation in plan.calculations):
|
|
72
|
+
needed.update(source.name for source in plan.sources)
|
|
73
|
+
if not needed or any(item.source_type not in ('can_blf', 'can_asc', 'asc_or_blf', 'raw_can_csv', 'memory', 'signal_csv')
|
|
74
|
+
for item in plan.sources if item.name in needed):
|
|
75
|
+
errors.append('当前配置需要已声明且支持的观测来源')
|
|
76
|
+
return tuple(errors)
|