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,458 @@
|
|
|
1
|
+
"""按同次解码值离线生成网格报文,并与未选/未知原帧稳定合并。
|
|
2
|
+
|
|
3
|
+
输入FrameSample含精确原帧、物理值、实际复用选择器和已知报文事实;本模块
|
|
4
|
+
不再读原日志/DBC或调用解码。先用有界磁盘排序按完整身份分组,每组只持相邻
|
|
5
|
+
样本,再将生成/透传/未生成说明按时间有界排序。连续量用独立reference或
|
|
6
|
+
NumPy内核;基础帧等距取左,只更新允许位。未知报文默认透传,可显式最近邻。
|
|
7
|
+
所有暂存、格式对象和输入游标由本owner关闭,失败不发布成品。
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from dataclasses import dataclass, replace
|
|
11
|
+
from fractions import Fraction
|
|
12
|
+
from itertools import groupby
|
|
13
|
+
import json
|
|
14
|
+
from math import isfinite
|
|
15
|
+
from pathlib import Path
|
|
16
|
+
|
|
17
|
+
from ..core.export_interpolation import linear_reference,linear_numpy
|
|
18
|
+
from ..core.models import Interval
|
|
19
|
+
from ..execution.history import _metadata_bytes
|
|
20
|
+
from ..legacy.records import frame_to_dict,frame_from_dict
|
|
21
|
+
from ..timebase.conversion import require_int64_ns,checked_add_ns
|
|
22
|
+
from .budget import _reserve_owned_ram,_release_owned_ram,_cleanup_owner
|
|
23
|
+
from .codec import _pack,_unpack
|
|
24
|
+
from .errors import ResultClosedError
|
|
25
|
+
from .frame_exports import ExportCANFrame,SkippedCANFrame
|
|
26
|
+
from .frame_patch import FrameRebuildRule,DBCFramePatch
|
|
27
|
+
from .frame_sort import FrameSort
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
@dataclass(frozen=True)
|
|
31
|
+
class FrameSample:
|
|
32
|
+
"""保同次已解码事实;layout用原始选择器整数,非物理缩放值。"""
|
|
33
|
+
|
|
34
|
+
record: ExportCANFrame
|
|
35
|
+
values: tuple[tuple[str,int | float | bool | None],...] = ()
|
|
36
|
+
layout: tuple[tuple[str,int],...] = ()
|
|
37
|
+
known: bool = False
|
|
38
|
+
valid: bool = True
|
|
39
|
+
|
|
40
|
+
def __post_init__(self):
|
|
41
|
+
"""核冻结值与定位结构。参数: 无。返回: None。异常: 类型/重复字段/布局非法。
|
|
42
|
+
"""
|
|
43
|
+
if type(self.record) is not ExportCANFrame or type(self.known) is not bool or type(self.valid) is not bool:
|
|
44
|
+
raise TypeError('重建样本需要真实导出帧和明确布尔事实')
|
|
45
|
+
for pairs,types in ((self.values,(int,float,bool,type(None))),(self.layout,(int,))):
|
|
46
|
+
if type(pairs) is not tuple or len(pairs)>4096:
|
|
47
|
+
raise ValueError('重建样本字段超过有限能力')
|
|
48
|
+
names=set()
|
|
49
|
+
for pair in pairs:
|
|
50
|
+
if type(pair) is not tuple or len(pair)!=2 or type(pair[0]) is not str or not pair[0] or type(pair[1]) not in types or pair[0] in names:
|
|
51
|
+
raise ValueError('重建样本字段重复或类型非法')
|
|
52
|
+
names.add(pair[0])
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
@dataclass(frozen=True)
|
|
56
|
+
class FrameGridSpec:
|
|
57
|
+
"""统一整数网格及明确的插值/最近邻上限,不按文件或批次重新起算。"""
|
|
58
|
+
|
|
59
|
+
period_ns: int | None # None为各已选报文的DBC周期,运行前一次解析。
|
|
60
|
+
origin_ns: int
|
|
61
|
+
max_gap_ns: int
|
|
62
|
+
unknown_policy: str = 'passthrough'
|
|
63
|
+
max_distance_ns: int | None = None
|
|
64
|
+
|
|
65
|
+
def __post_init__(self):
|
|
66
|
+
"""核网格与未知报文策略。参数: 无。返回: None。异常: 非法时间/策略/距离。
|
|
67
|
+
"""
|
|
68
|
+
for name in ('period_ns','origin_ns','max_gap_ns'):
|
|
69
|
+
if name=='period_ns' and self.period_ns is None:continue
|
|
70
|
+
require_int64_ns(getattr(self,name),name)
|
|
71
|
+
if self.period_ns is not None and self.period_ns<=0 or self.max_gap_ns<=0 or self.unknown_policy not in ('passthrough','nearest'):
|
|
72
|
+
raise ValueError('需要正网格/间隔和显式未知策略')
|
|
73
|
+
if self.max_distance_ns is not None:
|
|
74
|
+
require_int64_ns(self.max_distance_ns)
|
|
75
|
+
if self.max_distance_ns<0:
|
|
76
|
+
raise ValueError('最近邻距离不能为负')
|
|
77
|
+
if self.period_ns is None and self.unknown_policy=='nearest':
|
|
78
|
+
raise ValueError('未知报文没有DBC周期;最近邻网格必须给固定period')
|
|
79
|
+
if self.unknown_policy=='nearest' and self.max_distance_ns is None:
|
|
80
|
+
raise ValueError('未知报文最近邻必须声明最大距离')
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def _frame_packet(record):
|
|
84
|
+
"""编码固定原帧及定位结构。参数: record。返回: JSON dict。异常: 原模型非法。
|
|
85
|
+
"""
|
|
86
|
+
frame=frame_to_dict(record.frame)
|
|
87
|
+
if not record.provenance:
|
|
88
|
+
# writer实际用output_time_ns;默认暂存不再保存它的float秒副本。
|
|
89
|
+
frame.pop('timestamp')
|
|
90
|
+
packet={'sequence':record.sequence,'time_ns':record.time_ns,'frame':frame,'frame_origin':record.frame_origin}
|
|
91
|
+
if record.output_time_ns!=record.time_ns:
|
|
92
|
+
packet['output_time_ns']=record.output_time_ns
|
|
93
|
+
if record.provenance:
|
|
94
|
+
packet['provenance']=record.provenance
|
|
95
|
+
return packet
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
def _restore_frame(packet):
|
|
99
|
+
"""恢复本次认证暂存的固定原帧。参数: packet。返回: ExportCANFrame。异常: 非法模型。
|
|
100
|
+
"""
|
|
101
|
+
output=packet.get('output_time_ns',packet['time_ns'])
|
|
102
|
+
frame=packet['frame']
|
|
103
|
+
if 'timestamp' not in frame:
|
|
104
|
+
frame=dict(frame,timestamp=output/10**9)
|
|
105
|
+
return ExportCANFrame(packet['sequence'],packet['time_ns'],output,
|
|
106
|
+
frame_from_dict(frame),tuple(tuple(p) for p in packet.get('provenance',())),packet['frame_origin'])
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
def _sample_packet(sample):
|
|
110
|
+
"""保存无效NaN等诊断而不输出非法JSON。参数: sample。返回: 固定dict。异常: 编码错。
|
|
111
|
+
"""
|
|
112
|
+
return {'record':_frame_packet(sample.record),'values':_pack(sample.values),'layout':sample.layout,
|
|
113
|
+
'known':sample.known,'valid':sample.valid}
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
def _restore_sample(packet):
|
|
117
|
+
"""恢复已认证样本,不加载DBC。参数: packet。返回: FrameSample。异常: 结构错。
|
|
118
|
+
"""
|
|
119
|
+
return FrameSample(_restore_frame(packet['record']),_unpack(packet['values']),
|
|
120
|
+
tuple(tuple(p) for p in packet['layout']),packet['known'],packet['valid'])
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
def _facts(sample):
|
|
124
|
+
"""比较同刻计算事实,排除来源序号但保实际载荷/布局/质量。参数: sample。返回: 有限JSON。异常: 编码错。
|
|
125
|
+
"""
|
|
126
|
+
return json.dumps((frame_to_dict(sample.record.frame),sample.record.output_time_ns,
|
|
127
|
+
_pack(sample.values),sample.layout,sample.known,sample.valid),sort_keys=True,allow_nan=False)
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
class FrameRebuildRead:
|
|
131
|
+
"""拥有输入、两份排序仓和有限DBC位域对象;只在完整准备后开放输出。"""
|
|
132
|
+
|
|
133
|
+
def __init__(self,records,spec,interval,rules,budget,work_dir,*,backend='numpy',check_cancel=None,periods=None,integrity=True,trace=True):
|
|
134
|
+
"""静态核配置并预约资源。参数: records、网格/范围、(rule,已加载Message)tuple、预算/新目录、后端/取消;periods为同次初始化已解析DBC周期。
|
|
135
|
+
返回: 可关闭重建owner。异常: 配置/预算/I/O错,清理失败附frame_rebuild_cleanup_owner。
|
|
136
|
+
"""
|
|
137
|
+
if type(spec) is not FrameGridSpec or type(interval) is not Interval or backend not in ('reference','numpy'):
|
|
138
|
+
raise ValueError('报文重建需要网格、范围及明确后端')
|
|
139
|
+
if type(rules) is not tuple or len(rules)>4096 or any(type(p) is not tuple or len(p)!=2 or type(p[0]) is not FrameRebuildRule for p in rules):
|
|
140
|
+
raise ValueError('重建规则需要有限(rule,Message)tuple')
|
|
141
|
+
identities=[(r.channel,r.frame_id,r.is_extended,r.is_fd) for r,_ in rules]
|
|
142
|
+
if len(set(identities))!=len(identities):
|
|
143
|
+
raise ValueError('不能对同一报文身份声明两个重建规则')
|
|
144
|
+
self._budget=budget; self._held_cost=self._fixed_cost=self._group_cost=self._row_cost=0
|
|
145
|
+
self._closed=False; self.ready=False; self.reader=None; self.input_sort=self.output_sort=None
|
|
146
|
+
self.patchers=[]; self.pending_patcher=None; self.cursor=None
|
|
147
|
+
self.spec=spec; self.interval=interval; self.backend=backend; self.check_cancel=check_cancel
|
|
148
|
+
self._export_metadata=None
|
|
149
|
+
self.trace=trace
|
|
150
|
+
self.input_count=self.generated=self.passthrough=self.skipped=0
|
|
151
|
+
self.grid=0
|
|
152
|
+
self._periods=()
|
|
153
|
+
self._group_period=spec.period_ns
|
|
154
|
+
try:
|
|
155
|
+
_reserve_owned_ram(self,2*1048576+_metadata_bytes(tuple(rule for rule,_ in rules))*16,'_fixed_cost')
|
|
156
|
+
self.reader=iter(records)
|
|
157
|
+
if spec.period_ns is None:
|
|
158
|
+
from ..legacy.dbc_cycles import cycle_time_ns
|
|
159
|
+
self._periods=(tuple(cycle_time_ns(message.cycle_time) for _,message in rules) if periods is None else periods)
|
|
160
|
+
if type(self._periods) is not tuple or len(self._periods)!=len(rules) or any(type(p) is not int or not 0<p<(1<<63) for p in self._periods):
|
|
161
|
+
raise ValueError('DBC逐报文周期与已选规则不符')
|
|
162
|
+
elif periods is not None:
|
|
163
|
+
raise ValueError('固定网格不能再附DBC周期')
|
|
164
|
+
root=Path(work_dir)
|
|
165
|
+
if any(p.casefold()=='refprojects' for p in (*root.parts,*root.resolve().parts)):
|
|
166
|
+
raise ValueError('报文重建不能写RefProjects')
|
|
167
|
+
root.mkdir(parents=True,exist_ok=False)
|
|
168
|
+
self.input_sort=FrameSort(root/'groups',budget,check_cancel=check_cancel,integrity=integrity)
|
|
169
|
+
self.output_sort=FrameSort(root/'timeline',budget,check_cancel=check_cancel,integrity=integrity)
|
|
170
|
+
for rule,message in rules:
|
|
171
|
+
try:
|
|
172
|
+
self.pending_patcher=DBCFramePatch(rule,message,budget)
|
|
173
|
+
except BaseException as error:
|
|
174
|
+
self.pending_patcher=getattr(error,'frame_patch_cleanup_owner',None)
|
|
175
|
+
raise
|
|
176
|
+
self.patchers.append(self.pending_patcher); self.pending_patcher=None
|
|
177
|
+
except BaseException as error:
|
|
178
|
+
# 构造失败也接管尚未赋值成功的真实排序对象。
|
|
179
|
+
if self.input_sort is None:
|
|
180
|
+
self.input_sort=getattr(error,'frame_sort_cleanup_owner',None)
|
|
181
|
+
elif self.output_sort is None:
|
|
182
|
+
self.output_sort=getattr(error,'frame_sort_cleanup_owner',None)
|
|
183
|
+
_cleanup_owner(self,error,'frame_rebuild_cleanup_owner','报文重建构造')
|
|
184
|
+
raise
|
|
185
|
+
|
|
186
|
+
def _cancel(self):
|
|
187
|
+
"""检查已关闭及用户取消。参数: 无。返回: None。异常: 关闭/取消。
|
|
188
|
+
"""
|
|
189
|
+
if self._closed:
|
|
190
|
+
raise ResultClosedError('报文重建已关闭')
|
|
191
|
+
if self.check_cancel is not None:
|
|
192
|
+
self.check_cancel()
|
|
193
|
+
|
|
194
|
+
def _output(self,item,identity=()):
|
|
195
|
+
"""保存真实/生成/未生成结果到时间排序。参数: item和有限身份。返回: None。异常: 排序/配额错。
|
|
196
|
+
"""
|
|
197
|
+
if type(item) is SkippedCANFrame:
|
|
198
|
+
packet={'skip':True,'time_ns':item.time_ns,'reason':item.reason,'details':item.details}
|
|
199
|
+
key=(item.time_ns,2,0,str(identity)); self.skipped+=1
|
|
200
|
+
else:
|
|
201
|
+
packet={'skip':False,'record':_frame_packet(item)}
|
|
202
|
+
key=(item.time_ns,int(item.frame_origin=='generated'),item.sequence,str(identity))
|
|
203
|
+
if item.frame_origin=='generated':
|
|
204
|
+
self.generated+=1
|
|
205
|
+
else:
|
|
206
|
+
self.passthrough+=1
|
|
207
|
+
self.output_sort.append(key,packet)
|
|
208
|
+
|
|
209
|
+
def prepare(self):
|
|
210
|
+
"""单次消费同次样本,按身份重建并封口时间序列。参数: 无。返回: self。异常: 输入/解码事实/排序/预算/取消。
|
|
211
|
+
"""
|
|
212
|
+
self._cancel()
|
|
213
|
+
if self.ready:
|
|
214
|
+
return self
|
|
215
|
+
try:
|
|
216
|
+
last=sequence=None
|
|
217
|
+
for sample in self.reader:
|
|
218
|
+
self._cancel()
|
|
219
|
+
if type(sample) is not FrameSample:
|
|
220
|
+
raise TypeError('报文重建需要同次FrameSample流')
|
|
221
|
+
record=sample.record
|
|
222
|
+
_reserve_owned_ram(self,1048576+_metadata_bytes((sample.values,sample.layout,record.provenance))*32,'_row_cost')
|
|
223
|
+
try:
|
|
224
|
+
if last is not None and (record.time_ns<last or record.sequence<=sequence):
|
|
225
|
+
raise ValueError('原帧时间或原序回退,不能借离线排序掩盖输入错误')
|
|
226
|
+
last=record.time_ns; sequence=record.sequence; self.input_count+=1
|
|
227
|
+
if not self.interval.start_ns<=record.time_ns<self.interval.end_ns:
|
|
228
|
+
continue
|
|
229
|
+
frame=record.frame
|
|
230
|
+
if frame.is_rx is None:
|
|
231
|
+
raise ValueError('原始报文重建需要收发方向is_rx')
|
|
232
|
+
matched=[i for i,p in enumerate(self.patchers) if p.rule.matches(frame)]
|
|
233
|
+
if len(matched)>1:
|
|
234
|
+
raise ValueError('同一实际帧匹配多个重建规则,请收紧帧类型约束')
|
|
235
|
+
rule_index=matched[0] if matched else None
|
|
236
|
+
rebuild=not(frame.is_error_frame or frame.is_remote_frame) and (
|
|
237
|
+
rule_index is not None or not sample.known and self.spec.unknown_policy=='nearest')
|
|
238
|
+
if not rebuild:
|
|
239
|
+
self._output(record); continue
|
|
240
|
+
if rule_index is not None and (not sample.known or frame.dlc!=len(frame.data)
|
|
241
|
+
or len(frame.data)!=self.patchers[rule_index].message.length):
|
|
242
|
+
raise ValueError('已选报文缺真实DBC解码身份或长度异常')
|
|
243
|
+
if rule_index is not None:
|
|
244
|
+
self.patchers[rule_index].accept_frame(frame)
|
|
245
|
+
# 收发方向/实际帧型/通道分组,布局切换留在组内作为明确禁止跨越的边界。
|
|
246
|
+
identity=(rule_index if rule_index is not None else -1,json.dumps(frame.channel),frame.arbitration_id,
|
|
247
|
+
int(frame.is_extended_id),int(frame.is_fd),int(frame.is_rx))
|
|
248
|
+
self.input_sort.append(identity+(record.time_ns,record.sequence),_sample_packet(sample))
|
|
249
|
+
finally:
|
|
250
|
+
_release_owned_ram(self,self._row_cost,'_row_cost')
|
|
251
|
+
self._close_input(); self.input_sort.seal()
|
|
252
|
+
for identity,rows in groupby(self.input_sort.rows(),key=lambda row:row[0][:-2]):
|
|
253
|
+
patcher=self.patchers[identity[0]] if identity[0]>=0 else None
|
|
254
|
+
size=0 if patcher is None else len(patcher.rule.continuous)
|
|
255
|
+
_reserve_owned_ram(self,8*1048576+size*16384,'_group_cost')
|
|
256
|
+
try:
|
|
257
|
+
self._group((_restore_sample(row[2]) for row in rows),patcher,identity)
|
|
258
|
+
finally:
|
|
259
|
+
_release_owned_ram(self,self._group_cost,'_group_cost')
|
|
260
|
+
self.output_sort.seal()
|
|
261
|
+
self._export_metadata={'period_ns':self.spec.period_ns,'origin_ns':self.spec.origin_ns,
|
|
262
|
+
'max_gap_ns':self.spec.max_gap_ns,'unknown_policy':self.spec.unknown_policy,
|
|
263
|
+
'max_distance_ns':self.spec.max_distance_ns,'backend':self.backend,
|
|
264
|
+
'quantization':'nearest_even-v1','quantization_input':'decimal_endpoints_integer_time',
|
|
265
|
+
'range_ns':(self.interval.start_ns,self.interval.end_ns),'input_frames':self.input_count,
|
|
266
|
+
'generated':self.generated,'passthrough':self.passthrough,'skipped':self.skipped,
|
|
267
|
+
'checksum_recomputed':False,'rules':tuple({'channel':p.rule.channel,'frame_id':p.rule.frame_id,
|
|
268
|
+
**({} if p.rule.is_extended is None else {'is_extended':p.rule.is_extended}),
|
|
269
|
+
**({} if p.rule.is_fd is None else {'is_fd':p.rule.is_fd}),
|
|
270
|
+
'continuous':p.rule.continuous,'protected':p.rule.protected,
|
|
271
|
+
'same_time_policy':p.rule.same_time_policy,
|
|
272
|
+
**({'period_ns':self._periods[i]} if self.spec.period_ns is None else {})}
|
|
273
|
+
for i,p in enumerate(self.patchers))}
|
|
274
|
+
if self.spec.period_ns is None:
|
|
275
|
+
del self._export_metadata['period_ns']
|
|
276
|
+
self._export_metadata['period_mode']='dbc'
|
|
277
|
+
self.ready=True
|
|
278
|
+
return self
|
|
279
|
+
except BaseException as error:
|
|
280
|
+
_cleanup_owner(self,error,'frame_rebuild_cleanup_owner','报文重建')
|
|
281
|
+
raise
|
|
282
|
+
|
|
283
|
+
def _group(self,samples,patcher,identity):
|
|
284
|
+
"""保相邻两个同刻组并处理全部网格。参数: 单身份样本流、patcher或None、identity。返回: None。异常: 原重建错。
|
|
285
|
+
"""
|
|
286
|
+
spec=self.spec
|
|
287
|
+
self._group_period=spec.period_ns if spec.period_ns is not None else self._periods[identity[0]]
|
|
288
|
+
period=self._group_period
|
|
289
|
+
self.grid=spec.origin_ns+((self.interval.start_ns-spec.origin_ns+period-1)//period)*period
|
|
290
|
+
left=pending=None; left_bad=pending_bad=False
|
|
291
|
+
for sample in samples:
|
|
292
|
+
self._cancel()
|
|
293
|
+
if pending is not None and sample.record.time_ns==pending.record.time_ns:
|
|
294
|
+
if patcher is not None and patcher.rule.same_time_policy=='last_by_sequence':
|
|
295
|
+
if sample.record.sequence>pending.record.sequence:
|
|
296
|
+
pending=sample
|
|
297
|
+
else:
|
|
298
|
+
pending_bad=pending_bad or _facts(sample)!=_facts(pending)
|
|
299
|
+
continue
|
|
300
|
+
if pending is not None:
|
|
301
|
+
self._segment(left,pending,left_bad,pending_bad,patcher,identity)
|
|
302
|
+
left,left_bad=pending,pending_bad
|
|
303
|
+
pending=sample; pending_bad=False
|
|
304
|
+
if pending is not None:
|
|
305
|
+
self._segment(left,pending,left_bad,pending_bad,patcher,identity)
|
|
306
|
+
self._segment(pending,None,pending_bad,False,patcher,identity)
|
|
307
|
+
|
|
308
|
+
def _reason(self,left,right,left_bad,right_bad,patcher):
|
|
309
|
+
"""确定整个两点间隔是否可插值。参数: 两端及冲突、patcher。返回: 原因或None。异常: 非法DBC布局。
|
|
310
|
+
"""
|
|
311
|
+
if left_bad or right_bad:
|
|
312
|
+
return 'same_time_conflict'
|
|
313
|
+
if left is None:
|
|
314
|
+
return 'missing_left'
|
|
315
|
+
if right is None:
|
|
316
|
+
return 'missing_right'
|
|
317
|
+
if left.layout!=right.layout:
|
|
318
|
+
return 'layout_changed'
|
|
319
|
+
if left.record.output_time_ns-left.record.time_ns!=right.record.output_time_ns-right.record.time_ns:
|
|
320
|
+
return 'time_mapping_changed'
|
|
321
|
+
if not left.valid or not right.valid:
|
|
322
|
+
return 'invalid_neighbor'
|
|
323
|
+
names=patcher.selected(left.layout)
|
|
324
|
+
if not names:
|
|
325
|
+
return 'inactive_layout'
|
|
326
|
+
for sample in (left,right):
|
|
327
|
+
values=dict(sample.values)
|
|
328
|
+
if any(type(values.get(n)) not in (int,float) or not isfinite(values[n]) for n in names):
|
|
329
|
+
return 'invalid_neighbor'
|
|
330
|
+
if right.record.time_ns-left.record.time_ns>self.spec.max_gap_ns:
|
|
331
|
+
return 'gap_too_large'
|
|
332
|
+
return None
|
|
333
|
+
|
|
334
|
+
def _skip(self,time_ns,reason,identity):
|
|
335
|
+
"""记录整个目标帧未生成,不补任一物理字段。参数: time_ns/reason/identity。返回: None。异常: 输出错。
|
|
336
|
+
"""
|
|
337
|
+
self._output(SkippedCANFrame(time_ns,reason,json.dumps({'identity':identity},ensure_ascii=False) if self.trace else ''),identity)
|
|
338
|
+
|
|
339
|
+
def _emit(self,time_ns,base,left,right,patcher,values,identity,mode):
|
|
340
|
+
"""从同一基础帧生成目标并保完整两端引用。参数: 目标/基础/两端、位域器和值、身份/模式。返回: None。异常: 量化/输出错。
|
|
341
|
+
"""
|
|
342
|
+
frame=base.record.frame; quantization=()
|
|
343
|
+
if values is not None:
|
|
344
|
+
# 数组结果是物理估计;离散码值的恰半边界另用原十进制值及整数时间证明。
|
|
345
|
+
# 这是编码舍入,不重算状态、不读取原载荷,也不将参考内核当NumPy实现。
|
|
346
|
+
a=dict(left.values); b=dict(right.values)
|
|
347
|
+
ratio=Fraction(time_ns-left.record.time_ns,right.record.time_ns-left.record.time_ns)
|
|
348
|
+
exact={name:Fraction(str(a[name]))+(Fraction(str(b[name]))-Fraction(str(a[name])))*ratio for name in values}
|
|
349
|
+
frame,quantization=patcher.patch(frame,values,base.layout,exact_values=exact,trace=self.trace)
|
|
350
|
+
output_ns=checked_add_ns(base.record.output_time_ns,time_ns-base.record.time_ns)
|
|
351
|
+
provenance=()
|
|
352
|
+
if self.trace:
|
|
353
|
+
details={'mode':mode,'base_sequence':base.record.sequence,'base_ref':dict(base.record.provenance),
|
|
354
|
+
'left_sequence':None if left is None else left.record.sequence,
|
|
355
|
+
'right_sequence':None if right is None else right.record.sequence,
|
|
356
|
+
'left_ref':None if left is None else dict(left.record.provenance),
|
|
357
|
+
'right_ref':None if right is None else dict(right.record.provenance),
|
|
358
|
+
'layout':base.layout,'quantization_rule':'nearest_even-v1','quantization':quantization,
|
|
359
|
+
'checksum_recomputed':False}
|
|
360
|
+
provenance=(('reconstruction',json.dumps(details,ensure_ascii=False,allow_nan=False,separators=(',',':'))),)
|
|
361
|
+
result=ExportCANFrame(base.record.sequence,time_ns,output_ns,replace(frame,timestamp=output_ns/10**9),provenance,'generated')
|
|
362
|
+
self._output(result,identity)
|
|
363
|
+
|
|
364
|
+
def _nearest(self,time_ns,left,right,left_bad,right_bad,identity):
|
|
365
|
+
"""未知报文整帧最近邻,等距选左且不越最大距离。参数: 时间/两端及冲突/身份。返回: None。异常: 输出错。
|
|
366
|
+
"""
|
|
367
|
+
choices=[s for s,bad in ((left,left_bad),(right,right_bad)) if s is not None and not bad and s.valid]
|
|
368
|
+
if not choices:
|
|
369
|
+
self._skip(time_ns,'same_time_conflict' if left_bad or right_bad else 'no_neighbor',identity); return
|
|
370
|
+
base=min(choices,key=lambda s:(abs(s.record.time_ns-time_ns),s.record.time_ns))
|
|
371
|
+
if abs(base.record.time_ns-time_ns)>self.spec.max_distance_ns:
|
|
372
|
+
self._skip(time_ns,'neighbor_too_far',identity); return
|
|
373
|
+
self._emit(time_ns,base,left,right,None,None,identity,'nearest_frame')
|
|
374
|
+
|
|
375
|
+
def _segment(self,left,right,left_bad,right_bad,patcher,identity):
|
|
376
|
+
"""每块最多256网格点计算连续量,实点另外保原字节。参数: 两端/冲突、patcher、identity。返回: None。异常: 原计算/输出错。
|
|
377
|
+
"""
|
|
378
|
+
stop=self.interval.end_ns if right is None else min(right.record.time_ns,self.interval.end_ns)
|
|
379
|
+
reason=None if patcher is None else self._reason(left,right,left_bad,right_bad,patcher)
|
|
380
|
+
while self.grid<stop:
|
|
381
|
+
self._cancel()
|
|
382
|
+
count=min(256,(stop-self.grid+self._group_period-1)//self._group_period)
|
|
383
|
+
times=tuple(self.grid+i*self._group_period for i in range(count))
|
|
384
|
+
arrays={}
|
|
385
|
+
if patcher is not None and reason is None:
|
|
386
|
+
names=patcher.selected(left.layout); a=dict(left.values); b=dict(right.values)
|
|
387
|
+
function=linear_reference if self.backend=='reference' else linear_numpy
|
|
388
|
+
arrays={n:function(times,left.record.time_ns,right.record.time_ns,a[n],b[n]) for n in names}
|
|
389
|
+
for index,time in enumerate(times):
|
|
390
|
+
if patcher is None:
|
|
391
|
+
self._nearest(time,left,right,left_bad,right_bad,identity)
|
|
392
|
+
elif reason is not None:
|
|
393
|
+
self._skip(time,reason,identity)
|
|
394
|
+
else:
|
|
395
|
+
base=left if time-left.record.time_ns<=right.record.time_ns-time else right
|
|
396
|
+
self._emit(time,base,left,right,patcher,{n:float(values[index]) for n,values in arrays.items()},identity,'linear')
|
|
397
|
+
self.grid+=count*self._group_period
|
|
398
|
+
if right is not None and self.grid==right.record.time_ns and self.grid<self.interval.end_ns:
|
|
399
|
+
if patcher is None:
|
|
400
|
+
self._nearest(self.grid,right,right,right_bad,right_bad,identity)
|
|
401
|
+
elif right_bad:
|
|
402
|
+
self._skip(self.grid,'same_time_conflict',identity)
|
|
403
|
+
else:
|
|
404
|
+
names=patcher.selected(right.layout); values=dict(right.values)
|
|
405
|
+
if not right.valid or not names or any(type(values.get(n)) not in (int,float) or not isfinite(values[n]) for n in names):
|
|
406
|
+
self._skip(self.grid,'invalid_update',identity)
|
|
407
|
+
else:
|
|
408
|
+
self._emit(self.grid,right,right,right,patcher,None,identity,'observed')
|
|
409
|
+
self.grid+=self._group_period
|
|
410
|
+
|
|
411
|
+
def __iter__(self):
|
|
412
|
+
"""准备完成后开放一个时间游标。参数: 无。返回: self。异常: 准备或重复游标错。
|
|
413
|
+
"""
|
|
414
|
+
self.prepare()
|
|
415
|
+
if self.cursor is None:
|
|
416
|
+
self.cursor=self.output_sort.rows()
|
|
417
|
+
return self
|
|
418
|
+
|
|
419
|
+
@property
|
|
420
|
+
def export_metadata(self):
|
|
421
|
+
"""返回本次已完成重建的有限清单事实。参数: 无。返回: dict或None。异常: 无。
|
|
422
|
+
"""
|
|
423
|
+
return self._export_metadata
|
|
424
|
+
|
|
425
|
+
def __next__(self):
|
|
426
|
+
"""恢复下一生成/透传帧或缺失说明。参数: 无。返回: ExportCANFrame/SkippedCANFrame。异常: EOF/校验错。
|
|
427
|
+
"""
|
|
428
|
+
if self.cursor is None:
|
|
429
|
+
iter(self)
|
|
430
|
+
self._cancel(); packet=next(self.cursor)[2]
|
|
431
|
+
if packet['skip']:
|
|
432
|
+
return SkippedCANFrame(packet['time_ns'],packet['reason'],packet['details'])
|
|
433
|
+
return _restore_frame(packet['record'])
|
|
434
|
+
|
|
435
|
+
def _close_input(self):
|
|
436
|
+
"""真正关闭源样本游标。参数: 无。返回: None。异常: 原关闭错保责任。
|
|
437
|
+
"""
|
|
438
|
+
if self.reader is not None:
|
|
439
|
+
close=getattr(self.reader,'close',None)
|
|
440
|
+
if close is not None:
|
|
441
|
+
close()
|
|
442
|
+
self.reader=None
|
|
443
|
+
|
|
444
|
+
def close(self):
|
|
445
|
+
"""关闭真实所有权后释放费用,保诊断暂存。参数: 无。返回: None。异常: 原关闭/释放错可重试。
|
|
446
|
+
"""
|
|
447
|
+
if self._closed:
|
|
448
|
+
return
|
|
449
|
+
self._close_input()
|
|
450
|
+
if self.cursor is not None:
|
|
451
|
+
self.cursor.close(); self.cursor=None
|
|
452
|
+
for owner in (self.input_sort,self.output_sort,self.pending_patcher,*self.patchers):
|
|
453
|
+
if owner is not None:
|
|
454
|
+
owner.close()
|
|
455
|
+
self.patchers.clear(); self.pending_patcher=None
|
|
456
|
+
_release_owned_ram(self,self._row_cost,'_row_cost')
|
|
457
|
+
_release_owned_ram(self,self._group_cost,'_group_cost')
|
|
458
|
+
_release_owned_ram(self,self._fixed_cost,'_fixed_cost'); self._closed=True
|