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,355 @@
|
|
|
1
|
+
"""将结果流关联成可直接阅读的CSV,不重新读取或计算输入。
|
|
2
|
+
|
|
3
|
+
事件、窗口及计算的既有排序不同,先用临时SQLite索引关联,再逐行发布。
|
|
4
|
+
索引只有本次结果,固定缓存、禁止mmap、写前预付页面;关闭后删除,不发布
|
|
5
|
+
原表副本。CSV、JSONL旧路径不调用本模块。所有权保存在AnalysisResult供失败恢复。
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
# SQLite属于Python标准库;只创建本次发布目录中的私有临时文件。
|
|
9
|
+
import csv
|
|
10
|
+
import hashlib
|
|
11
|
+
import json
|
|
12
|
+
import sqlite3
|
|
13
|
+
from contextlib import closing
|
|
14
|
+
from math import ceil
|
|
15
|
+
from .budget import _reserve_owned_ram, _release_owned_ram
|
|
16
|
+
from .errors import ResultFormatError
|
|
17
|
+
from .summary import summary_fields
|
|
18
|
+
from .readable_format import STATES, REASONS, seconds, explanation, quality_text
|
|
19
|
+
|
|
20
|
+
IDENTITY = ('dataset_id', 'entity_id', 'session_id')
|
|
21
|
+
LABELS = ('数据集', '对象', '会话')
|
|
22
|
+
FILES = {'events': '事件结果.csv', 'segments': '窗口结果.csv', 'calculations': '会话结果.csv',
|
|
23
|
+
'sequences': '配对结果.csv', 'selections': '选择结果.csv',
|
|
24
|
+
'contributions': '贡献明细.csv', 'input_trace': '输入追溯.csv'}
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def _json(value):
|
|
28
|
+
"""编码临时索引值。参数: 平坦字段。返回: JSON文本。异常: 非有限值拒绝。"""
|
|
29
|
+
return json.dumps(value, ensure_ascii=False, allow_nan=False, separators=(',', ':'))
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class ReadableWriter:
|
|
33
|
+
"""拥有单次发布的关联索引及有限列定义;close可重试,不拥有输入或正式结果。"""
|
|
34
|
+
|
|
35
|
+
def __init__(self, owner, directory, iterator_factory):
|
|
36
|
+
"""仅安装可恢复字段,资源在prepare取得。
|
|
37
|
+
|
|
38
|
+
参数: owner为AnalysisResult,directory为本次临时目录,iterator_factory为结果游标。
|
|
39
|
+
返回: 未准备的writer。异常: 无文件副作用。
|
|
40
|
+
"""
|
|
41
|
+
self.owner, self.directory, self.iterator_factory = owner, directory, iterator_factory
|
|
42
|
+
self.path = directory / '.readable-index.sqlite'
|
|
43
|
+
self.connection = None
|
|
44
|
+
self._budget = owner.spool.budget
|
|
45
|
+
self._held_cost = self._ram_cost = 0
|
|
46
|
+
self.pages = 0
|
|
47
|
+
self.closed = False
|
|
48
|
+
self.metrics = {'session': {}, 'event': {}, 'segment': {}}
|
|
49
|
+
self.counts, self.infos = {}, {}
|
|
50
|
+
self.confirmation = False
|
|
51
|
+
self.quality_handle = None
|
|
52
|
+
self.coverage = None
|
|
53
|
+
|
|
54
|
+
def _execute(self, sql, values=(), size=0):
|
|
55
|
+
"""写前预留SQLite页面,上限由数据库本身强制执行。
|
|
56
|
+
|
|
57
|
+
参数: sql/values为受控语句,size为本条JSON字符数。返回: cursor。
|
|
58
|
+
异常: 配额、SQL、IO或取消传播。预留包含B树分裂余量,不按总行数预占RAM。
|
|
59
|
+
"""
|
|
60
|
+
# page_count包含事务中已分配页;保守覆盖UTF8值、索引键及B树分裂。
|
|
61
|
+
count = self.connection.execute('PRAGMA page_count').fetchone()[0]
|
|
62
|
+
needed = count + 16 + ceil(size * 12 / 4096)
|
|
63
|
+
if needed > self.pages:
|
|
64
|
+
self._budget.reserve_spool((needed - self.pages) * 4096)
|
|
65
|
+
self.pages = needed
|
|
66
|
+
self.connection.execute(f'PRAGMA max_page_count={needed}')
|
|
67
|
+
return self.connection.execute(sql, values)
|
|
68
|
+
|
|
69
|
+
def _rows(self, table):
|
|
70
|
+
"""按原游标逐条读已计算结果,保持严格解析和真实关闭。
|
|
71
|
+
|
|
72
|
+
参数: table为启用表。返回: 平坦字段生成器。异常: 读取/校验/关闭错误传播。
|
|
73
|
+
"""
|
|
74
|
+
with closing(self.iterator_factory(self.owner, table)) as iterator:
|
|
75
|
+
count = 0
|
|
76
|
+
for row in iterator:
|
|
77
|
+
count += 1
|
|
78
|
+
fields = summary_fields(row)
|
|
79
|
+
# 显式质量诊断仍随唯一必要读取得到,不另扫一遍结果。
|
|
80
|
+
if self.quality_handle is not None:
|
|
81
|
+
state_field = {'selections': 'selection', 'contributions': 'reason',
|
|
82
|
+
'input_trace': 'record_type'}.get(table, 'status')
|
|
83
|
+
key = table + ':' + fields[state_field]
|
|
84
|
+
self.coverage[key] = self.coverage.get(key, 0) + 1
|
|
85
|
+
diagnostic = {key: fields[key] for key in ('sequence', *IDENTITY, 'quality', state_field)}
|
|
86
|
+
diagnostic['table'] = table
|
|
87
|
+
self.quality_handle.write(_json(diagnostic) + '\n')
|
|
88
|
+
yield fields
|
|
89
|
+
if count != self.owner.spool.counts.get(table, 0):
|
|
90
|
+
raise ResultFormatError('可读导出行数与暂存不一致')
|
|
91
|
+
|
|
92
|
+
def prepare(self):
|
|
93
|
+
"""建立必要关联和列定义,不读取原始日志。
|
|
94
|
+
|
|
95
|
+
参数: 无。返回: None。异常: 重复身份、重复指标、配额/IO传播。
|
|
96
|
+
"""
|
|
97
|
+
if not any(self.owner.spool.counts.get(table, 0) for table in ('events', 'segments', 'sequences', 'calculations')):
|
|
98
|
+
# 只有逐条明细或全空结果时没有关联消费者,连空索引也不创建。
|
|
99
|
+
self.confirmation = True
|
|
100
|
+
return
|
|
101
|
+
_reserve_owned_ram(self, 262144, '_ram_cost')
|
|
102
|
+
# 禁止系统临时排序文件和mmap;后续查询只走已声明索引。
|
|
103
|
+
self._budget.reserve_spool(65536)
|
|
104
|
+
self.pages = 16
|
|
105
|
+
self.connection = sqlite3.connect(self.path, isolation_level=None)
|
|
106
|
+
self.connection.execute('PRAGMA page_size=4096')
|
|
107
|
+
self.connection.execute('PRAGMA max_page_count=16')
|
|
108
|
+
self.connection.execute('PRAGMA cache_size=-64')
|
|
109
|
+
self.connection.execute('PRAGMA mmap_size=0')
|
|
110
|
+
self.connection.execute('PRAGMA journal_mode=OFF')
|
|
111
|
+
self.connection.execute('PRAGMA synchronous=OFF')
|
|
112
|
+
self.connection.execute('PRAGMA temp_store=MEMORY')
|
|
113
|
+
self._execute('CREATE TABLE objects(kind TEXT,d TEXT,e TEXT,s TEXT,id TEXT,n INTEGER,payload TEXT,'
|
|
114
|
+
'PRIMARY KEY(kind,d,e,s,id),UNIQUE(kind,n)) WITHOUT ROWID')
|
|
115
|
+
self._execute('CREATE TABLE metrics(d TEXT,e TEXT,s TEXT,scope TEXT,parent TEXT,name TEXT,payload TEXT,'
|
|
116
|
+
'PRIMARY KEY(d,e,s,scope,parent,name)) WITHOUT ROWID')
|
|
117
|
+
self.connection.execute('BEGIN')
|
|
118
|
+
# 每表编号来自既有稳定结果排序,不截短哈希,也不跨会话错联。
|
|
119
|
+
for table in ('events', 'segments', 'sequences', 'calculations'):
|
|
120
|
+
if table not in self.owner.spool.tables:
|
|
121
|
+
continue
|
|
122
|
+
for number, row in enumerate(self._rows(table), 1):
|
|
123
|
+
payload = _json(row)
|
|
124
|
+
identity = tuple(row[name] for name in IDENTITY)
|
|
125
|
+
if table == 'calculations':
|
|
126
|
+
name, scope = row['calculation_id'], row['scope']
|
|
127
|
+
definition = (row['unit'], row['operation'])
|
|
128
|
+
if scope != 'session':
|
|
129
|
+
self._number('events' if scope == 'event' else 'segments', row, row['parent_id'])
|
|
130
|
+
if name not in self.metrics[scope]:
|
|
131
|
+
_reserve_owned_ram(self, 2048 + 64 * (len(name) + len(row['unit'])), '_ram_cost')
|
|
132
|
+
self.metrics[scope][name] = definition
|
|
133
|
+
elif self.metrics[scope][name] != definition:
|
|
134
|
+
raise ResultFormatError('同名计算的单位或算子不一致')
|
|
135
|
+
self._execute('INSERT INTO metrics VALUES(?,?,?,?,?,?,?)',
|
|
136
|
+
(*identity, scope, row['parent_id'] or '', name, payload), len(payload))
|
|
137
|
+
# session本身也是关联对象;多项指标只建立一次会话结果行。
|
|
138
|
+
if scope == 'session':
|
|
139
|
+
self._execute('INSERT OR IGNORE INTO objects VALUES(?,?,?,?,?,?,?)',
|
|
140
|
+
('calculations', *identity, '', number, _json(dict(zip(IDENTITY, identity)))), len(payload))
|
|
141
|
+
else:
|
|
142
|
+
key = {'events': 'event_id', 'segments': 'segment_id', 'sequences': 'result_id'}[table]
|
|
143
|
+
self._execute('INSERT INTO objects VALUES(?,?,?,?,?,?,?)',
|
|
144
|
+
(table, *identity, row[key], number, payload), len(payload))
|
|
145
|
+
# 一次发布共用事务,避免每条结果触发一次磁盘提交;缓存与页面上限仍逐次生效。
|
|
146
|
+
self.connection.execute('COMMIT')
|
|
147
|
+
self.confirmation = bool({'sequences', 'segments'} & set(self.owner.spool.tables)) or not self.metrics['event'] or any(
|
|
148
|
+
operation != 'integral' for _, operation in self.metrics['event'].values())
|
|
149
|
+
if not self.confirmation:
|
|
150
|
+
# 同一计划可能还有独立事件;不能因别的规则做了积分就隐藏其确认时刻。
|
|
151
|
+
self.confirmation = self.connection.execute(
|
|
152
|
+
"SELECT 1 FROM objects o WHERE o.kind='events' AND NOT EXISTS "
|
|
153
|
+
"(SELECT 1 FROM metrics m WHERE m.d=o.d AND m.e=o.e AND m.s=o.s "
|
|
154
|
+
"AND m.scope='event' AND m.parent=o.id) LIMIT 1").fetchone() is not None
|
|
155
|
+
|
|
156
|
+
def _number(self, kind, row, identifier):
|
|
157
|
+
"""将完整父ID映射为本次表编号,缺失关系直接报错。
|
|
158
|
+
|
|
159
|
+
参数: kind为events/segments,row含完整身份,identifier可为None。
|
|
160
|
+
返回: 编号或空字符串。异常: ResultFormatError为悬空父关联。
|
|
161
|
+
"""
|
|
162
|
+
if identifier is None:
|
|
163
|
+
return ''
|
|
164
|
+
if self.connection is None:
|
|
165
|
+
raise ResultFormatError('可读输出缺少父结果')
|
|
166
|
+
found = self.connection.execute('SELECT n FROM objects WHERE kind=? AND d=? AND e=? AND s=? AND id=?',
|
|
167
|
+
(kind, *(row[k] for k in IDENTITY), identifier)).fetchone()
|
|
168
|
+
if found is None:
|
|
169
|
+
raise ResultFormatError(f'可读输出缺少{kind}父结果,不能静默丢失关联')
|
|
170
|
+
return found[0]
|
|
171
|
+
|
|
172
|
+
def _metric_columns(self, scope):
|
|
173
|
+
"""创建已付预算的有限指标列。参数: scope。返回: 列名列表。异常: 无。"""
|
|
174
|
+
columns = []
|
|
175
|
+
for name, (unit, operation) in self.metrics[scope].items():
|
|
176
|
+
# min_time是时间范围内最小值,不是最小时刻;指标单位必须原样保留。
|
|
177
|
+
columns.extend((f'{name}({unit})', f'{name}:状态', f'{name}:说明'))
|
|
178
|
+
return columns
|
|
179
|
+
|
|
180
|
+
def _metric_values(self, scope, row, parent):
|
|
181
|
+
"""按同一完整身份取指标,未产生的指标不伪装为完整或零。
|
|
182
|
+
|
|
183
|
+
参数: scope/row/parent定位范围。返回: 有限单行列表。异常: 关联/JSON错误传播。
|
|
184
|
+
"""
|
|
185
|
+
values = []
|
|
186
|
+
for name, (unit, operation) in self.metrics[scope].items():
|
|
187
|
+
found = self.connection.execute('SELECT payload FROM metrics WHERE d=? AND e=? AND s=? AND scope=? AND parent=? AND name=?',
|
|
188
|
+
(*(row[k] for k in IDENTITY), scope, parent or '', name)).fetchone()
|
|
189
|
+
if found is None:
|
|
190
|
+
values.extend(('', '无此项结果', ''))
|
|
191
|
+
continue
|
|
192
|
+
metric = json.loads(found[0])
|
|
193
|
+
value = metric['value']
|
|
194
|
+
values.extend((value, STATES.get(metric['status'], metric['status']), explanation(metric)))
|
|
195
|
+
return values
|
|
196
|
+
|
|
197
|
+
def _base(self, table, row, number):
|
|
198
|
+
"""形成业务列,保留事件/窗口/配对不同含义。
|
|
199
|
+
|
|
200
|
+
参数: table、平坦row、本次number。返回: 单行列表。异常: 悬空关联传播。
|
|
201
|
+
"""
|
|
202
|
+
if table == 'calculations':
|
|
203
|
+
return self._metric_values('session', row, '')
|
|
204
|
+
if table == 'events':
|
|
205
|
+
values = [number, row['rule_id'], seconds(row['start_ns'])]
|
|
206
|
+
if self.confirmation:
|
|
207
|
+
values.append(seconds(row['confirmed_ns']))
|
|
208
|
+
values.extend((seconds(row['end_ns']), STATES[row['status']], quality_text(row['quality'])))
|
|
209
|
+
return values + self._metric_values('event', row, row['event_id'])
|
|
210
|
+
if table == 'segments':
|
|
211
|
+
return [number, row['window_id'], seconds(row['start_ns']), seconds(row['end_ns']),
|
|
212
|
+
STATES[row['status']], '、'.join(str(self._number('events', row, p)) for p in row['parent_event_ids']),
|
|
213
|
+
quality_text(row['quality'])] + self._metric_values('segment', row, row['segment_id'])
|
|
214
|
+
return [number, row['rule_id'], self._number('events', row, row['request_id']),
|
|
215
|
+
self._number('events', row, row['response_id']), seconds(row['decided_ns']), seconds(row['delay_ns']),
|
|
216
|
+
STATES[row['status']], quality_text(row['quality'])]
|
|
217
|
+
|
|
218
|
+
def _write(self, table, columns, rows):
|
|
219
|
+
"""直接写最终CSV并随写计算可选摘要,不写后回读。
|
|
220
|
+
|
|
221
|
+
参数: table/columns/rows为本次有限列与流。返回: 路径。异常: 编码、IO或取消传播。
|
|
222
|
+
"""
|
|
223
|
+
path = self.directory / FILES[table]
|
|
224
|
+
digest = hashlib.sha256() if self.owner.metadata.integrity_diagnostics else None
|
|
225
|
+
count, size = 0, 0
|
|
226
|
+
# BOM使Windows表格软件能直接识别中文;仅可读CSV使用它。
|
|
227
|
+
with path.open('xb') as handle:
|
|
228
|
+
header = b'\xef\xbb\xbf'
|
|
229
|
+
handle.write(header)
|
|
230
|
+
size += len(header)
|
|
231
|
+
if digest is not None:
|
|
232
|
+
digest.update(header)
|
|
233
|
+
# StringIO每次只持一条CSV,避免跨结果累计。
|
|
234
|
+
import io
|
|
235
|
+
buffer = io.StringIO(newline='')
|
|
236
|
+
writer = csv.writer(buffer)
|
|
237
|
+
for index, values in enumerate(_with_header(columns, rows)):
|
|
238
|
+
buffer.seek(0)
|
|
239
|
+
buffer.truncate(0)
|
|
240
|
+
writer.writerow(values)
|
|
241
|
+
payload = buffer.getvalue().encode('utf-8')
|
|
242
|
+
if handle.write(payload) != len(payload):
|
|
243
|
+
raise OSError('可读CSV写入不完整')
|
|
244
|
+
size += len(payload)
|
|
245
|
+
if digest is not None:
|
|
246
|
+
digest.update(payload)
|
|
247
|
+
if index:
|
|
248
|
+
count += 1
|
|
249
|
+
self.counts[table] = count
|
|
250
|
+
info = dict(name=path.name, bytes=size)
|
|
251
|
+
if digest is not None:
|
|
252
|
+
info['sha256'] = digest.hexdigest()
|
|
253
|
+
self.infos[path.name] = info
|
|
254
|
+
return path
|
|
255
|
+
|
|
256
|
+
def write(self, quality_handle=None, coverage=None):
|
|
257
|
+
"""发布全部关联主表;明细由后续专门分支逐条处理。
|
|
258
|
+
|
|
259
|
+
参数: quality_handle/coverage为显式质量诊断,默认不生成。返回: 路径tuple。
|
|
260
|
+
异常: 关联/预算/IO错误传播。
|
|
261
|
+
"""
|
|
262
|
+
self.quality_handle, self.coverage = quality_handle, coverage
|
|
263
|
+
self.prepare()
|
|
264
|
+
identity = self.owner.spool.identity_summary or (None, None, None)
|
|
265
|
+
self.varying = tuple(index for index, value in enumerate(identity) if value is None)
|
|
266
|
+
paths = []
|
|
267
|
+
columns = {
|
|
268
|
+
'calculations': self._metric_columns('session'),
|
|
269
|
+
'events': ['区间', '规则', '开始时间(s)'] + (['确认时间(s)'] if self.confirmation else [])
|
|
270
|
+
+ ['结束时间(s)', '区间状态', '说明'] + self._metric_columns('event'),
|
|
271
|
+
'segments': ['窗口编号', '窗口', '开始时间(s)', '结束时间(s)', '窗口状态', '父事件区间', '说明']
|
|
272
|
+
+ self._metric_columns('segment'),
|
|
273
|
+
'sequences': ['配对编号', '规则', '请求区间', '响应区间', '判定时间(s)', '延迟(s)', '配对状态', '说明'],
|
|
274
|
+
}
|
|
275
|
+
for table in ('events', 'segments', 'calculations', 'sequences'):
|
|
276
|
+
if table not in self.owner.spool.tables:
|
|
277
|
+
continue
|
|
278
|
+
if table == 'calculations' and not self.metrics['session']:
|
|
279
|
+
continue
|
|
280
|
+
paths.append(self._write(table, [LABELS[i] for i in self.varying] + columns[table], self._main_rows(table)))
|
|
281
|
+
# 明细无需重排或宽表聚合,直接从原暂存逐行写出,不进入SQLite索引。
|
|
282
|
+
detail_columns = {
|
|
283
|
+
'selections': ['计算项', '统计范围', '所属区间', '时间(s)', '值', '单位', '数值状态', '选择状态', '说明'],
|
|
284
|
+
'contributions': ['计算项', '来源', '原记录序号', '求值序号', '贡献值', '说明'],
|
|
285
|
+
'input_trace': ['来源', '原记录序号', '时间(s)', '记录类型', '输入位置', '字段值', '说明'],
|
|
286
|
+
}
|
|
287
|
+
for table, names in detail_columns.items():
|
|
288
|
+
if table in self.owner.spool.tables:
|
|
289
|
+
paths.append(self._write(table, [LABELS[i] for i in self.varying] + names, self._detail_rows(table)))
|
|
290
|
+
return tuple(paths)
|
|
291
|
+
|
|
292
|
+
def _detail_rows(self, table):
|
|
293
|
+
"""直接输出请求的明细,保留未知、值类型及必要定位。
|
|
294
|
+
|
|
295
|
+
参数: table为明细表。返回: 有界CSV行。异常: 缺失父对象或原读取错误。
|
|
296
|
+
"""
|
|
297
|
+
for row in self._rows(table):
|
|
298
|
+
if table == 'selections':
|
|
299
|
+
scope = row['scope']
|
|
300
|
+
parent = '' if scope == 'session' else self._number(
|
|
301
|
+
'events' if scope == 'event' else 'segments', row, row['parent_id'])
|
|
302
|
+
values = [row['calculation_id'], {'session': '会话', 'event': '事件', 'segment': '窗口'}[scope],
|
|
303
|
+
parent, seconds(row['time_ns']), row['value'], row['unit'],
|
|
304
|
+
'有效' if row['valid'] else '无效', STATES[row['selection']], explanation(row)]
|
|
305
|
+
elif table == 'contributions':
|
|
306
|
+
values = [row['calculation_id'], row['source'], row['original_sequence'], row['evaluation_index'],
|
|
307
|
+
row['value'], explanation(row)]
|
|
308
|
+
else:
|
|
309
|
+
kinds = {'decoded_message': '解码报文', 'signal_sample': '信号样本', 'signal_clock': '信号时刻'}
|
|
310
|
+
values = [row['source'], row['original_sequence'], seconds(row['time_ns']), kinds[row['record_type']],
|
|
311
|
+
row['locator'], row['values_json'], quality_text(row['quality'])]
|
|
312
|
+
yield [row[IDENTITY[i]] for i in self.varying] + values
|
|
313
|
+
|
|
314
|
+
def _main_rows(self, table):
|
|
315
|
+
"""按索引顺序产生一行,查询不在RAM排序全表。
|
|
316
|
+
|
|
317
|
+
参数: table为主表。返回: CSV行生成器。异常: JSON/关联错误。
|
|
318
|
+
"""
|
|
319
|
+
if self.connection is None:
|
|
320
|
+
return
|
|
321
|
+
with closing(self.connection.execute('SELECT n,payload FROM objects WHERE kind=? ORDER BY n', (table,))) as cursor:
|
|
322
|
+
for number, payload in cursor:
|
|
323
|
+
row = json.loads(payload)
|
|
324
|
+
yield [row[IDENTITY[i]] for i in self.varying] + self._base(table, row, number)
|
|
325
|
+
|
|
326
|
+
def presentation(self):
|
|
327
|
+
"""仅返回共同身份和必要使用说明,不增加ID映射副本。
|
|
328
|
+
|
|
329
|
+
参数: 无。返回: 清单字典。异常: 无。
|
|
330
|
+
"""
|
|
331
|
+
return dict(version=1, time_unit='s', time_coordinates='保留原分析时间坐标,不从零重排,不推断日期或时区',
|
|
332
|
+
empty_cell='无数值;请结合本指标状态和说明,不等于0',
|
|
333
|
+
common_identity={IDENTITY[i]: value for i, value in enumerate(self.owner.spool.identity_summary or ())
|
|
334
|
+
if value is not None})
|
|
335
|
+
|
|
336
|
+
def close(self):
|
|
337
|
+
"""关闭并删除本次索引,失败保留真实owner供重试。
|
|
338
|
+
|
|
339
|
+
参数: 无。返回: None。异常: IO/释放错误传播,不删除输入或其他文件。
|
|
340
|
+
"""
|
|
341
|
+
if self.closed:
|
|
342
|
+
return
|
|
343
|
+
if self.connection is not None:
|
|
344
|
+
self.connection.close()
|
|
345
|
+
self.connection = None
|
|
346
|
+
self.path.unlink(missing_ok=True)
|
|
347
|
+
self.metrics.clear()
|
|
348
|
+
_release_owned_ram(self, self._ram_cost, '_ram_cost')
|
|
349
|
+
self.closed = True
|
|
350
|
+
|
|
351
|
+
|
|
352
|
+
def _with_header(columns, rows):
|
|
353
|
+
"""逐条提供表头及内容。参数: columns/rows。返回: 生成器。异常: 原流错误传播。"""
|
|
354
|
+
yield columns
|
|
355
|
+
yield from rows
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
"""将已计算的时间、状态和质量格式化为可读文字,不改变计算结果。
|
|
2
|
+
|
|
3
|
+
输入为精简结果的标量,输出为CSV单元格或清单说明。整数纳秒用整数运算
|
|
4
|
+
转换为十进制秒,不经过浮点,不补造日期。此模块无文件和输入读取副作用。
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
# 系统词汇集中维护;业务名称、表达式和普通结果数值不翻译或舍入。
|
|
8
|
+
STATES = {
|
|
9
|
+
'complete': '完整', 'partial': '部分有效', 'indeterminate': '无法确定',
|
|
10
|
+
'closed': '正常结束', 'interrupted': '数据中断',
|
|
11
|
+
'truncated': '观测结束,活动尚未确认结束', 'timeout': '超时结束',
|
|
12
|
+
'point': '瞬时事件', 'empty': '空窗口', 'matched': '已响应',
|
|
13
|
+
'no_response': '时限内未响应', 'true': '满足条件', 'unknown': '条件未知',
|
|
14
|
+
}
|
|
15
|
+
REASONS = {
|
|
16
|
+
'ok': '', 'partial_coverage': '仅统计有效部分', 'partial_input': '输入仅部分有效',
|
|
17
|
+
'insufficient_coverage': '有效数据不足', 'no_observation': '没有所需观测数据',
|
|
18
|
+
'zero_length_window': '统计范围长度为零', 'calculation_failed': '计算失败',
|
|
19
|
+
'empty_selection': '条件已知,未选中数据', 'unknown_selection': '无法确定选中哪些数据',
|
|
20
|
+
'no_samples': '没有可用样本', 'no_valid_selected_data': '选中范围内没有有效数据',
|
|
21
|
+
'no_evaluations': '没有参与计算的报文', 'contributed': '已计入',
|
|
22
|
+
'missing_input': '缺少计算输入', 'condition_false': '不满足条件,已跳过',
|
|
23
|
+
'evaluation_error': '计算失败,已跳过', 'nonfinite_input': '输入不是有限数,已跳过',
|
|
24
|
+
'observed': '实际观测', 'estimated': '估计值', 'missing': '数据缺失',
|
|
25
|
+
'missing_right': '缺少右侧样本', 'sufficient': '满足覆盖率要求',
|
|
26
|
+
}
|
|
27
|
+
QUALITY = ((1, '数据缺失'), (2, '数据过期'), (4, '解码失败'), (8, '非有限值'),
|
|
28
|
+
(16, '数值超出允许范围'), (32, '估计值'), (64, '数值溢出'),
|
|
29
|
+
(128, '精度损失'), (256, '计算定义域错误'))
|
|
30
|
+
OUTCOMES = {
|
|
31
|
+
'no_observation': '没有所需观测数据', 'insufficient_data': '数据不足,无法确定是否发生事件',
|
|
32
|
+
'events_found': '已找到满足要求的事件', 'duration_not_met': '条件曾成立,但持续时间不满足要求',
|
|
33
|
+
'condition_not_met': '观测范围内条件未成立', 'no_event': '没有产生事件',
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def seconds(value):
|
|
38
|
+
"""精确转换纳秒,不产生第二套时间值。
|
|
39
|
+
|
|
40
|
+
参数: value为整数纳秒或None。返回: 最多9位小数的秒文本;None为空字符串。
|
|
41
|
+
异常: TypeError为非整数输入;不接受bool或浮点纳秒。
|
|
42
|
+
"""
|
|
43
|
+
if value is None:
|
|
44
|
+
return ''
|
|
45
|
+
if type(value) is not int:
|
|
46
|
+
raise TypeError('可读时间需要整数纳秒')
|
|
47
|
+
# 负时间使用绝对值拆分,避免Python负整数除法改变小数部分。
|
|
48
|
+
whole, fraction = divmod(abs(value), 1_000_000_000)
|
|
49
|
+
text = str(whole) + (('.' + f'{fraction:09d}'.rstrip('0')) if fraction else '')
|
|
50
|
+
return ('-' if value < 0 else '') + text
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def quality_text(value):
|
|
54
|
+
"""翻译已设置质量位,0不声称数据绝对正确。
|
|
55
|
+
|
|
56
|
+
参数: value为质量整数。返回: 中文原因,以分号分隔;0为空。
|
|
57
|
+
异常: 类型错误传播;未知位明确保留提示,不能静默丢失。
|
|
58
|
+
"""
|
|
59
|
+
parts = [text for mask, text in QUALITY if int(value) & mask]
|
|
60
|
+
remainder = int(value) & ~sum(mask for mask, _ in QUALITY)
|
|
61
|
+
if remainder:
|
|
62
|
+
parts.append(f'未识别质量标记{remainder}')
|
|
63
|
+
return ';'.join(parts)
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def explanation(row):
|
|
67
|
+
"""合并一项结果的必要原因和质量,不把普通ok当作诊断。
|
|
68
|
+
|
|
69
|
+
参数: row为已校验平坦字段。返回: 中文说明。异常: 缺失字段错误传播。
|
|
70
|
+
"""
|
|
71
|
+
reason = row.get('reason', '')
|
|
72
|
+
parts = [REASONS.get(reason, reason), quality_text(row['quality'])]
|
|
73
|
+
if row.get('coverage_status') == 'indeterminate':
|
|
74
|
+
parts.append('未达到要求的覆盖率')
|
|
75
|
+
return ';'.join(dict.fromkeys(part for part in parts if part))
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
def outcome_messages(outcome):
|
|
79
|
+
"""解释同次分析的轻量概况,不额外寻找未知区间。
|
|
80
|
+
|
|
81
|
+
参数: outcome为AnalysisOutcome或None。返回: 每规则一条说明的列表。
|
|
82
|
+
异常: 无;有未知与已有完整事件可以同时出现。
|
|
83
|
+
"""
|
|
84
|
+
if outcome is None:
|
|
85
|
+
return []
|
|
86
|
+
messages = []
|
|
87
|
+
for item in outcome.rules:
|
|
88
|
+
text = f'{item.rule_id}:{OUTCOMES[item.status]}({item.event_count}个)'
|
|
89
|
+
if item.has_unknown:
|
|
90
|
+
text += ';其他观测中存在条件未知,不据此否定已输出区间的计算状态'
|
|
91
|
+
if item.unobserved_signals:
|
|
92
|
+
text += ';未观测到:' + '、'.join(item.unobserved_signals)
|
|
93
|
+
messages.append(text)
|
|
94
|
+
return messages
|