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,122 @@
|
|
|
1
|
+
"""[home] 保存按需分析使用的CAN身份和值,允许明确不采集时间。
|
|
2
|
+
|
|
3
|
+
输入是已匹配原消息的必要身份和所需解码值;输出为冻结模型与有界JSON记录。
|
|
4
|
+
时间为None表示没有采集,不能代替零秒。记录不保存载荷、DLC和写出标志,不能
|
|
5
|
+
用于原始BLF导出。复用既有严格数值、非有限标签和64KiB限制;无I/O或跨请求状态。
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from collections.abc import Mapping
|
|
9
|
+
from dataclasses import dataclass
|
|
10
|
+
import json
|
|
11
|
+
from math import isfinite
|
|
12
|
+
from types import MappingProxyType
|
|
13
|
+
|
|
14
|
+
from .records import (MAX_WIRE_BYTES, _integer, _shape, _wire_tree, _decoded_values_size,
|
|
15
|
+
_decoded_entry_size, _value_to_wire, _value_from_wire, _unique_object, _reject_constant)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
_FRAME_FIELDS = ('timestamp', 'arbitration_id', 'channel', 'is_extended_id', 'is_fd',
|
|
19
|
+
'is_remote_frame', 'is_error_frame')
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
@dataclass(frozen=True)
|
|
23
|
+
class RequiredCANFrame:
|
|
24
|
+
"""仅持有所需匹配身份,时间None明确表示未采集;模型不具备原始写出能力。"""
|
|
25
|
+
|
|
26
|
+
timestamp: float | None # 有限原float秒,或本任务未采集。
|
|
27
|
+
arbitration_id: int # 原29位以内ID,不含通道。
|
|
28
|
+
channel: int | str | None # 原通道身份,保持原类型,不猜测。
|
|
29
|
+
is_extended_id: bool # 原标准/扩展标志。
|
|
30
|
+
is_fd: bool # 原经典CAN/FD标志。
|
|
31
|
+
is_remote_frame: bool # 匹配时排除远程帧所需。
|
|
32
|
+
is_error_frame: bool # 匹配时排除错误帧所需。
|
|
33
|
+
|
|
34
|
+
def __post_init__(self):
|
|
35
|
+
"""检查身份及可选时间。参数: 无。返回: None。异常: 原类型或边界错误。"""
|
|
36
|
+
if self.timestamp is not None and (type(self.timestamp) is not float or not isfinite(self.timestamp)):
|
|
37
|
+
raise ValueError('所需报文timestamp需要有限float秒或None')
|
|
38
|
+
_integer(self.arbitration_id, 'arbitration_id', maximum=0x1fffffff)
|
|
39
|
+
if self.channel is not None and type(self.channel) not in (int, str):
|
|
40
|
+
raise TypeError('所需报文channel需要int/str/None')
|
|
41
|
+
if type(self.channel) is str and len(self.channel) > MAX_WIRE_BYTES:
|
|
42
|
+
raise ValueError('所需报文channel文本过长')
|
|
43
|
+
for name in ('is_extended_id', 'is_fd', 'is_remote_frame', 'is_error_frame'):
|
|
44
|
+
if type(getattr(self, name)) is not bool:
|
|
45
|
+
raise TypeError(name + '需要bool')
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def required_frame_to_dict(frame):
|
|
49
|
+
"""输出固定身份字段。参数: frame为RequiredCANFrame。返回: dict。异常: TypeError。"""
|
|
50
|
+
if type(frame) is not RequiredCANFrame:
|
|
51
|
+
raise TypeError('需要RequiredCANFrame')
|
|
52
|
+
return {name: getattr(frame, name) for name in _FRAME_FIELDS}
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
@dataclass(frozen=True)
|
|
56
|
+
class RequiredDecodedFrame:
|
|
57
|
+
"""持有一次目标原序号和冻结所需值;不根据未采集的时间建立时序坐标。"""
|
|
58
|
+
|
|
59
|
+
sequence: int # 原yield序号,可有无关帧形成的间隙。
|
|
60
|
+
frame: RequiredCANFrame # 必要身份与可选时间。
|
|
61
|
+
values: Mapping[str, int | float | bool] # 缺键保持缺失,诊断非有限值保留。
|
|
62
|
+
|
|
63
|
+
def __post_init__(self):
|
|
64
|
+
"""先检查上界再复制外部Mapping。参数: 无。返回: None。异常: 类型、编码或超限错误。"""
|
|
65
|
+
_integer(self.sequence, 'sequence', maximum=(1 << 64)-1)
|
|
66
|
+
if type(self.frame) is not RequiredCANFrame or not isinstance(self.values, Mapping):
|
|
67
|
+
raise TypeError('按需记录需要RequiredCANFrame与数值Mapping')
|
|
68
|
+
# 外壳与值共用64KiB上限;复制时继续以这次精确余量防止可变Mapping扩大前缀。
|
|
69
|
+
base = _wire_tree({'op': 'item', 'request_id': self.sequence,
|
|
70
|
+
'record': {'sequence': self.sequence, 'frame': required_frame_to_dict(self.frame), 'values': {}}})
|
|
71
|
+
available = MAX_WIRE_BYTES-base+2
|
|
72
|
+
_decoded_values_size(self.values, available)
|
|
73
|
+
copied, used = {}, 2
|
|
74
|
+
for name, value in self.values.items():
|
|
75
|
+
# 外部Mapping两次遍历可变化,每个插入仍须验证;常见worker原生字典复用上界。
|
|
76
|
+
separator = 1 if copied else 0
|
|
77
|
+
used += separator + _decoded_entry_size(name, value, available-used-separator)
|
|
78
|
+
copied[name] = value
|
|
79
|
+
object.__setattr__(self, 'values', MappingProxyType(copied))
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def required_to_dict(record):
|
|
83
|
+
"""编码固定按需记录。参数: record为RequiredDecodedFrame。返回: dict。异常: 类型或值错误。"""
|
|
84
|
+
if type(record) is not RequiredDecodedFrame:
|
|
85
|
+
raise TypeError('需要RequiredDecodedFrame')
|
|
86
|
+
return {'sequence': record.sequence, 'frame': required_frame_to_dict(record.frame),
|
|
87
|
+
'values': {name: _value_to_wire(value) for name, value in record.values.items()}}
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
def required_from_dict(value):
|
|
91
|
+
"""从独立JSON树恢复按需记录。参数: value为固定dict。返回: 冻结模型。异常: 形状、类型或限额错误。"""
|
|
92
|
+
_shape(value, ('sequence', 'frame', 'values'), 'required decoded frame')
|
|
93
|
+
_wire_tree(value)
|
|
94
|
+
_shape(value['frame'], _FRAME_FIELDS, 'required CAN frame')
|
|
95
|
+
if type(value['values']) is not dict:
|
|
96
|
+
raise TypeError('required decoded values需要dict')
|
|
97
|
+
return RequiredDecodedFrame(value['sequence'], RequiredCANFrame(**value['frame']),
|
|
98
|
+
{name: _value_from_wire(item) for name, item in value['values'].items()})
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
def required_from_packet(payload):
|
|
102
|
+
"""严格解析单条按需JSON,固定模型检查代替同一树的重复通用遍历。
|
|
103
|
+
|
|
104
|
+
参数: payload为64KiB内bytes。返回: 独立冻结模型。
|
|
105
|
+
异常: UTF-8、重复键、深度、裸非有限常量或模型错误;不解任意对象标签。
|
|
106
|
+
"""
|
|
107
|
+
parsed = values = frame = None
|
|
108
|
+
try:
|
|
109
|
+
if type(payload) is not bytes or not 0 < len(payload) <= MAX_WIRE_BYTES:
|
|
110
|
+
raise ValueError('按需记录需要65536字节内bytes')
|
|
111
|
+
parsed = json.loads(payload.decode('utf-8'), object_pairs_hook=_unique_object,
|
|
112
|
+
parse_constant=_reject_constant)
|
|
113
|
+
_shape(parsed, ('sequence', 'frame', 'values'), 'required decoded frame')
|
|
114
|
+
_shape(parsed['frame'], _FRAME_FIELDS, 'required CAN frame')
|
|
115
|
+
if type(parsed['values']) is not dict:
|
|
116
|
+
raise TypeError('required decoded values需要dict')
|
|
117
|
+
frame = RequiredCANFrame(**parsed['frame'])
|
|
118
|
+
values = {name: _value_from_wire(item) for name, item in parsed['values'].items()}
|
|
119
|
+
# 所有可接受容器都是固定浅层结构;未知嵌套先拒绝,不需要再次遍历JSON树。
|
|
120
|
+
return RequiredDecodedFrame(parsed['sequence'], frame, values)
|
|
121
|
+
finally:
|
|
122
|
+
payload = parsed = values = frame = None
|
chronaxis/legacy/sum.py
ADDED
|
@@ -0,0 +1,403 @@
|
|
|
1
|
+
"""在预算内按原求值顺序累计调用方已经算好的旧口径贡献。
|
|
2
|
+
|
|
3
|
+
输入为LegacySumContribution的有限精确tuple,每项保留LegacyDecodedUpdate
|
|
4
|
+
身份并显式选择有限float贡献或跳过原因。输出为未舍入的冻结快照;本层不求
|
|
5
|
+
表达式、不再乘period/factor/dt,不把原quality推断成TTL、缓存或跳过政策。
|
|
6
|
+
legacy_policy必须由提供者明确填写,不证明完整复现ChrgInfo的旧行为。
|
|
7
|
+
|
|
8
|
+
累计器只保存一个来源的最后顺序、总数、计数及四种原因计数。每批先付新状态
|
|
9
|
+
和临时列费用,再独立核顺序及数值,本批另付的临时费用实际释放后才一次提交候选状态。
|
|
10
|
+
内部历史AnalysisRunner可明确预付一条的工作空间;本owner保持这笔费用直到close,
|
|
11
|
+
单条计算复用它,多条仅另付不足部分,不能借共享账本中其他owner的余额抵账。
|
|
12
|
+
参考路径逐项使用Python浮点加法;NumPy路径按需加载独立数组核,不共享参考
|
|
13
|
+
数值计算。输入及返回快照归调用方,本层估算不包含其已有内存或整个进程RSS。
|
|
14
|
+
本模块不读写文件、不调用旧reader/解码器;close只释放本owner的实际RAM槽。
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
# 冻结模型及候选复制只依赖标准库,数组依赖仅在明确选择且有贡献时加载。
|
|
18
|
+
from collections.abc import Mapping
|
|
19
|
+
from copy import copy
|
|
20
|
+
from dataclasses import dataclass
|
|
21
|
+
from enum import Enum
|
|
22
|
+
from math import isfinite
|
|
23
|
+
from types import MappingProxyType
|
|
24
|
+
|
|
25
|
+
from ..core.validation import require_identifier, require_text
|
|
26
|
+
from ..results.budget import ResourceBudget, _cleanup_owner, _release_owned_ram, _reserve_owned_ram
|
|
27
|
+
from ..results.errors import ResultClosedError
|
|
28
|
+
from .updates import LegacyDecodedUpdate, LegacyUpdateOrder
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class LegacySkipReason(Enum):
|
|
32
|
+
"""提供者明确选择的一次跳过原因,不由累计器根据原值或质量推断。
|
|
33
|
+
|
|
34
|
+
四个固定成员覆盖输入缺项、条件不成立、求值错误和非有限输入。
|
|
35
|
+
枚举无可变状态;原因仅解释该提供者为何未给出有限贡献,不补造旧缓存事实。
|
|
36
|
+
"""
|
|
37
|
+
|
|
38
|
+
MISSING_INPUT = "missing_input"
|
|
39
|
+
CONDITION_FALSE = "condition_false"
|
|
40
|
+
EVALUATION_ERROR = "evaluation_error"
|
|
41
|
+
NONFINITE_INPUT = "nonfinite_input"
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
# 原因域固定,内部计数tuple和公开冻结映射都保持此声明顺序及全部零项。
|
|
45
|
+
_SKIP_REASONS = tuple(LegacySkipReason)
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def _require_contribution(value: float | None, skip_reason: LegacySkipReason | None) -> None:
|
|
49
|
+
"""检查有限原生贡献与显式跳过原因互斥,不转换或修补数值。
|
|
50
|
+
|
|
51
|
+
参数: value为原生有限float或None;skip_reason为固定枚举或None。
|
|
52
|
+
返回: None;合法数值和显式跳过均保持原样。
|
|
53
|
+
异常: TypeError为类型不符;ValueError为非有限数值或贡献/原因关系矛盾。
|
|
54
|
+
"""
|
|
55
|
+
# 先限制明确的原因域;None贡献只能表示提供者已选择跳过,不能省略原因。
|
|
56
|
+
if skip_reason is not None and not isinstance(skip_reason, LegacySkipReason):
|
|
57
|
+
raise TypeError("skip_reason必须为LegacySkipReason或None")
|
|
58
|
+
if value is None:
|
|
59
|
+
if skip_reason is None:
|
|
60
|
+
raise ValueError("无贡献时必须显式提供skip_reason")
|
|
61
|
+
return
|
|
62
|
+
# int和bool即使可转float也不能隐藏提供者采用的数值政策。
|
|
63
|
+
if type(value) is not float:
|
|
64
|
+
raise TypeError("贡献必须为原生float或None")
|
|
65
|
+
if not isfinite(value):
|
|
66
|
+
raise ValueError("贡献必须为有限float;非有限输入应由提供者显式跳过")
|
|
67
|
+
if skip_reason is not None:
|
|
68
|
+
raise ValueError("有限贡献不能同时携带skip_reason")
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
@dataclass(frozen=True)
|
|
72
|
+
class LegacySumContribution:
|
|
73
|
+
"""关联一次更新身份与提供者已求出的贡献,不保存新的信号缓存。
|
|
74
|
+
|
|
75
|
+
update保留原模型对象;value是有限原生float,或与明确skip_reason配对的
|
|
76
|
+
None。即使update.quality非零,有限贡献也不由本层自动否决。该对象由调用方
|
|
77
|
+
提供,不证明旧表达式、触发门控、缺失处理或真实日志逐次出口已经接通。
|
|
78
|
+
"""
|
|
79
|
+
|
|
80
|
+
update: LegacyDecodedUpdate # 此次求值的原身份,引用保持不变。
|
|
81
|
+
value: float | None # 已计算一次的贡献,不再施加时间或单位倍率。
|
|
82
|
+
skip_reason: LegacySkipReason | None = None # 仅None贡献需要明确原因。
|
|
83
|
+
|
|
84
|
+
def __post_init__(self) -> None:
|
|
85
|
+
"""验证真实更新模型及互斥的贡献/跳过结构。
|
|
86
|
+
|
|
87
|
+
参数: 无,读取update、value和skip_reason。
|
|
88
|
+
返回: None;不复制update或修改其原值、质量。
|
|
89
|
+
异常: TypeError为非模型或数值/原因类型不符;ValueError为结构或有限性错误。
|
|
90
|
+
"""
|
|
91
|
+
# 保留已验证的原更新引用,再独立核对贡献结构,不重造或改写求值身份。
|
|
92
|
+
if not isinstance(self.update, LegacyDecodedUpdate):
|
|
93
|
+
raise TypeError("update必须为LegacyDecodedUpdate")
|
|
94
|
+
_require_contribution(self.value, self.skip_reason)
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
@dataclass(frozen=True)
|
|
98
|
+
class LegacySumSnapshot:
|
|
99
|
+
"""保存固定大小的未舍入累计事实,明确区分没有贡献与有效零和。
|
|
100
|
+
|
|
101
|
+
evaluation_count包括跳过,contribution_count只数实际加法项;四键
|
|
102
|
+
skip_counts复制冻结且始终含零项。没有求值和全部跳过分别以reason说明,
|
|
103
|
+
只有曾接收有效贡献才给float总数。快照归调用方,可在累计器关闭后保留;
|
|
104
|
+
不保存逐次列表,也不声称普通时间积分的覆盖率或旧整文件行为全等。
|
|
105
|
+
"""
|
|
106
|
+
|
|
107
|
+
session_id: str # 原会话身份。
|
|
108
|
+
source: str # 单一来源身份。
|
|
109
|
+
legacy_policy: str # 提供者显式声明的贡献及跳过政策文本。
|
|
110
|
+
value: float | None # 未舍入总数;没有有效贡献时为None。
|
|
111
|
+
evaluation_count: int # 所有已接受求值,包括跳过。
|
|
112
|
+
contribution_count: int # 实际有限贡献数量,包括值为0的项。
|
|
113
|
+
skipped_count: int # 显式跳过的求值数量。
|
|
114
|
+
skip_counts: Mapping[LegacySkipReason, int] # 固定四键的独立冻结映射。
|
|
115
|
+
reason: str | None # no_evaluations/all_skipped;有贡献时为None。
|
|
116
|
+
|
|
117
|
+
def __post_init__(self) -> None:
|
|
118
|
+
"""核对有限计数关系与空结果原因,并冻结固定四键映射。
|
|
119
|
+
|
|
120
|
+
参数: 无,读取所有快照字段。
|
|
121
|
+
返回: None;skip_counts转换成新的MappingProxyType,其他事实不改写。
|
|
122
|
+
异常: TypeError为字段类型不符;ValueError为计数、原因域或结果关系矛盾;
|
|
123
|
+
MemoryError为固定小映射分配失败,不返回部分快照。
|
|
124
|
+
"""
|
|
125
|
+
# 身份和政策仍须明确,合法的数值不能掩盖缺失的来源或政策声明。
|
|
126
|
+
require_identifier(self.session_id, "session_id")
|
|
127
|
+
require_identifier(self.source, "source")
|
|
128
|
+
require_text(self.legacy_policy, "legacy_policy")
|
|
129
|
+
# 三种计数分别非负,且求值数必须由贡献和跳过完整闭合,不能遗漏已接受项。
|
|
130
|
+
for count in (self.evaluation_count, self.contribution_count, self.skipped_count):
|
|
131
|
+
if type(count) is not int:
|
|
132
|
+
raise TypeError("快照计数必须为原生非布尔int")
|
|
133
|
+
if count < 0:
|
|
134
|
+
raise ValueError("快照计数必须非负")
|
|
135
|
+
if self.evaluation_count != self.contribution_count + self.skipped_count:
|
|
136
|
+
raise ValueError("求值数必须等于贡献数加跳过数")
|
|
137
|
+
# 固定键域不能由可变Mapping实现注入额外原因,仍独立复制调用方dict。
|
|
138
|
+
if type(self.skip_counts) not in (dict, MappingProxyType):
|
|
139
|
+
raise TypeError("skip_counts需要dict或MappingProxyType")
|
|
140
|
+
if set(self.skip_counts) != set(_SKIP_REASONS):
|
|
141
|
+
raise ValueError("skip_counts必须恰好包含四个LegacySkipReason")
|
|
142
|
+
copied = {}
|
|
143
|
+
for reason in _SKIP_REASONS:
|
|
144
|
+
count = self.skip_counts[reason]
|
|
145
|
+
if type(count) is not int:
|
|
146
|
+
raise TypeError("跳过原因计数必须为原生非布尔int")
|
|
147
|
+
if count < 0:
|
|
148
|
+
raise ValueError("跳过原因计数必须非负")
|
|
149
|
+
copied[reason] = count
|
|
150
|
+
if sum(copied.values()) != self.skipped_count:
|
|
151
|
+
raise ValueError("四种原因计数之和必须等于skipped_count")
|
|
152
|
+
# 用实际贡献数区分未求值、全跳过与有贡献,不用总数的真假判断是否为空。
|
|
153
|
+
expected_reason = None if self.contribution_count else (
|
|
154
|
+
"no_evaluations" if self.evaluation_count == 0 else "all_skipped"
|
|
155
|
+
)
|
|
156
|
+
if self.reason != expected_reason:
|
|
157
|
+
raise ValueError("快照reason与实际贡献数量不一致")
|
|
158
|
+
# 有贡献时零和也是有限结果;没有贡献时必须保留None,不能补成正常0。
|
|
159
|
+
if self.contribution_count:
|
|
160
|
+
if type(self.value) is not float:
|
|
161
|
+
raise TypeError("有贡献的快照需要原生float总数")
|
|
162
|
+
if not isfinite(self.value):
|
|
163
|
+
raise ValueError("快照总数必须有限")
|
|
164
|
+
elif self.value is not None:
|
|
165
|
+
raise ValueError("没有有效贡献时value必须为None")
|
|
166
|
+
object.__setattr__(self, "skip_counts", MappingProxyType(copied))
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
def _sum_reference(carry: float, values: tuple[float, ...]) -> float:
|
|
170
|
+
"""以独立Python浮点逐项左折叠,发现任一中间溢出立即拒绝本批。
|
|
171
|
+
|
|
172
|
+
参数: carry是此前有限总数;values是按原求值顺序选出的有限float tuple。
|
|
173
|
+
返回: float;无舍入、补偿求和或块和重排的候选总数。
|
|
174
|
+
异常: OverflowError为任一中间累计非有限;取消及内存异常原样传播。
|
|
175
|
+
"""
|
|
176
|
+
candidate = carry
|
|
177
|
+
try:
|
|
178
|
+
# 每次加法承接前一项的真实浮点尾数;逐中间值检查,禁止靠后续抵消修复溢出。
|
|
179
|
+
for value in values:
|
|
180
|
+
candidate = candidate + value
|
|
181
|
+
if not isfinite(candidate):
|
|
182
|
+
raise OverflowError("legacy_sum中间累计非有限,整批拒绝")
|
|
183
|
+
return candidate
|
|
184
|
+
finally:
|
|
185
|
+
# 异常traceback可能由调用方长期保留;不得经纯核参数保活本层选值tuple。
|
|
186
|
+
values = None
|
|
187
|
+
candidate = None
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
class LegacySumAccumulator:
|
|
191
|
+
"""拥有单来源有限累计状态和实际预算槽,不拥有调用方更新或共享账本。
|
|
192
|
+
|
|
193
|
+
_state一次保存顺序器、总数、贡献数及四原因计数。候选顺序器用copy.copy
|
|
194
|
+
复制,共享的旧状态tuple不可变;包括skip的全部记录仍检查会话和原序。
|
|
195
|
+
_fixed_cost覆盖本层有限元数据及候选重叠;_workspace_cost可预付单条工作区,
|
|
196
|
+
_batch_cost只覆盖本批超过预付容量的临时费用。三者之和为_held_cost。
|
|
197
|
+
费用清理未完成时拒绝新消费,close可按同owner重试。
|
|
198
|
+
"""
|
|
199
|
+
|
|
200
|
+
def __init__(self, budget: ResourceBudget, session_id: str, source: str, *,
|
|
201
|
+
legacy_policy: str, backend: str = "numpy", max_batch_rows: int = 64,
|
|
202
|
+
prepay_single: bool = False):
|
|
203
|
+
"""先安装责任槽、校验配置并预付费用,再建立空顺序及累计状态。
|
|
204
|
+
|
|
205
|
+
参数: budget为借用共享账本;session_id/source为固定身份;legacy_policy
|
|
206
|
+
是必填非空政策;backend为reference或numpy;max_batch_rows为正原生int;
|
|
207
|
+
prepay_single为原生bool,True时本owner构造预付4352字节单条工作区,
|
|
208
|
+
供内部历史AnalysisRunner在共享余额用尽时继续已有单条计算,不缓存贡献;
|
|
209
|
+
默认False保原批行为,多条调用仍须先预约实际所需空间的不足部分。
|
|
210
|
+
返回: 新累计器;初始无求值、无贡献,不把初始加法carry当正常结果。
|
|
211
|
+
异常: TypeError/ValueError为配置不符;预算及取消原错传播。构造清理持续
|
|
212
|
+
失败时,原异常的legacy_sum_cleanup_owner保留真实未返回owner。
|
|
213
|
+
"""
|
|
214
|
+
if not isinstance(budget, ResourceBudget):
|
|
215
|
+
raise TypeError("budget必须为ResourceBudget")
|
|
216
|
+
# 首次外部预算回调前安装全部实际费用和关闭槽,避免未返回对象失去责任。
|
|
217
|
+
self._budget = budget
|
|
218
|
+
self._held_cost = self._fixed_cost = self._workspace_cost = self._batch_cost = 0
|
|
219
|
+
self._closed = self._closing = False
|
|
220
|
+
self._state = None
|
|
221
|
+
self._session_id = self._source = self._legacy_policy = None
|
|
222
|
+
self._backend = None
|
|
223
|
+
self._max_batch_rows = 0
|
|
224
|
+
try:
|
|
225
|
+
# 先检查调用配置,避免无效来源、政策或块上限进入已付费的累计状态。
|
|
226
|
+
require_identifier(session_id, "session_id")
|
|
227
|
+
require_identifier(source, "source")
|
|
228
|
+
require_text(legacy_policy, "legacy_policy")
|
|
229
|
+
if type(backend) is not str or backend not in ("reference", "numpy"):
|
|
230
|
+
raise ValueError("backend仅支持reference或numpy")
|
|
231
|
+
if type(max_batch_rows) is not int:
|
|
232
|
+
raise TypeError("max_batch_rows必须为正原生int")
|
|
233
|
+
if max_batch_rows <= 0:
|
|
234
|
+
raise ValueError("max_batch_rows必须为正原生int")
|
|
235
|
+
if type(prepay_single) is not bool:
|
|
236
|
+
raise TypeError("prepay_single必须为原生bool")
|
|
237
|
+
# 文本计费按最多UTF-32字符及候选/快照引用余量,固定开销覆盖有限状态。
|
|
238
|
+
cost = 16384 + 8 * (len(session_id) + len(source) + len(legacy_policy))
|
|
239
|
+
_reserve_owned_ram(self, cost, "_fixed_cost")
|
|
240
|
+
# 预约前已安装独立责任槽,预约成功后取消也由本未返回owner清理。
|
|
241
|
+
# 4352沿用单条原公式4096+256,不减原估算,也不替其他owner付款。
|
|
242
|
+
if prepay_single:
|
|
243
|
+
_reserve_owned_ram(self, 4352, "_workspace_cost")
|
|
244
|
+
self._session_id, self._source, self._legacy_policy = session_id, source, legacy_policy
|
|
245
|
+
self._backend, self._max_batch_rows = backend, max_batch_rows
|
|
246
|
+
self._state = (LegacyUpdateOrder(session_id, source), 0.0, 0, (0, 0, 0, 0))
|
|
247
|
+
except BaseException as exc:
|
|
248
|
+
_cleanup_owner(self, exc, "legacy_sum_cleanup_owner", "legacy累计构造")
|
|
249
|
+
raise
|
|
250
|
+
|
|
251
|
+
@property
|
|
252
|
+
def closed(self) -> bool:
|
|
253
|
+
"""读取完全关闭事实;参数: 无;返回: bool;异常: 无。"""
|
|
254
|
+
return self._closed
|
|
255
|
+
|
|
256
|
+
def _ensure_open(self) -> None:
|
|
257
|
+
"""拒绝关闭或有待恢复费用的owner,防止新批覆盖旧责任槽。
|
|
258
|
+
|
|
259
|
+
参数: 无。返回: None。异常: ResultClosedError为已关闭或正在清理。
|
|
260
|
+
"""
|
|
261
|
+
if self._closed or self._closing:
|
|
262
|
+
raise ResultClosedError("legacy累计器已关闭或正在清理")
|
|
263
|
+
|
|
264
|
+
def _candidate(self, contributions: tuple[LegacySumContribution, ...]) -> tuple:
|
|
265
|
+
"""在已预付空间内生成独立候选,返回时不保留逐次值临时列。
|
|
266
|
+
|
|
267
|
+
参数: contributions为本批借用tuple,长度已经检查。
|
|
268
|
+
返回: tuple;新顺序器、候选总数、贡献数和四原因计数。
|
|
269
|
+
异常: TypeError/ValueError为贡献或顺序错误;OverflowError为中间累计溢出;
|
|
270
|
+
数组导入、分配或取消原样传播,原_state始终不被修改。
|
|
271
|
+
"""
|
|
272
|
+
candidate_order = skips = selected = values = None
|
|
273
|
+
try:
|
|
274
|
+
# 只复制有限顺序状态,后续accept只改候选,保留整批失败时的原顺序事实。
|
|
275
|
+
order, carry, contribution_count, previous_skips = self._state
|
|
276
|
+
candidate_order = copy(order)
|
|
277
|
+
skips = list(previous_skips)
|
|
278
|
+
selected = []
|
|
279
|
+
# 每项先核模型再推进候选,后续坏项不能让此前部分求值提前提交。
|
|
280
|
+
for contribution in contributions:
|
|
281
|
+
if not isinstance(contribution, LegacySumContribution):
|
|
282
|
+
raise TypeError("consume仅接受LegacySumContribution")
|
|
283
|
+
# 即使整批全部跳过,原更新身份和求值顺序也必须完整推进及核对。
|
|
284
|
+
candidate_order.accept(contribution.update)
|
|
285
|
+
if contribution.value is None:
|
|
286
|
+
skips[_SKIP_REASONS.index(contribution.skip_reason)] += 1
|
|
287
|
+
else:
|
|
288
|
+
selected.append(contribution.value)
|
|
289
|
+
# 不添加跳过占位0;全skip保持原carry,尚无贡献时快照仍由计数判为None。
|
|
290
|
+
if selected:
|
|
291
|
+
values = tuple(selected)
|
|
292
|
+
if self._backend == "reference":
|
|
293
|
+
carry = _sum_reference(carry, values)
|
|
294
|
+
else:
|
|
295
|
+
from .sum_numpy import sum_numpy
|
|
296
|
+
carry = sum_numpy(carry, values)
|
|
297
|
+
return candidate_order, carry, contribution_count + len(selected), tuple(skips)
|
|
298
|
+
finally:
|
|
299
|
+
# 先断开本层新建的候选、选值和原因容器;保留原输入和异常本身。
|
|
300
|
+
# 否则失败traceback会在批费用释放后继续保活这些临时副本。
|
|
301
|
+
candidate_order = skips = selected = values = None
|
|
302
|
+
|
|
303
|
+
def _release_failed_batch(self, primary: BaseException) -> None:
|
|
304
|
+
"""有限重试本批实际费用,清理副错只附注原异常,不关闭正常累计状态。
|
|
305
|
+
|
|
306
|
+
参数: primary为原校验、计算、预算或取消异常。
|
|
307
|
+
返回: None;持续未释费用设置_closing,禁止覆盖该责任槽。
|
|
308
|
+
异常: 清理错误只记notes;真正剩余费用由原异常携带的owner.close恢复。
|
|
309
|
+
"""
|
|
310
|
+
# 至多重试两次已登记费用,不无限阻塞原错;剩余责任留给显式close恢复。
|
|
311
|
+
for attempt in range(2):
|
|
312
|
+
if not self._batch_cost:
|
|
313
|
+
break
|
|
314
|
+
try:
|
|
315
|
+
_release_owned_ram(self, self._batch_cost, "_batch_cost")
|
|
316
|
+
except BaseException as cleanup:
|
|
317
|
+
primary.add_note(f"legacy批费用清理第{attempt + 1}次失败: {type(cleanup).__name__}")
|
|
318
|
+
if self._batch_cost:
|
|
319
|
+
self._closing = True
|
|
320
|
+
|
|
321
|
+
def consume(self, contributions: tuple[LegacySumContribution, ...]) -> None:
|
|
322
|
+
"""整批核验并累计,临时差额实际释放成功后才一次安装全部候选事实。
|
|
323
|
+
|
|
324
|
+
参数: contributions为精确tuple,长度不超过max_batch_rows;空tuple合法。
|
|
325
|
+
已预付单条空间时仅预约超过该自有容量的差额;默认仍预约完整本批费用。
|
|
326
|
+
返回: None;成功提交全部项,任何失败不推进原数值、计数或顺序。
|
|
327
|
+
异常: TypeError/ValueError为类型、批上限、来源或顺序;OverflowError为累计
|
|
328
|
+
非有限;ResultClosedError为关闭中。预算、导入、分配或取消原样传播并
|
|
329
|
+
附legacy_sum_cleanup_owner。清理成功后普通失败可用合法后续批恢复。
|
|
330
|
+
"""
|
|
331
|
+
self._ensure_open()
|
|
332
|
+
candidate = None
|
|
333
|
+
try:
|
|
334
|
+
# 先限定真实有限容器和批上限;空批不建立候选,也不申请无用工作区。
|
|
335
|
+
if type(contributions) is not tuple:
|
|
336
|
+
raise TypeError("consume需要精确tuple")
|
|
337
|
+
if len(contributions) > self._max_batch_rows:
|
|
338
|
+
raise ValueError("本批超过max_batch_rows")
|
|
339
|
+
if not contributions:
|
|
340
|
+
return
|
|
341
|
+
# 每项256覆盖选值list/tuple、seed/累计/有限性数组及验证临时量;固定
|
|
342
|
+
# 4096覆盖顺序器和四计数候选。输入update.values不复制也不深遍历计费。
|
|
343
|
+
extra = max(0, 4096 + len(contributions) * 256 - self._workspace_cost)
|
|
344
|
+
if extra:
|
|
345
|
+
_reserve_owned_ram(self, extra, "_batch_cost")
|
|
346
|
+
candidate = self._candidate(contributions)
|
|
347
|
+
# _candidate已退出,所有逐次临时列已丢弃;这里只保固定候选与旧状态重叠。
|
|
348
|
+
_release_owned_ram(self, self._batch_cost, "_batch_cost")
|
|
349
|
+
except BaseException as exc:
|
|
350
|
+
# 释放预算前丢弃尚未提交的固定候选,异常frame不能继续替它保留引用。
|
|
351
|
+
candidate = None
|
|
352
|
+
self._release_failed_batch(exc)
|
|
353
|
+
exc.legacy_sum_cleanup_owner = self
|
|
354
|
+
raise
|
|
355
|
+
# 提交前不再调用预算或数值代码;候选分配与临时费用收尾均已完成。
|
|
356
|
+
self._state = candidate
|
|
357
|
+
|
|
358
|
+
def snapshot(self) -> LegacySumSnapshot:
|
|
359
|
+
"""返回调用方拥有的独立冻结快照,不舍入、不封口或证明来源EOF。
|
|
360
|
+
|
|
361
|
+
参数: 无。返回: LegacySumSnapshot;四原因键始终存在,计数为0也不省略。
|
|
362
|
+
异常: ResultClosedError为关闭中;分配或取消原样传播并附真实恢复owner。
|
|
363
|
+
"""
|
|
364
|
+
self._ensure_open()
|
|
365
|
+
try:
|
|
366
|
+
order, total, contribution_count, skips = self._state
|
|
367
|
+
# 固定原因域每次都含全部零项,返回的小映射独立于内部计数tuple。
|
|
368
|
+
counts = dict(zip(_SKIP_REASONS, skips))
|
|
369
|
+
# 空结果按求值及贡献数分类,已有累计不会被后来全跳过的批次清空。
|
|
370
|
+
reason = None if contribution_count else (
|
|
371
|
+
"no_evaluations" if order.count == 0 else "all_skipped"
|
|
372
|
+
)
|
|
373
|
+
return LegacySumSnapshot(
|
|
374
|
+
self._session_id, self._source, self._legacy_policy,
|
|
375
|
+
total if contribution_count else None, order.count, contribution_count,
|
|
376
|
+
order.count - contribution_count, counts, reason,
|
|
377
|
+
)
|
|
378
|
+
except BaseException as exc:
|
|
379
|
+
exc.legacy_sum_cleanup_owner = self
|
|
380
|
+
raise
|
|
381
|
+
|
|
382
|
+
def close(self) -> None:
|
|
383
|
+
"""释放本累计器实际费用,可在释放前后取消或持续失败后重试同一owner。
|
|
384
|
+
|
|
385
|
+
参数: 无。返回: None;只有所有自有槽实际归零才closed=True,重复close无操作。
|
|
386
|
+
异常: 原预算或取消异常保持,附legacy_sum_cleanup_owner;半关闭时拒绝继续
|
|
387
|
+
consume/snapshot,不释放调用方借款,不使已返回快照失效。
|
|
388
|
+
"""
|
|
389
|
+
# 只有完全关闭才幂等返回,避免重复close再次触发预算回调或抵销借款。
|
|
390
|
+
if self._closed:
|
|
391
|
+
return
|
|
392
|
+
self._closing = True
|
|
393
|
+
# 本层无FD或子owner;先丢自有状态引用,释放后取消也不留下未计费的新状态。
|
|
394
|
+
self._state = None
|
|
395
|
+
try:
|
|
396
|
+
_release_owned_ram(self, self._batch_cost, "_batch_cost")
|
|
397
|
+
_release_owned_ram(self, self._workspace_cost, "_workspace_cost")
|
|
398
|
+
_release_owned_ram(self, self._fixed_cost, "_fixed_cost")
|
|
399
|
+
except BaseException as exc:
|
|
400
|
+
exc.legacy_sum_cleanup_owner = self
|
|
401
|
+
raise
|
|
402
|
+
self._session_id = self._source = self._legacy_policy = None
|
|
403
|
+
self._closed = True
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"""以真实NumPy前缀累计实现有限贡献块的独立原序左折叠。
|
|
2
|
+
|
|
3
|
+
输入是已校验的有限float carry和按原求值顺序排列的有限float tuple;输出为
|
|
4
|
+
未舍入候选float。把carry作为第0项,再用add.accumulate逐步相加,保留跨批
|
|
5
|
+
左结合顺序,不先求块和,不用np.sum、补偿求和、向量化Python回调或参考内核。
|
|
6
|
+
任一中间累计非有限均拒绝整批,后续抵消不能把此前溢出恢复成正常结果。
|
|
7
|
+
|
|
8
|
+
本纯数值核不保存状态、来源或费用;调用方须在调用前预留当前有限(N+1,)输入、
|
|
9
|
+
累计与有限性临时列。本模块仅在明确选择NumPy且本批有贡献时由累计器加载,
|
|
10
|
+
不读取日志、DBC或文件,不把库加载和整个进程RSS声称为本层受控内存。
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
# 数值运算独立于标准库参考路径;仅接受调用方已验证的当前有限块。
|
|
14
|
+
import numpy as np
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def sum_numpy(carry: float, values: tuple[float, ...]) -> float:
|
|
18
|
+
"""从已有carry按原顺序一次生成整列前缀累计并核查所有中间值。
|
|
19
|
+
|
|
20
|
+
参数: carry为有限原生float;values为按原序选出的有限原生float tuple,
|
|
21
|
+
本函数由预算owner在完成贡献结构与顺序校验后调用。
|
|
22
|
+
返回: float;无贡献时原carry不变,有贡献时取最后前缀,保持原浮点尾数。
|
|
23
|
+
异常: OverflowError为任何中间累计非有限;NumPy分配、导入或取消原样传播。
|
|
24
|
+
本核不提交累计器状态,费用及异常恢复由调用方管理。
|
|
25
|
+
"""
|
|
26
|
+
chain = prefixes = None
|
|
27
|
+
try:
|
|
28
|
+
if not values:
|
|
29
|
+
return carry
|
|
30
|
+
# carry放在第0项而非最终再加块和,使每一项都承接真实前缀与跨批尾数。
|
|
31
|
+
chain = np.empty(len(values) + 1, dtype=np.float64)
|
|
32
|
+
chain[0] = carry
|
|
33
|
+
chain[1:] = values
|
|
34
|
+
with np.errstate(over="ignore", invalid="ignore", under="ignore"):
|
|
35
|
+
prefixes = np.add.accumulate(chain, dtype=np.float64)
|
|
36
|
+
# 全列检查能发现中途溢出,不能只看最终值或允许后续项抵消故障。
|
|
37
|
+
if not np.all(np.isfinite(prefixes)):
|
|
38
|
+
raise OverflowError("legacy_sum中间累计非有限,整批拒绝")
|
|
39
|
+
return float(prefixes[-1])
|
|
40
|
+
finally:
|
|
41
|
+
# 异常被外部保留时也不能经本层frame保活未计费数组或选值tuple;
|
|
42
|
+
# 不改写原输入、不清除异常traceback,只断开本函数的临时引用。
|
|
43
|
+
chain = prefixes = values = None
|