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,435 @@
|
|
|
1
|
+
"""声明积分、样本/时间统计及选择行流的协议,并统一结果状态。
|
|
2
|
+
|
|
3
|
+
CalculationDefinition说明算子、整数纳秒窗口、输出单位及部分结果政策。
|
|
4
|
+
CalculationSeries保存完整时间轴、typed值、可选三值条件、真实更新标志和来源。
|
|
5
|
+
CalculationResult保存数值、状态、覆盖率、未知区间和质量原因,使正常零、
|
|
6
|
+
无法计算的None及部分结果能明确区分。
|
|
7
|
+
|
|
8
|
+
输入按零阶保持处理:每个左端值用于直到下一时间的区间,窗口左闭右开,
|
|
9
|
+
末点只提供边界,不贡献积分面积。值有效性与条件可判断性分别记录,
|
|
10
|
+
UNKNOWN(未知)不能填成FALSE,也不能以零补齐未知区间。
|
|
11
|
+
|
|
12
|
+
BOOL仅用于duration与select,ENUM仅用于保留标签的select行流。minimum_coverage
|
|
13
|
+
单独判断值、条件和请求三种覆盖是否达到门槛,不重写report/strict数值政策。
|
|
14
|
+
本模块只检查模型、推导单位并分类结果;面积、时间/样本归约和覆盖时长由
|
|
15
|
+
独立的参考与NumPy实现计算。仅依赖标准库和核心模型,不读写文件,
|
|
16
|
+
不修改调用者输入,也不保存可变全局状态。
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
# 冻结协议及默认元数据;不会持有可变任务全局状态。
|
|
20
|
+
from dataclasses import dataclass
|
|
21
|
+
# 输出数值必须有限,配置单位转换也不猜测。
|
|
22
|
+
from math import isfinite
|
|
23
|
+
# 精确静态单位因子来自已验证转换表。
|
|
24
|
+
from .units import UNIT_TABLE
|
|
25
|
+
# 已实现半开区间/来源引用结构。
|
|
26
|
+
from .models import Interval, SourceRef
|
|
27
|
+
# 标量结果仅用于typed输入协议,不共享参考计算。
|
|
28
|
+
from .numeric import ScalarValue
|
|
29
|
+
# 类型/质量严格区分,BOOL只允许TRUE时长或原值行流。
|
|
30
|
+
from .types import SignalDType as D, QualityFlag as Q
|
|
31
|
+
# 明确ID、文本与int64时间协议。
|
|
32
|
+
from .validation import require_identifier, require_text
|
|
33
|
+
# 精确时间坐标校验,不经float转换。
|
|
34
|
+
from ..timebase.conversion import require_int64_ns
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
@dataclass(frozen=True)
|
|
38
|
+
class CalculationDefinition:
|
|
39
|
+
"""声明一个指标如何计算,以及对不完整覆盖采用什么政策。
|
|
40
|
+
|
|
41
|
+
operation区分integral、明确samples/time极值与均值、BOOL duration及独立select行流。
|
|
42
|
+
window使用左闭右开的整数纳秒范围,允许零长度,但此时不能计算面积。
|
|
43
|
+
partial_policy为report时报告已核实部分,为strict时覆盖不足不返回正常值。
|
|
44
|
+
scope说明窗口属于会话、活动或片段;本类不负责寻找或绑定对应活动。
|
|
45
|
+
实例不可重新赋值,不持有计算进度。
|
|
46
|
+
minimum_coverage为0—1有限比例;只有三种覆盖均达到门槛时覆盖质量充分。
|
|
47
|
+
select输出SelectionRow迭代器,不形成CalculationResult标量或隐式单位转换。
|
|
48
|
+
"""
|
|
49
|
+
|
|
50
|
+
calculation_id: str # 当前任务指标唯一简单名称。
|
|
51
|
+
operation: str # 明确的数值/时长口径或select,select不能当作标量归约。
|
|
52
|
+
window: Interval # 请求半开ns范围,零长度允许但没有面积。
|
|
53
|
+
partial_policy: str = 'report' # report部分值,strict覆盖不足为null。
|
|
54
|
+
output_unit: str | None = None # 明确单位转换,省略时按输入推导。
|
|
55
|
+
scope: str = 'session' # 区间含义,不将上下文指标写成event指标。
|
|
56
|
+
minimum_coverage: float = 0.0 # 0—1质量门槛,不删除report可核实诊断值。
|
|
57
|
+
|
|
58
|
+
def __post_init__(self):
|
|
59
|
+
"""验证指标类型/政策/范围,不隐式选择mean口径。
|
|
60
|
+
|
|
61
|
+
参数: 无;读取当前冻结声明字段。
|
|
62
|
+
返回: None,保持原请求窗口与scope。
|
|
63
|
+
异常: TypeError/ValueError为ID/窗口/未知算子或政策。
|
|
64
|
+
"""
|
|
65
|
+
# 指标身份遵循当前简单名称规则。
|
|
66
|
+
require_identifier(self.calculation_id, 'calculation_id')
|
|
67
|
+
# 未实现算子不能仅声明名就称支持。
|
|
68
|
+
if self.operation not in ('integral', 'sample_minimum', 'sample_maximum', 'sample_mean', 'min_time', 'max_time', 'time_weighted_mean', 'duration', 'select') or not isinstance(self.window, Interval):
|
|
69
|
+
# 只有已接线口径才接受,不开放模糊mean或线性模型。
|
|
70
|
+
raise ValueError('指标需明确已实现算子及Interval')
|
|
71
|
+
# 部分政策必须显式受支持,不默认猜UNKNOWN处理。
|
|
72
|
+
if self.partial_policy not in ('report', 'strict') or self.scope not in ('session', 'event', 'segment'):
|
|
73
|
+
# 原窗口scope不会随片段合并改变。
|
|
74
|
+
raise ValueError('未知partial_policy或scope')
|
|
75
|
+
# 非空单位文本保留大小写。
|
|
76
|
+
if self.output_unit is not None:
|
|
77
|
+
# 没有静默常量映射或工程方向推断。
|
|
78
|
+
require_text(self.output_unit, 'output_unit')
|
|
79
|
+
# 覆盖门槛仅判断质量,bool不能借整数继承关系进入比例。
|
|
80
|
+
if type(self.minimum_coverage) not in (int, float) or not 0 <= self.minimum_coverage <= 1 or not isfinite(self.minimum_coverage):
|
|
81
|
+
raise ValueError('minimum_coverage需0—1有限数值')
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
@dataclass(frozen=True)
|
|
85
|
+
class CalculationSeries:
|
|
86
|
+
"""保存一段明确观测范围内的保持值,以及真实样本的证据。
|
|
87
|
+
|
|
88
|
+
times_ns严格递增并包含观测首末端;values与各标志均与时间轴等长。
|
|
89
|
+
每个values位置描述从当前时间到下一时间的左闭右开区间,末值仅是点,
|
|
90
|
+
不能贡献面积。零长度观测域只需一个边界点,不外推文件结束后的周期。
|
|
91
|
+
actual_value_updates区分真实数值依赖更新与窗口边界、有效期到期等合成边界;
|
|
92
|
+
条件单独更新不能成为数值样本。conditions保留TRUE、FALSE和UNKNOWN三值,
|
|
93
|
+
diagnostics另存依赖原因;所有值使用同一声明类型与已经归一化的unit。
|
|
94
|
+
字段均为不可变模型或元组,不修改来源,也不保存流式批次状态。
|
|
95
|
+
"""
|
|
96
|
+
|
|
97
|
+
observation: Interval # 实际连续分析域,不外推EOF。
|
|
98
|
+
times_ns: tuple[int, ...] # 严格递增,完整首/末端;零域一点。
|
|
99
|
+
values: tuple[ScalarValue, ...] # 同一dtype;BOOL用于duration/select,ENUM只用于select。
|
|
100
|
+
actual_value_updates: tuple[bool, ...] # 同长真实数值依赖更新标志。
|
|
101
|
+
unit: str # 当前分析值单位,已经归一化,不能重复DBC factor。
|
|
102
|
+
conditions: tuple[ScalarValue, ...] | None = None # 可选BOOL三值选择。
|
|
103
|
+
diagnostics: tuple[Q, ...] = () # 原依赖质量,与逻辑结果质量分开。
|
|
104
|
+
binding_identity: str = 'explicit-synthetic' # 当前输入执行身份/外部合成声明。
|
|
105
|
+
source_refs: tuple[SourceRef, ...] = () # 所有实际依赖原字段关联。
|
|
106
|
+
|
|
107
|
+
def __post_init__(self):
|
|
108
|
+
"""验证完整域、同长typed列/三值、来源与实际更新协议。
|
|
109
|
+
|
|
110
|
+
参数: 无;读取全部冻结输入。
|
|
111
|
+
返回: None;省略diagnostics时仅按输入原因生成元数据。
|
|
112
|
+
异常: TypeError/ValueError/OverflowError为结构/回退/范围/dtype。
|
|
113
|
+
"""
|
|
114
|
+
# 输入是已明确分析域和冻结列,不排序或补观测。
|
|
115
|
+
if not isinstance(self.observation, Interval) or not isinstance(self.times_ns, tuple) or not self.times_ns:
|
|
116
|
+
# 没有观测也必须明确零域和边界。
|
|
117
|
+
raise TypeError('CalculationSeries需Interval及非空tuple时间轴')
|
|
118
|
+
# 同长typed输入不能broadcast/truncate。
|
|
119
|
+
if not isinstance(self.values, tuple) or not isinstance(self.actual_value_updates, tuple) or len(self.values) != len(self.times_ns) or len(self.actual_value_updates) != len(self.times_ns):
|
|
120
|
+
# 存储错不降为UNKNOWN。
|
|
121
|
+
raise ValueError('指标时间/值/actual列必须同长tuple')
|
|
122
|
+
# 类型由算子门槛检查,BOOL/ENUM不会隐式形成面积。
|
|
123
|
+
if any(not isinstance(value, ScalarValue) for value in self.values):
|
|
124
|
+
# 无类型对象不能冒充含完整质量的逻辑值。
|
|
125
|
+
raise TypeError('指标输入需typed ScalarValue')
|
|
126
|
+
# 整列不隐式把整数提升为float。
|
|
127
|
+
if any(value.dtype is not self.values[0].dtype for value in self.values) or any(type(flag) is not bool for flag in self.actual_value_updates):
|
|
128
|
+
# 原定义dtype与实际更新布尔协议严格一致。
|
|
129
|
+
raise TypeError('指标dtype需相同且actual需bool')
|
|
130
|
+
# ENUM行流需同一标签域,不混合不同字典的相同编码。
|
|
131
|
+
if any(value.labels != self.values[0].labels for value in self.values):
|
|
132
|
+
raise ValueError('指标枚举标签域必须相同')
|
|
133
|
+
# 当前连续域首末完整,不猜缺失外部边界。
|
|
134
|
+
if self.times_ns[0] != self.observation.start_ns or self.times_ns[-1] != self.observation.end_ns:
|
|
135
|
+
# 请求范围另裁剪,不修改观测域。
|
|
136
|
+
raise ValueError('指标轴首末必须完整覆盖声明观测域')
|
|
137
|
+
# 静态时间协议逐组校验,不承担数值归约。
|
|
138
|
+
for index, time in enumerate(self.times_ns):
|
|
139
|
+
# 相邻差可由已验证Interval跨度保证安全。
|
|
140
|
+
require_int64_ns(time, 'calculation.time_ns')
|
|
141
|
+
# 同时刻原子组只提交一次,不能按顺序采样两次。
|
|
142
|
+
if index and time <= self.times_ns[index-1]:
|
|
143
|
+
# 无默默排序或同刻去重。
|
|
144
|
+
raise ValueError('指标完整时间组必须严格递增')
|
|
145
|
+
# 条件已知FALSE和未知分别typed保存。
|
|
146
|
+
if self.conditions is not None:
|
|
147
|
+
# 未知选择不能以空数组代替。
|
|
148
|
+
if not isinstance(self.conditions, tuple) or len(self.conditions) != len(self.times_ns) or any(not isinstance(value, ScalarValue) or value.dtype is not D.BOOL for value in self.conditions):
|
|
149
|
+
# 错结构属于配置错误,不是全FALSE。
|
|
150
|
+
raise TypeError('条件需同长tuple BOOL ScalarValue')
|
|
151
|
+
# 省略诊断只用原质量元数据,不检测或推算面积。
|
|
152
|
+
if not self.diagnostics:
|
|
153
|
+
# 可决定known逻辑仍需来源质量时由调用者传完整diagnostics。
|
|
154
|
+
object.__setattr__(self, 'diagnostics', tuple(value.quality | (self.conditions[index].quality if self.conditions else Q.NONE) for index, value in enumerate(self.values)))
|
|
155
|
+
# 每组原因必须是合法typed组合。
|
|
156
|
+
if not isinstance(self.diagnostics, tuple) or len(self.diagnostics) != len(self.times_ns) or any(not isinstance(q, Q) for q in self.diagnostics):
|
|
157
|
+
# 不丢掉未识别质量位。
|
|
158
|
+
raise TypeError('诊断需同长tuple QualityFlag')
|
|
159
|
+
# 单位与绑定身份是元数据,不是通用领域目录。
|
|
160
|
+
require_text(self.unit, 'calculation.unit')
|
|
161
|
+
# 当前计划可追溯,不用语法文本代替绑定。
|
|
162
|
+
require_text(self.binding_identity, 'binding_identity')
|
|
163
|
+
# 来源定位必须typed且完整保留。
|
|
164
|
+
if not isinstance(self.source_refs, tuple) or any(not isinstance(ref, SourceRef) for ref in self.source_refs):
|
|
165
|
+
# 无类型路径不可冒充实际信号来源。
|
|
166
|
+
raise TypeError('source_refs需tuple SourceRef')
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
@dataclass(frozen=True)
|
|
170
|
+
class CalculationResult:
|
|
171
|
+
"""保存指标值和解释该值所需的窗口、覆盖与质量事实。
|
|
172
|
+
|
|
173
|
+
spec保留原请求、政策和统计范围;actual_window给出与真实观测的交集。
|
|
174
|
+
所有duration字段使用整数纳秒,coverage为0—1比例,分母为零时用None。
|
|
175
|
+
value=None表示没有可核实的正常结果,与正常零值不同;status和reason
|
|
176
|
+
共同说明完整、部分或无法判断的结果。值未知和条件未知分别保存区间。
|
|
177
|
+
模型不可重新赋值,只检查事实的一致性,不修补结果或重新计算覆盖时长。
|
|
178
|
+
"""
|
|
179
|
+
|
|
180
|
+
spec: CalculationDefinition # 原请求/政策/scope不被EOF重写。
|
|
181
|
+
value: int | float | None # 正常有限结果、合法零或无法核实null。
|
|
182
|
+
unit: str # 结果单位,转换已经应用一次。
|
|
183
|
+
status: str # complete/partial/indeterminate。
|
|
184
|
+
reason: str # 明确empty_selection/no_observation等原因。
|
|
185
|
+
actual_window: Interval | None # 与真实域交集,无交集为None。
|
|
186
|
+
window_duration_ns: int # 实际观测窗口时长。
|
|
187
|
+
value_valid_duration_ns: int # 可用于本算子的正常数值时长。
|
|
188
|
+
condition_known_duration_ns: int # 条件可判断时长,无条件等于实际窗口。
|
|
189
|
+
selected_duration_ns: int # 有效值与TRUE选择交集;duration额外要求主BOOL为TRUE。
|
|
190
|
+
value_coverage: float | None # 值正常时长/实际窗口,零分母null。
|
|
191
|
+
condition_coverage: float | None # 条件已知时长/实际窗口。
|
|
192
|
+
requested_coverage: float | None # 实际窗口/请求窗口。
|
|
193
|
+
valid_sample_count: int # 真实数值更新且有效并选中的样本数。
|
|
194
|
+
value_unknown_ranges: tuple[Interval, ...] # 值不可核实范围。
|
|
195
|
+
condition_unknown_ranges: tuple[Interval, ...] # 条件未知范围,FALSE不在内。
|
|
196
|
+
quality: Q # 原依赖及计算诊断组合,不以零掩盖未知。
|
|
197
|
+
binding_identity: str # 当前完整执行输入身份。
|
|
198
|
+
source_refs: tuple[SourceRef, ...] # 当前实际原字段关联。
|
|
199
|
+
coverage_status: str = 'sufficient' # sufficient或indeterminate,区别于诊断数值和partial状态。
|
|
200
|
+
|
|
201
|
+
def __post_init__(self):
|
|
202
|
+
"""校验结果事实一致性,不能构造正常非有限或不可能覆盖。
|
|
203
|
+
|
|
204
|
+
参数: 无;读取结果字段,全部duration精确ns。
|
|
205
|
+
返回: None,不更正或补齐错误结果。
|
|
206
|
+
异常: TypeError/ValueError为模型/数值/状态/覆盖/范围矛盾。
|
|
207
|
+
"""
|
|
208
|
+
# 结果必须保留真实请求模型,scope与政策不会被重写。
|
|
209
|
+
if not isinstance(self.spec, CalculationDefinition) or not isinstance(self.quality, Q):
|
|
210
|
+
# 必须使用规定的指标定义和质量标记类型。
|
|
211
|
+
raise TypeError('指标结果需CalculationDefinition及QualityFlag')
|
|
212
|
+
# null与正常有限数值分开,bool不当统计值。
|
|
213
|
+
if self.value is not None and (type(self.value) not in (int, float) or type(self.value) is float and not isfinite(self.value)):
|
|
214
|
+
# 不接受NaN/Inf作为可用结果。
|
|
215
|
+
raise ValueError('指标结果需有限原生数值或None')
|
|
216
|
+
# 结果分类只使用已实现政策状态。
|
|
217
|
+
if self.status not in ('complete', 'partial', 'indeterminate'):
|
|
218
|
+
# 不以自由字符串掩盖未知完成状态。
|
|
219
|
+
raise ValueError('未知指标status')
|
|
220
|
+
# 最低覆盖率只给质量判断,不强制删除可核实report结果。
|
|
221
|
+
if self.coverage_status not in ('sufficient', 'indeterminate'):
|
|
222
|
+
raise ValueError('未知coverage_status')
|
|
223
|
+
# 文本元数据不能空或任意对象化。
|
|
224
|
+
require_text(self.reason, 'calculation.reason')
|
|
225
|
+
# 输出单位保留明确数学含义。
|
|
226
|
+
require_text(self.unit, 'calculation.unit')
|
|
227
|
+
# 当前真实执行身份可追溯。
|
|
228
|
+
require_text(self.binding_identity, 'binding_identity')
|
|
229
|
+
# 无观测交集为None,零域不能补周期。
|
|
230
|
+
if self.actual_window is not None and not isinstance(self.actual_window, Interval):
|
|
231
|
+
# 原请求与实际观测必须有typed范围。
|
|
232
|
+
raise TypeError('actual_window需Interval或None')
|
|
233
|
+
# 所有时长/计数是非负原生整数。
|
|
234
|
+
durations = (self.window_duration_ns, self.value_valid_duration_ns, self.condition_known_duration_ns, self.selected_duration_ns, self.valid_sample_count)
|
|
235
|
+
# 不把浮点秒数塞进ns字段。
|
|
236
|
+
if any(type(value) is not int or value < 0 for value in durations):
|
|
237
|
+
# 布尔计数也不允许。
|
|
238
|
+
raise TypeError('指标时长及计数需非负原生int')
|
|
239
|
+
# 覆盖不能超过实际观测范围。
|
|
240
|
+
if self.value_valid_duration_ns > self.window_duration_ns or self.condition_known_duration_ns > self.window_duration_ns or self.selected_duration_ns > min(self.value_valid_duration_ns, self.condition_known_duration_ns):
|
|
241
|
+
# 不自动裁剪不可信结果。
|
|
242
|
+
raise ValueError('指标覆盖时长不一致')
|
|
243
|
+
# 实际区间长度必须等于保存的观测窗口时长。
|
|
244
|
+
if self.window_duration_ns != (0 if self.actual_window is None else self.actual_window.end_ns-self.actual_window.start_ns):
|
|
245
|
+
# 没有观测不能声称正覆盖。
|
|
246
|
+
raise ValueError('actual_window与window_duration矛盾')
|
|
247
|
+
# 比例为有限0—1或明确零分母null。
|
|
248
|
+
for coverage in (self.value_coverage, self.condition_coverage, self.requested_coverage):
|
|
249
|
+
# 不用NaN代表零分母。
|
|
250
|
+
if coverage is not None and (type(coverage) is not float or not isfinite(coverage) or not 0 <= coverage <= 1):
|
|
251
|
+
# 正常JSON结果可无歧义表达。
|
|
252
|
+
raise ValueError('coverage需0—1有限float或None')
|
|
253
|
+
# 诊断范围与来源必须保持冻结typed结构。
|
|
254
|
+
if any(not isinstance(ranges, tuple) or any(not isinstance(interval, Interval) for interval in ranges) for ranges in (self.value_unknown_ranges, self.condition_unknown_ranges)):
|
|
255
|
+
# 未知不以自由字符串或被吞空数组代替。
|
|
256
|
+
raise TypeError('未知范围需tuple Interval')
|
|
257
|
+
# 原字段身份不可被自由路径文本冒充。
|
|
258
|
+
if not isinstance(self.source_refs, tuple) or any(not isinstance(ref, SourceRef) for ref in self.source_refs):
|
|
259
|
+
# 不从另一个运行全局对象继承来源。
|
|
260
|
+
raise TypeError('结果来源需tuple SourceRef')
|
|
261
|
+
|
|
262
|
+
|
|
263
|
+
def calculation_unit(spec, input_unit):
|
|
264
|
+
"""根据算子和输入单位推导结果单位,并给出一次输出转换因子。
|
|
265
|
+
|
|
266
|
+
参数:
|
|
267
|
+
spec: CalculationDefinition,提供算子和可选output_unit;input_unit为当前分析值单位。
|
|
268
|
+
返回:
|
|
269
|
+
(unit, factor)元组。unit为输出标签,factor为最终结果需乘的float因子。
|
|
270
|
+
积分按秒累计;未注册单位保留input_unit + '*s',不猜测工程意义。
|
|
271
|
+
异常:
|
|
272
|
+
ValueError: 要求的单位不在同一已知维度,转换未注册或因子非有限。
|
|
273
|
+
边界:
|
|
274
|
+
例如功率积分推导能量单位;输入工程单位已由上游完成转换,本函数
|
|
275
|
+
不重复DBC缩放。转换仅在最终结果处应用一次,方向符号不在这里推断。
|
|
276
|
+
"""
|
|
277
|
+
# 零阶保持积分将区间值乘以时长(秒),常见结果单位按数学维度推导。
|
|
278
|
+
base = input_unit
|
|
279
|
+
# 输入单位已是分析值单位;乘秒的维度转换不重复输入factor。
|
|
280
|
+
input_factor = 1.0
|
|
281
|
+
# TRUE时长只输出秒,布尔值不能借数值单位转换形成电量或面积。
|
|
282
|
+
if spec.operation == 'duration':
|
|
283
|
+
if input_unit != '1' or spec.output_unit not in (None, 's'):
|
|
284
|
+
raise ValueError('duration需无量纲BOOL输入及s输出')
|
|
285
|
+
return 's', 1.0
|
|
286
|
+
# 积分仅对已注册类别推导,其他保留明确乘秒标签。
|
|
287
|
+
if spec.operation == 'integral':
|
|
288
|
+
# 已核实power/current/dimensionless类别的基准面积单位。
|
|
289
|
+
category = UNIT_TABLE[input_unit][0] if input_unit in UNIT_TABLE else None
|
|
290
|
+
# 同类别明确单位因子来自静态Fraction表,不凭文本前缀猜测。
|
|
291
|
+
base = {'power': 'J', 'current': 'A·s', 'dimensionless': 's'}.get(category, input_unit + '*s')
|
|
292
|
+
# 只有已推导的数学类别需要乘基准倍率。
|
|
293
|
+
if category in ('power', 'current', 'dimensionless'):
|
|
294
|
+
# 例如kW*s→J为1000,不是再对原行重复DBC缩放。
|
|
295
|
+
input_factor = float(UNIT_TABLE[input_unit][1])
|
|
296
|
+
# 缺省按声明维度输出,不猜Ah或充放电名称。
|
|
297
|
+
target = spec.output_unit if spec.output_unit is not None else base
|
|
298
|
+
# 相同单位没有多余转换。
|
|
299
|
+
if target == base:
|
|
300
|
+
# 不重复旧DBC缩放。
|
|
301
|
+
return target, input_factor
|
|
302
|
+
# 已知维度才能转换,未知文本不当已核实单位。
|
|
303
|
+
if base not in UNIT_TABLE or target not in UNIT_TABLE or UNIT_TABLE[base][0] != UNIT_TABLE[target][0]:
|
|
304
|
+
# 不静默猜测输入已经积分或单位前缀。
|
|
305
|
+
raise ValueError(f'指标单位不能明确转换:{base}→{target}')
|
|
306
|
+
# 静态Fraction比例只做显式配置转换。
|
|
307
|
+
factor = input_factor * float(UNIT_TABLE[base][1] / UNIT_TABLE[target][1])
|
|
308
|
+
# 配置因子也必须正常有限。
|
|
309
|
+
if not isfinite(factor):
|
|
310
|
+
# 不让坏配置进入数值UNKNOWN。
|
|
311
|
+
raise ValueError('指标单位转换非有限')
|
|
312
|
+
# 输出转换仅在最终值处一次应用。
|
|
313
|
+
return target, factor
|
|
314
|
+
|
|
315
|
+
|
|
316
|
+
def merge_ranges(ranges):
|
|
317
|
+
"""合并同一种未知证据的相邻区间,仅用于诊断序列化。
|
|
318
|
+
|
|
319
|
+
参数: 已排序正Interval序列,不是真实Event序列。
|
|
320
|
+
返回: Interval tuple,不修改原活动/条件或填平已知缺口。
|
|
321
|
+
异常: 模型错误传播,无数值分析副作用。
|
|
322
|
+
"""
|
|
323
|
+
# 原未知边界完整保留,不跨known缺口。
|
|
324
|
+
result = []
|
|
325
|
+
# 此循环处理输出诊断区间,不是NumPy数值内核。
|
|
326
|
+
for interval in ranges:
|
|
327
|
+
# 只同类相邻未知范围可紧凑表示。
|
|
328
|
+
if result and result[-1].end_ns == interval.start_ns:
|
|
329
|
+
# 不改变选中集或真实活动边界。
|
|
330
|
+
result[-1] = Interval(result[-1].start_ns, interval.end_ns)
|
|
331
|
+
else:
|
|
332
|
+
# 中间有已知部分时必须保留独立范围。
|
|
333
|
+
result.append(interval)
|
|
334
|
+
# 不返回可变内部诊断列表。
|
|
335
|
+
return tuple(result)
|
|
336
|
+
|
|
337
|
+
|
|
338
|
+
def classify_calculation_value(spec, value, observed_duration_ns, known_duration_ns, selected_duration_ns,
|
|
339
|
+
selected_unknown_duration_ns, *, all_false=False, calculation_failed=False):
|
|
340
|
+
"""按既有政策分类数值,供完整结果和精简内部结果共用。
|
|
341
|
+
|
|
342
|
+
参数: spec为已校验请求;各时长参数均为实际覆盖整数纳秒,value为候选值;
|
|
343
|
+
all_false表示完整已知空选择,calculation_failed表示数值归约失败。
|
|
344
|
+
返回: (value, status, reason)。异常: 内部参数错误原样传播;不构造范围或追溯记录。
|
|
345
|
+
"""
|
|
346
|
+
# 请求窗口不随EOF裁剪重写。
|
|
347
|
+
requested_duration_ns = spec.window.end_ns - spec.window.start_ns
|
|
348
|
+
# 无交集明确0,零长度actual仍不是充分观测非零选择。
|
|
349
|
+
# 必要条件未知、选中值未知或请求被裁剪均为不完整。
|
|
350
|
+
incomplete = known_duration_ns < observed_duration_ns or selected_unknown_duration_ns > 0 or observed_duration_ns < requested_duration_ns
|
|
351
|
+
# 正常候选值与结果状态由覆盖政策一起解释。
|
|
352
|
+
status, reason = 'complete', 'ok'
|
|
353
|
+
# 零请求不能借全FALSE返回正常0。
|
|
354
|
+
if requested_duration_ns == 0:
|
|
355
|
+
# 无面积与无选择充分观测严格分开。
|
|
356
|
+
value, status, reason = None, 'indeterminate', 'zero_length_window'
|
|
357
|
+
# 有请求但没有实际连续观测。
|
|
358
|
+
elif observed_duration_ns == 0:
|
|
359
|
+
# 不把空数组sum的0当真值。
|
|
360
|
+
value, status, reason = None, 'indeterminate', 'no_observation'
|
|
361
|
+
# 非有限归约/转换不能报正常结果。
|
|
362
|
+
elif calculation_failed:
|
|
363
|
+
# 保留覆盖/原因,但数值不能使用。
|
|
364
|
+
value, status, reason = None, 'indeterminate', 'calculation_failed'
|
|
365
|
+
# 完整观测且条件始终为FALSE时,积分为零,样本统计保留None。
|
|
366
|
+
elif all_false and observed_duration_ns == requested_duration_ns:
|
|
367
|
+
# 输入数值无效诊断仍保留,不是结果需要的选中值未知。
|
|
368
|
+
value, reason = (0.0, 'empty_selection') if spec.operation in ('integral', 'duration') else (None, 'empty_selection')
|
|
369
|
+
# 没有可核实选中数据,不区分真假补零。
|
|
370
|
+
elif value is None:
|
|
371
|
+
# 已知无样本/全未知/条件未知原因明确。
|
|
372
|
+
status, reason = 'indeterminate', 'unknown_selection' if known_duration_ns < observed_duration_ns else 'no_samples' if spec.operation != 'integral' and selected_duration_ns > 0 else 'no_valid_selected_data'
|
|
373
|
+
# 有候选部分值仍按政策附明确状态。
|
|
374
|
+
elif incomplete:
|
|
375
|
+
# strict不返回部分正常值,但事实覆盖照常保存。
|
|
376
|
+
status, reason = ('indeterminate', 'insufficient_coverage') if spec.partial_policy == 'strict' else ('partial', 'partial_coverage')
|
|
377
|
+
# report保留已核实部分面积/样本统计。
|
|
378
|
+
if spec.partial_policy == 'strict':
|
|
379
|
+
# 不用零填补unknown或EOF外时间。
|
|
380
|
+
value = None
|
|
381
|
+
return value, status, reason
|
|
382
|
+
|
|
383
|
+
|
|
384
|
+
def classify_coverage(spec,observed_duration_ns,value_duration_ns,known_duration_ns):
|
|
385
|
+
"""只在请求门槛时判断三种真实覆盖,不影响report/strict的数值政策。
|
|
386
|
+
|
|
387
|
+
参数: spec及已有实际范围/有效/已知时长。返回: sufficient或indeterminate。
|
|
388
|
+
异常: 无主动异常;内部量由各数值核独立求得,不构造区间明细。
|
|
389
|
+
"""
|
|
390
|
+
requested_duration_ns=spec.window.end_ns-spec.window.start_ns
|
|
391
|
+
ratios=(value_duration_ns/observed_duration_ns if observed_duration_ns else None,
|
|
392
|
+
known_duration_ns/observed_duration_ns if observed_duration_ns else None,observed_duration_ns/requested_duration_ns if requested_duration_ns else None)
|
|
393
|
+
return 'sufficient' if all(value is not None and value>=spec.minimum_coverage for value in ratios) else 'indeterminate'
|
|
394
|
+
|
|
395
|
+
|
|
396
|
+
def make_calculation_result(spec, series, value, unit, actual, value_duration_ns, known_duration_ns, selected_duration_ns,
|
|
397
|
+
selected_unknown_duration_ns, sample_count, value_unknown, condition_unknown, quality,
|
|
398
|
+
*, all_false=False, calculation_failed=False):
|
|
399
|
+
"""把独立计算的数值与覆盖事实归类,生成可追溯指标结果。
|
|
400
|
+
|
|
401
|
+
参数:
|
|
402
|
+
spec、series: 当前请求和输入;value为候选值,unit为结果单位。
|
|
403
|
+
actual: 请求与观测范围的交集,无交集时为None。
|
|
404
|
+
value_duration_ns、known_duration_ns、selected_duration_ns: 值有效、条件已知、
|
|
405
|
+
有效值与TRUE选择相交的时长,均为整数纳秒;时长计算还要求主BOOL为TRUE。
|
|
406
|
+
selected_unknown_duration_ns: 条件TRUE但值未知的时长,单位为纳秒。
|
|
407
|
+
sample_count: 已选真实有效样本数;value_unknown、condition_unknown为未知区间。
|
|
408
|
+
quality: 完整质量原因;all_false默认False,表示是否已有全程FALSE证据。
|
|
409
|
+
calculation_failed: 默认False,表示归约或输出转换是否失败。
|
|
410
|
+
返回:
|
|
411
|
+
CalculationResult,保留覆盖、来源与原因。完整观测且全程FALSE时积分为零,
|
|
412
|
+
空选择的样本统计为None;其他缺失情形不能据空归约推断正常零。
|
|
413
|
+
异常:
|
|
414
|
+
输出事实不满足CalculationResult要求时传播模型的TypeError或ValueError。
|
|
415
|
+
流程:
|
|
416
|
+
先判断零窗口、无观测和计算失败,再处理空选择与未知数据;
|
|
417
|
+
有部分候选值时,report保留并标partial,strict清为None。
|
|
418
|
+
本函数不计算积分或样本归约,各时长和候选值由调用者独立计算。
|
|
419
|
+
"""
|
|
420
|
+
# 与精简内部结果共享分类;只有本完整结果入口继续构造覆盖明细。
|
|
421
|
+
requested_duration_ns = spec.window.end_ns - spec.window.start_ns
|
|
422
|
+
observed_duration_ns = 0 if actual is None else actual.end_ns - actual.start_ns
|
|
423
|
+
value, status, reason = classify_calculation_value(spec, value, observed_duration_ns, known_duration_ns,
|
|
424
|
+
selected_duration_ns, selected_unknown_duration_ns, all_false=all_false, calculation_failed=calculation_failed)
|
|
425
|
+
# 三种既定覆盖率同时满足质量门槛才充分;零分母保持无法判断。
|
|
426
|
+
coverages = (value_duration_ns / observed_duration_ns if observed_duration_ns else None,
|
|
427
|
+
known_duration_ns / observed_duration_ns if observed_duration_ns else None,
|
|
428
|
+
observed_duration_ns / requested_duration_ns if requested_duration_ns else None)
|
|
429
|
+
coverage_status = 'sufficient' if all(item is not None and item >= spec.minimum_coverage for item in coverages) else 'indeterminate'
|
|
430
|
+
# 最低门槛不改动以上数值政策或事实时长。
|
|
431
|
+
return CalculationResult(spec, value, unit, status, reason, actual, observed_duration_ns, value_duration_ns, known_duration_ns,
|
|
432
|
+
selected_duration_ns, value_duration_ns / observed_duration_ns if observed_duration_ns else None,
|
|
433
|
+
known_duration_ns / observed_duration_ns if observed_duration_ns else None, observed_duration_ns / requested_duration_ns if requested_duration_ns else None,
|
|
434
|
+
sample_count, merge_ranges(value_unknown), merge_ranges(condition_unknown), quality,
|
|
435
|
+
series.binding_identity, series.source_refs, coverage_status)
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
"""把已有内存行的表达式与三值条件接入NumPy指标计算。
|
|
2
|
+
|
|
3
|
+
输入为当前表达式、CalculationDefinition和可选BOOL条件,输出CalculationSeries
|
|
4
|
+
或CalculationResult。先按依赖列独立归一化,用searchsorted定位最近观测并按
|
|
5
|
+
有效期保持,再批量求值、计算零阶保持面积或真实样本统计。
|
|
6
|
+
时间统计和BOOL duration接同一独立数组链;select保留枚举标签及UNKNOWN诊断,
|
|
7
|
+
返回SelectionRow迭代器,完整输入和中间列仍占用内存。
|
|
8
|
+
|
|
9
|
+
共同时间轴为int64纳秒列,形状(N,);数值、条件、质量与真实更新标志
|
|
10
|
+
均与之等长。窗口和有效期边界不能伪造样本,条件单独更新也不计数值样本。
|
|
11
|
+
打包ScalarValue只是恢复结果模型,实际数值由数组计算承担,不调用参考内核。
|
|
12
|
+
|
|
13
|
+
依赖NumPy及数组转换、对齐、表达式和指标模块;只共享静态计划检查。
|
|
14
|
+
不修改原输入,也不调用旧读取、解码或写出链。此入口保存完整内存历史
|
|
15
|
+
及中间列,不承诺生产内存或磁盘预算,性能效果需要另行测量。
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
# 数组shape/UFUNC由实际NumPy执行。
|
|
19
|
+
import numpy as np
|
|
20
|
+
# 整列表达式独立解释,不逐样本参考调用。
|
|
21
|
+
from .expression_numpy import evaluate_numpy
|
|
22
|
+
# 当前协议与独立真正数组指标内核。
|
|
23
|
+
from .calculations import CalculationSeries
|
|
24
|
+
# 数值覆盖/面积/样本归约不共享参考实现。
|
|
25
|
+
from .calculations_numpy import compute_numpy, select_numpy
|
|
26
|
+
# 只共享静态计划/绑定/依赖校验。
|
|
27
|
+
from .calculations_memory_reference import require_calculation_plan
|
|
28
|
+
# 当前实际域严格半开。
|
|
29
|
+
from .models import Interval
|
|
30
|
+
# 独立数组原行规范化。
|
|
31
|
+
from .normalize_numpy import memory_series_numpy
|
|
32
|
+
# ScalarValue用于结果协议装箱,不执行参考运算。
|
|
33
|
+
from .numeric import ScalarValue
|
|
34
|
+
# 物理数值列保留有效性/质量/enum域。
|
|
35
|
+
from .numeric_numpy import NumericArray
|
|
36
|
+
# 时间轴协议可共享,数组保持独立执行。
|
|
37
|
+
from .state import common_timeline
|
|
38
|
+
# 明确searchsorted/质量掩码内核,不借参考保持。
|
|
39
|
+
from .state_numpy import align_numpy, build_signal_array
|
|
40
|
+
# 原因包装与数据类型明确。
|
|
41
|
+
from .types import QualityFlag as Q
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def build_calculation_series_numpy(compiled, spec, *, condition=None):
|
|
45
|
+
"""把原行对齐到共同时间轴,批量求值并标记真实数值更新。
|
|
46
|
+
|
|
47
|
+
参数:
|
|
48
|
+
compiled: 当前已校验表达式,类型与spec算子匹配;spec为明确窗口与指标请求。
|
|
49
|
+
condition: 可选同绑定身份的BOOL表达式,省略表示不按条件筛选。
|
|
50
|
+
返回:
|
|
51
|
+
CalculationSeries。所有列使用形状(N,)的共同纳秒轴,真实更新标志只来自
|
|
52
|
+
数值依赖。恢复ScalarValue的逐位置循环只打包类型和质量,不执行数值运算。
|
|
53
|
+
异常:
|
|
54
|
+
绑定、时间、类型、形状或同步检查失败时传播底层异常。
|
|
55
|
+
流程:
|
|
56
|
+
独立归一化各依赖列,加入域内窗口边界,对齐后整列计算数值与条件。
|
|
57
|
+
输出模型复制并冻结本次结果,保留完整历史,不广播或额外读取旧链。
|
|
58
|
+
"""
|
|
59
|
+
# 静态当前输入门槛,无参考数值调用。
|
|
60
|
+
names = require_calculation_plan(compiled, spec, condition)
|
|
61
|
+
# 实际独立原行转换,只读现有内存输出。
|
|
62
|
+
histories = {name: memory_series_numpy(compiled.bindings, name) for name in names}
|
|
63
|
+
# 每列typed存储一次,不合并不同dtype为object宽表。
|
|
64
|
+
arrays = {name: build_signal_array(history) for name, history in histories.items()}
|
|
65
|
+
# 当前会话实际范围与请求区分,EOF外没有假数据。
|
|
66
|
+
session = compiled.bindings.session
|
|
67
|
+
# 域内窗口端点纳入积分轴,但不能当真实样本。
|
|
68
|
+
boundaries = tuple(time for time in (spec.window.start_ns, spec.window.end_ns) if session.domain_start_ns <= time <= session.domain_end_ns)
|
|
69
|
+
# 共同轴仅在分析层建立,不重新安排原文件/旧读取。
|
|
70
|
+
times = common_timeline(tuple(histories.values()), boundaries) if histories else tuple(sorted({session.domain_start_ns, session.domain_end_ns, *boundaries}))
|
|
71
|
+
# 绝对时间精确int64,不先float舍入。
|
|
72
|
+
axis = np.array(times, dtype=np.int64)
|
|
73
|
+
# 当前全列保持/searchsorted/TTL独立于标量参考。
|
|
74
|
+
aligned = {name: align_numpy(array, axis) for name, array in arrays.items()}
|
|
75
|
+
# 依赖列dtype/质量/enum标签必须同当前绑定。
|
|
76
|
+
context = {name: NumericArray(compiled.bindings.resolve(name).dtype, states.values, states.valid, states.quality, arrays[name].labels) for name, states in aligned.items()}
|
|
77
|
+
# 数值表达式的精确依赖鍵,全部shape相同。
|
|
78
|
+
numeric = evaluate_numpy(compiled, {name: context[name] for name in compiled.dependencies}, compiled.bindings, size=len(times))
|
|
79
|
+
# 只有明确布尔条件才执行选择,空条件不同于UNKNOWN。
|
|
80
|
+
selected = evaluate_numpy(condition, {name: context[name] for name in condition.dependencies}, compiled.bindings, size=len(times)) if condition is not None else None
|
|
81
|
+
# 样本标志只来自当前数值依赖更新,不包括条件独自更新。
|
|
82
|
+
actual = np.zeros(len(times), dtype=bool)
|
|
83
|
+
# 静态依赖列循环,所有样本标志整列OR。
|
|
84
|
+
for name in compiled.dependencies:
|
|
85
|
+
# 合并同时刻原子依赖组,不按逐字段顺序产生样本。
|
|
86
|
+
actual |= aligned[name].actual_update
|
|
87
|
+
# typed装箱仅恢复输出模型,invalid占位不成为正常0。
|
|
88
|
+
# ENUM物理列保存整数码;公开行恢复标签字符串,invalid仍为None并保留标签域。
|
|
89
|
+
values = tuple(ScalarValue((numeric.value.labels[int(numeric.value.values[index])] if numeric.value.labels else numeric.value.values[index].item())
|
|
90
|
+
if numeric.value.valid[index] else None, numeric.value.dtype, bool(numeric.value.valid[index]),
|
|
91
|
+
Q(int(numeric.value.quality[index])), numeric.value.labels) for index in range(len(times)))
|
|
92
|
+
# 三值条件结果与数值独立,未知保留quality/None。
|
|
93
|
+
conditions = None if selected is None else tuple(ScalarValue(selected.value.values[index].item() if selected.value.valid[index] else None,
|
|
94
|
+
selected.value.dtype, bool(selected.value.valid[index]), Q(int(selected.value.quality[index]))) for index in range(len(times)))
|
|
95
|
+
# 条件已能判定时也保留原依赖诊断,使被逻辑结果遮蔽的异常仍可追溯。
|
|
96
|
+
diagnostic = numeric.dependency_quality if selected is None else numeric.dependency_quality | selected.dependency_quality
|
|
97
|
+
# 当前数值/选择完整执行身份,不缓存上次任务值。
|
|
98
|
+
identity = compiled.identity + ('' if condition is None else ':' + condition.identity)
|
|
99
|
+
# 所有原字段可追溯,名称声明不冒充绑定。
|
|
100
|
+
refs = tuple(compiled.bindings.source_ref(name) for name in names)
|
|
101
|
+
# 冻结协议会校验同长/完整域/类型,不截断。
|
|
102
|
+
return CalculationSeries(Interval(session.domain_start_ns, session.domain_end_ns), times, values, tuple(bool(flag) for flag in actual),
|
|
103
|
+
compiled.root.unit, conditions, tuple(Q(int(q)) for q in diagnostic), identity, refs)
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
def select_memory_numpy(compiled, spec, *, condition=None):
|
|
107
|
+
"""用独立数组原行、保持和表达式链返回选择行迭代器。
|
|
108
|
+
|
|
109
|
+
参数: compiled当前表达式;spec为select;condition可选同绑定BOOL表达式。
|
|
110
|
+
返回: SelectionRow迭代器;值、标签与未知诊断完整保留。
|
|
111
|
+
异常: 输入、绑定或表达式错误传播;筛选配置错误在消费时传播。
|
|
112
|
+
边界: 完整输入/中间数组占用内存,输出不攒列表,不改旧I/O或原输入。
|
|
113
|
+
"""
|
|
114
|
+
# 全链使用数组归一化、保持与表达式;未调用参考数值。
|
|
115
|
+
series = build_calculation_series_numpy(compiled, spec, condition=condition)
|
|
116
|
+
return select_numpy(series, spec)
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
def compute_memory_numpy(compiled, spec, *, condition=None):
|
|
120
|
+
"""从已有内存行执行数组表达式及指标计算,返回可追溯结果。
|
|
121
|
+
|
|
122
|
+
参数:
|
|
123
|
+
compiled: 当前表达式;spec为数值统计或BOOL duration的CalculationDefinition。
|
|
124
|
+
condition: 可选同绑定身份的BOOL表达式。
|
|
125
|
+
返回:
|
|
126
|
+
CalculationResult,保存面积、时间/样本统计或TRUE时长,以及覆盖、未知范围与来源。
|
|
127
|
+
异常:
|
|
128
|
+
配置、输入或数值模型不满足要求时传播底层异常,不静默删数据或补零。
|
|
129
|
+
流程:
|
|
130
|
+
先用数组转换、对齐和表达式生成CalculationSeries,再调用独立数组指标内核。
|
|
131
|
+
只创建本次结果,不修改原行,也不调用参考数值计算。
|
|
132
|
+
"""
|
|
133
|
+
# 原行到typed指标列由独立数组链执行。
|
|
134
|
+
series = build_calculation_series_numpy(compiled, spec, condition=condition)
|
|
135
|
+
# 实际掩码/UFUNC/归约内核,不调用参考compute。
|
|
136
|
+
return compute_numpy(series, spec)
|