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,290 @@
|
|
|
1
|
+
"""只对明确的事件指标保存必要计算值,并按事件真实范围回读。
|
|
2
|
+
|
|
3
|
+
同表达式、条件和驱动共享一份紧凑历史;每次查询复用已验证的记录积分/统计核。
|
|
4
|
+
窗口尚未确定前只接事件,默认会话统计不创建这个所有者。
|
|
5
|
+
"""
|
|
6
|
+
import heapq
|
|
7
|
+
from functools import partial as bind_consumer
|
|
8
|
+
from dataclasses import replace
|
|
9
|
+
from ..core.models import Interval
|
|
10
|
+
from ..core.calculations import CalculationDefinition
|
|
11
|
+
from ..results.errors import ResultClosedError
|
|
12
|
+
from ..results.spool import _reserve_owned_ram,_release_owned_ram,_cleanup_owner
|
|
13
|
+
from .history import _metadata_bytes
|
|
14
|
+
from .driver_expression import DriverExpression
|
|
15
|
+
from .record_value_history import RecordValueHistory
|
|
16
|
+
from .record_integral import RecordIntegral
|
|
17
|
+
from .record_time_calculation import RecordTimeCalculation
|
|
18
|
+
from .record_selection import RecordSelection
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class RecordScopeCalculations:
|
|
22
|
+
"""拥有必要表达式历史、等待右端的查询及当前统计器;计划/状态为借用。"""
|
|
23
|
+
|
|
24
|
+
def __init__(self,plan,state,budget,path,steps,requests,ends,consumer,*,selection_consumer=None):
|
|
25
|
+
"""建立已请求的有限表达式分组。参数: 原计划/状态/预算/路径/周期/请求/EOF/回调。返回: owner。异常: 原构造错。"""
|
|
26
|
+
self._plan,self._budget,self._path,self._consumer=plan,budget,path,consumer
|
|
27
|
+
self._selection_consumer=selection_consumer
|
|
28
|
+
self._requests,self._steps=requests,steps
|
|
29
|
+
self._held_cost=self._fixed_cost=self._queue_cost=0
|
|
30
|
+
self._streams,self._request_stream={},{}
|
|
31
|
+
self._queue=[]
|
|
32
|
+
self._serial=0
|
|
33
|
+
self._pending=self._calculation=None
|
|
34
|
+
self._calculators=[]
|
|
35
|
+
self._closed=self._failed=False
|
|
36
|
+
try:
|
|
37
|
+
_reserve_owned_ram(self,131072+64*_metadata_bytes(requests),'_fixed_cost')
|
|
38
|
+
choices=dict(plan.intervals.resolved)
|
|
39
|
+
from ..planning.intervals import IntervalChoice
|
|
40
|
+
sample_ops=('sample_minimum','sample_maximum','sample_mean','select')
|
|
41
|
+
for request in requests:
|
|
42
|
+
if request.operation in sample_ops:choices[request.calculation_id]=IntervalChoice('actual')
|
|
43
|
+
sample_keys={(r.signal.identity,None if r.condition is None else r.condition.identity,None)
|
|
44
|
+
for r in requests if r.operation in sample_ops}
|
|
45
|
+
for request in requests:
|
|
46
|
+
expression=request.signal if request.signal is not None else request.condition
|
|
47
|
+
condition=request.condition if request.signal is not None else None
|
|
48
|
+
driver=choices[request.calculation_id].driver
|
|
49
|
+
key=(expression.identity,None if condition is None else condition.identity,driver)
|
|
50
|
+
self._request_stream[request.calculation_id]=key
|
|
51
|
+
if key in self._streams:
|
|
52
|
+
continue
|
|
53
|
+
self._streams[key]=[None,None,None,expression,condition,
|
|
54
|
+
driver is None and not expression.dependencies and (condition is None or not condition.dependencies)]
|
|
55
|
+
stream=self._streams[key]
|
|
56
|
+
for index,static in enumerate((expression,condition)):
|
|
57
|
+
if static is not None:
|
|
58
|
+
stream[index]=self._new(DriverExpression,'driver_expression_cleanup_owner',static,state,driver,
|
|
59
|
+
backend=plan.execution.backend,derived=tuple(item.definition for item in plan.derived),observation_ends=ends)
|
|
60
|
+
stream[2]=self._new(RecordValueHistory,'record_value_history_cleanup_owner',
|
|
61
|
+
budget,path,expression.root.dtype,condition is not None,sample_updates=key in sample_keys,
|
|
62
|
+
labels=expression.root.labels)
|
|
63
|
+
except BaseException as error:
|
|
64
|
+
_cleanup_owner(self,error,'record_scope_calculations_cleanup_owner','事件指标构造')
|
|
65
|
+
raise
|
|
66
|
+
|
|
67
|
+
def _new(self,factory,recovery,*args,**kwargs):
|
|
68
|
+
"""接住未返回的实际子owner。参数: 工厂/恢复字段/构造参数。返回: owner。异常: 原错。"""
|
|
69
|
+
try:
|
|
70
|
+
return factory(*args,**kwargs)
|
|
71
|
+
except BaseException as error:
|
|
72
|
+
self._pending=getattr(error,recovery,None)
|
|
73
|
+
raise
|
|
74
|
+
|
|
75
|
+
def _open(self):
|
|
76
|
+
"""拒绝已失败/关闭的执行。参数: 无。返回: None。异常: ResultClosedError。"""
|
|
77
|
+
if self._closed or self._failed:
|
|
78
|
+
raise ResultClosedError('事件指标已关闭或失败')
|
|
79
|
+
|
|
80
|
+
def observe_group(self):
|
|
81
|
+
"""完整组已原子提交,更新各必要表达式一次。参数: 无。返回: None。异常: 求值/写入/预算原错。"""
|
|
82
|
+
self._open()
|
|
83
|
+
for value,condition,history,_,__,constant in self._streams.values():
|
|
84
|
+
if constant:
|
|
85
|
+
continue
|
|
86
|
+
row=value.evaluate()
|
|
87
|
+
selected=None if condition is None else condition.evaluate()
|
|
88
|
+
if value.invalidated_at is not None:
|
|
89
|
+
history.expire_at(value.invalidated_at)
|
|
90
|
+
if condition is not None and condition.invalidated_at is not None:
|
|
91
|
+
history.expire_at(condition.invalidated_at,condition=True)
|
|
92
|
+
if row is not None:
|
|
93
|
+
if condition is not None and (selected is None or selected[0]!=row[0]):
|
|
94
|
+
raise ValueError('事件值和条件必须共用驱动')
|
|
95
|
+
actual=history._sample_updates and any((sample:=value._state.get(name)) is not None
|
|
96
|
+
and sample.time_ns==row[0] for name in value._static.dependencies)
|
|
97
|
+
history.append(row,selected,actual_update=actual)
|
|
98
|
+
self._flush()
|
|
99
|
+
|
|
100
|
+
def observe_event(self,event):
|
|
101
|
+
"""仅保等待计算需要的父ID和真实端点,不复制事件全文。参数: 事件。返回: None。异常: 预算/计算原错。"""
|
|
102
|
+
self._open()
|
|
103
|
+
requests=tuple(request for request in self._requests if request.scope=='event:'+event.rule.rule_id)
|
|
104
|
+
if requests:
|
|
105
|
+
end=event.start_ns if event.end_ns is None else event.end_ns
|
|
106
|
+
# 选择起点只裁统计范围;事件自身仍保留原活动开始、确认和结束。
|
|
107
|
+
rule=next(item for item in self._plan.rules if item.rule_id==event.rule.rule_id)
|
|
108
|
+
start=event.confirmed_ns if rule.selection_origin=='confirmed' else event.start_ns
|
|
109
|
+
cost=8192+16*_metadata_bytes(event.event_id)+128*len(requests)
|
|
110
|
+
_reserve_owned_ram(self,cost,'_queue_cost')
|
|
111
|
+
heapq.heappush(self._queue,(end,self._serial,requests,event.event_id,start,cost))
|
|
112
|
+
self._serial+=1
|
|
113
|
+
self._flush()
|
|
114
|
+
|
|
115
|
+
def observe_segment(self,segment):
|
|
116
|
+
"""EOF后按实际片段范围计算,缺失扩展不伪装完整。
|
|
117
|
+
|
|
118
|
+
参数: 精简核心片段。返回: None。异常: 原查询错;空片段只返回无观测值。
|
|
119
|
+
"""
|
|
120
|
+
self._open()
|
|
121
|
+
requests=tuple(request for request in self._requests if request.scope=='segment:'+segment.window_id)
|
|
122
|
+
if not requests:
|
|
123
|
+
return
|
|
124
|
+
actual=segment.actual
|
|
125
|
+
start=self._plan.dataset.domain.start_ns if actual is None else actual.start_ns
|
|
126
|
+
end=start if actual is None else actual.end_ns
|
|
127
|
+
self._calculate(requests,segment.segment_id,start,end,partial=segment.status!='complete',
|
|
128
|
+
parent_coverage=segment.coverage)
|
|
129
|
+
|
|
130
|
+
def _calculate(self,requests,parent,start_ns,end_ns,*,partial=False,parent_coverage=None):
|
|
131
|
+
"""同范围、同表达式的相邻指标共读一次;预算余量不足时缩为单项。
|
|
132
|
+
|
|
133
|
+
参数: 原声明顺序的请求tuple/父ID/实际范围及覆盖。返回: None。异常: 原查询、预算或输出错误。
|
|
134
|
+
不缓存整个范围;每次借一行同时交给有限计算器,仍按声明顺序发布。
|
|
135
|
+
"""
|
|
136
|
+
from itertools import groupby
|
|
137
|
+
for key,group in groupby(requests,key=lambda request:self._request_stream[request.calculation_id]):
|
|
138
|
+
items=tuple(group)
|
|
139
|
+
# 留出每项计算器和批数组的余量;所有真实分配仍由共享预算检查。
|
|
140
|
+
available=self._budget.memory_budget_bytes-self._budget.ram_bytes
|
|
141
|
+
width=max(1,min(8,available//(32*1024*1024)))
|
|
142
|
+
for offset in range(0,len(items),width):
|
|
143
|
+
chunk=items[offset:offset+width]
|
|
144
|
+
self._calculate_chunk(key,chunk,parent,start_ns,end_ns,partial,parent_coverage)
|
|
145
|
+
|
|
146
|
+
def _calculate_chunk(self,key,requests,parent,start_ns,end_ns,partial,parent_coverage):
|
|
147
|
+
"""建立有限计算器组并共享一次回读。参数: 流key/请求/范围/质量。返回: None。异常: 原错误保留owner。
|
|
148
|
+
"""
|
|
149
|
+
history,expression,condition=self._streams[key][2:5]
|
|
150
|
+
for request in requests:
|
|
151
|
+
spec=CalculationDefinition(request.calculation_id,request.operation,Interval(start_ns,end_ns),request.partial_policy,
|
|
152
|
+
request.unit,request.scope.split(':',1)[0],request.minimum_coverage)
|
|
153
|
+
factory=RecordIntegral if request.operation=='integral' else RecordTimeCalculation
|
|
154
|
+
recovery='record_integral_cleanup_owner' if request.operation=='integral' else 'record_time_cleanup_owner'
|
|
155
|
+
extra={'work_dir':self._path} if request.operation=='time_weighted_mean' else {}
|
|
156
|
+
if request.operation=='select':
|
|
157
|
+
factory,recovery=RecordSelection,'record_selection_cleanup_owner'
|
|
158
|
+
extra={'consumer':bind_consumer(self._selection_consumer,request,parent)}
|
|
159
|
+
self._calculation=self._new(factory,recovery,self._budget,spec,expression.root.unit,expression.root.dtype,
|
|
160
|
+
self._steps[request.calculation_id],backend=self._plan.execution.backend,
|
|
161
|
+
batch_intervals=min(self._plan.execution.batch_rows,4096),conditioned=condition is not None,
|
|
162
|
+
**extra)
|
|
163
|
+
self._calculators.append(self._calculation);self._calculation=None
|
|
164
|
+
for point in history.rows(start_ns,end_ns):
|
|
165
|
+
time,value,deadline,selected,selected_end=point[:5]
|
|
166
|
+
for calculation in self._calculators:
|
|
167
|
+
calculation.consume(((time,value,deadline),),**({} if condition is None else
|
|
168
|
+
{'conditions':(selected,),'condition_valid_until_ns':(selected_end,)}),
|
|
169
|
+
**({'actual_value_updates':(point[5],)} if getattr(calculation,'_samples',False) else {}))
|
|
170
|
+
for request,calculation in zip(requests,self._calculators):
|
|
171
|
+
self._finish_observation_tail(key,calculation,end_ns)
|
|
172
|
+
result=calculation.finish()
|
|
173
|
+
if request.operation=='select':
|
|
174
|
+
calculation.close()
|
|
175
|
+
continue
|
|
176
|
+
if partial and result.value is not None:
|
|
177
|
+
result=replace(result,value=None if request.partial_policy=='strict' else result.value,
|
|
178
|
+
status='indeterminate' if request.partial_policy=='strict' else 'partial',reason='partial_input')
|
|
179
|
+
if request.scope.startswith('segment:') and request.minimum_coverage>0 and (
|
|
180
|
+
parent_coverage is None or parent_coverage<request.minimum_coverage):
|
|
181
|
+
result=replace(result,coverage_status='indeterminate')
|
|
182
|
+
self._consumer(request,parent,result)
|
|
183
|
+
calculation.close()
|
|
184
|
+
self._calculators.clear()
|
|
185
|
+
|
|
186
|
+
def _finish_observation_tail(self,key,calculation,end_ns):
|
|
187
|
+
"""用真实来源终点补查询尾段,既不补固定周期也不增加真实样本。
|
|
188
|
+
|
|
189
|
+
参数: key为共享表达式流,calculation为本次范围统计器,end_ns为查询右端。
|
|
190
|
+
返回: None。异常: 表达式、预算或累计错误沿查询清理路径传播。
|
|
191
|
+
只处理整个历史的最后一点;旧范围已有右邻点时绝不借用当前状态重新求值。
|
|
192
|
+
"""
|
|
193
|
+
samples=getattr(calculation,'_samples',False)
|
|
194
|
+
value,condition,history=self._streams[key][:3]
|
|
195
|
+
if (not calculation._rows or not samples and calculation._step_ns is not None
|
|
196
|
+
or calculation._last_time!=history.last_time or calculation._last_time>=end_ns):
|
|
197
|
+
return
|
|
198
|
+
sources={definition.source for expression in (value,condition) if expression is not None
|
|
199
|
+
for _,definition in expression._definitions}
|
|
200
|
+
ends=value._observation_ends
|
|
201
|
+
if not sources or ends is None or any(source not in ends for source in sources):
|
|
202
|
+
return
|
|
203
|
+
start=calculation._last_time
|
|
204
|
+
end=min(end_ns,max(ends[source] for source in sources))
|
|
205
|
+
if end<=start:
|
|
206
|
+
return
|
|
207
|
+
# 此点是整个流的最新相关更新;EOF已知后重新核对右侧保持,保留TTL及短路条件含义。
|
|
208
|
+
current,deadline=value.evaluate_at(start)
|
|
209
|
+
selected,condition_deadline=(None,None) if condition is None else condition.evaluate_at(start)
|
|
210
|
+
if samples:
|
|
211
|
+
previous=calculation._rows[-1]
|
|
212
|
+
value_ends=tuple(t for t in (previous[2],deadline,start if not current.valid else None) if t is not None)
|
|
213
|
+
condition_ends=tuple(t for t in (previous[4],condition_deadline,
|
|
214
|
+
start if selected is not None and not selected.valid else None) if t is not None)
|
|
215
|
+
calculation._rows[-1]=(start,previous[1],min(value_ends) if value_ends else None,
|
|
216
|
+
previous[3],min(condition_ends) if condition_ends else None)+previous[5:]
|
|
217
|
+
else:
|
|
218
|
+
calculation._rows[-1]=(start,current,deadline,selected,condition_deadline)
|
|
219
|
+
calculation.consume(((end,current,deadline),),
|
|
220
|
+
**({'actual_value_updates':(False,)} if samples else {}),
|
|
221
|
+
**({} if condition is None else
|
|
222
|
+
{'conditions':(selected,),'condition_valid_until_ns':(condition_deadline,)}))
|
|
223
|
+
|
|
224
|
+
def _flush(self,final=False):
|
|
225
|
+
"""右侧实际驱动到达才结算;EOF直接按已有点计算,不补周期。
|
|
226
|
+
|
|
227
|
+
参数: final只在真实EOF时为True。返回: None。异常: 原查询错,未退费用由close清理。
|
|
228
|
+
"""
|
|
229
|
+
pending=[]
|
|
230
|
+
try:
|
|
231
|
+
while self._queue:
|
|
232
|
+
item=heapq.heappop(self._queue)
|
|
233
|
+
end,_,requests,parent,start,cost=item
|
|
234
|
+
histories=(self._streams[self._request_stream[request.calculation_id]][2] for request in requests)
|
|
235
|
+
if not final and any(history.last_time is None or history.last_time<end for history in histories):
|
|
236
|
+
pending.append(item)
|
|
237
|
+
continue
|
|
238
|
+
self._calculate(requests,parent,start,end)
|
|
239
|
+
item=None
|
|
240
|
+
_release_owned_ram(self,cost,'_queue_cost')
|
|
241
|
+
except BaseException:
|
|
242
|
+
self._failed=True
|
|
243
|
+
raise
|
|
244
|
+
finally:
|
|
245
|
+
for item in pending:
|
|
246
|
+
heapq.heappush(self._queue,item)
|
|
247
|
+
|
|
248
|
+
def finish(self,cursors):
|
|
249
|
+
"""来源全部完成后处理常量和剩余事件。参数: 实际来源游标。返回: None。异常: 原求值/计算错。"""
|
|
250
|
+
self._open()
|
|
251
|
+
starts=[c.observed_start for c in cursors if c.observed_start is not None]
|
|
252
|
+
ends=[c.observed_end for c in cursors if c.observed_start is not None and c.observed_end is not None]
|
|
253
|
+
if starts and ends:
|
|
254
|
+
first,last=min(starts),max(ends)
|
|
255
|
+
for value,condition,history,_,__,constant in self._streams.values():
|
|
256
|
+
if constant:
|
|
257
|
+
result,_=value.evaluate_at(last)
|
|
258
|
+
selected=None if condition is None else condition.evaluate_at(last)[0]
|
|
259
|
+
for time in dict.fromkeys((first,last)):
|
|
260
|
+
history.append((time,result,None),None if condition is None else (time,selected,None))
|
|
261
|
+
self._flush(final=True)
|
|
262
|
+
|
|
263
|
+
@property
|
|
264
|
+
def closed(self):
|
|
265
|
+
"""返回关闭事实。参数: 无。返回: bool。异常: 无。"""
|
|
266
|
+
return self._closed
|
|
267
|
+
|
|
268
|
+
def close(self):
|
|
269
|
+
"""按责任关闭子资源,失败时保槽供重试。参数: 无。返回: None。异常: 原关闭错。"""
|
|
270
|
+
if self._closed:
|
|
271
|
+
return
|
|
272
|
+
for slot in ('_pending','_calculation'):
|
|
273
|
+
owner=getattr(self,slot)
|
|
274
|
+
if owner is not None:
|
|
275
|
+
owner.close()
|
|
276
|
+
setattr(self,slot,None)
|
|
277
|
+
for owner in self._calculators:
|
|
278
|
+
owner.close()
|
|
279
|
+
self._calculators.clear()
|
|
280
|
+
for stream in self._streams.values():
|
|
281
|
+
for index in range(3):
|
|
282
|
+
if stream[index] is not None:
|
|
283
|
+
stream[index].close()
|
|
284
|
+
stream[index]=None
|
|
285
|
+
self._streams.clear()
|
|
286
|
+
self._queue.clear()
|
|
287
|
+
self._requests=self._plan=self._consumer=self._request_stream=None
|
|
288
|
+
_release_owned_ram(self,self._queue_cost,'_queue_cost')
|
|
289
|
+
_release_owned_ram(self,self._fixed_cost,'_fixed_cost')
|
|
290
|
+
self._closed=True
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"""把真实样本更新有界地交给原select核,并直接写最终选择表。
|
|
2
|
+
|
|
3
|
+
条件独自变化、TTL和裁剪边界不输出行。TRUE与UNKNOWN保持区别;只保存一批及
|
|
4
|
+
共享右端,没有完整选择历史或第二套算法。事件范围由必要历史提供相同协议。
|
|
5
|
+
"""
|
|
6
|
+
from ..core.calculations_reference import select_reference
|
|
7
|
+
from ..core.calculations_numpy import select_numpy
|
|
8
|
+
from ..results.budget import _reserve_owned_ram,_release_owned_ram,_cleanup_owner
|
|
9
|
+
from .record_point_buffer import RecordPointBuffer
|
|
10
|
+
from .record_sample_series import sample_series
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class RecordSelection(RecordPointBuffer):
|
|
14
|
+
"""拥有有限样本缓冲;结果行只在回调期间借用,不累计输出列表。"""
|
|
15
|
+
def __init__(self,budget,spec,input_unit,dtype,step_ns,*,backend='numpy',batch_intervals=64,
|
|
16
|
+
conditioned=False,consumer=None):
|
|
17
|
+
"""预约必要缓冲。参数: 共享预算/选择请求/类型/后端/回调。返回: owner。异常: 配置或预算错。"""
|
|
18
|
+
if spec.operation!='select' or step_ns is not None or backend not in ('reference','numpy') or not callable(consumer):
|
|
19
|
+
raise ValueError('选择需要select、无周期和明确后端及行消费者')
|
|
20
|
+
if type(batch_intervals) is not int or not 1<=batch_intervals<=4096 or type(conditioned) is not bool:
|
|
21
|
+
raise ValueError('选择需要合法批大小及条件开关')
|
|
22
|
+
self._budget,self._spec,self._input_unit,self._dtype=budget,spec,input_unit,dtype
|
|
23
|
+
self._consumer,self._backend=consumer,backend
|
|
24
|
+
self._limit,self._conditioned,self._samples=batch_intervals,conditioned,True
|
|
25
|
+
self._held_cost=self._fixed_cost=self._workspace_cost=0
|
|
26
|
+
self._rows=None;self._last_time=None
|
|
27
|
+
self._closed=self._closing=self._failed=self._finished=False
|
|
28
|
+
try:
|
|
29
|
+
_reserve_owned_ram(self,65536+(batch_intervals+1)*4096,'_fixed_cost')
|
|
30
|
+
self._rows=[]
|
|
31
|
+
except BaseException as error:
|
|
32
|
+
_cleanup_owner(self,error,'record_selection_cleanup_owner','样本选择');raise
|
|
33
|
+
|
|
34
|
+
def _flush(self):
|
|
35
|
+
"""消费当前正时段,留下右端供下一批。参数: 无。返回: None。异常: 核或输出错误。"""
|
|
36
|
+
if len(self._rows)<2:return
|
|
37
|
+
series=row=iterator=None
|
|
38
|
+
try:
|
|
39
|
+
_reserve_owned_ram(self,65536+len(self._rows)*36864,'_workspace_cost')
|
|
40
|
+
series=sample_series(self._rows,self._input_unit,self._conditioned)
|
|
41
|
+
iterator=(select_reference if self._backend=='reference' else select_numpy)(series,self._spec)
|
|
42
|
+
for row in iterator:self._consumer(row)
|
|
43
|
+
self._rows[:]=self._rows[-1:]
|
|
44
|
+
except BaseException:
|
|
45
|
+
self._failed=True;raise
|
|
46
|
+
finally:
|
|
47
|
+
if iterator is not None:iterator.close()
|
|
48
|
+
series=row=iterator=None
|
|
49
|
+
_release_owned_ram(self,self._workspace_cost,'_workspace_cost')
|
|
50
|
+
|
|
51
|
+
def finish(self):
|
|
52
|
+
"""EOF后输出最后正范围,无末尾假样本。参数: 无。返回: None。异常: 原计算/写入错。"""
|
|
53
|
+
self._require_open()
|
|
54
|
+
if not self._finished:self._flush();self._finished=True
|
|
55
|
+
|
|
56
|
+
def close(self):
|
|
57
|
+
"""释放缓冲及回调,实际费用归零后关闭。参数: 无。返回: None。异常: 预算释放错。"""
|
|
58
|
+
if self._closed:return
|
|
59
|
+
self._closing=True;self._rows=self._consumer=None
|
|
60
|
+
_release_owned_ram(self,self._workspace_cost,'_workspace_cost')
|
|
61
|
+
_release_owned_ram(self,self._fixed_cost,'_fixed_cost')
|
|
62
|
+
self._closed=True
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
"""收齐同刻的请求、响应和条件后配对,直接交付最终结果。
|
|
2
|
+
|
|
3
|
+
只保留本次输入组之前的有限条件边界及尚待响应的请求。没有配对请求时不
|
|
4
|
+
建立本对象;不会为配对保存整段信号历史或另一时间轴。每个规则的观测终点
|
|
5
|
+
由其必要来源决定,响应来源提前结束只使后续响应未知,不提前结束其他来源。
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from ..planning.intervals import IntervalChoice
|
|
9
|
+
from dataclasses import replace
|
|
10
|
+
from ..core.sequence import SequenceRule, SequenceTick
|
|
11
|
+
from ..core.sequence_reference import SequenceDetector
|
|
12
|
+
from ..core.temporal import ConditionTick
|
|
13
|
+
from ..core.types import Truth as T, QualityFlag as Q
|
|
14
|
+
from ..results.errors import ResultClosedError, BudgetExceededError
|
|
15
|
+
from ..results.spool import _reserve_owned_ram, _release_owned_ram, _cleanup_owner
|
|
16
|
+
from .history import _metadata_bytes
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class RecordSequences:
|
|
20
|
+
"""拥有同刻合并队列及FIFO候选;计划、状态和结果消费者为借用。"""
|
|
21
|
+
|
|
22
|
+
def __init__(self,plan,state,budget,steps,consumer):
|
|
23
|
+
"""登记有限配对配置。参数: 计划、共享状态/预算、周期映射、结果回调。返回: owner。异常: 构造原错附owner。"""
|
|
24
|
+
self._plan,self._state,self._budget,self._steps,self._consumer=plan,state,budget,steps,consumer
|
|
25
|
+
self._held_cost=self._fixed_cost=self._queue_cost=self._pending_cost=self._step_cost=0
|
|
26
|
+
self._queue,self._active,self._costs={},{},{}
|
|
27
|
+
self._closed=self._failed=False
|
|
28
|
+
self._rules={r.rule_id:r for r in plan.rules}
|
|
29
|
+
self._needed={name for s in plan.sequences for name in (s.start_rule,s.response_rule)}
|
|
30
|
+
try:
|
|
31
|
+
_reserve_owned_ram(self,65536+32*_metadata_bytes(plan.sequences),'_fixed_cost')
|
|
32
|
+
except BaseException as error:
|
|
33
|
+
_cleanup_owner(self,error,'record_sequences_cleanup_owner','在线配对构造')
|
|
34
|
+
raise
|
|
35
|
+
|
|
36
|
+
def _open(self):
|
|
37
|
+
"""拒绝失败实例。参数: 无。返回: None。异常: ResultClosedError。"""
|
|
38
|
+
if self._closed or self._failed:
|
|
39
|
+
raise ResultClosedError('在线配对已关闭或失败')
|
|
40
|
+
|
|
41
|
+
def _entry(self,time_ns):
|
|
42
|
+
"""先付费再建立一组。参数: 实际时间。返回: 可变组。异常: 预算原错。"""
|
|
43
|
+
if time_ns not in self._queue:
|
|
44
|
+
_reserve_owned_ram(self,8192,'_queue_cost')
|
|
45
|
+
self._queue[time_ns]=[{},set(),8192]
|
|
46
|
+
return self._queue[time_ns]
|
|
47
|
+
|
|
48
|
+
def bounds(self,cursors,ends):
|
|
49
|
+
"""从真实来源范围开始/收窄配对域,在末组交付之前调用。
|
|
50
|
+
|
|
51
|
+
参数: 已前瞻的来源和确认EOF终点。返回: None。异常: 范围/预算错误。
|
|
52
|
+
"""
|
|
53
|
+
self._open()
|
|
54
|
+
choices=dict(self._plan.intervals.resolved)
|
|
55
|
+
for spec in self._plan.sequences:
|
|
56
|
+
names=set(self._rules[spec.start_rule].dependencies)|set(self._rules[spec.response_rule].dependencies)
|
|
57
|
+
driver=choices[spec.sequence_id].driver
|
|
58
|
+
if driver:
|
|
59
|
+
names.add(driver)
|
|
60
|
+
sources={self._state.definitions[name].source for name in names}
|
|
61
|
+
if any(not self._rules[name].dependencies and choices.get(name,IntervalChoice('actual')).driver is None
|
|
62
|
+
for name in (spec.start_rule,spec.response_rule)):
|
|
63
|
+
sources.update(source.name for source in self._plan.sources)
|
|
64
|
+
starts=[c.observed_start for c in cursors if c.source_name in sources and c.observed_start is not None]
|
|
65
|
+
if not starts:
|
|
66
|
+
continue
|
|
67
|
+
start=max(min(starts),self._plan.dataset.domain.start_ns)
|
|
68
|
+
end=self._plan.dataset.domain.end_ns
|
|
69
|
+
finished={c.source_name for c in cursors if c._finished}
|
|
70
|
+
final=bool(sources) and sources<=finished
|
|
71
|
+
if final:
|
|
72
|
+
end=min(end,max(ends[source] for source in sources if source in ends))
|
|
73
|
+
if start>end:
|
|
74
|
+
continue
|
|
75
|
+
if spec.sequence_id not in self._active:
|
|
76
|
+
rule=SequenceRule(spec.sequence_id,self._plan.dataset.dataset_id,self._plan.dataset.session_id,
|
|
77
|
+
spec.start_rule,spec.response_rule,spec.min_delay_ns,spec.max_delay_ns,
|
|
78
|
+
self._plan.dataset.entity,record_clock=self._steps[spec.sequence_id] is not None)
|
|
79
|
+
detector=SequenceDetector(rule,start,end,max_pending=spec.max_pending)
|
|
80
|
+
self._active[spec.sequence_id]=[spec,detector,None,False,False]
|
|
81
|
+
self._entry(start)
|
|
82
|
+
detector=self._active[spec.sequence_id][1]
|
|
83
|
+
if not self._plan.dataset.domain_explicit and not detector._ended:
|
|
84
|
+
detector.end_ns=end
|
|
85
|
+
if final and not detector._ended:
|
|
86
|
+
if detector._last_time is not None and end<=detector._last_time:
|
|
87
|
+
raise ValueError('配对末组已提交,不能回退观测范围')
|
|
88
|
+
detector.end_ns=end
|
|
89
|
+
self._entry(end)
|
|
90
|
+
|
|
91
|
+
def observe(self,rule,tick,events):
|
|
92
|
+
"""借用规则批时先付费再保留必要点,不保存不参与配对的规则。
|
|
93
|
+
|
|
94
|
+
参数: 规则ID、条件点及事件tuple。返回: None。异常: 预算/重复点错误。
|
|
95
|
+
"""
|
|
96
|
+
self._open()
|
|
97
|
+
if rule not in self._needed:
|
|
98
|
+
return
|
|
99
|
+
entry=self._entry(tick.time_ns)
|
|
100
|
+
if rule in entry[0]:
|
|
101
|
+
raise ValueError('配对收到重复规则时间组')
|
|
102
|
+
cost=8192+16*_metadata_bytes(events)
|
|
103
|
+
_reserve_owned_ram(self,cost,'_queue_cost')
|
|
104
|
+
entry[2]+=cost
|
|
105
|
+
entry[0][rule]=(tick,events)
|
|
106
|
+
|
|
107
|
+
def drivers(self,group):
|
|
108
|
+
"""仅记录配对实际需要的驱动更新身份。参数: 完整原始组。返回: None。异常: 预算错误。"""
|
|
109
|
+
self._open()
|
|
110
|
+
names={choice.driver for name,choice in self._plan.intervals.resolved
|
|
111
|
+
if name in self._steps and choice.driver is not None}
|
|
112
|
+
selected={sample.name for sample in group.samples}&names
|
|
113
|
+
if selected:
|
|
114
|
+
self._entry(group.time_ns)[1].update(selected)
|
|
115
|
+
|
|
116
|
+
def _consume(self,time_ns,entry,active):
|
|
117
|
+
"""一次提交同刻A/B,候选到结果交付完毕才退费。参数: 时间/组/检测状态。返回: None。异常: 原计算错。"""
|
|
118
|
+
spec,detector,last,seen,finished=active
|
|
119
|
+
if finished or not detector.start_ns<=time_ns<=detector.end_ns:
|
|
120
|
+
return
|
|
121
|
+
a=entry[0].get(spec.start_rule)
|
|
122
|
+
b=entry[0].get(spec.response_rule)
|
|
123
|
+
if b is not None:
|
|
124
|
+
condition=b[0]
|
|
125
|
+
elif last is None:
|
|
126
|
+
condition=ConditionTick(time_ns,T.UNKNOWN,Q.MISSING)
|
|
127
|
+
else:
|
|
128
|
+
condition=ConditionTick(time_ns,last.state,last.quality)
|
|
129
|
+
terminal=time_ns==detector.end_ns
|
|
130
|
+
condition=replace(condition,terminal=terminal,
|
|
131
|
+
state=T.UNKNOWN if terminal else condition.state,
|
|
132
|
+
quality=condition.quality|Q.MISSING if terminal else condition.quality)
|
|
133
|
+
starts=() if a is None else a[1]
|
|
134
|
+
responses=() if b is None else b[1]
|
|
135
|
+
_reserve_owned_ram(self,16384+16*_metadata_bytes(responses),'_step_cost')
|
|
136
|
+
for event in starts:
|
|
137
|
+
cost=32768+16*_metadata_bytes((event,detector.rule))
|
|
138
|
+
_reserve_owned_ram(self,cost,'_pending_cost')
|
|
139
|
+
self._costs[(spec.sequence_id,event.event_id)]=cost
|
|
140
|
+
step=self._steps[spec.sequence_id]
|
|
141
|
+
choice=dict(self._plan.intervals.resolved)[spec.sequence_id]
|
|
142
|
+
selected=choice.driver in entry[1]
|
|
143
|
+
advance=step if selected and seen else 0
|
|
144
|
+
active[3]=seen or selected
|
|
145
|
+
try:
|
|
146
|
+
results=detector.push((SequenceTick(condition,starts,responses),),
|
|
147
|
+
advances=None if step is None else (advance,))
|
|
148
|
+
except MemoryError as error:
|
|
149
|
+
raise BudgetExceededError('配对等待候选超过限制:'+spec.sequence_id) from error
|
|
150
|
+
released=0
|
|
151
|
+
for result in results:
|
|
152
|
+
self._consumer(result)
|
|
153
|
+
released+=self._costs.pop((spec.sequence_id,result.request.event_id))
|
|
154
|
+
result=results=None
|
|
155
|
+
_release_owned_ram(self,released,'_pending_cost')
|
|
156
|
+
_release_owned_ram(self,self._step_cost,'_step_cost')
|
|
157
|
+
active[2]=condition
|
|
158
|
+
if terminal:
|
|
159
|
+
detector.finish()
|
|
160
|
+
active[4]=True
|
|
161
|
+
|
|
162
|
+
def flush_before(self,before=None):
|
|
163
|
+
"""所有规则已交付边界后,按实际时间处理一次;None仅用于真实全体EOF。
|
|
164
|
+
|
|
165
|
+
参数: 下一个尚未提交的实际组。返回: None。异常: 原错并封闭实例。
|
|
166
|
+
"""
|
|
167
|
+
self._open()
|
|
168
|
+
try:
|
|
169
|
+
for time in sorted(self._queue):
|
|
170
|
+
if before is not None and time>=before:
|
|
171
|
+
break
|
|
172
|
+
entry=self._queue[time]
|
|
173
|
+
for active in self._active.values():
|
|
174
|
+
self._consume(time,entry,active)
|
|
175
|
+
cost=entry[2]
|
|
176
|
+
del self._queue[time]
|
|
177
|
+
entry=None
|
|
178
|
+
_release_owned_ram(self,cost,'_queue_cost')
|
|
179
|
+
if before is None and any(not active[4] for active in self._active.values()):
|
|
180
|
+
raise ValueError('配对尚未收到实际终点')
|
|
181
|
+
except BaseException as error:
|
|
182
|
+
self._failed=True
|
|
183
|
+
error.record_sequences_cleanup_owner=self
|
|
184
|
+
raise
|
|
185
|
+
|
|
186
|
+
@property
|
|
187
|
+
def closed(self):
|
|
188
|
+
"""返回资源关闭状态。参数: 无。返回: bool。异常: 无。"""
|
|
189
|
+
return self._closed
|
|
190
|
+
|
|
191
|
+
def close(self):
|
|
192
|
+
"""放弃未发布候选并退还自有费用。参数: 无。返回: None。异常: 预算释放原错可重试。"""
|
|
193
|
+
if self._closed:
|
|
194
|
+
return
|
|
195
|
+
self._queue.clear();self._active.clear();self._costs.clear()
|
|
196
|
+
self._plan=self._state=self._consumer=self._steps=self._rules=None
|
|
197
|
+
for slot in ('_pending_cost','_step_cost','_queue_cost','_fixed_cost'):
|
|
198
|
+
_release_owned_ram(self,getattr(self,slot),slot)
|
|
199
|
+
self._closed=True
|