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,608 @@
|
|
|
1
|
+
"""读取明确格式的已解码CSV或TSV信号表,逐批传送归一化信号。
|
|
2
|
+
|
|
3
|
+
输入是SignalCSVSpec和显式SignalDefinition。构造与describe只检查声明;
|
|
4
|
+
实际迭代时才按paths原顺序打开文件,检查表头、列数和来源内时间顺序。
|
|
5
|
+
每行每个请求列都是一次观测,缺失文本转None并覆盖旧值,区别于旧Filter
|
|
6
|
+
工件中空白表示未更新的政策。数字先保留精确整数,再由选定后端归一化。
|
|
7
|
+
|
|
8
|
+
输出SignalBatch保留文件、物理行、原文本和时间量化诊断。
|
|
9
|
+
batch_rows限制全部列的样本总数;同时间组允许跨文件或跨批,只有更晚
|
|
10
|
+
原行或整个来源结束才确认进度。全部paths耗尽才报告source_eof。
|
|
11
|
+
请求分析域不用于裁剪原行,开始前的更新仍保留。
|
|
12
|
+
|
|
13
|
+
本实例管理活动生成器和文件句柄。正常耗尽、读取错误和显式close均尝试
|
|
14
|
+
释放资源,清理失败保留读取根因。本模块不调用旧CAN解码,也不重排文件。
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
# 只使用标准CSV解析,不自动嗅探原始报文格式。
|
|
18
|
+
import csv
|
|
19
|
+
# 显式类型联合与迭代接口说明资源生命周期。
|
|
20
|
+
from collections.abc import Iterator
|
|
21
|
+
# Decimal避免整型文本先经过float而失真。
|
|
22
|
+
from decimal import Decimal, InvalidOperation
|
|
23
|
+
# sys.exception提供当前根因用于清理,不使用frame反射。
|
|
24
|
+
import sys
|
|
25
|
+
# 文件句柄类型不是无类型object占位。
|
|
26
|
+
from typing import TextIO
|
|
27
|
+
# 明确的转换定义属于解码之后的分析层。
|
|
28
|
+
from ..core.binding import SignalDefinition
|
|
29
|
+
# Bool/Enum有不同文本政策,不能Python truthiness。
|
|
30
|
+
from ..core.types import SignalDType
|
|
31
|
+
from ..core.models import SourceRef
|
|
32
|
+
# 当前会话和来源名是安全标识。
|
|
33
|
+
from ..core.validation import require_identifier
|
|
34
|
+
# 时间字符串统一精确转换并保留量化,offset另显式施加。
|
|
35
|
+
from ..timebase.conversion import checked_add_ns, convert_time, parse_datetime_ns
|
|
36
|
+
# 来源声明与样本CSV位置是实际公开类型。
|
|
37
|
+
from .csv_spec import CSVSourceRef, SignalCSVSpec
|
|
38
|
+
# 与memory使用相同字段/转换描述,不复制不同政策。
|
|
39
|
+
from .descriptions import describe_fields, source_timebase_identity
|
|
40
|
+
# 来源批次/请求与能力严格有类型。
|
|
41
|
+
from .models import ReadRequest, SignalBatch, SourceCapabilities, SourceDescription
|
|
42
|
+
# 每个有限批次实际调用独立数值后端。
|
|
43
|
+
from .packing import pack_decoded
|
|
44
|
+
# 跨批协议和根因/关闭错误由公共层定义。
|
|
45
|
+
from .protocol import BatchValidator, SourceClosedError, SourceReadError
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def choice_text(value: int | bool | str) -> str:
|
|
49
|
+
"""生成声明编码对应的CSV文本,区分布尔与整数。
|
|
50
|
+
|
|
51
|
+
参数:
|
|
52
|
+
value (int | bool | str): SignalDefinition已检查的原编码。
|
|
53
|
+
返回:
|
|
54
|
+
str。布尔使用'true'或'false',整数使用十进制文本,字符串保持原样。
|
|
55
|
+
异常:
|
|
56
|
+
无主动异常;调用者须先保证原编码属于允许类型。
|
|
57
|
+
"""
|
|
58
|
+
# 布尔文本使用明确小写协议,不使用任意非空字符串真值。
|
|
59
|
+
if type(value) is bool:
|
|
60
|
+
# 不把true写成整数1,编码域保持可区分。
|
|
61
|
+
return 'true' if value else 'false'
|
|
62
|
+
# 已声明整数或字符串按明确文本形式输出,不猜进制。
|
|
63
|
+
return str(value)
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
class SignalCSVSourceAdapter:
|
|
67
|
+
"""按文件声明顺序读取已解码表,每次请求独立保存进度。
|
|
68
|
+
|
|
69
|
+
spec固定格式和路径,session_id确定会话,signals与backend决定列转换。
|
|
70
|
+
choices保存声明原编码的文本映射,不缓存随时间变化的值或DBC消息绑定。
|
|
71
|
+
closed、active和handles分别记录关闭标记、活动请求及文件句柄。
|
|
72
|
+
close后拒绝描述和读取。可重复扫描只表示新CSV能再次打开,不授权增加旧链扫描。
|
|
73
|
+
"""
|
|
74
|
+
|
|
75
|
+
def __init__(self, spec: SignalCSVSpec, session_id: str, signals: tuple[SignalDefinition, ...], *, backend: str = 'numpy', clock_only=(), retain_original=True) -> None:
|
|
76
|
+
"""检查来源绑定和声明编码的文本歧义,不读取实际表头。
|
|
77
|
+
|
|
78
|
+
参数:
|
|
79
|
+
spec (SignalCSVSpec): 已检查的表格格式、时钟和有序路径声明。
|
|
80
|
+
session_id (str): 本来源所属的会话名称。
|
|
81
|
+
signals (tuple[SignalDefinition, ...]): 当前来源的定义,输出别名须唯一。
|
|
82
|
+
backend (str): 默认'numpy';也接受'reference',不自动回退。
|
|
83
|
+
clock_only: 只取更新时间的别名,其单元格不作数值解析。
|
|
84
|
+
retain_original: 默认True保留旧逐行引用;False只使用每列共用身份,不构造原文副本。
|
|
85
|
+
返回:
|
|
86
|
+
None。保存输入和编码映射,初始化活动资源集合。
|
|
87
|
+
异常:
|
|
88
|
+
TypeError: 配置、信号容器或后端类型不合法。
|
|
89
|
+
ValueError: 会话、信号归属、别名冲突,或原码文本与缺失标记有歧义。
|
|
90
|
+
副作用:
|
|
91
|
+
不打开文件;实际字段是否存在在迭代读取时核实。
|
|
92
|
+
"""
|
|
93
|
+
# 原始报文CSV不能只有后缀就自动接到此接口。
|
|
94
|
+
if not isinstance(spec, SignalCSVSpec) or not isinstance(signals, tuple) or backend not in ('reference', 'numpy'):
|
|
95
|
+
# 所有输入都先显式解析,未知后端拒绝。
|
|
96
|
+
raise TypeError('signal_csv需要typed spec/signals和明确backend')
|
|
97
|
+
# 会话身份不从文件名或旧缓存继承。
|
|
98
|
+
require_identifier(session_id, 'csv.session_id')
|
|
99
|
+
# 当前来源全部定义必须唯一,其他来源不能借用表列。
|
|
100
|
+
if any(not isinstance(item, SignalDefinition) or item.source != spec.name for item in signals) or len({item.name for item in signals}) != len(signals):
|
|
101
|
+
# 不能取第一个名称冲突或静默跳过他源定义。
|
|
102
|
+
raise ValueError(f'{spec.name}:CSV绑定来源/别名冲突')
|
|
103
|
+
if type(retain_original) is not bool or not set(clock_only)<={item.name for item in signals}:
|
|
104
|
+
raise ValueError('纯时钟字段必须是当前投影,原值保留需要bool')
|
|
105
|
+
self._clock_only,self._retain_original=frozenset(clock_only),retain_original
|
|
106
|
+
self._compact_refs={item.name:SourceRef(session_id,spec.name,item.field) for item in signals} if not retain_original else {}
|
|
107
|
+
# 静态choices文本表只映射已解码值,不涉及DBC消息绑定缓存。
|
|
108
|
+
choices = {}
|
|
109
|
+
# 每个声明编码保持原类型,不对每行重新猜业务标签。
|
|
110
|
+
for definition in signals:
|
|
111
|
+
if definition.name in self._clock_only:
|
|
112
|
+
choices[definition.name]={}
|
|
113
|
+
continue
|
|
114
|
+
# 输入文本必须能唯一对应声明原码。
|
|
115
|
+
pairs = tuple((choice_text(code), code) for code, _ in definition.choices)
|
|
116
|
+
# int1与str1在CSV中不可区分,不能自动挑第一个。
|
|
117
|
+
if len({text for text, _ in pairs}) != len(pairs) or any(text in spec.missing_values for text, _ in pairs):
|
|
118
|
+
# 也不能同时把一个文本声明为正常码和缺失标识。
|
|
119
|
+
raise ValueError(f'{spec.name}:{definition.name}:CSV choices文本歧义/缺失冲突')
|
|
120
|
+
# 保存配置解析结果,不共享任何随时间变化的信号值。
|
|
121
|
+
choices[definition.name] = dict(pairs)
|
|
122
|
+
# 已解析输入与当前后端明确固定。
|
|
123
|
+
self.spec, self.session_id, self.signals, self.backend, self.choices = spec, session_id, signals, backend, choices
|
|
124
|
+
# 当前生命周期与活跃资源只属于本实例。
|
|
125
|
+
self.closed, self.active, self.handles = False, set(), set()
|
|
126
|
+
|
|
127
|
+
def _ensure_open(self) -> None:
|
|
128
|
+
"""拒绝关闭后操作,重复close本身仍安全。
|
|
129
|
+
|
|
130
|
+
参数: 无;读取closed。
|
|
131
|
+
返回: None;开放时无副作用。
|
|
132
|
+
异常: SourceClosedError包含当前来源名。
|
|
133
|
+
"""
|
|
134
|
+
# 不能在close后自动重新打开输入延续任务。
|
|
135
|
+
if self.closed:
|
|
136
|
+
# 同步入口直接报告,而不是等下次next。
|
|
137
|
+
raise SourceClosedError(f'{self.spec.name}:source已关闭')
|
|
138
|
+
|
|
139
|
+
def describe(self) -> SourceDescription:
|
|
140
|
+
"""返回CSV配置描述,保留尚未读取的表头和观测范围状态。
|
|
141
|
+
|
|
142
|
+
参数:
|
|
143
|
+
无。读取spec和signals,不打开文件或查询文件状态。
|
|
144
|
+
返回:
|
|
145
|
+
SourceDescription。定位保存有序路径、时间列、单位、偏移和时区,
|
|
146
|
+
观测端点均为None,metadata_status为'declared'。
|
|
147
|
+
异常:
|
|
148
|
+
SourceClosedError: 本实例已经关闭。
|
|
149
|
+
TypeError或ValueError: 字段元数据或描述模型结构错误。
|
|
150
|
+
"""
|
|
151
|
+
# 静态查询遵守已关闭状态。
|
|
152
|
+
self._ensure_open()
|
|
153
|
+
# 来源原定位包括有序文件列表,不能从目标列首末伪造范围。
|
|
154
|
+
fields = describe_fields(self.spec.name, self.signals, {'paths': tuple(str(path) for path in self.spec.paths), 'time_column': self.spec.time_column,
|
|
155
|
+
'time_unit': self.spec.unit, 'offset_ns': self.spec.offset_ns,
|
|
156
|
+
'source_timebase_sha256': source_timebase_identity(self.spec.timebase, self.spec.offset_ns),
|
|
157
|
+
'encoding': self.spec.encoding, 'delimiter': self.spec.delimiter, 'missing_values': self.spec.missing_values,
|
|
158
|
+
'timezone': None if self.spec.timezone is None else str(self.spec.timezone)})
|
|
159
|
+
# 正常/错误行诊断来自本parser,raw报文能力明确不支持。
|
|
160
|
+
return SourceDescription(self.spec.name, fields, self.spec.timebase.timebase_id, None, None,
|
|
161
|
+
SourceCapabilities(True, False, True, False, ('CSV文件/物理行/原文本/时间量化',),
|
|
162
|
+
('未读取前表头/观测范围仅声明', 'signal_csv缺失标记为明确MISSING,不用于旧filter未更新工件')), metadata_status='declared')
|
|
163
|
+
|
|
164
|
+
def iter_batches(self, request: ReadRequest) -> Iterator[SignalBatch]:
|
|
165
|
+
"""创建读取请求生成器,第一次迭代时才打开文件。
|
|
166
|
+
|
|
167
|
+
参数:
|
|
168
|
+
request (ReadRequest): 当前会话、投影别名、分析范围及总样本上限。
|
|
169
|
+
返回:
|
|
170
|
+
Iterator[SignalBatch]。保留前置更新;所有文件耗尽后最后一批报告来源结束。
|
|
171
|
+
异常:
|
|
172
|
+
SourceClosedError: 实例已经关闭。
|
|
173
|
+
ValueError: 请求类型、会话或投影别名错误。
|
|
174
|
+
SourceReadError: 实际迭代时失败,附来源、文件、物理行及原异常链。
|
|
175
|
+
副作用:
|
|
176
|
+
登记活动请求;创建迭代器本身不读取表头。
|
|
177
|
+
"""
|
|
178
|
+
# 默认不采集首端事实;委托仍执行原同步验证、批次和清理,预算入口不变。
|
|
179
|
+
return self._request_batches(request)
|
|
180
|
+
|
|
181
|
+
def _request_batches(self, request: ReadRequest, observation_sink=None, resource_sink=None) -> Iterator[SignalBatch]:
|
|
182
|
+
"""创建独立原请求,可选向执行层传递首次扫描的最终观测候选。
|
|
183
|
+
|
|
184
|
+
参数: request为原ReadRequest;observation_sink默认None,不增加默认采集;
|
|
185
|
+
非None时为执行层本次读取owner,负责独立资源及最终候选的接收。
|
|
186
|
+
resource_sink默认None,仅为默认预算请求接住生成器和真实清理责任,不采集观测。
|
|
187
|
+
返回: 原SignalBatch生成器;构造只验证并登记,不打开CSV。
|
|
188
|
+
异常: 原SourceClosedError、配置和后续SourceReadError保持;可选sink原错传播。
|
|
189
|
+
副作用: 仅登记当前生成器,其他请求及默认预算协议保持。
|
|
190
|
+
"""
|
|
191
|
+
# 生命周期在同步调用边界验证,不隐藏延迟失败。
|
|
192
|
+
self._ensure_open()
|
|
193
|
+
# 本实例只接受ReadRequest,且请求会话必须与构造时一致。
|
|
194
|
+
if not isinstance(request, ReadRequest) or request.session_id != self.session_id:
|
|
195
|
+
# 相同时间数值也不证明会话身份相同。
|
|
196
|
+
raise ValueError(f'{self.spec.name}:CSV请求会话错误')
|
|
197
|
+
# 在打开文件之前拒绝未知请求列。
|
|
198
|
+
validator = BatchValidator(self.describe(), request)
|
|
199
|
+
# wrapper负责清理活动登记,不通过反射查找generator。
|
|
200
|
+
def iterate() -> Iterator[SignalBatch]:
|
|
201
|
+
"""转发本次请求,并在任意退出路径移除活动登记。
|
|
202
|
+
|
|
203
|
+
参数:
|
|
204
|
+
无。闭包保存当前request、validator及iterator。
|
|
205
|
+
返回:
|
|
206
|
+
每次产生内部读取器提供的SignalBatch,不重复读取或改动进度。
|
|
207
|
+
异常:
|
|
208
|
+
原读取错误传播;finally只移除本请求的登记。
|
|
209
|
+
"""
|
|
210
|
+
# 异常、EOF和generator.close共用生命周期。
|
|
211
|
+
try:
|
|
212
|
+
# 保持私有源实际顺序与watermark。
|
|
213
|
+
if observation_sink is None and resource_sink is None:
|
|
214
|
+
yield from self._iterate(request, validator)
|
|
215
|
+
elif observation_sink is None:
|
|
216
|
+
yield from self._iterate(request, validator, resource_sink=resource_sink)
|
|
217
|
+
else:
|
|
218
|
+
yield from self._iterate(request, validator, observation_sink=observation_sink)
|
|
219
|
+
finally:
|
|
220
|
+
# 移除本请求,其他活动请求不受影响。
|
|
221
|
+
self.active.discard(iterator)
|
|
222
|
+
# 私有来源是真正惰性,不在创建请求时读取表头。
|
|
223
|
+
iterator = iterate()
|
|
224
|
+
# 可选owner先接住实际未返回生成器,active登记前后失败仍可关闭同一对象。
|
|
225
|
+
if observation_sink is not None:
|
|
226
|
+
observation_sink._created_iterator(iterator)
|
|
227
|
+
elif resource_sink is not None:
|
|
228
|
+
resource_sink._created_iterator(iterator)
|
|
229
|
+
# close可统一中止已经启动或尚未启动的请求。
|
|
230
|
+
self.active.add(iterator)
|
|
231
|
+
# 交付有实际文件接线的公开迭代器。
|
|
232
|
+
return iterator
|
|
233
|
+
|
|
234
|
+
def _parse_value(self, text: str, definition: SignalDefinition) -> int | float | bool | str | None:
|
|
235
|
+
"""按缺失标记、原编码和逻辑类型解释单元格文本。
|
|
236
|
+
|
|
237
|
+
参数:
|
|
238
|
+
text (str): 原单元格文本,缺失标记精确匹配,不先去除空白。
|
|
239
|
+
definition (SignalDefinition): 当前字段的目标类型与显式转换声明。
|
|
240
|
+
返回:
|
|
241
|
+
int、float、bool、str或None。缺失为None;数学整数先精确转int,
|
|
242
|
+
其他数值用float表示;未声明的字符串编码可交后续归一化层判无效。
|
|
243
|
+
异常:
|
|
244
|
+
ValueError: 布尔文本不合法、数值语法错误、解析资源超限、
|
|
245
|
+
整型转换前小数无法精确表示,或非零小数解析下溢。
|
|
246
|
+
边界:
|
|
247
|
+
非有限数值留给质量检查,不伪装成0。文本和整数展开分别限制4096字符或位。
|
|
248
|
+
本函数只解析原值,不提前做工程缩放或有效期保持。
|
|
249
|
+
"""
|
|
250
|
+
# 缺失精确匹配原cell,不strip文本扩大标记范围。
|
|
251
|
+
if text in self.spec.missing_values:
|
|
252
|
+
# 该行明确缺失观测会覆盖旧值,不同于无字段更新。
|
|
253
|
+
return None
|
|
254
|
+
# choices先按明确文本映射原码,随后数值核按原类型映射逻辑值。
|
|
255
|
+
if text in self.choices[definition.name]:
|
|
256
|
+
# 不在此提前做工程缩放或映射到目标标签。
|
|
257
|
+
return self.choices[definition.name][text]
|
|
258
|
+
# 未配置choices的bool只接受明确true/false协议。
|
|
259
|
+
if definition.dtype is SignalDType.BOOL and not definition.choices:
|
|
260
|
+
# 非空字符串和整数1不能靠truthiness变正常True。
|
|
261
|
+
if text not in ('true', 'false'):
|
|
262
|
+
# 任意其他布尔编码必须显式choices。
|
|
263
|
+
raise ValueError(f'{definition.name}:bool文本须为true/false或显式choices')
|
|
264
|
+
# 两个已声明文本保留真正False,不当缺失。
|
|
265
|
+
return text == 'true'
|
|
266
|
+
# 字符串原码的enum/布尔不把未声明文本猜成数值编码。
|
|
267
|
+
if definition.dtype in (SignalDType.ENUM, SignalDType.BOOL) and any(type(code) is str for code, _ in definition.choices):
|
|
268
|
+
# 原文本交给normalize产生OUT_OF_RANGE,而不是自动选首标签。
|
|
269
|
+
return text
|
|
270
|
+
# 有限文本长度限制解析本身,长输入不能构造无界整数。
|
|
271
|
+
if len(text) > 4096:
|
|
272
|
+
# 4096字符上限用于约束数值解析资源,与信号业务阈值无关。
|
|
273
|
+
raise ValueError(f'{definition.name}:数值文本超过4096字符解析限额')
|
|
274
|
+
# Decimal保留整型有效位;无穷/NaN作为无效观测原值后续诊断。
|
|
275
|
+
try:
|
|
276
|
+
# 文本转换不经过float秒或先损失大整数位值。
|
|
277
|
+
number = Decimal(text)
|
|
278
|
+
except InvalidOperation as error:
|
|
279
|
+
# 错误列语法带别名,外层增加文件/物理行。
|
|
280
|
+
raise ValueError(f'{definition.name}:非法数值文本') from error
|
|
281
|
+
# 非有限值不是正常0,由质量核明确NONFINITE。
|
|
282
|
+
if not number.is_finite():
|
|
283
|
+
# 原CSV cell仍在CSVSourceRef保存,诊断不能丢原文。
|
|
284
|
+
return float(number)
|
|
285
|
+
# 数学整数不先转float,含.0/指数的完整整数同样精确。
|
|
286
|
+
if number == number.to_integral_value():
|
|
287
|
+
# 极大指数不能导致无界int分配。
|
|
288
|
+
if number and number.adjusted() >= 4096:
|
|
289
|
+
# 超解析资源直接失败,不生成wrap后的正常样本。
|
|
290
|
+
raise ValueError(f'{definition.name}:整数展开超过4096位解析限额')
|
|
291
|
+
# 原输入是否超64位由独立归一化核附OVERFLOW。
|
|
292
|
+
return int(number)
|
|
293
|
+
# 声明float64的小数按正常binary64表示,原文本定位保留。
|
|
294
|
+
result = float(number)
|
|
295
|
+
# 整型目标仍可显式转换精确小数(如0.5*2),但不可先损失原输入。
|
|
296
|
+
if definition.dtype in (SignalDType.INT64, SignalDType.UINT64) and Decimal.from_float(result) != number:
|
|
297
|
+
# 防止大整数加小数先舍成另一整数后被误标valid。
|
|
298
|
+
raise ValueError(f'{definition.name}:整型转换前小数不能被float64精确表示')
|
|
299
|
+
# 非零小数不可因float下溢变成有效零。
|
|
300
|
+
if result == 0 and number:
|
|
301
|
+
# 不默默补0或放宽normalizer契约。
|
|
302
|
+
raise ValueError(f'{definition.name}:float64解析下溢,不能当有效0')
|
|
303
|
+
# 后续有限性/类型/范围/转换由当前显式归一化政策统一处理。
|
|
304
|
+
return result
|
|
305
|
+
|
|
306
|
+
def _close_handle(self, handle: TextIO, primary: BaseException | None) -> None:
|
|
307
|
+
"""关闭一个已登记句柄,保留读取根因和清理失败证据。
|
|
308
|
+
|
|
309
|
+
参数:
|
|
310
|
+
handle (TextIO): 本实例打开的文件句柄。
|
|
311
|
+
primary (BaseException | None): 已有读取根因;没有时为None。
|
|
312
|
+
返回:
|
|
313
|
+
None。无论关闭成功与否都移除本句柄登记,不删除文件。
|
|
314
|
+
异常:
|
|
315
|
+
关闭错误: 没有根因或primary为GeneratorExit时原样传播;
|
|
316
|
+
已有读取根因时添加附注,保留最初异常。
|
|
317
|
+
"""
|
|
318
|
+
# 关闭动作必须执行,不能仅移除登记。
|
|
319
|
+
try:
|
|
320
|
+
# TextIO关闭也可能失败,不能声明已成功完成。
|
|
321
|
+
handle.close()
|
|
322
|
+
except Exception as cleanup:
|
|
323
|
+
# generator正常中止不是业务根因,关闭失败仍应报告。
|
|
324
|
+
if primary is None or isinstance(primary, GeneratorExit):
|
|
325
|
+
# 外层包装来源信息,不能吞掉正常关闭错误。
|
|
326
|
+
raise
|
|
327
|
+
# 错误链保留最初解析/读取异常,附加清理证据。
|
|
328
|
+
primary.add_note(f'{self.spec.name}:文件关闭同时失败:{cleanup}')
|
|
329
|
+
finally:
|
|
330
|
+
# 即使关闭报错也不让实例无界保留引用。
|
|
331
|
+
self.handles.discard(handle)
|
|
332
|
+
|
|
333
|
+
def _read_resources(self, request: ReadRequest):
|
|
334
|
+
"""为执行层封装提供独立请求的内部资源检查入口。
|
|
335
|
+
|
|
336
|
+
参数: request为当前已校验请求。返回: 默认None,直接CSV入口行为不变。
|
|
337
|
+
异常: 执行层子类可在申请预算失败时抛错;不涉及旧报文reader或DBC。
|
|
338
|
+
"""
|
|
339
|
+
# 原独立入口不默认创建预算或读取文件;执行层只在子类启用检查。
|
|
340
|
+
return None
|
|
341
|
+
|
|
342
|
+
def _iterate(self, request: ReadRequest, validator: BatchValidator, observation_sink=None, resource_sink=None) -> Iterator[SignalBatch]:
|
|
343
|
+
"""按原文件顺序逐行读取,保持跨文件的时间组和原行序号。
|
|
344
|
+
|
|
345
|
+
参数:
|
|
346
|
+
request (ReadRequest): 当前投影和有限批次样本上限。
|
|
347
|
+
validator (BatchValidator): 本次请求独立的跨批协议检查状态。
|
|
348
|
+
observation_sink: 默认None;执行层可选的本次独立观测接收者,不逐行回调。
|
|
349
|
+
resource_sink: 默认None;只接默认预算请求的资源,不改变first或最终观测候选。
|
|
350
|
+
返回:
|
|
351
|
+
每次产生SignalBatch。最后一批可为空,且source_eof为True。
|
|
352
|
+
异常:
|
|
353
|
+
SourceReadError: 文件、表头、行、时间、数值或协议校验失败;
|
|
354
|
+
保存来源、路径、记录结束物理行及原异常链,清理错误不覆盖根因。
|
|
355
|
+
处理流程:
|
|
356
|
+
每个文件打开后验证表头,按请求列解析原值并记录逐样本位置。
|
|
357
|
+
缓冲满时先发布已有样本;更晚原行证明上一组完整。
|
|
358
|
+
单文件结束不重置时间、序号或缓冲;所有文件结束后确认最后时间组。
|
|
359
|
+
退出时关闭句柄和清空缓冲,不修改已经返回的数组。
|
|
360
|
+
"""
|
|
361
|
+
# 显式投影保持请求顺序,分析层列选择不改变旧路径。
|
|
362
|
+
selected = tuple(next(item for item in self.signals if item.name == name) for name in request.signal_names)
|
|
363
|
+
# 有限pending包含记录与逐样本物理位置,不存全文件rows。
|
|
364
|
+
pending, count, previous, watermark, sequence = {}, 0, None, None, 0
|
|
365
|
+
# 只有可选采集保存首端;末端和原时间行数复用原previous、sequence,不看投影样本。
|
|
366
|
+
first = None
|
|
367
|
+
# 路径/行号即使open失败也有可读位置。
|
|
368
|
+
path, line, reader, resources = self.spec.paths[0], 0, None, None
|
|
369
|
+
# 读取/转换错误统一带当前真实来源位置。
|
|
370
|
+
try:
|
|
371
|
+
# 检查器在文件打开前申请固定读取/协议开销;每个请求独立关闭。
|
|
372
|
+
if observation_sink is not None:
|
|
373
|
+
resources = observation_sink._read_resources()
|
|
374
|
+
elif resource_sink is not None:
|
|
375
|
+
resources = resource_sink._read_resources()
|
|
376
|
+
else:
|
|
377
|
+
resources = self._read_resources(request)
|
|
378
|
+
# 配置paths原序,不能排序、预读或重排文件。
|
|
379
|
+
for path in self.spec.paths:
|
|
380
|
+
# 新文件即使open失败,也不沿用前一个文件的错误行号。
|
|
381
|
+
line, reader = 0, None
|
|
382
|
+
# 关闭之后不能开始下一文件。
|
|
383
|
+
self._ensure_open()
|
|
384
|
+
# newline空串由csv解释换行,编码显式,只读输入。
|
|
385
|
+
handle = path.open('r', encoding=self.spec.encoding, newline='')
|
|
386
|
+
# 可选owner在活动set登记前接住真实句柄,登记取消也有恢复责任。
|
|
387
|
+
if observation_sink is not None:
|
|
388
|
+
observation_sink._opened_handle(handle)
|
|
389
|
+
elif resource_sink is not None:
|
|
390
|
+
resource_sink._opened_handle(handle)
|
|
391
|
+
# 活跃句柄在close/cancellation时可追踪。
|
|
392
|
+
self.handles.add(handle)
|
|
393
|
+
# 单文件生命周期不重置协议时钟/sequence/pending。
|
|
394
|
+
try:
|
|
395
|
+
# strict拒绝损坏引号,原表头文本完整保留。
|
|
396
|
+
reader = csv.reader(handle if resources is None else resources.lines(handle), delimiter=self.spec.delimiter, strict=True)
|
|
397
|
+
# 预算包装只控制原reader的next,不替换CSV解释或记录物理行计数。
|
|
398
|
+
records = reader if resources is None else resources.records(reader)
|
|
399
|
+
# 空文件无表头不能证明声明字段,header-only表合法。
|
|
400
|
+
header = next(records, None)
|
|
401
|
+
# 最新物理行用于错误定位与引用。
|
|
402
|
+
line = reader.line_num
|
|
403
|
+
# 表头列名须非空且唯一,必须包含时间列和全部已声明字段,即使其中部分未请求。
|
|
404
|
+
if header is None or any(not name.strip() for name in header) or len(set(header)) != len(header) or self.spec.time_column not in header or any(item.field not in header for item in self.signals):
|
|
405
|
+
# 不凭字段下标猜含义或把缺列当全UNKNOWN。
|
|
406
|
+
raise ValueError('CSV表头缺失/重名/声明字段无法定位')
|
|
407
|
+
# 静态列索引只作用已解码表,不是DBC绑定缓存。
|
|
408
|
+
indexes = {name: position for position, name in enumerate(header)}
|
|
409
|
+
# 每文件实际逐行读取,没有第二次输入扫描。
|
|
410
|
+
for cells in records:
|
|
411
|
+
# 保存记录结束的物理行号,使引号内多行记录仍可追溯。
|
|
412
|
+
line = reader.line_num
|
|
413
|
+
# 空物理行没有时间观测,不伪造新样本。
|
|
414
|
+
if not cells:
|
|
415
|
+
# 不reset前一状态或whole-source进度。
|
|
416
|
+
continue
|
|
417
|
+
# 错列数和短行不能隐式用None/额外键补齐。
|
|
418
|
+
if len(cells) != len(header):
|
|
419
|
+
# 原cell错误明确报当前文件/行。
|
|
420
|
+
raise ValueError('CSV行列数与表头不同')
|
|
421
|
+
# 关闭可中止当前源,不继续读取后续数据。
|
|
422
|
+
self._ensure_open()
|
|
423
|
+
# 时间先精确转换,Date必须明确offset或source_timezone。
|
|
424
|
+
time_text = cells[indexes[self.spec.time_column]]
|
|
425
|
+
# 只有明确absolute ISO单位使用日期解析。
|
|
426
|
+
conversion = parse_datetime_ns(time_text, self.spec.timezone) if self.spec.unit == 'ISO8601' else convert_time(time_text, self.spec.unit)
|
|
427
|
+
# 固定offset在整数ns域安全施加,不推断同步。
|
|
428
|
+
time = checked_add_ns(conversion.time_ns, self.spec.offset_ns)
|
|
429
|
+
# 跨文件回退也拒绝,不重排旧输入以掩盖错误。
|
|
430
|
+
if previous is not None and time < previous:
|
|
431
|
+
# 单文件EOF不能允许时间重置。
|
|
432
|
+
raise ValueError('来源时间回退(含连续文件边界)')
|
|
433
|
+
# 必须经过转换、offset和顺序检查,空投影与缺失值原行仍算观测。
|
|
434
|
+
if first is None and (observation_sink is not None or
|
|
435
|
+
resource_sink is not None and resource_sink.observe_bounds):
|
|
436
|
+
first = time
|
|
437
|
+
if resource_sink is not None:
|
|
438
|
+
resource_sink.observed_start=time
|
|
439
|
+
# 下一真实时间更晚才完整越过上一组。
|
|
440
|
+
if previous is not None and time > previous:
|
|
441
|
+
# 观测事实与进度保证分开保存。
|
|
442
|
+
watermark = previous
|
|
443
|
+
# 每请求列在该行是实际观测,缺失标记也传MISSING更新。
|
|
444
|
+
for definition in selected:
|
|
445
|
+
# 先发布已满有限缓冲,不让同时间超大组绕限额。
|
|
446
|
+
if count == request.batch_rows:
|
|
447
|
+
# 数组/字符串定宽提升和协议集合副本必须在分配之前预留。
|
|
448
|
+
if resources is not None:
|
|
449
|
+
resources.before_pack(pending, validator)
|
|
450
|
+
# 当前组未完整时watermark仍留在上一组。
|
|
451
|
+
batch = self._make_batch(pending, watermark, False, None)
|
|
452
|
+
# 跨批结构/身份/承诺验证后才交付。
|
|
453
|
+
validator.accept(batch)
|
|
454
|
+
# 校验成功后转为当前owned数组和当前组身份的持有预算。
|
|
455
|
+
if resources is not None:
|
|
456
|
+
resources.after_pack(validator)
|
|
457
|
+
# 返回owned列,下一缓冲与当前批断开。
|
|
458
|
+
yield batch
|
|
459
|
+
# 只释放传输原记录,不reset持续/进度状态。
|
|
460
|
+
pending, count = {}, 0
|
|
461
|
+
# yield恢复后才释放原缓冲;交接时当前数组仍由检查器持有。
|
|
462
|
+
if resources is not None:
|
|
463
|
+
resources.clear_pending()
|
|
464
|
+
# 解析只作用于明确投影,不额外解码CAN信号。
|
|
465
|
+
text = '' if definition.name in self._clock_only else cells[indexes[definition.field]]
|
|
466
|
+
# CSV引用会保留原文本,在解析、构造引用和append之前申请。
|
|
467
|
+
if resources is not None:
|
|
468
|
+
resources.before_sample(time_text, text, path)
|
|
469
|
+
# 原生标量随后只应用一次当前额外转换。
|
|
470
|
+
value = None if definition.name in self._clock_only else self._parse_value(text, definition)
|
|
471
|
+
# 每样本保留物理行/原字段和原文本/时间量化。
|
|
472
|
+
reference = (CSVSourceRef(self.session_id, self.spec.name, definition.field, str(path), line, time_text, text, conversion.quantized)
|
|
473
|
+
if self._retain_original else self._compact_refs[definition.name])
|
|
474
|
+
# 原序号在整个配置来源内递增,单文件结束时不重置。
|
|
475
|
+
pending.setdefault(definition.name, []).append((time, sequence, value, reference))
|
|
476
|
+
# 上限口径为所有列样本总数。
|
|
477
|
+
count += 1
|
|
478
|
+
# 即使空投影,该原行也推进源实际时间/原序号。
|
|
479
|
+
previous, sequence = time, sequence + 1
|
|
480
|
+
finally:
|
|
481
|
+
# 根因可能为读取错误或正常generator.close,分别处理关闭失败。
|
|
482
|
+
try:
|
|
483
|
+
if observation_sink is None and resource_sink is None:
|
|
484
|
+
self._close_handle(handle, sys.exception())
|
|
485
|
+
elif observation_sink is None:
|
|
486
|
+
resource_sink._close_handle(handle, sys.exception())
|
|
487
|
+
else:
|
|
488
|
+
observation_sink._close_handle(handle, sys.exception())
|
|
489
|
+
finally:
|
|
490
|
+
# 预算模式保留最新实际物理行,再丢文件局部引用后释放表头/行。
|
|
491
|
+
if resources is not None:
|
|
492
|
+
line = reader.line_num if reader is not None else line
|
|
493
|
+
header = indexes = cells = reader = records = None
|
|
494
|
+
if observation_sink is None and resource_sink is None:
|
|
495
|
+
resources.end_file()
|
|
496
|
+
elif observation_sink is None:
|
|
497
|
+
resource_sink._end_file(resources, sys.exception())
|
|
498
|
+
else:
|
|
499
|
+
# 此处捕获正在传播的解析、取消或文件关闭主错,清理附加错不能盖掉它。
|
|
500
|
+
observation_sink._end_file(resources, sys.exception())
|
|
501
|
+
# 所有paths才whole-source EOF;实际末点不补周期。
|
|
502
|
+
watermark = previous if previous is not None else watermark
|
|
503
|
+
# header-only或空投影末点仍是源实际事实,空来源可以None。
|
|
504
|
+
if resources is not None:
|
|
505
|
+
# EOF也可能有剩余样本,不能绕过数组/协议检查。
|
|
506
|
+
resources.before_pack(pending, validator)
|
|
507
|
+
batch = self._make_batch(pending, watermark, True, previous)
|
|
508
|
+
# EOF承诺通过同一个跨batch validator。
|
|
509
|
+
validator.accept(batch)
|
|
510
|
+
if resources is not None:
|
|
511
|
+
resources.after_pack(validator)
|
|
512
|
+
# 最终validator与after_pack均通过才交候选;接收者仍须等真正StopIteration及清理成功。
|
|
513
|
+
if observation_sink is not None:
|
|
514
|
+
observation_sink._accept_candidate(first, previous, sequence)
|
|
515
|
+
if resource_sink is not None and resource_sink.observe_bounds:
|
|
516
|
+
resource_sink.observed_end=previous
|
|
517
|
+
# 最后批次可含剩余样本或为空。
|
|
518
|
+
yield batch
|
|
519
|
+
except Exception as error:
|
|
520
|
+
# csv.reader在取下一record时也会抛错,line应反映已消费物理行。
|
|
521
|
+
line = reader.line_num if reader is not None else line
|
|
522
|
+
# 保留最初cause/关闭附注,位置绝不使用当前机器时间代替。
|
|
523
|
+
raise SourceReadError(f'{self.spec.name}:{path}:{line}:signal_csv读取失败:{error}') from error
|
|
524
|
+
finally:
|
|
525
|
+
# 释放有限原记录,已返回owned输出不受影响。
|
|
526
|
+
pending.clear()
|
|
527
|
+
# 原错误或取消都触发本请求预算抵销,不删除输入文件。
|
|
528
|
+
if resources is not None:
|
|
529
|
+
if observation_sink is None and resource_sink is None:
|
|
530
|
+
resources.close()
|
|
531
|
+
elif observation_sink is None:
|
|
532
|
+
resource_sink._close_resources(sys.exception())
|
|
533
|
+
else:
|
|
534
|
+
observation_sink._close_resources(sys.exception())
|
|
535
|
+
|
|
536
|
+
def _make_batch(self, pending, watermark: int | None, eof: bool, observed_end: int | None) -> SignalBatch:
|
|
537
|
+
"""归一化当前缓冲中的原值,保留逐样本CSV位置。
|
|
538
|
+
|
|
539
|
+
参数:
|
|
540
|
+
pending (dict): 别名到(time_ns, sequence, 原值, CSVSourceRef)记录列表。
|
|
541
|
+
watermark (int | None): 完整时间组的进度坐标,单位为纳秒。
|
|
542
|
+
eof (bool): 整个来源是否耗尽。
|
|
543
|
+
observed_end (int | None): 实际观测终点纳秒坐标,未知时为None。
|
|
544
|
+
返回:
|
|
545
|
+
SignalBatch。每列与当前位置记录对应,未知端点不补0。
|
|
546
|
+
异常:
|
|
547
|
+
TypeError、ValueError或OverflowError: 数值、时间或列结构校验失败;外层附读取位置。
|
|
548
|
+
副作用:
|
|
549
|
+
分配批次列,不额外读取输入,也不继承其他请求的信号值。
|
|
550
|
+
"""
|
|
551
|
+
# 当前声明不共享原信号值/跨任务绑定缓存。
|
|
552
|
+
definitions = {item.name: item for item in self.signals}
|
|
553
|
+
# 三元原值记录与四元CSV位置分开装箱,位置不会混入数值矩阵。
|
|
554
|
+
columns = {name: pack_decoded(definitions[name], tuple((time, sequence, value) for time, sequence, value, _ in records),
|
|
555
|
+
tuple(reference for _, _, _, reference in records), self.backend,
|
|
556
|
+
retain_original=self._retain_original,clock_only=name in self._clock_only) for name, records in pending.items()}
|
|
557
|
+
# 输出真实会话/来源/watermark/终点,未知不补0。
|
|
558
|
+
return SignalBatch(self.spec.name, self.session_id, columns, watermark, eof, observed_end)
|
|
559
|
+
|
|
560
|
+
def close(self) -> None:
|
|
561
|
+
"""尝试关闭全部活动请求和句柄,最后报告最初清理失败。
|
|
562
|
+
|
|
563
|
+
参数:
|
|
564
|
+
无。读取closed、active和handles。
|
|
565
|
+
返回:
|
|
566
|
+
None。重复调用直接返回;原输入文件保留。
|
|
567
|
+
异常:
|
|
568
|
+
SourceReadError: 至少一次清理失败,原异常链保存首错,其他失败作为附注。
|
|
569
|
+
副作用:
|
|
570
|
+
先标记关闭,再逐个清理生成器和残留句柄,最后清空资源登记。
|
|
571
|
+
"""
|
|
572
|
+
# 幂等关闭不会重复删除或执行输入读取。
|
|
573
|
+
if self.closed:
|
|
574
|
+
# 已清理实例不自动重开。
|
|
575
|
+
return
|
|
576
|
+
# 先拒绝后续调用,再逐个尝试所有资源清理。
|
|
577
|
+
self.closed, failure = True, None
|
|
578
|
+
# generator.close触发单文件finally,未启动generator也安全。
|
|
579
|
+
for iterator in tuple(self.active):
|
|
580
|
+
# 一个关闭失败也不能跳过其他活动请求。
|
|
581
|
+
try:
|
|
582
|
+
# 释放读取进度和有限原值缓冲。
|
|
583
|
+
iterator.close()
|
|
584
|
+
except Exception as error:
|
|
585
|
+
# 首错作为根因,其他错误另作附注。
|
|
586
|
+
if failure is None:
|
|
587
|
+
# 不用最后一个错误覆盖最初错误。
|
|
588
|
+
failure = error
|
|
589
|
+
else:
|
|
590
|
+
# 保留所有清理失败但最终只抛一个带来源的错误链。
|
|
591
|
+
failure.add_note(f'其他CSV请求关闭失败:{error}')
|
|
592
|
+
# 残留句柄也尝试关闭,不依赖生成器已经启动。
|
|
593
|
+
for handle in tuple(self.handles):
|
|
594
|
+
# _close_handle用相同根因保护政策。
|
|
595
|
+
try:
|
|
596
|
+
# 没有根因时close失败应成为failure。
|
|
597
|
+
self._close_handle(handle, failure)
|
|
598
|
+
except Exception as error:
|
|
599
|
+
# 原failure为None才会从helper抛错。
|
|
600
|
+
failure = error
|
|
601
|
+
# 所有引用清空,输入文件本身保留。
|
|
602
|
+
self.active.clear()
|
|
603
|
+
# 活跃句柄登记不延续到其他session。
|
|
604
|
+
self.handles.clear()
|
|
605
|
+
# 若任一资源清理失败,明确报告错误,不能声称清理成功。
|
|
606
|
+
if failure is not None:
|
|
607
|
+
# 将清理失败交给调用方,后续执行器须据此判断整体任务状态。
|
|
608
|
+
raise SourceReadError(f'{self.spec.name}:signal_csv关闭失败') from failure
|