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,338 @@
|
|
|
1
|
+
"""从有限历史块得到完整的样本极值或算术均值,可附独立BOOL选择条件。
|
|
2
|
+
|
|
3
|
+
输入是已封存的新解码历史、原保持上下文、实际绑定、编译表达式和原指标请求。
|
|
4
|
+
每次step最多消费一个有限块;均值不建立第二遍块源,也不重新扫描原来源。
|
|
5
|
+
样本均值累计原序真实更新的原单位总和,完整EOF后除总样本数并换单位一次。
|
|
6
|
+
TTL、条件更新和裁剪保持不增加样本;完整双覆盖、未知和来源动态先预约费用。
|
|
7
|
+
observation显式限制原domain内的计算观测域,样本只取该域半开范围内真实更新;
|
|
8
|
+
None兼容原domain及原预算,不证明实际观测。原context、绑定和请求窗口不改变。
|
|
9
|
+
自有分块者、当前块、数值状态和结果由close释放;借用历史、上下文与绑定保持。
|
|
10
|
+
预算是新分析层保守估算,超限明确失败,不承诺进程RSS或旧来源缓冲受控。
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
# 只组合新分析分块者、独立样本核和既有结果政策,历史读写与解码保持原样。
|
|
14
|
+
from ..core.decoded_binding import DecodedBindings
|
|
15
|
+
from ..core.expression import CompiledExpression
|
|
16
|
+
from ..core.calculations import CalculationDefinition, make_calculation_result
|
|
17
|
+
from ..core.models import Interval
|
|
18
|
+
from ..core.sample_reduction import SampleCalculationFacts
|
|
19
|
+
from ..core.types import QualityFlag as Q
|
|
20
|
+
from ..results.errors import ResultClosedError
|
|
21
|
+
from .history import DecodedHistoryStore, _metadata_bytes
|
|
22
|
+
from .hold import HoldContext
|
|
23
|
+
from .calculation_blocks import HistoricalCalculationBlocks, _calculation_observation
|
|
24
|
+
from .historical_conditional_blocks import HistoricalConditionalBlocks
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def _append_ranges(existing, incoming):
|
|
28
|
+
"""合并同一种未知的相邻范围,保留真实已知间隔。
|
|
29
|
+
|
|
30
|
+
参数: existing/incoming为已校验有序Interval tuple。返回: 冻结有序tuple。
|
|
31
|
+
异常: ValueError为重叠;分配错误传播,调用方须先预约全部候选元数据。
|
|
32
|
+
"""
|
|
33
|
+
# 仅合并首尾相接的诊断,不填补中间已知值或可判断条件。
|
|
34
|
+
result = list(existing)
|
|
35
|
+
for item in incoming:
|
|
36
|
+
if result and item.start_ns < result[-1].end_ns:
|
|
37
|
+
raise ValueError('样本指标未知范围重叠')
|
|
38
|
+
if result and item.start_ns == result[-1].end_ns:
|
|
39
|
+
result[-1] = Interval(result[-1].start_ns, item.end_ns)
|
|
40
|
+
else:
|
|
41
|
+
result.append(item)
|
|
42
|
+
return tuple(result)
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
class HistoricalSampleCalculation:
|
|
46
|
+
"""拥有一次有限回读及整窗事实,完整EOF后才开放最终CalculationResult。
|
|
47
|
+
|
|
48
|
+
极值只留单候选,均值只留有界误差项和真实样本数,不累计全窗值列。
|
|
49
|
+
数值故障与覆盖事实分开;操作异常后只可close,清理取消保留重试金额和句柄。
|
|
50
|
+
"""
|
|
51
|
+
|
|
52
|
+
def __init__(self, history, context, bindings, compiled, spec, condition=None, *,
|
|
53
|
+
backend='numpy', batch_intervals=64, partial_limit=4096, observation=None):
|
|
54
|
+
"""校验输入,预留固定状态,再创建自有分块者和纯样本核。
|
|
55
|
+
|
|
56
|
+
参数: history/context/bindings/compiled为真实新历史及原运行契约;spec为三samples请求;
|
|
57
|
+
condition为可选BOOL表达式,None表示全TRUE;backend为reference或numpy;
|
|
58
|
+
batch_intervals为有限正区间数,partial_limit为浮点误差项容量。
|
|
59
|
+
observation为原domain内已核实Interval;None保留原domain,不是观测证明。
|
|
60
|
+
返回: 尚未消费历史的新owner。
|
|
61
|
+
异常: 类型、能力、预算或构造错误;持续清理失败的原异常附
|
|
62
|
+
historical_sample_calculation_cleanup_owner,恢复环境后可调用其close。
|
|
63
|
+
"""
|
|
64
|
+
# 来源身份与BOOL条件仍由真实分块者校验;本层先拒绝模型和能力错误。
|
|
65
|
+
if (not isinstance(history, DecodedHistoryStore) or not isinstance(context, HoldContext)
|
|
66
|
+
or not isinstance(bindings, DecodedBindings) or not isinstance(compiled, CompiledExpression)
|
|
67
|
+
or not isinstance(spec, CalculationDefinition)
|
|
68
|
+
or condition is not None and not isinstance(condition, CompiledExpression)):
|
|
69
|
+
raise TypeError('历史样本指标需真实历史、保持上下文、绑定、表达式和CalculationDefinition')
|
|
70
|
+
if spec.operation not in ('sample_minimum', 'sample_maximum', 'sample_mean'):
|
|
71
|
+
raise ValueError('当前样本归约只接三种samples算子')
|
|
72
|
+
if (backend not in ('reference', 'numpy') or type(batch_intervals) is not int
|
|
73
|
+
or batch_intervals < 1 or type(partial_limit) is not int or partial_limit < 1):
|
|
74
|
+
raise ValueError('历史样本指标需合法后端、正块大小与误差项容量')
|
|
75
|
+
# 冻结原请求的真实交集和初始自有状态,借用资源只保存引用,不接管其生命周期。
|
|
76
|
+
observed = _calculation_observation(context, observation)
|
|
77
|
+
left = max(observed.start_ns, spec.window.start_ns)
|
|
78
|
+
right = min(observed.end_ns, spec.window.end_ns)
|
|
79
|
+
self._actual = Interval(left, right) if left <= right else None
|
|
80
|
+
self._history, self._context, self._bindings = history, context, bindings
|
|
81
|
+
self._observation = observation
|
|
82
|
+
self._compiled, self._spec, self._condition, self._backend = compiled, spec, condition, backend
|
|
83
|
+
self._batch_intervals, self._partial_limit = batch_intervals, partial_limit
|
|
84
|
+
self._budget, self._held_cost = history.budget, 0
|
|
85
|
+
self._blocks = self._current = self._reducer = self._result = None
|
|
86
|
+
self._closed = self._closing = self._failed = self._finished = False
|
|
87
|
+
self._fact_cost = 0
|
|
88
|
+
self._cursor = None if self._actual is None else self._actual.start_ns
|
|
89
|
+
self._value_duration = self._selected_duration = self._sample_count = 0
|
|
90
|
+
self._known_duration = self._selected_value_unknown = self._false_duration = 0
|
|
91
|
+
self._unknown, self._condition_unknown, self._refs, self._quality = (), (), (), Q.NONE
|
|
92
|
+
try:
|
|
93
|
+
# 固定有界误差状态与原契约先计费,动态诊断与有限核工作区另行预约。
|
|
94
|
+
identity = None if condition is None else condition.identity
|
|
95
|
+
self._reserve(131072 + 1024 * partial_limit +
|
|
96
|
+
16 * _metadata_bytes((context, bindings.sources, compiled.identity, identity, spec))
|
|
97
|
+
+ (0 if observation is None else 16 * _metadata_bytes(observation)))
|
|
98
|
+
self._reducer = self._make_reducer()
|
|
99
|
+
self._blocks = self._make_blocks()
|
|
100
|
+
except BaseException as exc:
|
|
101
|
+
# 子构造未返回时接管其原异常上的实际自有恢复句柄,不关闭借用历史。
|
|
102
|
+
attr = 'calculation_blocks_cleanup_owner' if condition is None else 'conditional_blocks_cleanup_owner'
|
|
103
|
+
child = getattr(exc, attr, None)
|
|
104
|
+
if child is not None:
|
|
105
|
+
self._blocks = child
|
|
106
|
+
try:
|
|
107
|
+
self.close()
|
|
108
|
+
except BaseException as cleanup:
|
|
109
|
+
exc.add_note(f'历史样本指标构造清理失败: {type(cleanup).__name__}')
|
|
110
|
+
if not self._closed:
|
|
111
|
+
try:
|
|
112
|
+
self.close()
|
|
113
|
+
except BaseException as retry:
|
|
114
|
+
exc.add_note(f'历史样本指标构造清理重试失败: {type(retry).__name__}')
|
|
115
|
+
if not self._closed:
|
|
116
|
+
exc.historical_sample_calculation_cleanup_owner = self
|
|
117
|
+
raise
|
|
118
|
+
|
|
119
|
+
def _make_reducer(self):
|
|
120
|
+
"""创建所选后端的独立样本核,不需要预先知道均值分母。
|
|
121
|
+
|
|
122
|
+
参数: 无。返回: 对应SampleReduction。异常: 原配置、数值模型或分配错误。
|
|
123
|
+
"""
|
|
124
|
+
if self._backend == 'reference':
|
|
125
|
+
from ..core.sample_reduction_reference import ReferenceSampleReduction
|
|
126
|
+
factory = ReferenceSampleReduction
|
|
127
|
+
else:
|
|
128
|
+
from ..core.sample_reduction_numpy import NumpySampleReduction
|
|
129
|
+
factory = NumpySampleReduction
|
|
130
|
+
# 实际每块仍校验unit/dtype,均值计数来自原值实际更新,不能按块数平均。
|
|
131
|
+
return factory(self._spec, self._compiled.root.unit, self._compiled.root.dtype,
|
|
132
|
+
partial_limit=self._partial_limit)
|
|
133
|
+
|
|
134
|
+
def _make_blocks(self):
|
|
135
|
+
"""创建一次自有历史回读者,按可选条件选择单源或联合边界。
|
|
136
|
+
|
|
137
|
+
参数: 无。返回: HistoricalCalculationBlocks或HistoricalConditionalBlocks。
|
|
138
|
+
异常: 原构造、身份、条件或预算错误;持续清理入口由构造调用方接管。
|
|
139
|
+
"""
|
|
140
|
+
# 同一观测域决定半开真实样本截止;条件两路不能回退到原domain。
|
|
141
|
+
if self._condition is None:
|
|
142
|
+
return HistoricalCalculationBlocks(self._history, self._context, self._bindings,
|
|
143
|
+
self._compiled, self._spec, backend=self._backend, batch_intervals=self._batch_intervals,
|
|
144
|
+
observation=self._observation)
|
|
145
|
+
return HistoricalConditionalBlocks(self._history, self._context, self._bindings,
|
|
146
|
+
self._compiled, self._spec, self._condition, backend=self._backend,
|
|
147
|
+
batch_intervals=self._batch_intervals, observation=self._observation)
|
|
148
|
+
|
|
149
|
+
@property
|
|
150
|
+
def closed(self):
|
|
151
|
+
"""读取实际关闭状态。参数: 无。返回: bool。异常: 无。"""
|
|
152
|
+
return self._closed
|
|
153
|
+
|
|
154
|
+
@property
|
|
155
|
+
def failed(self):
|
|
156
|
+
"""读取操作失败状态。参数: 无。返回: bool。异常: 无。"""
|
|
157
|
+
return self._failed
|
|
158
|
+
|
|
159
|
+
@property
|
|
160
|
+
def finished(self):
|
|
161
|
+
"""读取完整分类状态。参数: 无。返回: bool。异常: 无。"""
|
|
162
|
+
return self._finished
|
|
163
|
+
|
|
164
|
+
@property
|
|
165
|
+
def result(self):
|
|
166
|
+
"""借出完整窗口结果,关闭或失败后不再开放。
|
|
167
|
+
|
|
168
|
+
参数: 无。返回: CalculationResult。异常: 未完成/失败/关闭时拒绝。
|
|
169
|
+
"""
|
|
170
|
+
self._require_open()
|
|
171
|
+
if self._failed or not self._finished:
|
|
172
|
+
raise RuntimeError('历史样本指标尚未成功完成')
|
|
173
|
+
return self._result
|
|
174
|
+
|
|
175
|
+
def _require_open(self):
|
|
176
|
+
"""拒绝半关闭或已关闭操作。参数: 无。返回: None。异常: ResultClosedError。"""
|
|
177
|
+
if self._closed or self._closing:
|
|
178
|
+
raise ResultClosedError('历史样本指标已关闭或正在清理')
|
|
179
|
+
|
|
180
|
+
def _reserve(self, amount):
|
|
181
|
+
"""先申请本owner费用,按实际账本接管成功后取消。
|
|
182
|
+
|
|
183
|
+
参数: amount为bytes。返回: None。异常: 预算或取消错误。
|
|
184
|
+
"""
|
|
185
|
+
before = self._budget.ram_bytes
|
|
186
|
+
try:
|
|
187
|
+
self._budget.reserve_ram(amount)
|
|
188
|
+
finally:
|
|
189
|
+
if self._budget.ram_bytes == before + amount:
|
|
190
|
+
self._held_cost += amount
|
|
191
|
+
|
|
192
|
+
def _release(self, amount):
|
|
193
|
+
"""扣账后即更新自有金额,释放前取消保留重试。
|
|
194
|
+
|
|
195
|
+
参数: amount为bytes。返回: None。异常: 原释放或取消错误。
|
|
196
|
+
"""
|
|
197
|
+
before = self._budget.ram_bytes
|
|
198
|
+
try:
|
|
199
|
+
self._budget.release_ram(amount)
|
|
200
|
+
finally:
|
|
201
|
+
if self._budget.ram_bytes == before - amount:
|
|
202
|
+
self._held_cost -= amount
|
|
203
|
+
|
|
204
|
+
def _append_facts(self, facts):
|
|
205
|
+
"""核对连续完整划分,先计费再保存双未知和完整来源。
|
|
206
|
+
|
|
207
|
+
参数: facts为纯核当前有限SampleCalculationFacts。返回: None。
|
|
208
|
+
异常: 结构、身份、重复范围、预算或复制失败,此后只可关闭。
|
|
209
|
+
"""
|
|
210
|
+
if (not isinstance(facts, SampleCalculationFacts) or facts.spec != self._spec
|
|
211
|
+
or facts.input_unit != self._compiled.root.unit or facts.dtype != self._compiled.root.dtype
|
|
212
|
+
or facts.binding_identity != self._compiled.identity):
|
|
213
|
+
raise ValueError('样本块事实与原请求或真实表达式不同')
|
|
214
|
+
actual = facts.actual_window
|
|
215
|
+
if actual is None:
|
|
216
|
+
if self._actual is not None:
|
|
217
|
+
raise ValueError('样本块缺失真实交集')
|
|
218
|
+
elif self._actual is None or actual.start_ns != self._cursor or actual.end_ns > self._actual.end_ns:
|
|
219
|
+
raise ValueError('样本块必须按真实交集连续推进')
|
|
220
|
+
# 候选复制时旧事实仍存在,动态计费含双未知及完整SourceRef子类的全部定位。
|
|
221
|
+
candidate_cost = 65536 + 16 * (_metadata_bytes((self._unknown, self._condition_unknown, self._refs))
|
|
222
|
+
+ _metadata_bytes(facts))
|
|
223
|
+
self._reserve(candidate_cost)
|
|
224
|
+
value_unknown = _append_ranges(self._unknown, facts.value_unknown_ranges)
|
|
225
|
+
condition_unknown = _append_ranges(self._condition_unknown, facts.condition_unknown_ranges)
|
|
226
|
+
refs = list(self._refs)
|
|
227
|
+
for item in facts.source_refs:
|
|
228
|
+
if not any(type(item) is type(previous) and item == previous for previous in refs):
|
|
229
|
+
refs.append(item)
|
|
230
|
+
# 只安装已校验候选;释放旧费用取消时,全部金额仍归本owner,不能交付前缀结果。
|
|
231
|
+
old_cost = self._fact_cost
|
|
232
|
+
self._unknown, self._condition_unknown, self._refs = value_unknown, condition_unknown, tuple(refs)
|
|
233
|
+
self._value_duration += facts.value_valid_duration_ns
|
|
234
|
+
self._selected_duration += facts.selected_duration_ns
|
|
235
|
+
self._sample_count += facts.valid_sample_count
|
|
236
|
+
self._known_duration += facts.condition_known_duration_ns
|
|
237
|
+
self._selected_value_unknown += facts.selected_value_unknown_duration_ns
|
|
238
|
+
self._false_duration += facts.false_duration_ns
|
|
239
|
+
self._quality |= facts.quality
|
|
240
|
+
self._cursor = None if actual is None else actual.end_ns
|
|
241
|
+
self._fact_cost = candidate_cost
|
|
242
|
+
self._release(old_cost)
|
|
243
|
+
|
|
244
|
+
def _facts_snapshot(self):
|
|
245
|
+
"""完整EOF后构造整窗事实,不以未完成前缀冒充整窗。
|
|
246
|
+
|
|
247
|
+
参数: 无。返回: SampleCalculationFacts。异常: 完整范围或双覆盖矛盾。
|
|
248
|
+
"""
|
|
249
|
+
if self._actual is not None and self._cursor != self._actual.end_ns:
|
|
250
|
+
raise ValueError('样本指标尚未完整消费真实交集')
|
|
251
|
+
duration = 0 if self._actual is None else self._actual.end_ns - self._actual.start_ns
|
|
252
|
+
# 两个独立分区均需覆盖实际域,FALSE已知,不能计入条件未知。
|
|
253
|
+
if self._value_duration + sum(item.end_ns - item.start_ns for item in self._unknown) != duration:
|
|
254
|
+
raise ValueError('样本全窗值覆盖不完整')
|
|
255
|
+
if self._known_duration + sum(item.end_ns - item.start_ns for item in self._condition_unknown) != duration:
|
|
256
|
+
raise ValueError('样本全窗条件覆盖不完整')
|
|
257
|
+
return SampleCalculationFacts(self._spec, self._actual, self._value_duration,
|
|
258
|
+
self._known_duration, self._selected_duration, self._selected_value_unknown,
|
|
259
|
+
self._false_duration, self._sample_count, self._unknown, self._condition_unknown,
|
|
260
|
+
self._quality, self._compiled.root.unit, self._compiled.root.dtype,
|
|
261
|
+
self._compiled.identity, self._refs)
|
|
262
|
+
|
|
263
|
+
def _finish(self):
|
|
264
|
+
"""按完整事实和最终数值分类一次,原序样本和无需第二遍。
|
|
265
|
+
|
|
266
|
+
参数: 无。返回: False表示最终完成。异常: 覆盖、数值快照、预算或取消错误。
|
|
267
|
+
"""
|
|
268
|
+
# 快照与分类复制前先预约完整双未知和来源;费用持有至close,不是临时裸分配。
|
|
269
|
+
self._reserve(65536 + 16 * _metadata_bytes((self._unknown, self._condition_unknown, self._refs)))
|
|
270
|
+
facts = self._facts_snapshot()
|
|
271
|
+
number = self._reducer.finish()
|
|
272
|
+
duration = 0 if facts.actual_window is None else facts.actual_window.end_ns - facts.actual_window.start_ns
|
|
273
|
+
# 只有请求全窗充分FALSE才证明空选择;无真实样本与UNKNOWN仍按既有政策区分。
|
|
274
|
+
all_false = (facts.actual_window == self._spec.window and duration > 0
|
|
275
|
+
and facts.false_duration_ns == duration)
|
|
276
|
+
self._result = make_calculation_result(self._spec, facts, number.value, number.unit, facts.actual_window,
|
|
277
|
+
facts.value_valid_duration_ns, facts.condition_known_duration_ns, facts.selected_duration_ns,
|
|
278
|
+
facts.selected_value_unknown_duration_ns, facts.valid_sample_count,
|
|
279
|
+
facts.value_unknown_ranges, facts.condition_unknown_ranges, facts.quality | number.quality,
|
|
280
|
+
all_false=all_false, calculation_failed=number.calculation_failed)
|
|
281
|
+
self._finished = True
|
|
282
|
+
return False
|
|
283
|
+
|
|
284
|
+
def step(self):
|
|
285
|
+
"""处理至多一个有限块,完整EOF分类后才返回False。
|
|
286
|
+
|
|
287
|
+
参数: 无。返回: bool;完成后重复False。异常: 读取/数值/预算/取消错误,随后仅close。
|
|
288
|
+
"""
|
|
289
|
+
self._require_open()
|
|
290
|
+
if self._failed:
|
|
291
|
+
raise RuntimeError('失败的样本指标只能关闭')
|
|
292
|
+
if self._finished:
|
|
293
|
+
return False
|
|
294
|
+
try:
|
|
295
|
+
try:
|
|
296
|
+
self._current = next(self._blocks)
|
|
297
|
+
except StopIteration:
|
|
298
|
+
return self._finish()
|
|
299
|
+
# 有限N行数组、掩码和样本临时先预约;不累积全窗值,原单位总和只留有界状态。
|
|
300
|
+
series = self._current.series
|
|
301
|
+
workspace = 65536 + 2048 * len(series.times_ns) + 16 * _metadata_bytes(series.source_refs)
|
|
302
|
+
self._reserve(workspace)
|
|
303
|
+
facts = self._reducer.push(series)
|
|
304
|
+
self._append_facts(facts)
|
|
305
|
+
del facts, series
|
|
306
|
+
self._current.close()
|
|
307
|
+
self._current = None
|
|
308
|
+
self._release(workspace)
|
|
309
|
+
return True
|
|
310
|
+
except BaseException:
|
|
311
|
+
self._failed = True
|
|
312
|
+
raise
|
|
313
|
+
|
|
314
|
+
def close(self):
|
|
315
|
+
"""关闭自有当前块、分块者和金额,保留借用历史及原调用方状态。
|
|
316
|
+
|
|
317
|
+
参数: 无。返回: None,重复关闭安全。异常: 关闭或释放取消可重试。
|
|
318
|
+
"""
|
|
319
|
+
if self._closed:
|
|
320
|
+
return
|
|
321
|
+
# 进入清理即禁止结果访问;每个自有句柄仅在close成功后移除,取消时留待重试。
|
|
322
|
+
self._closing = True
|
|
323
|
+
try:
|
|
324
|
+
if self._current is not None:
|
|
325
|
+
self._current.close()
|
|
326
|
+
self._current = None
|
|
327
|
+
if self._blocks is not None:
|
|
328
|
+
self._blocks.close()
|
|
329
|
+
self._blocks = None
|
|
330
|
+
self._release(self._held_cost)
|
|
331
|
+
finally:
|
|
332
|
+
# 所有句柄已释放且实际自有金额为0才清空状态;不拿借用账本总额充当关闭证明。
|
|
333
|
+
if self._current is None and self._blocks is None and self._held_cost == 0:
|
|
334
|
+
self._result = self._reducer = None
|
|
335
|
+
self._history = self._context = self._bindings = self._compiled = self._condition = None
|
|
336
|
+
self._observation = None
|
|
337
|
+
self._unknown = self._condition_unknown = self._refs = ()
|
|
338
|
+
self._closed = True
|
|
@@ -0,0 +1,300 @@
|
|
|
1
|
+
"""从有限历史输入逐行借出真实更新的SelectionRow,保留TRUE与UNKNOWN。
|
|
2
|
+
|
|
3
|
+
输入为已封存的新解码历史、保持上下文、实际绑定、值表达式、select请求和可选
|
|
4
|
+
BOOL条件。只回读新历史,由原单值/联合分块者保留TTL、同刻和半开更新标志;
|
|
5
|
+
每块复用独立select_reference或select_numpy,不重扫来源adapter,不物化全窗行表。
|
|
6
|
+
FALSE过滤,UNKNOWN诊断行保留;原数值、BOOL、ENUM的dtype/标签/单位/质量不转换。
|
|
7
|
+
observation显式限制原domain内的计算域;该域右端点及之后的真实更新和UNKNOWN行
|
|
8
|
+
不再输出。None兼容原domain及预算,不证明实际观测,不改变原context、绑定或请求。
|
|
9
|
+
|
|
10
|
+
资源分为七类:借用history、context、bindings及共享budget不由本owner关闭;自有
|
|
11
|
+
分块者及其回读/登记归_blocks,单当前CalculationBlock归_current,选择核生成器及有限
|
|
12
|
+
数组/索引归_rows;固定描述费用由_held_cost持有,核workspace归_workspace_cost,
|
|
13
|
+
单当前借出行及完整定位归_row/_row_cost。核和行分配前预约费用,取消按真实账本
|
|
14
|
+
更新归属,生成器close成功才丢句柄。返回行只借出至下一次next或close;外部独立
|
|
15
|
+
保存行须另计预算,ResultSpool编码/写入费用也另付。不承诺旧来源缓冲或进程RSS。
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
# 仅组合有限新历史分块与现有独立选择核,不修改完整核或结果schema。
|
|
19
|
+
from dataclasses import replace
|
|
20
|
+
from ..core.decoded_binding import DecodedBindings
|
|
21
|
+
from ..core.expression import CompiledExpression
|
|
22
|
+
from ..core.calculations import CalculationDefinition
|
|
23
|
+
from ..core.calculations_memory_reference import require_calculation_plan
|
|
24
|
+
from ..results.errors import ResultClosedError
|
|
25
|
+
from .history import DecodedHistoryStore, _metadata_bytes
|
|
26
|
+
from .hold import HoldContext
|
|
27
|
+
from .calculation_blocks import HistoricalCalculationBlocks, _calculation_observation
|
|
28
|
+
from .historical_conditional_blocks import HistoricalConditionalBlocks
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class HistoricalSelectionRows:
|
|
32
|
+
"""拥有单当前块、有限核生成器和当前行费用,失败后只可重试关闭。
|
|
33
|
+
|
|
34
|
+
数值与筛选由所选独立核完成,strict/minimum_coverage沿原行流语义,不造伪标量。
|
|
35
|
+
exhausted为正常EOF,与显式closed不同;EOF释放回读、当前块、核与行,固定描述费用保留至close。
|
|
36
|
+
再次next仍StopIteration,不将耗尽当作显式关闭。
|
|
37
|
+
任何清理失败保留实际句柄及金额,半关闭后不再交付行,不关闭借用历史或原状态。
|
|
38
|
+
"""
|
|
39
|
+
|
|
40
|
+
def __init__(self, history, context, bindings, compiled, spec, condition=None, *,
|
|
41
|
+
backend='numpy', batch_intervals=64, observation=None):
|
|
42
|
+
"""检查真实select契约,先计费固定描述,再构造自有分块者。
|
|
43
|
+
|
|
44
|
+
参数: history/context/bindings/compiled为真实新历史及原执行契约,spec为select;
|
|
45
|
+
condition为可选同绑定BOOL条件;backend为reference/numpy,batch_intervals为正区间上限。
|
|
46
|
+
observation为原domain内已核实Interval;None兼容原domain及原预算。
|
|
47
|
+
返回: 尚未消费历史的行owner。异常: 类型、能力、同步、预算、构造或取消错误;
|
|
48
|
+
持续清理失败时原异常附historical_selection_rows_cleanup_owner用于恢复close。
|
|
49
|
+
"""
|
|
50
|
+
# 真实身份与联合同步在构造资源前检查,选择行不允许隐式输出单位转换。
|
|
51
|
+
if (not isinstance(history, DecodedHistoryStore) or not isinstance(context, HoldContext)
|
|
52
|
+
or not isinstance(bindings, DecodedBindings) or not isinstance(compiled, CompiledExpression)
|
|
53
|
+
or not isinstance(spec, CalculationDefinition)
|
|
54
|
+
or condition is not None and not isinstance(condition, CompiledExpression)):
|
|
55
|
+
raise TypeError('历史选择行需真实历史、上下文、绑定、表达式和CalculationDefinition')
|
|
56
|
+
if spec.operation != 'select' or spec.output_unit not in (None, compiled.root.unit):
|
|
57
|
+
raise ValueError('历史选择行需select且保留原表达式单位')
|
|
58
|
+
if (backend not in ('reference', 'numpy') or type(batch_intervals) is not int or batch_intervals < 1):
|
|
59
|
+
raise ValueError('历史选择行需合法后端与正原生int块大小')
|
|
60
|
+
if compiled.bindings.identity != bindings.identity:
|
|
61
|
+
raise ValueError('选择行表达式与实际绑定不同')
|
|
62
|
+
require_calculation_plan(compiled, spec, condition)
|
|
63
|
+
# 只验证显式范围,不创建派生context;块层按半开实际域裁剪原值更新和UNKNOWN行。
|
|
64
|
+
_calculation_observation(context, observation)
|
|
65
|
+
# 构造失败前准备可清理字段;借用引用与自有句柄明确区分,金额从0开始。
|
|
66
|
+
self._history, self._context, self._bindings = history, context, bindings
|
|
67
|
+
self._observation = observation
|
|
68
|
+
self._compiled, self._spec, self._condition, self._backend = compiled, spec, condition, backend
|
|
69
|
+
self._batch_intervals, self._budget = batch_intervals, history.budget
|
|
70
|
+
self._blocks = self._current = self._rows = self._row = None
|
|
71
|
+
self._held_cost = self._workspace_cost = self._row_cost = self._row_estimate = 0
|
|
72
|
+
self._closed = self._closing = self._failed = self._exhausted = False
|
|
73
|
+
try:
|
|
74
|
+
# 固定描述费用在自有子对象创建前预约,动态完整refs和核/行费用按当前块另计。
|
|
75
|
+
identity = None if condition is None else condition.identity
|
|
76
|
+
self._reserve(65536 + 16 * _metadata_bytes((context, bindings.sources, compiled.identity, identity, spec))
|
|
77
|
+
+ (0 if observation is None else 16 * _metadata_bytes(observation)))
|
|
78
|
+
self._blocks = self._make_blocks()
|
|
79
|
+
except BaseException as exc:
|
|
80
|
+
# 子构造未返回也可能拥有历史读取句柄,接管原异常上的真实恢复入口。
|
|
81
|
+
attr = 'calculation_blocks_cleanup_owner' if condition is None else 'conditional_blocks_cleanup_owner'
|
|
82
|
+
child = getattr(exc, attr, None)
|
|
83
|
+
if child is not None:
|
|
84
|
+
self._blocks = child
|
|
85
|
+
for attempt in range(2):
|
|
86
|
+
try:
|
|
87
|
+
self.close()
|
|
88
|
+
break
|
|
89
|
+
except BaseException as cleanup:
|
|
90
|
+
exc.add_note(f'历史选择行构造清理第{attempt+1}次失败: {type(cleanup).__name__}')
|
|
91
|
+
if not self._closed:
|
|
92
|
+
exc.historical_selection_rows_cleanup_owner = self
|
|
93
|
+
exc.add_note('释放恢复后调用historical_selection_rows_cleanup_owner.close()')
|
|
94
|
+
raise
|
|
95
|
+
|
|
96
|
+
def _make_blocks(self):
|
|
97
|
+
"""创建一次自有单值或联合回读者,借用资源不接管关闭。
|
|
98
|
+
|
|
99
|
+
参数: 无。返回: HistoricalCalculationBlocks或HistoricalConditionalBlocks。
|
|
100
|
+
异常: 原构造/身份/同步/预算错误,恢复句柄由父构造接管。
|
|
101
|
+
"""
|
|
102
|
+
# 两输入能力已明确支持select,条件BOOL内部保持与原分块/TTL行为相同。
|
|
103
|
+
if self._condition is None:
|
|
104
|
+
return HistoricalCalculationBlocks(self._history, self._context, self._bindings,
|
|
105
|
+
self._compiled, self._spec, backend=self._backend, batch_intervals=self._batch_intervals,
|
|
106
|
+
observation=self._observation)
|
|
107
|
+
return HistoricalConditionalBlocks(self._history, self._context, self._bindings,
|
|
108
|
+
self._compiled, self._spec, self._condition, backend=self._backend, batch_intervals=self._batch_intervals,
|
|
109
|
+
observation=self._observation)
|
|
110
|
+
|
|
111
|
+
@property
|
|
112
|
+
def closed(self):
|
|
113
|
+
"""读取全部自有资源关闭事实。参数: 无。返回: bool。异常: 无。"""
|
|
114
|
+
return self._closed
|
|
115
|
+
|
|
116
|
+
@property
|
|
117
|
+
def failed(self):
|
|
118
|
+
"""读取操作失败状态。参数: 无。返回: bool。异常: 无。"""
|
|
119
|
+
return self._failed
|
|
120
|
+
|
|
121
|
+
@property
|
|
122
|
+
def exhausted(self):
|
|
123
|
+
"""读取正常EOF事实。参数: 无。返回: bool。异常: 无。"""
|
|
124
|
+
return self._exhausted
|
|
125
|
+
|
|
126
|
+
def __iter__(self):
|
|
127
|
+
"""返回本行owner。参数: 无。返回: self。异常: 无。"""
|
|
128
|
+
return self
|
|
129
|
+
|
|
130
|
+
def _reserve(self, amount, *, slot=None):
|
|
131
|
+
"""申请固定/工作区/当前行费用,并接管预约成功后取消的真实金额。
|
|
132
|
+
|
|
133
|
+
参数: amount为bytes,slot可为_workspace_cost或_row_cost;None为固定描述。
|
|
134
|
+
返回: None。异常: 预算或取消传播,未真正增加账本时不记所有权。
|
|
135
|
+
"""
|
|
136
|
+
before = self._budget.ram_bytes
|
|
137
|
+
try:
|
|
138
|
+
self._budget.reserve_ram(amount)
|
|
139
|
+
finally:
|
|
140
|
+
# 本次预约不含子操作,只按真实新增amount同时登记总额与费用所属槽位。
|
|
141
|
+
if self._budget.ram_bytes == before + amount:
|
|
142
|
+
self._held_cost += amount
|
|
143
|
+
if slot is not None:
|
|
144
|
+
setattr(self, slot, getattr(self, slot) + amount)
|
|
145
|
+
|
|
146
|
+
def _release(self, amount, *, slot=None):
|
|
147
|
+
"""抵销实际自有费用,释放前取消保留金额,释放后取消立即更新归属。
|
|
148
|
+
|
|
149
|
+
参数: amount为bytes,slot为对应工作区/行槽位或None。返回: None。
|
|
150
|
+
异常: 原释放/取消传播,恢复后close不能再次抵销已释放费用。
|
|
151
|
+
"""
|
|
152
|
+
before = self._budget.ram_bytes
|
|
153
|
+
try:
|
|
154
|
+
self._budget.release_ram(amount)
|
|
155
|
+
finally:
|
|
156
|
+
if self._budget.ram_bytes == before - amount:
|
|
157
|
+
self._held_cost -= amount
|
|
158
|
+
if slot is not None:
|
|
159
|
+
setattr(self, slot, getattr(self, slot) - amount)
|
|
160
|
+
|
|
161
|
+
def _drop_row(self):
|
|
162
|
+
"""结束当前借出行生命周期,释放取消时保留真实未抵销金额。
|
|
163
|
+
|
|
164
|
+
参数: 无。返回: None。异常: 行费用释放或取消传播,之后只允许close。
|
|
165
|
+
"""
|
|
166
|
+
# 先丢自有行引用,再按实际账本释放;外部独立保留引用须由外部另行计费。
|
|
167
|
+
self._row = None
|
|
168
|
+
if self._row_cost:
|
|
169
|
+
self._release(self._row_cost, slot='_row_cost')
|
|
170
|
+
|
|
171
|
+
def _drop_current(self):
|
|
172
|
+
"""先关闭核生成器再关当前块,全部成功后释放当前核workspace。
|
|
173
|
+
|
|
174
|
+
参数: 无。返回: None。异常: generator/block关闭、释放或取消传播,可重试。
|
|
175
|
+
"""
|
|
176
|
+
# 生成器可能仍持有当前series和数组,close成功前不能丢句柄或归还工作区费用。
|
|
177
|
+
if self._rows is not None:
|
|
178
|
+
self._rows.close()
|
|
179
|
+
self._rows = None
|
|
180
|
+
if self._current is not None:
|
|
181
|
+
self._current.close()
|
|
182
|
+
self._current = None
|
|
183
|
+
if self._workspace_cost:
|
|
184
|
+
self._release(self._workspace_cost, slot='_workspace_cost')
|
|
185
|
+
self._row_estimate = 0
|
|
186
|
+
|
|
187
|
+
def _load_current(self):
|
|
188
|
+
"""取得一个有限块,在第一次消费选择核前预约全部核及行上界元数据。
|
|
189
|
+
|
|
190
|
+
参数: 无。返回: None。异常: EOF为StopIteration;读取、预算、核构造或取消传播。
|
|
191
|
+
"""
|
|
192
|
+
# 自有分块者被外部关闭/失败时明确拒绝,不能把损坏生命周期当正常EOF。
|
|
193
|
+
if self._blocks.closed or self._blocks.failed or self._blocks._closing:
|
|
194
|
+
raise ResultClosedError('选择行自有分块者已关闭、失败或正在清理')
|
|
195
|
+
self._current = next(self._blocks)
|
|
196
|
+
series = self._current.series
|
|
197
|
+
# N行数组/布尔掩码/索引和完整refs动态费用先预约;不会累计全窗行列表。
|
|
198
|
+
workspace = 65536 + 2048 * len(series.times_ns) + 16 * _metadata_bytes(series.source_refs)
|
|
199
|
+
self._reserve(workspace, slot='_workspace_cost')
|
|
200
|
+
if self._condition is not None:
|
|
201
|
+
# 联合身份沿既有内存select入口;replace只在workspace已取得后复制冻结模型。
|
|
202
|
+
identity = self._compiled.identity + ':' + self._condition.identity
|
|
203
|
+
series = replace(series, binding_identity=identity)
|
|
204
|
+
# 当前行上界含最长原值/枚举标签、单位、联合身份和完整来源,分配前按此费用预约。
|
|
205
|
+
value_metadata = max(_metadata_bytes(value) for value in series.values)
|
|
206
|
+
self._row_estimate = 4096 + 16 * (_metadata_bytes((series.source_refs, series.binding_identity, series.unit)) + value_metadata)
|
|
207
|
+
if self._backend == 'reference':
|
|
208
|
+
from ..core.calculations_reference import select_reference
|
|
209
|
+
self._rows = select_reference(series, self._spec)
|
|
210
|
+
else:
|
|
211
|
+
from ..core.calculations_numpy import select_numpy
|
|
212
|
+
self._rows = select_numpy(series, self._spec)
|
|
213
|
+
|
|
214
|
+
def _finish_exhaustion(self):
|
|
215
|
+
"""正常EOF释放当前核/行/块费用,保留固定描述至explicit close。
|
|
216
|
+
|
|
217
|
+
参数: 无。返回: None。异常: 关闭/释放取消传播,失败后仅可close恢复。
|
|
218
|
+
"""
|
|
219
|
+
# EOF不等于显式close,但自有当前行、生成器、当前块和分块者都不再需要。
|
|
220
|
+
self._drop_row()
|
|
221
|
+
self._drop_current()
|
|
222
|
+
if self._blocks is not None:
|
|
223
|
+
self._blocks.close()
|
|
224
|
+
self._blocks = None
|
|
225
|
+
# 原配置、identity和exhausted状态仍由owner持有,固定描述费用只在explicit close归还。
|
|
226
|
+
self._exhausted = True
|
|
227
|
+
|
|
228
|
+
def __next__(self):
|
|
229
|
+
"""借出至下一次推进/close的单SelectionRow,TRUE/UNKNOWN原样交付。
|
|
230
|
+
|
|
231
|
+
参数: 无。返回: 一个SelectionRow;FALSE、非实际更新和半开右端由原核过滤。
|
|
232
|
+
异常: 正常EOF可重复StopIteration;关闭/半关闭ResultClosedError;其他操作失败后仅close。
|
|
233
|
+
"""
|
|
234
|
+
if self._closed or self._closing:
|
|
235
|
+
raise ResultClosedError('历史选择行已关闭或正在清理')
|
|
236
|
+
if self._failed:
|
|
237
|
+
raise RuntimeError('失败的历史选择行只能关闭')
|
|
238
|
+
if self._exhausted:
|
|
239
|
+
raise StopIteration
|
|
240
|
+
try:
|
|
241
|
+
# 当前核可能仍持有已关闭输入的series;子owner/块失效后不得继续借出悬挂前缀行。
|
|
242
|
+
if (self._blocks is not None and (self._blocks.closed or self._blocks.failed or self._blocks._closing)
|
|
243
|
+
or self._current is not None and (self._current.closed or self._current._closing)):
|
|
244
|
+
raise ResultClosedError('选择行自有输入已关闭、失败或正在清理')
|
|
245
|
+
# 下一次推进结束上一行借出费用;块内只留一行,不积累输出历史。
|
|
246
|
+
self._drop_row()
|
|
247
|
+
while True:
|
|
248
|
+
if self._rows is None:
|
|
249
|
+
try:
|
|
250
|
+
self._load_current()
|
|
251
|
+
except StopIteration:
|
|
252
|
+
self._finish_exhaustion()
|
|
253
|
+
raise StopIteration
|
|
254
|
+
# 生成器第一次next会执行NumPy数组与索引;workspace和当前行费用已先取得。
|
|
255
|
+
self._reserve(self._row_estimate, slot='_row_cost')
|
|
256
|
+
try:
|
|
257
|
+
row = next(self._rows)
|
|
258
|
+
except StopIteration:
|
|
259
|
+
self._drop_row()
|
|
260
|
+
self._drop_current()
|
|
261
|
+
continue
|
|
262
|
+
self._row = row
|
|
263
|
+
return row
|
|
264
|
+
except StopIteration:
|
|
265
|
+
raise
|
|
266
|
+
except BaseException:
|
|
267
|
+
self._failed = True
|
|
268
|
+
raise
|
|
269
|
+
|
|
270
|
+
def close(self):
|
|
271
|
+
"""关闭核、当前块、分块者和自有费用,借用资源保持,重复关闭安全。
|
|
272
|
+
|
|
273
|
+
参数: 无。返回: None。异常: generator/block/分块者关闭或金额释放取消可重试。
|
|
274
|
+
"""
|
|
275
|
+
if self._closed:
|
|
276
|
+
return
|
|
277
|
+
# 进入清理后禁推进;句柄只在对应close成功后丢弃,不让持续取消丢失恢复入口。
|
|
278
|
+
self._closing = True
|
|
279
|
+
try:
|
|
280
|
+
# 先结束自有行引用并关闭generator;其frame/数组仍在时不释放任何核费用。
|
|
281
|
+
self._row = None
|
|
282
|
+
if self._rows is not None:
|
|
283
|
+
self._rows.close()
|
|
284
|
+
self._rows = None
|
|
285
|
+
if self._current is not None:
|
|
286
|
+
self._current.close()
|
|
287
|
+
self._current = None
|
|
288
|
+
if self._blocks is not None:
|
|
289
|
+
self._blocks.close()
|
|
290
|
+
self._blocks = None
|
|
291
|
+
# 自有句柄全关后统一抵销固定/核/当前行金额;前后取消由实际held账本恢复。
|
|
292
|
+
if self._held_cost:
|
|
293
|
+
self._release(self._held_cost)
|
|
294
|
+
finally:
|
|
295
|
+
# 自有各句柄和实际持有金额全部清零才closed,不以借用账本全局余额代替证明。
|
|
296
|
+
if self._rows is None and self._current is None and self._blocks is None and self._held_cost == 0:
|
|
297
|
+
self._workspace_cost = self._row_cost = self._row_estimate = 0
|
|
298
|
+
self._history = self._context = self._bindings = self._compiled = self._condition = None
|
|
299
|
+
self._observation = None
|
|
300
|
+
self._closed = True
|