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,225 @@
|
|
|
1
|
+
"""用三格式共用的消息计算一项逐报文累计,不建立消息历史或原帧副本。
|
|
2
|
+
|
|
3
|
+
输入是CAN读取进程投影后的有限LegacyDecodedUpdate批,公式使用本条值,不保持上一条。
|
|
4
|
+
复用既有归一化、参考/NumPy表达式、正负分桶及原序求和;period已经在公式
|
|
5
|
+
中时不再乘dt。结果是累计快照;来源是否完整读完由拥有读取器的调用方确认。
|
|
6
|
+
此组件由当前记录执行器调用,不创建旧绑定证明或额外核验扫描。
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from ..core import expression_reference, expression_numpy
|
|
10
|
+
from ..core.expression import validate_expression
|
|
11
|
+
from ..core.models import Interval
|
|
12
|
+
from ..core.numeric import to_float_reference
|
|
13
|
+
from ..core.numeric_numpy import to_float_numpy
|
|
14
|
+
from ..core.types import QualityFlag as Q
|
|
15
|
+
from ..legacy.sum import LegacySumAccumulator, LegacySumContribution, LegacySkipReason
|
|
16
|
+
from ..legacy.updates import LegacyDecodedUpdate
|
|
17
|
+
from ..planning.message_calculations import require_message_calculation
|
|
18
|
+
from ..results.budget import ResourceBudget, _reserve_owned_ram, _release_owned_ram, _cleanup_owner
|
|
19
|
+
from ..results.errors import ResultClosedError
|
|
20
|
+
from ..sources.can_spec import can_field_from_key
|
|
21
|
+
from ..sources.packing import pack_message_values
|
|
22
|
+
from .calculation_values import scalar_from_column, direction_bucket_state, direction_skip_reason
|
|
23
|
+
from .history import _metadata_bytes
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class CurrentMessageCalculation:
|
|
27
|
+
"""持有一项公式与固定累计状态;输入批及明细回调都只在consume期间借用。"""
|
|
28
|
+
|
|
29
|
+
def __init__(self, calculation, sources, bindings, session_id, budget, *, backend='numpy',
|
|
30
|
+
batch_rows=64, domain=None, contribution_consumer=None):
|
|
31
|
+
"""先核有限声明,再预约公式和累计状态,不读输入或DBC。
|
|
32
|
+
|
|
33
|
+
参数: calculation/sources/bindings为同一计划声明;session_id为会话;budget为
|
|
34
|
+
共享预算;backend为独立数值核;batch_rows为批上限;domain为可选
|
|
35
|
+
实际时间筛选;contribution_consumer仅显式请求明细时接收(贡献,本次质量)。
|
|
36
|
+
返回: 新累计组件。异常: 声明/预算/取消错误;失败构造携带可重试清理句柄。
|
|
37
|
+
"""
|
|
38
|
+
require_message_calculation(calculation, sources, bindings)
|
|
39
|
+
if not isinstance(budget, ResourceBudget) or backend not in ('reference', 'numpy'):
|
|
40
|
+
raise TypeError('逐消息计算需要共享预算及明确数值后端')
|
|
41
|
+
if type(batch_rows) is not int or not 1 <= batch_rows <= 4096:
|
|
42
|
+
raise ValueError('逐消息计算批上限需要1到4096')
|
|
43
|
+
if domain is not None and not isinstance(domain, Interval):
|
|
44
|
+
raise TypeError('消息时间筛选需要Interval或None')
|
|
45
|
+
if contribution_consumer is not None and not callable(contribution_consumer):
|
|
46
|
+
raise TypeError('贡献消费者需要可调用对象或None')
|
|
47
|
+
self._budget = budget
|
|
48
|
+
self._held_cost = self._fixed_cost = self._batch_cost = 0
|
|
49
|
+
self._accumulator = self._compiled = self._fields = self._match_fields = None
|
|
50
|
+
self._closed = self._failed = self._closing = False
|
|
51
|
+
self._calculation, self._domain = calculation, domain
|
|
52
|
+
self._session, self._backend, self._batch_rows = session_id, backend, batch_rows
|
|
53
|
+
self._consumer = contribution_consumer
|
|
54
|
+
self._quality = Q.NONE
|
|
55
|
+
try:
|
|
56
|
+
# 配置仅保存一次;批内列空间另按当前实际条数预约,不保逐条原文或证明。
|
|
57
|
+
_reserve_owned_ram(self, 65536 + 32 * _metadata_bytes(calculation), '_fixed_cost')
|
|
58
|
+
self._compiled = validate_expression(calculation.expr.text, calculation.expr.bindings, unit=calculation.unit)
|
|
59
|
+
if (self._compiled.normalized_ast != calculation.expr.normalized_ast
|
|
60
|
+
or repr(self._compiled.root) != repr(calculation.expr.root)):
|
|
61
|
+
raise ValueError('当前消息公式与已校验声明不同')
|
|
62
|
+
self._fields = tuple((name, bindings.resolve(name), can_field_from_key(bindings.resolve(name).field))
|
|
63
|
+
for name in self._compiled.dependencies)
|
|
64
|
+
# 树只在初始化数一次;运行批次不为计费重新遍历或编码公式。
|
|
65
|
+
pending, node_count = [self._compiled.root], 0
|
|
66
|
+
while pending:
|
|
67
|
+
node = pending.pop()
|
|
68
|
+
node_count += 1
|
|
69
|
+
pending.extend(node.args)
|
|
70
|
+
self._row_cost = 2048 + 2048 * len(self._fields) + 512 * node_count
|
|
71
|
+
self._direction = (None if calculation.disjunction is None else
|
|
72
|
+
can_field_from_key(bindings.resolve(calculation.disjunction.signal).field))
|
|
73
|
+
# 固定类型约束只整理一次,不在每帧构造新的依赖列表。
|
|
74
|
+
self._match_fields = tuple(field for _, _, field in self._fields)
|
|
75
|
+
if self._direction is not None:
|
|
76
|
+
self._match_fields += (self._direction,)
|
|
77
|
+
self._actual_identity = None
|
|
78
|
+
# 单条累计需要的固定工作区在读输入前预留;多条批仅申请超出部分。
|
|
79
|
+
self._accumulator = LegacySumAccumulator(budget, session_id, calculation.source,
|
|
80
|
+
legacy_policy=calculation.message_policy, backend=backend, max_batch_rows=batch_rows,
|
|
81
|
+
prepay_single=True)
|
|
82
|
+
except BaseException as exc:
|
|
83
|
+
child = getattr(exc, 'legacy_sum_cleanup_owner', None)
|
|
84
|
+
if child is not None:
|
|
85
|
+
self._accumulator = child
|
|
86
|
+
_cleanup_owner(self, exc, 'current_message_calculation_cleanup_owner', '共同消息计算')
|
|
87
|
+
raise
|
|
88
|
+
|
|
89
|
+
def _require_open(self):
|
|
90
|
+
"""阻止失败后继续交付结果。参数: 无。返回: None。异常: ResultClosedError。"""
|
|
91
|
+
if self._closed or self._closing or self._failed:
|
|
92
|
+
raise ResultClosedError('共同消息计算已关闭、失败或正在清理')
|
|
93
|
+
|
|
94
|
+
def _matches(self, update):
|
|
95
|
+
"""核真实消息来源后选择本指标帧。参数: update。返回: bool。异常: 类型/身份错。"""
|
|
96
|
+
if not isinstance(update, LegacyDecodedUpdate):
|
|
97
|
+
raise TypeError('共同消息计算需要已投影的真实更新')
|
|
98
|
+
if update.source != self._calculation.source or update.source_ref.session_id != self._session:
|
|
99
|
+
raise ValueError('消息不属于当前来源或会话')
|
|
100
|
+
selector = self._calculation.update_message
|
|
101
|
+
if (update.is_remote or update.is_error or
|
|
102
|
+
(update.channel, update.frame_id) != (selector.channel, selector.frame_id)
|
|
103
|
+
or selector.is_extended is not None and selector.is_extended != update.is_extended
|
|
104
|
+
or selector.is_fd is not None and selector.is_fd != update.is_fd):
|
|
105
|
+
return False
|
|
106
|
+
# 选择器未限制类型时,各依赖仍须来自本条实际帧,不能拿另一帧的同名信号。
|
|
107
|
+
if any(field.is_extended is not None and field.is_extended != update.is_extended
|
|
108
|
+
or field.is_fd is not None and field.is_fd != update.is_fd for field in self._match_fields):
|
|
109
|
+
return False
|
|
110
|
+
# 自动绑定的投影只保留本帧所属信号;真正解码缺值会显式保留None。
|
|
111
|
+
# 显式类型的低层调用仍允许缺键表示缺值,保持原有输入合同。
|
|
112
|
+
if any((field.is_extended is None or field.is_fd is None)
|
|
113
|
+
and field.signal not in update.values for field in self._match_fields):
|
|
114
|
+
return False
|
|
115
|
+
identity = (update.is_extended, update.is_fd)
|
|
116
|
+
if self._actual_identity is not None and self._actual_identity != identity:
|
|
117
|
+
raise ValueError('逐消息选择匹配多种帧类型,请补充is_extended或is_fd')
|
|
118
|
+
self._actual_identity = identity
|
|
119
|
+
if self._domain is not None:
|
|
120
|
+
if update.time_ns is None:
|
|
121
|
+
raise ValueError('有时间筛选的消息不能省略时间')
|
|
122
|
+
return self._domain.start_ns <= update.time_ns < self._domain.end_ns
|
|
123
|
+
return True
|
|
124
|
+
|
|
125
|
+
def consume(self, updates):
|
|
126
|
+
"""按原序计算有限批;默认只累计,明细仅交给显式回调,不保存历史。
|
|
127
|
+
|
|
128
|
+
参数: updates为最多batch_rows条更新的tuple。返回: None。
|
|
129
|
+
异常: 输入/数值/预算/回调/取消错误原样传播;失败后只能close。
|
|
130
|
+
"""
|
|
131
|
+
self._require_open()
|
|
132
|
+
selected = columns = context = arrays = floats = contributions = qualities = None
|
|
133
|
+
primary = None
|
|
134
|
+
try:
|
|
135
|
+
if type(updates) is not tuple or len(updates) > self._batch_rows:
|
|
136
|
+
raise ValueError('共同消息计算需要不超批上限的tuple')
|
|
137
|
+
if not updates:
|
|
138
|
+
return
|
|
139
|
+
# 借用输入值,不复制原消息;预付筛选、归一化列、表达式临时列和贡献包装。
|
|
140
|
+
cost = 16384 + len(updates) * self._row_cost
|
|
141
|
+
_reserve_owned_ram(self, cost, '_batch_cost')
|
|
142
|
+
selected = tuple(update for update in updates if self._matches(update))
|
|
143
|
+
if not selected:
|
|
144
|
+
return
|
|
145
|
+
columns = {name: pack_message_values(definition, tuple(update.values.get(field.signal)
|
|
146
|
+
for update in selected), self._backend) for name, definition, field in self._fields}
|
|
147
|
+
if self._backend == 'numpy':
|
|
148
|
+
arrays = expression_numpy._evaluate(self._compiled.root, columns, len(selected), {})
|
|
149
|
+
floats = to_float_numpy(arrays.value)
|
|
150
|
+
contributions = []
|
|
151
|
+
qualities = [] if self._consumer is not None else None
|
|
152
|
+
for index, update in enumerate(selected):
|
|
153
|
+
if self._backend == 'reference':
|
|
154
|
+
context = {name: scalar_from_column(column, index) for name, column in columns.items()}
|
|
155
|
+
value = to_float_reference(expression_reference._evaluate(self._compiled.root, context, {}).value)
|
|
156
|
+
else:
|
|
157
|
+
value = scalar_from_column(floats, index)
|
|
158
|
+
# 保旧原因优先级,缺值明确跳过,不能恢复上一条有效值。
|
|
159
|
+
reason = None
|
|
160
|
+
if not value.valid:
|
|
161
|
+
flags = [int(column.quality[index]) for column in columns.values()]
|
|
162
|
+
reason = (LegacySkipReason.MISSING_INPUT if any(flag & int(Q.MISSING) for flag in flags)
|
|
163
|
+
else LegacySkipReason.NONFINITE_INPUT if any(flag & int(Q.NONFINITE) for flag in flags)
|
|
164
|
+
else LegacySkipReason.EVALUATION_ERROR)
|
|
165
|
+
contribution_quality = update.quality | value.quality
|
|
166
|
+
if self._direction is not None:
|
|
167
|
+
quality, keep = direction_bucket_state(update.values.get(self._direction.signal), self._calculation.disjunction.bucket)
|
|
168
|
+
reason = direction_skip_reason(value, reason, quality, keep)
|
|
169
|
+
contribution_quality |= quality
|
|
170
|
+
# 业务结果需要的质量直接来自本次求值;未选中的另一桶不制造缺失诊断。
|
|
171
|
+
if reason is not LegacySkipReason.CONDITION_FALSE:
|
|
172
|
+
self._quality |= value.quality
|
|
173
|
+
if self._direction is not None:
|
|
174
|
+
self._quality |= quality
|
|
175
|
+
contributions.append(LegacySumContribution(update,
|
|
176
|
+
value.value if value.valid and reason is None else None, reason))
|
|
177
|
+
if qualities is not None:
|
|
178
|
+
qualities.append(contribution_quality)
|
|
179
|
+
self._accumulator.consume(tuple(contributions))
|
|
180
|
+
if self._consumer is not None:
|
|
181
|
+
for contribution, quality in zip(contributions, qualities):
|
|
182
|
+
self._consumer(contribution, quality)
|
|
183
|
+
except BaseException as exc:
|
|
184
|
+
primary = exc
|
|
185
|
+
self._failed = True
|
|
186
|
+
raise
|
|
187
|
+
finally:
|
|
188
|
+
# 清理先断当前有限列;释放失败仍保owner费用,不能继续累计或返回快照。
|
|
189
|
+
selected = columns = context = arrays = floats = contributions = qualities = None
|
|
190
|
+
try:
|
|
191
|
+
_release_owned_ram(self, self._batch_cost, '_batch_cost')
|
|
192
|
+
except BaseException as cleanup:
|
|
193
|
+
self._failed = True
|
|
194
|
+
if primary is None:
|
|
195
|
+
raise
|
|
196
|
+
primary.add_note('共同消息批费用清理失败:' + type(cleanup).__name__)
|
|
197
|
+
|
|
198
|
+
def snapshot(self):
|
|
199
|
+
"""读取当前累计,不冒充文件EOF。参数: 无。返回: LegacySumSnapshot。异常: 状态错。"""
|
|
200
|
+
self._require_open()
|
|
201
|
+
return self._accumulator.snapshot()
|
|
202
|
+
|
|
203
|
+
@property
|
|
204
|
+
def quality(self):
|
|
205
|
+
"""读取实际参与计算的质量汇总,不构造逐条诊断。参数: 无。返回: QualityFlag。异常: 状态错。"""
|
|
206
|
+
self._require_open()
|
|
207
|
+
return self._quality
|
|
208
|
+
|
|
209
|
+
@property
|
|
210
|
+
def closed(self):
|
|
211
|
+
"""读取释放完成状态。参数: 无。返回: bool。异常: 无。"""
|
|
212
|
+
return self._closed
|
|
213
|
+
|
|
214
|
+
def close(self):
|
|
215
|
+
"""仅关闭自有累计与费用。参数: 无。返回: None。异常: 释放失败保留句柄供重试。"""
|
|
216
|
+
if self._closed:
|
|
217
|
+
return
|
|
218
|
+
self._closing = True
|
|
219
|
+
if self._accumulator is not None:
|
|
220
|
+
self._accumulator.close()
|
|
221
|
+
self._compiled = self._fields = self._match_fields = self._calculation = self._consumer = self._direction = None
|
|
222
|
+
self._actual_identity = None
|
|
223
|
+
_release_owned_ram(self, self._batch_cost, '_batch_cost')
|
|
224
|
+
_release_owned_ram(self, self._fixed_cost, '_fixed_cost')
|
|
225
|
+
self._closed = True
|
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
"""从已提交的同刻信号状态取得所选驱动的数值或BOOL表达式,不保存输入历史。
|
|
2
|
+
|
|
3
|
+
输入是经过来源校验、归一化和同刻政策处理的LatestSignalState,以及静态
|
|
4
|
+
表达式声明;每个驱动更新最多返回一个(time, value, valid_until)计算点。
|
|
5
|
+
按实际更新时间判断valid_for,复用既有独立参考/NumPy算术内核;固定周期
|
|
6
|
+
不进入此组件。最新值归state持有,临时求值空间在共享预算中预付。
|
|
7
|
+
这是新按需执行的内部接点,不生成CompiledExpression或伪造EOF/绑定证据,
|
|
8
|
+
不改变公开表达式入口拒绝StaticExpression的契约。来源读取/同刻归组由调用方负责。
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from dataclasses import replace
|
|
12
|
+
from ..core import expression_reference, expression_numpy
|
|
13
|
+
from ..core.expression import StaticExpression, validate_expression
|
|
14
|
+
from ..core.declarations import DeclarationBindings
|
|
15
|
+
from ..core.numeric import ScalarValue
|
|
16
|
+
from ..core.types import SignalDType as D, QualityFlag as Q
|
|
17
|
+
from ..results.budget import _reserve_owned_ram, _release_owned_ram, _cleanup_owner
|
|
18
|
+
from ..results.errors import ResultClosedError
|
|
19
|
+
from ..timebase.conversion import require_int64_ns
|
|
20
|
+
from .history import _metadata_bytes
|
|
21
|
+
from .calculation_values import scalar_from_column
|
|
22
|
+
from .state import LatestSignalState
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class DriverExpression:
|
|
26
|
+
"""借用最新状态,持有已核实的表达式树与依赖;不跨组缓存计算值。"""
|
|
27
|
+
|
|
28
|
+
def __init__(self, static, state, driver, *, backend='numpy', derived=(), observation_ends=None):
|
|
29
|
+
"""核对声明与实际状态映射,预付树和依赖引用费用。
|
|
30
|
+
|
|
31
|
+
参数: static为StaticExpression;state为已校验来源的共享最新状态;
|
|
32
|
+
driver为所选原信号别名;None用于实际间隔,每个完整必要更新组求值。
|
|
33
|
+
backend选择数值核;derived为原派生声明。
|
|
34
|
+
返回: 新owner。异常: 声明不一致、非数值/BOOL表达式、预算或取消错误;
|
|
35
|
+
构造清理失败提供driver_expression_cleanup_owner重试句柄。
|
|
36
|
+
"""
|
|
37
|
+
if (type(static) is not StaticExpression or type(static.bindings) is not DeclarationBindings
|
|
38
|
+
or not isinstance(state, LatestSignalState)):
|
|
39
|
+
raise TypeError('驱动求值需要静态表达式及真实最新状态')
|
|
40
|
+
if backend not in ('reference', 'numpy'):
|
|
41
|
+
raise ValueError('驱动求值后端需要reference或numpy')
|
|
42
|
+
if static.root.dtype not in (D.FLOAT64, D.INT64, D.UINT64, D.BOOL,D.ENUM):
|
|
43
|
+
raise ValueError('驱动求值需要数值、BOOL或ENUM表达式')
|
|
44
|
+
self._budget, self._state = state.budget, state
|
|
45
|
+
self._held_cost = self._fixed_cost = self._work_cost = 0
|
|
46
|
+
self._closed = self._closing = self._failed = False
|
|
47
|
+
self._static = self._definitions = None
|
|
48
|
+
self._last_revision = 0
|
|
49
|
+
self._last_group_time = None
|
|
50
|
+
self._invalidated_at = None
|
|
51
|
+
self._last_value = None
|
|
52
|
+
self._driver, self._backend = driver, backend
|
|
53
|
+
self._observation_ends = observation_ends
|
|
54
|
+
try:
|
|
55
|
+
_reserve_owned_ram(self, 65536 + 32 * _metadata_bytes((static, derived)), '_fixed_cost')
|
|
56
|
+
checked = validate_expression(static.text, static.bindings, derived=derived, unit=static.root.unit)
|
|
57
|
+
if checked != static:
|
|
58
|
+
raise ValueError('驱动表达式与原声明不一致')
|
|
59
|
+
if static.bindings.session_id != state.session_id:
|
|
60
|
+
raise ValueError('驱动表达式不属于当前会话')
|
|
61
|
+
names = set(static.dependencies) | ({driver} if driver is not None else set())
|
|
62
|
+
for name in names:
|
|
63
|
+
declared = static.bindings.resolve(name)
|
|
64
|
+
actual = state.definitions.get(name)
|
|
65
|
+
# 唯一允许的启动补全是待DBC的有效期;字段、转换及其他身份仍逐项相同。
|
|
66
|
+
if declared.valid_for_ns is None and actual is not None:
|
|
67
|
+
declared = replace(declared, valid_for_ns=actual.valid_for_ns)
|
|
68
|
+
if actual != declared:
|
|
69
|
+
raise ValueError('驱动表达式与实际信号定义不同:' + str(name))
|
|
70
|
+
static.bindings.require_synchronized(tuple(sorted(names)))
|
|
71
|
+
self._static = checked
|
|
72
|
+
self._definitions = tuple((name, state.definitions[name]) for name in static.dependencies)
|
|
73
|
+
# 费用随表达式复杂度和依赖数增长,不随输入记录数增长。
|
|
74
|
+
nodes, pending = 0, [checked.root]
|
|
75
|
+
self._boolean_short_circuit = False
|
|
76
|
+
while pending:
|
|
77
|
+
node = pending.pop()
|
|
78
|
+
nodes += 1
|
|
79
|
+
self._boolean_short_circuit |= node.operator in ('and', 'or')
|
|
80
|
+
pending.extend(node.args)
|
|
81
|
+
self._workspace = 65536 + nodes * 4096 + len(self._definitions) * 4096
|
|
82
|
+
except BaseException as exc:
|
|
83
|
+
_cleanup_owner(self, exc, 'driver_expression_cleanup_owner', '驱动表达式')
|
|
84
|
+
raise
|
|
85
|
+
finally:
|
|
86
|
+
# 构造失败保留异常栈时,不让临时编译树在退款后继续存活。
|
|
87
|
+
checked = pending = node = static = state = derived = None
|
|
88
|
+
|
|
89
|
+
def _require_open(self):
|
|
90
|
+
"""拒绝失败或关闭后的求值。参数: 无。返回: None。异常: ResultClosedError。"""
|
|
91
|
+
if self._closed or self._closing or self._failed or self._state.closed:
|
|
92
|
+
raise ResultClosedError('驱动表达式或借用状态已关闭/失败')
|
|
93
|
+
|
|
94
|
+
def _context_at(self, time_ns, *, continuous=False):
|
|
95
|
+
"""读取当前持有值在实际时刻的有效性。参数: time_ns整数ns。返回: context及未来到期点。异常: 模型/分配错误。"""
|
|
96
|
+
context, deadlines = {}, []
|
|
97
|
+
for name, definition in self._definitions:
|
|
98
|
+
sample = self._state.get(name)
|
|
99
|
+
end = None if self._observation_ends is None else self._observation_ends.get(definition.source)
|
|
100
|
+
if sample is None:
|
|
101
|
+
# bool 的 choices 是输入编码到真假值的映射,只有 enum 才携带文字域。
|
|
102
|
+
# 首样本未到时保持 MISSING,不把配置映射误当成观测值或枚举标签。
|
|
103
|
+
value = ScalarValue(None, definition.dtype, False, Q.MISSING,
|
|
104
|
+
tuple(dict.fromkeys(label for _, label in definition.choices))
|
|
105
|
+
if definition.dtype is D.ENUM else ())
|
|
106
|
+
elif end is not None and (time_ns >= end if continuous else time_ns > end):
|
|
107
|
+
value = ScalarValue(None, definition.dtype, False, sample.value.quality | Q.MISSING, sample.value.labels)
|
|
108
|
+
elif time_ns - sample.time_ns >= definition.valid_for_ns:
|
|
109
|
+
value = ScalarValue(None, definition.dtype, False, sample.value.quality | Q.STALE, sample.value.labels)
|
|
110
|
+
else:
|
|
111
|
+
value = sample.value
|
|
112
|
+
expires = sample.time_ns + definition.valid_for_ns
|
|
113
|
+
if value.valid and expires < (1 << 63):
|
|
114
|
+
deadlines.append(expires)
|
|
115
|
+
if value.valid and end is not None:
|
|
116
|
+
deadlines.append(end)
|
|
117
|
+
context[name] = value
|
|
118
|
+
return context, deadlines
|
|
119
|
+
|
|
120
|
+
def _evaluate_values(self, context):
|
|
121
|
+
"""复用选定后端的独立数值核。参数: 已付费当前typed值映射。返回: ScalarValue。异常: 原计算/分配错误。"""
|
|
122
|
+
result = columns = value = None
|
|
123
|
+
try:
|
|
124
|
+
if self._backend == 'reference':
|
|
125
|
+
return expression_reference._evaluate(self._static.root, context, {}).value
|
|
126
|
+
import numpy as np
|
|
127
|
+
from ..core.numeric_numpy import NumericArray, DTYPES
|
|
128
|
+
columns = {}
|
|
129
|
+
for name, value in context.items():
|
|
130
|
+
physical = value.labels.index(value.value) if value.valid and value.dtype is D.ENUM else value.value if value.valid else 0
|
|
131
|
+
columns[name] = NumericArray(value.dtype, np.array([physical], dtype=DTYPES[value.dtype]),
|
|
132
|
+
np.array([value.valid], dtype=bool), np.array([int(value.quality)], dtype=np.uint16), value.labels)
|
|
133
|
+
result = expression_numpy._evaluate(self._static.root, columns, 1, {})
|
|
134
|
+
return scalar_from_column(result.value, 0)
|
|
135
|
+
finally:
|
|
136
|
+
context = result = columns = value = None
|
|
137
|
+
|
|
138
|
+
def evaluate(self):
|
|
139
|
+
"""仅在最新完整组包含驱动更新时求值一次;其他组仅由state保存最新值。
|
|
140
|
+
|
|
141
|
+
参数: 无,读取借用state的当前完整组。返回: None或(time_ns, ScalarValue,
|
|
142
|
+
实际有效截止);None截止表示所有依赖在int64时间域内没有未来过期点。
|
|
143
|
+
异常: 跳过未消费组、预算、计算结构或取消错误;失败后不再交付结果。
|
|
144
|
+
约束: 必须在每次完整组提交后调用,不能用最新状态补算丢掉的历史组。
|
|
145
|
+
"""
|
|
146
|
+
self._require_open()
|
|
147
|
+
context = result = output = sample = None
|
|
148
|
+
primary = None
|
|
149
|
+
try:
|
|
150
|
+
revision = self._state.revision
|
|
151
|
+
if revision == self._last_revision:
|
|
152
|
+
return None
|
|
153
|
+
if revision != self._last_revision + 1:
|
|
154
|
+
raise ValueError('驱动求值不能跳过已提交的完整组')
|
|
155
|
+
time = self._state.last_time_ns
|
|
156
|
+
previous_time, self._last_group_time = self._last_group_time, time
|
|
157
|
+
self._invalidated_at = None
|
|
158
|
+
# 非驱动依赖的无效更新也立即停止旧值保持,不能等下一条驱动才处理。
|
|
159
|
+
# 只传必要的截止,不制造一个会参与N−1计数的驱动点。
|
|
160
|
+
for name, _ in self._definitions:
|
|
161
|
+
changed = self._state.get(name)
|
|
162
|
+
definition = self._state.definitions[name]
|
|
163
|
+
ended = None if self._observation_ends is None else self._observation_ends.get(definition.source)
|
|
164
|
+
if ended is not None and ended <= time and (previous_time is None or ended > previous_time):
|
|
165
|
+
self._invalidated_at = ended if self._invalidated_at is None else min(ended,self._invalidated_at)
|
|
166
|
+
if changed is not None and changed.time_ns == time and not changed.value.valid:
|
|
167
|
+
self._invalidated_at = time if self._invalidated_at is None else min(time,self._invalidated_at)
|
|
168
|
+
driver_sample = self._state.get(self._driver) if self._driver is not None else None
|
|
169
|
+
is_driver = self._driver is None or driver_sample is not None and driver_sample.time_ns == time
|
|
170
|
+
# 已知FALSE and UNKNOWN等不能因为无关分支失效而被整体改成UNKNOWN。
|
|
171
|
+
check_condition = (self._static.root.dtype is D.BOOL and self._boolean_short_circuit
|
|
172
|
+
and self._invalidated_at is not None)
|
|
173
|
+
if not is_driver and not check_condition:
|
|
174
|
+
self._last_revision = revision
|
|
175
|
+
return None
|
|
176
|
+
_reserve_owned_ram(self, self._workspace, '_work_cost')
|
|
177
|
+
context, deadlines = self._context_at(time, continuous=not is_driver)
|
|
178
|
+
output = self._evaluate_values(context)
|
|
179
|
+
if not is_driver:
|
|
180
|
+
if (self._last_value is not None and output.valid and self._last_value.valid
|
|
181
|
+
and output.value == self._last_value.value):
|
|
182
|
+
self._invalidated_at = None
|
|
183
|
+
self._last_revision = revision
|
|
184
|
+
return None
|
|
185
|
+
deadline = min(deadlines) if deadlines else None
|
|
186
|
+
if output.dtype is D.BOOL:
|
|
187
|
+
if output.valid and self._last_value is not None and self._last_value.valid and output.value == self._last_value.value:
|
|
188
|
+
self._invalidated_at = None
|
|
189
|
+
# 依赖逐个过期可能不改变三值结论,只在结论不再成立的首个截止停止保持。
|
|
190
|
+
if self._boolean_short_circuit:
|
|
191
|
+
deadline = None
|
|
192
|
+
if output.valid and self._boolean_short_circuit:
|
|
193
|
+
for candidate in sorted(set(deadlines)):
|
|
194
|
+
future_context, _ = self._context_at(candidate, continuous=True)
|
|
195
|
+
future = self._evaluate_values(future_context)
|
|
196
|
+
if not future.valid or future.value != output.value:
|
|
197
|
+
deadline = candidate
|
|
198
|
+
break
|
|
199
|
+
self._last_value = output if output.dtype is D.BOOL else None
|
|
200
|
+
self._last_revision = revision
|
|
201
|
+
return time, output, deadline
|
|
202
|
+
except BaseException as exc:
|
|
203
|
+
primary = exc
|
|
204
|
+
self._failed = True
|
|
205
|
+
raise
|
|
206
|
+
finally:
|
|
207
|
+
context = columns = result = output = sample = driver_sample = value = changed = None
|
|
208
|
+
deadlines = future_context = future = None
|
|
209
|
+
try:
|
|
210
|
+
_release_owned_ram(self, self._work_cost, '_work_cost')
|
|
211
|
+
except BaseException as cleanup:
|
|
212
|
+
self._failed = True
|
|
213
|
+
if primary is None:
|
|
214
|
+
raise
|
|
215
|
+
primary.add_note('驱动表达式清理失败:' + type(cleanup).__name__)
|
|
216
|
+
|
|
217
|
+
@property
|
|
218
|
+
def invalidated_at(self):
|
|
219
|
+
"""当前已消费组使数值依赖失效的实际时刻。参数: 无。返回: int或None。异常: 关闭/失败。"""
|
|
220
|
+
self._require_open()
|
|
221
|
+
return self._invalidated_at
|
|
222
|
+
|
|
223
|
+
def evaluate_at(self, time_ns, *, continuous=True):
|
|
224
|
+
"""在当前最新状态上查询实际边界,供规则的TTL和等待调度使用。
|
|
225
|
+
|
|
226
|
+
参数: time_ns不得早于已提交组;continuous=False查询实际点,True查询右侧保持。
|
|
227
|
+
返回: (ScalarValue, 下一次可能改变已知结果的实际截止或None)。不提交组、
|
|
228
|
+
不改变驱动游标,不制造报文,也不保存查询轨迹。
|
|
229
|
+
异常: 时间/状态/预算/数值错误;失败后仅可关闭,费用释放失败仍保原责任。
|
|
230
|
+
"""
|
|
231
|
+
self._require_open()
|
|
232
|
+
context = output = future_context = future = deadlines = None
|
|
233
|
+
primary = None
|
|
234
|
+
try:
|
|
235
|
+
time = require_int64_ns(time_ns,'expression.query_time')
|
|
236
|
+
if type(continuous) is not bool or self._state.last_time_ns is not None and time < self._state.last_time_ns:
|
|
237
|
+
raise ValueError('边界查询需要bool视图且不能回读已覆盖的旧状态')
|
|
238
|
+
_reserve_owned_ram(self,self._workspace,'_work_cost')
|
|
239
|
+
context,deadlines = self._context_at(time,continuous=continuous)
|
|
240
|
+
output = self._evaluate_values(context)
|
|
241
|
+
deadline = None
|
|
242
|
+
if output.valid:
|
|
243
|
+
for candidate in sorted(set(value for value in deadlines if value > time)):
|
|
244
|
+
if not self._boolean_short_circuit:
|
|
245
|
+
deadline = candidate
|
|
246
|
+
break
|
|
247
|
+
future_context,_ = self._context_at(candidate,continuous=True)
|
|
248
|
+
future = self._evaluate_values(future_context)
|
|
249
|
+
if not future.valid or future.value != output.value:
|
|
250
|
+
deadline = candidate
|
|
251
|
+
break
|
|
252
|
+
return output,deadline
|
|
253
|
+
except BaseException as error:
|
|
254
|
+
primary,self._failed = error,True
|
|
255
|
+
raise
|
|
256
|
+
finally:
|
|
257
|
+
context = output = future_context = future = deadlines = None
|
|
258
|
+
try:
|
|
259
|
+
_release_owned_ram(self,self._work_cost,'_work_cost')
|
|
260
|
+
except BaseException as cleanup:
|
|
261
|
+
self._failed=True
|
|
262
|
+
if primary is None:
|
|
263
|
+
raise
|
|
264
|
+
primary.add_note('规则边界求值费用释放失败:'+type(cleanup).__name__)
|
|
265
|
+
|
|
266
|
+
def close(self):
|
|
267
|
+
"""释放自有树/费用,借用state保持原所有者负责。参数: 无。返回: None。异常: 释放失败可重试。"""
|
|
268
|
+
if self._closed:
|
|
269
|
+
return
|
|
270
|
+
self._closing = True
|
|
271
|
+
self._static = self._definitions = self._state = self._last_value = self._observation_ends = None
|
|
272
|
+
_release_owned_ram(self, self._work_cost, '_work_cost')
|
|
273
|
+
_release_owned_ram(self, self._fixed_cost, '_fixed_cost')
|
|
274
|
+
self._closed = True
|