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,364 @@
|
|
|
1
|
+
"""把明确单位的时间数值或完整日期转换为整数纳秒,并保存转换诊断。
|
|
2
|
+
|
|
3
|
+
数值入口接收声明为s、ms、us或ns的整数、十进制文本、Decimal或已有float;
|
|
4
|
+
日期入口接收完整ISO日期。输出为int64纳秒及输入表示、舍入和时区信息。
|
|
5
|
+
换算通过十进制系数和指数完成,只在最终纳秒处舍入;恰好半值时取最近偶数,
|
|
6
|
+
不受Decimal全局精度影响,也不经过浮点UTC秒数。
|
|
7
|
+
日期中的明确时区偏移优先;无偏移时须传入tzinfo,重复或不存在的本地时刻
|
|
8
|
+
会被拒绝。已有浮点的上游精度无法恢复。单值最多4096位有效数字,极大指数
|
|
9
|
+
先判断溢出或舍零,不分配无界的10次幂。
|
|
10
|
+
参考加减先用Python整数计算再检查范围,独立于NumPy实现。本模块仅依赖
|
|
11
|
+
标准库,不读取文件、不使用机器默认时区,也不持有会话或日志状态。
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
# 标准库负责精确输入表示、冻结诊断、时区与序列类型;不导入数值后端。
|
|
15
|
+
import re
|
|
16
|
+
from dataclasses import dataclass, replace
|
|
17
|
+
from datetime import datetime, timezone, tzinfo
|
|
18
|
+
from decimal import Decimal, InvalidOperation
|
|
19
|
+
from numbers import Integral
|
|
20
|
+
from typing import Sequence
|
|
21
|
+
|
|
22
|
+
# int64纳秒协议允许负坐标,但不允许任何算术wrap。
|
|
23
|
+
INT64_MIN = -(1 << 63)
|
|
24
|
+
# 正端点与负端点不对称,所有精确计算完成后按此上界拒绝溢出。
|
|
25
|
+
INT64_MAX = (1 << 63) - 1
|
|
26
|
+
# 单位按10的幂转换,避免先乘float导致绝对时间失真。
|
|
27
|
+
UNIT_EXPONENTS = {"ns": 0, "us": 3, "ms": 6, "s": 9}
|
|
28
|
+
# 时间参数只接受完整数值和明确后缀;单位大小写敏感。
|
|
29
|
+
DURATION_PATTERN = re.compile(r"([+-]?(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?)(ns|us|ms|s)")
|
|
30
|
+
# 日期支持完整秒及任意十进制分数,不由datetime截断亚微秒。
|
|
31
|
+
DATETIME_PATTERN = re.compile(
|
|
32
|
+
r"(\d{4}-\d{2}-\d{2}[T ]\d{2}:\d{2}:\d{2})(?:\.(\d+))?(Z|[+-]\d{2}:\d{2})?"
|
|
33
|
+
)
|
|
34
|
+
# UTC原点只表达坐标,不将相对来源自动绑定到这个原点。
|
|
35
|
+
UTC_EPOCH = datetime(1970, 1, 1, tzinfo=timezone.utc)
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class TimeOverflowError(OverflowError):
|
|
39
|
+
"""时间坐标、偏移后坐标或非负跨度超出int64时拒绝运算。
|
|
40
|
+
|
|
41
|
+
异常不携带可被误用的回绕结果;失败由调用者记录为任务校验错误。
|
|
42
|
+
本类型没有可变状态,不打开资源或把失败当正常零时长。
|
|
43
|
+
"""
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
@dataclass(frozen=True)
|
|
47
|
+
class TimeConversion:
|
|
48
|
+
"""保存规范时间及来源精度,避免跨任务修改转换诊断。
|
|
49
|
+
|
|
50
|
+
time_ns经入口校验为int64;quantized表示实际纳秒舍入发生,浮点限制
|
|
51
|
+
与量化分别记录。input_text保留转换所见表示,不证明上游原始精度。
|
|
52
|
+
source_timezone仅记录日期采用的时区,不替代多源同步依据。
|
|
53
|
+
"""
|
|
54
|
+
|
|
55
|
+
time_ns: int # 核心坐标或时长,单位纳秒,有符号64位范围。
|
|
56
|
+
input_representation: str # integer/decimal_text/decimal/binary_float/ISO8601等实际来源。
|
|
57
|
+
input_unit: str # 明确声明的s/ms/us/ns,日期入口使用ISO8601。
|
|
58
|
+
input_text: str # 当前入口所见文本;不记录用户日志或假设更高源精度。
|
|
59
|
+
quantized: bool # 原精确表示不能整纳秒表示时为True,包括舍为0。
|
|
60
|
+
precision_limited: bool = False # 浮点输入只能规范化其已有精度。
|
|
61
|
+
rounding: str = "round_half_even" # 最终纳秒固定采用最近偶数舍入。
|
|
62
|
+
source_timezone: str | None = None # 日期实际采用的tzinfo说明,纯数值不猜。
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def require_int64_ns(value: int, field: str = "time_ns") -> int:
|
|
66
|
+
"""校验整数纳秒协议,明确拒绝布尔、浮点和越界。
|
|
67
|
+
|
|
68
|
+
参数:
|
|
69
|
+
value (Integral): 时间整数,允许NumPy整数标量,不允许bool。
|
|
70
|
+
field (str): 错误定位字段,默认time_ns。
|
|
71
|
+
返回:
|
|
72
|
+
int: 独立Python整数,保留原精确值。
|
|
73
|
+
异常:
|
|
74
|
+
TypeError: 非整数或bool,不能靠隐式截断转换。
|
|
75
|
+
TimeOverflowError: 超出有符号64位纳秒范围。
|
|
76
|
+
"""
|
|
77
|
+
# bool虽是Python整数子类,时间协议不得把True当1ns。
|
|
78
|
+
if isinstance(value, bool) or not isinstance(value, Integral):
|
|
79
|
+
# 输入类型错误在运算之前定位,不生成正常结果。
|
|
80
|
+
raise TypeError(f"{field}必须为整数纳秒,不能为布尔或浮点")
|
|
81
|
+
# 归一为Python整数只改变容器类型,不损失NumPy整数的位值。
|
|
82
|
+
result = int(value)
|
|
83
|
+
# 两侧边界包含;后续数组运算只能使用此范围内的时间。
|
|
84
|
+
if not INT64_MIN <= result <= INT64_MAX:
|
|
85
|
+
# 不返回wrap或饱和值,超界就是失败。
|
|
86
|
+
raise TimeOverflowError(f"{field}超出int64纳秒范围")
|
|
87
|
+
# 返回已校验值供时间协议与数组形状校验共享。
|
|
88
|
+
return result
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
def _decimal_input(value: int | float | str | Decimal) -> tuple[Decimal, str, str]:
|
|
92
|
+
"""取得精确的输入表示,不受全局Decimal计算精度影响。
|
|
93
|
+
|
|
94
|
+
参数:
|
|
95
|
+
value: 整数、十进制文本、Decimal或当前已有的float。
|
|
96
|
+
返回:
|
|
97
|
+
tuple: 精确Decimal、表示类型、原入口文本。
|
|
98
|
+
异常:
|
|
99
|
+
TypeError: 布尔或未支持的类型。
|
|
100
|
+
ValueError: 空文本或非法文本、非有限值或超过4096位有效数字。
|
|
101
|
+
"""
|
|
102
|
+
# 布尔不是时间,提前阻止其走整数路径。
|
|
103
|
+
if isinstance(value, bool):
|
|
104
|
+
# 类型拒绝明确,不采用Python隐式真值判断。
|
|
105
|
+
raise TypeError("布尔值不能表示时间")
|
|
106
|
+
# 文本保留十进制精度,不先解析为浮点。
|
|
107
|
+
if isinstance(value, str):
|
|
108
|
+
# 两端空白不代表精度或单位,数字主体按Decimal解析。
|
|
109
|
+
text = value.strip()
|
|
110
|
+
# 表示类型写入转换记录用于追溯。
|
|
111
|
+
representation = "decimal_text"
|
|
112
|
+
# 只拦截语法错误,不吞掉溢出或其他实现异常。
|
|
113
|
+
try:
|
|
114
|
+
# Decimal构造从文本取得完整系数,不执行上下文舍入。
|
|
115
|
+
number = Decimal(text)
|
|
116
|
+
except InvalidOperation as error:
|
|
117
|
+
# 带明确类型的错误交给计划/来源边界处理。
|
|
118
|
+
raise ValueError("非法十进制时间文本") from error
|
|
119
|
+
elif isinstance(value, Integral):
|
|
120
|
+
# 源整数可以比int64大,最终量纲变换后再判范围。
|
|
121
|
+
number, representation, text = Decimal(int(value)), "integer", str(value)
|
|
122
|
+
elif isinstance(value, float):
|
|
123
|
+
# 按当前二进制值精确展开,不将repr十进制当作未损失源数据。
|
|
124
|
+
number, representation, text = Decimal.from_float(value), "binary_float", repr(value)
|
|
125
|
+
elif isinstance(value, Decimal):
|
|
126
|
+
# Decimal对象原样读取,没有重新量化为固定全局精度。
|
|
127
|
+
number, representation, text = value, "decimal", str(value)
|
|
128
|
+
else:
|
|
129
|
+
# 不接受任意对象隐式转str或float,防止时间含义被猜测。
|
|
130
|
+
raise TypeError("时间仅接受整数、十进制文本、Decimal或float")
|
|
131
|
+
# 非有限值没有有效时间坐标,不映射为0或极值。
|
|
132
|
+
if not number.is_finite():
|
|
133
|
+
# 同时拒绝NaN、Infinity及已有非有限浮点。
|
|
134
|
+
raise ValueError("时间必须为有限数值")
|
|
135
|
+
# 限制数字主体规模,指数另用符号和位数判断,避免构造巨大整数。
|
|
136
|
+
if len(number.as_tuple().digits) > 4096:
|
|
137
|
+
# 明示此入口资源界限,不声称接受任意长度数值文本。
|
|
138
|
+
raise ValueError("时间超过4096位有效数字限制")
|
|
139
|
+
# 返回解析事实,实际纳秒运算由下一层进行。
|
|
140
|
+
return number, representation, text
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
def convert_time(value: int | float | str | Decimal, unit: str) -> TimeConversion:
|
|
144
|
+
"""按明确单位换算纳秒,并在最终结果处取最近偶数舍入。
|
|
145
|
+
|
|
146
|
+
参数:
|
|
147
|
+
value: 有限整数、十进制文本、Decimal或已有float,允许负时间坐标。
|
|
148
|
+
unit (str): 大小写敏感的s、ms、us或ns;没有默认单位。
|
|
149
|
+
返回:
|
|
150
|
+
TimeConversion: 整数纳秒、输入表示与单位,以及是否发生纳秒舍入和
|
|
151
|
+
是否受已有浮点精度限制的诊断。
|
|
152
|
+
异常:
|
|
153
|
+
TypeError或ValueError: 输入类型、文本语法、有效数字长度或单位不合法。
|
|
154
|
+
TimeOverflowError: 舍入后的结果超出int64范围。
|
|
155
|
+
处理流程:
|
|
156
|
+
分离符号、系数和指数,在整数域缩放或求商余数,再舍入到整纳秒。
|
|
157
|
+
极大正指数提前拒绝;极大负指数直接判定舍为0,避免无界分配。
|
|
158
|
+
副作用:
|
|
159
|
+
无,不修改输入、Decimal上下文或时间基准。
|
|
160
|
+
"""
|
|
161
|
+
# 单位必须显式属于当前协议,不猜测秒或自动改大小写。
|
|
162
|
+
if not isinstance(unit, str) or unit not in UNIT_EXPONENTS:
|
|
163
|
+
# 错误是配置问题,不是正常未知样本。
|
|
164
|
+
raise ValueError("时间单位必须为s/ms/us/ns")
|
|
165
|
+
# 得到与输入类型对应的精确表示和来源诊断。
|
|
166
|
+
number, representation, text = _decimal_input(value)
|
|
167
|
+
# tuple不做十进制算术,因此不受调用者的精度/舍入模式影响。
|
|
168
|
+
sign, digits, exponent = number.as_tuple()
|
|
169
|
+
# 有效数字最多4096,Python整数可精确保留这一受限系数。
|
|
170
|
+
coefficient = int("".join(str(digit) for digit in digits))
|
|
171
|
+
# 同一整数尺度下相加指数,不先乘float或Decimal上下文数值。
|
|
172
|
+
shift = exponent + UNIT_EXPONENTS[unit]
|
|
173
|
+
# 精确0在任意指数下仍为0,不触发巨大幂或量化。
|
|
174
|
+
if coefficient == 0:
|
|
175
|
+
# 正负零不影响时间轴,记录无实际量化。
|
|
176
|
+
magnitude, quantized = 0, False
|
|
177
|
+
elif shift >= 0:
|
|
178
|
+
# int64绝对值至多19位,超过则在分配10次幂前失败。
|
|
179
|
+
if len(digits) + shift > 19:
|
|
180
|
+
# 溢出不通过舍入、截断或wrap绕过。
|
|
181
|
+
raise TimeOverflowError("单位换算后超出int64纳秒范围")
|
|
182
|
+
# 仅对可表示数量级进行精确整数乘法。
|
|
183
|
+
magnitude, quantized = coefficient * (10 ** shift), False
|
|
184
|
+
elif -shift > len(digits):
|
|
185
|
+
# 数量级严格小于0.1ns,必定舍至0,不需生成巨大分母。
|
|
186
|
+
magnitude, quantized = 0, True
|
|
187
|
+
else:
|
|
188
|
+
# 剩余负指数至多4096,受输入位数限制,不产生无界分配。
|
|
189
|
+
divisor = 10 ** (-shift)
|
|
190
|
+
# 在非负系数上求商余,负号最后应用可对称处理负半值。
|
|
191
|
+
magnitude, remainder = divmod(coefficient, divisor)
|
|
192
|
+
# 严格超过半值进位,恰好半值仅在商为奇数时进位。
|
|
193
|
+
if 2 * remainder > divisor or (2 * remainder == divisor and magnitude % 2 == 1):
|
|
194
|
+
# 进位后的int64合法性仍必须在下一步校验。
|
|
195
|
+
magnitude += 1
|
|
196
|
+
# 仅实际非零余数表示量化,保留完整整纳秒输入的False。
|
|
197
|
+
quantized = remainder != 0
|
|
198
|
+
# 保留负号并检查正负边界,不把MIN绝对值转换为int64中间值。
|
|
199
|
+
time_ns = require_int64_ns(-magnitude if sign else magnitude)
|
|
200
|
+
# 冻结诊断区分实际纳秒量化与上游浮点已有限精度。
|
|
201
|
+
return TimeConversion(time_ns, representation, unit, text, quantized, representation == "binary_float")
|
|
202
|
+
|
|
203
|
+
|
|
204
|
+
def parse_duration(text: str) -> TimeConversion:
|
|
205
|
+
"""解析带单位的非负持续参数,允许显式零长度。
|
|
206
|
+
|
|
207
|
+
参数:
|
|
208
|
+
text (str): 完整数值后缀,如500ms、3s、0ns。
|
|
209
|
+
返回:
|
|
210
|
+
TimeConversion: 纳秒持续时间,原带单位文本保留。
|
|
211
|
+
异常:
|
|
212
|
+
TypeError: 非文本。
|
|
213
|
+
ValueError: 缺单位、非法语法或原数值为负,即使负小值会舍为0。
|
|
214
|
+
TimeOverflowError: 换算/舍入超int64。
|
|
215
|
+
"""
|
|
216
|
+
# 配置参数须为明确单位字符串,不默认将数字解释为秒。
|
|
217
|
+
if not isinstance(text, str):
|
|
218
|
+
# 错误定位为参数类型,不调用任意对象字符串方法。
|
|
219
|
+
raise TypeError("持续参数必须为带单位文本")
|
|
220
|
+
# fullmatch禁止余留不明字符或叠加单位。
|
|
221
|
+
match = DURATION_PATTERN.fullmatch(text.strip())
|
|
222
|
+
# 无匹配即缺失或非法数值/单位,不能只解析前缀。
|
|
223
|
+
if match is None:
|
|
224
|
+
# 给出当前真实支持范围,不声明其他配置解析已实现。
|
|
225
|
+
raise ValueError("持续参数格式应为数值+s/ms/us/ns")
|
|
226
|
+
# 原始负参数在量化前拒绝,防止-0.1ns舍为0后绕过约束。
|
|
227
|
+
if Decimal(match[1]) < 0:
|
|
228
|
+
# 固定持续不能反向,负时间坐标应使用convert_time入口。
|
|
229
|
+
raise ValueError("持续参数不能为负")
|
|
230
|
+
# 仅换算一次,实际元数据仍由精确入口生成。
|
|
231
|
+
result = convert_time(match[1], match[2])
|
|
232
|
+
# 原带单位文本保留,记录它是配置持续而非单独数值字符串。
|
|
233
|
+
return replace(result, input_text=text, input_representation="duration_text")
|
|
234
|
+
|
|
235
|
+
|
|
236
|
+
def parse_datetime_ns(text: str, source_timezone: tzinfo | None = None) -> TimeConversion:
|
|
237
|
+
"""将ISO完整日期转换为UTC整数纳秒,保留亚微秒分数。
|
|
238
|
+
|
|
239
|
+
参数:
|
|
240
|
+
text (str): YYYY-MM-DDTHH:MM:SS[.fraction][Z/±HH:MM],也允许空格分隔。
|
|
241
|
+
source_timezone (tzinfo|None): 无offset时必须提供;显式offset优先。
|
|
242
|
+
返回:
|
|
243
|
+
TimeConversion: UTC epoch纳秒、量化与实际采用时区,非机器默认。
|
|
244
|
+
异常:
|
|
245
|
+
TypeError/ValueError: 文本/时区非法、naive缺时区、本地时刻模糊或不存在。
|
|
246
|
+
TimeOverflowError: int64时间超界。
|
|
247
|
+
OverflowError: 转到UTC时超出datetime历法边界。
|
|
248
|
+
副作用:
|
|
249
|
+
无;不调用系统本地时区,不加载IANA名称或访问文件。
|
|
250
|
+
"""
|
|
251
|
+
# 日期输入必须为完整文本,不从文件名、机器地区或对象repr猜测。
|
|
252
|
+
if not isinstance(text, str):
|
|
253
|
+
# 错误类型在任何时区操作前拒绝。
|
|
254
|
+
raise TypeError("日期必须为ISO文本")
|
|
255
|
+
# 固定语法将任意长度秒分数独立保留,datetime仅处理整秒。
|
|
256
|
+
match = DATETIME_PATTERN.fullmatch(text.strip())
|
|
257
|
+
# 完整日期/offset格式不满足时,不能只解析一部分。
|
|
258
|
+
if match is None:
|
|
259
|
+
# 不声明日期-only、闰秒或任意厂商时间语法可用。
|
|
260
|
+
raise ValueError("日期须为完整ISO年月日时分秒及可选offset")
|
|
261
|
+
# 整秒基础与offset由datetime校验历法,分数不被微秒截断。
|
|
262
|
+
base, fraction, offset = match.groups()
|
|
263
|
+
# 标准库会归一化+00:60等偏移;文本分量须先严格拒绝非法范围。
|
|
264
|
+
if offset is not None and offset != "Z":
|
|
265
|
+
# 显式±HH:MM两个分量分别校验,不能用合计秒数掩盖非法分钟。
|
|
266
|
+
if int(offset[1:3]) > 23 or int(offset[4:6]) > 59:
|
|
267
|
+
# 时区偏移不是允许自动进位的时长,来源错误必须可见。
|
|
268
|
+
raise ValueError("ISO offset小时须为00—23、分钟须为00—59")
|
|
269
|
+
# UTC Z显式变换为等价offset文本,不改变物理时刻。
|
|
270
|
+
whole = datetime.fromisoformat(base + ("+00:00" if offset == "Z" else offset or ""))
|
|
271
|
+
# 只有没有时区偏移的日期输入需要调用者的来源时区。
|
|
272
|
+
if whole.tzinfo is None:
|
|
273
|
+
# 不用宿主机器时区作为隐式来源事实。
|
|
274
|
+
if not isinstance(source_timezone, tzinfo):
|
|
275
|
+
# 缺项在执行前明确定位。
|
|
276
|
+
raise ValueError("无offset日期必须声明source_timezone")
|
|
277
|
+
# 同一墙钟时刻采用fold0/1只检查歧义,不静默选择某个重复时刻。
|
|
278
|
+
whole = whole.replace(tzinfo=source_timezone)
|
|
279
|
+
# 不同fold偏移意味着模糊或跳空,来源应改为明确offset。
|
|
280
|
+
if whole.utcoffset() is None or whole.utcoffset() != whole.replace(fold=1).utcoffset():
|
|
281
|
+
# 拒绝无法唯一定位的本地时刻,不制造顺序可靠的假时间。
|
|
282
|
+
raise ValueError("来源时区下时刻不唯一或不存在,请使用明确offset")
|
|
283
|
+
# 往返校验捕获同offset也无法返回原墙钟值的时区映射。
|
|
284
|
+
roundtrip = whole.astimezone(timezone.utc).astimezone(source_timezone)
|
|
285
|
+
# 不存在的墙钟时间不能被时区库规范化后静默接受。
|
|
286
|
+
if roundtrip.replace(tzinfo=None) != whole.replace(tzinfo=None):
|
|
287
|
+
# 保留明确的失败原因,不当作正常数值0。
|
|
288
|
+
raise ValueError("来源时区下本地时刻不存在")
|
|
289
|
+
# 在UTC整数timedelta域保留天/秒/微秒,不用timestamp浮点方法。
|
|
290
|
+
delta = whole.astimezone(timezone.utc) - UTC_EPOCH
|
|
291
|
+
# 来源tzinfo可含微秒offset;UTC基准保留亚秒,最终范围在加原分数后检查。
|
|
292
|
+
base_ns = (delta.days * 86400 + delta.seconds) * 1_000_000_000 + delta.microseconds * 1000
|
|
293
|
+
# 小数由相同精确量化协议处理,允许舍入进位到下一秒。
|
|
294
|
+
partial = convert_time("0." + (fraction or "0"), "s")
|
|
295
|
+
# 时区基准是1000ns的整数倍,不影响原分数最近偶数舍入的奇偶判定,最终检查坐标。
|
|
296
|
+
result_ns = require_int64_ns(base_ns + partial.time_ns)
|
|
297
|
+
# 日期原文本和实际tzinfo写入诊断,当前解析没有浮点精度限制。
|
|
298
|
+
return TimeConversion(result_ns, "ISO8601", "ISO8601", text, partial.quantized, source_timezone=str(whole.tzinfo))
|
|
299
|
+
|
|
300
|
+
|
|
301
|
+
def checked_add_ns(time_ns: int, offset_ns: int) -> int:
|
|
302
|
+
"""为一个纳秒坐标添加固定偏移,并检查结果是否仍在int64范围内。
|
|
303
|
+
|
|
304
|
+
参数:
|
|
305
|
+
time_ns (Integral): 已满足int64范围的原时间坐标,单位为纳秒。
|
|
306
|
+
offset_ns (Integral): 已满足int64范围的固定偏移,单位为纳秒。
|
|
307
|
+
返回:
|
|
308
|
+
int: 精确的新坐标;成功相加不表示不同来源已经同步。
|
|
309
|
+
异常:
|
|
310
|
+
TypeError: 任一输入不是非布尔整数。
|
|
311
|
+
TimeOverflowError: 任一输入或相加结果超出int64范围。
|
|
312
|
+
"""
|
|
313
|
+
# 两个参数各自满足协议,禁止使用超界offset抵消超界输入。
|
|
314
|
+
source, offset = require_int64_ns(time_ns), require_int64_ns(offset_ns, "offset_ns")
|
|
315
|
+
# Python中间值不wrap,最终显式检查结果。
|
|
316
|
+
return require_int64_ns(source + offset, "shifted_time_ns")
|
|
317
|
+
|
|
318
|
+
|
|
319
|
+
def shift_times_reference(times: Sequence[int], offset_ns: int) -> tuple[int, ...]:
|
|
320
|
+
"""逐项独立计算固定偏移,作为数组内核的整数真值参考。
|
|
321
|
+
|
|
322
|
+
参数:
|
|
323
|
+
times (Sequence[Integral]): 已声明纳秒坐标,不要求排序。
|
|
324
|
+
offset_ns (Integral): 合法int64固定偏移。
|
|
325
|
+
返回:
|
|
326
|
+
tuple[int,...]: 新整数序列,空输入返回空tuple。
|
|
327
|
+
异常:
|
|
328
|
+
TypeError/TimeOverflowError: 参数类型或任一坐标/结果超界。
|
|
329
|
+
副作用:
|
|
330
|
+
无;不导入或调用NumPy实现,不修改输入。
|
|
331
|
+
"""
|
|
332
|
+
# 空序列也先检查offset,非法配置不能因没有样本而通过。
|
|
333
|
+
offset = require_int64_ns(offset_ns, "offset_ns")
|
|
334
|
+
# 标量检查/相加提供独立参考路径,不进行数组运算或隐式浮点转换。
|
|
335
|
+
return tuple(checked_add_ns(value, offset) for value in times)
|
|
336
|
+
|
|
337
|
+
|
|
338
|
+
def time_deltas_reference(times: Sequence[int]) -> tuple[int, ...]:
|
|
339
|
+
"""计算非递减整数时间的相邻跨度,允许同时间不同样本。
|
|
340
|
+
|
|
341
|
+
参数:
|
|
342
|
+
times (Sequence[Integral]): 来源顺序的int64纳秒,允许重复坐标。
|
|
343
|
+
返回:
|
|
344
|
+
tuple[int,...]: 长度max(N-1,0)的非负int64跨度。
|
|
345
|
+
异常:
|
|
346
|
+
TypeError/ValueError: 非整数或来源内时间回退。
|
|
347
|
+
TimeOverflowError: 输入或跨度超界,即使两端各自合法。
|
|
348
|
+
副作用:
|
|
349
|
+
无;Python整数参考不调用NumPy内核,也不排序或去重。
|
|
350
|
+
"""
|
|
351
|
+
# 先验证所有坐标,单点/空输入也不掩盖非法坐标。
|
|
352
|
+
checked = tuple(require_int64_ns(value) for value in times)
|
|
353
|
+
# 输出单独保存,不能修改调用者序列。
|
|
354
|
+
result = []
|
|
355
|
+
# 相邻跨度在Python整数域计算,避免绝对时间先转float失去1ns。
|
|
356
|
+
for left, right in zip(checked, checked[1:]):
|
|
357
|
+
# 负跨度表示来源乱序,首版明确拒绝而非排序旧输出。
|
|
358
|
+
if right < left:
|
|
359
|
+
# 同时间合法;这里只拒绝严格回退。
|
|
360
|
+
raise ValueError("时间序列必须非递减")
|
|
361
|
+
# 大跨符号差值可能超过MAX,先以精确整数取得再校验。
|
|
362
|
+
result.append(require_int64_ns(right - left, "delta_ns"))
|
|
363
|
+
# 返回只读参考结果,空/单点自然无相邻跨度。
|
|
364
|
+
return tuple(result)
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
"""对一列纳秒时间执行固定偏移或计算相邻时间差,返回独立的新数组。
|
|
2
|
+
|
|
3
|
+
输入必须是shape=(N,)、dtype=int64的ndarray,不接受浮点、uint64、object或
|
|
4
|
+
MaskedArray。先通过比较和布尔掩码证明加减安全,再执行NumPy数组运算,
|
|
5
|
+
保留同时间的零差值,允许空输入。输入只读使用,不排序或去重。
|
|
6
|
+
本模块只共享时间常量和标量偏移校验,不调用Python参考数值内核。输出和
|
|
7
|
+
临时掩码占用O(N)空间;没有文件操作、CAN访问或全局状态。这里只实现时间
|
|
8
|
+
运算,不能据此认定全部分析均已有数组实现。
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
# NumPy仅在显式选择本模块时导入;核心时间入口本身不依赖它。
|
|
12
|
+
import numpy as np
|
|
13
|
+
|
|
14
|
+
# 共享已经校验的整数协议;不导入参考加减函数。
|
|
15
|
+
from .conversion import INT64_MAX, INT64_MIN, TimeOverflowError, require_int64_ns
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def _require_time_array(times: np.ndarray) -> None:
|
|
19
|
+
"""检查数组形状和定宽dtype,不以转换/广播修补错误输入。
|
|
20
|
+
|
|
21
|
+
参数:
|
|
22
|
+
times (ndarray): shape=(N,)、dtype=int64的纳秒列。
|
|
23
|
+
返回:
|
|
24
|
+
None: 只读验证,不转换或复制输入。
|
|
25
|
+
异常:
|
|
26
|
+
TypeError: 非ndarray、MaskedArray或dtype不为原生int64。
|
|
27
|
+
ValueError: 不是一维列数组。
|
|
28
|
+
"""
|
|
29
|
+
# 检查真实数组,禁止把Python循环包装为隐式批量转换。
|
|
30
|
+
if not isinstance(times, np.ndarray) or np.ma.isMaskedArray(times) or times.dtype != np.dtype("int64"):
|
|
31
|
+
# 时间坐标不能缺失;拒绝整个MaskedArray协议,不能偷偷丢掩码或强制转换数据类型。
|
|
32
|
+
raise TypeError("时间数组必须为无MaskedArray掩码、dtype=int64的ndarray")
|
|
33
|
+
# 核心是单列时间轴,不允许维度广播掩盖调用错误。
|
|
34
|
+
if times.ndim != 1:
|
|
35
|
+
# 同样拒绝标量、矩阵或多维输入。
|
|
36
|
+
raise ValueError("时间数组形状必须为(N,)")
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def shift_times_numpy(times: np.ndarray, offset_ns: int) -> np.ndarray:
|
|
40
|
+
"""给全部时间坐标添加固定纳秒偏移,运算前先检查每项结果的范围。
|
|
41
|
+
|
|
42
|
+
参数:
|
|
43
|
+
times (ndarray[int64], shape=(N,)): 纳秒坐标,允许负值和未排序输入。
|
|
44
|
+
offset_ns (Integral): int64范围内的固定偏移,单位为纳秒。
|
|
45
|
+
返回:
|
|
46
|
+
ndarray[int64], shape=(N,): 独立的新数组;输入不修改,空输入返回空数组。
|
|
47
|
+
异常:
|
|
48
|
+
TypeError或ValueError: 输入类型、数据类型或形状不符合要求。
|
|
49
|
+
TimeOverflowError: 偏移本身或任一偏移后坐标超出int64范围。
|
|
50
|
+
副作用:
|
|
51
|
+
只分配输出和比较掩码,不调用参考相加函数或读取文件。
|
|
52
|
+
"""
|
|
53
|
+
# 验证数组形状和数据类型,不先做可能有损的转换。
|
|
54
|
+
_require_time_array(times)
|
|
55
|
+
# 标量协议可以共享,数值批量算法独立实现。
|
|
56
|
+
offset = require_int64_ns(offset_ns, "offset_ns")
|
|
57
|
+
# 正偏移的上界MAX-offset在Python整数域计算,没有中间wrap。
|
|
58
|
+
if offset > 0 and np.any(times > INT64_MAX - offset):
|
|
59
|
+
# 任一位置失败则整次时间映射拒绝,不填0丢弃数据。
|
|
60
|
+
raise TimeOverflowError("固定偏移导致时间上溢")
|
|
61
|
+
# 负偏移用MIN-offset为安全下界,包含MIN等于合法。
|
|
62
|
+
if offset < 0 and np.any(times < INT64_MIN - offset):
|
|
63
|
+
# 该检查在ufunc之前,保证不执行下溢。
|
|
64
|
+
raise TimeOverflowError("固定偏移导致时间下溢")
|
|
65
|
+
# 所有位置安全后执行一次int64数组运算,返回O(N)独立新数组。
|
|
66
|
+
return np.add(times, np.int64(offset))
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def time_deltas_numpy(times: np.ndarray) -> np.ndarray:
|
|
70
|
+
"""计算非递减时间轴的相邻纳秒差,先检查顺序及跨度再做数组减法。
|
|
71
|
+
|
|
72
|
+
参数:
|
|
73
|
+
times (ndarray[int64], shape=(N,)): 非递减纳秒轴,允许相同时间。
|
|
74
|
+
返回:
|
|
75
|
+
ndarray[int64], shape=(max(N-1, 0),): 独立的新数组,保存非负相邻跨度。
|
|
76
|
+
异常:
|
|
77
|
+
TypeError或ValueError: 输入类型、数据类型或形状错误,或者时间严格回退。
|
|
78
|
+
TimeOverflowError: 两端坐标均合法,但相邻跨度超过int64上限。
|
|
79
|
+
处理流程:
|
|
80
|
+
对负左端计算MAX+left作为安全右端阈值,右端严格超出阈值时拒绝。
|
|
81
|
+
全部检查通过后再减法,不先计算可能回绕的差值。
|
|
82
|
+
副作用:
|
|
83
|
+
输入只读使用;输出、阈值和掩码需要与输入长度成比例的空间。
|
|
84
|
+
"""
|
|
85
|
+
# 验证真实时间列,禁止浮点绝对时间参与差值。
|
|
86
|
+
_require_time_array(times)
|
|
87
|
+
# 两个shape=(N-1,)只读视图,无永久共同矩阵或输入复制。
|
|
88
|
+
left, right = times[:-1], times[1:]
|
|
89
|
+
# 比较原整数即可判断回退,不会在差值中间发生溢出。
|
|
90
|
+
if np.any(right < left):
|
|
91
|
+
# 相等合法,来源内乱序不排序或忽略。
|
|
92
|
+
raise ValueError("时间序列必须非递减")
|
|
93
|
+
# 只有负left会产生跨符号大跨度风险,掩码shape=(N-1,)。
|
|
94
|
+
negative_left = left < 0
|
|
95
|
+
# 阈值数组独立分配;非负left位置初始化0但不会参与溢出判定。
|
|
96
|
+
safe_right_limit = np.zeros_like(left)
|
|
97
|
+
# 负left+MAX总在int64范围内;where防止非负位置执行溢出加法。
|
|
98
|
+
np.add(left, np.int64(INT64_MAX), out=safe_right_limit, where=negative_left)
|
|
99
|
+
# 等于阈值的MAX跨度合法,严格超过才拒绝。
|
|
100
|
+
if np.any(negative_left & (right > safe_right_limit)):
|
|
101
|
+
# 在subtract前失败,不保留wrap值或转float回避问题。
|
|
102
|
+
raise TimeOverflowError("相邻时间跨度超出int64范围")
|
|
103
|
+
# 经过所有检查后,合法结果由真实数组减法一次计算。
|
|
104
|
+
return np.subtract(right, left)
|
chronaxis/user_guide.py
ADDED
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"""定位可以直接阅读的AI指南,按显式请求另存独立ZIP。
|
|
2
|
+
|
|
3
|
+
只处理公开使用说明、配置规范和合成样例,不读取用户业务输入。
|
|
4
|
+
默认只检查入口并返回路径,不构建、解压或复制。源码使用Docs/AI,
|
|
5
|
+
安装使用包内guide目录;显式导出才读取整套资料并写用户指定的新文件。
|
|
6
|
+
"""
|
|
7
|
+
from io import BytesIO
|
|
8
|
+
import json
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
from runpy import run_path
|
|
11
|
+
from zipfile import ZIP_DEFLATED, ZipFile, ZipInfo
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def guide_path(language="zh"):
|
|
15
|
+
"""定位中英文README,不写文件。
|
|
16
|
+
|
|
17
|
+
参数: language为zh或en,默认中文。返回: README的绝对Path。
|
|
18
|
+
异常: 未知语言ValueError;指南缺失FileNotFoundError。只支持普通目录安装。
|
|
19
|
+
"""
|
|
20
|
+
if language not in ("zh", "en"):
|
|
21
|
+
raise ValueError("指南语言应为zh或en")
|
|
22
|
+
package = Path(__file__).resolve().parent
|
|
23
|
+
installed = package / "guide"
|
|
24
|
+
# 已有安装目录时不借源码补齐损坏资源;可编辑/源码布局直接使用人工入口。
|
|
25
|
+
if installed.is_dir():
|
|
26
|
+
root = installed
|
|
27
|
+
else:
|
|
28
|
+
root = package.parent.parent / "Docs/AI"
|
|
29
|
+
if not (root / "inputs.lock.json").is_file():
|
|
30
|
+
raise FileNotFoundError("安装包缺少用户指南,请重新安装同版本的完整wheel")
|
|
31
|
+
entry = root / ("en/README.md" if language == "en" else "README.md")
|
|
32
|
+
if not entry.is_file():
|
|
33
|
+
raise FileNotFoundError("用户指南入口缺失:" + str(entry))
|
|
34
|
+
return entry.resolve()
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def _installed_archive(root):
|
|
38
|
+
"""按发行清单打包,忽略阅读后产生的缓存或结果。
|
|
39
|
+
|
|
40
|
+
参数: root为包内guide目录。返回: 确定性ZIP字节。异常: 清单/资源缺失或越界。
|
|
41
|
+
"""
|
|
42
|
+
manifest = json.loads((root / "manifest.json").read_bytes())
|
|
43
|
+
output = BytesIO()
|
|
44
|
+
with ZipFile(output, "w", compression=ZIP_DEFLATED) as archive:
|
|
45
|
+
for name in sorted({"manifest.json", *manifest["sha256"]}):
|
|
46
|
+
path = (root / name).resolve()
|
|
47
|
+
if not path.is_relative_to(root.resolve()):
|
|
48
|
+
raise ValueError("指南成员路径超出资料目录")
|
|
49
|
+
info = ZipInfo(name, date_time=(1980, 1, 1, 0, 0, 0))
|
|
50
|
+
info.create_system = 3
|
|
51
|
+
info.external_attr = 0o100644 << 16
|
|
52
|
+
archive.writestr(info, path.read_bytes(), compress_type=ZIP_DEFLATED)
|
|
53
|
+
return output.getvalue()
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def export_guide(output):
|
|
57
|
+
"""参数: output为父目录已存在的新ZIP路径。返回: 导出路径。异常: 已有目标、缺资料或I/O失败。"""
|
|
58
|
+
# 仅显式导出读取整套资源;安装目录不维护第二份ZIP副本。
|
|
59
|
+
resource = Path(__file__).resolve().parent / "guide"
|
|
60
|
+
if resource.is_dir():
|
|
61
|
+
data = _installed_archive(resource)
|
|
62
|
+
else:
|
|
63
|
+
builder = Path(__file__).resolve().parents[2] / "tools/build_ai_guide.py"
|
|
64
|
+
if not builder.is_file() or not (builder.parent.parent / "Docs/AI/inputs.lock.json").is_file():
|
|
65
|
+
raise FileNotFoundError("安装包缺少用户指南,请重新安装同版本的完整wheel")
|
|
66
|
+
data = run_path(str(builder))["build"]()
|
|
67
|
+
target = Path(output)
|
|
68
|
+
if any(part.casefold() == "refprojects" for part in (*target.absolute().parts, *target.resolve().parts)):
|
|
69
|
+
raise ValueError("资料输出不能位于RefProjects")
|
|
70
|
+
# 独占创建避免覆盖用户资料;只有自己成功创建且写入失败时才移除残件。
|
|
71
|
+
stream = target.open("xb")
|
|
72
|
+
try:
|
|
73
|
+
with stream:
|
|
74
|
+
stream.write(data)
|
|
75
|
+
except BaseException as error:
|
|
76
|
+
try:
|
|
77
|
+
target.unlink()
|
|
78
|
+
except OSError as cleanup:
|
|
79
|
+
error.add_note("未能清理本次未完成的资料文件:" + str(cleanup))
|
|
80
|
+
raise
|
|
81
|
+
return target
|