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,246 @@
|
|
|
1
|
+
"""编码和严格解码当前扁平结果JSONL;内部叶子格式另用于历史和导出。
|
|
2
|
+
|
|
3
|
+
公开结果只登记当前行类型和编号。内部_pack/_unpack保留整数、tuple、枚举、
|
|
4
|
+
来源与非有限诊断标记;它们不提供旧结果包装或公开v1—v6读取。
|
|
5
|
+
最大行字节与递归深度显式限制;调用方须先预留编码与解析临时空间。"""
|
|
6
|
+
|
|
7
|
+
# 只访问登记dataclass字段,不开放表达式对象访问或反射导入。
|
|
8
|
+
from dataclasses import fields
|
|
9
|
+
from enum import Enum
|
|
10
|
+
import json
|
|
11
|
+
from math import isfinite
|
|
12
|
+
from sys import getsizeof
|
|
13
|
+
from ..core.models import Interval, SourceRef
|
|
14
|
+
from ..core.numeric import ScalarValue
|
|
15
|
+
from ..core.calculations import CalculationResult, CalculationDefinition
|
|
16
|
+
from ..core.selection import SelectionRow
|
|
17
|
+
from ..core.temporal import Event, TemporalRule
|
|
18
|
+
from ..core.sequence import SequenceRule, SequenceResult
|
|
19
|
+
from ..core.windows import Segment, WindowSpec
|
|
20
|
+
from ..core.types import QualityFlag, SignalDType, Truth
|
|
21
|
+
# CSV实际定位需要完整具体字段;只登记冻结协议,不打开来源或引入reader。
|
|
22
|
+
from ..sources.csv_spec import CSVSourceRef
|
|
23
|
+
# CAN引用只导入冻结位置模型,不加载原reader/DBC或产生额外扫描。
|
|
24
|
+
from ..sources.can_spec import CANSourceRef
|
|
25
|
+
from ..sources.text_can_ref import CANTextSourceRef
|
|
26
|
+
from .rows import ResultRow, row_table
|
|
27
|
+
from .errors import ResultFormatError
|
|
28
|
+
from .summary import SummaryCalculationRow, SUMMARY_FIELDS, summary_fields, SUMMARY_MODELS
|
|
29
|
+
# 行类型各有固定编号;只接受当前登记的格式,不提供旧版本解码。
|
|
30
|
+
_SUMMARY_VERSIONS = {version:(model,names) for model,(_,names,version) in SUMMARY_MODELS.items()}
|
|
31
|
+
_MODELS = {cls.__name__: cls for cls in (Interval, SourceRef, CSVSourceRef, CANSourceRef, CANTextSourceRef, ScalarValue, CalculationDefinition,
|
|
32
|
+
CalculationResult, SelectionRow, Event, TemporalRule, Segment, WindowSpec,
|
|
33
|
+
SequenceRule, SequenceResult)}
|
|
34
|
+
_ENUMS = {cls.__name__: cls for cls in (QualityFlag, SignalDType, Truth)}
|
|
35
|
+
def _pack(value, depth: int = 0):
|
|
36
|
+
"""递归编码固定模型、枚举、tuple和原生标量。
|
|
37
|
+
|
|
38
|
+
参数: value为白名单树,depth为递归深度。返回: 仅JSON结构的树。
|
|
39
|
+
异常: ResultFormatError表示类型或深度不受支持。
|
|
40
|
+
"""
|
|
41
|
+
# 深度限制避免异常嵌套占用无界栈;序列长度由调用侧RAM预估限制。
|
|
42
|
+
try:
|
|
43
|
+
if depth > 32:
|
|
44
|
+
raise ResultFormatError('结果行嵌套超过32层')
|
|
45
|
+
value_type = type(value)
|
|
46
|
+
# 原生叶子直接处理;无效数值仍保留诊断标签,不能变成普通JSON非有限值。
|
|
47
|
+
if value_type is float and not isfinite(value):
|
|
48
|
+
return {'diagnostic_float': 'nan' if value != value else 'inf' if value > 0 else '-inf'}
|
|
49
|
+
if value is None or value_type in (str, int, bool, float):
|
|
50
|
+
return value
|
|
51
|
+
if isinstance(value, Enum) and type(value).__name__ in _ENUMS and type(value) is _ENUMS[type(value).__name__]:
|
|
52
|
+
return {'enum': type(value).__name__, 'value': value.value}
|
|
53
|
+
if type(value).__name__ in _MODELS and type(value) is _MODELS[type(value).__name__]:
|
|
54
|
+
packed = {}
|
|
55
|
+
for field in fields(value):
|
|
56
|
+
if field.init:
|
|
57
|
+
packed[field.name] = _pack(getattr(value, field.name), depth + 1)
|
|
58
|
+
return {'model': type(value).__name__, 'fields': packed}
|
|
59
|
+
if type(value) is tuple:
|
|
60
|
+
packed = []
|
|
61
|
+
for item in value:
|
|
62
|
+
packed.append(_pack(item, depth + 1))
|
|
63
|
+
return {'tuple': packed}
|
|
64
|
+
raise ResultFormatError(f'结果行含未注册类型{type(value).__name__}')
|
|
65
|
+
finally:
|
|
66
|
+
# 显式循环不留下comprehension迭代器;失败TB只断本层参数/新容器。
|
|
67
|
+
value = packed = items = kwargs = field = key = item = None
|
|
68
|
+
value_type = None
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def _unpack(value, depth: int = 0):
|
|
72
|
+
"""只从已登记标签重建冻结对象。
|
|
73
|
+
|
|
74
|
+
参数: value为解析结构,depth为深度。返回: typed值。
|
|
75
|
+
异常: ResultFormatError/TypeError/ValueError为结构或模型校验错误。
|
|
76
|
+
"""
|
|
77
|
+
# 未标记数组/对象不得绕过tuple和模型校验。
|
|
78
|
+
try:
|
|
79
|
+
if depth > 32:
|
|
80
|
+
raise ResultFormatError('结果行嵌套超过32层')
|
|
81
|
+
# JSON的1e999也会被解析为Inf,不能绕过明确诊断标签。
|
|
82
|
+
if type(value) is float and not isfinite(value):
|
|
83
|
+
raise ResultFormatError('非有限结果必须使用诊断标签')
|
|
84
|
+
if value is None or type(value) in (str, int, bool, float):
|
|
85
|
+
return value
|
|
86
|
+
if type(value) is not dict:
|
|
87
|
+
raise ResultFormatError('结果结构需要明确类型标签')
|
|
88
|
+
if set(value) == {'tuple'} and type(value['tuple']) is list:
|
|
89
|
+
items = []
|
|
90
|
+
for item in value['tuple']:
|
|
91
|
+
items.append(_unpack(item, depth + 1))
|
|
92
|
+
return tuple(items)
|
|
93
|
+
if set(value) == {'diagnostic_float'} and value['diagnostic_float'] in ('nan', 'inf', '-inf'):
|
|
94
|
+
return float(value['diagnostic_float'])
|
|
95
|
+
if set(value) == {'enum', 'value'} and value['enum'] in _ENUMS:
|
|
96
|
+
# enum原始值不能用bool冒充质量位整数。
|
|
97
|
+
expected = int if value['enum'] == 'QualityFlag' else str
|
|
98
|
+
if type(value['value']) is not expected:
|
|
99
|
+
raise ResultFormatError('枚举底层值类型错误')
|
|
100
|
+
return _ENUMS[value['enum']](value['value'])
|
|
101
|
+
if set(value) == {'model', 'fields'} and value['model'] in _MODELS and type(value['fields']) is dict:
|
|
102
|
+
cls = _MODELS[value['model']]
|
|
103
|
+
expected = {field.name for field in fields(cls) if field.init}
|
|
104
|
+
if set(value['fields']) != expected:
|
|
105
|
+
raise ResultFormatError('结果模型字段缺失或出现未知字段')
|
|
106
|
+
kwargs = {}
|
|
107
|
+
for key, item in value['fields'].items():
|
|
108
|
+
kwargs[key] = _unpack(item, depth + 1)
|
|
109
|
+
return cls(**kwargs)
|
|
110
|
+
raise ResultFormatError('未知或多余结果类型标签')
|
|
111
|
+
finally:
|
|
112
|
+
# 显式循环不留下comprehension迭代器;失败TB只断本层参数/新容器。
|
|
113
|
+
value = packed = items = kwargs = field = key = item = None
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
def _unique_object(pairs):
|
|
117
|
+
"""拒绝重复JSON键,避免解析时后值覆盖前值。
|
|
118
|
+
|
|
119
|
+
参数: pairs为JSON对象键值对。返回: dict。
|
|
120
|
+
异常: ResultFormatError为重复字段。
|
|
121
|
+
"""
|
|
122
|
+
# 精确键检查覆盖外层版本和所有嵌套对象。
|
|
123
|
+
try:
|
|
124
|
+
result = {}
|
|
125
|
+
for key, value in pairs:
|
|
126
|
+
if key in result:
|
|
127
|
+
raise ResultFormatError(f'结果JSON重复键{key}')
|
|
128
|
+
result[key] = value
|
|
129
|
+
return result
|
|
130
|
+
finally:
|
|
131
|
+
# 显式循环不留下comprehension迭代器;失败TB只断本层参数/新容器。
|
|
132
|
+
pairs = result = key = value = None
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
def _reject_constant(value):
|
|
144
|
+
"""拒绝非标准JSON NaN/Infinity,诊断只能使用明确标签。
|
|
145
|
+
|
|
146
|
+
参数: value为解析器识别的常量名。返回: 无。
|
|
147
|
+
异常: ResultFormatError始终抛出。
|
|
148
|
+
"""
|
|
149
|
+
raise ResultFormatError(f'结果JSON含非法数值{value}')
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
def estimate_row_bytes(row: ResultRow) -> int:
|
|
153
|
+
"""保守估计结果树、JSON转换与编码期间的新层RAM开销。
|
|
154
|
+
|
|
155
|
+
参数: row为冻结行。返回: 正整数bytes估算,含容器/标签和字符串转义余量。
|
|
156
|
+
异常: ResultFormatError为未登记类型或过深结构;不测量全进程RSS。
|
|
157
|
+
"""
|
|
158
|
+
# 先确认根类型;递归只观察既有输入,不复制完整树。
|
|
159
|
+
row_table(row)
|
|
160
|
+
if type(row) is SummaryCalculationRow:
|
|
161
|
+
return (getsizeof(row) + sum(256 + getsizeof(getattr(row, name)) for name in SUMMARY_FIELDS))*16 + 8192
|
|
162
|
+
return _estimate(row) * 16 + 8192
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
def _estimate(value, depth: int = 0) -> int:
|
|
166
|
+
"""累计原生对象及字段容器成本,重复引用也保守重复计数。
|
|
167
|
+
|
|
168
|
+
参数: value为固定树,depth为深度。返回: 基础bytes估算。
|
|
169
|
+
异常: ResultFormatError为类型/深度不支持。
|
|
170
|
+
"""
|
|
171
|
+
if depth > 32:
|
|
172
|
+
raise ResultFormatError('结果行嵌套超过32层')
|
|
173
|
+
value_type = type(value)
|
|
174
|
+
if value is None or value_type in (str, int, bool, float):
|
|
175
|
+
return getsizeof(value) + 64
|
|
176
|
+
# 字段键与临时dict的开销按每字段256bytes留余量。
|
|
177
|
+
if type(value) in SUMMARY_MODELS or (type(value).__name__ in _MODELS and type(value) is _MODELS[type(value).__name__]):
|
|
178
|
+
return getsizeof(value) + sum(256 + _estimate(getattr(value, field.name), depth + 1)
|
|
179
|
+
for field in fields(value) if field.init)
|
|
180
|
+
if type(value) is tuple:
|
|
181
|
+
return getsizeof(value) + sum(_estimate(item, depth + 1) + 32 for item in value)
|
|
182
|
+
if isinstance(value, Enum) and type(value).__name__ in _ENUMS:
|
|
183
|
+
return 512
|
|
184
|
+
raise ResultFormatError('不能估算未登记结果对象')
|
|
185
|
+
|
|
186
|
+
|
|
187
|
+
def encode_row(row: ResultRow, max_bytes: int) -> bytes:
|
|
188
|
+
"""生成一条确定JSONL,包含行结束符且限制字节数。
|
|
189
|
+
|
|
190
|
+
参数: row为typed行;max_bytes为正原生int。
|
|
191
|
+
返回: UTF-8 bytes,整数不经过浮点数转换。
|
|
192
|
+
异常: ResultFormatError/ValueError为类型、大小或格式错误。
|
|
193
|
+
"""
|
|
194
|
+
# 限额由资源账本给出;此函数不自行声称RAM已预留。
|
|
195
|
+
try:
|
|
196
|
+
row_table(row)
|
|
197
|
+
if type(max_bytes) is not int or max_bytes <= 0:
|
|
198
|
+
raise ValueError('max_bytes需正原生int')
|
|
199
|
+
packed = {'row_schema_version': SUMMARY_MODELS[type(row)][2], 'row': summary_fields(row)}
|
|
200
|
+
payload = (json.dumps(packed, ensure_ascii=False, allow_nan=False, sort_keys=True,
|
|
201
|
+
separators=(',', ':')) + '\n').encode('utf-8')
|
|
202
|
+
if len(payload) > max_bytes:
|
|
203
|
+
raise ResultFormatError('结果行超过max_bytes')
|
|
204
|
+
return payload
|
|
205
|
+
finally:
|
|
206
|
+
# 原异常/TB和返回值保持;只断本层临时引用,不清调用方帧。
|
|
207
|
+
packed = payload = row = None
|
|
208
|
+
|
|
209
|
+
|
|
210
|
+
def decode_row(payload: bytes, max_bytes: int) -> ResultRow:
|
|
211
|
+
"""从单行版本化JSONL恢复并重新校验所有模型。
|
|
212
|
+
|
|
213
|
+
参数: payload为UTF-8 bytes;max_bytes为正原生int。
|
|
214
|
+
返回: 当前登记的平坦结果行;旧版本1—6不再读取。
|
|
215
|
+
异常: ResultFormatError为解析/版本/模型错误,ValueError为限额配置错误。
|
|
216
|
+
"""
|
|
217
|
+
try:
|
|
218
|
+
if type(max_bytes) is not int or max_bytes <= 0:
|
|
219
|
+
raise ValueError('max_bytes需正原生int')
|
|
220
|
+
if type(payload) is not bytes or len(payload) > max_bytes:
|
|
221
|
+
raise ResultFormatError('结果行类型或字节限额错误')
|
|
222
|
+
try:
|
|
223
|
+
# 禁止重复键、隐式非有限值和未知外层字段。
|
|
224
|
+
packed = json.loads(payload, object_pairs_hook=_unique_object, parse_constant=_reject_constant)
|
|
225
|
+
if type(packed) is not dict or set(packed) != {'row_schema_version', 'row'}:
|
|
226
|
+
raise ResultFormatError('结果行外层字段错误')
|
|
227
|
+
version = packed['row_schema_version']
|
|
228
|
+
if type(version) is int and version in _SUMMARY_VERSIONS:
|
|
229
|
+
model, names = _SUMMARY_VERSIONS[version]
|
|
230
|
+
fields_ = packed['row']
|
|
231
|
+
if (type(fields_) is not dict or set(fields_) != set(names)
|
|
232
|
+
or type(fields_['quality']) is not int or fields_['quality'] < 0):
|
|
233
|
+
raise ResultFormatError('结果字段集合或质量类型错误')
|
|
234
|
+
fields_['quality'] = QualityFlag(fields_['quality'])
|
|
235
|
+
if version==11:
|
|
236
|
+
if type(fields_['parent_event_ids']) is not list:
|
|
237
|
+
raise ResultFormatError('片段父ID需要JSON数组')
|
|
238
|
+
fields_['parent_event_ids']=tuple(fields_['parent_event_ids'])
|
|
239
|
+
return model(**fields_)
|
|
240
|
+
raise ResultFormatError('不支持的结果行版本')
|
|
241
|
+
except (ValueError, TypeError, OverflowError, RecursionError, UnicodeError) as exc:
|
|
242
|
+
# 保留原模型报错原因,不吞异常或给出正常零。
|
|
243
|
+
raise ResultFormatError(f'结果行无法解析: {exc}') from exc
|
|
244
|
+
finally:
|
|
245
|
+
# 原异常/TB和返回值保持;只断本层临时引用,不清调用方帧。
|
|
246
|
+
packed = payload = row = fields_ = None
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"""定义结果暂存、资源预算和发布的明确异常边界。
|
|
2
|
+
|
|
3
|
+
输入是结果层失败原因,输出是供调用者捕获的异常类型;不执行I/O或清理。
|
|
4
|
+
AnalysisError是分析执行和结果交付共用的失败基类,原始异常通过异常链保留。
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class AnalysisError(RuntimeError):
|
|
9
|
+
"""表示分析或结果交付失败;异常本身不承诺旧输出已回滚。"""
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class BudgetExceededError(AnalysisError):
|
|
13
|
+
"""表示新分析层估算RAM或累计磁盘暂存超过显式限额。"""
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class ResultClosedError(AnalysisError):
|
|
17
|
+
"""表示结果已经关闭,不能再创建迭代器、读取或发布。"""
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class ResultFormatError(AnalysisError):
|
|
21
|
+
"""表示暂存行版本、结构或typed事实非法;禁止静默补值。"""
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class ContributionsUnavailableError(AnalysisError):
|
|
25
|
+
"""表示本次选择不生成贡献明细;应改为full重新运行,不能把缺失明细当作零条计算。"""
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
"""用有限缓冲写新导出目录,全部文件真正关闭后才独占发布。
|
|
2
|
+
|
|
3
|
+
供信号CSV及新报文导出共用:输入是已编码的有限bytes,输出为文件摘要和新目录。
|
|
4
|
+
临时文件保留供排查;失败不覆盖用户目录、不删除已有数据。累计spool先预约,
|
|
5
|
+
RAM按自有槽释放;关闭失败保真实句柄供重试。沿用项目已验证的Windows rename
|
|
6
|
+
语义,其他平台预先拒绝。此层不读取原始日志、不解码,也不计算插值。
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from hashlib import sha256
|
|
10
|
+
import json
|
|
11
|
+
from pathlib import Path
|
|
12
|
+
import platform
|
|
13
|
+
from uuid import uuid4
|
|
14
|
+
|
|
15
|
+
from .budget import ResourceBudget, _reserve_owned_ram, _release_owned_ram, _cleanup_owner
|
|
16
|
+
from .errors import ResultClosedError, ResultFormatError
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class ExportFiles:
|
|
20
|
+
"""拥有当前/挂起的有限输出文件、消费游标及可选处理owner,最多16文件。"""
|
|
21
|
+
|
|
22
|
+
def __init__(self, destination, budget, *, integrity=True):
|
|
23
|
+
"""预检输出并创建独占临时目录。参数: destination新目录、budget共享账本,integrity控制摘要(旧入口默认开启)。
|
|
24
|
+
|
|
25
|
+
返回: owner。异常: 路径/平台/预算/I/O错;清理失败附export_cleanup_owner。
|
|
26
|
+
"""
|
|
27
|
+
if not isinstance(destination,(str,Path)) or not isinstance(budget,ResourceBudget):
|
|
28
|
+
raise TypeError('导出需要目录路径和ResourceBudget')
|
|
29
|
+
if type(integrity) is not bool:
|
|
30
|
+
raise TypeError('integrity必须为bool')
|
|
31
|
+
self._integrity=integrity
|
|
32
|
+
self.destination = Path(destination).absolute()
|
|
33
|
+
# 检查词法及解析路径,防止通过链接写回历史项目;已有目标不复用。
|
|
34
|
+
if any(p.casefold()=='refprojects' for p in (*self.destination.parts,*self.destination.resolve().parts)):
|
|
35
|
+
raise ValueError('导出不能位于RefProjects')
|
|
36
|
+
if platform.system()!='Windows':
|
|
37
|
+
raise NotImplementedError('导出原子安装目前只验证Windows')
|
|
38
|
+
try:
|
|
39
|
+
self.destination.lstat()
|
|
40
|
+
except FileNotFoundError:
|
|
41
|
+
pass
|
|
42
|
+
else:
|
|
43
|
+
raise FileExistsError(self.destination)
|
|
44
|
+
self._budget = budget
|
|
45
|
+
self._held_cost = self._fixed_cost = self._row_cost = 0
|
|
46
|
+
self._closed = False
|
|
47
|
+
self.reader = self.worker = self.stream = self.verifier = self.temporary = None
|
|
48
|
+
self._parked = {}
|
|
49
|
+
self._name = self._hash = None
|
|
50
|
+
self._bytes = 0
|
|
51
|
+
self.files = []
|
|
52
|
+
try:
|
|
53
|
+
_reserve_owned_ram(self,131072+len(str(self.destination).encode('utf-8'))*32,'_fixed_cost')
|
|
54
|
+
self.destination.parent.mkdir(parents=True,exist_ok=True)
|
|
55
|
+
self.temporary = self.destination.parent/('.'+self.destination.name+'.'+uuid4().hex+'.incomplete')
|
|
56
|
+
self.temporary.mkdir(exist_ok=False)
|
|
57
|
+
except BaseException as error:
|
|
58
|
+
_cleanup_owner(self,error,'export_cleanup_owner','导出目录构造')
|
|
59
|
+
raise
|
|
60
|
+
|
|
61
|
+
@property
|
|
62
|
+
def closed(self):
|
|
63
|
+
"""返回真实关闭状态。参数: 无。返回: bool。异常: 无。
|
|
64
|
+
"""
|
|
65
|
+
return self._closed
|
|
66
|
+
|
|
67
|
+
def open_file(self, name):
|
|
68
|
+
"""打开一个固定平面文件。参数: name安全文件名。返回: None。异常: 未关闭/重复/非法名/I/O错。
|
|
69
|
+
"""
|
|
70
|
+
if self._closed or self.stream is not None:
|
|
71
|
+
raise ResultClosedError('导出已关闭或前一文件未关闭')
|
|
72
|
+
if (type(name) is not str or not name or len(name)>128 or Path(name).name!=name
|
|
73
|
+
or any(c in name for c in '/\\:') or name in ('.','..') or len(self.files)+len(self._parked)>=16):
|
|
74
|
+
raise ValueError('导出文件名或数量非法')
|
|
75
|
+
if name in self._parked or any(item['name']==name for item in self.files):
|
|
76
|
+
raise ValueError('导出文件重复')
|
|
77
|
+
# 多张表共用同次输入时会同时存在缓冲;每个新文件单独预约,不各自借满总预算。
|
|
78
|
+
_reserve_owned_ram(self,131072,'_fixed_cost')
|
|
79
|
+
self.stream = (self.temporary/name).open('xb',buffering=65536)
|
|
80
|
+
self._name,self._hash,self._bytes = name,sha256() if self._integrity else None,0
|
|
81
|
+
|
|
82
|
+
def select_file(self, name):
|
|
83
|
+
"""切换有限输出表,不重新打开或覆盖。参数: name已开或新固定文件名。返回: None。异常: 打开/状态错。
|
|
84
|
+
"""
|
|
85
|
+
if self._closed:
|
|
86
|
+
raise ResultClosedError('导出已关闭')
|
|
87
|
+
if self._name == name:
|
|
88
|
+
return
|
|
89
|
+
if self.stream is not None:
|
|
90
|
+
self._parked[self._name] = (self.stream,self._hash,self._bytes)
|
|
91
|
+
self.stream = self._name = self._hash = None
|
|
92
|
+
if name in self._parked:
|
|
93
|
+
self.stream,self._hash,self._bytes = self._parked.pop(name)
|
|
94
|
+
self._name = name
|
|
95
|
+
else:
|
|
96
|
+
self.open_file(name)
|
|
97
|
+
|
|
98
|
+
def append(self, payload):
|
|
99
|
+
"""有限块实际写入并更新摘要。参数: payload最多64KiB bytes。返回: None。异常: 配额/写入/结构错。
|
|
100
|
+
"""
|
|
101
|
+
if self._closed or self.stream is None:
|
|
102
|
+
raise ResultClosedError('导出文件未打开')
|
|
103
|
+
if type(payload) is not bytes or len(payload)>65536:
|
|
104
|
+
raise ResultFormatError('导出块需要至多64KiB bytes')
|
|
105
|
+
# 配额在任何写动作之前预约,短写继续;零进展不能伪装成功。
|
|
106
|
+
self._budget.reserve_spool(len(payload))
|
|
107
|
+
position = 0
|
|
108
|
+
while position < len(payload):
|
|
109
|
+
written = self.stream.write(payload[position:])
|
|
110
|
+
if type(written) is not int or not 0 < written <= len(payload)-position:
|
|
111
|
+
raise OSError('导出写入没有合法进展')
|
|
112
|
+
position += written
|
|
113
|
+
if self._hash is not None: self._hash.update(payload)
|
|
114
|
+
self._bytes += len(payload)
|
|
115
|
+
|
|
116
|
+
def close_file(self):
|
|
117
|
+
"""真实关闭后登记摘要。参数: 无。返回: None。异常: 关闭失败保留句柄供重试。
|
|
118
|
+
"""
|
|
119
|
+
if self.stream is None:
|
|
120
|
+
return
|
|
121
|
+
self.stream.close()
|
|
122
|
+
self.stream = None
|
|
123
|
+
self.files.append(dict(name=self._name,bytes=self._bytes,
|
|
124
|
+
**({} if self._hash is None else {'sha256':self._hash.hexdigest()})))
|
|
125
|
+
self._name = self._hash = None
|
|
126
|
+
|
|
127
|
+
def close_reader(self):
|
|
128
|
+
"""关闭已接管的输入游标。参数: 无。返回: None。异常: 原关闭错误,保留游标供重试。
|
|
129
|
+
"""
|
|
130
|
+
if self.reader is not None:
|
|
131
|
+
close = getattr(self.reader,'close',None)
|
|
132
|
+
if close is not None:
|
|
133
|
+
close()
|
|
134
|
+
self.reader = None
|
|
135
|
+
|
|
136
|
+
def close_files(self):
|
|
137
|
+
"""关闭当前及挂起文件。参数: 无。返回: None。异常: 原关闭错误,未关的仍在owner中。
|
|
138
|
+
"""
|
|
139
|
+
self.close_file()
|
|
140
|
+
while self._parked:
|
|
141
|
+
name = next(iter(self._parked))
|
|
142
|
+
self.select_file(name)
|
|
143
|
+
self.close_file()
|
|
144
|
+
|
|
145
|
+
def register_external(self,name):
|
|
146
|
+
"""登记同目录内已关闭的外部writer文件。参数: name固定文件名。返回: None。异常: 名称/读取/关闭错。
|
|
147
|
+
|
|
148
|
+
外部writer已付spool,本层仅有限回读计算摘要,不再次计算磁盘费用。
|
|
149
|
+
"""
|
|
150
|
+
if (self._closed or self.verifier is not None or type(name) is not str or not name or len(name)>128 or Path(name).name!=name
|
|
151
|
+
or any(c in name for c in '/\\:') or name in ('.','..')
|
|
152
|
+
or len(self.files)+len(self._parked)+(self.stream is not None)>=16
|
|
153
|
+
or name==self._name or name in self._parked or any(f['name']==name for f in self.files)):
|
|
154
|
+
raise ValueError('外部导出文件名称或状态非法')
|
|
155
|
+
# 未请求完整性诊断时,只登记外部writer已关闭文件的实际大小,不为摘要回读。
|
|
156
|
+
if not self._integrity:
|
|
157
|
+
self.files.append({'name':name,'bytes':(self.temporary/name).stat().st_size})
|
|
158
|
+
return
|
|
159
|
+
self.verifier=(self.temporary/name).open('rb')
|
|
160
|
+
digest=sha256(); size=0
|
|
161
|
+
while True:
|
|
162
|
+
chunk=self.verifier.read(65536)
|
|
163
|
+
if not chunk:
|
|
164
|
+
break
|
|
165
|
+
digest.update(chunk); size+=len(chunk)
|
|
166
|
+
self.verifier.close()
|
|
167
|
+
self.verifier=None
|
|
168
|
+
self.files.append({'name':name,'sha256':digest.hexdigest(),'bytes':size})
|
|
169
|
+
|
|
170
|
+
def finish(self, metadata):
|
|
171
|
+
"""写完成清单并原子安装目录。参数: metadata有界JSON事实。返回: 已发布目录Path。
|
|
172
|
+
|
|
173
|
+
异常: 序列化/配额/关闭/竞态目标错误;失败保.incomplete目录,不冒报发布成功。
|
|
174
|
+
"""
|
|
175
|
+
from ..execution.history import _metadata_bytes
|
|
176
|
+
# 输入完整消费并真实关闭、数据文件关闭后才写完成清单。
|
|
177
|
+
self.close_reader()
|
|
178
|
+
if self.worker is not None:
|
|
179
|
+
self.worker.close()
|
|
180
|
+
self.worker = None
|
|
181
|
+
if self.verifier is not None:
|
|
182
|
+
self.verifier.close()
|
|
183
|
+
self.verifier=None
|
|
184
|
+
self.close_files()
|
|
185
|
+
_reserve_owned_ram(self,65536+_metadata_bytes(metadata)*16,'_row_cost')
|
|
186
|
+
try:
|
|
187
|
+
document = dict(metadata,export_version=1,status='completed',files=tuple(self.files))
|
|
188
|
+
payload = (json.dumps(document,ensure_ascii=False,allow_nan=False,sort_keys=True)+'\n').encode('utf-8')
|
|
189
|
+
self.open_file('manifest.json')
|
|
190
|
+
# 清单受声明规模和RAM预算约束,按有限块写出,不把CSV单行上限误用为总清单上限。
|
|
191
|
+
for start in range(0,len(payload),65536):
|
|
192
|
+
self.append(payload[start:start+65536])
|
|
193
|
+
self.close_file()
|
|
194
|
+
finally:
|
|
195
|
+
_release_owned_ram(self,self._row_cost,'_row_cost')
|
|
196
|
+
# 关闭及费用释放失败时也不能安装;Windows rename拒绝竞态产生的已有目标。
|
|
197
|
+
self.close()
|
|
198
|
+
self.temporary.rename(self.destination)
|
|
199
|
+
return self.destination
|
|
200
|
+
|
|
201
|
+
def close(self):
|
|
202
|
+
"""只关闭自有资源,保留诊断文件。参数: 无。返回: None。异常: 原关闭/释放错,允许重试。
|
|
203
|
+
"""
|
|
204
|
+
if self._closed:
|
|
205
|
+
return
|
|
206
|
+
self.close_reader()
|
|
207
|
+
if self.worker is not None:
|
|
208
|
+
self.worker.close()
|
|
209
|
+
self.worker = None
|
|
210
|
+
if self.verifier is not None:
|
|
211
|
+
self.verifier.close()
|
|
212
|
+
self.verifier=None
|
|
213
|
+
self.close_files()
|
|
214
|
+
_release_owned_ram(self,self._row_cost,'_row_cost')
|
|
215
|
+
_release_owned_ram(self,self._fixed_cost,'_fixed_cost')
|
|
216
|
+
self._closed = True
|