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,192 @@
|
|
|
1
|
+
"""把三格式共用的已解码更新交给实时完整同刻组消费者,不写历史文件。
|
|
2
|
+
|
|
3
|
+
只归一化当前声明需要的字段;同刻组跨读取批/连续文件保持,看到下一个相关
|
|
4
|
+
时间后才交付上一组,EOF显式finish交付末组。每条待交付样本预付有限预算,
|
|
5
|
+
大同刻组超预算明确失败。跨来源调用方必须先按实际时间合并;本组件不重排
|
|
6
|
+
原文件、不解码DBC、不查询完整性证明,不把单个来源EOF当整个会话EOF。
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from ..core.models import SourceRef
|
|
10
|
+
from ..legacy.updates import LegacyDecodedUpdate
|
|
11
|
+
from ..results.budget import ResourceBudget, _reserve_owned_ram, _release_owned_ram, _cleanup_owner
|
|
12
|
+
from ..results.errors import ResultClosedError
|
|
13
|
+
from ..sources.can_spec import can_field_from_key
|
|
14
|
+
from ..sources.packing import pack_message_values
|
|
15
|
+
from .groups import DecodedTimeGroup
|
|
16
|
+
from .history import _metadata_bytes
|
|
17
|
+
from .record_sample import RecordSample
|
|
18
|
+
from .calculation_values import scalar_from_column
|
|
19
|
+
from ..core.numeric import ScalarValue
|
|
20
|
+
from ..core.types import QualityFlag as Q,SignalDType as D
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class RawSignalGroups:
|
|
24
|
+
"""保存当前同刻的必要更新;组交付后立即释放,消费方另行承担最新值状态。"""
|
|
25
|
+
|
|
26
|
+
def __init__(self, budget, definitions, session_id, consumer, *, backend='numpy',clock_only=()):
|
|
27
|
+
"""建立所需帧/信号索引和固定来源引用,不打开原始文件。
|
|
28
|
+
|
|
29
|
+
参数: budget共享账本;definitions仅本次所需信号tuple;session_id会话;
|
|
30
|
+
consumer同步借用完整DecodedTimeGroup;backend选择原归一化内核。
|
|
31
|
+
clock_only只使用对应报文的更新时间,共用无效占位而不逐帧归一化无关值。
|
|
32
|
+
返回: owner。异常: 配置、预算或取消;构造恢复句柄raw_groups_cleanup_owner。
|
|
33
|
+
"""
|
|
34
|
+
if not isinstance(budget, ResourceBudget) or type(definitions) is not tuple or not callable(consumer):
|
|
35
|
+
raise TypeError('实时原始信号组需要预算、定义tuple及消费者')
|
|
36
|
+
if backend not in ('reference', 'numpy'):
|
|
37
|
+
raise ValueError('实时原始信号组后端错误')
|
|
38
|
+
self._budget, self._backend, self._session = budget, backend, session_id
|
|
39
|
+
self._held_cost = self._fixed_cost = self._group_cost = self._work_cost = 0
|
|
40
|
+
self._closed = self._closing = self._failed = self._finished = False
|
|
41
|
+
self._consumer = self._fields = self._samples = None
|
|
42
|
+
self._time = None
|
|
43
|
+
self._clock_values=None
|
|
44
|
+
self._clock_candidates={}
|
|
45
|
+
self._automatic_names=set()
|
|
46
|
+
try:
|
|
47
|
+
_reserve_owned_ram(self, 65536 + 32 * _metadata_bytes((definitions, session_id)), '_fixed_cost')
|
|
48
|
+
if len({item.name for item in definitions}) != len(definitions):
|
|
49
|
+
raise ValueError('实时原始信号组不能重复声明别名')
|
|
50
|
+
self._fields = {}
|
|
51
|
+
if not set(clock_only)<={item.name for item in definitions}:
|
|
52
|
+
raise ValueError('纯时钟字段必须属于当前组定义')
|
|
53
|
+
self._clock_values={item.name:ScalarValue(None,item.dtype,False,Q.MISSING,
|
|
54
|
+
tuple(dict.fromkeys(label for _,label in item.choices)) if item.dtype is D.ENUM else ())
|
|
55
|
+
for item in definitions if item.name in clock_only}
|
|
56
|
+
for definition in definitions:
|
|
57
|
+
field = can_field_from_key(definition.field)
|
|
58
|
+
# 自动类型需辨别“不是本帧字段”;显式类型的低层缺键仍表示缺值。
|
|
59
|
+
if field.is_extended is None or field.is_fd is None:
|
|
60
|
+
self._automatic_names.add(definition.name)
|
|
61
|
+
key = (definition.source, field.channel, field.frame_id, field.is_extended, field.is_fd)
|
|
62
|
+
ref = SourceRef(session_id, definition.source, definition.field)
|
|
63
|
+
self._fields.setdefault(key, []).append((definition, field.signal, ref))
|
|
64
|
+
self._fields = {key: tuple(items) for key, items in self._fields.items()}
|
|
65
|
+
self._samples, self._consumer = [], consumer
|
|
66
|
+
except BaseException as exc:
|
|
67
|
+
_cleanup_owner(self, exc, 'raw_groups_cleanup_owner', '实时原始信号组')
|
|
68
|
+
raise
|
|
69
|
+
finally:
|
|
70
|
+
definitions = definition = field = ref = consumer = None
|
|
71
|
+
|
|
72
|
+
def _require_open(self):
|
|
73
|
+
"""拒绝失败/关闭后的输入。参数: 无。返回: None。异常: ResultClosedError。"""
|
|
74
|
+
if self._closed or self._closing or self._failed:
|
|
75
|
+
raise ResultClosedError('实时原始信号组已失败或关闭')
|
|
76
|
+
|
|
77
|
+
def configure_metadata(self, facts):
|
|
78
|
+
"""借用同次DBC候选识别纯时钟字段,不解码或读取额外记录。
|
|
79
|
+
|
|
80
|
+
参数: facts为已加载字段事实。返回: None。异常: 定位结构错误。
|
|
81
|
+
副作用: 仅保存当前纯时钟字段的有限候选,费用包含在定义固定预算中。
|
|
82
|
+
"""
|
|
83
|
+
self._require_open()
|
|
84
|
+
from ..legacy.records import field_from_dict
|
|
85
|
+
# 同物理字段可能有多个时钟别名,按别名共享候选,不把后一别名覆盖掉。
|
|
86
|
+
by_field={field_from_dict(dict(fact['locator'])).key: fact['dbc_frames']
|
|
87
|
+
for fact in facts if 'dbc_frames' in fact}
|
|
88
|
+
self._clock_candidates={definition.name: by_field[definition.field]
|
|
89
|
+
for items in self._fields.values() for definition, _, _ in items
|
|
90
|
+
if definition.name in self._clock_values and definition.field in by_field}
|
|
91
|
+
|
|
92
|
+
def consume(self, update):
|
|
93
|
+
"""接收一条已投影更新,仅所需帧参与时间检查与同刻归组。
|
|
94
|
+
|
|
95
|
+
参数: update为LegacyDecodedUpdate;缺失的匹配字段仍生成无效更新覆盖旧值。
|
|
96
|
+
返回: None。异常: 身份/时间回退、预算、归一化或消费者错误;失败后禁止finish。
|
|
97
|
+
"""
|
|
98
|
+
self._require_open()
|
|
99
|
+
if self._finished:
|
|
100
|
+
raise ResultClosedError('实时原始信号组已经结束')
|
|
101
|
+
column = sample = value = fields = None
|
|
102
|
+
primary = None
|
|
103
|
+
try:
|
|
104
|
+
if not isinstance(update, LegacyDecodedUpdate) or update.source_ref.session_id != self._session:
|
|
105
|
+
raise ValueError('更新不属于当前会话')
|
|
106
|
+
# 每种选择器只有一个键;最多查询四种明确/省略类型组合,不扫描全部信号。
|
|
107
|
+
prefix = (update.source, update.channel, update.frame_id)
|
|
108
|
+
fields = tuple(item for extended in (update.is_extended, None) for fd in (update.is_fd, None)
|
|
109
|
+
for item in self._fields.get((*prefix, extended, fd), ()))
|
|
110
|
+
# 投影会为属于本帧但解码失败的字段保留None;未出现的键才是另一帧的字段。
|
|
111
|
+
# 纯时钟不要求解码值,使用初始化时已有的DBC候选判定所属帧。
|
|
112
|
+
fields = tuple(item for item in fields if
|
|
113
|
+
(item[0].name not in self._clock_values and
|
|
114
|
+
(item[0].name not in self._automatic_names or item[1] in update.values))
|
|
115
|
+
or (item[0].name in self._clock_values and
|
|
116
|
+
(item[0].name not in self._clock_candidates or any(
|
|
117
|
+
extended == update.is_extended and (fd == update.is_fd or fd and not update.is_fd)
|
|
118
|
+
for extended, fd in self._clock_candidates[item[0].name]))))
|
|
119
|
+
if not fields or update.is_remote or update.is_error:
|
|
120
|
+
return
|
|
121
|
+
if update.time_ns is None:
|
|
122
|
+
raise ValueError('驱动表达式需要相关报文的实际时间')
|
|
123
|
+
if self._time is not None and update.time_ns < self._time:
|
|
124
|
+
raise ValueError('相关报文回退;多来源须先按实际时间有界归并')
|
|
125
|
+
if self._time is not None and update.time_ns > self._time:
|
|
126
|
+
self._flush()
|
|
127
|
+
self._time = update.time_ns
|
|
128
|
+
_reserve_owned_ram(self, 16384 + 4096 * len(fields), '_work_cost')
|
|
129
|
+
for definition, name, ref in fields:
|
|
130
|
+
# 本条缺字段同样归一化为无效;不保原值副本或逐条原帧定位。
|
|
131
|
+
_reserve_owned_ram(self, 8192, '_group_cost')
|
|
132
|
+
if definition.name in self._clock_values:
|
|
133
|
+
value=self._clock_values[definition.name]
|
|
134
|
+
array_value=False if definition.dtype is D.BOOL else 0. if definition.dtype is D.FLOAT64 else 0
|
|
135
|
+
else:
|
|
136
|
+
column = pack_message_values(definition, (update.values.get(name),), self._backend)
|
|
137
|
+
value = scalar_from_column(column, 0)
|
|
138
|
+
array_value=column.values[0].item() if definition.dtype is D.ENUM else None
|
|
139
|
+
sample = RecordSample(definition.name, update.time_ns, update.sequence,
|
|
140
|
+
value, definition.unit, ref, array_value if definition.dtype is D.ENUM else None)
|
|
141
|
+
self._samples.append(sample)
|
|
142
|
+
except BaseException as exc:
|
|
143
|
+
primary = exc
|
|
144
|
+
self._failed = True
|
|
145
|
+
raise
|
|
146
|
+
finally:
|
|
147
|
+
column = sample = value = update = fields = None
|
|
148
|
+
try:
|
|
149
|
+
_release_owned_ram(self, self._work_cost, '_work_cost')
|
|
150
|
+
except BaseException as cleanup:
|
|
151
|
+
self._failed = True
|
|
152
|
+
if primary is None:
|
|
153
|
+
raise
|
|
154
|
+
primary.add_note('实时原始信号组临时费用清理失败:' + type(cleanup).__name__)
|
|
155
|
+
|
|
156
|
+
def _flush(self):
|
|
157
|
+
"""同步借出完整组后释放本组,不保输出副本。参数: 无。返回: None。异常: 消费/清理错误。"""
|
|
158
|
+
if not self._samples:
|
|
159
|
+
return
|
|
160
|
+
group = None
|
|
161
|
+
try:
|
|
162
|
+
group = DecodedTimeGroup(self._time, tuple(self._samples))
|
|
163
|
+
self._consumer(group)
|
|
164
|
+
finally:
|
|
165
|
+
group = None
|
|
166
|
+
self._samples.clear()
|
|
167
|
+
_release_owned_ram(self, self._group_cost, '_group_cost')
|
|
168
|
+
|
|
169
|
+
def finish(self):
|
|
170
|
+
"""所有输入EOF并成功关闭后交付末组,不创建末尾周期。参数: 无。返回: None。异常: 消费/清理错误。"""
|
|
171
|
+
self._require_open()
|
|
172
|
+
if self._finished:
|
|
173
|
+
return
|
|
174
|
+
try:
|
|
175
|
+
self._flush()
|
|
176
|
+
self._finished = True
|
|
177
|
+
except BaseException:
|
|
178
|
+
self._failed = True
|
|
179
|
+
raise
|
|
180
|
+
|
|
181
|
+
def close(self):
|
|
182
|
+
"""仅退自有费用,不替调用方完成剩余组。参数: 无。返回: None。异常: 释放失败可重试。"""
|
|
183
|
+
if self._closed:
|
|
184
|
+
return
|
|
185
|
+
self._closing = True
|
|
186
|
+
self._samples = self._fields = self._consumer = self._clock_values = None
|
|
187
|
+
self._clock_candidates={}
|
|
188
|
+
self._automatic_names.clear()
|
|
189
|
+
_release_owned_ram(self, self._work_cost, '_work_cost')
|
|
190
|
+
_release_owned_ram(self, self._group_cost, '_group_cost')
|
|
191
|
+
_release_owned_ram(self, self._fixed_cost, '_fixed_cost')
|
|
192
|
+
self._closed = True
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
"""仅在请求报警累计时,按实际有效区间折算所选周期。
|
|
2
|
+
|
|
3
|
+
状态变化可能发生在两个驱动报文之间,例如温度在中途过期。每对报文只保
|
|
4
|
+
实际已知/报警长度,收到右端后按该对完整跨度折算,不保存逐点轨迹。没有
|
|
5
|
+
右端的末段不补固定周期;实际模式则累计已经确认存在的连续观测区间。
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from ..core.types import Truth as T
|
|
9
|
+
from ..core.integral_sum_reference import ReferenceIntegralSum
|
|
10
|
+
from ..core.integral_sum_numpy import NumpyIntegralSum
|
|
11
|
+
from ..results.errors import ResultClosedError,AnalysisError
|
|
12
|
+
from ..results.spool import _reserve_owned_ram,_release_owned_ram,_cleanup_owner
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class RecordAlarmDuration:
|
|
16
|
+
"""拥有一个待完成记录对和有限求和状态,不读取来源或构造明细。"""
|
|
17
|
+
|
|
18
|
+
def __init__(self,budget,step_ns,backend,window):
|
|
19
|
+
"""预付统计费用。参数: 共享预算、实际None/正周期、后端。返回: owner。异常: 构造原错附owner。"""
|
|
20
|
+
self._budget,self._step=budget,step_ns
|
|
21
|
+
self._backend=backend
|
|
22
|
+
self._window=window
|
|
23
|
+
self._held_cost=self._fixed_cost=0
|
|
24
|
+
self._last=self._driver=None
|
|
25
|
+
self._state=T.UNKNOWN
|
|
26
|
+
self._pair_known=self._pair_active=0
|
|
27
|
+
self._known=self._observed=0
|
|
28
|
+
self._active_ns=0
|
|
29
|
+
self._sum=None
|
|
30
|
+
self._closed=self._finished=False
|
|
31
|
+
try:
|
|
32
|
+
_reserve_owned_ram(self,65536+(4096*256 if step_ns is not None else 0),'_fixed_cost')
|
|
33
|
+
if step_ns is not None:
|
|
34
|
+
self._sum=(ReferenceIntegralSum if backend=='reference' else NumpyIntegralSum)(4096)
|
|
35
|
+
except BaseException as error:
|
|
36
|
+
_cleanup_owner(self,error,'record_alarm_cleanup_owner','报警时长构造')
|
|
37
|
+
raise
|
|
38
|
+
|
|
39
|
+
def consume(self,time_ns,state,driver=False):
|
|
40
|
+
"""先结算前态,再记当前态;中途未知只裁剪本对有效部分。
|
|
41
|
+
|
|
42
|
+
参数: 实际时间、已确认报警三态、是否真实驱动更新。返回: None。异常: 顺序/数值/关闭错误。
|
|
43
|
+
"""
|
|
44
|
+
if self._closed or self._finished:
|
|
45
|
+
raise ResultClosedError('报警累计已结束')
|
|
46
|
+
if self._last is not None:
|
|
47
|
+
if time_ns<self._last:
|
|
48
|
+
raise ValueError('报警累计时间不能回退')
|
|
49
|
+
length=max(0,min(time_ns,self._window.end_ns)-max(self._last,self._window.start_ns))
|
|
50
|
+
known=length if self._state is not T.UNKNOWN else 0
|
|
51
|
+
active=length if self._state is T.TRUE else 0
|
|
52
|
+
if self._step is None:
|
|
53
|
+
self._observed+=length
|
|
54
|
+
self._known+=known
|
|
55
|
+
self._active_ns+=active
|
|
56
|
+
elif self._driver is not None:
|
|
57
|
+
self._pair_known+=known
|
|
58
|
+
self._pair_active+=active
|
|
59
|
+
if self._step is not None and driver:
|
|
60
|
+
if self._driver is not None:
|
|
61
|
+
span=time_ns-self._driver
|
|
62
|
+
overlap=max(0,min(time_ns,self._window.end_ns)-max(self._driver,self._window.start_ns))
|
|
63
|
+
self._observed+=overlap
|
|
64
|
+
self._known+=self._pair_known
|
|
65
|
+
seconds=(self._step*self._pair_active)/(span*1_000_000_000)
|
|
66
|
+
if self._backend=='reference':
|
|
67
|
+
self._sum.push_values((seconds,),(True,))
|
|
68
|
+
else:
|
|
69
|
+
import numpy as np
|
|
70
|
+
values=np.array([seconds],dtype=np.float64)
|
|
71
|
+
valid=np.array([True],dtype=np.bool_)
|
|
72
|
+
values.setflags(write=False);valid.setflags(write=False)
|
|
73
|
+
self._sum.push_values(values,valid)
|
|
74
|
+
self._driver=time_ns
|
|
75
|
+
self._pair_known=self._pair_active=0
|
|
76
|
+
self._last,self._state=time_ns,state
|
|
77
|
+
|
|
78
|
+
def driver(self,time_ns):
|
|
79
|
+
"""接收原始驱动端点,包括请求域两侧用于比例的点。参数: 实际时间。返回: None。异常: 顺序错误。"""
|
|
80
|
+
if self._step is None or self._driver is not None and self._driver>=self._window.end_ns:
|
|
81
|
+
return
|
|
82
|
+
self.consume(time_ns,self._state,True)
|
|
83
|
+
|
|
84
|
+
def finish(self):
|
|
85
|
+
"""返回单一秒数及完整性;不结算没有右端的周期。
|
|
86
|
+
|
|
87
|
+
参数: 无。返回: (可核实报警秒数或None,状态)。异常: 求和失败/关闭错误。
|
|
88
|
+
"""
|
|
89
|
+
if self._closed:
|
|
90
|
+
raise ResultClosedError('报警累计已关闭')
|
|
91
|
+
if self._sum is None:
|
|
92
|
+
active=self._active_ns/1e9
|
|
93
|
+
else:
|
|
94
|
+
result=self._sum.finish('s')
|
|
95
|
+
if result.calculation_failed:
|
|
96
|
+
raise AnalysisError('报警累计数值溢出')
|
|
97
|
+
active=0. if result.value is None else result.value
|
|
98
|
+
status=('no_observation' if not self._observed else 'indeterminate' if not self._known
|
|
99
|
+
else 'partial' if self._known<self._observed else 'complete')
|
|
100
|
+
self._finished=True
|
|
101
|
+
return (active if status in ('complete','partial') else None),status
|
|
102
|
+
|
|
103
|
+
@property
|
|
104
|
+
def closed(self):
|
|
105
|
+
"""返回关闭状态。参数: 无。返回: bool。异常: 无。"""
|
|
106
|
+
return self._closed
|
|
107
|
+
|
|
108
|
+
def close(self):
|
|
109
|
+
"""丢弃统计状态并归还自己的费用。参数: 无。返回: None。异常: 释放原错可重试。"""
|
|
110
|
+
if self._closed:
|
|
111
|
+
return
|
|
112
|
+
self._sum=None
|
|
113
|
+
_release_owned_ram(self,self._fixed_cost,'_fixed_cost')
|
|
114
|
+
self._closed=True
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
"""在当前窗口内保留必要数值片段,输出窗口变化量的三值条件。
|
|
2
|
+
|
|
3
|
+
实际模式在旧边界移出窗口时继续求值;固定/DBC只在选定驱动到达时移动窗口,
|
|
4
|
+
其他更新只处理失效。原实际坐标和TTL不改变,变化量仍交原独立两后端核计算。
|
|
5
|
+
"""
|
|
6
|
+
from collections import deque
|
|
7
|
+
from dataclasses import replace
|
|
8
|
+
from fractions import Fraction
|
|
9
|
+
from ..core.numeric import ScalarValue
|
|
10
|
+
from ..core.types import SignalDType as D,QualityFlag as Q,Truth as T
|
|
11
|
+
from ..core.window_delta import DeltaSpan
|
|
12
|
+
from ..core.window_delta_reference import window_delta_reference
|
|
13
|
+
from ..core.window_delta_numpy import window_delta_numpy
|
|
14
|
+
from ..results.errors import ResultClosedError
|
|
15
|
+
from ..results.spool import _reserve_owned_ram,_release_owned_ram,_cleanup_owner
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class RecordDeltaCondition:
|
|
19
|
+
"""拥有当前窗口片段和有限驱动时刻;不创建整段历史或对照时间轴。"""
|
|
20
|
+
|
|
21
|
+
def __init__(self,budget,spec,dtype,backend,step_ns):
|
|
22
|
+
"""预付有限状态,动态窗口按实际容量收费。参数: 预算/配置/数值类型/后端/周期。返回: owner。异常: 原构造错。"""
|
|
23
|
+
self._budget,self._spec,self._dtype,self._step=budget,spec,dtype,step_ns
|
|
24
|
+
self._held_cost=self._fixed_cost=self._span_cost=self._clock_cost=self._work_cost=0
|
|
25
|
+
self._spans,self._clocks=deque(),deque()
|
|
26
|
+
self._held_number=self._held_right=None
|
|
27
|
+
self._held_deadline=None
|
|
28
|
+
self._point=self._right=ScalarValue(None,D.BOOL,False,Q.MISSING)
|
|
29
|
+
self._last_time=None
|
|
30
|
+
self.next_deadline=None
|
|
31
|
+
self._closed=self._failed=False
|
|
32
|
+
try:
|
|
33
|
+
_reserve_owned_ram(self,65536,'_fixed_cost')
|
|
34
|
+
self._kernel=window_delta_reference if backend=='reference' else window_delta_numpy
|
|
35
|
+
except BaseException as error:
|
|
36
|
+
_cleanup_owner(self,error,'record_delta_cleanup_owner','窗口变化条件构造')
|
|
37
|
+
raise
|
|
38
|
+
|
|
39
|
+
@staticmethod
|
|
40
|
+
def _condition(result):
|
|
41
|
+
"""转换既有数值核的三值结果,不把未知变False。参数: 结果。返回: ScalarValue。异常: 原类型错。"""
|
|
42
|
+
valid=result.condition is not T.UNKNOWN
|
|
43
|
+
return ScalarValue(result.condition is T.TRUE if valid else None,D.BOOL,valid,result.quality)
|
|
44
|
+
|
|
45
|
+
def _append(self,time_ns,point,right):
|
|
46
|
+
"""只保存值或质量真正变化的边界,查询末点临时构造。
|
|
47
|
+
|
|
48
|
+
参数: 实际时刻、点值/右侧值。返回: None。异常: 预算/时间回退。
|
|
49
|
+
"""
|
|
50
|
+
value=point.value if point.valid else None
|
|
51
|
+
pq=Q.NONE if point.valid else point.quality
|
|
52
|
+
cq=Q.NONE if right.valid else right.quality
|
|
53
|
+
if self._spans:
|
|
54
|
+
last=self._spans[-1]
|
|
55
|
+
if last.start_ns==time_ns:
|
|
56
|
+
self._spans[-1]=DeltaSpan(time_ns,time_ns,value,cq,pq)
|
|
57
|
+
return
|
|
58
|
+
self._spans[-1]=replace(last,end_ns=time_ns)
|
|
59
|
+
if last.value==value and last.quality==cq==pq:
|
|
60
|
+
return
|
|
61
|
+
_reserve_owned_ram(self,2048,'_span_cost')
|
|
62
|
+
self._spans.append(DeltaSpan(time_ns,time_ns,value,cq,pq))
|
|
63
|
+
|
|
64
|
+
def _left(self,time_ns):
|
|
65
|
+
"""只根据当前窗口需要的驱动记录确定左端。参数: 实际时刻。返回: 左端或不足时None。异常: 无。"""
|
|
66
|
+
if self._step is None:
|
|
67
|
+
return time_ns-self._spec.window_ns
|
|
68
|
+
count=len(self._clocks)
|
|
69
|
+
offset=Fraction(self._spec.window_ns,self._step)
|
|
70
|
+
target=Fraction(count-1)-offset
|
|
71
|
+
if target<0:
|
|
72
|
+
return None
|
|
73
|
+
index=target.numerator//target.denominator
|
|
74
|
+
if target==index:
|
|
75
|
+
return self._clocks[index]
|
|
76
|
+
return round(Fraction(self._clocks[index])+(target-index)*(self._clocks[index+1]-self._clocks[index]))
|
|
77
|
+
|
|
78
|
+
def update(self,time_ns,point,right,expires_at_ns,*,driver=False):
|
|
79
|
+
"""推进真实值和当前窗口,返回点/右侧条件;不输出变化值副本。
|
|
80
|
+
|
|
81
|
+
参数: 实际时刻、求值点/右侧值、实际TTL截止及是否选定驱动。
|
|
82
|
+
返回: 两个BOOL ScalarValue。异常: 倒序、预算或原数值错误;失败只能清理。
|
|
83
|
+
"""
|
|
84
|
+
if self._closed or self._failed:
|
|
85
|
+
raise ResultClosedError('窗口变化条件已关闭或失败')
|
|
86
|
+
spans=point_result=right_result=None
|
|
87
|
+
try:
|
|
88
|
+
if self._last_time is not None and time_ns<self._last_time:
|
|
89
|
+
raise ValueError('窗口变化时间回退')
|
|
90
|
+
self._last_time=time_ns
|
|
91
|
+
if self._step is not None:
|
|
92
|
+
if driver:
|
|
93
|
+
if not self._clocks or self._clocks[-1]!=time_ns:
|
|
94
|
+
_reserve_owned_ram(self,128,'_clock_cost')
|
|
95
|
+
self._clocks.append(time_ns)
|
|
96
|
+
limit=(self._spec.window_ns+self._step-1)//self._step+1
|
|
97
|
+
while len(self._clocks)>limit:
|
|
98
|
+
self._clocks.popleft()
|
|
99
|
+
_release_owned_ram(self,128,'_clock_cost')
|
|
100
|
+
self._held_number,self._held_right,self._held_deadline=point,right,expires_at_ns
|
|
101
|
+
else:
|
|
102
|
+
unknown=ScalarValue(None,self._dtype,False,Q.MISSING)
|
|
103
|
+
if self._held_number is None:
|
|
104
|
+
point=right=unknown
|
|
105
|
+
else:
|
|
106
|
+
expired=self._held_deadline is not None and time_ns>=self._held_deadline
|
|
107
|
+
if expired:
|
|
108
|
+
point=right=ScalarValue(None,self._dtype,False,Q.STALE)
|
|
109
|
+
else:
|
|
110
|
+
point=self._held_number if point.valid else point
|
|
111
|
+
right=self._held_right if right.valid else right
|
|
112
|
+
if not point.valid or not right.valid:
|
|
113
|
+
self._held_number,self._held_right=point,right
|
|
114
|
+
self.next_deadline=(self._held_deadline if self._held_deadline is not None and self._held_deadline>time_ns else None)
|
|
115
|
+
self._append(time_ns,point,right)
|
|
116
|
+
if self._step is not None and not driver:
|
|
117
|
+
if not point.valid:
|
|
118
|
+
self._point=ScalarValue(None,D.BOOL,False,point.quality)
|
|
119
|
+
if not right.valid:
|
|
120
|
+
self._right=ScalarValue(None,D.BOOL,False,right.quality)
|
|
121
|
+
return self._point,self._right
|
|
122
|
+
left=self._left(time_ns)
|
|
123
|
+
if left is None or left>=time_ns:
|
|
124
|
+
self._point=self._right=ScalarValue(None,D.BOOL,False,Q.MISSING)
|
|
125
|
+
return self._point,self._right
|
|
126
|
+
while len(self._spans)>1 and self._spans[0].end_ns<=left and self._spans[0].start_ns<left:
|
|
127
|
+
self._spans.popleft()
|
|
128
|
+
_release_owned_ram(self,2048,'_span_cost')
|
|
129
|
+
_reserve_owned_ram(self,65536+4096*(len(self._spans)+1),'_work_cost')
|
|
130
|
+
tail=DeltaSpan(time_ns,time_ns,point.value if point.valid else None,
|
|
131
|
+
Q.NONE if right.valid else right.quality,Q.NONE if point.valid else point.quality)
|
|
132
|
+
spans=tuple(self._spans)
|
|
133
|
+
spans=spans if spans[-1].start_ns==time_ns else spans+(tail,)
|
|
134
|
+
spec=self._spec if self._step is None else replace(self._spec,window_ns=time_ns-left)
|
|
135
|
+
point_result=self._kernel(spec,spans,time_ns,self._dtype)
|
|
136
|
+
right_result=point_result
|
|
137
|
+
if tail.point_quality!=tail.quality:
|
|
138
|
+
right_result=self._kernel(spec,spans[:-1]+(replace(tail,point_quality=tail.quality),),time_ns,self._dtype)
|
|
139
|
+
self._point,self._right=self._condition(point_result),self._condition(right_result)
|
|
140
|
+
if self._step is None:
|
|
141
|
+
candidates=[span.start_ns+self._spec.window_ns for span in self._spans
|
|
142
|
+
if time_ns<span.start_ns+self._spec.window_ns<(1<<63)]
|
|
143
|
+
if expires_at_ns is not None and expires_at_ns>time_ns:
|
|
144
|
+
candidates.append(expires_at_ns)
|
|
145
|
+
self.next_deadline=min(candidates) if candidates else None
|
|
146
|
+
return self._point,self._right
|
|
147
|
+
except BaseException:
|
|
148
|
+
self._failed=True
|
|
149
|
+
raise
|
|
150
|
+
finally:
|
|
151
|
+
spans=point_result=right_result=None
|
|
152
|
+
_release_owned_ram(self,self._work_cost,'_work_cost')
|
|
153
|
+
|
|
154
|
+
@property
|
|
155
|
+
def closed(self):
|
|
156
|
+
"""返回资源关闭状态。参数: 无。返回: bool。异常: 无。"""
|
|
157
|
+
return self._closed
|
|
158
|
+
|
|
159
|
+
def close(self):
|
|
160
|
+
"""释放有界片段与驱动记录,不写文件。参数: 无。返回: None。异常: 原预算关闭错,可重试。"""
|
|
161
|
+
if self._closed:
|
|
162
|
+
return
|
|
163
|
+
self._spans.clear();self._clocks.clear()
|
|
164
|
+
self._held_number=self._held_right=None
|
|
165
|
+
for slot in ('_span_cost','_clock_cost','_work_cost','_fixed_cost'):
|
|
166
|
+
_release_owned_ram(self,getattr(self,slot),slot)
|
|
167
|
+
self._closed=True
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
"""仅在请求追溯或完整性诊断时观察同次输入,不增加来源扫描。
|
|
2
|
+
|
|
3
|
+
trace逐条保存所需输入值和来源序号;integrity随这些记录计算摘要,两者独立。
|
|
4
|
+
来源配置只在清单保存一次。借入值在调用结束释放,固定哈希状态按来源付费;
|
|
5
|
+
最终明细使用已有结果仓的有界外排和生命周期,不建立第二份历史。
|
|
6
|
+
"""
|
|
7
|
+
import hashlib
|
|
8
|
+
import json
|
|
9
|
+
from math import isfinite
|
|
10
|
+
from ..results.input_diagnostics import InputDiagnostic
|
|
11
|
+
from ..results.budget import _reserve_owned_ram,_release_owned_ram,_cleanup_owner
|
|
12
|
+
from ..results.errors import ResultClosedError
|
|
13
|
+
from .history import _metadata_bytes
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class RecordDiagnostics:
|
|
17
|
+
"""保存每来源一个计数及可选摘要;逐条明细同步交给最终结果消费者。"""
|
|
18
|
+
def __init__(self,plan,requirements,budget,consumer):
|
|
19
|
+
"""预约实际来源状态。参数: 计划/需求/预算/追溯回调。返回: owner。异常: 预算错误。"""
|
|
20
|
+
self._plan,self._requirements,self._budget=plan,requirements,budget
|
|
21
|
+
self._consumer=consumer if plan.diagnostics.trace else None
|
|
22
|
+
self._held_cost=self._fixed_cost=self._row_cost=0
|
|
23
|
+
self._counts=self._hashes=None
|
|
24
|
+
self._closed=False
|
|
25
|
+
try:
|
|
26
|
+
names=tuple(s.source for s in requirements.sources if s.active)
|
|
27
|
+
_reserve_owned_ram(self,65536+4096*len(names),'_fixed_cost')
|
|
28
|
+
# 来源清单只计路径/需求,不遍历memory来源的全部数据;覆盖最终清单交接副本。
|
|
29
|
+
extra=32*_metadata_bytes(requirements)
|
|
30
|
+
for source in plan.sources:
|
|
31
|
+
if source.name not in names:continue
|
|
32
|
+
config=source.config
|
|
33
|
+
paths=(config.input_paths if source.source_type=='can_blf' else
|
|
34
|
+
(item.path for item in config.inputs) if source.source_type in ('can_asc','asc_or_blf','raw_can_csv') else
|
|
35
|
+
config.paths if source.source_type=='signal_csv' else ())
|
|
36
|
+
extra+=sum(4096+256*len(str(path)) for path in paths)
|
|
37
|
+
_reserve_owned_ram(self,extra,'_fixed_cost')
|
|
38
|
+
self._counts=dict.fromkeys(names,0)
|
|
39
|
+
self._hashes={name:hashlib.sha256() for name in names} if plan.diagnostics.integrity else {}
|
|
40
|
+
except BaseException as error:
|
|
41
|
+
_cleanup_owner(self,error,'record_diagnostics_cleanup_owner','输入诊断');raise
|
|
42
|
+
|
|
43
|
+
def consume(self,source,sequence,time_ns,record_type,locator,values,quality):
|
|
44
|
+
"""借入必要输入,按请求追溯/取摘要。参数: 定位/类型/值/质量。返回: None。异常: 编码/预算/取消。"""
|
|
45
|
+
if self._closed:raise ResultClosedError('输入诊断已关闭')
|
|
46
|
+
payload=normalized=text=None
|
|
47
|
+
try:
|
|
48
|
+
# 先覆盖编码及非有限标签空间,非法值不偷偷转成有效0。
|
|
49
|
+
_reserve_owned_ram(self,16384+64*_metadata_bytes(values),'_row_cost')
|
|
50
|
+
normalized={name:({'nonfinite':'nan' if value!=value else 'inf' if value>0 else '-inf'}
|
|
51
|
+
if type(value) is float and not isfinite(value) else value) for name,value in values.items()}
|
|
52
|
+
text=json.dumps(normalized,ensure_ascii=False,allow_nan=False,sort_keys=True,separators=(',',':'))
|
|
53
|
+
if source in self._hashes:
|
|
54
|
+
payload=json.dumps((sequence,time_ns,record_type,locator,int(quality),text),ensure_ascii=False,
|
|
55
|
+
allow_nan=False,separators=(',',':')).encode('utf-8')
|
|
56
|
+
self._hashes[source].update(len(payload).to_bytes(8,'big'))
|
|
57
|
+
self._hashes[source].update(payload)
|
|
58
|
+
if self._consumer is not None:
|
|
59
|
+
self._consumer(source,sequence,time_ns,record_type,locator,text,quality)
|
|
60
|
+
self._counts[source]+=1
|
|
61
|
+
finally:
|
|
62
|
+
payload=normalized=values=text=None
|
|
63
|
+
_release_owned_ram(self,self._row_cost,'_row_cost')
|
|
64
|
+
|
|
65
|
+
def summaries(self,cursors):
|
|
66
|
+
"""仅EOF后交付有限来源清单。参数: 实际游标。返回: InputDiagnostic tuple。异常: 不完整来源。"""
|
|
67
|
+
result=[]
|
|
68
|
+
for cursor in cursors:
|
|
69
|
+
source=next(s for s in self._plan.sources if s.name==cursor.source_name)
|
|
70
|
+
config=source.config
|
|
71
|
+
paths=(tuple(str(p) for p in config.input_paths) if source.source_type=='can_blf' else
|
|
72
|
+
tuple(str(i.path) for i in config.inputs) if source.source_type in ('can_asc','asc_or_blf','raw_can_csv') else
|
|
73
|
+
tuple(str(path) for path in config.paths) if source.source_type=='signal_csv' else ())
|
|
74
|
+
req=self._requirements.for_source(source.name)
|
|
75
|
+
result.append(InputDiagnostic(source.name,source.source_type,paths,req.required_aliases,
|
|
76
|
+
tuple((name,self._plan.bindings.resolve(name).field) for name in req.required_aliases),
|
|
77
|
+
req.input_check,req.time_scope,self._counts[source.name],cursor._finished,
|
|
78
|
+
self._hashes[source.name].hexdigest() if source.name in self._hashes else None))
|
|
79
|
+
return tuple(result)
|
|
80
|
+
|
|
81
|
+
def close(self):
|
|
82
|
+
"""断开哈希/回调后归还本owner费用。参数: 无。返回: None。异常: 预算释放错误。"""
|
|
83
|
+
if self._closed:return
|
|
84
|
+
self._counts=self._hashes=self._consumer=None
|
|
85
|
+
_release_owned_ram(self,self._row_cost,'_row_cost')
|
|
86
|
+
_release_owned_ram(self,self._fixed_cost,'_fixed_cost')
|
|
87
|
+
self._closed=True
|