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,551 @@
|
|
|
1
|
+
"""把本次真实来源读取与同一历史写入关联,保留有限的原行观测证明。
|
|
2
|
+
|
|
3
|
+
ObservedSourceScan借用building DecodedHistoryStore、原SourcePlan、预算来源
|
|
4
|
+
适配器和原ReadRequest。构造只校验与预约有限描述;consume才创建本scan独占的
|
|
5
|
+
read,并把每批原样直接history.append,不向调用方yield、不保留批次列表或重扫
|
|
6
|
+
输入。每次追加前后核对本来源预期计数和摘要,其他来源可独立推进,不能把另一次
|
|
7
|
+
恰好使用相同请求的read或手造CSVObservation当作本历史首端证据。
|
|
8
|
+
|
|
9
|
+
CSV使用自有的真实CSVObservationRead,真正StopIteration后复制其首末原时间行
|
|
10
|
+
和行数;CAN使用同次CANObservationRead,保全部原帧的范围、READY与封口暂存;
|
|
11
|
+
若原adapter显式capture_message_updates开启,同次decoded仓也在read.close前
|
|
12
|
+
先安装本scan责任槽,再由take_message_store移交;不开启时不创建消息仓或新费用。
|
|
13
|
+
memory沿实际原SourceSpec.rows以O(1)取得首末时间和len,offset只施加
|
|
14
|
+
一次。空投影仍计原行,全空与单点明确区分。observed_start优先保留原描述的明确
|
|
15
|
+
开始端,否则为实际first;observed_end使用本历史实际EOF进度,memory已声明的
|
|
16
|
+
延长终点不会被last覆盖或再次偏移。非空未知终点拒绝,不猜测周期。
|
|
17
|
+
|
|
18
|
+
finished要求原read真正耗尽、完整EOF已成功写入此历史、来源合同保持、全部本次
|
|
19
|
+
读取资源关闭成功,随后才开放SourceScanObservation、history_sha256和counts。
|
|
20
|
+
这些是本scan写入时的有限快照,后继还须核对当前实际历史及绑定,快照不代替
|
|
21
|
+
磁盘SHA重新校验。构造和清理失败保最高observed_source_scan_cleanup_owner。
|
|
22
|
+
|
|
23
|
+
本owner只计有限身份、请求、描述及快照,原SourceSpec.rows和raw_config不深遍历
|
|
24
|
+
或复制,原输入由来源预算承担。close关闭自有read及未移交原帧/消息仓,释放自身费用,不关闭
|
|
25
|
+
借用history、adapter或其他read,不删除文件。不改历史格式、默认来源清理路径、
|
|
26
|
+
数值核、同步规则或旧CAN链,也不声称覆盖整个进程RSS。
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
# 事实只用冻结小模型,来源仍走实际预算入口,不重新解释或归一化原行。
|
|
30
|
+
from dataclasses import dataclass
|
|
31
|
+
from ..core.models import SourceSpec
|
|
32
|
+
from ..core.validation import require_identifier
|
|
33
|
+
from ..timebase.conversion import checked_add_ns, require_int64_ns
|
|
34
|
+
from ..planning.models import SourcePlan
|
|
35
|
+
from ..sources.csv_spec import SignalCSVSpec
|
|
36
|
+
from ..sources.can_spec import LegacyCANSpec
|
|
37
|
+
from ..sources.text_can_spec import CANTextSpec
|
|
38
|
+
from .text_can_reader import BudgetedTextCANSourceAdapter,TextCANObservationRead
|
|
39
|
+
from ..sources.models import ReadRequest
|
|
40
|
+
from ..results.errors import AnalysisError, ResultClosedError
|
|
41
|
+
from ..results.spool import _cleanup_owner, _reserve_owned_ram, _release_owned_ram
|
|
42
|
+
from .csv_observation import CSVObservationRead
|
|
43
|
+
from .csv_reader import BudgetedSignalCSVSourceAdapter
|
|
44
|
+
from .can_reader import BudgetedLegacyCANSourceAdapter, CANObservationRead
|
|
45
|
+
from .memory_reader import BudgetedMemorySourceAdapter
|
|
46
|
+
from .history import DecodedHistoryStore, _metadata_bytes
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
@dataclass(frozen=True)
|
|
50
|
+
class SourceScanObservation:
|
|
51
|
+
"""保留本scan实际原行事实及来源声明允许的观测范围,不证明来源之间同步。
|
|
52
|
+
|
|
53
|
+
first_ns、last_ns及row_count描述原行;observed_start_ns、observed_end_ns
|
|
54
|
+
保留描述与实际完成进度。空来源仍可有声明边界,但row_count必须为0且原行
|
|
55
|
+
首末均为None,后继不能把声明边界解释成真实原行或常量规则的观测证据。
|
|
56
|
+
"""
|
|
57
|
+
|
|
58
|
+
source: str # 实际来源名称。
|
|
59
|
+
session_id: str # 原请求与完成进度的同一会话。
|
|
60
|
+
first_ns: int | None # 实际首条原时间行,转换及offset后的整数ns。
|
|
61
|
+
last_ns: int | None # 实际末条原时间行,全空为None。
|
|
62
|
+
row_count: int # 原时间行总数,包含空投影行而不按信号样本数计算。
|
|
63
|
+
observed_start_ns: int | None # 明确描述start优先,否则实际first。
|
|
64
|
+
observed_end_ns: int | None # 实际EOF进度的observed_end,已完成一次时钟映射。
|
|
65
|
+
source_eof: bool # 完整来源耗尽并已写入本history,必须为True。
|
|
66
|
+
time_scope: str = 'source' # none/selected不声称全来源时间观测。
|
|
67
|
+
retained_record_count: int = 0 # 所需记录数,用于解释稀疏时间范围。
|
|
68
|
+
full_check_count: int = 0 # 非原生输入完整检查回退数。
|
|
69
|
+
|
|
70
|
+
def __post_init__(self):
|
|
71
|
+
"""检查事实内部一致性,不读文件、扩展范围或补假设周期。
|
|
72
|
+
|
|
73
|
+
参数: 无,读取冻结字段。返回: None。异常: 类型、行数、端点或EOF矛盾。
|
|
74
|
+
"""
|
|
75
|
+
# 安全来源及会话名称不替代实际读取和历史关联。
|
|
76
|
+
require_identifier(self.source, 'source_scan.source')
|
|
77
|
+
require_identifier(self.session_id, 'source_scan.session_id')
|
|
78
|
+
if type(self.row_count) is not int or self.row_count < 0 or self.source_eof is not True:
|
|
79
|
+
raise ValueError('来源扫描事实需非负原生行数及完整EOF')
|
|
80
|
+
for name in ('first_ns', 'last_ns', 'observed_start_ns', 'observed_end_ns'):
|
|
81
|
+
value = getattr(self, name)
|
|
82
|
+
if value is not None:
|
|
83
|
+
require_int64_ns(value, 'source_scan.' + name)
|
|
84
|
+
# 全空不伪造时间0;非空允许同刻单点,但必须保留实际可核实终点。
|
|
85
|
+
if (type(self.retained_record_count) is not int or not 0 <= self.retained_record_count <= self.row_count
|
|
86
|
+
or type(self.full_check_count) is not int or not 0 <= self.full_check_count <= self.row_count):
|
|
87
|
+
raise ValueError('来源保留记录/完整回退计数非法')
|
|
88
|
+
if self.time_scope not in ('none', 'selected', 'source'):
|
|
89
|
+
raise ValueError('来源时间范围非法')
|
|
90
|
+
if self.time_scope != 'source':
|
|
91
|
+
if self.observed_start_ns is not None or self.observed_end_ns is not None:
|
|
92
|
+
raise ValueError('部分或未采集时间不能声明全来源范围')
|
|
93
|
+
if self.time_scope == 'none' and (self.first_ns is not None or self.last_ns is not None):
|
|
94
|
+
raise ValueError('无时间来源不能声明首末')
|
|
95
|
+
if self.time_scope == 'selected':
|
|
96
|
+
# 原帧数非零不代表存在目标时间;仅真实保留记录决定目标首末是否存在。
|
|
97
|
+
if not self.retained_record_count and (self.first_ns is not None or self.last_ns is not None):
|
|
98
|
+
raise ValueError('没有目标记录不能声明目标首末时间')
|
|
99
|
+
if self.retained_record_count and (self.first_ns is None or self.last_ns is None):
|
|
100
|
+
raise ValueError('存在目标记录时必须保留目标首末时间')
|
|
101
|
+
if (self.first_ns is None) != (self.last_ns is None) or self.first_ns is not None and self.first_ns > self.last_ns:
|
|
102
|
+
raise ValueError('目标记录首末时间不一致')
|
|
103
|
+
return
|
|
104
|
+
if self.row_count == 0:
|
|
105
|
+
if self.first_ns is not None or self.last_ns is not None:
|
|
106
|
+
raise ValueError('全空扫描的原行首末须为None')
|
|
107
|
+
elif (self.first_ns is None or self.last_ns is None or self.first_ns > self.last_ns
|
|
108
|
+
or self.observed_start_ns is None or self.observed_end_ns is None
|
|
109
|
+
or self.observed_start_ns > self.first_ns or self.observed_end_ns < self.last_ns):
|
|
110
|
+
raise ValueError('非空扫描需有序原行首末及包含它们的实际观测边界')
|
|
111
|
+
if (self.observed_start_ns is not None and self.observed_end_ns is not None
|
|
112
|
+
and self.observed_start_ns > self.observed_end_ns):
|
|
113
|
+
raise ValueError('来源扫描观测范围不能回退')
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
class ObservedSourceScan:
|
|
117
|
+
"""拥有单个真实read及有限扫描快照,借用历史、来源和计划但不关闭它们。
|
|
118
|
+
|
|
119
|
+
_expected_counts和_expected_sha只跟踪本source的成功写入,consume不向外
|
|
120
|
+
交付批次。_finished须在真实耗尽与read关闭后设置;失败或半关闭只允许close。
|
|
121
|
+
固定费用覆盖描述、请求及所有有限快照,直到显式close才释放。
|
|
122
|
+
"""
|
|
123
|
+
|
|
124
|
+
def __init__(self, history, source_plan, adapter, request):
|
|
125
|
+
"""核对空的building来源及原对象关系,先预约有限合同,不开始读取。
|
|
126
|
+
|
|
127
|
+
参数: history为实际DecodedHistoryStore;source_plan为原SourcePlan;adapter
|
|
128
|
+
为同budget实际预算memory、CSV、旧CAN或新文本CAN来源;request须是history使用的原对象。
|
|
129
|
+
返回: 尚未扫描的owner。异常: 合同、类型、预算或取消原错;持续构造清理失败
|
|
130
|
+
附observed_source_scan_cleanup_owner,恢复后调用其close。
|
|
131
|
+
"""
|
|
132
|
+
# 不接受独立事实模型或自由迭代器代替实际来源入口。
|
|
133
|
+
if (not isinstance(history, DecodedHistoryStore) or not isinstance(source_plan, SourcePlan)
|
|
134
|
+
or not isinstance(request, ReadRequest)
|
|
135
|
+
or not isinstance(adapter, (BudgetedMemorySourceAdapter, BudgetedSignalCSVSourceAdapter,
|
|
136
|
+
BudgetedLegacyCANSourceAdapter,BudgetedTextCANSourceAdapter))):
|
|
137
|
+
raise TypeError('来源扫描需实际历史、SourcePlan、预算来源及原ReadRequest')
|
|
138
|
+
history._check('building')
|
|
139
|
+
adapter._ensure_open()
|
|
140
|
+
name = source_plan.name
|
|
141
|
+
if name not in history.validators or adapter.budget is not history.budget:
|
|
142
|
+
raise ValueError('来源扫描需属于同一历史及共享budget')
|
|
143
|
+
validator = history.validators[name]
|
|
144
|
+
if (validator.request is not request or history.counts[name] != [0, 0]
|
|
145
|
+
or validator.ended or name in history._completions):
|
|
146
|
+
raise ValueError('来源扫描需原request及尚无append或EOF的历史来源')
|
|
147
|
+
# 首次预算回调前安装全部槽;原rows仅借引用,不做深遍历或副本。
|
|
148
|
+
self._history, self._source_plan, self._adapter, self._request = history, source_plan, adapter, request
|
|
149
|
+
self._budget, self._source = history.budget, name
|
|
150
|
+
self._fixed_cost = self._held_cost = 0
|
|
151
|
+
self._read = self._batch = self._observation = self._history_sha256 = self._counts = None
|
|
152
|
+
# CAN原帧仓在本次read完成后先移入本父;有限READY另计,不能随read.close失去出处。
|
|
153
|
+
self._raw_store = self._runtime_metadata = self._read_identity = None
|
|
154
|
+
self._message_store = None
|
|
155
|
+
self.retain_raw_frames = (adapter.retain_raw_frames
|
|
156
|
+
if isinstance(adapter, (BudgetedLegacyCANSourceAdapter,BudgetedTextCANSourceAdapter)) else False)
|
|
157
|
+
self._capture_message_updates = (adapter.capture_message_updates
|
|
158
|
+
if isinstance(adapter, BudgetedLegacyCANSourceAdapter) else False)
|
|
159
|
+
self._runtime_cost = 0
|
|
160
|
+
self._description, self._validator = validator.description, validator
|
|
161
|
+
self._expected_counts, self._expected_sha = (0, 0), history.hashes[name].hexdigest()
|
|
162
|
+
self._started = self._finished = self._closed = self._closing = self._failed = False
|
|
163
|
+
try:
|
|
164
|
+
# 有限描述和请求已知;source_plan.config/metadata/raw_config与完整rows均不纳入递归估算。
|
|
165
|
+
cost = 65536 + 16 * _metadata_bytes((self._description, request, source_plan.name,
|
|
166
|
+
source_plan.source_type, source_plan.time_unit, source_plan.timezone_text))
|
|
167
|
+
_reserve_owned_ram(self, cost, '_fixed_cost')
|
|
168
|
+
self._require_contract()
|
|
169
|
+
except BaseException as exc:
|
|
170
|
+
# 尚未创建read也要保留实际固定费;原错不被清理取消覆盖。
|
|
171
|
+
self._failed = True
|
|
172
|
+
self._adopt_cleanup(exc)
|
|
173
|
+
_cleanup_owner(self, exc, 'observed_source_scan_cleanup_owner', '来源扫描构造')
|
|
174
|
+
raise
|
|
175
|
+
|
|
176
|
+
def _require_contract(self):
|
|
177
|
+
"""在每次读取和追加边界核对原来源对象、描述、请求与本source预期写入。
|
|
178
|
+
|
|
179
|
+
参数: 无。返回: None。异常: 原生命周期错误,或ValueError为替换、外部追加或合同变化。
|
|
180
|
+
"""
|
|
181
|
+
# 允许其他source推进,但本source只能由此scan写入,不能接半读历史继续猜首端。
|
|
182
|
+
self._history._check('building')
|
|
183
|
+
self._adapter._ensure_open()
|
|
184
|
+
if self._adapter.budget is not self._budget or self._history.budget is not self._budget:
|
|
185
|
+
raise ValueError('扫描来源或历史的实际共享budget已被替换')
|
|
186
|
+
name = self._source
|
|
187
|
+
validator = self._history.validators.get(name)
|
|
188
|
+
if (validator is not self._validator or validator.request is not self._request
|
|
189
|
+
or tuple(self._history.counts[name]) != self._expected_counts
|
|
190
|
+
or self._history.hashes[name].hexdigest() != self._expected_sha):
|
|
191
|
+
raise ValueError('扫描历史的原validator、request、计数或摘要已被其他写入替换')
|
|
192
|
+
plan, adapter = self._source_plan, self._adapter
|
|
193
|
+
if isinstance(adapter, BudgetedMemorySourceAdapter):
|
|
194
|
+
config = adapter._adapter.source
|
|
195
|
+
matched = plan.source_type == 'memory' and isinstance(plan.config, SourceSpec)
|
|
196
|
+
elif isinstance(adapter, BudgetedSignalCSVSourceAdapter):
|
|
197
|
+
config = adapter.spec
|
|
198
|
+
matched = plan.source_type == 'signal_csv' and isinstance(plan.config, SignalCSVSpec)
|
|
199
|
+
elif isinstance(adapter,BudgetedTextCANSourceAdapter):
|
|
200
|
+
config=adapter.spec
|
|
201
|
+
matched=plan.source_type in ('can_asc','asc_or_blf','raw_can_csv') and type(plan.config) is CANTextSpec and plan.source_type==config.source_type
|
|
202
|
+
else:
|
|
203
|
+
config = adapter.spec
|
|
204
|
+
matched = plan.source_type == 'can_blf' and type(plan.config) is LegacyCANSpec
|
|
205
|
+
if (not matched or plan.config is not config or config.name != name
|
|
206
|
+
or self._request.session_id != (adapter._adapter.session_id
|
|
207
|
+
if isinstance(adapter, BudgetedMemorySourceAdapter) else adapter.session_id)
|
|
208
|
+
or adapter.describe() != self._description):
|
|
209
|
+
raise ValueError('扫描来源原config、会话或实际描述与历史合同不一致')
|
|
210
|
+
if (isinstance(adapter, BudgetedLegacyCANSourceAdapter)
|
|
211
|
+
and (adapter.capture_message_updates is not self._capture_message_updates
|
|
212
|
+
or adapter.retain_raw_frames is not self.retain_raw_frames)):
|
|
213
|
+
raise ValueError('扫描CAN来源的原消息捕获开关已改变')
|
|
214
|
+
if isinstance(adapter,BudgetedTextCANSourceAdapter) and adapter.retain_raw_frames is not self.retain_raw_frames:
|
|
215
|
+
raise ValueError('文本CAN原帧保存选择已改变')
|
|
216
|
+
|
|
217
|
+
def _adopt_cleanup(self, exc):
|
|
218
|
+
"""接管实际未返回的最高来源读取owner,不接借用来源或历史。
|
|
219
|
+
|
|
220
|
+
参数: exc为原异常。返回: None。异常: 无预期异常。
|
|
221
|
+
"""
|
|
222
|
+
# 先接对应来源工厂交出的实际read,再由本scan作为最高父恢复;借用来源不接管。
|
|
223
|
+
for attribute in ('can_observation_read_cleanup_owner', 'csv_observation_read_cleanup_owner','text_can_observation_cleanup_owner',
|
|
224
|
+
'memory_read_cleanup_owner'):
|
|
225
|
+
read = getattr(exc, attribute, None)
|
|
226
|
+
if read is not None and self._read is None:
|
|
227
|
+
self._read = read
|
|
228
|
+
break
|
|
229
|
+
# 没有更高实际read父时才接未返回消息仓,不能把同一子在两个父重复收责。
|
|
230
|
+
if self._capture_message_updates and self._read is None and self._message_store is None:
|
|
231
|
+
self._message_store = getattr(exc, 'decoded_message_store_cleanup_owner', None)
|
|
232
|
+
|
|
233
|
+
def _close_read(self):
|
|
234
|
+
"""结束本scan实际read,成功后才清字段,不影响adapter的其他read。
|
|
235
|
+
|
|
236
|
+
参数: 无。返回: None。异常: 原read关闭错误;旧memory未完成费用明确拒绝。
|
|
237
|
+
"""
|
|
238
|
+
# 当前批先结束借引用,read负责它自己的原generator、FD及批次费用。
|
|
239
|
+
self._batch = None
|
|
240
|
+
if self._read is not None:
|
|
241
|
+
self._read.close()
|
|
242
|
+
if (isinstance(self._adapter, BudgetedMemorySourceAdapter)
|
|
243
|
+
and (not self._read.closed or self._read.cost != 0)):
|
|
244
|
+
raise AnalysisError('原memory读取仍有未完成清理费用,来源扫描不能声明完成')
|
|
245
|
+
self._read = None
|
|
246
|
+
|
|
247
|
+
def consume(self):
|
|
248
|
+
"""单次扫描真实来源并把每个原batch直接写入同一history,成功后开放快照。
|
|
249
|
+
|
|
250
|
+
参数: 无。返回: None,重复调用已完成scan不重读。
|
|
251
|
+
异常: 原读取、历史追加、预算、来源变化或关闭错误;failed后只可close,原错附最高恢复owner。
|
|
252
|
+
"""
|
|
253
|
+
self._ensure_active()
|
|
254
|
+
if self._finished:
|
|
255
|
+
return
|
|
256
|
+
if self._started:
|
|
257
|
+
raise ResultClosedError('来源扫描consume已开始,不能重入同一读取')
|
|
258
|
+
try:
|
|
259
|
+
self._require_contract()
|
|
260
|
+
self._started = True
|
|
261
|
+
# 本owner亲自创建read,不能传入另一次独立读取或手造观测替代本历史数据流。
|
|
262
|
+
if isinstance(self._adapter, BudgetedSignalCSVSourceAdapter):
|
|
263
|
+
self._read = self._adapter.iter_batches_with_observation(self._request)
|
|
264
|
+
if type(self._read) is not CSVObservationRead:
|
|
265
|
+
raise TypeError('CSV扫描必须使用实际CSVObservationRead')
|
|
266
|
+
elif isinstance(self._adapter,BudgetedTextCANSourceAdapter):
|
|
267
|
+
self._read=self._adapter.iter_batches_with_observation(self._request)
|
|
268
|
+
if type(self._read) is not TextCANObservationRead:
|
|
269
|
+
raise TypeError('文本CAN扫描必须使用真实TextCANObservationRead')
|
|
270
|
+
elif isinstance(self._adapter, BudgetedLegacyCANSourceAdapter):
|
|
271
|
+
self._read = self._adapter.iter_batches_with_observation(self._request)
|
|
272
|
+
from .can_batch_reader import CANBatchObservationRead
|
|
273
|
+
expected_type = CANBatchObservationRead if self._adapter.batch_read else CANObservationRead
|
|
274
|
+
if type(self._read) is not expected_type:
|
|
275
|
+
raise TypeError('CAN扫描必须使用本adapter对应的实际read')
|
|
276
|
+
else:
|
|
277
|
+
self._read = self._adapter.iter_batches(self._request)
|
|
278
|
+
while True:
|
|
279
|
+
self._require_contract()
|
|
280
|
+
try:
|
|
281
|
+
self._batch = next(self._read)
|
|
282
|
+
except StopIteration:
|
|
283
|
+
break
|
|
284
|
+
# 下一笔读取返回后仍核合同,防止读取回调期间替换来源或向本source重复append。
|
|
285
|
+
self._require_contract()
|
|
286
|
+
if self._batch.source != self._source or self._batch.session_id != self._request.session_id:
|
|
287
|
+
raise ValueError('扫描read交付了另一来源或会话的batch')
|
|
288
|
+
expected = (self._expected_counts[0] + 1,
|
|
289
|
+
self._expected_counts[1] + self._batch.sample_count)
|
|
290
|
+
self._history.append(self._batch)
|
|
291
|
+
if tuple(self._history.counts[self._source]) != expected:
|
|
292
|
+
raise ValueError('来源扫描实际历史追加计数未对应唯一原batch')
|
|
293
|
+
self._expected_counts = expected
|
|
294
|
+
self._expected_sha = self._history.hashes[self._source].hexdigest()
|
|
295
|
+
self._batch = None
|
|
296
|
+
self._require_contract()
|
|
297
|
+
completion = self._history._completions.get(self._source)
|
|
298
|
+
if (completion is None or not completion.source_eof or not self._validator.ended
|
|
299
|
+
or completion.session_id != self._request.session_id):
|
|
300
|
+
raise ValueError('来源扫描没有本历史实际完整EOF进度')
|
|
301
|
+
# 首末时间来自本次真实read或原冻结memory全输入,不从投影样本或request猜测。
|
|
302
|
+
if isinstance(self._adapter, (BudgetedSignalCSVSourceAdapter, BudgetedLegacyCANSourceAdapter,BudgetedTextCANSourceAdapter)):
|
|
303
|
+
fact = self._read.observation
|
|
304
|
+
if (not self._read.exhausted or self._read.failed or fact.request is not self._request
|
|
305
|
+
or fact.read_identity != self._read.identity or fact.source != self._source
|
|
306
|
+
or fact.session_id != self._request.session_id or not fact.source_eof
|
|
307
|
+
or fact.last_ns != completion.observed_end_ns):
|
|
308
|
+
raise ValueError('来源实际读取事实与同一次历史EOF不一致')
|
|
309
|
+
first, last, count = fact.first_ns, fact.last_ns, fact.row_count
|
|
310
|
+
if isinstance(self._adapter,BudgetedTextCANSourceAdapter):
|
|
311
|
+
metadata=self._read.runtime_metadata
|
|
312
|
+
_reserve_owned_ram(self,65536+32*_metadata_bytes(metadata),'_runtime_cost')
|
|
313
|
+
self._runtime_metadata,self._read_identity=metadata,fact.read_identity
|
|
314
|
+
if self.retain_raw_frames:
|
|
315
|
+
self._read.take_raw_store(self,'_raw_store')
|
|
316
|
+
if (self._raw_store.count!=count or self._raw_store.state!='sealed'
|
|
317
|
+
or self._raw_store.read_identity!=fact.read_identity or self._raw_store.source_name!=self._source):
|
|
318
|
+
raise ValueError('同次文本原帧仓与实际观测身份不符')
|
|
319
|
+
if isinstance(self._adapter, BudgetedLegacyCANSourceAdapter):
|
|
320
|
+
# 保留同次READY和原read身份;费用先预约,原store先安装本父再解除子责任。
|
|
321
|
+
metadata = self._read.runtime_metadata
|
|
322
|
+
_reserve_owned_ram(self, 65536 + 32 * _metadata_bytes(metadata), '_runtime_cost')
|
|
323
|
+
self._runtime_metadata, self._read_identity = metadata, fact.read_identity
|
|
324
|
+
if self.retain_raw_frames:
|
|
325
|
+
self._read.take_raw_store(self, '_raw_store')
|
|
326
|
+
if (self._raw_store.count != count or self._raw_store.state != 'sealed'
|
|
327
|
+
or self._raw_store.source_name != self._source):
|
|
328
|
+
raise ValueError('同次CAN原帧仓与真实扫描完成事实不一致')
|
|
329
|
+
if self._read.capture_message_updates is not self._capture_message_updates:
|
|
330
|
+
raise ValueError('同次CAN原read的消息捕获开关不符')
|
|
331
|
+
if self._capture_message_updates:
|
|
332
|
+
# 原对象先从完成read移入本父,核同次READY/身份/全帧数后才可关闭read。
|
|
333
|
+
self._read.take_message_store(self, '_message_store')
|
|
334
|
+
store = self._message_store
|
|
335
|
+
if (store.closed or store.state != 'sealed'
|
|
336
|
+
or (store.count != count if not store.sparse_sequences else
|
|
337
|
+
store.count > count or store._last_sequence >= count)
|
|
338
|
+
or store.source_name != self._source or store.session_id != self._request.session_id
|
|
339
|
+
or store.read_identity != fact.read_identity
|
|
340
|
+
or store.decoder_profile != metadata['profile']):
|
|
341
|
+
raise ValueError('同次CAN消息仓与原读取及真实扫描事实不一致')
|
|
342
|
+
else:
|
|
343
|
+
config = self._source_plan.config
|
|
344
|
+
count = len(config.rows)
|
|
345
|
+
first = checked_add_ns(config.rows[0].time_ns, config.offset_ns) if count else None
|
|
346
|
+
last = checked_add_ns(config.rows[-1].time_ns, config.offset_ns) if count else None
|
|
347
|
+
start = self._description.observation_start_ns
|
|
348
|
+
# CAN读取已经统计实际保留和完整检查回退数;普通历史扫描也须原样
|
|
349
|
+
# 移交同次事实,不能在重建观测时落回默认0。CSV/memory保持原契约。
|
|
350
|
+
can_fact = fact if isinstance(self._adapter, BudgetedLegacyCANSourceAdapter) else None
|
|
351
|
+
observation = SourceScanObservation(self._source, self._request.session_id, first, last,
|
|
352
|
+
count, first if start is None else start, completion.observed_end_ns, True,
|
|
353
|
+
can_fact.time_scope if can_fact is not None else 'source',
|
|
354
|
+
can_fact.retained_record_count if can_fact is not None else 0,
|
|
355
|
+
can_fact.full_check_count if can_fact is not None else 0)
|
|
356
|
+
digest, counts = self._expected_sha, self._expected_counts
|
|
357
|
+
# 独立有限快照已在固定费内;原read真正关闭成功以后才对后继发布finished。
|
|
358
|
+
self._close_read()
|
|
359
|
+
self._observation, self._history_sha256, self._counts = observation, digest, counts
|
|
360
|
+
self._finished = True
|
|
361
|
+
except BaseException as exc:
|
|
362
|
+
# 历史append可能自行进入failed/cancelled,原行为保留;这里只接本scan自有read。
|
|
363
|
+
self._failed = True
|
|
364
|
+
self._adopt_cleanup(exc)
|
|
365
|
+
exc.observed_source_scan_cleanup_owner = self
|
|
366
|
+
exc.add_note('恢复后调用observed_source_scan_cleanup_owner.close()')
|
|
367
|
+
raise
|
|
368
|
+
|
|
369
|
+
def _ensure_active(self):
|
|
370
|
+
"""拒绝关闭、清理或失败后的读取及事实访问。
|
|
371
|
+
|
|
372
|
+
参数: 无。返回: None。异常: ResultClosedError为本owner不可用。
|
|
373
|
+
"""
|
|
374
|
+
# 半关闭或失败实例不能被后继Scopes当作活的成功扫描证明。
|
|
375
|
+
if self._closed or self._closing or self._failed:
|
|
376
|
+
raise ResultClosedError('来源扫描已关闭、正在清理或失败')
|
|
377
|
+
|
|
378
|
+
def _require_finished(self):
|
|
379
|
+
"""只允许活的成功scan提供数据流快照。参数: 无。返回: None。异常: ResultClosedError。
|
|
380
|
+
"""
|
|
381
|
+
# 模型构造成功不代表读取成功,finished闸门与owner可用性必须同时成立。
|
|
382
|
+
self._ensure_active()
|
|
383
|
+
if not self._finished:
|
|
384
|
+
raise ResultClosedError('来源扫描尚未正常完成')
|
|
385
|
+
|
|
386
|
+
@property
|
|
387
|
+
def capture_message_updates(self):
|
|
388
|
+
"""读取本scan原来源的消息捕获开关,不据此开放完成证明。
|
|
389
|
+
|
|
390
|
+
参数: 无。返回: 原生bool;非CAN来源为False,关闭后仍保配置快照。
|
|
391
|
+
异常: 无;readonly属性不能把尚未完成的消息仓改成可移交。
|
|
392
|
+
"""
|
|
393
|
+
return self._capture_message_updates
|
|
394
|
+
|
|
395
|
+
@property
|
|
396
|
+
def history(self):
|
|
397
|
+
"""读取原历史对象。参数: 无。返回: DecodedHistoryStore。异常: ResultClosedError为不可用。
|
|
398
|
+
"""
|
|
399
|
+
self._ensure_active()
|
|
400
|
+
return self._history
|
|
401
|
+
|
|
402
|
+
@property
|
|
403
|
+
def source_plan(self):
|
|
404
|
+
"""读取原来源计划。参数: 无。返回: SourcePlan。异常: ResultClosedError为不可用。
|
|
405
|
+
"""
|
|
406
|
+
self._ensure_active()
|
|
407
|
+
return self._source_plan
|
|
408
|
+
|
|
409
|
+
@property
|
|
410
|
+
def request(self):
|
|
411
|
+
"""读取本次原request。参数: 无。返回: ReadRequest。异常: ResultClosedError为不可用。
|
|
412
|
+
"""
|
|
413
|
+
self._ensure_active()
|
|
414
|
+
return self._request
|
|
415
|
+
|
|
416
|
+
@property
|
|
417
|
+
def finished(self):
|
|
418
|
+
"""读取成功完成事实。参数: 无。返回: bool。异常: 无。"""
|
|
419
|
+
# close不会抹掉曾完成的事实,后继仍须独立拒绝closed或failed的owner。
|
|
420
|
+
return self._finished
|
|
421
|
+
|
|
422
|
+
@property
|
|
423
|
+
def closed(self):
|
|
424
|
+
"""读取完整关闭事实。参数: 无。返回: bool。异常: 无。"""
|
|
425
|
+
# 所有自有read与固定费用实际清完后才成为True。
|
|
426
|
+
return self._closed
|
|
427
|
+
|
|
428
|
+
@property
|
|
429
|
+
def failed(self):
|
|
430
|
+
"""读取失败事实。参数: 无。返回: bool。异常: 无。"""
|
|
431
|
+
# 正常空来源也可以finished,不用failed表示无数据。
|
|
432
|
+
return self._failed
|
|
433
|
+
|
|
434
|
+
@property
|
|
435
|
+
def history_sha256(self):
|
|
436
|
+
"""读取本source完成写入时的历史SHA。参数: 无。返回: str。异常: ResultClosedError。
|
|
437
|
+
"""
|
|
438
|
+
self._require_finished()
|
|
439
|
+
return self._history_sha256
|
|
440
|
+
|
|
441
|
+
@property
|
|
442
|
+
def counts(self):
|
|
443
|
+
"""读取进度数及样本数。参数: 无。返回: 二元素int tuple。异常: ResultClosedError。
|
|
444
|
+
"""
|
|
445
|
+
self._require_finished()
|
|
446
|
+
return self._counts
|
|
447
|
+
|
|
448
|
+
@property
|
|
449
|
+
def observation(self):
|
|
450
|
+
"""读取本scan完成的原行及观测范围事实。参数: 无。返回: SourceScanObservation。异常: ResultClosedError。
|
|
451
|
+
"""
|
|
452
|
+
self._require_finished()
|
|
453
|
+
return self._observation
|
|
454
|
+
|
|
455
|
+
@property
|
|
456
|
+
def runtime_metadata(self):
|
|
457
|
+
"""读取成功CAN扫描的同次READY。参数: 无。返回: 冻结映射。异常: 非CAN或未完成。
|
|
458
|
+
"""
|
|
459
|
+
self._require_finished()
|
|
460
|
+
if self._runtime_metadata is None:
|
|
461
|
+
raise ValueError('此来源没有CAN运行元数据')
|
|
462
|
+
return self._runtime_metadata
|
|
463
|
+
|
|
464
|
+
@property
|
|
465
|
+
def read_identity(self):
|
|
466
|
+
"""读取成功CAN扫描的原read身份。参数: 无。返回: str。异常: 非CAN或未完成。
|
|
467
|
+
"""
|
|
468
|
+
self._require_finished()
|
|
469
|
+
if self._read_identity is None:
|
|
470
|
+
raise ValueError('此来源没有CAN读取身份')
|
|
471
|
+
return self._read_identity
|
|
472
|
+
|
|
473
|
+
def take_raw_store(self, receiver, slot='_raw_store'):
|
|
474
|
+
"""把同次原帧仓先装入真实父槽再解除本责任,取消时仍有可达owner。
|
|
475
|
+
|
|
476
|
+
参数: receiver共享同一_budget;slot为空的已存在责任槽。返回: 原RawFrameStore。
|
|
477
|
+
异常: 未完成、重复移交、预算或接收槽错误;安装后取消不丢父槽。
|
|
478
|
+
"""
|
|
479
|
+
self._require_finished()
|
|
480
|
+
store = self._raw_store
|
|
481
|
+
if (store is None or getattr(receiver, '_budget', None) is not self._budget
|
|
482
|
+
or not hasattr(receiver, slot) or getattr(receiver, slot) is not None):
|
|
483
|
+
raise ValueError('原帧仓移交需同预算空父槽且只能一次')
|
|
484
|
+
try:
|
|
485
|
+
setattr(receiver, slot, store)
|
|
486
|
+
finally:
|
|
487
|
+
# setter可能在实际安装后抛取消;检查真实槽决定责任,不依赖返回成功。
|
|
488
|
+
if getattr(receiver, slot, None) is store:
|
|
489
|
+
self._raw_store = None
|
|
490
|
+
return store
|
|
491
|
+
|
|
492
|
+
def take_message_store(self, receiver, slot='_message_store'):
|
|
493
|
+
"""把实际同次decoded仓先安装接收父,再结束本scan唯一子责任。
|
|
494
|
+
|
|
495
|
+
参数: receiver为同一_budget的可信内部owner;slot为其已存在且为空的实际槽。
|
|
496
|
+
返回: 原DecodedMessageStore;只能在真实finished后成功移交一次。
|
|
497
|
+
异常: 未完成/已关闭错误,ValueError为未开启、已移交或接收槽不符;
|
|
498
|
+
安装前后取消保原异常和observed_source_scan_cleanup_owner。
|
|
499
|
+
"""
|
|
500
|
+
self._require_finished()
|
|
501
|
+
store = self._message_store
|
|
502
|
+
if (not self._capture_message_updates or store is None
|
|
503
|
+
or getattr(receiver, '_budget', None) is not self._budget or type(slot) is not str
|
|
504
|
+
or not slot.startswith('_') or not hasattr(receiver, slot) or getattr(receiver, slot) is not None):
|
|
505
|
+
raise ValueError('消息仓移交需已开启、同预算空父槽且只能一次')
|
|
506
|
+
try:
|
|
507
|
+
# 实际安装后才取消也属于新父,不依赖return是否顺利到达调用方。
|
|
508
|
+
setattr(receiver, slot, store)
|
|
509
|
+
except BaseException as exc:
|
|
510
|
+
exc.observed_source_scan_cleanup_owner = self
|
|
511
|
+
raise
|
|
512
|
+
finally:
|
|
513
|
+
if getattr(receiver, slot, None) is store:
|
|
514
|
+
self._message_store = None
|
|
515
|
+
return store
|
|
516
|
+
|
|
517
|
+
def close(self):
|
|
518
|
+
"""关闭本scan的read、未移交仓和费用,保留借用来源、历史及磁盘文件。
|
|
519
|
+
|
|
520
|
+
参数: 无。返回: None,成功后幂等。异常: 原read或预算取消,未完责任保留供同一owner重试。
|
|
521
|
+
"""
|
|
522
|
+
if self._closed:
|
|
523
|
+
return
|
|
524
|
+
self._closing = True
|
|
525
|
+
try:
|
|
526
|
+
# read成功关闭才清有限快照引用,固定费用释放前后取消均按实际槽保留。
|
|
527
|
+
self._close_read()
|
|
528
|
+
if self._raw_store is not None:
|
|
529
|
+
self._raw_store.close()
|
|
530
|
+
if not self._raw_store.closed:
|
|
531
|
+
raise AnalysisError('CAN原帧仓尚未完成关闭')
|
|
532
|
+
self._raw_store = None
|
|
533
|
+
# 已移交仓槽为None,不能关闭新父;未移交仓持续失败则保本scan最高责任。
|
|
534
|
+
if self._message_store is not None:
|
|
535
|
+
self._message_store.close()
|
|
536
|
+
if not self._message_store.closed:
|
|
537
|
+
raise AnalysisError('CAN消息仓尚未完成关闭')
|
|
538
|
+
self._message_store = None
|
|
539
|
+
self._runtime_metadata = self._read_identity = None
|
|
540
|
+
_release_owned_ram(self, self._runtime_cost, '_runtime_cost')
|
|
541
|
+
self._observation = self._history_sha256 = self._counts = None
|
|
542
|
+
self._description = self._validator = self._expected_counts = self._expected_sha = None
|
|
543
|
+
self._history = self._source_plan = self._adapter = self._request = self._source = None
|
|
544
|
+
_release_owned_ram(self, self._fixed_cost, '_fixed_cost')
|
|
545
|
+
if self._held_cost == 0:
|
|
546
|
+
self._closed = True
|
|
547
|
+
except BaseException as exc:
|
|
548
|
+
# 新capture链直接close也保最高实际父;默认路径的异常归属保持原合同。
|
|
549
|
+
if self._capture_message_updates:
|
|
550
|
+
exc.observed_source_scan_cleanup_owner = self
|
|
551
|
+
raise
|