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,94 @@
|
|
|
1
|
+
"""检查核心模型的文本、简单名称、来源序号和不可变标量。
|
|
2
|
+
|
|
3
|
+
输入为已经解析的Python对象;文本检查返回原文,序号检查返回精确Python整数,
|
|
4
|
+
标量检查只判断类型。原字段可以含点号;标识符须符合ASCII简单名称规则,
|
|
5
|
+
不得占用Python关键字或已注册的表达式函数名。本模块不裁剪或改名,不把bool
|
|
6
|
+
当整数,不检查样本质量。仅依赖标准库,没有数据读取、日志或会话状态。
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
# 标准库提供明确的名称语法和整数协议,不用eval或对象反射。
|
|
10
|
+
import keyword
|
|
11
|
+
import re
|
|
12
|
+
from numbers import Integral
|
|
13
|
+
|
|
14
|
+
# 名称语法来自设计9.2;两个首版函数名保留给表达式层。
|
|
15
|
+
IDENTIFIER_PATTERN = re.compile(r"[A-Za-z_][A-Za-z0-9_]*")
|
|
16
|
+
|
|
17
|
+
# 首版注册函数名占用统一名称空间,避免信号遮蔽函数语义。
|
|
18
|
+
RESERVED_NAMES = frozenset({"abs", "isclose"})
|
|
19
|
+
# 逻辑标量只接受这些不可变Python类型,数组标量由适配层显式转换。
|
|
20
|
+
SCALAR_TYPES = (int, float, bool, str, type(None))
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def require_text(value: str, field: str) -> str:
|
|
24
|
+
"""检查非空来源文本并保留原文本身份,不自动strip或改名。
|
|
25
|
+
|
|
26
|
+
参数: value (str)为来源名或原字段文本;field (str)用于错误定位。
|
|
27
|
+
返回: str;原文本,点号及两端非全空白不被改写。
|
|
28
|
+
异常: TypeError为非文本;ValueError为空或全空白。
|
|
29
|
+
"""
|
|
30
|
+
# 来源身份不能由任意对象的str猜测。
|
|
31
|
+
if not isinstance(value, str):
|
|
32
|
+
# 精确指出哪个模型字段类型错误。
|
|
33
|
+
raise TypeError(f"{field}必须为字符串")
|
|
34
|
+
# 全空白不是可定位的来源标识;正常文本不作归一化。
|
|
35
|
+
if not value.strip():
|
|
36
|
+
# 缺项不能用空名字继续分析。
|
|
37
|
+
raise ValueError(f"{field}不能为空或全空白")
|
|
38
|
+
# 返回原文本以保留字段定位身份。
|
|
39
|
+
return value
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def require_identifier(value: str, field: str) -> str:
|
|
43
|
+
"""校验设计9.2的简单标识符,不接受属性路径或隐藏替换。
|
|
44
|
+
|
|
45
|
+
参数: value (str)为标识符、来源名或表达式别名;field (str)用于错误定位。
|
|
46
|
+
返回: str;原合法标识,大小写保留。
|
|
47
|
+
异常: TypeError为非文本;ValueError为语法、关键字或保留名冲突。
|
|
48
|
+
"""
|
|
49
|
+
# 先处理缺项和类型,后续regex只看到明确文本。
|
|
50
|
+
text = require_text(value, field)
|
|
51
|
+
# fullmatch不允许点号、空格、非ASCII或尾随其他字符。
|
|
52
|
+
if IDENTIFIER_PATTERN.fullmatch(text) is None or keyword.iskeyword(text) or text in RESERVED_NAMES:
|
|
53
|
+
# 不自动把点号替换为下划线;保留名按首版契约拒绝。
|
|
54
|
+
raise ValueError(f"{field}须为非关键字/保留名的ASCII简单标识符")
|
|
55
|
+
# 名称只做校验,不改变不同大小写的身份。
|
|
56
|
+
return text
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def require_sequence(value: int) -> int:
|
|
60
|
+
"""校验来源内非负精确序号,不设置未经设计要求的64位上限。
|
|
61
|
+
|
|
62
|
+
参数: value (Integral)为原来源稳定序号;bool不属于序号。
|
|
63
|
+
返回: int;精确序号,不使用float或取模。
|
|
64
|
+
异常: TypeError为非整数或bool;ValueError为负序号。
|
|
65
|
+
"""
|
|
66
|
+
# True不能被当作来源序号1。
|
|
67
|
+
if isinstance(value, bool) or not isinstance(value, Integral):
|
|
68
|
+
# 非整数不靠截断转换修补。
|
|
69
|
+
raise TypeError("sequence必须为非布尔整数")
|
|
70
|
+
# 不损失位值地归一到Python整数。
|
|
71
|
+
result = int(value)
|
|
72
|
+
# 来源序号非负,不自动重编号负输入。
|
|
73
|
+
if result < 0:
|
|
74
|
+
# 错误序号不能作为合法样本身份。
|
|
75
|
+
raise ValueError("sequence必须非负")
|
|
76
|
+
# 返回不可变精确身份。
|
|
77
|
+
return result
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def require_scalar(value: int | float | bool | str | None) -> None:
|
|
81
|
+
"""限制逻辑样本的值类型,允许保留尚未检查质量的原始值。
|
|
82
|
+
|
|
83
|
+
参数:
|
|
84
|
+
value: 原生int、float、bool、str或None;不接受数组、容器和自定义对象。
|
|
85
|
+
返回:
|
|
86
|
+
None: 只验证值属于允许的不可变标量类型。有效性、数值范围和声明类型
|
|
87
|
+
由后续模型及数值层检查,None和非有限浮点可以保留为诊断值。
|
|
88
|
+
异常:
|
|
89
|
+
TypeError: 输入不是允许的原生标量类型。
|
|
90
|
+
"""
|
|
91
|
+
# 精确类型避免自定义数值子类或容器携带可变状态。
|
|
92
|
+
if type(value) not in SCALAR_TYPES:
|
|
93
|
+
# 数组标量不能未经适配校验就伪装成逻辑输入。
|
|
94
|
+
raise TypeError("逻辑值仅接受原生int/float/bool/str/None")
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
"""声明完整窗口变化量的输入、配置和结果,不读取文件或保存触发状态。
|
|
2
|
+
|
|
3
|
+
输入是有限ZOH已经划分好的连续片段,坐标为整数纳秒,数值保留声明dtype。
|
|
4
|
+
片段起点的真实点质量可以不同于连续质量,例如真实EOF样本仍有效,但不能
|
|
5
|
+
向EOF后保持。两个后端共用结构检查;数值、覆盖率和单调判断分别实现。
|
|
6
|
+
结果把数值变化量与条件真假分开,缺数据不返回零,也不在这里生成事件。
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from dataclasses import dataclass
|
|
10
|
+
from math import isfinite
|
|
11
|
+
from .types import QualityFlag as Q, SignalDType as D, Truth
|
|
12
|
+
from ..timebase.conversion import require_int64_ns
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
@dataclass(frozen=True)
|
|
16
|
+
class WindowDeltaSpec:
|
|
17
|
+
"""保存窗口长度、方向、阈值及单调要求;只接受完整覆盖政策。"""
|
|
18
|
+
|
|
19
|
+
window_ns: int # 完整回看长度,必须为正。
|
|
20
|
+
threshold: int | float # 非负门槛,单位与输入相同,包含等于门槛。
|
|
21
|
+
direction: str = 'any' # rise末减首,fall首减末,any取绝对差。
|
|
22
|
+
monotonic: bool = False # rise非降、fall非升、any二者任一。
|
|
23
|
+
coverage_policy: str = 'full' # 样本兼容口径不在本核心隐式启用。
|
|
24
|
+
|
|
25
|
+
def __post_init__(self):
|
|
26
|
+
"""检查明确参数,不从名字猜时长或单位。
|
|
27
|
+
|
|
28
|
+
参数: 无,读取冻结字段。返回: None。异常: 类型、非有限或范围错误。
|
|
29
|
+
"""
|
|
30
|
+
object.__setattr__(self, 'window_ns', require_int64_ns(self.window_ns))
|
|
31
|
+
if self.window_ns <= 0 or self.direction not in ('rise', 'fall', 'any'):
|
|
32
|
+
raise ValueError('window_delta窗口须为正,方向须为rise/fall/any')
|
|
33
|
+
if type(self.monotonic) is not bool or type(self.threshold) not in (int, float):
|
|
34
|
+
raise TypeError('monotonic需bool,threshold需数值且不能为bool')
|
|
35
|
+
if self.threshold < 0 or (type(self.threshold) is float and not isfinite(self.threshold)):
|
|
36
|
+
raise ValueError('threshold须为非负有限数值')
|
|
37
|
+
if self.coverage_policy != 'full':
|
|
38
|
+
raise ValueError('当前window_delta仅支持full覆盖政策')
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
@dataclass(frozen=True)
|
|
42
|
+
class DeltaSpan:
|
|
43
|
+
"""保存一段常值和起点点值;零长度仅用于真实末点。
|
|
44
|
+
|
|
45
|
+
quality适用于[start_ns,end_ns),point_quality适用于start_ns。
|
|
46
|
+
值为None时两种质量都须说明无效原因。时间到期不能通过延长end_ns补齐。
|
|
47
|
+
"""
|
|
48
|
+
|
|
49
|
+
start_ns: int # 当前更新或有效性边界。
|
|
50
|
+
end_ns: int # 连续值排除的右端。
|
|
51
|
+
value: int | float | None # 规范后的原生数值,未知可为None。
|
|
52
|
+
quality: Q = Q.NONE # 连续区间无效原因。
|
|
53
|
+
point_quality: Q | None = None # 默认与连续质量相同。
|
|
54
|
+
|
|
55
|
+
def __post_init__(self):
|
|
56
|
+
"""规范纳秒和点质量,并检查有值证据。
|
|
57
|
+
|
|
58
|
+
参数: 无。返回: None。异常: 类型、倒序或未知无原因。
|
|
59
|
+
"""
|
|
60
|
+
object.__setattr__(self, 'start_ns', require_int64_ns(self.start_ns))
|
|
61
|
+
object.__setattr__(self, 'end_ns', require_int64_ns(self.end_ns))
|
|
62
|
+
if self.end_ns < self.start_ns:
|
|
63
|
+
raise ValueError('DeltaSpan终点不得早于起点')
|
|
64
|
+
if not isinstance(self.quality, Q):
|
|
65
|
+
raise TypeError('DeltaSpan质量需QualityFlag')
|
|
66
|
+
if self.point_quality is None:
|
|
67
|
+
object.__setattr__(self, 'point_quality', self.quality)
|
|
68
|
+
if not isinstance(self.point_quality, Q):
|
|
69
|
+
raise TypeError('DeltaSpan点质量需QualityFlag')
|
|
70
|
+
if self.value is None:
|
|
71
|
+
if self.quality == Q.NONE or self.point_quality == Q.NONE:
|
|
72
|
+
raise ValueError('没有数值必须注明未知原因')
|
|
73
|
+
elif type(self.value) not in (int, float):
|
|
74
|
+
raise TypeError('DeltaSpan值需原生int/float或None')
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
@dataclass(frozen=True)
|
|
78
|
+
class WindowDeltaResult:
|
|
79
|
+
"""保存一次窗口结果;value与方向一致,condition额外考虑单调要求。
|
|
80
|
+
|
|
81
|
+
valid_duration_ns只计完整窗口内已知连续时间;端点无效也会令条件UNKNOWN,
|
|
82
|
+
即使连续覆盖率恰好为1。monotonic是对应方向的实测结果,未知时为None。
|
|
83
|
+
"""
|
|
84
|
+
|
|
85
|
+
time_ns: int # 当前判断时刻。
|
|
86
|
+
window_start_ns: int # 精确Python整数,不因回看低于int64下限回绕。
|
|
87
|
+
value: int | float | None # 定宽差值或None,绝不以0替代未知。
|
|
88
|
+
condition: Truth # TRUE/FALSE/UNKNOWN。
|
|
89
|
+
quality: Q # UNKNOWN原因;已知为NONE。
|
|
90
|
+
valid_duration_ns: int # 已知连续时间长度。
|
|
91
|
+
coverage: float # 已知时间/完整窗口时长。
|
|
92
|
+
monotonic: bool | None # 对应方向是否单调。
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def validate_delta_input(spec, spans, time_ns, dtype):
|
|
96
|
+
"""检查两个数值核共用的结构及dtype,不计算变化量或单调性。
|
|
97
|
+
|
|
98
|
+
参数: spec配置,spans不可变有序片段,time_ns判断时间,dtype声明类型。
|
|
99
|
+
返回: 规范int判断时间。异常: 类型、重叠、非法值或dtype范围错误。
|
|
100
|
+
"""
|
|
101
|
+
time_ns = require_int64_ns(time_ns)
|
|
102
|
+
if not isinstance(spec, WindowDeltaSpec) or type(spans) is not tuple:
|
|
103
|
+
raise TypeError('窗口需要WindowDeltaSpec及DeltaSpan tuple')
|
|
104
|
+
if dtype not in (D.INT64, D.UINT64, D.FLOAT64):
|
|
105
|
+
raise TypeError('window_delta只支持数值信号')
|
|
106
|
+
previous = None
|
|
107
|
+
for item in spans:
|
|
108
|
+
# 重叠输入会重复计算覆盖率,不能在核中悄悄排序或合并。
|
|
109
|
+
if not isinstance(item, DeltaSpan):
|
|
110
|
+
raise TypeError('窗口输入需DeltaSpan')
|
|
111
|
+
if previous is not None and (item.start_ns < previous.end_ns or item.start_ns <= previous.start_ns):
|
|
112
|
+
raise ValueError('窗口片段必须严格有序且不重叠')
|
|
113
|
+
previous = item
|
|
114
|
+
if item.value is None or (item.quality != Q.NONE and item.point_quality != Q.NONE):
|
|
115
|
+
continue
|
|
116
|
+
if dtype is D.FLOAT64:
|
|
117
|
+
if type(item.value) is not float or not isfinite(item.value):
|
|
118
|
+
raise ValueError('有效float64输入须为有限原生float')
|
|
119
|
+
elif type(item.value) is not int:
|
|
120
|
+
raise TypeError('有效整数信号不能隐式转浮点')
|
|
121
|
+
elif not (-(2**63) <= item.value < 2**63 if dtype is D.INT64 else 0 <= item.value < 2**64):
|
|
122
|
+
raise ValueError('有效数值超出声明dtype')
|
|
123
|
+
return time_ns
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"""用数组掩码计算窗口覆盖、首尾位置和整窗单调性。
|
|
2
|
+
|
|
3
|
+
输入和输出与独立参考一致;实际使用searchsorted、区间裁剪、质量掩码和
|
|
4
|
+
相邻数组比较,不调用参考核。时间在整数域裁剪后才建立数组,避免下限回绕。
|
|
5
|
+
数值保留int64/uint64/float64,不将大整数转换成浮点。无文件和状态副作用。
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
import numpy as np
|
|
9
|
+
from .types import QualityFlag as Q, SignalDType as D, Truth
|
|
10
|
+
from .window_delta import WindowDeltaResult, validate_delta_input
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def window_delta_numpy(spec, spans, time_ns, dtype):
|
|
14
|
+
"""通过真实数组运算计算一个窗口,不复用参考算法的数值函数。
|
|
15
|
+
|
|
16
|
+
参数: spec配置、spans有序DeltaSpan tuple、time_ns纳秒、dtype类型。
|
|
17
|
+
返回: WindowDeltaResult。异常: 输入错误;数值失败记录质量。
|
|
18
|
+
"""
|
|
19
|
+
time_ns = validate_delta_input(spec, spans, time_ns, dtype)
|
|
20
|
+
left = time_ns - spec.window_ns
|
|
21
|
+
starts = np.asarray([item.start_ns for item in spans], dtype=np.int64)
|
|
22
|
+
ends = np.asarray([item.end_ns for item in spans], dtype=np.int64)
|
|
23
|
+
flags = np.asarray([int(item.quality) for item in spans], dtype=np.uint16)
|
|
24
|
+
points = np.asarray([int(item.point_quality) for item in spans], dtype=np.uint16)
|
|
25
|
+
# 每个交叠长度不超过window_ns,求和不超过同一窗口,定宽时间运算安全。
|
|
26
|
+
lower = np.maximum(starts, max(left, -(2**63)))
|
|
27
|
+
upper = np.minimum(ends, time_ns)
|
|
28
|
+
overlap = lower < upper
|
|
29
|
+
lengths = np.zeros(len(spans), dtype=np.int64)
|
|
30
|
+
np.subtract(upper, lower, out=lengths, where=overlap)
|
|
31
|
+
duration = int(np.sum(lengths, where=flags == 0, initial=0, dtype=np.int64))
|
|
32
|
+
quality = Q(int(np.bitwise_or.reduce(flags[overlap], initial=0)))
|
|
33
|
+
indices = []
|
|
34
|
+
for boundary in (left, time_ns):
|
|
35
|
+
# left可能低于int64下限,先处理后再交给searchsorted,防隐式浮点比较。
|
|
36
|
+
index = -1 if boundary < -(2**63) else int(np.searchsorted(starts, boundary, side='right')) - 1
|
|
37
|
+
if index < 0 or not (starts[index] == boundary or boundary < ends[index]):
|
|
38
|
+
quality |= Q.MISSING
|
|
39
|
+
indices.append(None)
|
|
40
|
+
else:
|
|
41
|
+
indices.append(index)
|
|
42
|
+
quality |= Q(int(points[index] if starts[index] == boundary else flags[index]))
|
|
43
|
+
middle = (starts > max(left, -(2**63))) & (starts < time_ns)
|
|
44
|
+
# 当left低于最小时间时,最小时间处仍属于窗口内观测。
|
|
45
|
+
if left < -(2**63):
|
|
46
|
+
middle = starts < time_ns
|
|
47
|
+
quality |= Q(int(np.bitwise_or.reduce(points[middle], initial=0)))
|
|
48
|
+
if duration != spec.window_ns:
|
|
49
|
+
quality |= Q.MISSING
|
|
50
|
+
if quality != Q.NONE:
|
|
51
|
+
return WindowDeltaResult(time_ns, left, None, Truth.UNKNOWN, quality,
|
|
52
|
+
duration, duration / spec.window_ns, None)
|
|
53
|
+
first, last = (spans[index].value for index in indices)
|
|
54
|
+
values = np.asarray([first, *(item.value for item, include in zip(spans, middle) if include), last],
|
|
55
|
+
dtype=dtype.value)
|
|
56
|
+
nondecreasing = bool(np.all(values[1:] >= values[:-1]))
|
|
57
|
+
nonincreasing = bool(np.all(values[1:] <= values[:-1]))
|
|
58
|
+
monotonic = (nondecreasing if spec.direction == 'rise' else nonincreasing
|
|
59
|
+
if spec.direction == 'fall' else nondecreasing or nonincreasing)
|
|
60
|
+
a, b = (values[0], values[-1]) if spec.direction == 'fall' else (values[-1], values[0])
|
|
61
|
+
if spec.direction == 'any' and a < b:
|
|
62
|
+
a, b = b, a
|
|
63
|
+
# 减法前用范围不等式证明安全,防止numpy先回绕;无隐藏float提升。
|
|
64
|
+
if dtype is D.INT64:
|
|
65
|
+
aa, bb = int(a), int(b)
|
|
66
|
+
if (bb > 0 and aa < -(2**63) + bb) or (bb < 0 and aa > 2**63 - 1 + bb):
|
|
67
|
+
quality = Q.OVERFLOW
|
|
68
|
+
elif dtype is D.UINT64 and a < b:
|
|
69
|
+
quality = Q.OVERFLOW
|
|
70
|
+
if quality != Q.NONE:
|
|
71
|
+
return WindowDeltaResult(time_ns, left, None, Truth.UNKNOWN, quality, duration, 1.0, monotonic)
|
|
72
|
+
with np.errstate(over='ignore', invalid='ignore'):
|
|
73
|
+
value = np.subtract(a, b).item()
|
|
74
|
+
if dtype is D.FLOAT64 and not np.isfinite(value):
|
|
75
|
+
return WindowDeltaResult(time_ns, left, None, Truth.UNKNOWN, Q.NONFINITE, duration, 1.0, monotonic)
|
|
76
|
+
satisfied = value >= spec.threshold and (not spec.monotonic or monotonic)
|
|
77
|
+
return WindowDeltaResult(time_ns, left, value, Truth.TRUE if satisfied else Truth.FALSE,
|
|
78
|
+
Q.NONE, duration, 1.0, monotonic)
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"""用独立Python遍历计算完整窗口变化量,作为数组实现的数值参考。
|
|
2
|
+
|
|
3
|
+
输入是有界ZOH片段和一个查询时刻,输出数值、三值条件和覆盖率。
|
|
4
|
+
首尾使用点值,窗内使用实际观测及连续片段;缺口不插值、不延长有效期。
|
|
5
|
+
本模块不依赖NumPy,不读文件,不保存跨调用状态或触发锁存。
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from math import isfinite
|
|
9
|
+
from .types import QualityFlag as Q, SignalDType as D, Truth
|
|
10
|
+
from .window_delta import WindowDeltaResult, validate_delta_input
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def window_delta_reference(spec, spans, time_ns, dtype):
|
|
14
|
+
"""逐段求完整窗口首尾差和方向单调性。
|
|
15
|
+
|
|
16
|
+
参数: spec配置、spans有序DeltaSpan tuple、time_ns纳秒、dtype数值类型。
|
|
17
|
+
返回: WindowDeltaResult;阈值比较包含等于,UNKNOWN不伪装False。
|
|
18
|
+
异常: 输入结构错误;定宽数值溢出以质量结果返回。
|
|
19
|
+
"""
|
|
20
|
+
time_ns = validate_delta_input(spec, spans, time_ns, dtype)
|
|
21
|
+
left = time_ns - spec.window_ns
|
|
22
|
+
duration, quality, first, last, observations = 0, Q.NONE, None, None, []
|
|
23
|
+
first_found = last_found = False
|
|
24
|
+
for item in spans:
|
|
25
|
+
# 左端在边界上优先用该边界真实点;内部位置沿有限ZOH。
|
|
26
|
+
if item.start_ns == left or item.start_ns < left < item.end_ns:
|
|
27
|
+
first_found = True
|
|
28
|
+
first = item.value
|
|
29
|
+
quality |= item.point_quality if item.start_ns == left else item.quality
|
|
30
|
+
if item.start_ns == time_ns or item.start_ns < time_ns < item.end_ns:
|
|
31
|
+
last_found = True
|
|
32
|
+
last = item.value
|
|
33
|
+
quality |= item.point_quality if item.start_ns == time_ns else item.quality
|
|
34
|
+
lo, hi = max(left, item.start_ns), min(time_ns, item.end_ns)
|
|
35
|
+
if lo < hi:
|
|
36
|
+
if item.quality == Q.NONE:
|
|
37
|
+
duration += hi - lo
|
|
38
|
+
else:
|
|
39
|
+
quality |= item.quality
|
|
40
|
+
# 边界值与窗内真实观测都参与单调性,不能只比较两个端点。
|
|
41
|
+
if left < item.start_ns < time_ns:
|
|
42
|
+
quality |= item.point_quality
|
|
43
|
+
observations.append(item.value)
|
|
44
|
+
if not first_found or not last_found or duration != spec.window_ns:
|
|
45
|
+
quality |= Q.MISSING
|
|
46
|
+
if quality != Q.NONE:
|
|
47
|
+
return WindowDeltaResult(time_ns, left, None, Truth.UNKNOWN, quality,
|
|
48
|
+
duration, duration / spec.window_ns, None)
|
|
49
|
+
values = [first, *observations, last]
|
|
50
|
+
nondecreasing = all(a <= b for a, b in zip(values, values[1:]))
|
|
51
|
+
nonincreasing = all(a >= b for a, b in zip(values, values[1:]))
|
|
52
|
+
monotonic = (nondecreasing if spec.direction == 'rise' else nonincreasing
|
|
53
|
+
if spec.direction == 'fall' else nondecreasing or nonincreasing)
|
|
54
|
+
# Python整数先算真实差值再检查定宽范围,避免溢出后拿回绕值判断阈值。
|
|
55
|
+
value = first - last if spec.direction == 'fall' else last - first
|
|
56
|
+
if spec.direction == 'any':
|
|
57
|
+
value = abs(value)
|
|
58
|
+
if dtype is D.FLOAT64 and not isfinite(value):
|
|
59
|
+
quality = Q.NONFINITE
|
|
60
|
+
elif dtype is D.INT64 and not -(2**63) <= value < 2**63:
|
|
61
|
+
quality = Q.OVERFLOW
|
|
62
|
+
elif dtype is D.UINT64 and not 0 <= value < 2**64:
|
|
63
|
+
quality = Q.OVERFLOW
|
|
64
|
+
if quality != Q.NONE:
|
|
65
|
+
return WindowDeltaResult(time_ns, left, None, Truth.UNKNOWN, quality,
|
|
66
|
+
duration, 1.0, monotonic)
|
|
67
|
+
satisfied = value >= spec.threshold and (not spec.monotonic or monotonic)
|
|
68
|
+
return WindowDeltaResult(time_ns, left, value, Truth.TRUE if satisfied else Truth.FALSE,
|
|
69
|
+
Q.NONE, duration, 1.0, monotonic)
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
"""声明事件窗口和片段结果,校验归属并保存请求、实际边界与原活动关联。
|
|
2
|
+
|
|
3
|
+
输入是WindowSpec、已完成Event元组及真实观测Interval;独立后端负责扩展、
|
|
4
|
+
分组和裁剪,再由本模块包装Segment。片段合并不重写Event或填平条件未知。
|
|
5
|
+
核心执行模型独立于上层JSON WindowPlan,由执行层显式转换,避免核心导入配置/I/O。
|
|
6
|
+
本模块只验证协议、归类和生成稳定ID;不计算窗口数值、不读取旧日志或调用writer。
|
|
7
|
+
输入与返回均为完整内存模型;资源预算和原始报文导出由上层负责。
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
# 冻结结构保留边界和身份,标准库hash只生成结果标识。
|
|
11
|
+
from dataclasses import dataclass
|
|
12
|
+
from hashlib import sha256
|
|
13
|
+
import json
|
|
14
|
+
from math import isclose, isfinite
|
|
15
|
+
# 所有时间与来源位置为typed模型。
|
|
16
|
+
from .models import Interval, SourceRef
|
|
17
|
+
from .temporal import Event
|
|
18
|
+
from .types import QualityFlag as Q
|
|
19
|
+
from .validation import require_identifier, require_text
|
|
20
|
+
from ..timebase.conversion import require_int64_ns
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
@dataclass(frozen=True)
|
|
24
|
+
class WindowSpec:
|
|
25
|
+
"""声明围绕同一规则事件的前后范围及明确合并政策。
|
|
26
|
+
|
|
27
|
+
anchor为point或activity;pre/post为非负int64纳秒。point至少一项正。
|
|
28
|
+
exit_delay仅用于activity且post=0,根据真实活动间隔分组,不能按pre重叠扩大。
|
|
29
|
+
实例不保存执行状态,不依赖上层配置或旧模式的隐式参数解释。
|
|
30
|
+
"""
|
|
31
|
+
|
|
32
|
+
window_id: str # 当前窗口唯一简单标识。
|
|
33
|
+
event_rule_id: str # 已完成事件的规则标识。
|
|
34
|
+
anchor: str # point或activity,以onset/点时刻为锚。
|
|
35
|
+
pre_ns: int = 0 # 非负前扩展,不使用confirmed代替onset。
|
|
36
|
+
post_ns: int = 0 # 非负后扩展,exit_delay模式必须0。
|
|
37
|
+
merge: str = 'none' # none/overlap/overlap_and_adjacent/exit_delay。
|
|
38
|
+
exit_delay_ns: int | None = None # 只用于同名合并模式,不能重复附加post。
|
|
39
|
+
|
|
40
|
+
def __post_init__(self):
|
|
41
|
+
"""检查窗口声明,不计算边界或创建运行状态。
|
|
42
|
+
|
|
43
|
+
参数: 无;读取冻结字段。
|
|
44
|
+
返回: None。
|
|
45
|
+
异常: TypeError/ValueError/OverflowError为标识、参数或时间协议错误。
|
|
46
|
+
"""
|
|
47
|
+
# 名称与真实引用分开,不能用自由路径冒充规则标识。
|
|
48
|
+
require_identifier(self.window_id, 'window_id')
|
|
49
|
+
require_identifier(self.event_rule_id, 'event_rule_id')
|
|
50
|
+
# 精确非负纳秒,不接受bool、float或非法模式。
|
|
51
|
+
object.__setattr__(self, 'pre_ns', require_int64_ns(self.pre_ns, 'pre_ns'))
|
|
52
|
+
object.__setattr__(self, 'post_ns', require_int64_ns(self.post_ns, 'post_ns'))
|
|
53
|
+
if self.pre_ns < 0 or self.post_ns < 0 or self.anchor not in ('point', 'activity') or self.merge not in ('none', 'overlap', 'overlap_and_adjacent', 'exit_delay'):
|
|
54
|
+
raise ValueError('窗口锚点、扩展或合并政策错误')
|
|
55
|
+
# 点本身没有持续长度,必须明确扩展出窗口。
|
|
56
|
+
if self.anchor == 'point' and self.pre_ns == self.post_ns == 0:
|
|
57
|
+
raise ValueError('point窗口至少一个扩展为正')
|
|
58
|
+
# single只有退出延迟扩展,不能再附加同值post。
|
|
59
|
+
if self.merge == 'exit_delay':
|
|
60
|
+
object.__setattr__(self, 'exit_delay_ns', require_int64_ns(self.exit_delay_ns, 'exit_delay_ns'))
|
|
61
|
+
if self.anchor != 'activity' or self.post_ns != 0 or self.exit_delay_ns < 0:
|
|
62
|
+
raise ValueError('exit_delay要求activity、post=0及非负delay')
|
|
63
|
+
elif self.exit_delay_ns is not None:
|
|
64
|
+
raise ValueError('exit_delay_ns仅用于exit_delay合并')
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
@dataclass(frozen=True)
|
|
68
|
+
class Segment:
|
|
69
|
+
"""保存一个片段的请求与实际范围,并关联全部原事件。
|
|
70
|
+
|
|
71
|
+
requested永不因EOF裁剪重写;actual为真实交集或None。覆盖为实际/请求时长。
|
|
72
|
+
status为complete、partial或empty;event_statuses保留closed/timeout/interrupted/truncated/point。
|
|
73
|
+
parent_event_ids、质量和字段来源不可变;合并不改变原事件数量或统计scope。
|
|
74
|
+
"""
|
|
75
|
+
|
|
76
|
+
segment_id: str # 内容SHA,区别于旧整数秒文件名。
|
|
77
|
+
dataset_id: str # 当前数据集归属。
|
|
78
|
+
session_id: str # 当前真实会话,不跨会话合并。
|
|
79
|
+
window: WindowSpec # 原窗口声明,保留合并政策。
|
|
80
|
+
requested: Interval # 完整请求半开范围。
|
|
81
|
+
actual: Interval | None # 裁剪后实际范围,无交集为None。
|
|
82
|
+
requested_coverage: float # 两后端独立计算的时长比。
|
|
83
|
+
status: str # complete/partial/empty,不冒充文件发布完成。
|
|
84
|
+
parent_event_ids: tuple[str, ...] # 全部原活动/点事件稳定关联。
|
|
85
|
+
event_statuses: tuple[str, ...] # 同长原事件结束状态,UNKNOWN中断不改closed。
|
|
86
|
+
quality: Q # 全部原事件的结束质量及依赖诊断。
|
|
87
|
+
source_refs: tuple[SourceRef, ...] # 当前所有依赖原字段引用。
|
|
88
|
+
|
|
89
|
+
def __post_init__(self):
|
|
90
|
+
"""检查片段归属、范围、覆盖及原事件引用的一致性。
|
|
91
|
+
|
|
92
|
+
参数: 无;读取全部冻结字段。
|
|
93
|
+
返回: None,不补范围或静默改覆盖。
|
|
94
|
+
异常: TypeError/ValueError/OverflowError为非法结果模型。
|
|
95
|
+
"""
|
|
96
|
+
# 稳定文本与简单会话标识各自校验。
|
|
97
|
+
require_text(self.segment_id, 'segment_id')
|
|
98
|
+
require_identifier(self.dataset_id, 'dataset_id')
|
|
99
|
+
require_identifier(self.session_id, 'session_id')
|
|
100
|
+
if not isinstance(self.window, WindowSpec) or not isinstance(self.requested, Interval) or self.requested.duration_ns() == 0:
|
|
101
|
+
raise TypeError('Segment需WindowSpec及正请求Interval')
|
|
102
|
+
# 交集必须在原请求内,不能外推或接受自由对象。
|
|
103
|
+
if self.actual is not None and (not isinstance(self.actual, Interval) or self.actual.start_ns < self.requested.start_ns or self.actual.end_ns > self.requested.end_ns):
|
|
104
|
+
raise ValueError('Segment实际范围必须是请求子区间')
|
|
105
|
+
actual_duration = 0 if self.actual is None else self.actual.duration_ns()
|
|
106
|
+
# 完整/部分/空范围由真实边界判定,不仅靠浮点比值。
|
|
107
|
+
expected_status = 'complete' if self.actual == self.requested else 'partial' if actual_duration else 'empty'
|
|
108
|
+
if self.status != expected_status or type(self.requested_coverage) not in (int, float) or not isfinite(self.requested_coverage) or not 0 <= self.requested_coverage <= 1:
|
|
109
|
+
raise ValueError('Segment状态或覆盖错误')
|
|
110
|
+
# 独立float64比值只容许相对舍入差;绝对容差为0,极小正覆盖不能伪报为0。
|
|
111
|
+
if not isclose(self.requested_coverage, actual_duration / self.requested.duration_ns(), rel_tol=1e-15, abs_tol=0.):
|
|
112
|
+
raise ValueError('Segment覆盖与时间事实不一致')
|
|
113
|
+
# 每个原事件都有唯一ID与保留的结束状态。
|
|
114
|
+
if not isinstance(self.parent_event_ids, tuple) or not self.parent_event_ids or len(set(self.parent_event_ids)) != len(self.parent_event_ids):
|
|
115
|
+
raise ValueError('Segment需非空唯一parent_event_ids')
|
|
116
|
+
for identity in self.parent_event_ids:
|
|
117
|
+
require_text(identity, 'parent_event_id')
|
|
118
|
+
if not isinstance(self.event_statuses, tuple) or len(self.event_statuses) != len(self.parent_event_ids) or any(status not in ('closed', 'timeout', 'interrupted', 'truncated', 'point') for status in self.event_statuses):
|
|
119
|
+
raise ValueError('Segment事件状态需同长完整tuple')
|
|
120
|
+
if not isinstance(self.quality, Q) or not isinstance(self.source_refs, tuple) or any(not isinstance(ref, SourceRef) for ref in self.source_refs):
|
|
121
|
+
raise TypeError('Segment质量与来源需typed模型')
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
def require_windows(events, spec, observation):
|
|
125
|
+
"""验证已完成事件的排序、规则/会话归属和真实观测范围。
|
|
126
|
+
|
|
127
|
+
参数: events为已排序Event tuple;spec为WindowSpec;observation为真实Interval。
|
|
128
|
+
返回: None,只校验协议,不扩展或合并窗口。
|
|
129
|
+
异常: TypeError/ValueError为类型、重复、回退、归属或锚点不匹配。
|
|
130
|
+
"""
|
|
131
|
+
# 上层负责取得真实观测,不以请求domain补齐EOF。
|
|
132
|
+
if not isinstance(events, tuple) or not isinstance(spec, WindowSpec) or not isinstance(observation, Interval) or any(not isinstance(event, Event) for event in events):
|
|
133
|
+
raise TypeError('窗口执行需Event tuple/WindowSpec/Interval')
|
|
134
|
+
identities = set()
|
|
135
|
+
previous = None
|
|
136
|
+
for event in events:
|
|
137
|
+
# 同一窗口仅使用同一规则/数据集/会话;不重新排序以掩盖回退。
|
|
138
|
+
if event.rule.rule_id != spec.event_rule_id or event.event_type != spec.anchor or event.event_id in identities:
|
|
139
|
+
raise ValueError('窗口事件规则、锚点或唯一性不匹配')
|
|
140
|
+
# start_only的固定结束与抑制时长是同一声明,不能额外合并或改变post。
|
|
141
|
+
if event.rule.rule_type == 'start_only' and (spec.merge != 'none' or spec.post_ns != event.rule.window_duration_ns):
|
|
142
|
+
raise ValueError('start_only窗口需merge=none且post等于固定时长')
|
|
143
|
+
if previous is not None and (event.start_ns < previous.start_ns or (event.rule.dataset_id, event.rule.session_id) != (previous.rule.dataset_id, previous.rule.session_id)):
|
|
144
|
+
raise ValueError('窗口事件不能回退或跨会话合并')
|
|
145
|
+
# 相同持续规则的真实活动不能重叠;点同刻不同规则已被上面拒绝。
|
|
146
|
+
if previous is not None and spec.anchor == 'activity' and event.start_ns < previous.end_ns:
|
|
147
|
+
raise ValueError('同一规则真实活动不能重叠')
|
|
148
|
+
if event.start_ns < observation.start_ns or (event.start_ns if event.end_ns is None else event.end_ns) > observation.end_ns:
|
|
149
|
+
raise ValueError('事件事实超出实际观测范围')
|
|
150
|
+
identities.add(event.event_id)
|
|
151
|
+
previous = event
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
@dataclass(frozen=True)
|
|
155
|
+
class CompactSegment:
|
|
156
|
+
"""仅保实际业务范围和父事件关联,不输出重复请求边界、覆盖比例或来源副本。"""
|
|
157
|
+
segment_id: str
|
|
158
|
+
dataset_id: str
|
|
159
|
+
session_id: str
|
|
160
|
+
window_id: str
|
|
161
|
+
actual: Interval | None
|
|
162
|
+
status: str
|
|
163
|
+
parent_event_ids: tuple[str,...]
|
|
164
|
+
quality: Q
|
|
165
|
+
coverage: float | None = None # 仅下游明确设置覆盖门槛时计算,默认不保存。
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
def require_resolved_windows(events,bounds,compact):
|
|
169
|
+
"""检查预先按选定周期取得的实际边界,未提供时沿旧实际扩展。
|
|
170
|
+
|
|
171
|
+
参数: 原事件、可选同长(start,end,left_clipped,right_clipped)tuple、精简开关。
|
|
172
|
+
返回: None。异常: 类型/长度/边界错误。副作用: 不构造另一时间轴。
|
|
173
|
+
"""
|
|
174
|
+
if type(compact) is not bool:
|
|
175
|
+
raise TypeError('compact需要bool')
|
|
176
|
+
if bounds is None:
|
|
177
|
+
return
|
|
178
|
+
if not compact or type(bounds) is not tuple or len(bounds)!=len(events):
|
|
179
|
+
raise ValueError('已解析边界仅用于精简窗口且需同长tuple')
|
|
180
|
+
for item in bounds:
|
|
181
|
+
if type(item) is not tuple or len(item)!=4 or any(type(v) is not bool for v in item[2:]):
|
|
182
|
+
raise TypeError('窗口边界需起止与两侧裁剪标识')
|
|
183
|
+
Interval(item[0],item[1])
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
def make_segment(spec, requested, actual, coverage, parents, *, compact=False, clipped=False):
|
|
187
|
+
"""包装独立后端的边界/覆盖事实,保留全部原活动元数据。
|
|
188
|
+
|
|
189
|
+
参数: spec原窗口;requested/actual已算边界;coverage独立时长比;parents非空Event tuple;
|
|
190
|
+
compact仅构造精简业务输出,clipped说明选定周期已在输入首尾裁剪。
|
|
191
|
+
返回: Segment,稳定ID包含窗口语义、原事件引用与请求/实际边界。
|
|
192
|
+
异常: 输出模型不满足约束时传播检查异常。
|
|
193
|
+
副作用: 无;不计算扩展、分组或窗口覆盖,不修改Event。
|
|
194
|
+
"""
|
|
195
|
+
# 原活动ID与状态保持顺序;元数据归并不涉及数值或旧扫描。
|
|
196
|
+
identities = tuple(event.event_id for event in parents)
|
|
197
|
+
if compact:
|
|
198
|
+
quality=Q.NONE
|
|
199
|
+
for event in parents:
|
|
200
|
+
quality|=event.quality
|
|
201
|
+
if actual is not None and not actual.duration_ns():
|
|
202
|
+
actual=None
|
|
203
|
+
status='empty' if actual is None else 'partial' if clipped or actual!=requested else 'complete'
|
|
204
|
+
payload=('window-v2',spec.window_id,identities,None if actual is None else (actual.start_ns,actual.end_ns),status)
|
|
205
|
+
identity=sha256(json.dumps(payload,separators=(',',':')).encode('utf-8')).hexdigest()
|
|
206
|
+
return CompactSegment(identity,parents[0].rule.dataset_id,parents[0].rule.session_id,
|
|
207
|
+
spec.window_id,actual,status,identities,quality)
|
|
208
|
+
statuses = tuple(event.status for event in parents)
|
|
209
|
+
quality = Q.NONE
|
|
210
|
+
refs = []
|
|
211
|
+
for event in parents:
|
|
212
|
+
quality |= event.quality | event.dependency_quality
|
|
213
|
+
for ref in event.source_refs:
|
|
214
|
+
if ref not in refs:
|
|
215
|
+
refs.append(ref)
|
|
216
|
+
# 稳定规范JSON生成ID;裁剪范围和配置变化对应不同片段身份。
|
|
217
|
+
payload = ('window-v1', spec.window_id, spec.event_rule_id, spec.anchor, spec.pre_ns, spec.post_ns,
|
|
218
|
+
spec.merge, spec.exit_delay_ns, identities, requested.start_ns, requested.end_ns,
|
|
219
|
+
None if actual is None else (actual.start_ns, actual.end_ns))
|
|
220
|
+
identity = sha256(json.dumps(payload, separators=(',', ':')).encode('utf-8')).hexdigest()
|
|
221
|
+
# 分类只是输出政策,不复用任一后端的扩展或分组算法。
|
|
222
|
+
status = 'complete' if actual == requested else 'partial' if actual is not None and actual.duration_ns() else 'empty'
|
|
223
|
+
return Segment(identity, parents[0].rule.dataset_id, parents[0].rule.session_id, spec, requested, actual,
|
|
224
|
+
coverage, status, identities, statuses, quality, tuple(refs))
|