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,642 @@
|
|
|
1
|
+
"""把表达式文本和信号声明转换成经过检查的表达式树。
|
|
2
|
+
|
|
3
|
+
例如,已绑定的voltage和current可用于voltage * current;编译器检查
|
|
4
|
+
名称、类型、单位和依赖,输出结果类型、单位、实际信号依赖及绑定身份。
|
|
5
|
+
表达式使用受限语法(DSL):仅接受明确允许的语法树节点和注册函数,
|
|
6
|
+
不执行Python代码,不访问任意对象,也不读取日志或加载DBC。
|
|
7
|
+
|
|
8
|
+
compile_expression接收真实SignalBindings、关联实际解码证据的DecodedBindings,
|
|
9
|
+
或独立消息仓MessageBindings,输出供解释器使用的CompiledExpression;实际
|
|
10
|
+
证据由执行层完整核实后提供。validate_expression接收DeclarationBindings或
|
|
11
|
+
MessageDeclarations,只产生不可执行的StaticExpression。
|
|
12
|
+
两者均检查完整派生声明与循环依赖;数字常量按运算上下文检查单位和定宽。
|
|
13
|
+
整数比较的常量边界保留精确Python整数,不因超过定宽范围而先舍入为浮点数。
|
|
14
|
+
|
|
15
|
+
标量与数组解释器共享已检查的树,数值计算各自独立。本模块只依赖标准库
|
|
16
|
+
及核心声明模型;编译状态每次新建,不修改输入,也没有跨计划的执行缓存。
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
# AST只用于解析与规范身份,不用动态执行。
|
|
20
|
+
import ast
|
|
21
|
+
# 冻结节点和纯常量上下文重建,没有全局执行绑定缓存。
|
|
22
|
+
from dataclasses import dataclass, replace
|
|
23
|
+
# SHA关联实际输入绑定和编译语义版本。
|
|
24
|
+
from hashlib import sha256
|
|
25
|
+
# 数字字面量必须有限,不允许非有限容差。
|
|
26
|
+
from math import isfinite
|
|
27
|
+
# 原始派生声明只读保存,不修改调用侧映射。
|
|
28
|
+
from types import MappingProxyType
|
|
29
|
+
|
|
30
|
+
# 使用当前已校验绑定、类型及静态数值协议。
|
|
31
|
+
from .binding import SignalBindings, _identity
|
|
32
|
+
# 静态配置声明独立于真实输入;只由专用validate入口接收。
|
|
33
|
+
from .declarations import DeclarationBindings
|
|
34
|
+
# 已解码运行绑定不保存伪造memory行,仍与不可执行声明类型分开。
|
|
35
|
+
from .decoded_binding import DecodedBindings
|
|
36
|
+
# 当前消息的参数/运行域有独立typed入口,不伪装普通历史或TTL绑定。
|
|
37
|
+
from .message_binding import MessageBindings, MessageDeclarations
|
|
38
|
+
# 定宽/运算声明可共享,编译不调用被测数组或参考数据运算。
|
|
39
|
+
from .numeric import INTEGER_BOUNDS, result_dtype
|
|
40
|
+
# 类型与质量模型显式,不用字符串冒充dtype。
|
|
41
|
+
from .types import SignalDType
|
|
42
|
+
# 已知单位表仅检查当前显式标签,不猜物理工程含义。
|
|
43
|
+
from .units import UNIT_TABLE
|
|
44
|
+
# 文本与标识符保留安全名称和大小写。
|
|
45
|
+
from .validation import require_identifier, require_text
|
|
46
|
+
|
|
47
|
+
# 运算符映射固定,禁止幂/取模/位运算等未支持语法。
|
|
48
|
+
BINOPS = MappingProxyType({ast.Add: 'add', ast.Sub: 'sub', ast.Mult: 'mul', ast.Div: 'div'})
|
|
49
|
+
# 首版比较白名单,链式比较另展开为三值and。
|
|
50
|
+
CMP = MappingProxyType({ast.Eq: 'eq', ast.NotEq: 'ne', ast.Lt: 'lt', ast.LtE: 'le', ast.Gt: 'gt', ast.GtE: 'ge'})
|
|
51
|
+
# 常量在左侧时反向精确整数比较,不能转float。
|
|
52
|
+
REVERSE_CMP = MappingProxyType({'eq': 'eq', 'ne': 'ne', 'lt': 'gt', 'le': 'ge', 'gt': 'lt', 'ge': 'le'})
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
@dataclass(frozen=True)
|
|
56
|
+
class DerivedDefinition:
|
|
57
|
+
"""声明一个由现有信号计算得到的新名称、表达式和结果单位。
|
|
58
|
+
|
|
59
|
+
name与原信号共用名称空间,需在bindings.derived_names中预先登记。
|
|
60
|
+
构造本类只检查文本和名称;表达式编译时才检查单位、依赖和循环引用。
|
|
61
|
+
unit省略时由表达式支持的单位关系推导;显式标签不授权猜测物理量纲,未知单位组合仍保留unverified状态,
|
|
62
|
+
表示关系未验证。实例不可重新赋值,不保存信号值或运行中的状态。
|
|
63
|
+
"""
|
|
64
|
+
|
|
65
|
+
name: str # 已在bindings.derived_names登记的简单别名。
|
|
66
|
+
expr: str # 白名单DSL文本,不是任意Python。
|
|
67
|
+
unit: str | None = None # 缺省使用表达式已支持的单位关系。
|
|
68
|
+
|
|
69
|
+
def __post_init__(self) -> None:
|
|
70
|
+
"""验证派生声明结构,不解析或加载来源。
|
|
71
|
+
|
|
72
|
+
参数: 无;读取name/expr/unit。
|
|
73
|
+
返回: None,不改用户声明。
|
|
74
|
+
异常: TypeError/ValueError为标识符/空文本问题。
|
|
75
|
+
"""
|
|
76
|
+
# 派生与signal名称采用同一规则。
|
|
77
|
+
require_identifier(self.name, 'derived.name')
|
|
78
|
+
# 不允许空表达式占位。
|
|
79
|
+
require_text(self.expr, 'derived.expr')
|
|
80
|
+
# 未知标签可以显式声明,但不能假称单位已验证。
|
|
81
|
+
if self.unit is not None:
|
|
82
|
+
require_text(self.unit, 'derived.unit')
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
@dataclass(frozen=True)
|
|
86
|
+
class ExprNode:
|
|
87
|
+
"""保存表达式编译器已检查的一个内部节点。
|
|
88
|
+
|
|
89
|
+
operator给出注册操作,args保存不可变子节点,dtype和unit说明结果类型与单位。
|
|
90
|
+
aliases记录展开后的原信号依赖,运行时只按简单别名取值,不访问属性路径。
|
|
91
|
+
constant说明整棵子树只由字面量组成;编译器可据此赋予常量上下文单位和
|
|
92
|
+
整数类型,不能借此改变信号本身的类型。unit_status保留单位是否已验证。
|
|
93
|
+
节点不保存样本值缓存,解释器的计算结果仅在当前一次求值中保存。
|
|
94
|
+
"""
|
|
95
|
+
|
|
96
|
+
operator: str # const/name/add等固定执行分派。
|
|
97
|
+
dtype: SignalDType # 静态目标类型。
|
|
98
|
+
unit: str # 结果单位标签。
|
|
99
|
+
unit_status: str # verified或unverified,不能借未知标签过预设。
|
|
100
|
+
args: tuple = () # 子节点,isclose含四节点。
|
|
101
|
+
value: int | float | bool | str | None = None # 纯常量或精确比较边界。
|
|
102
|
+
name: str | None = None # name仅简单已绑定别名。
|
|
103
|
+
labels: tuple[str, ...] = () # enum逻辑域。
|
|
104
|
+
aliases: tuple[str, ...] = () # 原信号依赖,不包含派生占位。
|
|
105
|
+
constant: bool = False # 纯常量静态上下文标志。
|
|
106
|
+
allow_float_literal: bool = False # 由本编译器证明的浮点字面量路径。
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
@dataclass(frozen=True)
|
|
110
|
+
class CompiledExpression:
|
|
111
|
+
"""保存可供求值器使用的表达式树及其真实输入绑定。
|
|
112
|
+
|
|
113
|
+
root已检查语法、类型与单位;dependencies只包含展开后的原信号别名。
|
|
114
|
+
identity关联绑定、派生定义、规范语法树和编译版本。改变会话、字段映射、
|
|
115
|
+
有效期或转换声明都会影响身份,解释器要求调用时bindings与编译时一致。
|
|
116
|
+
实例不可重新赋值,没有全局执行缓存;创建本对象并不执行数值计算。
|
|
117
|
+
"""
|
|
118
|
+
|
|
119
|
+
text: str # 原表达式仅供定位,不动态执行。
|
|
120
|
+
bindings: SignalBindings | DecodedBindings | MessageBindings # 各自真实输入域的运行身份。
|
|
121
|
+
root: ExprNode # 实际白名单typed树。
|
|
122
|
+
dependencies: tuple[str, ...] # 实际需要的已解码信号列。
|
|
123
|
+
normalized_ast: str # 不含位置的AST规范结构。
|
|
124
|
+
identity: str # 完整执行身份SHA。
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
@dataclass(frozen=True)
|
|
128
|
+
class StaticExpression:
|
|
129
|
+
"""保存只经声明校验的DSL树,不能交给数值解释器执行。
|
|
130
|
+
|
|
131
|
+
identity证明配置/语法/转换声明,尚未证明输入内容、字段和观测。
|
|
132
|
+
与CompiledExpression类型分开,运行时必须核实来源后重新绑定。
|
|
133
|
+
"""
|
|
134
|
+
|
|
135
|
+
text: str # 原DSL,仅用于定位。
|
|
136
|
+
bindings: DeclarationBindings | MessageDeclarations # 声明身份,没有实际读入证明。
|
|
137
|
+
root: ExprNode # 白名单类型/单位已经校验。
|
|
138
|
+
dependencies: tuple[str, ...] # 展开后的原信号依赖。
|
|
139
|
+
normalized_ast: str # 规范语法,仅供静态身份。
|
|
140
|
+
identity: str # 独立静态版本前缀的SHA。
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
def _node(operator, dtype, unit, args=(), **kwargs) -> ExprNode:
|
|
144
|
+
"""从已验证子节点汇总局部依赖及单位状态。
|
|
145
|
+
|
|
146
|
+
参数: operator/dtype/unit及args;kwargs为已验证内部字段。
|
|
147
|
+
返回: 冻结ExprNode;不进行样本计算。
|
|
148
|
+
异常: 内部参数冲突传播,配置由编译器先验证。
|
|
149
|
+
"""
|
|
150
|
+
# 当前表达式所有真实依赖,不继承全局绑定。
|
|
151
|
+
aliases = tuple(sorted({name for arg in args for name in arg.aliases}))
|
|
152
|
+
# 任何未知关系都保留unverified,不能仅看输出单位是已知标签。
|
|
153
|
+
status = 'verified' if unit in UNIT_TABLE and all(arg.unit_status == 'verified' for arg in args) else 'unverified'
|
|
154
|
+
# 所有参数均由编译器产生,执行器不接用户自由operator。
|
|
155
|
+
return ExprNode(operator, dtype, unit, status, args, aliases=aliases, constant=all(arg.constant for arg in args), **kwargs)
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
class _Compiler:
|
|
159
|
+
"""在一次编译中检查名称、语法、单位与派生依赖。
|
|
160
|
+
|
|
161
|
+
signals和derived来自当前绑定,不读取数据来源。消息域另有显式参数表,
|
|
162
|
+
参数按const执行但保constant=False,不随对方改变单位。nodes仅在本实例
|
|
163
|
+
内复用已编译的派生树;visiting记录当前递归路径,用于指出循环依赖。
|
|
164
|
+
根表达式的declared_unit可给未知组合提供显式标签,但不证明该量纲正确。
|
|
165
|
+
状态不跨编译调用共享,不缓存信号值,也不扩大受限表达式语法。
|
|
166
|
+
"""
|
|
167
|
+
|
|
168
|
+
def __init__(self, bindings, derived):
|
|
169
|
+
"""建立当前声明表并校验完整派生输入。
|
|
170
|
+
|
|
171
|
+
参数: bindings为明确typed普通/消息运行绑定或各自静态声明;
|
|
172
|
+
derived为tuple DerivedDefinition,数值执行仍由公开入口的类型门槛控制。
|
|
173
|
+
返回: None,仅局部解析状态。
|
|
174
|
+
异常: TypeError/ValueError为类型/缺项/重复/名称空间不一致。
|
|
175
|
+
"""
|
|
176
|
+
# 不接无类型计划或可变派生列表。
|
|
177
|
+
if not isinstance(bindings, (SignalBindings, DecodedBindings, DeclarationBindings, MessageBindings, MessageDeclarations)) or not isinstance(derived, tuple) or any(not isinstance(item, DerivedDefinition) for item in derived):
|
|
178
|
+
# 结构错误先于解析/执行。
|
|
179
|
+
raise TypeError('解析需要typed真实/声明绑定及tuple DerivedDefinition')
|
|
180
|
+
# bindings已校验signals唯一/安全别名。
|
|
181
|
+
self.bindings = bindings
|
|
182
|
+
# 当前真实信号声明,不读取原日志。
|
|
183
|
+
self.signals = {item.name: item for item in bindings.signals}
|
|
184
|
+
# 只有消息域具有显式配置参数;原普通表达式不增加名称或混合dtype权限。
|
|
185
|
+
self.message_domain = isinstance(bindings, (MessageBindings, MessageDeclarations))
|
|
186
|
+
self.parameters = {item.name: item for item in bindings.parameters} if self.message_domain else {}
|
|
187
|
+
# 重复派生声明不能靠字典覆盖隐藏。
|
|
188
|
+
if len({item.name for item in derived}) != len(derived) or set(item.name for item in derived) != set(bindings.derived_names):
|
|
189
|
+
# 登记名称不等于表达式已经接线。
|
|
190
|
+
raise ValueError('derived声明与bindings名称不一致或重复')
|
|
191
|
+
# 显式派生表自有副本,只读保存。
|
|
192
|
+
self.derived = MappingProxyType({item.name: item for item in derived})
|
|
193
|
+
# 本次缓存没有上次任务的节点/值。
|
|
194
|
+
self.nodes = {}
|
|
195
|
+
# 栈只用于完整依赖环诊断。
|
|
196
|
+
self.visiting = []
|
|
197
|
+
|
|
198
|
+
def _error(self, node, message):
|
|
199
|
+
"""给出语法位置、拒绝原因与可用别名。
|
|
200
|
+
|
|
201
|
+
参数: node为AST节点,message为具体失败原因。
|
|
202
|
+
返回: 不返回,抛ValueError。
|
|
203
|
+
异常: ValueError定位行/列,不自动点号改名。
|
|
204
|
+
"""
|
|
205
|
+
# AST位置从0列转用户可读1列;别名只来自当前计划。
|
|
206
|
+
raise ValueError(f'行{getattr(node, "lineno", 1)}列{getattr(node, "col_offset", 0)+1}:{message};可用别名:{", ".join((*self.signals, *self.derived, *self.parameters))}')
|
|
207
|
+
|
|
208
|
+
def parse(self, text, unit=None):
|
|
209
|
+
"""解析一个表达式并验证根结果单位/枚举域。
|
|
210
|
+
|
|
211
|
+
参数: text为非空DSL;unit为可选显式结果单位。
|
|
212
|
+
返回: typed ExprNode和规范AST。
|
|
213
|
+
异常: ValueError为语法/白名单/类型/单位/环;不吞I/O异常。
|
|
214
|
+
"""
|
|
215
|
+
# 文本不可空,也不接受任意对象str隐式转换。
|
|
216
|
+
require_text(text, 'expression')
|
|
217
|
+
# 显式单位保留原标签。
|
|
218
|
+
if unit is not None:
|
|
219
|
+
# unknown可以声明,但状态仍unverified。
|
|
220
|
+
require_text(unit, 'expression.unit')
|
|
221
|
+
# Python仅解析eval模式,赋值/多条语句自然失败。
|
|
222
|
+
try:
|
|
223
|
+
# 不执行解析所得对象。
|
|
224
|
+
tree = ast.parse(text, mode='eval')
|
|
225
|
+
except SyntaxError as error:
|
|
226
|
+
# 用户语法错是执行前配置错误。
|
|
227
|
+
raise ValueError(f'表达式语法错误:行{error.lineno}列{error.offset} {error.msg}') from error
|
|
228
|
+
# 根声明单位只用于当前层,嵌套未知组合需独立派生声明。
|
|
229
|
+
root = self.visit(tree.body, declared_unit=unit)
|
|
230
|
+
# 原始字符串literal不能作为任意字符串表达式执行。
|
|
231
|
+
if root.dtype is SignalDType.ENUM and not root.labels:
|
|
232
|
+
# 字符串只有显式枚举比较才能获得合法域。
|
|
233
|
+
self._error(tree.body, '字符串仅允许声明枚举域内的eq/ne')
|
|
234
|
+
# 纯整数根也必须属于64位类型,不定义额外无界输出。
|
|
235
|
+
if root.operator == 'const' and root.dtype in INTEGER_BOUNDS and not INTEGER_BOUNDS[root.dtype][0] <= root.value <= INTEGER_BOUNDS[root.dtype][1]:
|
|
236
|
+
# 超大比较边界已通过特殊节点实现,正常输出不放行。
|
|
237
|
+
self._error(tree.body, '整数字面量超出结果dtype')
|
|
238
|
+
# 有单位结果不能靠unit字段自动做隐式转换。
|
|
239
|
+
if unit is not None and root.unit != unit:
|
|
240
|
+
# mA→A需要绑定显式转换,而非只改输出标签。
|
|
241
|
+
self._error(tree.body, f'结果单位{root.unit}与声明{unit}不一致,须显式转换')
|
|
242
|
+
# AST仅作为身份结构,不作为运行时eval输入。
|
|
243
|
+
return root, ast.dump(tree, annotate_fields=True, include_attributes=False)
|
|
244
|
+
|
|
245
|
+
def _name(self, node):
|
|
246
|
+
"""解析真实别名、消息参数或本计划派生,并拒绝环/未知名称。
|
|
247
|
+
|
|
248
|
+
参数: node为Name AST。
|
|
249
|
+
返回: 已绑定name节点或已编译派生树。
|
|
250
|
+
异常: ValueError为未知别名/环/派生表达式错误。
|
|
251
|
+
"""
|
|
252
|
+
# 普通分析只按当前显式别名查找,不读取semantic属性。
|
|
253
|
+
if node.id in self.signals:
|
|
254
|
+
# 原始定义含dtype/unit及固定enum域。
|
|
255
|
+
definition = self.signals[node.id]
|
|
256
|
+
# 多码同标签保留首次域顺序。
|
|
257
|
+
labels = tuple(dict.fromkeys(value for _, value in definition.choices)) if definition.dtype is SignalDType.ENUM else ()
|
|
258
|
+
# 未知标签/关系仍unverified,name不是常量。
|
|
259
|
+
return ExprNode('name', definition.dtype, definition.unit, definition.unit_status, name=node.id, labels=labels, aliases=(node.id,))
|
|
260
|
+
# 有单位参数按const执行,但不是裸literal;不可继承对方单位,也不是原信号依赖。
|
|
261
|
+
if node.id in self.parameters:
|
|
262
|
+
parameter = self.parameters[node.id]
|
|
263
|
+
return ExprNode('const', parameter.dtype, parameter.unit, parameter.unit_status,
|
|
264
|
+
value=parameter.value, name=node.id, constant=False)
|
|
265
|
+
# 派生节点只在当前输入声明下复用。
|
|
266
|
+
if node.id in self.nodes:
|
|
267
|
+
# 不使用其他计划同名缓存。
|
|
268
|
+
return self.nodes[node.id]
|
|
269
|
+
# 访问栈包含同名证明环,须执行前拒绝。
|
|
270
|
+
if node.id in self.visiting:
|
|
271
|
+
# 保留完整依赖路径便于配置修正。
|
|
272
|
+
self._error(node, '派生循环依赖:'+' -> '.join((*self.visiting, node.id)))
|
|
273
|
+
# 未知名字不能推测原字段或语义名称。
|
|
274
|
+
if node.id not in self.derived:
|
|
275
|
+
# 错误提供当前可用名称。
|
|
276
|
+
self._error(node, f'未知别名{node.id}')
|
|
277
|
+
# 开始解析当前派生节点的依赖。
|
|
278
|
+
self.visiting.append(node.id)
|
|
279
|
+
# 派生表达式和明确单位必须真正接线。
|
|
280
|
+
definition = self.derived[node.id]
|
|
281
|
+
# 根单位校验由parse统一实施。
|
|
282
|
+
result, _ = self.parse(definition.expr, definition.unit)
|
|
283
|
+
# 成功后移除递归栈当前节点。
|
|
284
|
+
self.visiting.pop()
|
|
285
|
+
# 本次节点缓存仅存静态树,无信号值。
|
|
286
|
+
self.nodes[node.id] = result
|
|
287
|
+
# 派生实际依赖展开到已解码信号。
|
|
288
|
+
return result
|
|
289
|
+
|
|
290
|
+
def _context(self, literal, other, node, *, arithmetic):
|
|
291
|
+
"""把纯数字/enum常量按另一侧明确类型及单位校验。
|
|
292
|
+
|
|
293
|
+
参数: literal为纯常量子树;other为typed对方;node定位;arithmetic
|
|
294
|
+
表示算术字面量必须能在目标整数类型表示。
|
|
295
|
+
返回: 合法常量子树;含浮点常量的整型运算保持float路径。
|
|
296
|
+
异常: ValueError为字面量类型/定宽/枚举域冲突。
|
|
297
|
+
"""
|
|
298
|
+
# 仅纯常量获得上下文,不能把信号强行改dtype/unit。
|
|
299
|
+
if not literal.constant:
|
|
300
|
+
# 输入依赖不允许隐藏转换。
|
|
301
|
+
return literal
|
|
302
|
+
# 枚举字符串常量严格匹配当前逻辑域。
|
|
303
|
+
if literal.dtype is SignalDType.ENUM:
|
|
304
|
+
# 仅裸字符串可进入指定枚举域。
|
|
305
|
+
if other.dtype is not SignalDType.ENUM or literal.operator != 'const' or literal.value not in other.labels:
|
|
306
|
+
# 未声明标签不自动取第一项。
|
|
307
|
+
self._error(node, '枚举字面量不在声明域')
|
|
308
|
+
# 字符串不作一般单位转换,只保留同域比较。
|
|
309
|
+
return replace(literal, labels=other.labels, unit=other.unit, unit_status=other.unit_status)
|
|
310
|
+
# 数字常量与bool不能混用,bool不是隐式0/1。
|
|
311
|
+
if literal.dtype is SignalDType.BOOL or other.dtype in (SignalDType.BOOL, SignalDType.ENUM):
|
|
312
|
+
# bool同型eq/ne/logic仍由静态协议允许。
|
|
313
|
+
return literal
|
|
314
|
+
# 整数算术字面量按对方整数dtype,递归纯常量子树同样校验。
|
|
315
|
+
if other.dtype in INTEGER_BOUNDS and literal.dtype in INTEGER_BOUNDS and arithmetic:
|
|
316
|
+
# 对const递归重建,以免uint64+常量子树隐藏signed promotion。
|
|
317
|
+
if literal.operator == 'const':
|
|
318
|
+
# 目标整数字面量必须可表示,而非算术runtime缺失。
|
|
319
|
+
if not INTEGER_BOUNDS[other.dtype][0] <= literal.value <= INTEGER_BOUNDS[other.dtype][1]:
|
|
320
|
+
# 包含uint信号加负整数字面量的配置拒绝。
|
|
321
|
+
self._error(node, '整数字面量无法在算术dtype中表示')
|
|
322
|
+
# 原整数值保持精确,不先变float。
|
|
323
|
+
return replace(literal, dtype=other.dtype)
|
|
324
|
+
# 纯整数子树只含定宽算术/abs/neg,逐节点重建静态目标dtype。
|
|
325
|
+
args = tuple(self._context(arg, other, node, arithmetic=True) for arg in literal.args)
|
|
326
|
+
# 除法已经静态为float,不会进入此分支。
|
|
327
|
+
return replace(literal, dtype=other.dtype, args=args)
|
|
328
|
+
# float信号与整数常量先显式转换常量,不放开任意混合信号promotion。
|
|
329
|
+
if other.dtype is SignalDType.FLOAT64 and literal.dtype in INTEGER_BOUNDS:
|
|
330
|
+
# 原整数constant域仍需64位,超宽只允许整数精确比较专用节点。
|
|
331
|
+
if literal.operator == 'const' and not INTEGER_BOUNDS[literal.dtype][0] <= literal.value <= INTEGER_BOUNDS[literal.dtype][1]:
|
|
332
|
+
# 字面量越界是执行前错误。
|
|
333
|
+
self._error(node, '数值字面量超出64位原类型')
|
|
334
|
+
# to_float由两个独立数值后端在runtime检查精确表示。
|
|
335
|
+
return _node('to_float', SignalDType.FLOAT64, literal.unit, (literal,))
|
|
336
|
+
# 显式float字面量对整数保持float,后续有精度mask。
|
|
337
|
+
return literal
|
|
338
|
+
|
|
339
|
+
def _units(self, operator, left, right, node, declared_unit=None):
|
|
340
|
+
"""按首版表推断单位,裸常量加减/比较采用对方单位。
|
|
341
|
+
|
|
342
|
+
参数: operator及两typed子树;node定位;declared_unit为根显式未知组合标签。
|
|
343
|
+
返回: 上下文单位子树及输出单位。
|
|
344
|
+
异常: ValueError为未转换单位或未支持组合。
|
|
345
|
+
"""
|
|
346
|
+
# 加减/比较包括isclose使用相同裸数字常量规则。
|
|
347
|
+
if operator in ('add', 'sub', 'compare'):
|
|
348
|
+
# 一边纯数值常量可以继承另一侧单位;纯常量对纯常量仍1。
|
|
349
|
+
if left.constant and not right.constant and left.dtype not in (SignalDType.BOOL, SignalDType.ENUM):
|
|
350
|
+
# 改静态单位不执行数值缩放。
|
|
351
|
+
left = replace(left, unit=right.unit, unit_status=right.unit_status)
|
|
352
|
+
# 另一侧常量同理,不能改有依赖的信号单位。
|
|
353
|
+
if right.constant and not left.constant and right.dtype not in (SignalDType.BOOL, SignalDType.ENUM):
|
|
354
|
+
# 当前裸常量采用对方原单位。
|
|
355
|
+
right = replace(right, unit=left.unit, unit_status=left.unit_status)
|
|
356
|
+
# 已知不同标签也必须额外显式转换,不根据同量纲猜倍率。
|
|
357
|
+
if left.unit != right.unit:
|
|
358
|
+
# 未知不同标签同样不能假设等价。
|
|
359
|
+
self._error(node, f'单位{left.unit}/{right.unit}不一致,须显式转换')
|
|
360
|
+
# 比较结果unit1,算术保留操作数单位。
|
|
361
|
+
return left, right, '1' if operator == 'compare' else left.unit
|
|
362
|
+
# 无量纲乘除不会引入新工程量纲。
|
|
363
|
+
if operator == 'mul' and '1' in (left.unit, right.unit):
|
|
364
|
+
# 两边都1也得到1。
|
|
365
|
+
return left, right, right.unit if left.unit == '1' else left.unit
|
|
366
|
+
# 相同单位相除得到1,除无量纲保留分子单位。
|
|
367
|
+
if operator == 'div' and (left.unit == right.unit or right.unit == '1'):
|
|
368
|
+
# 无额外值换算。
|
|
369
|
+
return left, right, '1' if left.unit == right.unit else left.unit
|
|
370
|
+
# 固定支持乘法组合,避免完整量纲猜测。
|
|
371
|
+
products = {frozenset(('V', 'A')): 'W', frozenset(('W', 's')): 'J', frozenset(('A', 's')): 'A·s'}
|
|
372
|
+
# 仅当前已确认单位关系可以verified输出。
|
|
373
|
+
if operator == 'mul' and frozenset((left.unit, right.unit)) in products:
|
|
374
|
+
# 已知单位的显式规范化必须先于这里。
|
|
375
|
+
return left, right, products[frozenset((left.unit, right.unit))]
|
|
376
|
+
# 普通分析可显式声明未知组合,但不得假称已知量纲验证。
|
|
377
|
+
if declared_unit is not None and (left.unit not in UNIT_TABLE or right.unit not in UNIT_TABLE):
|
|
378
|
+
# 任意结果标签仍unverified,即使用户标成W。
|
|
379
|
+
return replace(left, unit_status='unverified'), right, declared_unit
|
|
380
|
+
# 已知未支持组合不能用标签覆盖当证明。
|
|
381
|
+
self._error(node, f'未支持单位组合{left.unit} {operator} {right.unit},需显式规范化/派生声明')
|
|
382
|
+
|
|
383
|
+
def _binary(self, operator, left, right, node, declared_unit=None):
|
|
384
|
+
"""静态编译数值/比较,整数常量比较保留精确边界。
|
|
385
|
+
|
|
386
|
+
参数: operator及已编译左右节点,node定位,declared_unit根声明。
|
|
387
|
+
返回: typed ExprNode;绝不运行用户代码。
|
|
388
|
+
异常: ValueError为单位/类型/常量配置错误。
|
|
389
|
+
"""
|
|
390
|
+
# 先校验单位,比较也不能隐藏mA与A混用。
|
|
391
|
+
left, right, unit = self._units('compare' if operator in CMP.values() else operator, left, right, node, declared_unit)
|
|
392
|
+
# 纯整数常量没有signal dtype上下文,先对称选共同定宽。
|
|
393
|
+
if operator not in CMP.values() and left.constant and right.constant and left.dtype in INTEGER_BOUNDS and right.dtype in INTEGER_BOUNDS:
|
|
394
|
+
# 有超signed正整数literal时选uint64;所有operand仍须可表示。
|
|
395
|
+
dtype = SignalDType.UINT64 if SignalDType.UINT64 in (left.dtype, right.dtype) else SignalDType.INT64
|
|
396
|
+
# 只是编译器类型上下文,不产生运行时信号或新binding。
|
|
397
|
+
target = ExprNode('const', dtype, '1', 'verified', value=0, constant=True)
|
|
398
|
+
# 两側独立同一目标,不以遍历顺序决定政策。
|
|
399
|
+
left, right = self._context(left, target, node, arithmetic=True), self._context(right, target, node, arithmetic=True)
|
|
400
|
+
# 整数信号与任意精确整数字面量比较无需把边界塞入定宽结果。
|
|
401
|
+
if operator in CMP.values() and left.dtype in INTEGER_BOUNDS and right.dtype in INTEGER_BOUNDS:
|
|
402
|
+
# 常量在左,统一反向比较当前正常信号值。
|
|
403
|
+
if left.operator == 'const' and right.operator != 'const':
|
|
404
|
+
# 特殊节点value保留完整Python整数边界。
|
|
405
|
+
return _node('int_literal_'+REVERSE_CMP[operator], SignalDType.BOOL, unit, (right,), value=left.value)
|
|
406
|
+
# 常量在右直接按原运算方向比较。
|
|
407
|
+
if right.operator == 'const' and left.operator != 'const':
|
|
408
|
+
# 超uint64边界只是精确比较阈值,不是新数值输出dtype。
|
|
409
|
+
return _node('int_literal_'+operator, SignalDType.BOOL, unit, (left,), value=right.value)
|
|
410
|
+
# 常量与实际另一侧的类型上下文明确处理。
|
|
411
|
+
left = self._context(left, right, node, arithmetic=operator not in CMP.values())
|
|
412
|
+
# 使用已经校验左側dtype,再处理右側常量。
|
|
413
|
+
right = self._context(right, left, node, arithmetic=operator not in CMP.values())
|
|
414
|
+
# 先保持原普通规则:只有float纯常量证明允许混合,不能放行任意信号。
|
|
415
|
+
float_literal = left.dtype is not right.dtype and ((left.constant and left.dtype is SignalDType.FLOAT64) or (right.constant and right.dtype is SignalDType.FLOAT64))
|
|
416
|
+
# 消息域的无信号依赖配置子树是显式FLOAT64值;仍由现数值核检查整数精度。
|
|
417
|
+
if self.message_domain and left.dtype is not right.dtype:
|
|
418
|
+
float_literal |= ((left.dtype is SignalDType.FLOAT64 and not left.aliases)
|
|
419
|
+
or (right.dtype is SignalDType.FLOAT64 and not right.aliases))
|
|
420
|
+
# bool/enum及不同信号dtype在静态协议中拒绝。
|
|
421
|
+
try:
|
|
422
|
+
# 仅共享静态规则,没有共享数值执行。
|
|
423
|
+
dtype = result_dtype(operator, left.dtype, right.dtype, float_literal)
|
|
424
|
+
except (TypeError, ValueError) as error:
|
|
425
|
+
# 补充用户位置而非runtime UNKNOWN。
|
|
426
|
+
self._error(node, str(error))
|
|
427
|
+
# enum比较必须同域,不能直接比较同编码不同标签。
|
|
428
|
+
if left.dtype is SignalDType.ENUM and left.labels != right.labels:
|
|
429
|
+
# 当前首版没有枚举跨域自动归一化。
|
|
430
|
+
self._error(node, '枚举比较需要相同声明域')
|
|
431
|
+
# 正常算术const叶仍必须在其静态类型内,即使两側都是常量。
|
|
432
|
+
for operand in (left, right):
|
|
433
|
+
# 巨大整数仅在前述特殊比较节点允许。
|
|
434
|
+
if operand.operator == 'const' and operand.dtype in INTEGER_BOUNDS and not INTEGER_BOUNDS[operand.dtype][0] <= operand.value <= INTEGER_BOUNDS[operand.dtype][1]:
|
|
435
|
+
# 不能在runtime模型构造时才失败。
|
|
436
|
+
self._error(node, '整数字面量超出运算dtype')
|
|
437
|
+
# 真实依赖/constant状态由统一节点模型汇总。
|
|
438
|
+
return _node(operator, dtype, unit, (left, right), allow_float_literal=float_literal)
|
|
439
|
+
|
|
440
|
+
def visit(self, node, declared_unit=None):
|
|
441
|
+
"""逐AST节点执行首版白名单,不递归放行未知语法。
|
|
442
|
+
|
|
443
|
+
参数: node为解析节点;declared_unit仅根静态单位上下文。
|
|
444
|
+
返回: 完整typed内部节点。
|
|
445
|
+
异常: ValueError定位未注册语法/函数/类型/单位。
|
|
446
|
+
"""
|
|
447
|
+
# 纯literal仅数字、bool和待枚举上下文的str。
|
|
448
|
+
if isinstance(node, ast.Constant):
|
|
449
|
+
# bool必须先于int分类,因为Python bool是int子类。
|
|
450
|
+
value = node.value
|
|
451
|
+
# 不接受None、bytes、complex或任意对象。
|
|
452
|
+
if type(value) not in (bool, int, float, str) or type(value) is float and not isfinite(value):
|
|
453
|
+
# 非有限literal同样是配置错误。
|
|
454
|
+
self._error(node, '仅支持有限数字/bool及枚举字符串literal')
|
|
455
|
+
# 字符串暂存为ENUM,只有后续明确域比较才合法。
|
|
456
|
+
dtype = SignalDType.BOOL if type(value) is bool else SignalDType.ENUM if type(value) is str else SignalDType.FLOAT64 if type(value) is float else SignalDType.INT64 if value <= 2 ** 63 - 1 else SignalDType.UINT64
|
|
457
|
+
# 纯literal无单位、无来源依赖。
|
|
458
|
+
return ExprNode('const', dtype, '1', 'verified', value=value, constant=True)
|
|
459
|
+
# Name只访问已注册别名,绝不反射对象。
|
|
460
|
+
if isinstance(node, ast.Name):
|
|
461
|
+
# 未注册名称也在此精确定位。
|
|
462
|
+
return self._name(node)
|
|
463
|
+
# 一元±常量保留完整精确整数,供算术/比较上下文校验。
|
|
464
|
+
if isinstance(node, ast.UnaryOp):
|
|
465
|
+
# 常量负号不先包装成uint64再运行下溢。
|
|
466
|
+
if isinstance(node.op, (ast.USub, ast.UAdd)) and isinstance(node.operand, ast.Constant) and type(node.operand.value) in (int, float):
|
|
467
|
+
# Python只计算编译器已识别的原生纯literal符号。
|
|
468
|
+
value = -node.operand.value if isinstance(node.op, ast.USub) else node.operand.value
|
|
469
|
+
# 返回仍须经过Constant合法性检查。
|
|
470
|
+
return self.visit(ast.copy_location(ast.Constant(value=value), node))
|
|
471
|
+
# 一元操作数先完成静态校验。
|
|
472
|
+
child = self.visit(node.operand)
|
|
473
|
+
# not仅bool,不使用Python truthiness。
|
|
474
|
+
if isinstance(node.op, ast.Not) and child.dtype is SignalDType.BOOL:
|
|
475
|
+
# 运行时not UNKNOWN仍UNKNOWN。
|
|
476
|
+
return _node('not', SignalDType.BOOL, '1', (child,))
|
|
477
|
+
# 数值一元±不允许bool/enum。
|
|
478
|
+
if isinstance(node.op, (ast.USub, ast.UAdd)) and child.dtype in (*INTEGER_BOUNDS, SignalDType.FLOAT64):
|
|
479
|
+
# unary+保留原typed树,neg由独立数值核处理。
|
|
480
|
+
return child if isinstance(node.op, ast.UAdd) else _node('neg', child.dtype, child.unit, (child,))
|
|
481
|
+
# 位取反等未支持形式拒绝。
|
|
482
|
+
self._error(node, '未支持一元语法或类型')
|
|
483
|
+
# 数值运算仅固定四种。
|
|
484
|
+
if isinstance(node, ast.BinOp) and type(node.op) in BINOPS:
|
|
485
|
+
# 不使用任意Python运算方法。
|
|
486
|
+
return self._binary(BINOPS[type(node.op)], self.visit(node.left), self.visit(node.right), node, declared_unit)
|
|
487
|
+
# 链式比较逐对生成比较节点,再用保留UNKNOWN(未知)的三值and组合。
|
|
488
|
+
if isinstance(node, ast.Compare):
|
|
489
|
+
# 比较类型逐项注册,is/in等均拒绝。
|
|
490
|
+
if any(type(operator) not in CMP for operator in node.ops):
|
|
491
|
+
# 不能让Python对象身份或容器访问进入DSL。
|
|
492
|
+
self._error(node, '未支持比较运算')
|
|
493
|
+
# 中间操作数静态树只编译一次,不执行求值副作用。
|
|
494
|
+
operands = tuple(self.visit(item) for item in (node.left, *node.comparators))
|
|
495
|
+
# 单个比较的类型/单位都先校验。
|
|
496
|
+
comparisons = tuple(self._binary(CMP[type(operator)], operands[index], operands[index+1], node) for index, operator in enumerate(node.ops))
|
|
497
|
+
# chain输出同一BOOL,不依赖对数组作bool。
|
|
498
|
+
return comparisons[0] if len(comparisons) == 1 else _node('and', SignalDType.BOOL, '1', comparisons)
|
|
499
|
+
# 逻辑and/or仅bool,不能把数值当TRUE。
|
|
500
|
+
if isinstance(node, ast.BoolOp) and isinstance(node.op, (ast.And, ast.Or)):
|
|
501
|
+
# 逐子树类型/名称/单位均静态检查,未知值留runtime。
|
|
502
|
+
args = tuple(self.visit(item) for item in node.values)
|
|
503
|
+
# 已知False能决定and但不能绕过静态配置错误。
|
|
504
|
+
if any(arg.dtype is not SignalDType.BOOL for arg in args):
|
|
505
|
+
# 不采用Python返回任意操作数的逻辑语义。
|
|
506
|
+
self._error(node, 'and/or仅支持bool表达式')
|
|
507
|
+
# TRUE、FALSE和UNKNOWN三种结果的组合规则,由两个解释器各自实现。
|
|
508
|
+
return _node('and' if isinstance(node.op, ast.And) else 'or', SignalDType.BOOL, '1', args)
|
|
509
|
+
# 函数调用必须裸Name且固定注册。
|
|
510
|
+
if isinstance(node, ast.Call):
|
|
511
|
+
# 属性调用、未注册signal/任意函数禁止。
|
|
512
|
+
if not isinstance(node.func, ast.Name) or node.func.id not in ('abs', 'isclose'):
|
|
513
|
+
# 不访问用户函数对象,也不隐藏注册自由插件。
|
|
514
|
+
self._error(node, '函数仅允许注册abs/isclose,属性访问及任意调用禁止')
|
|
515
|
+
# abs固定一个位置参数,无任意keywords/*args。
|
|
516
|
+
if node.func.id == 'abs':
|
|
517
|
+
# unpack等AST形式不会满足固定签名。
|
|
518
|
+
if len(node.args) != 1 or node.keywords:
|
|
519
|
+
# 不使用库默认自由签名。
|
|
520
|
+
self._error(node, 'abs必须为abs(x)')
|
|
521
|
+
# 正常数值类型才能abs。
|
|
522
|
+
child = self.visit(node.args[0])
|
|
523
|
+
# bool/enum不可隐式数字化。
|
|
524
|
+
if child.dtype not in (*INTEGER_BOUNDS, SignalDType.FLOAT64):
|
|
525
|
+
# 字符串abs拒绝在执行前。
|
|
526
|
+
self._error(node, 'abs只支持数值')
|
|
527
|
+
# signed最小值的runtime质量由数值核处理。
|
|
528
|
+
return _node('abs', child.dtype, child.unit, (child,))
|
|
529
|
+
# isclose固定两位置参数及完整两个具名容差。
|
|
530
|
+
if len(node.args) != 2 or len(node.keywords) != 2 or {item.arg for item in node.keywords} != {'atol', 'rtol'}:
|
|
531
|
+
# 不能默默采用NumPy默认容差。
|
|
532
|
+
self._error(node, 'isclose必须显式atol、rtol及两个位置参数')
|
|
533
|
+
# 输入只限数值,不让bool/enum通过float转换。
|
|
534
|
+
a, b = (self.visit(item) for item in node.args)
|
|
535
|
+
# isclose不能通过bool等值合法这一事实绕过数值类型要求。
|
|
536
|
+
if any(item.dtype not in (*INTEGER_BOUNDS, SignalDType.FLOAT64) for item in (a, b)):
|
|
537
|
+
# 逻辑/枚举不是该函数的数值实参。
|
|
538
|
+
self._error(node, 'isclose只支持数值实参')
|
|
539
|
+
# isclose需要真正数值常量,不能使用超宽整数比较边界。
|
|
540
|
+
for item in (a, b):
|
|
541
|
+
# 信号正常值已经由typed模型保证定宽。
|
|
542
|
+
if item.operator == 'const' and item.dtype in INTEGER_BOUNDS and not INTEGER_BOUNDS[item.dtype][0] <= item.value <= INTEGER_BOUNDS[item.dtype][1]:
|
|
543
|
+
# 不能把超宽配置literal拖到runtime失败。
|
|
544
|
+
self._error(node, 'isclose实参字面量超出64位类型')
|
|
545
|
+
# 裸常量首先完成比较单位上下文。
|
|
546
|
+
a, b, _ = self._units('compare', a, b, node)
|
|
547
|
+
# 混合真实int/float信号须先显式归一化,即使isclose也不隐藏放行。
|
|
548
|
+
self._binary('eq', a, b, node)
|
|
549
|
+
# 容差仍须裸literal;参数虽operator=const但constant=False,不能被偷偷重标单位。
|
|
550
|
+
tolerances = {}
|
|
551
|
+
# 固定两个keywords,AST表达式不动态执行。
|
|
552
|
+
for keyword in node.keywords:
|
|
553
|
+
# 一元±数字literal通过同一静态解析。
|
|
554
|
+
tolerance = self.visit(keyword.value)
|
|
555
|
+
# 大整数只能原64位literal,转换精度仍runtime核查。
|
|
556
|
+
if tolerance.operator != 'const' or not tolerance.constant or tolerance.dtype not in (*INTEGER_BOUNDS, SignalDType.FLOAT64) or tolerance.value < 0 or tolerance.dtype in INTEGER_BOUNDS and not INTEGER_BOUNDS[tolerance.dtype][0] <= tolerance.value <= INTEGER_BOUNDS[tolerance.dtype][1]:
|
|
557
|
+
# 表达式/不完整容差直接配置失败。
|
|
558
|
+
self._error(keyword.value, 'isclose容差须有限非负数字字面量')
|
|
559
|
+
# atol采用比较单位,rtol无量纲。
|
|
560
|
+
tolerances[keyword.arg] = replace(tolerance, unit=a.unit if keyword.arg == 'atol' else '1')
|
|
561
|
+
# 数值输入a/b和参数都通过独立float精度核计算判据。
|
|
562
|
+
return _node('isclose', SignalDType.BOOL, '1', (a, b, tolerances['atol'], tolerances['rtol']))
|
|
563
|
+
# 点号语法提供位置/原因/别名,而非静默替换下划线。
|
|
564
|
+
if isinstance(node, ast.Attribute):
|
|
565
|
+
# 禁止所有对象访问,不把semantic字符串当属性路径。
|
|
566
|
+
self._error(node, '禁止ast.Attribute/点号属性访问,请使用已绑定简单别名')
|
|
567
|
+
# pow/subscript/comprehension/lambda/starred等统一本白名单拒绝。
|
|
568
|
+
self._error(node, f'禁止语法{type(node).__name__}')
|
|
569
|
+
|
|
570
|
+
|
|
571
|
+
def compile_expression(text: str, bindings: SignalBindings | DecodedBindings | MessageBindings, *, derived: tuple[DerivedDefinition, ...] = (), unit: str | None = None) -> CompiledExpression:
|
|
572
|
+
"""检查表达式及全部派生声明,关联当前真实输入绑定。
|
|
573
|
+
|
|
574
|
+
参数:
|
|
575
|
+
text: 非空文本;bindings为真实SignalBindings、DecodedBindings或MessageBindings。
|
|
576
|
+
derived: 完整且不可变的DerivedDefinition元组,需与已登记名称一致。
|
|
577
|
+
unit: 可选的显式结果单位;不执行自动单位换算。
|
|
578
|
+
返回:
|
|
579
|
+
CompiledExpression,保存表达式树、实际依赖别名和完整绑定身份。
|
|
580
|
+
异常:
|
|
581
|
+
TypeError、ValueError: 输入结构、语法、名称、类型、单位、循环依赖
|
|
582
|
+
或多来源同步依据不满足要求。
|
|
583
|
+
流程:
|
|
584
|
+
每次新建编译状态,先检查所有派生声明,再编译根表达式与同步依赖。
|
|
585
|
+
此时不计算数值,也不读取日志或加载DBC;数值精度失败由求值器报告。
|
|
586
|
+
"""
|
|
587
|
+
# 只放行明确可执行绑定;普通或消息声明均不能替代各自实际输入证据。
|
|
588
|
+
if not isinstance(bindings, (SignalBindings, DecodedBindings, MessageBindings)):
|
|
589
|
+
# 静态声明必须走validate_expression,不能生成可执行树。
|
|
590
|
+
raise TypeError('可执行编译需要真实SignalBindings、DecodedBindings或MessageBindings')
|
|
591
|
+
# 每次使用全新编译状态,隔离绑定和派生节点。
|
|
592
|
+
compiler = _Compiler(bindings, derived)
|
|
593
|
+
# 即使派生未被当前根使用也检查配置循环/未知名称。
|
|
594
|
+
for definition in derived:
|
|
595
|
+
# Name只作为内部解析入口,位置未提供时错误默认行1列1。
|
|
596
|
+
compiler._name(ast.Name(id=definition.name, ctx=ast.Load()))
|
|
597
|
+
# 根和声明单位完成所有静态语义检查。
|
|
598
|
+
root, normalized = compiler.parse(text, unit)
|
|
599
|
+
# 多源只有当前根实际共同依赖才需要同步依据。
|
|
600
|
+
bindings.require_synchronized(root.aliases)
|
|
601
|
+
# 身份包含来源、显式转换、值有效期、质量政策、全部派生定义和编译版本。
|
|
602
|
+
payload = ('expression-v1', 'reference+numpy-v1', bindings.identity, normalized, repr(root), tuple((item.name, item.expr, item.unit) for item in derived))
|
|
603
|
+
# 不仅以语法文本/semantic声明作为执行缓存证明。
|
|
604
|
+
identity = sha256(_identity(payload).encode('utf-8')).hexdigest()
|
|
605
|
+
# 返回编译后的表达式及其依赖。
|
|
606
|
+
return CompiledExpression(text, bindings, root, root.aliases, normalized, identity)
|
|
607
|
+
|
|
608
|
+
|
|
609
|
+
def validate_expression(text: str, bindings: DeclarationBindings | MessageDeclarations, *, derived: tuple[DerivedDefinition, ...] = (), unit: str | None = None) -> StaticExpression:
|
|
610
|
+
"""只根据来源声明检查表达式,不读取真实输入。
|
|
611
|
+
|
|
612
|
+
参数:
|
|
613
|
+
text: 非空表达式文本;bindings为DeclarationBindings或MessageDeclarations。
|
|
614
|
+
derived: 完整DerivedDefinition元组;unit为可选显式结果单位。
|
|
615
|
+
返回:
|
|
616
|
+
StaticExpression,说明名称、语法、类型、单位和同步声明已检查。
|
|
617
|
+
该类型不能交给数值解释器执行,也不证明实际字段或数据内容已核实。
|
|
618
|
+
异常:
|
|
619
|
+
TypeError、ValueError: 声明结构、语法、名称、单位、循环依赖或同步缺项。
|
|
620
|
+
边界:
|
|
621
|
+
未被根引用的派生表达式也要检查;读取真实输入后需要重新建立运行绑定。
|
|
622
|
+
"""
|
|
623
|
+
# 接口明确拒绝把真实绑定混为纯静态声明。
|
|
624
|
+
if not isinstance(bindings, (DeclarationBindings, MessageDeclarations)):
|
|
625
|
+
# 避免调用侧误把声明身份当执行缓存身份。
|
|
626
|
+
raise TypeError('静态校验需要DeclarationBindings或MessageDeclarations')
|
|
627
|
+
# 白名单及类型政策共用编译器,不复制另一套宽松DSL。
|
|
628
|
+
compiler = _Compiler(bindings, derived)
|
|
629
|
+
# 未被根引用的派生也要检查环和单位。
|
|
630
|
+
for definition in derived:
|
|
631
|
+
# 只用受限内部Name入口,无动态属性访问。
|
|
632
|
+
compiler._name(ast.Name(id=definition.name, ctx=ast.Load()))
|
|
633
|
+
# 根解析保留错误行列与可用别名。
|
|
634
|
+
root, normalized = compiler.parse(text, unit)
|
|
635
|
+
# 声明联合依赖必须已有明确同步条件。
|
|
636
|
+
bindings.require_synchronized(root.aliases)
|
|
637
|
+
# 独立版本前缀确保不能与真实可执行身份混用。
|
|
638
|
+
payload = ('static-expression-v1', bindings.identity, normalized, repr(root), tuple((item.name, item.expr, item.unit) for item in derived))
|
|
639
|
+
# SHA只包含受控typed树,不读取文件内容或旧DBC。
|
|
640
|
+
identity = sha256(_identity(payload).encode('utf-8')).hexdigest()
|
|
641
|
+
# 返回类型与CompiledExpression分开,解释器结构门槛仍然有效。
|
|
642
|
+
return StaticExpression(text, bindings, root, root.aliases, normalized, identity)
|