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,146 @@
|
|
|
1
|
+
"""声明有限条件积分项及值、条件各自的覆盖事实,不执行数值计算。
|
|
2
|
+
|
|
3
|
+
条件为BOOL三值:TRUE且值可核实才产生面积,FALSE属于已知未选择,UNKNOWN
|
|
4
|
+
不是FALSE。两种未知区间分别划分实际窗口,真实样本只计有效值更新且条件TRUE。
|
|
5
|
+
ReferenceConditionalIntegralTerms保留原序面积与显式有效掩码,面积单位仍为
|
|
6
|
+
原输入单位乘秒;不在块内归约或转换最终单位,空归约不代表正常零。
|
|
7
|
+
本模块只校验冻结模型和公共输入门槛,不读文件、不改输入,也不申请预算;
|
|
8
|
+
有限临时列和事实须由调用方owner事先预约,独立留存须另行计费。
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
# 冻结协议与范围检查只依赖标准库;两面积核仅共享非数值输入门槛。
|
|
12
|
+
from dataclasses import dataclass
|
|
13
|
+
from math import isfinite
|
|
14
|
+
from .calculations import CalculationDefinition, CalculationSeries, calculation_unit
|
|
15
|
+
from .models import Interval, SourceRef
|
|
16
|
+
from .types import QualityFlag as Q, SignalDType as D
|
|
17
|
+
from .validation import require_text
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def _unknown_duration(ranges, actual):
|
|
21
|
+
"""校验一种未知范围完整有序、不重叠且不越过实际窗口。
|
|
22
|
+
|
|
23
|
+
参数: ranges为冻结Interval tuple,actual为实际交集或None。
|
|
24
|
+
返回: 原生int纳秒未知总时长。异常: TypeError/ValueError为结构或不可能范围。
|
|
25
|
+
"""
|
|
26
|
+
if type(ranges) is not tuple:
|
|
27
|
+
raise TypeError('条件积分未知范围需要tuple')
|
|
28
|
+
cursor, total = (actual.start_ns if actual is not None else 0), 0
|
|
29
|
+
# 只验证诊断几何,不能按总长度掩盖重复区间或已知缺口。
|
|
30
|
+
for item in ranges:
|
|
31
|
+
if (not isinstance(item, Interval) or actual is None or item.start_ns < cursor
|
|
32
|
+
or item.start_ns >= item.end_ns or item.end_ns > actual.end_ns):
|
|
33
|
+
raise ValueError('条件积分未知范围必须有序、不重叠且在实际窗口内')
|
|
34
|
+
cursor, total = item.end_ns, total + item.end_ns - item.start_ns
|
|
35
|
+
return total
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
@dataclass(frozen=True)
|
|
39
|
+
class ConditionalIntegralFacts:
|
|
40
|
+
"""保存当前块原请求与完整覆盖,值缺失和条件未知分别说明。
|
|
41
|
+
|
|
42
|
+
known包含TRUE和FALSE;selected只计TRUE且面积可核实的时长。
|
|
43
|
+
selected_value_unknown只计TRUE而值/面积不可核实的时长,不混入条件UNKNOWN。
|
|
44
|
+
FALSE不乘面积,原值的类型和精度检查仍保留在值覆盖及质量中。
|
|
45
|
+
"""
|
|
46
|
+
|
|
47
|
+
spec: CalculationDefinition # 原integral请求、scope和部分结果政策。
|
|
48
|
+
actual_window: Interval | None # 当前实际交集,不外推EOF。
|
|
49
|
+
value_valid_duration_ns: int # 原值经积分可用性检查后的有效时长。
|
|
50
|
+
condition_known_duration_ns: int # 可判断TRUE或FALSE的时长。
|
|
51
|
+
selected_duration_ns: int # TRUE且值/面积可核实的时长。
|
|
52
|
+
selected_value_unknown_duration_ns: int # TRUE但值/面积不可核实的时长。
|
|
53
|
+
false_duration_ns: int # 已知FALSE时长,只有完整窗才证明空选择零。
|
|
54
|
+
valid_sample_count: int # 半开当前块内原值真实更新且有效/TRUE的数量。
|
|
55
|
+
value_unknown_ranges: tuple[Interval, ...] # 值及面积计算不可核实的正区间。
|
|
56
|
+
condition_unknown_ranges: tuple[Interval, ...] # BOOL UNKNOWN正区间,与值未知独立。
|
|
57
|
+
quality: Q # 输入、依赖和精度/面积故障原因完整OR。
|
|
58
|
+
input_unit: str # 原输入工程单位,面积尚未转换输出单位。
|
|
59
|
+
binding_identity: str # 实际联合输入中原值表达式身份。
|
|
60
|
+
source_refs: tuple[SourceRef, ...] # 完整来源子类与原定位,不只保存字段名。
|
|
61
|
+
ranges_retained: bool = True # 仅明确请求时保留未知范围;False不能用于完整明细归约。
|
|
62
|
+
|
|
63
|
+
def __post_init__(self):
|
|
64
|
+
"""验证两完整分区、选中与FALSE恒等式,不修复矛盾事实。
|
|
65
|
+
|
|
66
|
+
参数: 无。返回: None。异常: TypeError/ValueError为类型、覆盖或未知几何错误。
|
|
67
|
+
"""
|
|
68
|
+
if not isinstance(self.spec, CalculationDefinition) or self.spec.operation != 'integral':
|
|
69
|
+
raise TypeError('条件积分事实需要integral CalculationDefinition')
|
|
70
|
+
if self.actual_window is not None and not isinstance(self.actual_window, Interval):
|
|
71
|
+
raise TypeError('条件积分实际范围需要Interval或None')
|
|
72
|
+
actual, request = self.actual_window, self.spec.window
|
|
73
|
+
span = 0 if actual is None else actual.end_ns - actual.start_ns
|
|
74
|
+
if actual is not None and not request.start_ns <= actual.start_ns <= actual.end_ns <= request.end_ns:
|
|
75
|
+
raise ValueError('条件积分实际范围越过原请求')
|
|
76
|
+
durations = (self.value_valid_duration_ns, self.condition_known_duration_ns, self.selected_duration_ns,
|
|
77
|
+
self.selected_value_unknown_duration_ns, self.false_duration_ns)
|
|
78
|
+
# 所有时长与样本计数为原生整数,不能把bool或浮点秒作纳秒。
|
|
79
|
+
if any(type(value) is not int or not 0 <= value <= span for value in durations):
|
|
80
|
+
raise ValueError('条件积分覆盖时长需要实际跨度内的非负原生int')
|
|
81
|
+
if (type(self.valid_sample_count) is not int or not 0 <= self.valid_sample_count <= self.selected_duration_ns
|
|
82
|
+
or self.selected_duration_ns > self.value_valid_duration_ns
|
|
83
|
+
or self.selected_value_unknown_duration_ns > span - self.value_valid_duration_ns
|
|
84
|
+
or self.false_duration_ns > self.condition_known_duration_ns
|
|
85
|
+
or self.selected_duration_ns + self.selected_value_unknown_duration_ns !=
|
|
86
|
+
self.condition_known_duration_ns - self.false_duration_ns):
|
|
87
|
+
raise ValueError('条件积分样本、选择、FALSE与已知时长矛盾')
|
|
88
|
+
# 分别核对值与条件的完整实际域,不将UNKNOWN当FALSE合并。
|
|
89
|
+
if type(self.ranges_retained) is not bool:
|
|
90
|
+
raise TypeError('范围保留标志需要bool')
|
|
91
|
+
if not self.ranges_retained and (self.value_unknown_ranges != () or self.condition_unknown_ranges != ()):
|
|
92
|
+
raise ValueError('未请求范围时不能附带范围明细')
|
|
93
|
+
if self.ranges_retained and _unknown_duration(self.value_unknown_ranges, actual) + self.value_valid_duration_ns != span:
|
|
94
|
+
raise ValueError('条件积分值有效与未知未完整划分实际窗口')
|
|
95
|
+
if self.ranges_retained and _unknown_duration(self.condition_unknown_ranges, actual) + self.condition_known_duration_ns != span:
|
|
96
|
+
raise ValueError('条件积分已知与条件未知未完整划分实际窗口')
|
|
97
|
+
if not isinstance(self.quality, Q) or type(self.source_refs) is not tuple or any(not isinstance(ref, SourceRef) for ref in self.source_refs):
|
|
98
|
+
raise TypeError('条件积分事实需要typed质量和完整来源tuple')
|
|
99
|
+
require_text(self.input_unit, 'conditional_integral.input_unit')
|
|
100
|
+
require_text(self.binding_identity, 'conditional_integral.binding_identity')
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
@dataclass(frozen=True)
|
|
104
|
+
class ReferenceConditionalIntegralTerms:
|
|
105
|
+
"""保存有限原序面积,未知占位0只能与False掩码一起解释。"""
|
|
106
|
+
|
|
107
|
+
areas: tuple[float, ...] # 形状N-1的原序有限float面积,未换最终单位。
|
|
108
|
+
valid: tuple[bool, ...] # 只有TRUE选择且正常面积为True。
|
|
109
|
+
facts: ConditionalIntegralFacts # 当前块覆盖与完整定位,不是整窗最终状态。
|
|
110
|
+
|
|
111
|
+
def __post_init__(self):
|
|
112
|
+
"""核对冻结同长面积与真实事实,不允许非有限或无效非零占位。
|
|
113
|
+
|
|
114
|
+
参数: 无。返回: None。异常: TypeError/ValueError为列结构、面积或事实类型。
|
|
115
|
+
"""
|
|
116
|
+
if (type(self.areas) is not tuple or type(self.valid) is not tuple or len(self.areas) != len(self.valid)
|
|
117
|
+
or not isinstance(self.facts, ConditionalIntegralFacts)):
|
|
118
|
+
raise TypeError('参考条件积分项需要同长tuple及ConditionalIntegralFacts')
|
|
119
|
+
if any(type(area) is not float or not isfinite(area) or type(keep) is not bool
|
|
120
|
+
or not keep and area != 0 for area, keep in zip(self.areas, self.valid)):
|
|
121
|
+
raise ValueError('条件积分面积需有限float/bool,无效位置只能存0')
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
def require_conditional_integral_terms(series, spec, *, step_ns=None, valid_until_ns=None, condition_valid_until_ns=None):
|
|
125
|
+
"""校验typed数值、BOOL条件、明确积分单位及可表示正跨度。
|
|
126
|
+
|
|
127
|
+
参数: series为有限CalculationSeries,spec为原integral请求。
|
|
128
|
+
step_ns为所选周期,两个until列为值/条件的实际有效截止,均可省略保原行为。
|
|
129
|
+
返回: None。异常: TypeError/ValueError/OverflowError为模型、能力、单位或时间错误。
|
|
130
|
+
"""
|
|
131
|
+
# 仅共享结构门槛;两后端独立计算转换、面积、掩码、时长与样本。
|
|
132
|
+
if not isinstance(series, CalculationSeries) or not isinstance(spec, CalculationDefinition):
|
|
133
|
+
raise TypeError('条件积分需要CalculationSeries和CalculationDefinition')
|
|
134
|
+
from .record_intervals import require_record_step
|
|
135
|
+
from .integral_terms import require_valid_until
|
|
136
|
+
require_record_step(step_ns, series.actual_value_updates)
|
|
137
|
+
require_valid_until(series.times_ns, valid_until_ns)
|
|
138
|
+
require_valid_until(series.times_ns, condition_valid_until_ns)
|
|
139
|
+
if (spec.operation != 'integral' or series.conditions is None
|
|
140
|
+
or series.values[0].dtype not in (D.INT64, D.UINT64, D.FLOAT64)
|
|
141
|
+
or any(value.dtype is not D.BOOL for value in series.conditions)):
|
|
142
|
+
raise ValueError('条件积分只支持数值integral及显式BOOL选择条件')
|
|
143
|
+
calculation_unit(spec, series.unit)
|
|
144
|
+
left, right = max(spec.window.start_ns, series.observation.start_ns), min(spec.window.end_ns, series.observation.end_ns)
|
|
145
|
+
if right - left > 2 ** 63 - 1:
|
|
146
|
+
raise OverflowError('条件积分正交集跨度超过int64')
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
"""用真实NumPy列运算生成有限条件积分面积与各自的覆盖事实。
|
|
2
|
+
|
|
3
|
+
输入有限数值CalculationSeries、显式BOOL条件与原integral请求,输出只读一维float64
|
|
4
|
+
面积、bool掩码及ConditionalIntegralFacts。先按整数ns裁剪,再按TRUE/有效掩码乘秒。
|
|
5
|
+
数值转换、面积、故障和覆盖归约独立于标量参考;元数据循环只恢复诊断Interval。
|
|
6
|
+
FALSE、UNKNOWN不做乘法,不把未知存储零视为正常结果,不提前归约或换单位。
|
|
7
|
+
不修改输入、不读来源;N/N-1临时列及输出由调用方有限workspace预约并消费。
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
# 只共享非数值模型门槛;计算采用独立NumPy转换与真实ufunc/掩码。
|
|
11
|
+
from dataclasses import dataclass
|
|
12
|
+
import numpy as np
|
|
13
|
+
from .conditional_integral_terms import ConditionalIntegralFacts, require_conditional_integral_terms
|
|
14
|
+
from .calculations import merge_ranges
|
|
15
|
+
from .models import Interval
|
|
16
|
+
from .numeric_numpy import DTYPES, NumericArray, to_float_numpy
|
|
17
|
+
from .types import QualityFlag as Q
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
@dataclass(frozen=True)
|
|
21
|
+
class NumpyConditionalIntegralTerms:
|
|
22
|
+
"""保存原序只读面积与明确掩码,不借用可写输入或隐式掩码数组。"""
|
|
23
|
+
|
|
24
|
+
areas: np.ndarray # float64形状(N-1,),未转换的输入单位乘秒。
|
|
25
|
+
valid: np.ndarray # bool形状(N-1,),仅TRUE且正常面积可归约。
|
|
26
|
+
facts: ConditionalIntegralFacts # 当前块双覆盖、样本与来源,不是全窗结果。
|
|
27
|
+
|
|
28
|
+
def __post_init__(self):
|
|
29
|
+
"""检查普通一维同长只读列、有限面积及冻结事实。
|
|
30
|
+
|
|
31
|
+
参数: 无。返回: None。异常: TypeError/ValueError为类型、形状、可写或占位错误。
|
|
32
|
+
"""
|
|
33
|
+
# 拒绝自定义/隐藏掩码子类;纯输出不能依赖调用侧数组行为。
|
|
34
|
+
if (type(self.areas) is not np.ndarray or type(self.valid) is not np.ndarray
|
|
35
|
+
or self.areas.dtype != np.float64 or self.valid.dtype != bool
|
|
36
|
+
or self.areas.ndim != 1 or self.areas.shape != self.valid.shape
|
|
37
|
+
or not isinstance(self.facts, ConditionalIntegralFacts)):
|
|
38
|
+
raise TypeError('数组条件积分项需要同长一维float64/bool及ConditionalIntegralFacts')
|
|
39
|
+
if (self.areas.flags.writeable or self.valid.flags.writeable
|
|
40
|
+
or not np.all(np.isfinite(self.areas)) or np.any(~self.valid & (self.areas != 0))):
|
|
41
|
+
raise ValueError('数组条件积分项必须只读且有限,无效位置只能0存储')
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def compute_conditional_integral_terms_numpy(series, spec, *, step_ns=None, valid_until_ns=None,
|
|
45
|
+
condition_valid_until_ns=None, retain_unknown_ranges=True):
|
|
46
|
+
"""按真实数组掩码生成面积,独立归约值、条件和选择覆盖。
|
|
47
|
+
|
|
48
|
+
参数: series为有限数值CalculationSeries及显式BOOL条件,spec为原integral请求。
|
|
49
|
+
step_ns选择固定/DBC周期;两个until列给实际有效截止;范围明细可显式关闭。
|
|
50
|
+
返回: NumpyConditionalIntegralTerms;只读面积/掩码形状N-1,临时列形状N或N-1。
|
|
51
|
+
异常: 输入、单位、时间和分配错误传播;浮点故障写质量并使对应值/面积失效。
|
|
52
|
+
"""
|
|
53
|
+
# 时间不先转float,实际交集为整数域;所有有限输入先过公共结构门槛。
|
|
54
|
+
require_conditional_integral_terms(series, spec, step_ns=step_ns, valid_until_ns=valid_until_ns,
|
|
55
|
+
condition_valid_until_ns=condition_valid_until_ns)
|
|
56
|
+
if type(retain_unknown_ranges) is not bool:
|
|
57
|
+
raise TypeError('未知范围保留选项需要bool')
|
|
58
|
+
start = max(series.observation.start_ns, spec.window.start_ns)
|
|
59
|
+
end = min(series.observation.end_ns, spec.window.end_ns)
|
|
60
|
+
actual = Interval(start, end) if start <= end else None
|
|
61
|
+
# N个真实typed值经独立数组精度核;无效0仅是受valid约束的存储。
|
|
62
|
+
column = NumericArray(series.values[0].dtype,
|
|
63
|
+
np.array([value.value if value.valid else 0 for value in series.values], dtype=DTYPES[series.values[0].dtype]),
|
|
64
|
+
np.array([value.valid for value in series.values], dtype=bool),
|
|
65
|
+
np.array([int(value.quality) for value in series.values], dtype=np.uint16))
|
|
66
|
+
values = to_float_numpy(column)
|
|
67
|
+
# BOOL列按已知和真值两个(N,)掩码处理,UNKNOWN占位False不进入FALSE覆盖。
|
|
68
|
+
known = np.array([condition.valid for condition in series.conditions], dtype=bool)
|
|
69
|
+
truth = np.array([condition.value if condition.valid else False for condition in series.conditions], dtype=bool)
|
|
70
|
+
condition_quality = np.array([int(condition.quality) for condition in series.conditions], dtype=np.uint16)
|
|
71
|
+
times = np.array(series.times_ns, dtype=np.int64)
|
|
72
|
+
left, right = np.maximum(times[:-1], np.int64(start)), np.minimum(times[1:], np.int64(end))
|
|
73
|
+
observed = right > left
|
|
74
|
+
durations = np.zeros(len(left), dtype=np.int64)
|
|
75
|
+
np.subtract(right, left, out=durations, where=observed)
|
|
76
|
+
# 当前块副本可标记面积故障;只对TRUE有效正区间执行input_unit乘秒的ufunc。
|
|
77
|
+
valid_values, quality_values = values.valid.copy(), values.quality.copy()
|
|
78
|
+
value_right, condition_right = right, right
|
|
79
|
+
value_durations, condition_durations = durations, durations
|
|
80
|
+
# 两种有效性各有实际截止,不能用一个联合截止丢掉已知FALSE或值覆盖。
|
|
81
|
+
for deadlines, is_value in ((valid_until_ns, True), (condition_valid_until_ns, False)):
|
|
82
|
+
if deadlines is None:
|
|
83
|
+
continue
|
|
84
|
+
expiry = np.array([item if item is not None else (1 << 63) - 1 for item in deadlines], dtype=np.int64)
|
|
85
|
+
has_expiry = np.array([item is not None for item in deadlines], dtype=bool)
|
|
86
|
+
expired = has_expiry & (times >= expiry)
|
|
87
|
+
clipped = np.maximum(left, np.minimum(right, expiry[:-1]))
|
|
88
|
+
clipped_durations = np.zeros(len(left), dtype=np.int64)
|
|
89
|
+
np.subtract(clipped, left, out=clipped_durations, where=observed)
|
|
90
|
+
if is_value:
|
|
91
|
+
valid_values[expired] = False
|
|
92
|
+
quality_values[expired] |= int(Q.STALE)
|
|
93
|
+
quality_values[:-1][observed & (clipped < right)] |= int(Q.STALE)
|
|
94
|
+
value_right, value_durations = clipped, clipped_durations
|
|
95
|
+
else:
|
|
96
|
+
known[expired] = False
|
|
97
|
+
condition_quality[expired] |= int(Q.STALE)
|
|
98
|
+
condition_quality[:-1][observed & (clipped < right)] |= int(Q.STALE)
|
|
99
|
+
condition_right, condition_durations = clipped, clipped_durations
|
|
100
|
+
selected_durations = (durations if valid_until_ns is None and condition_valid_until_ns is None
|
|
101
|
+
else np.minimum(value_durations, condition_durations))
|
|
102
|
+
keep = observed & (selected_durations > 0) & valid_values[:-1] & known[:-1] & truth[:-1]
|
|
103
|
+
areas = np.zeros(len(left), dtype=np.float64)
|
|
104
|
+
seconds = selected_durations.astype(np.float64)
|
|
105
|
+
if step_ns is None:
|
|
106
|
+
seconds /= 1_000_000_000
|
|
107
|
+
else:
|
|
108
|
+
# 分母保留完整实际记录对,不能改用条件/有效期裁剪后的长度。
|
|
109
|
+
seconds /= np.diff(times)
|
|
110
|
+
seconds *= step_ns / 1_000_000_000
|
|
111
|
+
with np.errstate(over='ignore', under='ignore', invalid='ignore'):
|
|
112
|
+
np.multiply(values.values[:-1], seconds, out=areas, where=keep)
|
|
113
|
+
# 非有限及非零下溢只标实际执行的TRUE项,并使该位置真实样本失效。
|
|
114
|
+
nonfinite = keep & ~np.isfinite(areas)
|
|
115
|
+
underflow = keep & (areas == 0) & (values.values[:-1] != 0)
|
|
116
|
+
quality_values[:-1][nonfinite] |= int(Q.NONFINITE)
|
|
117
|
+
quality_values[:-1][underflow] |= int(Q.PRECISION_LOSS)
|
|
118
|
+
valid_values[:-1][nonfinite | underflow] = False
|
|
119
|
+
keep = observed & (selected_durations > 0) & valid_values[:-1] & known[:-1] & truth[:-1]
|
|
120
|
+
areas[~keep] = 0.0
|
|
121
|
+
# 五种覆盖分别按(N-1,)掩码归约正整数ns,总和不超过已验证int64实际跨度。
|
|
122
|
+
value_duration = int(np.sum(value_durations, where=observed & valid_values[:-1], dtype=np.int64))
|
|
123
|
+
known_duration = int(np.sum(condition_durations, where=observed & known[:-1], dtype=np.int64))
|
|
124
|
+
selected_duration = int(np.sum(selected_durations, where=keep, dtype=np.int64))
|
|
125
|
+
selected_unknown_duration = int(np.sum(condition_durations, where=observed & known[:-1] & truth[:-1], dtype=np.int64)) - selected_duration
|
|
126
|
+
false_duration = int(np.sum(condition_durations, where=observed & known[:-1] & ~truth[:-1], dtype=np.int64))
|
|
127
|
+
# 样本只计真实原值更新;条件变化与右终点不成为数值样本。
|
|
128
|
+
actual_updates = np.array(series.actual_value_updates, dtype=bool)
|
|
129
|
+
actual_samples = actual_updates & (times >= start) & (times < end)
|
|
130
|
+
sample_count = int(np.count_nonzero(actual_samples & valid_values & known & truth))
|
|
131
|
+
# 诊断来自实际正区间或真实样本,不将窗口外末点质量传播入结果。
|
|
132
|
+
diagnostic = np.array([int(flag) for flag in series.diagnostics], dtype=np.uint16) | quality_values | condition_quality
|
|
133
|
+
relevant = actual_samples.copy()
|
|
134
|
+
relevant[:-1] |= observed
|
|
135
|
+
quality = Q(int(np.bitwise_or.reduce(diagnostic, where=relevant, initial=0)))
|
|
136
|
+
# Python循环仅将有限未知掩码恢复精确Interval;数值和覆盖未调用参考核。
|
|
137
|
+
value_unknown = (tuple(Interval(int(value_right[index] if valid_values[index] else left[index]), int(right[index]))
|
|
138
|
+
for index in np.flatnonzero(observed & (~valid_values[:-1] | (value_right < right)))) if retain_unknown_ranges else ())
|
|
139
|
+
condition_unknown = (tuple(Interval(int(condition_right[index] if known[index] else left[index]), int(right[index]))
|
|
140
|
+
for index in np.flatnonzero(observed & (~known[:-1] | (condition_right < right)))) if retain_unknown_ranges else ())
|
|
141
|
+
facts = ConditionalIntegralFacts(spec, actual, value_duration, known_duration, selected_duration,
|
|
142
|
+
selected_unknown_duration, false_duration, sample_count, merge_ranges(value_unknown),
|
|
143
|
+
merge_ranges(condition_unknown), quality, series.unit, series.binding_identity, series.source_refs,
|
|
144
|
+
ranges_retained=retain_unknown_ranges)
|
|
145
|
+
# 返回只读列供独立原序float归约;输出未申请独立owner,不能脱离已预约workspace留存。
|
|
146
|
+
areas.setflags(write=False)
|
|
147
|
+
keep.setflags(write=False)
|
|
148
|
+
return NumpyConditionalIntegralTerms(areas, keep, facts)
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
"""独立标量生成有限条件积分面积,分别保存值覆盖与BOOL条件覆盖。
|
|
2
|
+
|
|
3
|
+
输入为有限CalculationSeries和原integral请求,输出原序(N-1,)面积/掩码及冻结事实。
|
|
4
|
+
每个值先通过标量浮点精度检查;只有TRUE且有效值才乘裁剪后的整数纳秒时长。
|
|
5
|
+
面积溢出或非零下溢使该位置值和真实样本失效;FALSE、UNKNOWN不做面积乘法。
|
|
6
|
+
不把UNKNOWN补零,不归约面积或转换最终单位,不读取来源、不修改输入。
|
|
7
|
+
只依赖标准库及typed模型,不调用NumPy;有限临时列须由调用方owner预约。
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
# 标量数值与覆盖判据独立于数组核,仅复用已校验模型和结构门槛。
|
|
11
|
+
from math import isfinite
|
|
12
|
+
from .conditional_integral_terms import ConditionalIntegralFacts, ReferenceConditionalIntegralTerms, require_conditional_integral_terms
|
|
13
|
+
from .calculations import merge_ranges
|
|
14
|
+
from .models import Interval
|
|
15
|
+
from .numeric import ScalarValue, to_float_reference
|
|
16
|
+
from .types import QualityFlag as Q
|
|
17
|
+
from .record_intervals import clipped_record_seconds
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def compute_conditional_integral_terms_reference(series, spec, *, step_ns=None, valid_until_ns=None,
|
|
21
|
+
condition_valid_until_ns=None, retain_unknown_ranges=True):
|
|
22
|
+
"""逐正区间生成未转换原序面积与独立值、条件覆盖事实。
|
|
23
|
+
|
|
24
|
+
参数: series为有限数值CalculationSeries及显式BOOL条件,spec为原integral请求。
|
|
25
|
+
step_ns为可选所选周期;两个until列是实际有效截止;范围明细可显式关闭。
|
|
26
|
+
返回: ReferenceConditionalIntegralTerms;面积为输入单位乘秒,无效槽位0配False。
|
|
27
|
+
异常: 输入、单位、时间与分配错误传播;精度、面积溢出/下溢写入质量及未知。
|
|
28
|
+
"""
|
|
29
|
+
# 结构先校验,裁剪保留精确整数ns;没有交集不凭空创建观察域。
|
|
30
|
+
require_conditional_integral_terms(series, spec, step_ns=step_ns, valid_until_ns=valid_until_ns,
|
|
31
|
+
condition_valid_until_ns=condition_valid_until_ns)
|
|
32
|
+
if type(retain_unknown_ranges) is not bool:
|
|
33
|
+
raise TypeError('未知范围保留选项需要bool')
|
|
34
|
+
start = max(series.observation.start_ns, spec.window.start_ns)
|
|
35
|
+
end = min(series.observation.end_ns, spec.window.end_ns)
|
|
36
|
+
actual = Interval(start, end) if start <= end else None
|
|
37
|
+
# 所有值都接受原完整积分的精度门槛,包括FALSE与UNKNOWN未选择的值。
|
|
38
|
+
values = [to_float_reference(value) for value in series.values]
|
|
39
|
+
conditions = series.conditions if condition_valid_until_ns is None else list(series.conditions)
|
|
40
|
+
# 到期点本身已失效;未到期的部分区间在下方独立裁剪。
|
|
41
|
+
for rows, deadlines in ((values, valid_until_ns), (conditions, condition_valid_until_ns)):
|
|
42
|
+
if deadlines is not None:
|
|
43
|
+
for index, deadline in enumerate(deadlines):
|
|
44
|
+
if deadline is not None and series.times_ns[index] >= deadline:
|
|
45
|
+
old = rows[index]
|
|
46
|
+
rows[index] = ScalarValue(None, old.dtype, False, old.quality | Q.STALE, old.labels)
|
|
47
|
+
areas, valid, value_unknown, condition_unknown = [], [], [], []
|
|
48
|
+
value_duration, known_duration, selected_duration = 0, 0, 0
|
|
49
|
+
selected_unknown_duration, false_duration, sample_count, quality = 0, 0, 0, Q.NONE
|
|
50
|
+
# 原N-1槽位顺序不变;数值未跨块归约,条件单独变化只改变选择覆盖。
|
|
51
|
+
for index in range(len(series.times_ns) - 1):
|
|
52
|
+
left, right = max(start, series.times_ns[index]), min(end, series.times_ns[index + 1])
|
|
53
|
+
area, keep = 0.0, False
|
|
54
|
+
if left < right:
|
|
55
|
+
value, condition = values[index], conditions[index]
|
|
56
|
+
quality |= series.diagnostics[index] | value.quality | condition.quality
|
|
57
|
+
value_end = right if valid_until_ns is None or valid_until_ns[index] is None else max(left, min(right, valid_until_ns[index]))
|
|
58
|
+
condition_end = right if condition_valid_until_ns is None or condition_valid_until_ns[index] is None else max(left, min(right, condition_valid_until_ns[index]))
|
|
59
|
+
selected_end = min(value_end, condition_end)
|
|
60
|
+
if value_end < right or condition_end < right:
|
|
61
|
+
quality |= Q.STALE
|
|
62
|
+
# 只有明确TRUE才计算面积;FALSE不因未执行的溢出丢掉值覆盖。
|
|
63
|
+
if value.valid and condition.valid and condition.value and selected_end > left:
|
|
64
|
+
seconds = ((selected_end - left) / 1_000_000_000 if step_ns is None else
|
|
65
|
+
clipped_record_seconds(series.times_ns[index], series.times_ns[index + 1],
|
|
66
|
+
spec.window if selected_end == right else Interval(left, selected_end), step_ns=step_ns))
|
|
67
|
+
term = value.value * seconds
|
|
68
|
+
failure = Q.NONFINITE if not isfinite(term) else Q.PRECISION_LOSS if term == 0 and value.value != 0 else Q.NONE
|
|
69
|
+
if failure == Q.NONE:
|
|
70
|
+
area, keep = term, True
|
|
71
|
+
else:
|
|
72
|
+
# 局部转换列同时更新样本有效性;原ScalarValue不被改写。
|
|
73
|
+
value = ScalarValue(value.value, value.dtype, False, value.quality | failure, value.labels)
|
|
74
|
+
values[index] = value
|
|
75
|
+
quality |= failure
|
|
76
|
+
# 值和条件各自完整分区;TRUE值未知与条件UNKNOWN分别登记。
|
|
77
|
+
if value.valid:
|
|
78
|
+
value_duration += value_end - left
|
|
79
|
+
if retain_unknown_ranges and value_end < right:
|
|
80
|
+
value_unknown.append(Interval(value_end, right))
|
|
81
|
+
elif retain_unknown_ranges:
|
|
82
|
+
value_unknown.append(Interval(left, right))
|
|
83
|
+
if condition.valid:
|
|
84
|
+
known_duration += condition_end - left
|
|
85
|
+
if not condition.value:
|
|
86
|
+
false_duration += condition_end - left
|
|
87
|
+
elif value.valid:
|
|
88
|
+
selected_duration += selected_end - left
|
|
89
|
+
selected_unknown_duration += condition_end - selected_end
|
|
90
|
+
else:
|
|
91
|
+
selected_unknown_duration += condition_end - left
|
|
92
|
+
if retain_unknown_ranges and condition_end < right:
|
|
93
|
+
condition_unknown.append(Interval(condition_end, right))
|
|
94
|
+
elif retain_unknown_ranges:
|
|
95
|
+
condition_unknown.append(Interval(left, right))
|
|
96
|
+
# 未观察槽位也保留原位置,但不形成UNKNOWN或正常积分项。
|
|
97
|
+
areas.append(area)
|
|
98
|
+
valid.append(keep)
|
|
99
|
+
# 只计半开范围内原值真实更新且有效/TRUE;条件更新与末点不能计样本。
|
|
100
|
+
for index, time in enumerate(series.times_ns):
|
|
101
|
+
if start <= time < end and series.actual_value_updates[index]:
|
|
102
|
+
value, condition = values[index], conditions[index]
|
|
103
|
+
quality |= series.diagnostics[index] | value.quality | condition.quality
|
|
104
|
+
if value.valid and condition.valid and condition.value:
|
|
105
|
+
sample_count += 1
|
|
106
|
+
# 两未知元组仅合并相邻范围;完整来源子类和联合绑定身份原样保留。
|
|
107
|
+
facts = ConditionalIntegralFacts(spec, actual, value_duration, known_duration, selected_duration,
|
|
108
|
+
selected_unknown_duration, false_duration, sample_count, merge_ranges(value_unknown),
|
|
109
|
+
merge_ranges(condition_unknown), quality, series.unit, series.binding_identity, series.source_refs,
|
|
110
|
+
ranges_retained=retain_unknown_ranges)
|
|
111
|
+
return ReferenceConditionalIntegralTerms(tuple(areas), tuple(valid), facts)
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
"""声明有限条件时间统计事实及结构门槛,不执行数值或时间归约。
|
|
2
|
+
|
|
3
|
+
支持条件min_time/max_time/time_weighted_mean和主BOOL duration。值覆盖与外BOOL条件覆盖
|
|
4
|
+
独立完整划分实际窗口;外FALSE不选择,外UNKNOWN不算FALSE。duration另保存外TRUE
|
|
5
|
+
但主FALSE的有效零证据,选中时长只含主TRUE。mean的值覆盖包含转float精度门槛,
|
|
6
|
+
权重数值故障不改输入覆盖。纯模型不读来源、不管理预算,不留存全窗输入;
|
|
7
|
+
有限事实及返回元数据需要外层owner预先计费,最终分类也由外层负责。
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
# 两数值核仅共享typed模型和静态配置/几何门槛,不共享数值计算。
|
|
11
|
+
from dataclasses import dataclass
|
|
12
|
+
from .calculations import CalculationDefinition, CalculationSeries
|
|
13
|
+
from .models import Interval, SourceRef
|
|
14
|
+
from .time_reduction import require_time_config
|
|
15
|
+
from .types import QualityFlag as Q, SignalDType as D
|
|
16
|
+
from .validation import require_text
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def _unknown_duration(ranges, actual):
|
|
20
|
+
"""核对一种未知范围的顺序与几何,返回精确整数时长。
|
|
21
|
+
|
|
22
|
+
参数: ranges为冻结正Interval tuple,actual为原请求内实际交集或None。
|
|
23
|
+
返回: 原生int未知纳秒。异常: TypeError/ValueError为类型、重叠、反序或越界。
|
|
24
|
+
"""
|
|
25
|
+
# 各未知分区独立检查,不靠总长度掩盖重复位置或跨越实际边界。
|
|
26
|
+
if type(ranges) is not tuple:
|
|
27
|
+
raise TypeError('条件时间未知范围需要tuple')
|
|
28
|
+
cursor, total = (actual.start_ns if actual is not None else 0), 0
|
|
29
|
+
for item in ranges:
|
|
30
|
+
if (not isinstance(item, Interval) or actual is None or item.start_ns < cursor
|
|
31
|
+
or item.start_ns >= item.end_ns or item.end_ns > actual.end_ns):
|
|
32
|
+
raise ValueError('条件时间未知范围必须有序、不重叠且在实际窗口内')
|
|
33
|
+
cursor, total = item.end_ns, total + item.end_ns - item.start_ns
|
|
34
|
+
return total
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
@dataclass(frozen=True)
|
|
38
|
+
class ConditionalTimeCalculationFacts:
|
|
39
|
+
"""保存有限块双覆盖和选择交集,主FALSE只为duration保留有效零证据。
|
|
40
|
+
|
|
41
|
+
数值算子selected包含外TRUE有效值;duration的selected只含外TRUE主TRUE。
|
|
42
|
+
selected_false只含duration外TRUE主FALSE,其他算子为0;真实样本遵循相同选择。
|
|
43
|
+
两未知元组分别完整划分值与外条件,不用UNKNOWN填零或代替FALSE。
|
|
44
|
+
"""
|
|
45
|
+
|
|
46
|
+
spec: CalculationDefinition # 原时间统计请求与政策,不按块重写。
|
|
47
|
+
actual_window: Interval | None # 当前块真实交集,不外推EOF。
|
|
48
|
+
value_valid_duration_ns: int # 原值通过本算子门槛后的有效纳秒。
|
|
49
|
+
condition_known_duration_ns: int # 外条件TRUE/FALSE已知纳秒。
|
|
50
|
+
selected_duration_ns: int # 外TRUE有效数值,duration另须主TRUE。
|
|
51
|
+
selected_value_unknown_duration_ns: int # 外TRUE但值未知,不混入外条件UNKNOWN。
|
|
52
|
+
false_duration_ns: int # 外条件已知FALSE纳秒,只有完整窗才证明空选择。
|
|
53
|
+
selected_false_duration_ns: int # duration外TRUE主FALSE有效零证据,其他算子0。
|
|
54
|
+
valid_sample_count: int # 已选真实值更新,不是条件更新/保持区间数。
|
|
55
|
+
value_unknown_ranges: tuple[Interval, ...] # 值未知位置,包含mean精度失败。
|
|
56
|
+
condition_unknown_ranges: tuple[Interval, ...] # 外条件UNKNOWN位置。
|
|
57
|
+
quality: Q # 输入、精度与依赖原因,不包含数值weight失败。
|
|
58
|
+
input_unit: str # 原分析工程单位,尚未转换最终输出。
|
|
59
|
+
dtype: D # 极值保留原定宽整数;duration为BOOL。
|
|
60
|
+
binding_identity: str # 原值表达式联合输入身份。
|
|
61
|
+
source_refs: tuple[SourceRef, ...] # 原定位和真实子类完整保留。
|
|
62
|
+
ranges_retained: bool = True # False只留分类所需计数,不构造未知范围。
|
|
63
|
+
|
|
64
|
+
def __post_init__(self):
|
|
65
|
+
"""验证正分区、选择交集和完整身份,不修补矛盾事实。
|
|
66
|
+
|
|
67
|
+
参数: 无。返回: None。异常: TypeError/ValueError为配置、几何或交集矛盾。
|
|
68
|
+
"""
|
|
69
|
+
# 配置门槛只验证typed算子、单位、dtype,不计算浮点数值。
|
|
70
|
+
require_time_config(self.spec, self.input_unit, self.dtype, None, 4096)
|
|
71
|
+
if self.actual_window is not None and not isinstance(self.actual_window, Interval):
|
|
72
|
+
raise TypeError('条件时间实际范围需要Interval或None')
|
|
73
|
+
actual, request = self.actual_window, self.spec.window
|
|
74
|
+
span = 0 if actual is None else actual.end_ns - actual.start_ns
|
|
75
|
+
if actual is not None and not request.start_ns <= actual.start_ns <= actual.end_ns <= request.end_ns:
|
|
76
|
+
raise ValueError('条件时间实际范围越过原请求')
|
|
77
|
+
durations = (self.value_valid_duration_ns, self.condition_known_duration_ns, self.selected_duration_ns,
|
|
78
|
+
self.selected_value_unknown_duration_ns, self.false_duration_ns, self.selected_false_duration_ns)
|
|
79
|
+
# 计数与纳秒必须原生int;bool不能通过整数继承关系冒充时长。
|
|
80
|
+
if any(type(value) is not int or not 0 <= value <= span for value in durations):
|
|
81
|
+
raise ValueError('条件时间覆盖需要实际跨度内原生非负int')
|
|
82
|
+
if (type(self.valid_sample_count) is not int or not 0 <= self.valid_sample_count <= self.selected_duration_ns
|
|
83
|
+
or self.selected_duration_ns + self.selected_false_duration_ns > self.value_valid_duration_ns
|
|
84
|
+
or self.selected_value_unknown_duration_ns > span - self.value_valid_duration_ns
|
|
85
|
+
or self.false_duration_ns > self.condition_known_duration_ns
|
|
86
|
+
or self.selected_duration_ns + self.selected_false_duration_ns + self.selected_value_unknown_duration_ns
|
|
87
|
+
!= self.condition_known_duration_ns - self.false_duration_ns
|
|
88
|
+
or self.spec.operation != 'duration' and self.selected_false_duration_ns != 0):
|
|
89
|
+
raise ValueError('条件时间样本、选择、有效FALSE及已知交集矛盾')
|
|
90
|
+
# 值和外条件分别完整划分实际域;不能用另一种未知补缺口。
|
|
91
|
+
if type(self.ranges_retained) is not bool or not self.ranges_retained and (self.value_unknown_ranges or self.condition_unknown_ranges):
|
|
92
|
+
raise ValueError('精简条件时间事实不能携带未知范围')
|
|
93
|
+
value_unknown = _unknown_duration(self.value_unknown_ranges, actual)
|
|
94
|
+
condition_unknown = _unknown_duration(self.condition_unknown_ranges, actual)
|
|
95
|
+
if self.ranges_retained and value_unknown + self.value_valid_duration_ns != span:
|
|
96
|
+
raise ValueError('条件时间值有效与未知未完整划分实际窗口')
|
|
97
|
+
if self.ranges_retained and condition_unknown + self.condition_known_duration_ns != span:
|
|
98
|
+
raise ValueError('条件时间已知与外条件未知未完整划分实际窗口')
|
|
99
|
+
if not isinstance(self.quality, Q) or type(self.source_refs) is not tuple or any(not isinstance(ref, SourceRef) for ref in self.source_refs):
|
|
100
|
+
raise TypeError('条件时间需要typed质量和完整来源tuple')
|
|
101
|
+
require_text(self.binding_identity, 'conditional_time.binding_identity')
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def require_conditional_time_series(series, spec, input_unit, dtype):
|
|
105
|
+
"""核对有限联合输入的条件、单位、类型与正交集几何。
|
|
106
|
+
|
|
107
|
+
参数: series为有限CalculationSeries,其余为归约的原配置。
|
|
108
|
+
返回: 当前实际交集Interval或None。异常: TypeError/ValueError/OverflowError。
|
|
109
|
+
"""
|
|
110
|
+
# BOOL条件已由CalculationSeries验证;缺条件不能被默认为全TRUE或全FALSE。
|
|
111
|
+
if not isinstance(series, CalculationSeries):
|
|
112
|
+
raise TypeError('条件时间归约需要CalculationSeries')
|
|
113
|
+
if series.conditions is None or series.unit != input_unit or series.values[0].dtype is not dtype:
|
|
114
|
+
raise ValueError('条件时间归约需要同单位同dtype及显式BOOL条件')
|
|
115
|
+
left, right = max(spec.window.start_ns, series.observation.start_ns), min(spec.window.end_ns, series.observation.end_ns)
|
|
116
|
+
if right - left > 2**63 - 1:
|
|
117
|
+
raise OverflowError('条件时间正交集跨度超过int64')
|
|
118
|
+
return Interval(left, right) if left <= right else None
|