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,314 @@
|
|
|
1
|
+
"""在同长度信号列上批量求值表达式,并逐位置保留质量诊断。
|
|
2
|
+
|
|
3
|
+
evaluate_numpy接收当前编译绑定和context中的NumericArray,输出
|
|
4
|
+
ArrayEvaluation:数值结果列与独立的uint16依赖诊断列均为形状(N,)。
|
|
5
|
+
布尔逻辑用掩码区分TRUE、FALSE和UNKNOWN(未知),不把无效False占位
|
|
6
|
+
当作条件不成立;已知值决定结果时,原依赖异常仍留在诊断列。
|
|
7
|
+
|
|
8
|
+
解释器按表达式树遍历节点,每个节点用NumPy逐元素函数计算整列。
|
|
9
|
+
isclose使用显式atol与rtol计算abs(a-b) <= atol + rtol*abs(b)。
|
|
10
|
+
evaluate_memory_numpy从已有内存行归一化信号,用searchsorted找到每个
|
|
11
|
+
查询时间的最近观测,再按有效期保持并求值,不额外读取或解码。
|
|
12
|
+
|
|
13
|
+
依赖NumPy及核心编译、数值和对齐模块;共享检查协议,不调用参考数值
|
|
14
|
+
求值器。结果为独立只读存储,当前批次缓存不跨调用保留,不修改输入。
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
# 冻结输出及明确映射接口。
|
|
18
|
+
from dataclasses import dataclass
|
|
19
|
+
# 数组依赖显式,不污染标准库core导入。
|
|
20
|
+
import numpy as np
|
|
21
|
+
# 当前静态树是共享已校验协议,不共享样本数值内核。
|
|
22
|
+
from .expression import CompiledExpression
|
|
23
|
+
# 真实绑定参与执行身份检查。
|
|
24
|
+
from .binding import SignalBindings
|
|
25
|
+
# 解码运行证据与实际memory绑定共用检查协议,不共享参考数值计算。
|
|
26
|
+
from .decoded_binding import DecodedBindings
|
|
27
|
+
# 消息绑定只扩显式typed context,不改变普通数值核或memory时间保持入口。
|
|
28
|
+
from .message_binding import MessageBindings
|
|
29
|
+
# 只共享dtype常量,精确整数比较literal不转float。
|
|
30
|
+
from .numeric import INTEGER_BOUNDS
|
|
31
|
+
# 数组真实数值入口与布局模型。
|
|
32
|
+
from .numeric_numpy import (COMPARE_UFUNCS, DTYPES, NumericArray, _output, _readonly,
|
|
33
|
+
binary_numpy, to_float_numpy, unary_numpy)
|
|
34
|
+
# 此函数只校验身份与列映射,没有参考数值运算。
|
|
35
|
+
from .expression_reference import require_context
|
|
36
|
+
# 原行批量适配独立于参考转换。
|
|
37
|
+
from .normalize_numpy import memory_series_numpy
|
|
38
|
+
# 独立NumPy保持,不调用参考对齐。
|
|
39
|
+
from .state_numpy import align_numpy, build_signal_array, _require_axis
|
|
40
|
+
# 基础质量及bool有效mask实施三值,不对数组bool求值。
|
|
41
|
+
from .types import QualityFlag as Q, SignalDType as D
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
@dataclass(frozen=True)
|
|
45
|
+
class ArrayEvaluation:
|
|
46
|
+
"""保存同长度的计算结果列与依赖质量诊断列。
|
|
47
|
+
|
|
48
|
+
value为NumericArray,dependency_quality是形状(N,)的uint16数组。
|
|
49
|
+
布尔结果可能因已知TRUE或FALSE而有效,诊断仍可包含非零的原依赖原因;
|
|
50
|
+
不能因此把UNKNOWN填为FALSE。构造时检查诊断布局并复制为只读存储。
|
|
51
|
+
实例不可重新赋值,不持有跨批次的求值状态。
|
|
52
|
+
"""
|
|
53
|
+
|
|
54
|
+
value: NumericArray # 真实逻辑结果列。
|
|
55
|
+
dependency_quality: np.ndarray # 同长uint16原因并集。
|
|
56
|
+
|
|
57
|
+
def __post_init__(self):
|
|
58
|
+
"""验证诊断布局和已知位后复制只读列。
|
|
59
|
+
|
|
60
|
+
参数: 无,读取value与dependency_quality。
|
|
61
|
+
返回: None,不修改调用侧数组。
|
|
62
|
+
异常: TypeError/ValueError为结构/长度/未知位。
|
|
63
|
+
"""
|
|
64
|
+
# 真实typed结果需与诊断同一布局。
|
|
65
|
+
if not isinstance(self.value, NumericArray) or type(self.dependency_quality) is not np.ndarray or self.dependency_quality.ndim != 1 or self.dependency_quality.dtype != np.dtype('uint16'):
|
|
66
|
+
# 不用广播/隐式cast修正错误接口。
|
|
67
|
+
raise TypeError('ArrayEvaluation诊断需1维uint16列')
|
|
68
|
+
# 未知位不能以诊断为名通过。
|
|
69
|
+
if len(self.dependency_quality) != len(self.value.values) or np.any(self.dependency_quality > 511):
|
|
70
|
+
# 正常BOOL可带诊断,但结构仍严格。
|
|
71
|
+
raise ValueError('ArrayEvaluation诊断长度/原因不合法')
|
|
72
|
+
# 结果与诊断都具独立所有权。
|
|
73
|
+
object.__setattr__(self, 'dependency_quality', _readonly(self.dependency_quality))
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def _logic(operator, values):
|
|
77
|
+
"""独立以整列掩码实现and/or/not三值真值表。
|
|
78
|
+
|
|
79
|
+
参数: operator固定逻辑名;values为同长BOOL列tuple。
|
|
80
|
+
返回: NumericArray,known决定时质量NONE,否则UNKNOWN原因并集。
|
|
81
|
+
异常: 调用者保证static BOOL及shape,分配错误传播。
|
|
82
|
+
"""
|
|
83
|
+
# not不将invalid False占位当作真False。
|
|
84
|
+
if operator == 'not':
|
|
85
|
+
# 正常位置取反,valid/原因不改变。
|
|
86
|
+
result = np.zeros(len(values[0].values), dtype=bool)
|
|
87
|
+
# where避免对invalid占位作正常逻辑。
|
|
88
|
+
np.logical_not(values[0].values, out=result, where=values[0].valid)
|
|
89
|
+
# 原原因保持,不清UNKNOWN。
|
|
90
|
+
return _output(D.BOOL, result, values[0].quality.copy())
|
|
91
|
+
# 行数明确,不对数组做Python truthiness。
|
|
92
|
+
size = len(values[0].values)
|
|
93
|
+
# 默认没有known决断/没有原因。
|
|
94
|
+
decided = np.zeros(size, dtype=bool)
|
|
95
|
+
# uint16保留高位诊断。
|
|
96
|
+
quality = np.zeros(size, dtype=np.uint16)
|
|
97
|
+
# 逻辑节点的静态操作数循环,每次都真实整列mask。
|
|
98
|
+
for value in values:
|
|
99
|
+
# unknown原因先并集,decision后只清结果质量。
|
|
100
|
+
quality |= value.quality
|
|
101
|
+
# and由knownFalse决定,or由knownTrue决定。
|
|
102
|
+
decided |= value.valid & (~value.values if operator == 'and' else value.values)
|
|
103
|
+
# 已知决断给正常结果,原诊断由ArrayEvaluation另保存。
|
|
104
|
+
quality[decided] = 0
|
|
105
|
+
# and没有knownFalse且没有unknown时TRUE;or仅decided位置TRUE。
|
|
106
|
+
result = ~decided if operator == 'and' else decided
|
|
107
|
+
# unknown存储值不解释为正常bool,valid由quality决定。
|
|
108
|
+
return _output(D.BOOL, result, quality)
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
def _constant(node, size):
|
|
112
|
+
"""将已校验literal装箱同长typed列,不猜dtype或enum域。
|
|
113
|
+
|
|
114
|
+
参数: node为const,size为非负明确行数。
|
|
115
|
+
返回: 正常NumericArray;integer边界此前静态检查。
|
|
116
|
+
异常: 模型/分配错误传播,不自动promotion。
|
|
117
|
+
"""
|
|
118
|
+
# enum固定标签域,正常code由当前域唯一确定。
|
|
119
|
+
value = node.labels.index(node.value) if node.labels else node.value
|
|
120
|
+
# 常量复制为整列,不靠广播误配输入。
|
|
121
|
+
values = np.full(size, value, dtype=DTYPES[node.dtype])
|
|
122
|
+
# literal没有上游质量异常。
|
|
123
|
+
return _output(node.dtype, values, np.zeros(size, dtype=np.uint16), node.labels)
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
def _literal_compare(node, value):
|
|
127
|
+
"""在整数域比较原列与任意精确Python整数常量边界。
|
|
128
|
+
|
|
129
|
+
参数: node含固定比较名/原整数边界;value为定宽整数列。
|
|
130
|
+
返回: BOOL列,invalid保持原原因,不转float或cast越界常量。
|
|
131
|
+
异常: 编译器保证类型与注册比较,分配错误传播。
|
|
132
|
+
"""
|
|
133
|
+
# 边界上下限是精确Python静态配置,不是逐样本计算。
|
|
134
|
+
lower, upper = INTEGER_BOUNDS[value.dtype]
|
|
135
|
+
# 运算名来自白名单编译节点。
|
|
136
|
+
operator = node.operator[12:]
|
|
137
|
+
# 输出占位不正常使用。
|
|
138
|
+
result = np.zeros(len(value.values), dtype=bool)
|
|
139
|
+
# 太小边界:所有正常原值都大于它。
|
|
140
|
+
if node.value < lower:
|
|
141
|
+
# 不把超界常量cast成机器整数。
|
|
142
|
+
result[value.valid] = operator in ('ne', 'gt', 'ge')
|
|
143
|
+
# 太大边界:所有正常原值都小于它。
|
|
144
|
+
elif node.value > upper:
|
|
145
|
+
# 即使2**100也精确判定,不经过float。
|
|
146
|
+
result[value.valid] = operator in ('ne', 'lt', 'le')
|
|
147
|
+
else:
|
|
148
|
+
# 已证明可表示,才按相同dtype精确ufunc比较。
|
|
149
|
+
COMPARE_UFUNCS[operator](value.values, DTYPES[value.dtype].type(node.value), out=result, where=value.valid)
|
|
150
|
+
# known比较正常,unknown原因原样保持。
|
|
151
|
+
return _output(D.BOOL, result, value.quality.copy())
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
def _evaluate(node, context, size, cache):
|
|
155
|
+
"""按静态节点结构调用真实批量数值/逻辑内核。
|
|
156
|
+
|
|
157
|
+
参数: node冻结树;context当前同长列;size行数;cache本次batch局部缓存。
|
|
158
|
+
返回: ArrayEvaluation,完整诊断不因known逻辑结果丢失。
|
|
159
|
+
异常: 静态/输入模型问题传播,不调用reference/eval/逐样本Python。
|
|
160
|
+
"""
|
|
161
|
+
# 当前batch/真实绑定局部公共子表达式复用。
|
|
162
|
+
if node in cache:
|
|
163
|
+
# 不能跨batch/会话继承数值。
|
|
164
|
+
return cache[node]
|
|
165
|
+
# 裸literal仅类型装箱,没有逐样本计算。
|
|
166
|
+
if node.operator == 'const':
|
|
167
|
+
# shape与所有信号相同。
|
|
168
|
+
value = _constant(node, size)
|
|
169
|
+
# 常量没有原依赖异常。
|
|
170
|
+
result = ArrayEvaluation(value, value.quality)
|
|
171
|
+
# Name只取当前显式context已解码列。
|
|
172
|
+
elif node.operator == 'name':
|
|
173
|
+
# 外层已校验dtype/labels/shape及真实绑定身份。
|
|
174
|
+
value = context[node.name]
|
|
175
|
+
# 原质量同步保存在诊断列。
|
|
176
|
+
result = ArrayEvaluation(value, value.quality)
|
|
177
|
+
else:
|
|
178
|
+
# 对静态子树递归,每个节点执行整列,不逐样本解释。
|
|
179
|
+
children = tuple(_evaluate(arg, context, size, cache) for arg in node.args)
|
|
180
|
+
# 真正数值输入不是diagnostic数组。
|
|
181
|
+
values = tuple(child.value for child in children)
|
|
182
|
+
# 诊断逐节点整列并集,不借normal bool清原因。
|
|
183
|
+
diagnostic = np.zeros(size, dtype=np.uint16)
|
|
184
|
+
# 此循环维度是表达式静态操作数个数。
|
|
185
|
+
for child in children:
|
|
186
|
+
# 所有求值子树的原/计算质量纳入诊断。
|
|
187
|
+
diagnostic |= child.dependency_quality
|
|
188
|
+
# 三值布尔核独立于标量参考真值表代码。
|
|
189
|
+
if node.operator in ('and', 'or', 'not'):
|
|
190
|
+
# 已知决断可normal;diagnostic仍保留UNKNOWN。
|
|
191
|
+
value = _logic(node.operator, values)
|
|
192
|
+
# 数值单目先检查定宽再ufunc。
|
|
193
|
+
elif node.operator in ('abs', 'neg'):
|
|
194
|
+
# 调用真实数组数值核,而非np.vectorize。
|
|
195
|
+
value = unary_numpy(node.operator, values[0])
|
|
196
|
+
# 显式常量float上下文仍用独立尾位精度核。
|
|
197
|
+
elif node.operator == 'to_float':
|
|
198
|
+
# 大整数不默默变近似float。
|
|
199
|
+
value = to_float_numpy(values[0])
|
|
200
|
+
# 常量大边界不能塞进定宽列后wrap。
|
|
201
|
+
elif node.operator.startswith('int_literal_'):
|
|
202
|
+
# 独立静态端点判定及正常整数ufunc。
|
|
203
|
+
value = _literal_compare(node, values[0])
|
|
204
|
+
# 显式isclose判据由安全批量数值原语实施。
|
|
205
|
+
elif node.operator == 'isclose':
|
|
206
|
+
# 四个实参各自先检查整数精度,不调用np.isclose默认策略。
|
|
207
|
+
a, b, atol, rtol = (to_float_numpy(item) for item in values)
|
|
208
|
+
# 左边abs(a-b),非有限中间结果UNKNOWN。
|
|
209
|
+
distance = unary_numpy('abs', binary_numpy('sub', a, b))
|
|
210
|
+
# 右边rtol*abs(b),保持判据非对称。
|
|
211
|
+
relative = binary_numpy('mul', rtol, unary_numpy('abs', b))
|
|
212
|
+
# atol+relative真实float64列。
|
|
213
|
+
tolerance = binary_numpy('add', atol, relative)
|
|
214
|
+
# 不把非有限容差当作可正常无限阈值。
|
|
215
|
+
value = binary_numpy('le', distance, tolerance)
|
|
216
|
+
# 计算中间诊断同步纳入整列统计。
|
|
217
|
+
diagnostic |= a.quality | b.quality | atol.quality | rtol.quality | distance.quality | tolerance.quality
|
|
218
|
+
else:
|
|
219
|
+
# 只对静态白名单operator执行真实批量数值。
|
|
220
|
+
value = binary_numpy(node.operator, values[0], values[1], allow_float_literal=node.allow_float_literal)
|
|
221
|
+
# known逻辑输出可以有效,诊断是独立原因列。
|
|
222
|
+
result = ArrayEvaluation(value, diagnostic | value.quality)
|
|
223
|
+
# 局部cache只存当前批列结果。
|
|
224
|
+
cache[node] = result
|
|
225
|
+
# 不持有跨调用输入绑定或信号状态。
|
|
226
|
+
return result
|
|
227
|
+
|
|
228
|
+
|
|
229
|
+
def evaluate_numpy(compiled: CompiledExpression, context, bindings: SignalBindings | DecodedBindings | MessageBindings, *, size: int | None = None) -> ArrayEvaluation:
|
|
230
|
+
"""检查绑定、依赖列与行数后,批量计算一个表达式。
|
|
231
|
+
|
|
232
|
+
参数:
|
|
233
|
+
compiled: 当前CompiledExpression;bindings为对应普通或MessageBindings运行绑定。
|
|
234
|
+
context: 以精确依赖别名为键的NumericArray映射;所有列须同长同布局。
|
|
235
|
+
size: 可选的非负行数N。可从第一列推断,纯常量无依赖时必须显式提供。
|
|
236
|
+
返回:
|
|
237
|
+
ArrayEvaluation,结果和诊断均为形状(N,)的独立只读数组,允许N为零。
|
|
238
|
+
异常:
|
|
239
|
+
TypeError、ValueError: 模型、绑定身份、依赖键、类型、枚举域或形状不合法。
|
|
240
|
+
数值失败追加质量原因;内存分配异常直接传播。
|
|
241
|
+
边界:
|
|
242
|
+
不广播或补齐错位列。每次调用创建新缓存,只复用当前批次的公共子树。
|
|
243
|
+
"""
|
|
244
|
+
# 共享协议校验不包含参考数据计算。
|
|
245
|
+
require_context(compiled, context, bindings)
|
|
246
|
+
# 显式行数不得用bool或任意隐式整数对象替代。
|
|
247
|
+
if size is not None and (type(size) is not int or size < 0):
|
|
248
|
+
# 不按int truthiness解读shape。
|
|
249
|
+
raise TypeError('size需要非负原生int')
|
|
250
|
+
# 每个实际依赖列都需相同当前dtype和enum域。
|
|
251
|
+
for name, value in context.items():
|
|
252
|
+
# 对照当前真实定义,不从全局查找。
|
|
253
|
+
definition = bindings.resolve(name)
|
|
254
|
+
# 不接裸数组或错误类型并偷偷astype。
|
|
255
|
+
if not isinstance(value, NumericArray) or value.dtype is not definition.dtype:
|
|
256
|
+
# 类型错误不能补成UNKNOWN。
|
|
257
|
+
raise TypeError('context列dtype与当前绑定不同')
|
|
258
|
+
# 当前声明固定标签域。
|
|
259
|
+
labels = tuple(dict.fromkeys(label for _, label in definition.choices)) if definition.dtype is D.ENUM else ()
|
|
260
|
+
# 相同代码但不同域不允许。
|
|
261
|
+
if value.labels != labels:
|
|
262
|
+
# 来源语义必须明确隔离。
|
|
263
|
+
raise ValueError('context enum域不同')
|
|
264
|
+
# 没有显式行数时取第一合法列,不broadcast。
|
|
265
|
+
if size is None:
|
|
266
|
+
# 只有真正数据列决定N。
|
|
267
|
+
size = len(value.values)
|
|
268
|
+
# 错行数必须执行前拒绝。
|
|
269
|
+
if len(value.values) != size:
|
|
270
|
+
# 不补齐或截断以凑shape。
|
|
271
|
+
raise ValueError('context各列shape不同')
|
|
272
|
+
# 常量无依赖也不能猜输出行数。
|
|
273
|
+
if size is None:
|
|
274
|
+
# 此时context为空,没有合法可推断shape。
|
|
275
|
+
raise ValueError('纯常量批量执行须明确size')
|
|
276
|
+
# 每次批量求值创建新缓存;编译树可复用,上一批的数值结果不继承。
|
|
277
|
+
return _evaluate(compiled.root, context, size, {})
|
|
278
|
+
|
|
279
|
+
|
|
280
|
+
def evaluate_memory_numpy(compiled: CompiledExpression, times: np.ndarray, *, point: bool = False) -> ArrayEvaluation:
|
|
281
|
+
"""从已有内存信号批量对齐到查询时间,再计算表达式。
|
|
282
|
+
|
|
283
|
+
参数:
|
|
284
|
+
compiled: 关联真实输入的CompiledExpression。
|
|
285
|
+
times: 非递减的一维int64纳秒轴,形状(N,);point控制真实末点查询视图。
|
|
286
|
+
返回:
|
|
287
|
+
同形状ArrayEvaluation,保留有效掩码、质量原因和绑定身份。
|
|
288
|
+
异常:
|
|
289
|
+
TypeError: 非memory绑定,包括DecodedBindings;其他时间/归属/形状异常原样传播。
|
|
290
|
+
流程:
|
|
291
|
+
只建立实际依赖的历史列,独立归一化并按有效期对齐,再整列求值。
|
|
292
|
+
纯常量也检查时间轴;保留完整历史,结果复制存储,不额外读取或解码。
|
|
293
|
+
"""
|
|
294
|
+
# 纯常量也不能绕过memory来源门槛,显式错误避免解码绑定缺session属性的偶发异常。
|
|
295
|
+
if not isinstance(compiled, CompiledExpression) or not isinstance(compiled.bindings, SignalBindings):
|
|
296
|
+
raise TypeError('memory快捷求值需要真实SignalBindings的CompiledExpression')
|
|
297
|
+
# 常量表达式也校验真正时间轴,拒绝MaskArray/回退/浮点时间。
|
|
298
|
+
_require_axis(times)
|
|
299
|
+
# 末点控制必须明确bool,不猜truthiness。
|
|
300
|
+
if type(point) is not bool:
|
|
301
|
+
# 保持协议与reference一致。
|
|
302
|
+
raise TypeError('point需要bool')
|
|
303
|
+
# 局部context只材料化实际依赖列。
|
|
304
|
+
context = {}
|
|
305
|
+
# 循环维度是依赖列,列内对齐/计算实际数组化。
|
|
306
|
+
for name in compiled.dependencies:
|
|
307
|
+
# 原输出→独立NumPy额外转换,不重复DBC factor。
|
|
308
|
+
history = memory_series_numpy(compiled.bindings, name)
|
|
309
|
+
# 用searchsorted定位最近观测,并结合有效期与质量掩码决定哪些保持值可用。
|
|
310
|
+
aligned = align_numpy(build_signal_array(history), times, point=point)
|
|
311
|
+
# 原valid/质量保留,包括最新invalid覆盖,enum代码域来自历史。
|
|
312
|
+
context[name] = NumericArray(history.bindings.resolve(name).dtype, aligned.values, aligned.valid, aligned.quality, aligned.history.labels)
|
|
313
|
+
# 精确行数还覆盖无依赖/空查询情况。
|
|
314
|
+
return evaluate_numpy(compiled, context, compiled.bindings, size=len(times))
|
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
"""用独立标量计算求值表达式,并保留未知结果的原因。
|
|
2
|
+
|
|
3
|
+
evaluate_reference接收当前CompiledExpression、真实普通或消息绑定和context。
|
|
4
|
+
context按依赖别名提供ScalarValue,输出Evaluation,分别保存计算结果和
|
|
5
|
+
全部被求值依赖的质量原因。evaluate_memory_reference还可从已有内存行
|
|
6
|
+
提取信号,经参考转换和按时间保持后,在给定纳秒坐标逐点求值。
|
|
7
|
+
|
|
8
|
+
布尔表达式使用TRUE、FALSE、UNKNOWN(未知)三种状态。例如FALSE and
|
|
9
|
+
UNKNOWN可确定为FALSE,TRUE or UNKNOWN可确定为TRUE;被遮蔽的异常
|
|
10
|
+
仍保留在dependency_quality中。isclose按abs(a-b) <= atol + rtol*abs(b)
|
|
11
|
+
计算,两种容差均由表达式显式提供,非有限中间值不能变成正常判断。
|
|
12
|
+
|
|
13
|
+
只依赖标准库和参考数值、对齐模块,不执行任意Python代码,也不读取
|
|
14
|
+
旧日志或额外解码。当前求值缓存不跨时间点保留,不调用NumPy数值内核。
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
# 冻结结果保证逻辑质量与诊断质量清楚分离。
|
|
18
|
+
from dataclasses import dataclass
|
|
19
|
+
# context只接受真实映射,不反射对象属性。
|
|
20
|
+
from collections.abc import Mapping
|
|
21
|
+
# 用静态编译模型和当前真实绑定校验身份。
|
|
22
|
+
from .expression import CompiledExpression
|
|
23
|
+
# 已校验输入绑定不能用用户字符串冒充。
|
|
24
|
+
from .binding import SignalBindings
|
|
25
|
+
# 解码绑定由实际历史核对工厂生成;本入口不创建伪造内存来源。
|
|
26
|
+
from .decoded_binding import DecodedBindings
|
|
27
|
+
# 消息仓使用独立绑定;只接受其显式context,不引入时间保持或原历史。
|
|
28
|
+
from .message_binding import MessageBindings
|
|
29
|
+
# 独立参考数值内核,内部比较映射只有标准运算。
|
|
30
|
+
from .numeric import (COMPARE_FUNCTIONS, ScalarValue, binary_reference, memory_series_reference,
|
|
31
|
+
to_float_reference, unary_reference)
|
|
32
|
+
# 独立参考保持为memory查询生成输入。
|
|
33
|
+
from .state import align_reference
|
|
34
|
+
# 三值使用BOOL的valid,不将UNKNOWN默认转False。
|
|
35
|
+
from .types import QualityFlag as Q, SignalDType as D
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
@dataclass(frozen=True)
|
|
39
|
+
class Evaluation:
|
|
40
|
+
"""分别保存可用的计算结果,以及本次求值的全部质量诊断。
|
|
41
|
+
|
|
42
|
+
value是ScalarValue,其quality表示结果本身不可用的原因。
|
|
43
|
+
dependency_quality另存依赖和计算的原因并集;即使已知FALSE或TRUE使
|
|
44
|
+
布尔结果可以确定,原来的异常也仍可追溯,不能强塞回正常结果的quality。
|
|
45
|
+
实例不可重新赋值,不保存下一个时间点的信号状态。
|
|
46
|
+
"""
|
|
47
|
+
|
|
48
|
+
value: ScalarValue # 实际逻辑输出。
|
|
49
|
+
dependency_quality: Q # 原依赖/本次计算的全部诊断并集。
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def require_context(compiled, context, bindings):
|
|
53
|
+
"""核对表达式的输入身份和调用者提供的依赖名称。
|
|
54
|
+
|
|
55
|
+
参数:
|
|
56
|
+
compiled: 可执行CompiledExpression;context为真实映射对象。
|
|
57
|
+
bindings: 当前SignalBindings、DecodedBindings或MessageBindings,须与编译身份一致。
|
|
58
|
+
返回:
|
|
59
|
+
None。context的键必须恰好等于dependencies,纯常量表达式需空映射。
|
|
60
|
+
异常:
|
|
61
|
+
TypeError: 计划、映射或绑定模型类型不合法。
|
|
62
|
+
ValueError: 绑定身份不同,或依赖键缺失、多余。
|
|
63
|
+
边界:
|
|
64
|
+
只校验结构,不读来源、不求值;各个值的类型由后续执行入口检查。
|
|
65
|
+
"""
|
|
66
|
+
# 执行不能仅凭表达式文本或语义名复用旧绑定。
|
|
67
|
+
if (not isinstance(compiled, CompiledExpression) or not isinstance(bindings, (SignalBindings, DecodedBindings, MessageBindings))
|
|
68
|
+
or not isinstance(compiled.bindings, (SignalBindings, DecodedBindings, MessageBindings)) or not isinstance(context, Mapping)):
|
|
69
|
+
# 不把接口配置错吞为UNKNOWN。
|
|
70
|
+
raise TypeError('执行需要CompiledExpression/context及真实普通或消息绑定')
|
|
71
|
+
# 相同结构名称不证明输入数据/转换/TTL相同。
|
|
72
|
+
if compiled.bindings.identity != bindings.identity:
|
|
73
|
+
# 必须重新编译真实当前绑定。
|
|
74
|
+
raise ValueError('可执行表达式与当前输入绑定身份不同')
|
|
75
|
+
# 普通解码核实际投影,消息绑定核单来源依赖;两者均拒绝静态声明冒充运行域。
|
|
76
|
+
if isinstance(bindings, (DecodedBindings, MessageBindings)):
|
|
77
|
+
bindings.require_synchronized(compiled.dependencies)
|
|
78
|
+
# 禁止缺列/错误列映射/隐式全局取值。
|
|
79
|
+
if set(context) != set(compiled.dependencies):
|
|
80
|
+
# 常量表达式context为空,不猜未提供信号。
|
|
81
|
+
raise ValueError('context必须精确提供表达式dependencies')
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def _logic(operator, values):
|
|
85
|
+
"""独立标量三值and/or/not,不以UNKNOWN当False。
|
|
86
|
+
|
|
87
|
+
参数: operator固定逻辑名,values为BOOL ScalarValue tuple。
|
|
88
|
+
返回: ScalarValue;正常决断quality NONE,未知保留原因并集。
|
|
89
|
+
异常: 调用侧静态类型保证,不接数值truthiness。
|
|
90
|
+
"""
|
|
91
|
+
# not对未知仍保持原原因。
|
|
92
|
+
if operator == 'not':
|
|
93
|
+
# known TRUE/FALSE取反,不使用Truth.__bool__。
|
|
94
|
+
return ScalarValue(not values[0].value, D.BOOL) if values[0].valid else ScalarValue(None, D.BOOL, False, values[0].quality)
|
|
95
|
+
# 所有原因仍在外层Evaluation诊断保存。
|
|
96
|
+
quality = Q.NONE
|
|
97
|
+
# 标量参考逐逻辑值判断,允许独立状态循环。
|
|
98
|
+
for value in values:
|
|
99
|
+
# 同一操作原始原因不丢失。
|
|
100
|
+
quality |= value.quality
|
|
101
|
+
# 对称规则:任一已知False决定and,已知True决定or。
|
|
102
|
+
deciding = False if operator == 'and' else True
|
|
103
|
+
# invalid数值占位不参与判断,不能False-like导致决断。
|
|
104
|
+
if any(value.valid and value.value is deciding for value in values):
|
|
105
|
+
# 结果已知,原异常仍由外层依赖诊断保存。
|
|
106
|
+
return ScalarValue(deciding, D.BOOL)
|
|
107
|
+
# 没有决断值且有unknown,结果仍未知。
|
|
108
|
+
if quality != Q.NONE:
|
|
109
|
+
# 保留真实未知原因而非一律MISSING。
|
|
110
|
+
return ScalarValue(None, D.BOOL, False, quality)
|
|
111
|
+
# 所有已知:and全部TRUE,or全部FALSE。
|
|
112
|
+
return ScalarValue(not deciding, D.BOOL)
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
def _evaluate(node, context, cache):
|
|
116
|
+
"""用独立参考数值解释单个冻结节点及局部公共子树。
|
|
117
|
+
|
|
118
|
+
参数: node静态树;context当前typed值;cache仅本次point局部缓存。
|
|
119
|
+
返回: Evaluation,完整诊断与逻辑有效性分开。
|
|
120
|
+
异常: 静态模型/类型错误直接传播,不eval或吞配置异常。
|
|
121
|
+
"""
|
|
122
|
+
# 公共表达式复用只限同一点/当前真实输入。
|
|
123
|
+
if node in cache:
|
|
124
|
+
# 不跨point继承旧信号值。
|
|
125
|
+
return cache[node]
|
|
126
|
+
# 常量字面量已由编译器完成上下文dtype/域检查。
|
|
127
|
+
if node.operator == 'const':
|
|
128
|
+
# dtype/labels构造不能任意隐式转值。
|
|
129
|
+
value = ScalarValue(node.value, node.dtype, labels=node.labels)
|
|
130
|
+
# literal没有原信号异常。
|
|
131
|
+
result = Evaluation(value, Q.NONE)
|
|
132
|
+
# 只使用当前显式context的简单名称。
|
|
133
|
+
elif node.operator == 'name':
|
|
134
|
+
# 输入包装身份与dtype由外层入口校验。
|
|
135
|
+
value = context[node.name]
|
|
136
|
+
# 上游全部质量同时作为诊断保留。
|
|
137
|
+
result = Evaluation(value, value.quality)
|
|
138
|
+
else:
|
|
139
|
+
# 子树全部求值以保留原依赖异常,即使逻辑已可决断。
|
|
140
|
+
children = tuple(_evaluate(arg, context, cache) for arg in node.args)
|
|
141
|
+
# 当前节点可用逻辑结果,不是原诊断值。
|
|
142
|
+
values = tuple(child.value for child in children)
|
|
143
|
+
# 诊断汇总包括已被已知逻辑结果遮蔽的异常。
|
|
144
|
+
diagnostic = Q.NONE
|
|
145
|
+
# 此为独立标量参考循环,不共享数组归约内核。
|
|
146
|
+
for child in children:
|
|
147
|
+
# 原因并集不会被normal BOOL清除。
|
|
148
|
+
diagnostic |= child.dependency_quality
|
|
149
|
+
# 三值逻辑独立于数值质量门槛。
|
|
150
|
+
if node.operator in ('and', 'or', 'not'):
|
|
151
|
+
# FALSE and UNKNOWN与TRUE or UNKNOWN都可确定结果,diagnostic仍保存原原因。
|
|
152
|
+
value = _logic(node.operator, values)
|
|
153
|
+
# 数值单目用已验收的独立参考函数。
|
|
154
|
+
elif node.operator in ('abs', 'neg'):
|
|
155
|
+
# int64 min依然严格OVERFLOW。
|
|
156
|
+
value = unary_reference(node.operator, values[0])
|
|
157
|
+
# float信号上下文中的整数literal显式精度检查。
|
|
158
|
+
elif node.operator == 'to_float':
|
|
159
|
+
# 不能通过编译隐藏舍入整数。
|
|
160
|
+
value = to_float_reference(values[0])
|
|
161
|
+
# 精确整数比较literal可以超过64位边界。
|
|
162
|
+
elif node.operator.startswith('int_literal_'):
|
|
163
|
+
# Python整数参考绝不先转float。
|
|
164
|
+
value = ScalarValue(COMPARE_FUNCTIONS[node.operator[12:]](values[0].value, node.value), D.BOOL) if values[0].valid else ScalarValue(None, D.BOOL, False, values[0].quality)
|
|
165
|
+
# isclose严格按明确非对称判据,拒绝默认容差。
|
|
166
|
+
elif node.operator == 'isclose':
|
|
167
|
+
# 四个数值都经各自严格float精度检查。
|
|
168
|
+
a, b, atol, rtol = (to_float_reference(item) for item in values)
|
|
169
|
+
# 判据abs(a-b),非有限中间值仍显式UNKNOWN。
|
|
170
|
+
distance = unary_reference('abs', binary_reference('sub', a, b))
|
|
171
|
+
# 右边rtol*abs(b)的参考IEEE路径。
|
|
172
|
+
relative = binary_reference('mul', rtol, unary_reference('abs', b))
|
|
173
|
+
# atol与relative依旧用明确数值质量规则。
|
|
174
|
+
tolerance = binary_reference('add', atol, relative)
|
|
175
|
+
# 不把非有限容差当无穷阈值正常通过。
|
|
176
|
+
value = binary_reference('le', distance, tolerance)
|
|
177
|
+
# 当前中间数值原因也纳入原依赖诊断。
|
|
178
|
+
diagnostic |= a.quality | b.quality | atol.quality | rtol.quality | distance.quality | tolerance.quality
|
|
179
|
+
else:
|
|
180
|
+
# 编译树只包含注册二元数值/比较,不执行自由函数。
|
|
181
|
+
value = binary_reference(node.operator, values[0], values[1], allow_float_literal=node.allow_float_literal)
|
|
182
|
+
# 结果原因是诊断子集,known决断不丢所有依赖质量。
|
|
183
|
+
result = Evaluation(value, diagnostic | value.quality)
|
|
184
|
+
# 仅当前point的公共子树值可以复用。
|
|
185
|
+
cache[node] = result
|
|
186
|
+
# 冻结结果不持有跨调用可变状态。
|
|
187
|
+
return result
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
def evaluate_reference(compiled: CompiledExpression, context: Mapping, bindings: SignalBindings | DecodedBindings | MessageBindings) -> Evaluation:
|
|
191
|
+
"""检查当前标量输入后,对表达式进行一次独立参考求值。
|
|
192
|
+
|
|
193
|
+
参数:
|
|
194
|
+
compiled: 当前CompiledExpression;bindings为对应的普通或MessageBindings运行绑定。
|
|
195
|
+
context: 以精确依赖别名为键的ScalarValue映射,声明类型与枚举域须匹配。
|
|
196
|
+
返回:
|
|
197
|
+
Evaluation,区分正常或未知的计算结果,并保留所有依赖的质量诊断。
|
|
198
|
+
异常:
|
|
199
|
+
TypeError、ValueError: 依赖键、模型、类型、枚举域或绑定身份不合法。
|
|
200
|
+
数值计算失败写入质量原因,不把配置错误当作缺失数据。
|
|
201
|
+
边界:
|
|
202
|
+
每次调用使用新缓存,只复用本次求值中的公共子树,不继承上一次的值。
|
|
203
|
+
"""
|
|
204
|
+
# 静态执行身份和列映射须执行前成立。
|
|
205
|
+
require_context(compiled, context, bindings)
|
|
206
|
+
# 校验真实当前dtype和枚举域,不能只靠上下文名字。
|
|
207
|
+
for name, value in context.items():
|
|
208
|
+
# 冻结定义来自当前真实绑定。
|
|
209
|
+
definition = bindings.resolve(name)
|
|
210
|
+
# 只有typed标量可执行,不把裸float当信号。
|
|
211
|
+
if not isinstance(value, ScalarValue) or value.dtype is not definition.dtype:
|
|
212
|
+
# 输入类型冲突不是样本缺失。
|
|
213
|
+
raise TypeError('context值与当前signal dtype不一致')
|
|
214
|
+
# enum域需与真实映射一致。
|
|
215
|
+
labels = tuple(dict.fromkeys(item for _, item in definition.choices)) if definition.dtype is D.ENUM else ()
|
|
216
|
+
# 不让不同任务同名code域串入。
|
|
217
|
+
if value.labels != labels:
|
|
218
|
+
# 命名一致不证明语义域一致。
|
|
219
|
+
raise ValueError('context enum域与绑定不同')
|
|
220
|
+
# 每个时间点都创建新缓存,避免沿用上个时间点的信号值。
|
|
221
|
+
return _evaluate(compiled.root, context, {})
|
|
222
|
+
|
|
223
|
+
|
|
224
|
+
def evaluate_memory_reference(compiled: CompiledExpression, times: tuple[int, ...], *, point: bool = False) -> tuple[Evaluation, ...]:
|
|
225
|
+
"""从已有内存行取得信号,在指定纳秒坐标逐点计算表达式。
|
|
226
|
+
|
|
227
|
+
参数:
|
|
228
|
+
compiled: 关联真实内存输入的CompiledExpression。
|
|
229
|
+
times: 非递减的整数纳秒元组;point控制真实末点查询视图。
|
|
230
|
+
返回:
|
|
231
|
+
与times等长的Evaluation元组,保存正常值、未知状态和依赖诊断。
|
|
232
|
+
异常:
|
|
233
|
+
TypeError: 非memory绑定,包括DecodedBindings;其他时间/来源/配置异常原样传播。
|
|
234
|
+
边界:
|
|
235
|
+
只提取实际依赖,先归一化再按有效期保持;纯常量也检查时间轴。
|
|
236
|
+
为完整内存历史建立新对象,不读取文件、额外解码或修改原行。
|
|
237
|
+
"""
|
|
238
|
+
# 纯常量也须明确拒绝解码绑定,不能借空依赖意外进入memory快捷路径。
|
|
239
|
+
if not isinstance(compiled, CompiledExpression) or not isinstance(compiled.bindings, SignalBindings):
|
|
240
|
+
raise TypeError('memory快捷求值需要真实SignalBindings的CompiledExpression')
|
|
241
|
+
# 仅材料化当前实际依赖,不改变旧链筛选或扫描次数。
|
|
242
|
+
histories = {name: memory_series_reference(compiled.bindings, name) for name in compiled.dependencies}
|
|
243
|
+
# 参考保持与数组查询实现独立。
|
|
244
|
+
aligned = {name: align_reference(series, times, point=point) for name, series in histories.items()}
|
|
245
|
+
# 当前memory空依赖也需严格校验时间/视图接口。
|
|
246
|
+
if not histories:
|
|
247
|
+
# 常量没有来源,时间轴依旧遵守typed ns协议。
|
|
248
|
+
from ..timebase.conversion import require_int64_ns
|
|
249
|
+
# 不能将自由序列或int truthiness解释成合法时间轴。
|
|
250
|
+
if not isinstance(times, tuple) or type(point) is not bool:
|
|
251
|
+
# 同参考保持输入结构要求。
|
|
252
|
+
raise TypeError('times需tuple且point需bool')
|
|
253
|
+
# 每个坐标仍必须合法定宽且不回退。
|
|
254
|
+
for index, time in enumerate(times):
|
|
255
|
+
# 精确整数时间不经float转换。
|
|
256
|
+
require_int64_ns(time, 'time_ns')
|
|
257
|
+
# 不排序用户输入掩盖异常。
|
|
258
|
+
if index and time < times[index-1]:
|
|
259
|
+
# 空依赖也不是时间回退豁免。
|
|
260
|
+
raise ValueError('时间轴回退')
|
|
261
|
+
# 当前点只使用已对齐的真实结果,invalid原值保留。
|
|
262
|
+
results = []
|
|
263
|
+
# 标量参考允许逐时间解释,不冒充数组化。
|
|
264
|
+
for index in range(len(times)):
|
|
265
|
+
# 当前局部context不跨时间保存数值。
|
|
266
|
+
context = {name: ScalarValue(states[index].value, compiled.bindings.resolve(name).dtype, states[index].valid, states[index].quality,
|
|
267
|
+
tuple(dict.fromkeys(label for _, label in compiled.bindings.resolve(name).choices)) if compiled.bindings.resolve(name).dtype is D.ENUM else ())
|
|
268
|
+
for name, states in aligned.items()}
|
|
269
|
+
# 完整绑定身份再次门槛校验后运行真实参考。
|
|
270
|
+
results.append(evaluate_reference(compiled, context, compiled.bindings))
|
|
271
|
+
# 返回不可变结果,不持有全局任务状态。
|
|
272
|
+
return tuple(results)
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"""将完整积分事实与已换单位的数值组合成既有 CalculationResult。
|
|
2
|
+
|
|
3
|
+
输入必须是同一 IntegralReduction 交付的两项冻结结果;不创建虚假 CalculationSeries。
|
|
4
|
+
先校验单位、覆盖划分和计数,再复用既有 report/strict 与最低覆盖门槛分类。
|
|
5
|
+
本层没有积分数值核,不重复换单位,也不把输入质量中的非有限直接当整窗计算失败。
|
|
6
|
+
无文件副作用;分类会复制未知区间容器,调用方须事先预约元数据工作空间。
|
|
7
|
+
纯模型不含共同运行凭据,结构校验不能证明来源配对,实际 owner 负责保证。
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
# 共享非数值分类规则,两个积分后端仍独立;真实 facts 自带完整身份和定位。
|
|
11
|
+
from .integral_terms import IntegralFacts
|
|
12
|
+
from .integral_sum import IntegralSumResult
|
|
13
|
+
from .calculations import CalculationResult, calculation_unit, make_calculation_result
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def make_integral_result(facts: IntegralFacts, number: IntegralSumResult) -> CalculationResult:
|
|
17
|
+
"""把同一归约的数值及完整覆盖按现有政策归类。
|
|
18
|
+
|
|
19
|
+
参数: facts 为完整真实交集事实;number 为已经换成最终单位的数值快照。
|
|
20
|
+
返回: CalculationResult,保留原请求、样本、未知范围、质量及完整来源子类。
|
|
21
|
+
异常: TypeError/ValueError 为模型、单位、范围或计数矛盾;分配错误传播。
|
|
22
|
+
边界: 无条件积分,已知条件时长等于实际跨度;没有全 FALSE 的选择证据。
|
|
23
|
+
"""
|
|
24
|
+
# 不以任意对象提供的同名属性冒充真实冻结结果,单位只校验而不再乘因子。
|
|
25
|
+
if not isinstance(facts, IntegralFacts) or not isinstance(number, IntegralSumResult):
|
|
26
|
+
raise TypeError('积分分类需要IntegralFacts和IntegralSumResult')
|
|
27
|
+
unit, _ = calculation_unit(facts.spec, facts.input_unit)
|
|
28
|
+
if number.unit != unit:
|
|
29
|
+
raise ValueError('积分数值输出单位与原请求不一致')
|
|
30
|
+
actual, request = facts.actual_window, facts.spec.window
|
|
31
|
+
duration = 0 if actual is None else actual.end_ns - actual.start_ns
|
|
32
|
+
if actual is not None and not request.start_ns <= actual.start_ns <= actual.end_ns <= request.end_ns:
|
|
33
|
+
raise ValueError('积分实际观测越过原请求')
|
|
34
|
+
# 每个有效面积对应正整数纳秒区间;真实有效更新不能多于有效面积项。
|
|
35
|
+
if (not 0 <= facts.valid_sample_count <= number.valid_term_count <= facts.value_valid_duration_ns
|
|
36
|
+
or (number.valid_term_count == 0) != (facts.value_valid_duration_ns == 0)):
|
|
37
|
+
raise ValueError('积分面积项数、有效时长与真实样本不一致')
|
|
38
|
+
# 严格检查完整划分,不能用重复未知范围或缺失区间伪造覆盖。
|
|
39
|
+
cursor = 0 if actual is None else actual.start_ns
|
|
40
|
+
unknown_duration = 0
|
|
41
|
+
for interval in facts.value_unknown_ranges:
|
|
42
|
+
if interval.start_ns < cursor:
|
|
43
|
+
raise ValueError('积分未知范围需有序且不重叠')
|
|
44
|
+
cursor = interval.end_ns
|
|
45
|
+
unknown_duration += interval.end_ns - interval.start_ns
|
|
46
|
+
if unknown_duration + facts.value_valid_duration_ns != duration:
|
|
47
|
+
raise ValueError('积分有效与未知时长未完整划分实际窗口')
|
|
48
|
+
# 现有分类只从第二参数取identity/refs,直接提供真实facts,不伪造全窗信号列。
|
|
49
|
+
return make_calculation_result(facts.spec, facts, number.value, number.unit, actual,
|
|
50
|
+
facts.value_valid_duration_ns, duration, facts.value_valid_duration_ns,
|
|
51
|
+
unknown_duration, facts.valid_sample_count, facts.value_unknown_ranges, (),
|
|
52
|
+
facts.quality | number.quality, all_false=False,
|
|
53
|
+
calculation_failed=number.calculation_failed)
|