mirror of
https://github.com/firestar5683/StarPilot.git
synced 2026-11-08 13:33:42 +08:00
Learning Workers
Process drive evidence and fit bounded steering profiles off the controls loop.
This commit is contained in:
@@ -0,0 +1,61 @@
|
||||
"""Desktop-only FLM diagnostic report from explicitly selected closed rlogs."""
|
||||
|
||||
import argparse
|
||||
from collections.abc import Callable, Sequence
|
||||
from dataclasses import asdict
|
||||
import json
|
||||
from pathlib import Path
|
||||
import sys
|
||||
|
||||
from openpilot.common.hardware import PC
|
||||
from openpilot.starpilot.galaxy.drive_history import SEGMENT_NAME
|
||||
from openpilot.starpilot.flm.local_logs import LocalLogUnavailable, read_closed_rlog
|
||||
from openpilot.starpilot.flm.log_decode import LogDecodeError, decode_segment
|
||||
from openpilot.starpilot.flm.offline import MAX_SEGMENTS, SegmentInput, analyze_segments
|
||||
|
||||
|
||||
def analyze_local(root: Path, names: Sequence[str], *, cancelled: Callable[[], bool] = lambda: False) -> dict:
|
||||
"""Process one bounded segment at a time; never return a partial report."""
|
||||
if not PC:
|
||||
raise ValueError("Use a desktop: device analysis needs a separate parked operation owner")
|
||||
if not 1 <= len(names) <= MAX_SEGMENTS or len(set(names)) != len(names):
|
||||
raise ValueError("Select one to five distinct closed segments")
|
||||
reports = []
|
||||
for name in names:
|
||||
source = read_closed_rlog(root, name, permitted=lambda: not cancelled())
|
||||
match = SEGMENT_NAME.fullmatch(name)
|
||||
assert match is not None
|
||||
events = decode_segment(source.compressed, source.codec, cancelled=cancelled)
|
||||
report = analyze_segments((SegmentInput(match.group("route"), int(match.group("number")), events),), cancelled=cancelled)
|
||||
reports.append({"source": {"segmentName": source.segment_name, "sha256": source.sha256,
|
||||
"compressedBytes": source.size, "codec": source.codec},
|
||||
"analysis": asdict(report.segments[0])})
|
||||
del events, source
|
||||
if cancelled():
|
||||
raise ValueError("Analysis cancelled")
|
||||
return {"schemaVersion": 1, "purpose": "offline_tracking_diagnostics", "segments": reports,
|
||||
"tuneRecommendation": None, "vehicleQualification": False}
|
||||
|
||||
|
||||
def main(argv: Sequence[str] | None = None) -> int:
|
||||
parser = argparse.ArgumentParser(description=__doc__)
|
||||
parser.add_argument("--log-root", required=True, type=Path, help="Absolute local recording directory; no remote routes")
|
||||
parser.add_argument("--output", type=Path, help="Create a new JSON report file; never overwrite an existing file")
|
||||
parser.add_argument("segments", nargs="+", help="Closed segment directory names under --log-root (at most five)")
|
||||
args = parser.parse_args(argv)
|
||||
try:
|
||||
result = analyze_local(args.log_root, args.segments)
|
||||
payload = json.dumps(result, allow_nan=False, indent=2)
|
||||
if args.output is not None:
|
||||
with args.output.open("x", encoding="utf-8") as destination:
|
||||
destination.write(payload + "\n")
|
||||
else:
|
||||
print(payload)
|
||||
except (LocalLogUnavailable, LogDecodeError, OSError, ValueError, RuntimeError) as error:
|
||||
print(f"FLM analysis unavailable: {error}", file=sys.stderr)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
raise SystemExit(main())
|
||||
@@ -0,0 +1,112 @@
|
||||
"""Admit one immutable, closed local rlog for offline analysis; never download."""
|
||||
|
||||
from collections.abc import Callable
|
||||
from dataclasses import dataclass, field
|
||||
import hashlib
|
||||
import os
|
||||
from pathlib import Path
|
||||
import stat
|
||||
|
||||
from openpilot.starpilot.galaxy.drive_history import MAX_SEGMENT_ENTRIES, SEGMENT_NAME
|
||||
|
||||
|
||||
MAX_COMPRESSED_BYTES = 32 * 1024 * 1024
|
||||
DIR_FLAGS = os.O_RDONLY | os.O_DIRECTORY | os.O_NOFOLLOW | os.O_NONBLOCK
|
||||
FILE_FLAGS = os.O_RDONLY | os.O_NOFOLLOW | os.O_NONBLOCK
|
||||
RLOGS = {"rlog.zst": "zst", "rlog.bz2": "bz2"}
|
||||
|
||||
|
||||
class LocalLogUnavailable(Exception):
|
||||
pass
|
||||
|
||||
|
||||
@dataclass(frozen=True)
|
||||
class ClosedLog:
|
||||
segment_name: str
|
||||
codec: str
|
||||
compressed: bytes = field(repr=False)
|
||||
sha256: str
|
||||
size: int
|
||||
|
||||
|
||||
def _identity(info: os.stat_result) -> tuple[int, int]:
|
||||
return info.st_dev, info.st_ino
|
||||
|
||||
|
||||
def _revision(info: os.stat_result) -> tuple[int, ...]:
|
||||
return (*_identity(info), info.st_size, info.st_mtime_ns, info.st_ctime_ns)
|
||||
|
||||
|
||||
def _allowed(permitted: Callable[[], bool]) -> None:
|
||||
if not permitted():
|
||||
raise LocalLogUnavailable("Analysis is no longer allowed")
|
||||
|
||||
|
||||
def _closed_rlog(fd: int) -> str:
|
||||
found = []
|
||||
with os.scandir(fd) as entries:
|
||||
for count, entry in enumerate(entries, 1):
|
||||
if count > MAX_SEGMENT_ENTRIES or entry.name.endswith(".lock"):
|
||||
raise LocalLogUnavailable("Segment is open or unavailable")
|
||||
if entry.name in RLOGS:
|
||||
found.append(entry.name)
|
||||
if len(found) != 1:
|
||||
raise LocalLogUnavailable("Select a segment with exactly one closed full rlog")
|
||||
return found[0]
|
||||
|
||||
|
||||
def read_closed_rlog(root: Path, segment_name: str, *, permitted: Callable[[], bool]) -> ClosedLog:
|
||||
"""Revalidate an inventory choice, then bind its receipt to the bytes read.
|
||||
|
||||
The inventory is not authority: locks, file type, bounds and inode revisions
|
||||
are checked again at admission and after the complete read. The supplied
|
||||
root is the locally configured recording directory, never an HTTP input.
|
||||
No decoded events or successful receipt escape a partial/cancelled read.
|
||||
"""
|
||||
matched = SEGMENT_NAME.fullmatch(segment_name) if type(segment_name) is str and len(segment_name) <= 180 else None
|
||||
if matched is None or len(matched.group("number")) > 6 or not root.is_absolute() or ".." in root.parts:
|
||||
raise LocalLogUnavailable("Invalid local segment selection")
|
||||
fds = []
|
||||
try:
|
||||
_allowed(permitted)
|
||||
root_fd = os.open(root, DIR_FLAGS)
|
||||
fds.append(root_fd)
|
||||
root_info = os.fstat(root_fd)
|
||||
segment_fd = os.open(segment_name, DIR_FLAGS, dir_fd=root_fd)
|
||||
fds.append(segment_fd)
|
||||
segment_info = os.fstat(segment_fd)
|
||||
filename = _closed_rlog(segment_fd)
|
||||
source_fd = os.open(filename, FILE_FLAGS, dir_fd=segment_fd)
|
||||
fds.append(source_fd)
|
||||
before = os.fstat(source_fd)
|
||||
if not stat.S_ISREG(before.st_mode) or not 0 < before.st_size <= MAX_COMPRESSED_BYTES:
|
||||
raise LocalLogUnavailable("Full rlog is empty, oversized or not a regular file")
|
||||
chunks = []
|
||||
remaining = before.st_size
|
||||
while remaining:
|
||||
_allowed(permitted)
|
||||
chunk = os.read(source_fd, min(1024 * 1024, remaining))
|
||||
if not chunk:
|
||||
raise LocalLogUnavailable("Full rlog changed while reading")
|
||||
chunks.append(chunk)
|
||||
remaining -= len(chunk)
|
||||
if os.read(source_fd, 1):
|
||||
raise LocalLogUnavailable("Full rlog grew while reading")
|
||||
_allowed(permitted)
|
||||
after = os.fstat(source_fd)
|
||||
current = os.stat(filename, dir_fd=segment_fd, follow_symlinks=False)
|
||||
segment_now = os.stat(segment_name, dir_fd=root_fd, follow_symlinks=False)
|
||||
root_now = os.stat(root, follow_symlinks=False)
|
||||
if (_revision(before) != _revision(after) or _revision(after) != _revision(current) or
|
||||
not stat.S_ISREG(current.st_mode) or not stat.S_ISDIR(segment_now.st_mode) or
|
||||
not stat.S_ISDIR(root_now.st_mode) or _identity(segment_now) != _identity(segment_info) or
|
||||
_identity(root_now) != _identity(root_info) or _closed_rlog(segment_fd) != filename):
|
||||
raise LocalLogUnavailable("Local recording identity changed")
|
||||
raw = b"".join(chunks)
|
||||
_allowed(permitted)
|
||||
return ClosedLog(segment_name, RLOGS[filename], raw, hashlib.sha256(raw).hexdigest(), len(raw))
|
||||
except (OSError, ValueError) as error:
|
||||
raise LocalLogUnavailable("Local recording is unavailable") from error
|
||||
finally:
|
||||
for fd in reversed(fds):
|
||||
os.close(fd)
|
||||
@@ -0,0 +1,556 @@
|
||||
"""One parked, read-only FLM operation with an isolated local-log worker."""
|
||||
|
||||
from collections.abc import Callable, Sequence
|
||||
from contextlib import contextmanager
|
||||
import json
|
||||
import logging
|
||||
import os
|
||||
from pathlib import Path
|
||||
import selectors
|
||||
import subprocess
|
||||
import sys
|
||||
import threading
|
||||
import time
|
||||
import uuid
|
||||
|
||||
from openpilot.common.hardware.hw import Paths
|
||||
from openpilot.starpilot.galaxy.drive_history import SEGMENT_NAME
|
||||
|
||||
|
||||
MAX_REPORT_BYTES = 1024 * 1024
|
||||
MAX_PIPE_BYTES = MAX_REPORT_BYTES + 4096
|
||||
WALL_DEADLINE_SECONDS = 5 * 60
|
||||
POLL_SECONDS = 0.05
|
||||
ACTIVE_STATE = 'running'
|
||||
ERROR_CODES = frozenset(('invalid_request', 'busy', 'not_parked', 'operation_changed', 'unavailable',
|
||||
'canceled', 'process_failed', 'deadline', 'recording_unavailable', 'decode_failed', 'resource_limit'))
|
||||
|
||||
|
||||
class FlmOperationError(RuntimeError):
|
||||
def __init__(self, code: str):
|
||||
self.code = code if code in ERROR_CODES else 'unavailable'
|
||||
super().__init__(self.code)
|
||||
|
||||
|
||||
def _stop_child(child: subprocess.Popen) -> None:
|
||||
if child.poll() is not None:
|
||||
child.wait()
|
||||
return
|
||||
try:
|
||||
child.terminate()
|
||||
except ProcessLookupError:
|
||||
pass
|
||||
try:
|
||||
child.wait(timeout=0.5)
|
||||
except subprocess.TimeoutExpired:
|
||||
try:
|
||||
child.kill()
|
||||
except ProcessLookupError:
|
||||
pass
|
||||
try:
|
||||
child.wait(timeout=0.5)
|
||||
except subprocess.TimeoutExpired as error:
|
||||
raise FlmOperationError('unavailable') from error
|
||||
|
||||
|
||||
class FlmAnalysisOwner:
|
||||
"""Parent alone owns fresh parked authority, operation identity and report visibility."""
|
||||
|
||||
def __init__(self, *, parked: Callable[[], bool], root: Path | None = None,
|
||||
worker_argv: Sequence[str] | None = None, completed: Callable[[dict], bool] | None = None):
|
||||
self.root = Path(Paths.log_root()) if root is None else root
|
||||
self._parked = parked
|
||||
self._completed = completed
|
||||
self._worker_argv = tuple(worker_argv) if worker_argv is not None else (
|
||||
sys.executable, '-m', 'openpilot.starpilot.flm.operation_worker')
|
||||
self._lock = threading.RLock()
|
||||
self._session = uuid.uuid4().hex
|
||||
self._sequence = 0
|
||||
self._closed = False
|
||||
self._cancel = threading.Event()
|
||||
self._child: subprocess.Popen | None = None
|
||||
self._monitor_thread: threading.Thread | None = None
|
||||
self._report: dict | None = None
|
||||
self._status = self._fresh_status('idle', None, 0)
|
||||
|
||||
@staticmethod
|
||||
def _fresh_status(state: str, operation_id: str | None, selected: int, processed: int = 0,
|
||||
error_code: str | None = None) -> dict:
|
||||
return {'version': 1, 'operationId': operation_id, 'state': state, 'selected': selected,
|
||||
'processed': processed, 'errorCode': error_code}
|
||||
|
||||
def _allowed(self) -> bool:
|
||||
try:
|
||||
return self._parked() is True
|
||||
except Exception:
|
||||
return False
|
||||
|
||||
def _revoke_if_unparked(self) -> None:
|
||||
if self._allowed():
|
||||
return
|
||||
with self._lock:
|
||||
if self._status['state'] != 'idle':
|
||||
self._status = self._fresh_status('unavailable', self._status['operationId'],
|
||||
self._status['selected'], self._status['processed'], 'not_parked')
|
||||
self._report = None
|
||||
self._cancel.set()
|
||||
|
||||
def snapshot(self) -> dict:
|
||||
self._revoke_if_unparked()
|
||||
with self._lock:
|
||||
return dict(self._status)
|
||||
|
||||
def start(self, segment_names: Sequence[str], *, gm_context: dict | None = None) -> dict:
|
||||
if (type(segment_names) not in (tuple, list) or not 1 <= len(segment_names) <= 5 or
|
||||
any(type(name) is not str or len(name) > 180 or SEGMENT_NAME.fullmatch(name) is None
|
||||
for name in segment_names) or len(set(segment_names)) != len(segment_names)):
|
||||
raise FlmOperationError('invalid_request')
|
||||
if gm_context is not None:
|
||||
from openpilot.starpilot.flm.gm_recommend import validate_context
|
||||
gm_context = json.loads(json.dumps(validate_context(gm_context), allow_nan=False))
|
||||
if not self._allowed():
|
||||
raise FlmOperationError('not_parked')
|
||||
with self._lock:
|
||||
if self._closed:
|
||||
raise FlmOperationError('unavailable')
|
||||
if self._status['state'] == ACTIVE_STATE or self._child is not None or \
|
||||
(self._monitor_thread is not None and self._monitor_thread.is_alive()):
|
||||
raise FlmOperationError('busy')
|
||||
self._sequence += 1
|
||||
token = f'{self._session}:{self._sequence}'
|
||||
self._cancel = threading.Event()
|
||||
self._report = None
|
||||
self._status = self._fresh_status(ACTIVE_STATE, token, len(segment_names))
|
||||
request_value = {'root': str(self.root), 'segments': list(segment_names), 'parentPid': os.getpid()}
|
||||
if gm_context is not None:
|
||||
request_value['gmContext'] = gm_context
|
||||
request = json.dumps(request_value, sort_keys=True, allow_nan=False, separators=(',', ':')).encode()
|
||||
if len(request) > (32768 if gm_context is not None else 2048):
|
||||
self._status = self._fresh_status('failed', token, len(segment_names), error_code='invalid_request')
|
||||
raise FlmOperationError('invalid_request')
|
||||
# The monitor must create the child: Linux PR_SET_PDEATHSIG follows the
|
||||
# creating thread, and an HTTP request thread ends after this response.
|
||||
self._monitor_thread = threading.Thread(target=self._monitor, args=(token, self._cancel,
|
||||
tuple(segment_names), request, gm_context), daemon=True)
|
||||
try:
|
||||
self._monitor_thread.start()
|
||||
except RuntimeError as error:
|
||||
self._monitor_thread = None
|
||||
self._status = self._fresh_status('failed', token, len(segment_names), error_code='unavailable')
|
||||
raise FlmOperationError('unavailable') from error
|
||||
self._revoke_if_unparked()
|
||||
return self.snapshot()
|
||||
|
||||
def _monitor(self, token: str, canceled: threading.Event, names: tuple[str, ...], request: bytes,
|
||||
gm_context: dict | None = None) -> None:
|
||||
result: dict | None = None
|
||||
error: str | None = 'process_failed'
|
||||
child: subprocess.Popen | None = None
|
||||
reaped = False
|
||||
try:
|
||||
if canceled.is_set():
|
||||
error = 'canceled'
|
||||
return
|
||||
if not self._allowed():
|
||||
error = 'not_parked'
|
||||
return
|
||||
child = subprocess.Popen(self._worker_argv, stdin=subprocess.PIPE, stdout=subprocess.PIPE,
|
||||
stderr=subprocess.DEVNULL, bufsize=0, close_fds=True)
|
||||
with self._lock:
|
||||
if self._status['operationId'] == token:
|
||||
self._child = child
|
||||
if child.stdin is None:
|
||||
raise OSError('worker input unavailable')
|
||||
child.stdin.write(request)
|
||||
child.stdin.close()
|
||||
result, error = self._read_worker(token, child, canceled, names)
|
||||
if error is None:
|
||||
if result is None:
|
||||
raise ValueError('missing report')
|
||||
sources = result['segments']
|
||||
if (result.get('schemaVersion') != 1 or
|
||||
result.get('purpose') != ('offline_tracking_diagnostics' if gm_context is None else 'gm_flm_evidence_profiles') or
|
||||
result.get('tuneRecommendation', 1) is not None or result.get('vehicleQualification') is not False or
|
||||
type(sources) is not list or [row['source']['segmentName'] for row in sources] != list(names)):
|
||||
raise ValueError('report shape')
|
||||
if gm_context is not None:
|
||||
from openpilot.starpilot.flm.gm_recommend import validate_context
|
||||
evidence = result.get('gmEvidence')
|
||||
if (type(evidence) is not dict or validate_context(evidence['context']) != gm_context or
|
||||
evidence.get('fit') is not False or evidence.get('vehicleQualification') is not False):
|
||||
raise ValueError('GM report source')
|
||||
result = {**result, 'operationId': token}
|
||||
if len(json.dumps(result, allow_nan=False).encode()) > MAX_REPORT_BYTES:
|
||||
raise ValueError('report limit')
|
||||
except Exception:
|
||||
logging.exception('FLM operation failed')
|
||||
error = 'process_failed'
|
||||
finally:
|
||||
if child is not None:
|
||||
try:
|
||||
_stop_child(child)
|
||||
reaped = True
|
||||
except (OSError, FlmOperationError):
|
||||
error = 'unavailable'
|
||||
for pipe in (child.stdin, child.stdout):
|
||||
if pipe is None:
|
||||
continue
|
||||
try:
|
||||
pipe.close()
|
||||
except OSError:
|
||||
error = 'unavailable'
|
||||
else:
|
||||
reaped = True
|
||||
if not self._allowed():
|
||||
error = 'not_parked'
|
||||
# Completion effects acquire the HTTP effect guard before this owner's
|
||||
# lock. Never invoke a callback while holding the owner lock.
|
||||
if error is None and result is not None and not canceled.is_set() and reaped and gm_context is not None and self._completed is not None:
|
||||
try:
|
||||
result['gmEvidence']['progressRecorded'] = self._completed(result) is True
|
||||
except Exception:
|
||||
logging.exception('FLM cleanup progress was not recorded')
|
||||
result['gmEvidence']['progressRecorded'] = False
|
||||
with self._lock:
|
||||
if self._status['operationId'] == token:
|
||||
if self._closed or self._status['state'] == 'unavailable' or not self._allowed():
|
||||
error = 'not_parked' if not self._closed else 'unavailable'
|
||||
if error is None and not canceled.is_set() and reaped:
|
||||
self._report = result
|
||||
self._status = self._fresh_status('completed', token, len(names), len(names))
|
||||
else:
|
||||
code = 'unavailable' if self._closed else \
|
||||
'canceled' if canceled.is_set() and error != 'not_parked' else error or 'canceled'
|
||||
unavailable = code in ('not_parked', 'unavailable', 'recording_unavailable', 'decode_failed', 'resource_limit')
|
||||
state = 'canceled' if code == 'canceled' else 'unavailable' if unavailable else 'failed'
|
||||
self._status = self._fresh_status(state, token, len(names), self._status['processed'], code)
|
||||
self._report = None
|
||||
if child is not None and self._child is child and reaped:
|
||||
self._child = None
|
||||
|
||||
def _read_worker(self, token: str, child: subprocess.Popen, canceled: threading.Event,
|
||||
names: tuple[str, ...]) -> tuple[dict | None, str | None]:
|
||||
if child.stdout is None:
|
||||
return None, 'process_failed'
|
||||
deadline = time.monotonic() + WALL_DEADLINE_SECONDS
|
||||
buffer = bytearray()
|
||||
consumed = 0
|
||||
result = None
|
||||
error = None
|
||||
with selectors.DefaultSelector() as selector:
|
||||
selector.register(child.stdout, selectors.EVENT_READ)
|
||||
while error is None:
|
||||
if canceled.is_set():
|
||||
return None, 'canceled'
|
||||
if not self._allowed():
|
||||
return None, 'not_parked'
|
||||
if time.monotonic() >= deadline:
|
||||
return None, 'deadline'
|
||||
if not selector.select(POLL_SECONDS):
|
||||
continue
|
||||
chunk = os.read(child.stdout.fileno(), 64 * 1024)
|
||||
if not chunk:
|
||||
break # Pipe EOF; wait only a bounded time for the child to exit.
|
||||
consumed += len(chunk)
|
||||
if consumed > MAX_PIPE_BYTES:
|
||||
return None, 'process_failed'
|
||||
buffer.extend(chunk)
|
||||
while b'\n' in buffer:
|
||||
line, _, remainder = buffer.partition(b'\n')
|
||||
buffer = bytearray(remainder)
|
||||
message = json.loads(line)
|
||||
if type(message) is not dict:
|
||||
return None, 'process_failed'
|
||||
if message.get('kind') == 'progress' and type(message.get('processed')) is int and \
|
||||
0 < message['processed'] <= len(names):
|
||||
with self._lock:
|
||||
if self._status['operationId'] == token and self._status['state'] == ACTIVE_STATE:
|
||||
self._status['processed'] = max(self._status['processed'], message['processed'])
|
||||
elif message.get('kind') == 'result' and type(message.get('report')) is dict:
|
||||
result = message['report']
|
||||
elif message.get('kind') == 'error' and message.get('code') in (
|
||||
'unavailable', 'process_failed', 'recording_unavailable', 'decode_failed', 'resource_limit',
|
||||
):
|
||||
error = message['code']
|
||||
else:
|
||||
return None, 'process_failed'
|
||||
if error is not None:
|
||||
break
|
||||
if error is not None:
|
||||
return None, error
|
||||
if buffer or child.wait(timeout=0.5) != 0 or result is None:
|
||||
return None, 'process_failed'
|
||||
return result, None
|
||||
|
||||
def report(self, operation_id: str) -> dict:
|
||||
self._revoke_if_unparked()
|
||||
with self._lock:
|
||||
if self._closed:
|
||||
raise FlmOperationError('unavailable')
|
||||
if self._status['operationId'] != operation_id:
|
||||
raise FlmOperationError('operation_changed')
|
||||
if self._status['state'] != 'completed' or self._report is None:
|
||||
raise FlmOperationError(self._status['errorCode'] or 'unavailable')
|
||||
return json.loads(json.dumps(self._report, allow_nan=False))
|
||||
|
||||
@contextmanager
|
||||
def completion_guard(self, operation_id: str):
|
||||
# Called only after the shared HTTP effect guard, and retained through the
|
||||
# optional metadata commit so cancel/close cannot retire this operation
|
||||
# between its final authority check and document replacement.
|
||||
with self._lock:
|
||||
yield (self._status['operationId'] == operation_id and self._status['state'] == ACTIVE_STATE and
|
||||
not self._closed and not self._cancel.is_set() and self._allowed())
|
||||
|
||||
def cancel(self, operation_id: str) -> dict:
|
||||
self._revoke_if_unparked()
|
||||
with self._lock:
|
||||
if self._status['operationId'] != operation_id:
|
||||
raise FlmOperationError('operation_changed')
|
||||
if self._status['state'] != ACTIVE_STATE:
|
||||
return dict(self._status)
|
||||
self._cancel.set()
|
||||
thread = self._monitor_thread
|
||||
if thread is not None:
|
||||
thread.join(timeout=1.5)
|
||||
if thread.is_alive():
|
||||
with self._lock:
|
||||
child = self._child
|
||||
if child is not None:
|
||||
_stop_child(child)
|
||||
thread.join(timeout=0.5)
|
||||
return self.snapshot()
|
||||
|
||||
def close(self) -> None:
|
||||
with self._lock:
|
||||
self._closed = True
|
||||
self._cancel.set()
|
||||
thread = self._monitor_thread
|
||||
if thread is not None:
|
||||
thread.join(timeout=1.5)
|
||||
with self._lock:
|
||||
child = self._child
|
||||
if child is not None:
|
||||
_stop_child(child)
|
||||
with self._lock:
|
||||
self._report = None
|
||||
if self._status['state'] != 'idle':
|
||||
self._status = self._fresh_status('unavailable', self._status['operationId'],
|
||||
self._status['selected'], self._status['processed'], 'unavailable')
|
||||
|
||||
class FlmTrialOwner:
|
||||
"""Existing FLM namespace's parked exact-source atomic surface editor."""
|
||||
def __init__(self, params, context):
|
||||
self.params, self.context = params, context
|
||||
|
||||
def _sources(self):
|
||||
import hashlib
|
||||
from openpilot.starpilot.flm.live import gm_capability
|
||||
from openpilot.starpilot.lateral.controller_selection import DOCUMENT_KEY as SELECTION_KEY, selection_from_bytes
|
||||
from openpilot.starpilot.lateral.torque_settings import DOCUMENT_KEY, MAX_DOCUMENT_BYTES, parse_document
|
||||
from openpilot.starpilot.saved_source import read_saved
|
||||
ctx = self.context.sample()
|
||||
raw, readable = read_saved(self.params, DOCUMENT_KEY, MAX_DOCUMENT_BYTES)
|
||||
selection_raw, selection_readable = read_saved(self.params, SELECTION_KEY, 4096)
|
||||
selection = None if ctx.cp is None or not selection_readable else selection_from_bytes(ctx.cp, selection_raw)
|
||||
cap = (None if selection is None or selection.source == 'invalid' else gm_capability(ctx.cp, selection.mode))
|
||||
if not readable or cap is None or ctx.cp_raw is None:
|
||||
raise FlmOperationError('unavailable')
|
||||
try:
|
||||
profiles = {} if raw is None else parse_document(raw)
|
||||
except (ValueError, TypeError, UnicodeError, OverflowError):
|
||||
raise FlmOperationError('unavailable') from None
|
||||
guards = []
|
||||
for key, limit in (('AdvancedLateralTune', 64), ('ForceAutoTuneOff', 1)):
|
||||
value, valid = read_saved(self.params, key, limit)
|
||||
guards.append((key, valid, None if value is None else value.hex()))
|
||||
token = hashlib.sha256(
|
||||
json.dumps(cap,sort_keys=True).encode()+b'\0'+ctx.cp_raw+b'\0'+(raw or b'')+
|
||||
b'\0'+(selection_raw or b'')+b'\0'+json.dumps(guards).encode()).hexdigest()
|
||||
return ctx, raw, selection_raw, cap, profiles, token
|
||||
|
||||
def snapshot(self):
|
||||
from opendbc.car.lateral import FRICTION_THRESHOLD
|
||||
from openpilot.starpilot.flm.live import binding_matches
|
||||
from openpilot.starpilot.flm.torque_surface import GmFlmBinding, GmSurface, _GM_BOUNDS, _GM_RICH_BOUNDS
|
||||
try:
|
||||
ctx, _, _, cap, profiles, token = self._sources()
|
||||
except FlmOperationError:
|
||||
return {'version': 1, 'available': False, 'editable': False}
|
||||
profile = profiles.get(cap['fingerprint'])
|
||||
state = GmFlmBinding(cap['controller'],cap['policy'],cap['basis']) if profile is None or profile.flm is None else profile.flm
|
||||
matched = profile is None or (profile.basis == cap['basis'] and
|
||||
(profile.flm is None or binding_matches(profile,cap)))
|
||||
from openpilot.starpilot.flm.manual_trial import manual_snapshot, manual_profile, manual_preconditions
|
||||
from openpilot.starpilot.lateral.torque_settings import PlatformProfile, FieldChoice
|
||||
current = profile or PlatformProfile(cap['basis'], FieldChoice(), FieldChoice())
|
||||
current_manual = manual_snapshot(current, cap['fingerprint'])
|
||||
manual_conflict = state.applied_manual is not None and current_manual != state.applied_manual
|
||||
preconditions = {}
|
||||
for key, raw in state.manual:
|
||||
try:
|
||||
preconditions[key] = manual_preconditions(self.params, ctx.cp, cap['controller'],
|
||||
manual_profile(raw, cap['fingerprint'], cap['basis']))
|
||||
except ValueError:
|
||||
preconditions[key] = ['The saved manual controller or geometry basis changed. Review those choices in settings and save again.']
|
||||
limits = dict(_GM_BOUNDS)
|
||||
limits.update(_GM_RICH_BOUNDS if cap['profile'] == 'gm_bolt_2022_2023' else {'ff_gain_left':(-.4,.6),'ff_gain_right':(-.4,.6)})
|
||||
return {'version': 1, 'available': matched, 'editable': bool(ctx.parked and matched),
|
||||
'reason': None if matched else ('The selected controller or vehicle basis changed. Reset this surface binding to retain ' +
|
||||
'manual choices and edit the current controller.'),
|
||||
'manualConflict': manual_conflict, 'manual': current_manual, 'preconditions': preconditions,
|
||||
'resettable': bool(ctx.parked and profile is not None and profile.flm is not None), 'token': token,
|
||||
'vehicle': cap['fingerprint'], 'controller': cap['controller'], 'profile': cap['profile'],
|
||||
'curveDefaults': [FRICTION_THRESHOLD if cap['controller'] == 'standard' else GmSurface(cap['profile'],{}).base_threshold(speed)
|
||||
for speed in (0.,5.,10.,15.,25.)],
|
||||
'inactiveKnobs': {'low_speed_angle_assist_max_torque': ('The selected custom Bolt output law excludes universal angle assist. STANDARD consumes ' +
|
||||
'this choice.')}
|
||||
if cap['controller'] == 'starpilot' and cap['policy'] == 'bolt' else {},
|
||||
'state': state.document(), 'defaults': GmSurface(cap['profile'],{}).document(),
|
||||
'knobs': {key:{'min':low,'max':high} for key,(low,high) in limits.items()}}
|
||||
|
||||
def action(self, payload, *, session_valid=lambda: True, generated_manual=None):
|
||||
from dataclasses import replace
|
||||
import re
|
||||
import secrets
|
||||
from openpilot.starpilot.flm.live import binding_matches
|
||||
from openpilot.starpilot.flm.torque_surface import GmFlmBinding, GmSurface
|
||||
from openpilot.starpilot.lateral.torque_settings import DOCUMENT_KEY, MAX_DOCUMENT_BYTES, PlatformProfile, FieldChoice, serialize_document
|
||||
from openpilot.starpilot.saved_document import commit_exact
|
||||
if type(payload) is not dict or payload.get('action') not in ('save','delete','trial','apply','restore','accept','disable','reset','record-progress'):
|
||||
raise ValueError('Invalid GM FLM action')
|
||||
action=payload['action']
|
||||
if generated_manual is not None and action != 'save':
|
||||
raise ValueError('Wrong generated manual action')
|
||||
expected_fields={'action','token'} | (
|
||||
{'id','label','surface'} if action=='save' else {'id'} if action in ('delete','trial','apply')
|
||||
else {'trial'} if action in ('restore','accept') else set())
|
||||
if set(payload)!=expected_fields or type(payload['token']) is not str or re.fullmatch(r'[a-f0-9]{64}',payload['token']) is None:
|
||||
raise ValueError('Invalid GM FLM source')
|
||||
ctx, raw, selection_raw, cap, profiles, token = self._sources()
|
||||
if not ctx.parked or not session_valid():
|
||||
raise FlmOperationError('not_parked')
|
||||
if payload['token']!=token:
|
||||
raise FlmOperationError('operation_changed')
|
||||
profile=profiles.get(cap['fingerprint'],PlatformProfile(cap['basis'],FieldChoice(),FieldChoice()))
|
||||
if action != 'reset' and (profile.basis != cap['basis'] or
|
||||
profile.flm is not None and not binding_matches(profile,cap)):
|
||||
raise FlmOperationError('operation_changed')
|
||||
state=profile.flm or GmFlmBinding(cap['controller'],cap['policy'],cap['basis'])
|
||||
saved={key:(label,surface) for key,label,surface in state.saved}
|
||||
manual = dict(state.manual)
|
||||
from openpilot.starpilot.flm.manual_trial import manual_snapshot, manual_profile, manual_preconditions
|
||||
current_manual = manual_snapshot(profile, cap['fingerprint'])
|
||||
key=payload.get('id')
|
||||
if action in ('save','delete','trial','apply') and (type(key) is not str or re.fullmatch(r'[a-zA-Z0-9_-]{1,48}',key) is None):
|
||||
raise ValueError('Invalid saved surface identity')
|
||||
if action=='save':
|
||||
if state.trial is not None and key in (state.active,state.baseline_active):
|
||||
raise FlmOperationError('busy')
|
||||
surface=GmSurface.from_document(payload['surface'])
|
||||
if surface.profile!=cap['profile']:
|
||||
raise ValueError('Surface does not match selected controller')
|
||||
saved[key]=(payload['label'],surface)
|
||||
captured = current_manual if generated_manual is None else generated_manual
|
||||
manual_profile(captured, cap['fingerprint'], cap['basis'])
|
||||
manual[key] = captured
|
||||
state=replace(state,saved=tuple((name,label,surface) for name,(label,surface) in saved.items()), manual=tuple(manual.items()))
|
||||
elif action=='delete':
|
||||
if key in (state.active,state.baseline_active):
|
||||
raise FlmOperationError('busy')
|
||||
if key not in saved:
|
||||
raise ValueError('Unknown saved surface')
|
||||
del saved[key]
|
||||
manual.pop(key, None)
|
||||
state=replace(state,saved=tuple((name,label,surface) for name,(label,surface) in saved.items()), manual=tuple(manual.items()))
|
||||
elif action in ('trial','apply'):
|
||||
if key not in saved:
|
||||
raise ValueError('Unknown saved surface')
|
||||
if state.applied_manual is not None and current_manual != state.applied_manual:
|
||||
raise FlmOperationError('operation_changed')
|
||||
target_manual = manual.get(key, state.baseline_manual or current_manual)
|
||||
target = manual_profile(target_manual, cap['fingerprint'], cap['basis'])
|
||||
if manual_preconditions(self.params, ctx.cp, cap['controller'], target):
|
||||
raise FlmOperationError('unavailable')
|
||||
# Every switch starts from the original owned manual baseline; the saved
|
||||
# full canonical snapshot explicitly includes source/default choices.
|
||||
baseline_manual = state.baseline_manual if state.trial else current_manual
|
||||
old_flm = profile.flm
|
||||
profile = replace(target, flm=old_flm)
|
||||
state=replace(state,active=key,applied=True,trial=state.trial or secrets.token_hex(16),
|
||||
baseline_active=state.baseline_active if state.trial else state.active,
|
||||
baseline_applied=state.baseline_applied if state.trial else state.applied,
|
||||
baseline_manual=baseline_manual, applied_manual=manual_snapshot(profile,cap['fingerprint']))
|
||||
elif action in ('restore','accept'):
|
||||
if state.trial is None or payload['trial']!=state.trial:
|
||||
raise FlmOperationError('operation_changed')
|
||||
if action == 'restore' and state.baseline_manual is not None:
|
||||
if current_manual != state.applied_manual:
|
||||
# A later explicit manual edit is never silently overwritten. Keep
|
||||
# as baseline resolves this conflict without rewriting preferences.
|
||||
raise FlmOperationError('operation_changed')
|
||||
profile = replace(manual_profile(state.baseline_manual, cap['fingerprint'], cap['basis']), flm=profile.flm)
|
||||
state=replace(state,active=state.baseline_active if action=='restore' else state.active,
|
||||
applied=state.baseline_applied if action=='restore' else state.applied,
|
||||
trial=None,baseline_active=None,baseline_applied=False,baseline_manual=None,applied_manual=None)
|
||||
elif action=='record-progress':
|
||||
state=replace(state, cleanup_progress=True)
|
||||
elif action=='disable':
|
||||
state=replace(state,active=None,applied=False,trial=None,baseline_active=None,baseline_applied=False,baseline_manual=None,applied_manual=None)
|
||||
# One atomic canonical document commit owns only this selected vehicle
|
||||
# manual+surface trial; other vehicle preferences are retained unchanged.
|
||||
profiles[cap['fingerprint']]=replace(profile,flm=None if action=='reset' else state)
|
||||
encoded=serialize_document(profiles)
|
||||
def authorized():
|
||||
try:
|
||||
fresh, fresh_raw, fresh_selection, fresh_cap, _, fresh_token=self._sources()
|
||||
return (session_valid() and fresh.parked and fresh.cp_raw==ctx.cp_raw and fresh_raw==raw and
|
||||
fresh_selection==selection_raw and fresh_cap==cap and fresh_token==token)
|
||||
except FlmOperationError:
|
||||
return False
|
||||
result=commit_exact(self.params,key=DOCUMENT_KEY,max_bytes=MAX_DOCUMENT_BYTES,raw=encoded,expected=raw,
|
||||
authorized=authorized,temp_prefix='.flm-')
|
||||
if not result.committed or not result.verified:
|
||||
raise FlmOperationError('operation_changed')
|
||||
return self.snapshot()
|
||||
|
||||
|
||||
def training_context(self, token):
|
||||
from openpilot.starpilot.flm.gm_recommend import source_context
|
||||
from openpilot.starpilot.lateral.torque_settings import PlatformProfile, FieldChoice
|
||||
ctx, _, _, cap, profiles, current = self._sources()
|
||||
if not ctx.parked:
|
||||
raise FlmOperationError('not_parked')
|
||||
if token != current:
|
||||
raise FlmOperationError('operation_changed')
|
||||
profile = profiles.get(cap['fingerprint'], PlatformProfile(cap['basis'], FieldChoice(), FieldChoice()))
|
||||
return source_context(ctx.cp, cap['controller'], self.params, current, profile)
|
||||
|
||||
def save_generated(self, report, generated_id, key, label, token, *, session_valid=lambda: True):
|
||||
context = self.training_context(token)
|
||||
from openpilot.starpilot.flm.gm_recommend import same_numerical_context
|
||||
if not same_numerical_context(context, report['context']):
|
||||
raise FlmOperationError('operation_changed')
|
||||
matches = [profile for path in report['paths'] for profile in path['profiles'] if profile['id'] == generated_id]
|
||||
if len(matches) != 1 or matches[0].get('canonical') is None:
|
||||
raise ValueError('Unavailable generated trial')
|
||||
selected = matches[0]['canonical']
|
||||
return self.action({'action': 'save', 'token': token, 'id': key, 'label': label, 'surface': selected['surface']},
|
||||
generated_manual=selected['manual'], session_valid=session_valid)
|
||||
|
||||
|
||||
def record_cleanup(self, report, *, session_valid=lambda: False):
|
||||
evidence = report.get('gmEvidence')
|
||||
if evidence is None or evidence['decision']['primaryPathKey'] != 'cleanup_pass' or evidence['stats']['sampleCount'] <= 0:
|
||||
return False
|
||||
try:
|
||||
source = evidence['context']
|
||||
# This callback belongs only to an explicit Generate GM Trials operation.
|
||||
# It records original cleanup progression, never applies a tune or writes
|
||||
# any global flag. Changed source/unparked authority simply declines it.
|
||||
if self.training_context(source['sourceToken']) != source:
|
||||
return False
|
||||
self.action({'action': 'record-progress', 'token': source['sourceToken']}, session_valid=session_valid)
|
||||
return True
|
||||
except (ValueError, FlmOperationError):
|
||||
return False
|
||||
@@ -0,0 +1,131 @@
|
||||
"""Isolated, bounded local FLM analysis worker; never started by the desktop CLI."""
|
||||
|
||||
from dataclasses import asdict
|
||||
import ctypes
|
||||
import json
|
||||
import logging
|
||||
import os
|
||||
from pathlib import Path
|
||||
import resource
|
||||
import signal
|
||||
import sys
|
||||
import threading
|
||||
import time
|
||||
|
||||
from openpilot.starpilot.flm.local_logs import LocalLogUnavailable, read_closed_rlog
|
||||
from openpilot.starpilot.flm.log_decode import LogDecodeError, decode_segment
|
||||
from openpilot.starpilot.flm.offline import SegmentInput, analyze_segments
|
||||
from openpilot.starpilot.galaxy.drive_history import SEGMENT_NAME
|
||||
|
||||
|
||||
MAX_REQUEST_BYTES = 32768
|
||||
MAX_REPORT_BYTES = 1024 * 1024
|
||||
LINUX_ADDRESS_SPACE_BYTES = 2 * 1024**3
|
||||
LINUX_CPU_SECONDS = 240
|
||||
|
||||
|
||||
def _emit(value: dict) -> None:
|
||||
payload = json.dumps(value, sort_keys=True, separators=(',', ':'), allow_nan=False).encode()
|
||||
if len(payload) > MAX_REPORT_BYTES:
|
||||
raise ValueError('report_limit')
|
||||
sys.stdout.buffer.write(payload + b'\n')
|
||||
sys.stdout.buffer.flush()
|
||||
|
||||
|
||||
def _limits() -> None:
|
||||
try:
|
||||
os.nice(10)
|
||||
except OSError:
|
||||
pass
|
||||
if sys.platform.startswith('linux'):
|
||||
for limit, ceiling in ((resource.RLIMIT_AS, LINUX_ADDRESS_SPACE_BYTES),
|
||||
(resource.RLIMIT_CPU, LINUX_CPU_SECONDS)):
|
||||
soft, hard = resource.getrlimit(limit)
|
||||
bounded = min([ceiling, *(value for value in (soft, hard) if value >= 0)])
|
||||
resource.setrlimit(limit, (bounded, hard))
|
||||
|
||||
|
||||
def _parent_lifeline(expected_pid: int) -> None:
|
||||
if type(expected_pid) is not int or expected_pid <= 1:
|
||||
raise ValueError('invalid parent')
|
||||
if sys.platform.startswith('linux'):
|
||||
# Set in the child, never in preexec_fn of a threaded parent. The PID
|
||||
# recheck closes the race where the parent exits before prctl completes.
|
||||
if ctypes.CDLL(None).prctl(1, signal.SIGKILL, 0, 0, 0) != 0:
|
||||
raise OSError('parent-death signal unavailable')
|
||||
if os.getppid() != expected_pid:
|
||||
raise ValueError('parent changed')
|
||||
if not sys.platform.startswith('linux'):
|
||||
def watch_parent() -> None:
|
||||
while True:
|
||||
time.sleep(0.1)
|
||||
if os.getppid() != expected_pid:
|
||||
os._exit(125)
|
||||
threading.Thread(target=watch_parent, daemon=True).start()
|
||||
|
||||
|
||||
def main() -> int:
|
||||
try:
|
||||
_limits()
|
||||
request = json.loads(sys.stdin.buffer.read(MAX_REQUEST_BYTES + 1))
|
||||
root, names = request['root'], request['segments']
|
||||
gm_context = request.get('gmContext')
|
||||
if gm_context is not None:
|
||||
from openpilot.starpilot.flm.gm_recommend import validate_context
|
||||
gm_context = validate_context(gm_context)
|
||||
elif len(json.dumps(request).encode()) > 2048:
|
||||
raise ValueError('invalid_request')
|
||||
if set(request) != {'root', 'segments', 'parentPid'} | ({'gmContext'} if gm_context is not None else set()):
|
||||
raise ValueError('invalid_request')
|
||||
_parent_lifeline(request['parentPid'])
|
||||
if (type(root) is not str or not Path(root).is_absolute() or type(names) is not list or
|
||||
not 1 <= len(names) <= 5 or any(type(name) is not str or len(name) > 180 or
|
||||
SEGMENT_NAME.fullmatch(name) is None for name in names) or
|
||||
len(set(names)) != len(names)):
|
||||
raise ValueError('invalid_request')
|
||||
selected_names = [name for name in names if type(name) is str]
|
||||
segments = []
|
||||
gm_groups = []
|
||||
for index, name in enumerate(selected_names, 1):
|
||||
source = read_closed_rlog(Path(root), name, permitted=lambda: True)
|
||||
match = SEGMENT_NAME.fullmatch(name)
|
||||
if match is None:
|
||||
raise ValueError('invalid_request')
|
||||
events = decode_segment(source.compressed, source.codec)
|
||||
analysis = analyze_segments((SegmentInput(match.group('route'), int(match.group('number')), events),),
|
||||
gm_context=gm_context, evidence=gm_groups if gm_context is not None else None)
|
||||
segments.append({'source': {'segmentName': name, 'sha256': source.sha256,
|
||||
'compressedBytes': source.size, 'codec': source.codec},
|
||||
'analysis': asdict(analysis.segments[0])})
|
||||
del source, events, analysis
|
||||
_emit({'kind': 'progress', 'processed': index})
|
||||
report = {'schemaVersion': 1, 'purpose': 'offline_tracking_diagnostics', 'segments': segments,
|
||||
'tuneRecommendation': None, 'vehicleQualification': False}
|
||||
if gm_context is not None:
|
||||
from openpilot.starpilot.flm.gm_recommend import classify_groups, build_report
|
||||
summaries, stats = classify_groups(gm_groups)
|
||||
report['purpose'] = 'gm_flm_evidence_profiles'
|
||||
report['gmEvidence'] = build_report(gm_context, summaries, stats)
|
||||
_emit({'kind': 'result', 'report': report})
|
||||
return 0
|
||||
except LocalLogUnavailable:
|
||||
logging.exception('FLM recording admission failed')
|
||||
code = 'recording_unavailable'
|
||||
except LogDecodeError:
|
||||
logging.exception('FLM recording decode failed')
|
||||
code = 'decode_failed'
|
||||
except MemoryError:
|
||||
logging.exception('FLM worker memory limit exceeded')
|
||||
code = 'resource_limit'
|
||||
except Exception:
|
||||
logging.exception('FLM worker failed')
|
||||
code = 'process_failed'
|
||||
try:
|
||||
_emit({'kind': 'error', 'code': code})
|
||||
except Exception:
|
||||
pass
|
||||
return 1
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
raise SystemExit(main())
|
||||
@@ -0,0 +1,97 @@
|
||||
"""No partial FLM segment success after corrupt compression or Cereal data."""
|
||||
|
||||
import bz2
|
||||
from unittest import mock
|
||||
|
||||
import pytest
|
||||
import zstandard as zstd
|
||||
|
||||
from openpilot.cereal import messaging
|
||||
from openpilot.starpilot.flm import log_decode
|
||||
|
||||
|
||||
def _events() -> bytes:
|
||||
first = messaging.new_message("deviceState", valid=True)
|
||||
first.logMonoTime = 101
|
||||
first.deviceState.started = True
|
||||
second = messaging.new_message("carState", valid=False)
|
||||
second.logMonoTime = 202
|
||||
return first.to_bytes() + second.to_bytes()
|
||||
|
||||
|
||||
def _compressed(raw: bytes, codec: str) -> bytes:
|
||||
return zstd.ZstdCompressor().compress(raw) if codec == "zst" else bz2.compress(raw)
|
||||
|
||||
|
||||
@pytest.mark.parametrize("codec", ["zst", "bz2"])
|
||||
def test_complete_segment_retains_all_event_envelopes_and_timestamps(codec):
|
||||
decoded = log_decode.decode_segment(_compressed(_events(), codec), codec)
|
||||
assert len(decoded) == 2
|
||||
assert [(event.which(), event.logMonoTime, event.valid) for event in decoded] == [
|
||||
("deviceState", 101, True), ("carState", 202, False),
|
||||
]
|
||||
assert decoded[0].deviceState.started
|
||||
|
||||
|
||||
@pytest.mark.parametrize("codec", ["zst", "bz2"])
|
||||
def test_truncated_trailing_and_wrong_codec_reject_entire_segment(codec):
|
||||
source = _compressed(_events(), codec)
|
||||
for candidate in (source[:-1], source + _compressed(_events(), codec), source + b"trailing"):
|
||||
with pytest.raises(log_decode.LogDecodeError):
|
||||
log_decode.decode_segment(candidate, codec)
|
||||
other = "bz2" if codec == "zst" else "zst"
|
||||
with pytest.raises(log_decode.LogDecodeError):
|
||||
log_decode.decode_segment(source, other)
|
||||
|
||||
|
||||
def test_expansion_compressed_count_and_cereal_corruption_caps(monkeypatch):
|
||||
raw = _events()
|
||||
encoded = _compressed(raw, "zst")
|
||||
monkeypatch.setattr(log_decode, "MAX_COMPRESSED_BYTES", len(encoded) - 1)
|
||||
with pytest.raises(log_decode.LogDecodeError):
|
||||
log_decode.decode_segment(encoded, "zst")
|
||||
monkeypatch.setattr(log_decode, "MAX_COMPRESSED_BYTES", 32 * 1024 * 1024)
|
||||
monkeypatch.setattr(log_decode, "MAX_EXPANDED_BYTES", len(raw) - 1)
|
||||
with pytest.raises(log_decode.LogDecodeError):
|
||||
log_decode.decode_segment(encoded, "zst")
|
||||
monkeypatch.setattr(log_decode, "MAX_EXPANDED_BYTES", 64 * 1024 * 1024)
|
||||
monkeypatch.setattr(log_decode, "MAX_MESSAGES", 1)
|
||||
with pytest.raises(log_decode.LogDecodeError):
|
||||
log_decode.decode_segment(encoded, "zst")
|
||||
monkeypatch.setattr(log_decode, "MAX_MESSAGES", 250_000)
|
||||
with pytest.raises(log_decode.LogDecodeError):
|
||||
log_decode.decode_segment(_compressed(raw + b"not an Event", "zst"), "zst")
|
||||
|
||||
|
||||
def test_cancelled_and_wrong_input_never_return_prefix(monkeypatch):
|
||||
encoded = _compressed(_events(), "zst")
|
||||
monkeypatch.setattr(log_decode, "CHUNK_BYTES", 8)
|
||||
calls = 0
|
||||
def cancel():
|
||||
nonlocal calls
|
||||
calls += 1
|
||||
return calls > 3
|
||||
with pytest.raises(log_decode.LogDecodeError, match="cancelled"):
|
||||
log_decode.decode_segment(encoded, "zst", cancelled=cancel)
|
||||
decode = mock.Mock(wraps=log_decode.decode_segment)
|
||||
with pytest.raises(log_decode.LogDecodeError):
|
||||
decode(bytearray(encoded), "zst")
|
||||
with pytest.raises(log_decode.LogDecodeError):
|
||||
log_decode.decode_segment(encoded, "raw")
|
||||
|
||||
|
||||
def test_event_traversal_limit_rejects_whole_segment(monkeypatch):
|
||||
monkeypatch.setattr(log_decode, "EVENT_TRAVERSAL_WORDS", 1)
|
||||
with pytest.raises(log_decode.LogDecodeError, match="Cereal"):
|
||||
log_decode.decode_segment(_compressed(_events(), "zst"), "zst")
|
||||
|
||||
|
||||
@pytest.mark.parametrize("codec", ["zst", "bz2"])
|
||||
def test_filtered_retention_still_validates_entire_segment(codec):
|
||||
encoded = _compressed(_events(), codec)
|
||||
selected = log_decode.decode_segment(encoded, codec, retain=frozenset(("carState",)))
|
||||
assert [(event.which(), event.logMonoTime) for event in selected] == [("carState", 202)]
|
||||
with mock.patch.object(log_decode, "MAX_MESSAGES", 1), pytest.raises(log_decode.LogDecodeError, match="message count"):
|
||||
log_decode.decode_segment(encoded, codec, retain=frozenset())
|
||||
with pytest.raises(log_decode.LogDecodeError):
|
||||
log_decode.decode_segment(_compressed(_events() + b"not an Event", codec), codec, retain=frozenset())
|
||||
@@ -0,0 +1 @@
|
||||
"""Offline FLM tests."""
|
||||
@@ -0,0 +1,55 @@
|
||||
"""The desktop report joins real local-file admission, decompression and events."""
|
||||
|
||||
import json
|
||||
|
||||
import pytest
|
||||
import zstandard as zstd
|
||||
|
||||
from openpilot.cereal import messaging
|
||||
from openpilot.starpilot.flm import analyze
|
||||
from openpilot.starpilot.flm.local_logs import LocalLogUnavailable
|
||||
|
||||
|
||||
SEGMENT = "1234abcd--0123456789--0"
|
||||
|
||||
|
||||
def test_desktop_report_for_missing_controller_is_honest_and_source_bound(tmp_path, monkeypatch, capsys):
|
||||
monkeypatch.setattr(analyze, "PC", True)
|
||||
folder = tmp_path / SEGMENT
|
||||
folder.mkdir()
|
||||
event = messaging.new_message("carState", valid=True)
|
||||
event.logMonoTime = 100
|
||||
(folder / "rlog.zst").write_bytes(zstd.compress(event.to_bytes()))
|
||||
assert analyze.main(["--log-root", str(tmp_path.resolve()), SEGMENT]) == 0
|
||||
report = json.loads(capsys.readouterr().out)
|
||||
assert report["purpose"] == "offline_tracking_diagnostics"
|
||||
assert report["vehicleQualification"] is False and report["tuneRecommendation"] is None
|
||||
segment = report["segments"][0]
|
||||
assert segment["analysis"]["status"] == "missing_car_params"
|
||||
assert segment["analysis"]["mean_abs_error"] is None
|
||||
assert len(segment["source"]["sha256"]) == 64
|
||||
assert segment["source"]["segmentName"] == SEGMENT
|
||||
output = tmp_path / "report.json"
|
||||
args = ["--log-root", str(tmp_path.resolve()), "--output", str(output), SEGMENT]
|
||||
assert analyze.main(args) == 0
|
||||
assert json.loads(output.read_text()) == report
|
||||
original = output.read_bytes()
|
||||
assert analyze.main(args) == 1
|
||||
assert output.read_bytes() == original
|
||||
|
||||
|
||||
def test_device_duplicate_and_failed_second_segment_never_emit_partial_report(tmp_path, monkeypatch, capsys):
|
||||
monkeypatch.setattr(analyze, "PC", False)
|
||||
with pytest.raises(ValueError, match="desktop"):
|
||||
analyze.analyze_local(tmp_path.resolve(), [SEGMENT])
|
||||
monkeypatch.setattr(analyze, "PC", True)
|
||||
with pytest.raises(ValueError, match="distinct"):
|
||||
analyze.analyze_local(tmp_path.resolve(), [SEGMENT, SEGMENT])
|
||||
folder = tmp_path / SEGMENT
|
||||
folder.mkdir()
|
||||
event = messaging.new_message("carState", valid=True)
|
||||
(folder / "rlog.zst").write_bytes(zstd.compress(event.to_bytes()))
|
||||
assert analyze.main(["--log-root", str(tmp_path.resolve()), SEGMENT, "1234abcd--0123456789--1"]) == 1
|
||||
assert capsys.readouterr().out == ""
|
||||
with pytest.raises(LocalLogUnavailable):
|
||||
analyze.analyze_local(tmp_path.resolve(), [SEGMENT], cancelled=lambda: True)
|
||||
@@ -0,0 +1,225 @@
|
||||
"""Composed automatic fit application; synthetic evidence, actual owners and wire."""
|
||||
|
||||
from contextlib import contextmanager
|
||||
from dataclasses import replace
|
||||
import json
|
||||
import math
|
||||
import os
|
||||
from pathlib import Path
|
||||
import struct
|
||||
import unittest
|
||||
from unittest import mock
|
||||
|
||||
from opendbc.car.car_helpers import interfaces
|
||||
from opendbc.car.gm.values import CAR as GM
|
||||
from opendbc.car.hyundai.values import CAR as HKG
|
||||
from openpilot.cereal import messaging
|
||||
from openpilot.common.params import Params
|
||||
from openpilot.common.prefix import OpenpilotPrefix
|
||||
from openpilot.selfdrive.controls.controlsd import Controls
|
||||
from openpilot.starpilot.flm.automatic import identity_digest
|
||||
from openpilot.starpilot.flm.learning_producer import AutomaticLearningProducer
|
||||
from openpilot.starpilot.flm.learning_source import (
|
||||
AutomaticLearningConsumer, MAX_AGE_NS, RESET_KEY, SERVICE, learning_payload,
|
||||
)
|
||||
from openpilot.starpilot.flm.tests import test_automatic as evidence
|
||||
from openpilot.starpilot.lateral.controller_selection import ControllerMode, DOCUMENT_KEY as CONTROLLER_KEY, policy_for, replace_mode
|
||||
from openpilot.starpilot.lateral.learning_preferences import KEY as PREFERENCE_KEY, replace_preference
|
||||
from openpilot.starpilot.lateral.tests.test_lane_runtime import feed, publish_corolla_params
|
||||
from openpilot.starpilot.lateral.torque_settings import DOCUMENT_KEY as TORQUE_KEY, replace_field, serialize_document
|
||||
|
||||
NOW = 400_000_000_000
|
||||
|
||||
|
||||
def float32(value):
|
||||
"""The controller's CarParams torque fields are Float32, not Python doubles."""
|
||||
return struct.unpack('<f', struct.pack('<f', value))[0]
|
||||
|
||||
|
||||
class AbsentCollection:
|
||||
"""Only exercise the real Params/identity refresh; no fabricated pose admission."""
|
||||
def all_checks(self, _services):
|
||||
return False
|
||||
|
||||
|
||||
class JoinedLearning:
|
||||
def __init__(self, test, controls):
|
||||
self.test, self.controls = test, controls
|
||||
self.now, self.tick = NOW, 0
|
||||
self.producer = self.new_producer()
|
||||
self.last_publication = None
|
||||
self.wire_readers = []
|
||||
|
||||
def new_producer(self):
|
||||
producer = AutomaticLearningProducer(self.controls.CP, self.controls.params)
|
||||
with mock.patch('openpilot.starpilot.flm.learning_producer.time.monotonic_ns', return_value=self.now), \
|
||||
mock.patch('openpilot.starpilot.flm.learning_producer.time.clock_gettime_ns', return_value=self.now):
|
||||
producer.update(AbsentCollection(), None)
|
||||
self.test.assertEqual(producer.optional_errors, 0)
|
||||
return producer
|
||||
|
||||
def fit(self, multiplier=1.05):
|
||||
identity = self.producer.identity
|
||||
self.test.assertIsNotNone(identity)
|
||||
factor = self.controls.CP.lateralTuning.torque.latAccelFactor * multiplier
|
||||
# Reuse the independently timed, direction/speed-balanced physical evidence
|
||||
# fixture. Bind it to the real current factory identity, not a fabricated fit.
|
||||
windows = []
|
||||
for window in evidence.windows():
|
||||
points = tuple(replace(point, lateral_accel=factor * point.applied_torque +
|
||||
math.copysign(.02, point.applied_torque)) for point in window.response)
|
||||
rows = tuple(replace(row, actual_la=point.lateral_accel, desired_la=point.lateral_accel)
|
||||
for row, point in zip(window.controls, points, strict=True))
|
||||
windows.append(replace(window, identity_sha256=identity_digest(identity), controls=rows, response=points))
|
||||
self.producer.windows.extend(windows)
|
||||
self.producer.block = len(windows)
|
||||
self.producer.evaluate(self.now)
|
||||
self.test.assertIsNotNone(self.producer.result)
|
||||
return self.producer.result
|
||||
|
||||
def step(self, *, publish=True, change=None, **health):
|
||||
controls = self.controls
|
||||
feed(controls, self.now, self.tick, **health)
|
||||
if publish and self.tick % 25 == 0:
|
||||
with mock.patch('openpilot.starpilot.flm.learning_producer.time.monotonic_ns', return_value=self.now):
|
||||
event = self.producer.get_msg()
|
||||
self.test.assertIsNotNone(event)
|
||||
self.test.assertTrue(event.valid, 'The real producer must mark its usable wire valid')
|
||||
if change is not None:
|
||||
change(learning_payload(event.autoSteeringLearning))
|
||||
reader = messaging.log_from_bytes(event.to_bytes())
|
||||
self.wire_readers.append(reader)
|
||||
controls.sm.update_msgs(self.now / 1e9, [reader])
|
||||
self.last_publication = self.now
|
||||
with mock.patch('openpilot.selfdrive.controls.controlsd.time.monotonic_ns', return_value=self.now):
|
||||
command, _ = controls.state_control()
|
||||
self.now += 10_000_000
|
||||
self.tick += 1
|
||||
return command
|
||||
|
||||
def drive(self, ticks, **kwargs):
|
||||
for _ in range(ticks):
|
||||
command = self.step(**kwargs)
|
||||
return command
|
||||
|
||||
|
||||
@contextmanager
|
||||
def joined(test, *, native_ack=False):
|
||||
with OpenpilotPrefix(), mock.patch.dict(os.environ, {'REPLAY': '1', 'TORQUE_REPLAY_RUNTIME': '0',
|
||||
'AOL_REPLAY_RUNTIME': '1' if native_ack else '0', 'LANE_CENTERING_REPLAY_RUNTIME': '0',
|
||||
'SIMULATION': '0'}), \
|
||||
mock.patch('openpilot.selfdrive.controls.controlsd.messaging.PubMaster'):
|
||||
params = Params()
|
||||
cp = publish_corolla_params(params)
|
||||
params.put(CONTROLLER_KEY, json.loads(replace_mode(None, cp, ControllerMode.STANDARD)), block=True)
|
||||
params.put(PREFERENCE_KEY, replace_preference(None, cp, True), block=True)
|
||||
controls = Controls()
|
||||
test.assertTrue(controls.automatic_learning.supported)
|
||||
test.assertTrue(controls.torque_learning_allowed)
|
||||
test.assertIsNone(controls.torque_host)
|
||||
yield JoinedLearning(test, controls)
|
||||
|
||||
|
||||
class TestAutomaticLearningIntegration(unittest.TestCase):
|
||||
def test_produced_fit_reaches_actual_controls_once_without_manual_document(self):
|
||||
with joined(self) as run:
|
||||
controls = run.controls
|
||||
before_cp = controls.CP.as_builder().to_bytes()
|
||||
basis = controls.CP.lateralTuning.torque
|
||||
offset, friction = basis.latAccelOffset, basis.friction
|
||||
command = run.drive(50)
|
||||
self.assertTrue(command.latActive)
|
||||
self.assertIsNone(controls.torque_host, 'Collecting alone must not instantiate an application owner')
|
||||
result = run.fit()
|
||||
self.assertEqual(result.status, 'qualified_fit')
|
||||
native_factor = controls.LaC.torque_params.latAccelFactor
|
||||
command = run.drive(100)
|
||||
self.assertTrue(controls.sm.all_checks([SERVICE]))
|
||||
self.assertFalse(controls.sm.simulation, 'Exercise actual frequency tracking, not simulation relaxation')
|
||||
host = controls.torque_host
|
||||
self.assertIsNotNone(host)
|
||||
self.assertIs(host.applied_controller, controls.LaC)
|
||||
self.assertGreater(controls.LaC.torque_params.latAccelFactor, native_factor)
|
||||
self.assertEqual(controls.LaC.torque_params.latAccelFactor, float32(dict(result.candidate)['latAccelFactor']))
|
||||
self.assertEqual(controls.LaC.torque_params.latAccelOffset, offset)
|
||||
self.assertEqual(controls.LaC.torque_params.friction, friction)
|
||||
self.assertEqual(controls.CP.as_builder().to_bytes(), before_cp)
|
||||
self.assertIsNone(controls.params.get(TORQUE_KEY))
|
||||
self.assertTrue(command.latActive)
|
||||
run.drive(30)
|
||||
self.assertIs(controls.torque_host, host, 'One controller parameter writer must survive subsequent publications')
|
||||
|
||||
def test_actual_application_expires_and_reset_restart_or_manual_choice_falls_back(self):
|
||||
for reason in ('stale', 'restart', 'off', 'corrupt', 'reset', 'manual'):
|
||||
with self.subTest(reason=reason), joined(self) as run:
|
||||
controls = run.controls
|
||||
self.assertEqual(run.fit().status, 'qualified_fit')
|
||||
run.drive(100)
|
||||
host = controls.torque_host
|
||||
self.assertIsNotNone(host)
|
||||
base = controls.CP.lateralTuning.torque.latAccelFactor
|
||||
self.assertGreater(controls.LaC.torque_params.latAccelFactor, base)
|
||||
if reason == 'restart':
|
||||
previous_session = run.producer.session
|
||||
run.producer = run.new_producer()
|
||||
self.assertNotEqual(run.producer.session, previous_session)
|
||||
self.assertIsNone(run.producer.result)
|
||||
elif reason == 'off':
|
||||
controls.params.put(PREFERENCE_KEY, replace_preference(None, controls.CP, False), block=True)
|
||||
elif reason == 'corrupt':
|
||||
Path(controls.params.get_param_path(PREFERENCE_KEY)).write_bytes(b'malformed')
|
||||
elif reason == 'reset':
|
||||
controls.params.put(RESET_KEY, 'a' * 32, block=True)
|
||||
elif reason == 'manual':
|
||||
basis = controls.CP.lateralTuning.torque
|
||||
profile = replace_field({}, str(controls.CP.carFingerprint),
|
||||
(basis.latAccelFactor, basis.latAccelOffset, basis.friction), 'factor', 'custom', base * 1.2)
|
||||
controls.params.put(TORQUE_KEY, json.loads(serialize_document(profile)), block=True)
|
||||
command = run.drive(220, publish=reason != 'stale')
|
||||
if reason == 'stale':
|
||||
self.assertGreater(run.now - run.last_publication, MAX_AGE_NS)
|
||||
self.assertTrue(command.latActive, 'Learning source loss must not manufacture a driving fault')
|
||||
self.assertIs(controls.torque_host, host)
|
||||
self.assertEqual(controls.LaC.torque_params.latAccelFactor, float32(base * (1.2 if reason == 'manual' else 1.)))
|
||||
self.assertEqual(host.selected.source.value, 'user' if reason == 'manual' else host.native_base.source.value)
|
||||
if reason in ('reset', 'off', 'corrupt', 'manual'):
|
||||
run.producer = run.new_producer()
|
||||
self.assertIsNone(run.producer.result, 'Changed saved identity cannot recover an earlier process fit')
|
||||
if reason in ('off', 'corrupt', 'manual'):
|
||||
self.assertIsNone(run.producer.identity)
|
||||
|
||||
def test_real_controller_bounds_and_authority_are_independent_of_qualified_wire(self):
|
||||
with joined(self, native_ack=True) as run:
|
||||
controls = run.controls
|
||||
before_cp = controls.CP.as_builder().to_bytes()
|
||||
self.assertEqual(run.fit().status, 'qualified_fit')
|
||||
commands = [run.step() for _ in range(100)]
|
||||
self.assertIsNotNone(controls.torque_host)
|
||||
self.assertTrue(all(math.isfinite(command.actuators.torque) and
|
||||
abs(command.actuators.torque) <= controls.LaC.steer_max for command in commands))
|
||||
for health in ({'native_allowed': False}, {'can_valid': False}, {'can_timeout': True}, {'fault': True},
|
||||
{'active': False, 'enabled': False}):
|
||||
command = run.step(**health)
|
||||
self.assertFalse(command.latActive)
|
||||
self.assertEqual(command.actuators.torque, 0.)
|
||||
self.assertEqual(controls.LaC.pid.i, 0.)
|
||||
# A qualified sender cannot escape consumer factor or identity admission.
|
||||
for field, value in (('latAccelFactor', float('nan')), ('latAccelFactor', 100.), ('acceptancePolicyId', 'unknown')):
|
||||
while run.tick % 25:
|
||||
run.step()
|
||||
command = run.step(change=lambda state, key=field, new=value: setattr(state, key, new))
|
||||
self.assertEqual(controls.torque_host.selected, controls.torque_host.native_base)
|
||||
self.assertTrue(math.isfinite(command.actuators.torque))
|
||||
self.assertEqual(controls.CP.as_builder().to_bytes(), before_cp, 'Automatic fitting must never change native safety configuration')
|
||||
for vehicle, mode in ((HKG.HYUNDAI_IONIQ_6, ControllerMode.STARPILOT),
|
||||
(GM.CHEVROLET_SILVERADO, ControllerMode.STANDARD)):
|
||||
with self.subTest(vehicle=vehicle), OpenpilotPrefix():
|
||||
cp = interfaces[vehicle].get_non_essential_params(vehicle)
|
||||
params = Params()
|
||||
if policy_for(cp) is not None:
|
||||
params.put(CONTROLLER_KEY, json.loads(replace_mode(None, cp, mode)), block=True)
|
||||
else:
|
||||
self.assertIsNone(params.get(CONTROLLER_KEY))
|
||||
params.put(PREFERENCE_KEY, replace_preference(None, cp, True), block=True)
|
||||
consumer = AutomaticLearningConsumer(cp, interfaces[vehicle](cp), mode, params)
|
||||
self.assertFalse(consumer.supported, 'Saved On cannot qualify a rich or fixed custom conversion')
|
||||
@@ -0,0 +1,194 @@
|
||||
"""Historical CarParams wire stays readable and cannot masquerade as a fit."""
|
||||
|
||||
from contextlib import contextmanager
|
||||
from pathlib import Path
|
||||
from tempfile import TemporaryDirectory
|
||||
import unittest
|
||||
from unittest import mock
|
||||
|
||||
import capnp
|
||||
|
||||
from openpilot.cereal import custom, log, messaging
|
||||
from openpilot.starpilot.flm.learning_source import SERVICE
|
||||
from openpilot.starpilot.flm.tests import test_automatic_integration as integration
|
||||
from tools.ci.custom_schema_contract import describe, validate
|
||||
|
||||
# Exact occupied prefix from c2109496a72e85ca702ecef7aff53ff45adcfb8c,
|
||||
# cereal/custom.capnp. No learner pointer existed in these recordings.
|
||||
HISTORICAL_CAR_PARAMS = """@0xb526ba661d550a59;
|
||||
struct StarPilotCarParams @0xaedffd8f31e7b55d {
|
||||
alternativeExperience @0 :Int16;
|
||||
canUsePedal @1 :Bool;
|
||||
canUseSDSU @2 :Bool;
|
||||
flags @3 :UInt32;
|
||||
isHDA2 @4 :Bool;
|
||||
openpilotLongitudinalControlDisabled @5 :Bool;
|
||||
safetyConfigs @6 :List(SafetyConfig);
|
||||
pcmCruiseSpeed @7 :Bool = true;
|
||||
redneckCruiseAvailable @8 :Bool;
|
||||
|
||||
struct SafetyConfig {
|
||||
safetyParam @0 :UInt16;
|
||||
}
|
||||
}
|
||||
"""
|
||||
|
||||
|
||||
# Exact transient c204 payload: incompatible with the older occupied prefix.
|
||||
TRANSIENT_FLAT_LEARNER = """@0xb526ba661d550a59;
|
||||
struct AutoSteeringLearning @0xaedffd8f31e7b55d {
|
||||
version @0 :UInt16;
|
||||
status @1 :Status;
|
||||
reason @2 :Text;
|
||||
identity @3 :Identity;
|
||||
session @4 :Text;
|
||||
sequence @5 :UInt64;
|
||||
observedMonoTime @6 :UInt64; # MONOTONIC, separate from Event BOOTTIME.
|
||||
validUntilMonoTime @7 :UInt64;
|
||||
sourceWindowStartMonoTime @8 :UInt64;
|
||||
sourceWindowEndMonoTime @9 :UInt64;
|
||||
family @10 :Family;
|
||||
latAccelFactor @11 :Float64;
|
||||
acceptancePolicyId @12 :Text;
|
||||
trainWindows @13 :UInt32;
|
||||
heldoutWindows @14 :UInt32;
|
||||
trainBaselineLoss @15 :Float64;
|
||||
trainCandidateLoss @16 :Float64;
|
||||
heldoutBaselineLoss @17 :Float64;
|
||||
heldoutCandidateLoss @18 :Float64;
|
||||
|
||||
enum Status { unavailable @0; collecting @1; candidate @2; rejected @3; qualifiedFit @4; }
|
||||
enum Family { none @0; linearFactor @1; }
|
||||
struct Identity {
|
||||
vehicle @0 :Text;
|
||||
brand @1 :Text;
|
||||
controller @2 :Text;
|
||||
policy @3 :Text;
|
||||
profile @4 :Text;
|
||||
conversionVersion @5 :Text;
|
||||
firmwareSha256 @6 :Text;
|
||||
basis @7 :List(Float64);
|
||||
baselineSha256 @8 :Text;
|
||||
preferenceSha256 @9 :Text;
|
||||
resetGeneration @10 :Text;
|
||||
controllerRevision @11 :Text;
|
||||
}
|
||||
}
|
||||
"""
|
||||
|
||||
|
||||
@contextmanager
|
||||
def historical_car_params(source=HISTORICAL_CAR_PARAMS):
|
||||
with TemporaryDirectory() as directory:
|
||||
path = Path(directory) / 'historical.capnp'
|
||||
path.write_text(source)
|
||||
yield capnp.SchemaParser().load(str(path))
|
||||
|
||||
|
||||
class TestAutomaticLearningWire(unittest.TestCase):
|
||||
def test_historical_car_params_prefix_defaults_and_nested_layout_survive(self):
|
||||
with historical_car_params() as historical:
|
||||
old_layout = describe(historical, ['StarPilotCarParams'])
|
||||
current_layout = describe(custom, ['StarPilotCarParams'])
|
||||
self.assertEqual(validate(current_layout, old_layout), [])
|
||||
self.assertEqual(set(old_layout['nodes'][str(0xaedffd8f31e7b55d)]['fields']),
|
||||
{str(i) for i in range(9)})
|
||||
field = log.Event.schema.fields[SERVICE].proto
|
||||
self.assertEqual(field.ordinal.explicit, 108)
|
||||
self.assertEqual(field.slot.type.struct.typeId, 0xaedffd8f31e7b55d)
|
||||
self.assertEqual(custom.StarPilotCarParams.schema.fields['learning'].proto.ordinal.explicit, 9)
|
||||
values = {'alternativeExperience': -123, 'canUsePedal': True, 'canUseSDSU': True,
|
||||
'flags': 0xa5a51234, 'isHDA2': True, 'openpilotLongitudinalControlDisabled': True,
|
||||
'safetyConfigs': [{'safetyParam': 0x5a5a}, {'safetyParam': 0xffff}],
|
||||
'pcmCruiseSpeed': False, 'redneckCruiseAvailable': True}
|
||||
old = historical.StarPilotCarParams.new_message(**values)
|
||||
with custom.StarPilotCarParams.from_bytes(old.to_bytes()) as current:
|
||||
self.assertEqual({key: value for key, value in current.to_dict().items() if key != 'learning'}, values)
|
||||
self.assertEqual(current.learning.version, 0)
|
||||
self.assertEqual(str(current.learning.status), 'unavailable')
|
||||
self.assertEqual(current.learning.session, '')
|
||||
self.assertEqual(current.learning.latAccelFactor, 0.)
|
||||
with custom.StarPilotCarParams.from_bytes(historical.StarPilotCarParams.new_message().to_bytes()) as defaults:
|
||||
self.assertTrue(defaults.pcmCruiseSpeed)
|
||||
self.assertEqual(defaults.learning.version, 0)
|
||||
new = custom.StarPilotCarParams.new_message(**values)
|
||||
new.learning.version = 1
|
||||
new.learning.status = 'qualifiedFit'
|
||||
new.learning.latAccelFactor = 3.25
|
||||
with historical.StarPilotCarParams.from_bytes(new.to_bytes()) as prior:
|
||||
self.assertEqual(prior.to_dict(), values)
|
||||
|
||||
def test_real_controls_treats_valid_historical_payload_as_absent_learning(self):
|
||||
with historical_car_params() as historical, integration.joined(self) as run:
|
||||
controls = run.controls
|
||||
cp_before = controls.CP.as_builder().to_bytes()
|
||||
native_factor = controls.LaC.torque_params.latAccelFactor
|
||||
old = historical.StarPilotCarParams.new_message(
|
||||
alternativeExperience=123, flags=0xffffffff, canUsePedal=True,
|
||||
safetyConfigs=[{'safetyParam': 65535}], redneckCruiseAvailable=True)
|
||||
old_bytes = old.to_bytes()
|
||||
readers = []
|
||||
for tick in range(100):
|
||||
now = integration.NOW + tick * 10_000_000
|
||||
integration.feed(controls, now, tick)
|
||||
if tick % 25 == 0:
|
||||
event = messaging.new_message(SERVICE, valid=True)
|
||||
with custom.StarPilotCarParams.from_bytes(old_bytes) as envelope:
|
||||
event.autoSteeringLearning = envelope
|
||||
reader = messaging.log_from_bytes(event.to_bytes())
|
||||
readers.append(reader)
|
||||
controls.sm.update_msgs(now / 1e9, [reader])
|
||||
with mock.patch('openpilot.selfdrive.controls.controlsd.time.monotonic_ns', return_value=now):
|
||||
command, _ = controls.state_control()
|
||||
self.assertTrue(command.latActive)
|
||||
self.assertIsNone(controls.torque_host)
|
||||
self.assertIsNone(controls.automatic_learning.result)
|
||||
self.assertEqual(controls.LaC.torque_params.latAccelFactor, native_factor)
|
||||
self.assertTrue(controls.sm.all_checks([SERVICE]))
|
||||
self.assertFalse(controls.sm.simulation)
|
||||
self.assertEqual(len(readers), 4)
|
||||
self.assertEqual(controls.automatic_learning.session, '')
|
||||
self.assertEqual(controls.CP.as_builder().to_bytes(), cp_before)
|
||||
|
||||
def test_transient_flat_learner_bytes_cannot_be_admitted_as_nested_fit(self):
|
||||
with historical_car_params(TRANSIENT_FLAT_LEARNER) as historical, integration.joined(self) as run:
|
||||
controls = run.controls
|
||||
cp_before = controls.CP.as_builder().to_bytes()
|
||||
native_factor = controls.LaC.torque_params.latAccelFactor
|
||||
identity = run.producer.identity
|
||||
self.assertIsNotNone(identity)
|
||||
old = historical.AutoSteeringLearning.new_message(
|
||||
version=1, status='qualifiedFit', identity=identity, session='transient-c204', sequence=1,
|
||||
observedMonoTime=integration.NOW, validUntilMonoTime=integration.NOW + 500_000_000,
|
||||
sourceWindowStartMonoTime=integration.NOW - 10_000_000_000,
|
||||
sourceWindowEndMonoTime=integration.NOW - 1_000_000_000,
|
||||
family='linearFactor', latAccelFactor=native_factor * 1.05,
|
||||
acceptancePolicyId=next(iter(controls.automatic_learning.policies)),
|
||||
trainWindows=10, heldoutWindows=8, trainBaselineLoss=.1, trainCandidateLoss=.09,
|
||||
heldoutBaselineLoss=.1, heldoutCandidateLoss=.09)
|
||||
# Use the genuinely admitted policy, so only the changed wire layout denies the fit.
|
||||
self.assertEqual(str(old.status), 'qualifiedFit')
|
||||
self.assertEqual(old.identity.to_dict(), identity)
|
||||
old_bytes = old.to_bytes()
|
||||
readers = []
|
||||
for tick in range(50):
|
||||
now = integration.NOW + tick * 10_000_000
|
||||
integration.feed(controls, now, tick)
|
||||
if tick % 25 == 0:
|
||||
event = messaging.new_message(SERVICE, valid=True)
|
||||
with custom.StarPilotCarParams.from_bytes(old_bytes) as envelope:
|
||||
self.assertEqual(envelope.learning.version, 0)
|
||||
event.autoSteeringLearning = envelope
|
||||
reader = messaging.log_from_bytes(event.to_bytes())
|
||||
readers.append(reader)
|
||||
controls.sm.update_msgs(now / 1e9, [reader])
|
||||
with mock.patch('openpilot.selfdrive.controls.controlsd.time.monotonic_ns', return_value=now):
|
||||
command, _ = controls.state_control()
|
||||
self.assertTrue(command.latActive)
|
||||
self.assertIsNone(controls.torque_host)
|
||||
self.assertIsNone(controls.automatic_learning.result)
|
||||
self.assertEqual(controls.LaC.torque_params.latAccelFactor, native_factor)
|
||||
self.assertTrue(controls.sm.all_checks([SERVICE]))
|
||||
self.assertEqual(len(readers), 2)
|
||||
self.assertEqual(controls.automatic_learning.session, '')
|
||||
self.assertEqual(controls.CP.as_builder().to_bytes(), cp_before)
|
||||
@@ -0,0 +1,224 @@
|
||||
"""Replay-only Ioniq 6 FLM controller seam; no production profile selection."""
|
||||
|
||||
import json
|
||||
from pathlib import Path
|
||||
from types import SimpleNamespace
|
||||
import unittest
|
||||
|
||||
from opendbc.car import structs, scale_rot_inertia, scale_tire_stiffness
|
||||
from opendbc.car.car_helpers import interfaces
|
||||
from opendbc.car.hyundai.values import CAR as HYUNDAI
|
||||
from opendbc.car.toyota.values import CAR as TOYOTA
|
||||
from opendbc.car.vehicle_model import VehicleModel
|
||||
from openpilot.common.realtime import DT_CTRL
|
||||
from openpilot.selfdrive.controls.lib.latcontrol_torque import LatControlTorque
|
||||
from openpilot.starpilot.lateral.torque_extension import selected_policy
|
||||
from openpilot.starpilot.flm.torque_surface import Ioniq6Surface
|
||||
from openpilot.starpilot.lateral.ioniq6_policy import Ioniq6TorquePolicy
|
||||
|
||||
|
||||
# Independently generated from frozen 678af783 LatControlTorque and Ioniq helpers.
|
||||
# Full controller/PID/filter rows include the recorded symmetric-unwind correction.
|
||||
_GOLDEN = json.loads((Path(__file__).parent / "testdata" / "ioniq6_controller_replay.json").read_text())
|
||||
_EXTENDED = json.loads((Path(__file__).parent / "testdata" / "ioniq6_controller_extended.json").read_text())
|
||||
_LIVE = json.loads((Path(__file__).parent / "testdata" / "ioniq6_controller_live_update.json").read_text())
|
||||
_TUNED_KNOBS = {"ff_gain_left": 0.30, "ff_gain_right": 0.12,
|
||||
"turn_in_boost_left": 2.20, "unwind_taper_right": 10.0,
|
||||
"center_taper_max": 0.16, "center_deadband_low_deg": 0.1,
|
||||
"low_speed_angle_assist_max_torque": 0.7}
|
||||
|
||||
|
||||
def _params(*, firmware_2025=False):
|
||||
car = HYUNDAI.HYUNDAI_IONIQ_6
|
||||
cp = interfaces[car].get_non_essential_params(car)
|
||||
for name, value in (("mass", 2084.0), ("wheelbase", 2.97), ("centerToFront", 1.188),
|
||||
("steerRatio", 14.26), ("tireStiffnessFactor", 0.65)):
|
||||
setattr(cp, name, value)
|
||||
cp.rotationalInertia = scale_rot_inertia(cp.mass, cp.wheelbase)
|
||||
cp.tireStiffnessFront, cp.tireStiffnessRear = scale_tire_stiffness(
|
||||
cp.mass, cp.wheelbase, cp.centerToFront, cp.tireStiffnessFactor)
|
||||
cp.lateralTuning.torque.latAccelFactor = 3.0
|
||||
cp.lateralTuning.torque.latAccelOffset = 0.0
|
||||
cp.lateralTuning.torque.friction = 0.09
|
||||
cp.lateralTuning.torque.steeringAngleDeadzoneDeg = 0.0
|
||||
if firmware_2025:
|
||||
versions = cp.init("carFw", 2)
|
||||
versions[0].fwVersion = b"IONIQ6-230915"
|
||||
versions[1].fwVersion = b"IONIQ6-240206"
|
||||
return cp
|
||||
|
||||
|
||||
def _controller(cp, surface=None, *, original_constructor_context=False):
|
||||
controller = LatControlTorque(cp.as_reader(), interfaces[HYUNDAI.HYUNDAI_IONIQ_6](cp), DT_CTRL, turn_assist=True)
|
||||
if surface is not None:
|
||||
# Replace before the first update. The production constructor always uses None.
|
||||
controller.starpilot_extension.policy = Ioniq6TorquePolicy(controller, cp.as_reader(), surface=surface, turn_assist=True)
|
||||
if original_constructor_context:
|
||||
controller.hkg_canfd_torque = False
|
||||
# These frozen vectors invoke the original constructor directly. Dom
|
||||
# controlsd replaces this curve with the saved/default flat gain each tick;
|
||||
# this is not a drive-loop replay. Preserve its gain curve and raw-CP startup limits.
|
||||
controller.pid._k_p = [[1, 1.5, 2., 3., 5, 7.5, 10, 15, 30],
|
||||
[250, 120, 65, 30, 11.5, 5.5, 3.5, 2., .6]]
|
||||
controller.pid.set_limits(controller.lateral_accel_from_torque(controller.steer_max, cp.lateralTuning.torque),
|
||||
controller.lateral_accel_from_torque(-controller.steer_max, cp.lateralTuning.torque))
|
||||
return controller
|
||||
|
||||
|
||||
def _assert_rows(test, actual, expected):
|
||||
for row, reference in zip(actual, expected, strict=True):
|
||||
for value, frozen in zip(row, reference, strict=True):
|
||||
test.assertAlmostEqual(value, frozen, places=8)
|
||||
|
||||
|
||||
def _trace(controller, cp, sequence):
|
||||
vm = VehicleModel(cp)
|
||||
cs = structs.CarState.new_message()
|
||||
cs.gearShifter = structs.CarState.GearShifter.drive
|
||||
params = SimpleNamespace(angleOffsetDeg=0.0, roll=0.03)
|
||||
rows = []
|
||||
for active, speed, angle, curvature, pressed, limited in sequence:
|
||||
cs.vEgo = speed
|
||||
cs.steeringAngleDeg = angle
|
||||
cs.steeringPressed = pressed
|
||||
torque, _, state = controller.update(active, cs, vm, params, limited, curvature, limited, 0.1)
|
||||
rows.append((torque, state.desiredLateralAccel, state.desiredLateralJerk,
|
||||
state.p, state.i, state.f, selected_policy(controller).directional_taper_filter.x))
|
||||
return rows
|
||||
|
||||
|
||||
SEQUENCE = (
|
||||
[(False, 0.3, 10.0, -0.001, False, False)] * 2 +
|
||||
[(True, 0.3, 10.0, -0.001, False, False)] * 4 +
|
||||
[(True, 3.0, 8.0, -0.001, False, False)] * 4 +
|
||||
[(True, 14.0, -3.0, 0.0004, False, False)] * 5 +
|
||||
[(True, 27.0, -2.0, -0.0003, False, True)] * 4 +
|
||||
[(True, 14.0, -3.0, 0.0004, True, False)] * 2 +
|
||||
[(True, 14.0, -3.0, 0.0004, False, False)] * 3 +
|
||||
[(False, 0.0, 8.0, -0.001, False, False)] * 2 +
|
||||
[(True, 3.0, 8.0, -0.001, False, False)] * 4
|
||||
)
|
||||
|
||||
|
||||
class TestIoniq6ControllerReplay(unittest.TestCase):
|
||||
def test_frozen_stateful_controller_trace(self):
|
||||
self.assertEqual(_GOLDEN["sourceCommit"], "678af783")
|
||||
self.assertEqual(_GOLDEN["controllerSha256"], "3561d5ac43a72f9b68bc9e44042b8f5cbdca406dec940e7648c64607862a60f7")
|
||||
self.assertEqual(_GOLDEN["fields"], ["output", "desiredLateralAccel", "desiredLateralJerk", "p", "i", "f", "directionalFilter"])
|
||||
for firmware, fw in (("2023", False), ("2025", True)):
|
||||
for mode in ("default", "tuned"):
|
||||
with self.subTest(firmware=firmware, mode=mode):
|
||||
cp = _params(firmware_2025=fw)
|
||||
surface = Ioniq6Surface.validated("firmware_2025" if fw else "standard", _TUNED_KNOBS) if mode == "tuned" else None
|
||||
actual = _trace(_controller(cp, surface, original_constructor_context=True), cp, SEQUENCE)
|
||||
expected = _GOLDEN["cases"][f"{firmware}_{mode}"]
|
||||
_assert_rows(self, actual, expected)
|
||||
|
||||
def test_extended_frozen_filter_limit_override_and_reset_trace(self):
|
||||
self.assertEqual(_EXTENDED["sourceCommit"], "678af783")
|
||||
self.assertEqual(_EXTENDED["controllerSha256"], _GOLDEN["controllerSha256"])
|
||||
self.assertEqual(_EXTENDED["inputFields"], ["active", "speed", "angle", "curvature", "pressed", "limited"])
|
||||
self.assertEqual(_EXTENDED["outputFields"], _GOLDEN["fields"])
|
||||
sequence = _EXTENDED["sequence"]
|
||||
self.assertEqual(len(sequence), 154)
|
||||
self.assertTrue(any(not row[0] for row in sequence))
|
||||
self.assertTrue(any(row[4] for row in sequence))
|
||||
self.assertTrue(any(row[5] for row in sequence))
|
||||
for firmware, fw in (("2023", False), ("2025", True)):
|
||||
for mode in ("default", "tuned"):
|
||||
with self.subTest(firmware=firmware, mode=mode):
|
||||
cp = _params(firmware_2025=fw)
|
||||
surface = Ioniq6Surface.validated("firmware_2025" if fw else "standard", _TUNED_KNOBS) if mode == "tuned" else None
|
||||
actual = _trace(_controller(cp, surface, original_constructor_context=True), cp, sequence)
|
||||
expected = _EXTENDED["cases"][f"{firmware}_{mode}"]
|
||||
_assert_rows(self, actual, expected)
|
||||
|
||||
def test_actual_torque_parameter_update_recalculates_frozen_pid_limits(self):
|
||||
self.assertEqual(_LIVE["sourceControllerSha256"], _GOLDEN["controllerSha256"])
|
||||
self.assertEqual(_LIVE["fields"], _GOLDEN["fields"])
|
||||
for firmware, fw in (("2023", False), ("2025", True)):
|
||||
for mode in ("default", "tuned"):
|
||||
with self.subTest(firmware=firmware, mode=mode):
|
||||
cp = _params(firmware_2025=fw)
|
||||
surface = Ioniq6Surface.validated("firmware_2025" if fw else "standard", _TUNED_KNOBS) if mode == "tuned" else None
|
||||
controller = _controller(cp, surface, original_constructor_context=True)
|
||||
expected = _LIVE["cases"][f"{firmware}_{mode}"]
|
||||
self.assertAlmostEqual(controller.pid.pos_limit, expected["before"]["posLimit"], places=8)
|
||||
self.assertAlmostEqual(controller.pid.neg_limit, expected["before"]["negLimit"], places=8)
|
||||
controller.update_torque_parameters(3.0, 0.0, 0.09)
|
||||
self.assertAlmostEqual(controller.pid.pos_limit, expected["after"]["posLimit"], places=8)
|
||||
self.assertAlmostEqual(controller.pid.neg_limit, expected["after"]["negLimit"], places=8)
|
||||
actual = _trace(controller, cp, _EXTENDED["sequence"])
|
||||
_assert_rows(self, actual, expected["rows"])
|
||||
|
||||
def test_current_startup_and_equal_live_update_use_compensated_limits(self):
|
||||
for firmware, fw in (("2023", False), ("2025", True)):
|
||||
for mode in ("default", "tuned"):
|
||||
with self.subTest(firmware=firmware, mode=mode):
|
||||
cp = _params(firmware_2025=fw)
|
||||
surface = Ioniq6Surface.validated("firmware_2025" if fw else "standard", _TUNED_KNOBS) if mode == "tuned" else None
|
||||
controller = _controller(cp, surface)
|
||||
self.assertAlmostEqual(controller.torque_params.latAccelFactor, 3.0 * 1.22, places=6)
|
||||
limits = (controller.pid.pos_limit, controller.pid.neg_limit)
|
||||
self.assertEqual(limits, (controller.torque_params.latAccelFactor, -controller.torque_params.latAccelFactor))
|
||||
for sign in (-1, 1):
|
||||
controller.pid.reset()
|
||||
accel = controller.pid.update(0., feedforward=sign * 100., freeze_integrator=True)
|
||||
self.assertEqual(accel, sign * controller.torque_params.latAccelFactor)
|
||||
controller.update_torque_parameters(3.0, 0.0, 0.09)
|
||||
self.assertEqual((controller.pid.pos_limit, controller.pid.neg_limit), limits)
|
||||
|
||||
def test_curvature_delay_scales_at_current_speed_without_spurious_unwind(self):
|
||||
cp = _params()
|
||||
controller = _controller(cp)
|
||||
sequence = [(True, 10., 0., .001, False, False)] * 30 + [(True, 20., 0., .001, False, False)] * 20
|
||||
actual = _trace(controller, cp, sequence)
|
||||
alpha = selected_policy(controller).jerk_filter.alpha
|
||||
self.assertAlmostEqual(actual[30][2], actual[29][2] * (1.0 - alpha), places=8)
|
||||
|
||||
def test_replay_surface_is_immutable_session_choice_and_neutral_matches_default(self):
|
||||
for variant, fw in (("standard", False), ("firmware_2025", True)):
|
||||
with self.subTest(variant=variant):
|
||||
cp = _params(firmware_2025=fw)
|
||||
original = _controller(cp)
|
||||
neutral = _controller(cp, Ioniq6Surface.validated(variant, {}))
|
||||
default_rows = _trace(original, cp, SEQUENCE)
|
||||
neutral_rows = _trace(neutral, cp, SEQUENCE)
|
||||
for row, expected in zip(neutral_rows, default_rows, strict=True):
|
||||
for value, reference in zip(row, expected, strict=True):
|
||||
self.assertAlmostEqual(value, reference, places=10)
|
||||
self.assertEqual(selected_policy(original).surface, None)
|
||||
self.assertEqual(selected_policy(neutral).surface.variant, variant)
|
||||
|
||||
def test_tuned_surface_changes_shaping_but_reset_is_deterministic(self):
|
||||
for variant, fw in (("standard", False), ("firmware_2025", True)):
|
||||
with self.subTest(variant=variant):
|
||||
cp = _params(firmware_2025=fw)
|
||||
surface = Ioniq6Surface.validated(variant, _TUNED_KNOBS)
|
||||
baseline = _trace(_controller(cp), cp, SEQUENCE)
|
||||
tuned = _trace(_controller(cp, surface), cp, SEQUENCE)
|
||||
repeated = _trace(_controller(cp, surface), cp, SEQUENCE)
|
||||
self.assertEqual(tuned, repeated)
|
||||
self.assertTrue(any(abs(row[0] - base[0]) > 1e-7 for row, base in zip(tuned, baseline, strict=True)))
|
||||
self.assertEqual(tuned[0][0], 0.0)
|
||||
self.assertEqual(tuned[-5][0], 0.0) # inactive reset frame
|
||||
|
||||
def test_invalid_surface_rejected_before_parent_mutation(self):
|
||||
cp = _params()
|
||||
parent = _controller(cp)
|
||||
original = (parent.pid, parent.torque_params.latAccelFactor, selected_policy(parent))
|
||||
with self.assertRaises(ValueError):
|
||||
Ioniq6TorquePolicy(parent, cp.as_reader(), surface=Ioniq6Surface.validated("firmware_2025", {}))
|
||||
self.assertIs(parent.pid, original[0])
|
||||
self.assertEqual(parent.torque_params.latAccelFactor, original[1])
|
||||
self.assertIs(selected_policy(parent), original[2])
|
||||
with self.assertRaises(ValueError):
|
||||
Ioniq6TorquePolicy(parent, cp.as_reader(), surface=object())
|
||||
other = interfaces[TOYOTA.TOYOTA_COROLLA_TSS2].get_non_essential_params(TOYOTA.TOYOTA_COROLLA_TSS2)
|
||||
with self.assertRaises(ValueError):
|
||||
Ioniq6TorquePolicy(parent, other.as_reader(), surface=Ioniq6Surface.validated("standard", {}))
|
||||
self.assertIs(parent.pid, original[0])
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
@@ -0,0 +1,101 @@
|
||||
"""Local FLM input admission uses disposable recordings and never remote routes."""
|
||||
|
||||
import hashlib
|
||||
import os
|
||||
from unittest.mock import patch
|
||||
|
||||
import pytest
|
||||
|
||||
from openpilot.starpilot.flm.local_logs import LocalLogUnavailable, read_closed_rlog
|
||||
|
||||
|
||||
SEGMENT = "1234abcd--0123456789--0"
|
||||
|
||||
|
||||
def recording(tmp_path, name="rlog.zst"):
|
||||
root = tmp_path.resolve()
|
||||
folder = root / SEGMENT
|
||||
folder.mkdir()
|
||||
path = folder / name
|
||||
path.write_bytes(b"immutable compressed fixture")
|
||||
return root, path
|
||||
|
||||
|
||||
def test_receipt_binds_exact_bytes_and_requires_full_log(tmp_path):
|
||||
root, path = recording(tmp_path)
|
||||
result = read_closed_rlog(root, SEGMENT, permitted=lambda: True)
|
||||
assert result.compressed == path.read_bytes()
|
||||
assert result.sha256 == hashlib.sha256(result.compressed).hexdigest()
|
||||
assert result.codec == "zst" and result.size == len(result.compressed)
|
||||
path.rename(path.with_name("qlog.zst"))
|
||||
with pytest.raises(LocalLogUnavailable, match="full rlog"):
|
||||
read_closed_rlog(root, SEGMENT, permitted=lambda: True)
|
||||
|
||||
|
||||
@pytest.mark.parametrize("name", ("rlog.lock", "writer.lock"))
|
||||
def test_open_segment_is_not_analyzed(tmp_path, name):
|
||||
root, path = recording(tmp_path)
|
||||
path.with_name(name).touch()
|
||||
with pytest.raises(LocalLogUnavailable, match="open"):
|
||||
read_closed_rlog(root, SEGMENT, permitted=lambda: True)
|
||||
|
||||
|
||||
def test_symlink_fifo_ambiguous_and_outside_selection_refused(tmp_path):
|
||||
root, path = recording(tmp_path)
|
||||
for selection in ("../" + SEGMENT, "/" + SEGMENT, SEGMENT + "/rlog.zst", "https://example.com/log"):
|
||||
with pytest.raises(LocalLogUnavailable):
|
||||
read_closed_rlog(root, selection, permitted=lambda: True)
|
||||
path.with_name("rlog.bz2").write_bytes(b"ambiguous")
|
||||
with pytest.raises(LocalLogUnavailable):
|
||||
read_closed_rlog(root, SEGMENT, permitted=lambda: True)
|
||||
path.with_name("rlog.bz2").unlink()
|
||||
path.unlink()
|
||||
external = root / "external"
|
||||
external.write_bytes(b"not a selected recording")
|
||||
path.symlink_to(external)
|
||||
with pytest.raises(LocalLogUnavailable):
|
||||
read_closed_rlog(root, SEGMENT, permitted=lambda: True)
|
||||
path.unlink()
|
||||
os.mkfifo(path)
|
||||
with pytest.raises(LocalLogUnavailable):
|
||||
read_closed_rlog(root, SEGMENT, permitted=lambda: True)
|
||||
|
||||
|
||||
@pytest.mark.parametrize("change", ("replace", "mutate", "lock", "segment", "cancel"))
|
||||
def test_changes_during_read_never_return_a_receipt(tmp_path, change):
|
||||
root, path = recording(tmp_path)
|
||||
allowed = [True]
|
||||
native_read = os.read
|
||||
changed = False
|
||||
def interrupted(fd, size):
|
||||
nonlocal changed
|
||||
result = native_read(fd, size)
|
||||
if result and not changed:
|
||||
changed = True
|
||||
if change == "replace":
|
||||
other = path.with_name("replacement")
|
||||
other.write_bytes(result)
|
||||
other.replace(path)
|
||||
elif change == "mutate":
|
||||
path.write_bytes(b"X" * len(result))
|
||||
os.utime(path, ns=(0, 0))
|
||||
elif change == "lock":
|
||||
path.with_name("rlog.lock").touch()
|
||||
elif change == "segment":
|
||||
path.parent.rename(root / (SEGMENT + "-moved"))
|
||||
path.parent.mkdir()
|
||||
else:
|
||||
allowed[0] = False
|
||||
return result
|
||||
with patch("openpilot.starpilot.flm.local_logs.os.read", side_effect=interrupted), pytest.raises(LocalLogUnavailable):
|
||||
read_closed_rlog(root, SEGMENT, permitted=lambda: allowed[0])
|
||||
|
||||
|
||||
def test_size_limit_and_cancel_before_any_open(tmp_path):
|
||||
root, path = recording(tmp_path)
|
||||
with patch("openpilot.starpilot.flm.local_logs.MAX_COMPRESSED_BYTES", len(path.read_bytes()) - 1), \
|
||||
pytest.raises(LocalLogUnavailable, match="oversized"):
|
||||
read_closed_rlog(root, SEGMENT, permitted=lambda: True)
|
||||
with patch("openpilot.starpilot.flm.local_logs.os.open") as opened, pytest.raises(LocalLogUnavailable):
|
||||
read_closed_rlog(root, SEGMENT, permitted=lambda: False)
|
||||
opened.assert_not_called()
|
||||
@@ -0,0 +1,272 @@
|
||||
"""Serialized current Cereal traces and frozen override-mask differential."""
|
||||
|
||||
import math
|
||||
from contextlib import ExitStack
|
||||
import unittest
|
||||
|
||||
from openpilot.cereal import log
|
||||
from openpilot.starpilot.flm.offline import SegmentInput, TrackingSample, _eligible, analyze_segments
|
||||
from opendbc.car.hyundai.values import CAR
|
||||
|
||||
|
||||
def event(kind, ns, *, valid=True, **fields):
|
||||
builder = log.Event.new_message(logMonoTime=ns, valid=valid)
|
||||
payload = builder.init(kind)
|
||||
if kind == 'carParams':
|
||||
payload.carFingerprint = fields.get('fingerprint', CAR.HYUNDAI_IONIQ_6)
|
||||
payload.lateralTuning.init(fields.get('tuning', 'torque'))
|
||||
payload.steerControlType = fields.get('steering_type', 'torque')
|
||||
payload.dashcamOnly = fields.get('dashcam', False)
|
||||
elif kind == 'carState':
|
||||
payload.vEgo = fields.get('speed', 12.0)
|
||||
payload.steeringPressed = fields.get('pressed', False)
|
||||
payload.canValid = fields.get('can_valid', True)
|
||||
elif kind == 'carControl':
|
||||
payload.latActive = fields.get('lat_active', True)
|
||||
elif kind == 'controlsState':
|
||||
state = payload.lateralControlState
|
||||
state.init(fields.get('controller', 'torqueState'))
|
||||
if fields.get('controller', 'torqueState') == 'torqueState':
|
||||
state.torqueState.desiredLateralAccel = fields.get('desired', 0.4)
|
||||
state.torqueState.actualLateralAccel = fields.get('actual', 0.3)
|
||||
state.torqueState.active = fields.get('active', True)
|
||||
return builder
|
||||
|
||||
|
||||
def serialized(builders):
|
||||
with ExitStack() as stack:
|
||||
for builder in builders:
|
||||
yield stack.enter_context(log.Event.from_bytes(builder.as_reader().as_builder().to_bytes()))
|
||||
|
||||
|
||||
def segment(*, number=0, count=25, pressed=(), fingerprint=CAR.HYUNDAI_IONIQ_6, gap_at=None,
|
||||
invalid_first=False, other_last=False, bad_numeric_at=None, invalid_control_at=None):
|
||||
base = 1_000_000_000
|
||||
events = [event('carParams', base, fingerprint=fingerprint)]
|
||||
for i in range(count):
|
||||
ns = base + (i + 1) * 100_000_000 + (1_000_000_000 if gap_at is not None and i >= gap_at else 0)
|
||||
events += [event('carState', ns, pressed=i in pressed, valid=not (invalid_first and i == 0)),
|
||||
event('carControl', ns, valid=i != invalid_control_at),
|
||||
event('controlsState', ns, controller='pidState' if other_last and i == count - 1 else 'torqueState',
|
||||
desired=float('nan') if i == bad_numeric_at else 0.4)]
|
||||
return SegmentInput('synthetic', number, serialized(events))
|
||||
|
||||
|
||||
def frozen_mask(samples):
|
||||
"""Independent translation of frozen flm_workspace._analysis_eligibility_mask."""
|
||||
eligible = [True for _ in samples]
|
||||
last_override = -math.inf
|
||||
for index, sample in enumerate(samples):
|
||||
t = sample.mono_ns / 1e9
|
||||
if sample.steering_pressed:
|
||||
last_override = t
|
||||
if sample.steering_pressed or t - last_override <= 1.0:
|
||||
eligible[index] = False
|
||||
next_override = math.inf
|
||||
for index in range(len(samples) - 1, -1, -1):
|
||||
sample = samples[index]
|
||||
t = sample.mono_ns / 1e9
|
||||
if sample.steering_pressed:
|
||||
next_override = t
|
||||
if sample.steering_pressed or next_override - t <= 0.35:
|
||||
eligible[index] = False
|
||||
eligible[0] = eligible[-1] = False
|
||||
return eligible
|
||||
|
||||
|
||||
class OfflineTest(unittest.TestCase):
|
||||
def test_serialized_current_ioniq_torque_tracking(self):
|
||||
result = analyze_segments((segment(),)).segments[0]
|
||||
self.assertEqual(result.status, 'measured')
|
||||
self.assertEqual(result.eligible_samples, 23)
|
||||
assert result.mean_abs_error is not None
|
||||
assert result.root_mean_square_error is not None
|
||||
self.assertAlmostEqual(result.mean_abs_error, 0.1, places=6)
|
||||
self.assertAlmostEqual(result.root_mean_square_error, 0.1, places=6)
|
||||
self.assertEqual((result.series[0].desired_lat_accel, result.series[0].actual_lat_accel), (0.4000000059604645, 0.30000001192092896))
|
||||
self.assertEqual(len(result.windows), 1)
|
||||
self.assertEqual(result.windows[0].sample_count, 23)
|
||||
self.assertEqual(result.windows[0].direction, 'left')
|
||||
|
||||
def test_late_consistent_car_params_has_same_complete_segment_report(self):
|
||||
base = 1_000_000_000
|
||||
samples = []
|
||||
for i in range(25):
|
||||
ns = base + (i + 1) * 100_000_000
|
||||
samples.extend((event('carState', ns), event('carControl', ns), event('controlsState', ns)))
|
||||
def analyze(events):
|
||||
return analyze_segments((SegmentInput('same', 0, serialized(events)),)).segments[0]
|
||||
early = analyze([event('carParams', base), *samples])
|
||||
late = analyze([*samples, event('carParams', base + 4_000_000_000)])
|
||||
repeated = analyze([*samples, event('carParams', base + 4_000_000_000), event('carParams', base)])
|
||||
self.assertEqual(early, late)
|
||||
self.assertEqual(late.eligible_samples, 23)
|
||||
self.assertEqual(repeated.eligible_samples, early.eligible_samples)
|
||||
self.assertNotIn('missing_or_unsupported_car_params', dict(late.exclusions))
|
||||
|
||||
def test_late_invalid_or_changed_car_params_rejects_entire_segment(self):
|
||||
base = 1_000_000_000
|
||||
samples = []
|
||||
for i in range(25):
|
||||
ns = base + (i + 1) * 100_000_000
|
||||
samples.extend((event('carState', ns), event('carControl', ns), event('controlsState', ns)))
|
||||
changed = event('carParams', base + 4_000_000_000)
|
||||
changed.carParams.lateralTuning.torque.friction = .2
|
||||
for cp, reason in ((changed, 'inconsistent_car_params'),
|
||||
(event('carParams', base + 4_000_000_000, valid=False), 'invalid_car_params'),
|
||||
(event('carParams', 0), 'invalid_car_params')):
|
||||
with self.subTest(reason=reason), self.assertRaisesRegex(ValueError, reason):
|
||||
analyze_segments((SegmentInput('same', 0, serialized([event('carParams', base), *samples, cp])),))
|
||||
|
||||
def test_frozen_override_mask_and_gap_boundary(self):
|
||||
samples = [TrackingSample(1_000_000_000 + i * 100_000_000, 12.0, .4, .3, False, i in (5, 17)) for i in range(25)]
|
||||
self.assertEqual(_eligible(samples), frozen_mask(samples))
|
||||
result = analyze_segments((segment(pressed=(5, 17), gap_at=12),)).segments[0]
|
||||
self.assertGreater(dict(result.exclusions)['driver_override_or_boundary'], 0)
|
||||
self.assertLess(result.eligible_samples, 23)
|
||||
|
||||
def test_wrong_car_and_non_torque_are_not_measured(self):
|
||||
wrong = analyze_segments((segment(fingerprint='NOT_IONIQ'),)).segments[0]
|
||||
self.assertEqual(wrong.status, 'unsupported_car')
|
||||
self.assertEqual(wrong.eligible_samples, 0)
|
||||
result = analyze_segments((segment(count=3, other_last=True),)).segments[0]
|
||||
self.assertEqual(dict(result.exclusions)['other_controller'], 1)
|
||||
|
||||
def test_missing_invalid_stale_sources_and_segment_independence(self):
|
||||
report = analyze_segments((segment(count=5, invalid_first=True, invalid_control_at=1, bad_numeric_at=2),
|
||||
segment(number=1, count=5))).segments
|
||||
self.assertEqual(dict(report[0].exclusions)['missing_or_stale_source'], 2)
|
||||
self.assertEqual(dict(report[0].exclusions)['invalid_numeric'], 1)
|
||||
self.assertEqual(report[1].status, 'measured')
|
||||
|
||||
def test_series_and_message_bounds(self):
|
||||
report = analyze_segments((segment(count=300),)).segments[0]
|
||||
self.assertEqual(len(report.series), 160)
|
||||
self.assertLess(report.series[0].mono_ns, report.series[-1].mono_ns)
|
||||
|
||||
def test_bounds_cancel_and_inconsistent_cp(self):
|
||||
with self.assertRaisesRegex(ValueError, 'segment_count'):
|
||||
analyze_segments(())
|
||||
with self.assertRaisesRegex(RuntimeError, 'cancelled'):
|
||||
analyze_segments((segment(),), cancelled=lambda: True)
|
||||
events = [event('carParams', 1_000_000_000), event('carParams', 1_000_000_001, fingerprint='OTHER')]
|
||||
with self.assertRaisesRegex(ValueError, 'inconsistent_car_params'):
|
||||
analyze_segments((SegmentInput('a', 0, serialized(events)),))
|
||||
|
||||
repeated = event('carParams', 1_000_000_002)
|
||||
repeated.carParams.lateralTuning.torque.friction = .2
|
||||
with self.assertRaisesRegex(ValueError, 'inconsistent_car_params'):
|
||||
analyze_segments((SegmentInput('a', 0, serialized([event('carParams', 1_000_000_000), repeated])),))
|
||||
|
||||
def test_inactive_press_masks_neighbors_and_breaks_window(self):
|
||||
base = 1_000_000_000
|
||||
events = [event('carParams', base)]
|
||||
for i in range(30):
|
||||
ns = base + (i + 1) * 100_000_000
|
||||
events.extend((event('carState', ns, pressed=i == 8), event('carControl', ns, lat_active=i != 8),
|
||||
event('controlsState', ns)))
|
||||
report = analyze_segments((SegmentInput('a', 0, serialized(events)),)).segments[0]
|
||||
press_ns = base + 900_000_000
|
||||
self.assertTrue(all(not -350_000_000 <= point.mono_ns - press_ns <= 1_000_000_000 for point in report.series))
|
||||
self.assertEqual(len(report.windows), 1)
|
||||
self.assertGreater(report.windows[0].start_mono_ns, press_ns + 1_000_000_000)
|
||||
|
||||
def test_short_invalid_gap_does_not_bridge_and_unrelated_interleaving_is_ignored(self):
|
||||
base = 1_000_000_000
|
||||
events = [event('carParams', base)]
|
||||
for i in range(25):
|
||||
ns = base + (i + 1) * 100_000_000
|
||||
events.append(event('carState', ns))
|
||||
if i == 10:
|
||||
events.append(event('initData', ns - 50_000_000)) # cross-service chronology is not global
|
||||
events.append(event('carControl', ns, valid=i != 12))
|
||||
events.append(event('controlsState', ns))
|
||||
report = analyze_segments((SegmentInput('a', 0, serialized(events)),)).segments[0]
|
||||
self.assertEqual(len(report.windows), 2)
|
||||
self.assertEqual(dict(report.exclusions)['missing_or_stale_source'], 1)
|
||||
self.assertNotIn('invalid_or_reordered_timestamp', dict(report.exclusions))
|
||||
before = {point.continuity_id for point in report.series if point.mono_ns < base + 1_300_000_000}
|
||||
after = {point.continuity_id for point in report.series if point.mono_ns > base + 1_300_000_000}
|
||||
self.assertTrue(before and after)
|
||||
self.assertTrue(before.isdisjoint(after))
|
||||
|
||||
def test_future_publisher_arrives_before_earlier_controls_frame(self):
|
||||
base = 1_000_000_000
|
||||
events = [event('carParams', base)]
|
||||
for i in range(12):
|
||||
ns = base + (i + 1) * 100_000_000
|
||||
if i != 4:
|
||||
events.extend((event('carState', ns), event('carControl', ns)))
|
||||
if i == 3:
|
||||
future = ns + 100_000_000
|
||||
events.extend((event('carState', future), event('carControl', future)))
|
||||
events.append(event('controlsState', ns))
|
||||
report = analyze_segments((SegmentInput('a', 0, serialized(events)),)).segments[0]
|
||||
self.assertEqual(report.status, 'measured')
|
||||
self.assertEqual(report.eligible_samples, 10)
|
||||
self.assertNotIn('missing_or_stale_source', dict(report.exclusions))
|
||||
|
||||
def test_invalid_vehicle_source_and_extreme_values(self):
|
||||
events = [event('carParams', 1_000_000_000)]
|
||||
for i in range(6):
|
||||
ns = 1_100_000_000 + i * 100_000_000
|
||||
events.extend((event('carState', ns, can_valid=i != 0), event('carControl', ns),
|
||||
event('controlsState', ns, desired=3.4e38 if i == 2 else .4, active=i != 3)))
|
||||
report = analyze_segments((SegmentInput('a', 0, serialized(events)),)).segments[0]
|
||||
self.assertEqual(dict(report.exclusions)['invalid_car_state'], 1)
|
||||
self.assertEqual(dict(report.exclusions)['invalid_numeric'], 1)
|
||||
self.assertEqual(dict(report.exclusions)['lateral_inactive'], 1)
|
||||
self.assertIsNone(report.mean_abs_error)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
|
||||
class GmEvidenceJoinTest(unittest.TestCase):
|
||||
def test_actual_factory_context_serialized_epochs_original_profiles_and_mismatch_rejection(self):
|
||||
from openpilot.common.params import Params
|
||||
from openpilot.common.prefix import OpenpilotPrefix
|
||||
from opendbc.car.gm.tests.test_ascm_intercept import params as ordinary_params
|
||||
from opendbc.car.gm.values import CAR as GM_CAR
|
||||
from openpilot.starpilot.flm.gm_recommend import source_context, classify_groups, build_report
|
||||
from openpilot.starpilot.lateral.torque_settings import PlatformProfile, FieldChoice
|
||||
cp_builder = ordinary_params(GM_CAR.CHEVROLET_MALIBU_ASCM)
|
||||
cp_builder.init('carFw', 1)[0].fwVersion = b'\x00\xfffirmware'
|
||||
cp = cp_builder.as_reader()
|
||||
tune = cp.lateralTuning.torque
|
||||
with OpenpilotPrefix():
|
||||
context = source_context(cp, 'starpilot', Params(), 'a'*64,
|
||||
PlatformProfile((tune.latAccelFactor, tune.latAccelOffset, tune.friction), FieldChoice(), FieldChoice()))
|
||||
events = []
|
||||
params_event = log.Event.new_message(logMonoTime=1_000_000_000, valid=True)
|
||||
params_event.init('carParams').from_dict(cp.to_dict())
|
||||
events.append(params_event)
|
||||
for index in range(500):
|
||||
ns = 1_000_000_000 + (index+1)*20_000_000 + (1_000_000_000 if index >= 250 else 0)
|
||||
state = event('carState', ns, pressed=index == 100)
|
||||
state.carState.steeringAngleDeg = 3.
|
||||
command = event('carControl', ns)
|
||||
control = event('controlsState', ns, desired=.8, actual=.1)
|
||||
control.controlsState.lateralControlState.torqueState.output = .2
|
||||
events.extend((state, command, control))
|
||||
groups = []
|
||||
result = analyze_segments((SegmentInput('synthetic-gm-recording', 0, serialized(events)),), gm_context=context, evidence=groups)
|
||||
self.assertEqual(result.segments[0].status, 'measured')
|
||||
self.assertGreaterEqual(len(groups), 3)
|
||||
self.assertTrue(all(all(0 < b.t-a.t <= .251 for a,b in zip(group,group[1:], strict=False)) for group in groups))
|
||||
self.assertTrue(all(not sample.steering_pressed for group in groups for sample in group))
|
||||
summaries, stats = classify_groups(groups)
|
||||
self.assertGreater(stats['sampleCount'], 0)
|
||||
report = build_report(context, summaries, stats)
|
||||
self.assertEqual({path['key'] for path in report['paths']}, {'baseline_fix', 'cleanup_pass'})
|
||||
self.assertTrue(any(path['profiles'] for path in report['paths']))
|
||||
self.assertFalse(report['fit'])
|
||||
self.assertFalse(report['vehicleQualification'])
|
||||
with self.assertRaises(ValueError):
|
||||
build_report(context, summaries, stats, feedback={'acceptedDimensions':['invented-dimension']})
|
||||
wrong = {**context, 'cpSignature': 'b'*64}
|
||||
rejected = []
|
||||
result = analyze_segments((SegmentInput('synthetic-gm-recording', 0, serialized(events)),), gm_context=wrong, evidence=rejected)
|
||||
self.assertEqual(result.segments[0].status, 'unsupported_car')
|
||||
self.assertEqual(rejected, [])
|
||||
@@ -0,0 +1,574 @@
|
||||
"""One isolated FLM operation never publishes a partial or unparked report."""
|
||||
|
||||
from pathlib import Path
|
||||
import json
|
||||
import subprocess
|
||||
import sys
|
||||
import threading
|
||||
import time
|
||||
from unittest import mock
|
||||
|
||||
import pytest
|
||||
import zstandard as zstd
|
||||
|
||||
from openpilot.cereal import messaging
|
||||
from openpilot.starpilot.flm.operation_owner import FlmAnalysisOwner, FlmOperationError
|
||||
|
||||
|
||||
SEGMENT = '1234abcd--0123456789--0'
|
||||
|
||||
|
||||
def recording(tmp_path: Path, *, valid: bool = True) -> Path:
|
||||
root = tmp_path.resolve()
|
||||
folder = root / SEGMENT
|
||||
folder.mkdir()
|
||||
event = messaging.new_message('deviceState', valid=True)
|
||||
event.logMonoTime = 1234
|
||||
(folder / 'rlog.zst').write_bytes(zstd.ZstdCompressor().compress(event.to_bytes()) if valid else b'bad zstd')
|
||||
return root
|
||||
|
||||
|
||||
def terminal(owner: FlmAnalysisOwner) -> dict:
|
||||
deadline = time.monotonic() + 5
|
||||
while time.monotonic() < deadline:
|
||||
state = owner.snapshot()
|
||||
if state['state'] != 'running':
|
||||
return state
|
||||
time.sleep(0.01)
|
||||
raise AssertionError('operation did not terminate')
|
||||
|
||||
|
||||
def test_real_local_worker_report_source_identity_and_stale_id(tmp_path):
|
||||
owner = FlmAnalysisOwner(root=recording(tmp_path), parked=lambda: True)
|
||||
try:
|
||||
started = owner.start((SEGMENT,))
|
||||
assert started['operationId'].count(':') == 1 and started['selected'] == 1
|
||||
assert terminal(owner)['state'] == 'completed'
|
||||
report = owner.report(started['operationId'])
|
||||
assert report['schemaVersion'] == 1 and report['vehicleQualification'] is False
|
||||
assert report['segments'][0]['source']['segmentName'] == SEGMENT
|
||||
assert report['segments'][0]['analysis']['status'] == 'missing_car_params'
|
||||
report['segments'].clear()
|
||||
assert len(owner.report(started['operationId'])['segments']) == 1
|
||||
next_run = owner.start((SEGMENT,))
|
||||
with pytest.raises(FlmOperationError, match='operation_changed'):
|
||||
owner.report(started['operationId'])
|
||||
assert terminal(owner)['state'] == 'completed'
|
||||
assert owner.report(next_run['operationId'])['operationId'] == next_run['operationId']
|
||||
finally:
|
||||
owner.close()
|
||||
|
||||
|
||||
def test_request_thread_can_exit_while_monitor_owned_child_completes(tmp_path):
|
||||
owner = FlmAnalysisOwner(root=recording(tmp_path), parked=lambda: True)
|
||||
replies = []
|
||||
request_thread = threading.Thread(target=lambda: replies.append(owner.start((SEGMENT,))))
|
||||
try:
|
||||
request_thread.start()
|
||||
request_thread.join(timeout=2)
|
||||
assert not request_thread.is_alive() and len(replies) == 1
|
||||
assert terminal(owner)['state'] == 'completed'
|
||||
assert owner.report(replies[0]['operationId'])['segments'][0]['analysis']['status'] == 'missing_car_params'
|
||||
finally:
|
||||
owner.close()
|
||||
|
||||
|
||||
def test_failed_monitor_start_is_unavailable_and_does_not_wedge_future_analysis(tmp_path):
|
||||
owner = FlmAnalysisOwner(root=recording(tmp_path), parked=lambda: True)
|
||||
try:
|
||||
with mock.patch.object(threading.Thread, 'start', side_effect=RuntimeError('thread unavailable')):
|
||||
with pytest.raises(FlmOperationError, match='unavailable'):
|
||||
owner.start((SEGMENT,))
|
||||
assert owner.snapshot()['state'] == 'failed'
|
||||
token = owner.start((SEGMENT,))['operationId']
|
||||
assert terminal(owner)['state'] == 'completed'
|
||||
assert owner.report(token)['operationId'] == token
|
||||
finally:
|
||||
owner.close()
|
||||
|
||||
|
||||
def test_corrupt_and_symlinked_local_sources_publish_no_report(tmp_path):
|
||||
root = recording(tmp_path, valid=False)
|
||||
owner = FlmAnalysisOwner(root=root, parked=lambda: True)
|
||||
try:
|
||||
token = owner.start((SEGMENT,))['operationId']
|
||||
assert terminal(owner)['state'] == 'unavailable'
|
||||
with pytest.raises(FlmOperationError):
|
||||
owner.report(token)
|
||||
path = root / SEGMENT / 'rlog.zst'
|
||||
path.unlink()
|
||||
path.symlink_to(root / 'outside')
|
||||
token = owner.start((SEGMENT,))['operationId']
|
||||
assert terminal(owner)['state'] == 'unavailable'
|
||||
with pytest.raises(FlmOperationError):
|
||||
owner.report(token)
|
||||
finally:
|
||||
owner.close()
|
||||
|
||||
|
||||
def test_cancel_busy_and_onroad_kill_isolated_slow_child(tmp_path):
|
||||
root = recording(tmp_path)
|
||||
parked = [True]
|
||||
slow_worker = (sys.executable, '-c', 'import sys,time;sys.stdin.buffer.read();time.sleep(30)')
|
||||
owner = FlmAnalysisOwner(root=root, parked=lambda: parked[0], worker_argv=slow_worker)
|
||||
try:
|
||||
token = owner.start((SEGMENT,))['operationId']
|
||||
with pytest.raises(FlmOperationError, match='busy'):
|
||||
owner.start((SEGMENT,))
|
||||
assert owner.cancel(token)['state'] == 'canceled'
|
||||
token = owner.start((SEGMENT,))['operationId']
|
||||
with owner._lock:
|
||||
parked[0] = False
|
||||
assert owner.snapshot()['state'] == 'unavailable'
|
||||
parked[0] = True
|
||||
with pytest.raises(FlmOperationError, match='busy'):
|
||||
owner.start((SEGMENT,))
|
||||
parked[0] = False
|
||||
assert terminal(owner)['state'] == 'unavailable'
|
||||
with pytest.raises(FlmOperationError):
|
||||
owner.report(token)
|
||||
finally:
|
||||
owner.close()
|
||||
|
||||
|
||||
def test_worker_pipe_eof_while_alive_and_selector_failure_reap(tmp_path):
|
||||
root = recording(tmp_path)
|
||||
eof_worker = (sys.executable, '-c', 'import os,sys,time;sys.stdin.buffer.read();os.close(1);time.sleep(30)')
|
||||
owner = FlmAnalysisOwner(root=root, parked=lambda: True, worker_argv=eof_worker)
|
||||
try:
|
||||
owner.start((SEGMENT,))
|
||||
assert terminal(owner)['state'] == 'failed'
|
||||
assert owner._child is None
|
||||
finally:
|
||||
owner.close()
|
||||
|
||||
class BrokenSelector:
|
||||
def __enter__(self):
|
||||
return self
|
||||
def __exit__(self, *args):
|
||||
return False
|
||||
def register(self, *_args):
|
||||
raise OSError('injected selector failure')
|
||||
|
||||
with mock.patch('openpilot.starpilot.flm.operation_owner.selectors.DefaultSelector', BrokenSelector):
|
||||
owner = FlmAnalysisOwner(root=root, parked=lambda: True, worker_argv=eof_worker)
|
||||
try:
|
||||
owner.start((SEGMENT,))
|
||||
assert terminal(owner)['state'] == 'failed'
|
||||
assert owner._child is None
|
||||
finally:
|
||||
owner.close()
|
||||
|
||||
|
||||
def test_close_stops_child_and_revokes_report(tmp_path):
|
||||
owner = FlmAnalysisOwner(root=recording(tmp_path), parked=lambda: True)
|
||||
token = owner.start((SEGMENT,))['operationId']
|
||||
assert terminal(owner)['state'] == 'completed'
|
||||
owner.close()
|
||||
with pytest.raises(FlmOperationError, match='unavailable'):
|
||||
owner.report(token)
|
||||
|
||||
|
||||
def test_worker_rejects_stale_parent_identity_before_any_log_read(tmp_path):
|
||||
root = recording(tmp_path)
|
||||
child = subprocess.run((sys.executable, '-m', 'openpilot.starpilot.flm.operation_worker'),
|
||||
input=json.dumps({'root': str(root), 'segments': [SEGMENT], 'parentPid': 1}).encode(),
|
||||
capture_output=True, timeout=5, check=False)
|
||||
assert child.returncode != 0
|
||||
assert b'"kind":"result"' not in child.stdout
|
||||
assert b'"code":"process_failed"' in child.stdout
|
||||
|
||||
|
||||
def test_wall_deadline_stops_and_reaps_child(tmp_path):
|
||||
worker = (sys.executable, '-c', 'import sys,time;sys.stdin.buffer.read();time.sleep(30)')
|
||||
with mock.patch('openpilot.starpilot.flm.operation_owner.WALL_DEADLINE_SECONDS', 0.05):
|
||||
owner = FlmAnalysisOwner(root=recording(tmp_path), parked=lambda: True, worker_argv=worker)
|
||||
try:
|
||||
owner.start((SEGMENT,))
|
||||
status = terminal(owner)
|
||||
assert status['state'] == 'failed' and status['errorCode'] == 'deadline'
|
||||
assert owner._child is None
|
||||
finally:
|
||||
owner.close()
|
||||
|
||||
|
||||
def test_invalid_selection_and_unparked_start_do_not_spawn(tmp_path):
|
||||
owner = FlmAnalysisOwner(root=tmp_path.resolve(), parked=lambda: False)
|
||||
try:
|
||||
for names in ((), (SEGMENT, SEGMENT), ('../outside',)):
|
||||
with pytest.raises(FlmOperationError, match='invalid_request'):
|
||||
owner.start(names)
|
||||
with pytest.raises(FlmOperationError, match='not_parked'):
|
||||
owner.start((SEGMENT,))
|
||||
assert owner.snapshot()['state'] == 'idle'
|
||||
finally:
|
||||
owner.close()
|
||||
|
||||
|
||||
def test_gm_live_trial_atomic_restore_preserves_other_choices_and_rejects_changed_source():
|
||||
from dataclasses import replace
|
||||
from types import SimpleNamespace
|
||||
from openpilot.common.params import Params
|
||||
from openpilot.common.prefix import OpenpilotPrefix
|
||||
from opendbc.car.gm.tests.test_ascm_intercept import params as ordinary_params
|
||||
from opendbc.car.gm.values import CAR
|
||||
from openpilot.starpilot.flm.operation_owner import FlmTrialOwner
|
||||
from openpilot.starpilot.flm.live import GmLiveSource, gm_capability
|
||||
from openpilot.starpilot.flm.torque_surface import GmSurface
|
||||
from openpilot.starpilot.lateral.controller_selection import ControllerMode, replace_mode
|
||||
from openpilot.starpilot.lateral.torque_settings import (DOCUMENT_KEY, FieldChoice, parse_document, replace_field,
|
||||
replace_geometry, serialize_document)
|
||||
cp = ordinary_params(CAR.CHEVROLET_MALIBU_ASCM).as_reader()
|
||||
with OpenpilotPrefix():
|
||||
saved = Params()
|
||||
mode = ControllerMode.STARPILOT
|
||||
saved.put('LateralControllerSelection', json.loads(replace_mode(None, cp, mode)), block=True)
|
||||
cap = gm_capability(cp, mode)
|
||||
identity = cap['fingerprint']
|
||||
profiles = replace_field({}, identity, cap['basis'], 'friction', 'custom', cap['basis'][2] * 1.1)
|
||||
profiles = replace_geometry(profiles, identity, cap['basis'], (cp.steerRatio, cp.steerActuatorDelay+.2),
|
||||
'ratio', FieldChoice('custom', cp.steerRatio * 1.1))
|
||||
saved.put(DOCUMENT_KEY, json.loads(serialize_document(profiles)), block=True)
|
||||
context = SimpleNamespace(cp=cp, cp_raw=cp.as_builder().to_bytes(), parked=True)
|
||||
owner = FlmTrialOwner(saved, SimpleNamespace(sample=lambda: context))
|
||||
|
||||
def action(operation, **fields):
|
||||
return owner.action({'action': operation, 'token': owner.snapshot()['token'], **fields})
|
||||
|
||||
for key, gain in (('baseline', .1), ('trial', .3)):
|
||||
action('save', id=key, label=key, surface=GmSurface(cap['profile'], {'ff_gain_left': gain}).document())
|
||||
first = action('apply', id='baseline')
|
||||
action('accept', trial=first['state']['trial'])
|
||||
trial = action('trial', id='trial')
|
||||
token = trial['state']['trial']
|
||||
self_profile = parse_document(Path(saved.get_param_path(DOCUMENT_KEY)).read_bytes())[identity]
|
||||
assert self_profile.flm.active == 'trial' and self_profile.flm.baseline_active == 'baseline'
|
||||
source = GmLiveSource(cp, mode, saved)
|
||||
assert source.sample(active=True, speed=20., now_ns=1_000_000_000).knobs['ff_gain_left'] == .3
|
||||
before = Path(saved.get_param_path(DOCUMENT_KEY)).read_bytes()
|
||||
with pytest.raises(FlmOperationError, match='busy'):
|
||||
action('save', id='baseline', label='changed', surface=GmSurface(cap['profile'], {}).document())
|
||||
assert Path(saved.get_param_path(DOCUMENT_KEY)).read_bytes() == before
|
||||
restored = action('restore', trial=token)
|
||||
assert restored['state']['active'] == 'baseline'
|
||||
trial = action('trial', id='trial')
|
||||
token = trial['state']['trial']
|
||||
before = Path(saved.get_param_path(DOCUMENT_KEY)).read_bytes()
|
||||
# A concurrent explicit manual edit rejects even refreshed restore. Accept
|
||||
# keeps that user edit and clears the old baseline without overwriting it.
|
||||
latest = parse_document(before)
|
||||
latest = replace_field(latest, identity, cap['basis'], 'friction', 'custom', cap['basis'][2] * 1.2)
|
||||
saved.put(DOCUMENT_KEY, json.loads(serialize_document(latest)), block=True)
|
||||
with pytest.raises(FlmOperationError, match='operation_changed'):
|
||||
owner.action({'action': 'restore', 'token': trial['token'], 'trial': token})
|
||||
with pytest.raises(FlmOperationError, match='operation_changed'):
|
||||
action('restore', trial=token)
|
||||
assert owner.snapshot()['manualConflict']
|
||||
restored = action('accept', trial=token)
|
||||
after = parse_document(Path(saved.get_param_path(DOCUMENT_KEY)).read_bytes())
|
||||
assert after[identity].friction == latest[identity].friction
|
||||
assert after[identity].geometry == profiles[identity].geometry
|
||||
assert after[identity].flm.active == 'trial' and after[identity].flm.trial is None
|
||||
assert restored['state']['applied']
|
||||
assert source.sample(active=True, speed=20., now_ns=2_000_000_000).knobs['ff_gain_left'] == .3
|
||||
action('disable')
|
||||
assert source.sample(active=True, speed=20., now_ns=3_000_000_000) is None
|
||||
assert len(parse_document(Path(saved.get_param_path(DOCUMENT_KEY)).read_bytes())[identity].flm.saved) == 2
|
||||
frozen = Path(saved.get_param_path(DOCUMENT_KEY)).read_bytes()
|
||||
valid = iter((True, False))
|
||||
with pytest.raises(FlmOperationError, match='operation_changed'):
|
||||
owner.action({'action': 'trial', 'token': owner.snapshot()['token'], 'id': 'trial'},
|
||||
session_valid=lambda: next(valid, False))
|
||||
assert Path(saved.get_param_path(DOCUMENT_KEY)).read_bytes() == frozen, 'authority is rechecked before atomic write'
|
||||
context.parked = False
|
||||
with pytest.raises(FlmOperationError, match='not_parked'):
|
||||
action('trial', id='trial')
|
||||
assert Path(saved.get_param_path(DOCUMENT_KEY)).read_bytes() == frozen
|
||||
context.parked = True
|
||||
bad = cp.as_builder()
|
||||
bad.lateralTuning.torque.latAccelFactor *= 1.01
|
||||
context.cp, context.cp_raw = bad.as_reader(), bad.to_bytes()
|
||||
snapshot = owner.snapshot()
|
||||
assert not snapshot['available'] and snapshot['resettable']
|
||||
with pytest.raises(FlmOperationError, match='operation_changed'):
|
||||
action('trial', id='trial')
|
||||
action('reset')
|
||||
result = parse_document(Path(saved.get_param_path(DOCUMENT_KEY)).read_bytes())
|
||||
assert result[identity] == replace(after[identity], flm=None), 'changed-basis reset is FLM-only'
|
||||
assert not Path(saved.get_param_path('FLMTrialApplied')).exists()
|
||||
|
||||
|
||||
def test_gm_live_exact_controller_vehicle_basis_absence_and_malformed_never_rewrite():
|
||||
from types import SimpleNamespace
|
||||
from openpilot.common.params import Params
|
||||
from openpilot.common.prefix import OpenpilotPrefix
|
||||
from opendbc.car.gm.tests.test_ascm_intercept import params as ordinary_params
|
||||
from opendbc.car.gm.values import CAR
|
||||
from openpilot.starpilot.flm.live import GmLiveSource, gm_capability
|
||||
from openpilot.starpilot.flm.operation_owner import FlmTrialOwner
|
||||
from openpilot.starpilot.flm.torque_surface import GmSurface, GmFlmBinding
|
||||
from openpilot.starpilot.lateral.controller_selection import ControllerMode, replace_mode
|
||||
from openpilot.starpilot.lateral.torque_settings import DOCUMENT_KEY, PlatformProfile, FieldChoice, parse_document, serialize_document
|
||||
cp = ordinary_params(CAR.CHEVROLET_MALIBU_ASCM).as_reader()
|
||||
with OpenpilotPrefix():
|
||||
saved = Params()
|
||||
saved.put('LateralControllerSelection', json.loads(replace_mode(None, cp, ControllerMode.STARPILOT)), block=True)
|
||||
cap = gm_capability(cp, ControllerMode.STARPILOT)
|
||||
source = GmLiveSource(cp, ControllerMode.STARPILOT, saved)
|
||||
assert source.sample(active=True, speed=20., now_ns=1_000_000_000) is None
|
||||
assert not Path(saved.get_param_path(DOCUMENT_KEY)).exists()
|
||||
binding = GmFlmBinding('starpilot', cap['policy'], cap['basis'],
|
||||
(('one', 'One', GmSurface(cap['profile'], {'ff_gain_left': .3})),), 'one', True)
|
||||
for controller, basis, identity in (('standard', cap['basis'], cap['fingerprint']),
|
||||
('starpilot', (cap['basis'][0]*1.01, *cap['basis'][1:]), cap['fingerprint']),
|
||||
('starpilot', cap['basis'], str(CAR.CADILLAC_XT4))):
|
||||
from dataclasses import replace
|
||||
rejected = replace(binding, controller=controller, basis=basis)
|
||||
raw = serialize_document({identity: PlatformProfile(cap['basis'], FieldChoice(), FieldChoice(), flm=rejected)})
|
||||
saved.put(DOCUMENT_KEY, json.loads(raw), block=True)
|
||||
source.last_ns = None
|
||||
assert source.sample(active=True, speed=20., now_ns=2_000_000_000) is None
|
||||
assert parse_document(Path(saved.get_param_path(DOCUMENT_KEY)).read_bytes()) == parse_document(raw)
|
||||
stale_basis = (cap['basis'][0]*1.01, *cap['basis'][1:])
|
||||
saved.put(DOCUMENT_KEY, json.loads(serialize_document({cap['fingerprint']: PlatformProfile(stale_basis, FieldChoice(), FieldChoice())})), block=True)
|
||||
ctx = SimpleNamespace(cp=cp, cp_raw=cp.as_builder().to_bytes(), parked=True)
|
||||
stale_owner = FlmTrialOwner(saved, SimpleNamespace(sample=lambda: ctx))
|
||||
assert not stale_owner.snapshot()['available'], 'outer manual profile basis is also part of live admission'
|
||||
frozen = Path(saved.get_param_path(DOCUMENT_KEY)).read_bytes()
|
||||
with pytest.raises(FlmOperationError, match='operation_changed'):
|
||||
stale_owner.action({'action': 'save', 'token': stale_owner.snapshot()['token'], 'id': 'one', 'label': 'One',
|
||||
'surface': GmSurface(cap['profile'], {}).document()})
|
||||
assert Path(saved.get_param_path(DOCUMENT_KEY)).read_bytes() == frozen
|
||||
Path(saved.get_param_path(DOCUMENT_KEY)).write_bytes(b'{')
|
||||
source.last_ns = None
|
||||
assert source.sample(active=True, speed=20., now_ns=3_000_000_000) is None
|
||||
assert Path(saved.get_param_path(DOCUMENT_KEY)).read_bytes() == b'{'
|
||||
ctx = SimpleNamespace(cp=cp, cp_raw=cp.as_builder().to_bytes(), parked=True)
|
||||
assert not FlmTrialOwner(saved, SimpleNamespace(sample=lambda: ctx)).snapshot()['available']
|
||||
|
||||
|
||||
def test_gm_bundle_full_manual_switch_restore_guard_precedence_and_other_vehicle_preserved():
|
||||
from dataclasses import replace
|
||||
from types import SimpleNamespace
|
||||
from openpilot.common.params import Params
|
||||
from openpilot.common.prefix import OpenpilotPrefix
|
||||
from opendbc.car.gm.tests.test_bolt_cc import params as bolt_params
|
||||
from opendbc.car.gm.values import CAR
|
||||
from openpilot.starpilot.flm.operation_owner import FlmTrialOwner
|
||||
from openpilot.starpilot.flm.live import gm_capability
|
||||
from openpilot.starpilot.flm.manual_trial import manual_snapshot
|
||||
from openpilot.starpilot.flm.torque_surface import GmSurface
|
||||
from openpilot.starpilot.lateral.controller_selection import ControllerMode, replace_mode
|
||||
from openpilot.starpilot.lateral.torque_settings import (DOCUMENT_KEY, FieldChoice, GainBasis, GeometryProfile,
|
||||
PlatformProfile, parse_document, serialize_document)
|
||||
cp = bolt_params(CAR.CHEVROLET_BOLT_CC_2022_2023, alpha=True).as_reader()
|
||||
with OpenpilotPrefix():
|
||||
saved = Params()
|
||||
saved.put('LateralControllerSelection', json.loads(replace_mode(None, cp, ControllerMode.STARPILOT)), block=True)
|
||||
saved.put('AdvancedLateralTune', False, block=True)
|
||||
saved.put('ForceAutoTuneOff', True, block=True)
|
||||
cap = gm_capability(cp, ControllerMode.STARPILOT)
|
||||
identity = cap['fingerprint']
|
||||
baseline = PlatformProfile(cap['basis'], FieldChoice(), FieldChoice())
|
||||
other = str(CAR.CHEVROLET_MALIBU_ASCM)
|
||||
profiles = {identity: baseline, other: PlatformProfile((2., 0., .1), FieldChoice('custom', 2.2), FieldChoice())}
|
||||
saved.put(DOCUMENT_KEY, json.loads(serialize_document(profiles)), block=True)
|
||||
ctx = SimpleNamespace(cp=cp, cp_raw=cp.as_builder().to_bytes(), parked=True)
|
||||
owner = FlmTrialOwner(saved, SimpleNamespace(sample=lambda: ctx))
|
||||
gain = GainBasis('starpilot', ((0,), (.6,)), cap['basis'])
|
||||
geometry = GeometryProfile((cp.steerRatio, cp.steerActuatorDelay + .2), FieldChoice('custom', cp.steerRatio * 1.1),
|
||||
FieldChoice('custom', .7), False, 'force_auto')
|
||||
one = replace(baseline, factor=FieldChoice('custom', cap['basis'][0] * 1.1),
|
||||
friction=FieldChoice('custom', min(.1, cap['basis'][2]*1.1)),
|
||||
proportional_gain=FieldChoice('custom', .7), gain_basis=gain, geometry=geometry)
|
||||
two = replace(baseline, geometry=replace(geometry, ratio=FieldChoice(), full_delay=FieldChoice(),
|
||||
automatic_delay=True, learning='source'))
|
||||
def save(key, profile):
|
||||
owner.action({'action': 'save', 'token': owner.snapshot()['token'], 'id': key, 'label': key,
|
||||
'surface': GmSurface(cap['profile'], {}).document()}, generated_manual=manual_snapshot(profile, identity))
|
||||
save('one', one)
|
||||
save('two', two)
|
||||
reasons = owner.snapshot()['preconditions']['one']
|
||||
assert any('Advanced' in reason for reason in reasons) and any('Off remains' in reason for reason in reasons)
|
||||
frozen = Path(saved.get_param_path(DOCUMENT_KEY)).read_bytes()
|
||||
with pytest.raises(FlmOperationError, match='unavailable'):
|
||||
owner.action({'action': 'trial', 'token': owner.snapshot()['token'], 'id': 'one'})
|
||||
assert Path(saved.get_param_path(DOCUMENT_KEY)).read_bytes() == frozen
|
||||
assert saved.get_bool('ForceAutoTuneOff') and not saved.get_bool('AdvancedLateralTune')
|
||||
# Only the user explicitly changes prerequisites; FLM never writes them.
|
||||
saved.put('ForceAutoTuneOff', False, block=True)
|
||||
saved.put('AdvancedLateralTune', True, block=True)
|
||||
preferences = {key: saved.get(key) for key in ('ForceAutoTuneOff', 'AdvancedLateralTune', 'LateralControllerSelection')}
|
||||
def apply(key):
|
||||
return owner.action({'action': 'trial', 'token': owner.snapshot()['token'], 'id': key})
|
||||
trial = apply('one')
|
||||
current = parse_document(Path(saved.get_param_path(DOCUMENT_KEY)).read_bytes())
|
||||
assert replace(current[identity], flm=None) == one
|
||||
switched = apply('two')
|
||||
current = parse_document(Path(saved.get_param_path(DOCUMENT_KEY)).read_bytes())
|
||||
assert replace(current[identity], flm=None) == two, 'source choices replace every earlier custom field'
|
||||
assert switched['state']['trial'] == trial['state']['trial']
|
||||
owner.action({'action': 'restore', 'token': owner.snapshot()['token'], 'trial': trial['state']['trial']})
|
||||
current = parse_document(Path(saved.get_param_path(DOCUMENT_KEY)).read_bytes())
|
||||
assert replace(current[identity], flm=None) == baseline
|
||||
assert current[other] == profiles[other]
|
||||
assert preferences == {key: saved.get(key) for key in preferences}
|
||||
from openpilot.starpilot.flm.gm_recommend import build_report, same_numerical_context
|
||||
source = owner.training_context(owner.snapshot()['token'])
|
||||
evidence = build_report(source, [], {'sampleCount': 32, 'meanErrorAbs': .03})
|
||||
before_progress = Path(saved.get_param_path(DOCUMENT_KEY)).read_bytes()
|
||||
assert not owner.record_cleanup({'gmEvidence': evidence}, session_valid=lambda: False)
|
||||
assert Path(saved.get_param_path(DOCUMENT_KEY)).read_bytes() == before_progress
|
||||
assert owner.record_cleanup({'gmEvidence': evidence}, session_valid=lambda: True)
|
||||
recorded = parse_document(Path(saved.get_param_path(DOCUMENT_KEY)).read_bytes())
|
||||
assert recorded[identity].flm.cleanup_progress and not recorded[identity].flm.applied
|
||||
assert replace(recorded[identity], flm=None) == baseline
|
||||
assert recorded[other] == profiles[other]
|
||||
assert preferences == {key: saved.get(key) for key in preferences}
|
||||
fresh = owner.training_context(owner.snapshot()['token'])
|
||||
assert fresh['cleanupProgress'] and same_numerical_context(fresh, source)
|
||||
assert not same_numerical_context({**fresh, 'geometryBasis': [cp.steerRatio*1.01, cp.steerActuatorDelay+.2]}, source)
|
||||
assert build_report(fresh, [], {'sampleCount': 32, 'meanErrorAbs': .03})['decision']['cleanupProgressLocked']
|
||||
|
||||
|
||||
|
||||
def test_gm_stale_rich_controller_binding_exposes_reset_only_and_preserves_manual():
|
||||
from types import SimpleNamespace
|
||||
from openpilot.common.params import Params
|
||||
from openpilot.common.prefix import OpenpilotPrefix
|
||||
from opendbc.car.gm.tests.test_bolt_cc import params as bolt_params
|
||||
from opendbc.car.gm.values import CAR
|
||||
from openpilot.starpilot.flm.operation_owner import FlmTrialOwner
|
||||
from openpilot.starpilot.flm.live import gm_capability
|
||||
from openpilot.starpilot.flm.torque_surface import GmSurface
|
||||
from openpilot.starpilot.lateral.controller_selection import ControllerMode, replace_mode
|
||||
from openpilot.starpilot.lateral.torque_settings import DOCUMENT_KEY, FieldChoice, PlatformProfile, parse_document, serialize_document
|
||||
cp = bolt_params(CAR.CHEVROLET_BOLT_CC_2022_2023, alpha=True).as_reader()
|
||||
with OpenpilotPrefix():
|
||||
params = Params()
|
||||
params.put('LateralControllerSelection', json.loads(replace_mode(None, cp, ControllerMode.STARPILOT)), block=True)
|
||||
cap = gm_capability(cp, ControllerMode.STARPILOT)
|
||||
profile = PlatformProfile(cap['basis'], FieldChoice('custom', cap['basis'][0]*1.1), FieldChoice())
|
||||
params.put(DOCUMENT_KEY, json.loads(serialize_document({cap['fingerprint']: profile})), block=True)
|
||||
context = SimpleNamespace(sample=lambda: SimpleNamespace(cp=cp, cp_raw=cp.as_builder().to_bytes(), parked=True))
|
||||
owner = FlmTrialOwner(params, context)
|
||||
owner.action({'action': 'save', 'token': owner.snapshot()['token'], 'id': 'rich', 'label': 'Rich',
|
||||
'surface': GmSurface(cap['profile'], {}).document()})
|
||||
params.put('LateralControllerSelection', json.loads(replace_mode(
|
||||
Path(params.get_param_path('LateralControllerSelection')).read_bytes(), cp, ControllerMode.STANDARD)), block=True)
|
||||
stale = owner.snapshot()
|
||||
assert not stale['available'] and not stale['editable'] and stale['resettable']
|
||||
assert stale['profile'] == 'torque_universal' and stale['state']['saved']['rich']['surface']['profile'] == 'gm_bolt_2022_2023'
|
||||
owner.action({'action': 'reset', 'token': stale['token']})
|
||||
assert owner.snapshot()['available']
|
||||
from opendbc.car.lateral import FRICTION_THRESHOLD
|
||||
assert owner.snapshot()['curveDefaults'] == [FRICTION_THRESHOLD] * 5
|
||||
assert parse_document(Path(params.get_param_path(DOCUMENT_KEY)).read_bytes())[cap['fingerprint']] == profile
|
||||
|
||||
|
||||
|
||||
def test_real_gm_worker_frozen_source_report_cannot_grant_or_mutate_preferences(tmp_path):
|
||||
from openpilot.cereal import log
|
||||
from openpilot.common.params import Params
|
||||
from openpilot.common.prefix import OpenpilotPrefix
|
||||
from opendbc.car.gm.tests.test_ascm_intercept import params as ordinary_params
|
||||
from opendbc.car.gm.values import CAR
|
||||
from openpilot.starpilot.flm.gm_recommend import source_context
|
||||
from openpilot.starpilot.lateral.torque_settings import PlatformProfile, FieldChoice
|
||||
from openpilot.starpilot.flm.tests.test_offline import event
|
||||
cp = ordinary_params(CAR.CHEVROLET_MALIBU_ASCM).as_reader()
|
||||
tune = cp.lateralTuning.torque
|
||||
with OpenpilotPrefix():
|
||||
params = Params()
|
||||
context = source_context(cp, 'starpilot', params, 'a'*64,
|
||||
PlatformProfile((tune.latAccelFactor, tune.latAccelOffset, tune.friction), FieldChoice(), FieldChoice()))
|
||||
folder = tmp_path/SEGMENT
|
||||
folder.mkdir()
|
||||
cp_event = log.Event.new_message(logMonoTime=1_000_000_000, valid=True)
|
||||
cp_event.init('carParams').from_dict(cp.to_dict())
|
||||
rows = [cp_event]
|
||||
for index in range(250):
|
||||
ns = 1_000_000_000 + (index+1)*20_000_000
|
||||
state = event('carState', ns)
|
||||
state.carState.steeringAngleDeg = 3.
|
||||
controls = event('controlsState', ns, desired=.8, actual=.1)
|
||||
controls.controlsState.lateralControlState.torqueState.output = .2
|
||||
rows.extend((state, event('carControl', ns), controls))
|
||||
raw = b''.join(row.to_bytes() for row in rows)
|
||||
(folder/'rlog.zst').write_bytes(zstd.ZstdCompressor().compress(raw))
|
||||
owner = FlmAnalysisOwner(root=tmp_path, parked=lambda: True)
|
||||
before = {key: params.get(key) for key in ('TorqueOverrideDocument', 'LateralControllerSelection', 'ForceAutoTuneOff', 'AdvancedLateralTune')}
|
||||
try:
|
||||
started = owner.start((SEGMENT,), gm_context=context)
|
||||
assert terminal(owner)['state'] == 'completed'
|
||||
report = owner.report(started['operationId'])
|
||||
assert report['purpose'] == 'gm_flm_evidence_profiles'
|
||||
assert report['gmEvidence']['context'] == context
|
||||
assert report['gmEvidence']['stats']['sampleCount'] > 0
|
||||
assert report['gmEvidence']['fit'] is False and report['vehicleQualification'] is False
|
||||
assert report['tuneRecommendation'] is None, 'original symptom trials never become an autonomous tuning grant'
|
||||
assert report['segments'][0]['source']['sha256'] == __import__('hashlib').sha256((folder/'rlog.zst').read_bytes()).hexdigest()
|
||||
assert before == {key: params.get(key) for key in before}, 'isolated worker has no Params writer'
|
||||
finally:
|
||||
owner.close()
|
||||
|
||||
|
||||
def test_gm_bundle_preserves_inactive_finite_choices_but_rejects_consumed_bounds():
|
||||
from dataclasses import replace
|
||||
from types import SimpleNamespace
|
||||
from openpilot.common.params import Params
|
||||
from openpilot.common.prefix import OpenpilotPrefix
|
||||
from opendbc.car.gm.tests.test_ascm_intercept import params as ordinary_params
|
||||
from opendbc.car.gm.values import CAR
|
||||
from openpilot.starpilot.flm.live import gm_capability
|
||||
from openpilot.starpilot.flm.manual_trial import manual_profile, manual_snapshot
|
||||
from openpilot.starpilot.flm.operation_owner import FlmTrialOwner
|
||||
from openpilot.starpilot.flm.torque_surface import GmSurface
|
||||
from openpilot.starpilot.lateral.controller_selection import ControllerMode, replace_mode
|
||||
from openpilot.starpilot.lateral.torque_settings import (DOCUMENT_KEY, MAX_DOCUMENT_BYTES, FieldChoice, GainBasis,
|
||||
PlatformProfile, parse_document, serialize_document)
|
||||
cp = ordinary_params(CAR.CHEVROLET_MALIBU_ASCM).as_reader()
|
||||
with OpenpilotPrefix():
|
||||
params = Params()
|
||||
params.put('LateralControllerSelection', json.loads(replace_mode(None, cp, ControllerMode.STARPILOT)), block=True)
|
||||
cap = gm_capability(cp, ControllerMode.STARPILOT)
|
||||
identity = cap['fingerprint']
|
||||
# Source selections retain previously entered finite numbers, even when
|
||||
# those inactive numbers are outside the current consumption bounds.
|
||||
baseline = PlatformProfile(cap['basis'], FieldChoice('source', 10000.), FieldChoice('source', 10000.),
|
||||
FieldChoice('source', 10000.), GainBasis('starpilot', ((0,), (.6,)), cap['basis']))
|
||||
raw = serialize_document({identity: baseline})
|
||||
params.put(DOCUMENT_KEY, json.loads(raw), block=True)
|
||||
owner = FlmTrialOwner(params, SimpleNamespace(sample=lambda: SimpleNamespace(cp=cp, cp_raw=cp.as_builder().to_bytes(), parked=True)))
|
||||
snapshot = manual_snapshot(baseline, identity)
|
||||
assert manual_profile(snapshot, identity, cap['basis']) == baseline
|
||||
assert len(snapshot.encode()) < 4096 and MAX_DOCUMENT_BYTES == 16384
|
||||
owner.action({'action': 'save', 'token': owner.snapshot()['token'], 'id': 'latent', 'label': 'Latent',
|
||||
'surface': GmSurface(cap['profile'], {}).document()})
|
||||
frozen = Path(params.get_param_path(DOCUMENT_KEY)).read_bytes()
|
||||
for name in ('factor', 'friction', 'proportional_gain'):
|
||||
invalid = replace(baseline, **{name: FieldChoice('custom', 10000.)})
|
||||
with pytest.raises(ValueError):
|
||||
owner.action({'action': 'save', 'token': owner.snapshot()['token'], 'id': 'invalid', 'label': 'Invalid',
|
||||
'surface': GmSurface(cap['profile'], {}).document()},
|
||||
generated_manual=manual_snapshot(invalid, identity))
|
||||
assert Path(params.get_param_path(DOCUMENT_KEY)).read_bytes() == frozen
|
||||
# An ordinary Save also validates the currently captured consumed fields,
|
||||
# rather than depending on a later full-document parse to reject them.
|
||||
params.put(DOCUMENT_KEY, json.loads(serialize_document({identity: replace(baseline, factor=FieldChoice('custom', 10000.))})), block=True)
|
||||
invalid_raw = Path(params.get_param_path(DOCUMENT_KEY)).read_bytes()
|
||||
with pytest.raises(ValueError):
|
||||
owner.action({'action': 'save', 'token': owner.snapshot()['token'], 'id': 'invalid', 'label': 'Invalid',
|
||||
'surface': GmSurface(cap['profile'], {}).document()})
|
||||
assert Path(params.get_param_path(DOCUMENT_KEY)).read_bytes() == invalid_raw
|
||||
params.put(DOCUMENT_KEY, json.loads(frozen), block=True)
|
||||
changed = replace(baseline, factor=FieldChoice('custom', cap['basis'][0]*1.05))
|
||||
owner.action({'action': 'save', 'token': owner.snapshot()['token'], 'id': 'custom', 'label': 'Custom',
|
||||
'surface': GmSurface(cap['profile'], {}).document()}, generated_manual=manual_snapshot(changed, identity))
|
||||
trial = owner.action({'action': 'trial', 'token': owner.snapshot()['token'], 'id': 'custom'})
|
||||
owner.action({'action': 'trial', 'token': owner.snapshot()['token'], 'id': 'latent'})
|
||||
assert replace(parse_document(Path(params.get_param_path(DOCUMENT_KEY)).read_bytes())[identity], flm=None) == baseline
|
||||
owner.action({'action': 'restore', 'token': owner.snapshot()['token'], 'trial': trial['state']['trial']})
|
||||
restored = parse_document(Path(params.get_param_path(DOCUMENT_KEY)).read_bytes())[identity]
|
||||
assert replace(restored, flm=None) == baseline
|
||||
assert len(Path(params.get_param_path(DOCUMENT_KEY)).read_bytes()) <= MAX_DOCUMENT_BYTES
|
||||
@@ -0,0 +1,281 @@
|
||||
import math
|
||||
from operator import setitem
|
||||
import unittest
|
||||
from unittest import mock
|
||||
|
||||
from openpilot.starpilot.flm.torque_surface import Ioniq6Surface, SurfaceInput, _BOUNDS, directional_taper_target, evaluate
|
||||
from openpilot.starpilot.lateral import ioniq6_policy as baseline
|
||||
|
||||
|
||||
class TestIoniq6Surface(unittest.TestCase):
|
||||
def test_profile_validation_and_immutability(self):
|
||||
surface = Ioniq6Surface.validated("standard", {"ff_gain_left": 0.217})
|
||||
self.assertEqual(surface.value("ff_gain_left"), 0.217)
|
||||
with self.assertRaises(TypeError):
|
||||
mock.Mock(wraps=setitem)(surface.knobs, "ff_gain_left", 0.3)
|
||||
source = {"ff_gain_left": 0.24}
|
||||
direct = Ioniq6Surface("standard", source)
|
||||
source["ff_gain_left"] = 0.50
|
||||
self.assertEqual(direct.value("ff_gain_left"), 0.24)
|
||||
for variant, knobs in (("2023", {}), ("standard", {"unknown": 1.0}),
|
||||
("standard", {"ff_gain_left": True}),
|
||||
("standard", {"ff_gain_left": math.nan}),
|
||||
("standard", {"ff_gain_left": 10 ** 1000}),
|
||||
("standard", {"turn_in_boost_left": 0.2}),
|
||||
("standard", {"ff_gain_left": 0.601}),
|
||||
("standard", {"curvy_speed_min": 25.0})):
|
||||
with self.subTest(variant=variant, knobs=knobs), self.assertRaises(ValueError):
|
||||
Ioniq6Surface.validated(variant, knobs)
|
||||
|
||||
def test_neutral_matches_existing_ioniq_stages(self):
|
||||
for variant in ("standard", "firmware_2025"):
|
||||
surface = Ioniq6Surface.validated(variant, {})
|
||||
for speed, setpoint, jerk, desired, actual in ((3.0, 0.7, 1.1, 11.0, 1.0),
|
||||
(14.0, -0.9, -1.5, -12.0, -3.0),
|
||||
(27.0, -0.8, 1.7, -3.0, -12.0),
|
||||
(26.0, 0.0, 0.0, 0.0, 0.0)):
|
||||
with self.subTest(variant=variant, speed=speed, setpoint=setpoint, jerk=jerk):
|
||||
taper = baseline.get_ioniq_6_directional_taper_scale(setpoint, jerk, speed)
|
||||
i = SurfaceInput(speed, setpoint, jerk, desired, actual, 0.2, False, taper)
|
||||
shape = evaluate(surface, i)
|
||||
center = baseline.get_ioniq_6_center_taper_scale(setpoint, speed)
|
||||
self.assertAlmostEqual(shape.directional_taper_target, taper, places=12)
|
||||
self.assertAlmostEqual(shape.center_taper, center, places=12)
|
||||
self.assertAlmostEqual(shape.feedforward_scale,
|
||||
baseline.get_ioniq_6_ff_scale(setpoint, jerk, speed, directional_taper_scale=taper), places=12)
|
||||
self.assertAlmostEqual(shape.friction_threshold,
|
||||
baseline.get_ioniq_6_friction_threshold(speed, setpoint, jerk) / max(center, 1e-3), places=12)
|
||||
self.assertAlmostEqual(shape.output_after_angle_assist,
|
||||
baseline.get_ioniq_6_low_speed_angle_assist_torque(desired, actual, 0.2, speed), places=12)
|
||||
self.assertEqual(shape.center_deadband_deg, 0.0)
|
||||
|
||||
def test_nondefault_direction_center_unwind_and_pose(self):
|
||||
surface = Ioniq6Surface.validated("standard", {
|
||||
"ff_gain_left": 0.30, "ff_gain_right": 0.12,
|
||||
"turn_in_boost_left": 1.2, "unwind_taper_right": 2.5,
|
||||
"center_taper_max": 0.16, "highway_center_taper_max": 0.15,
|
||||
"unwind_threshold_increase_right": 3.0,
|
||||
"curvy_turn_in_trim_left": 0.15, "curvy_unwind_extra_reduction_right": 0.25,
|
||||
"curvy_unwind_floor_relief_right": 0.40,
|
||||
"center_deadband_low_deg": 0.1, "center_deadband_mid_deg": 0.15,
|
||||
"low_speed_angle_assist_max_torque": 0.7,
|
||||
})
|
||||
neutral = Ioniq6Surface.validated("standard", {})
|
||||
turn = SurfaceInput(3.0, 0.8, 1.2, 12.0, 1.0, 0.0, False, 0.9)
|
||||
unwind = SurfaceInput(14.0, -0.8, 1.2, -2.0, -10.0, 0.3, False, 0.8)
|
||||
shaped_turn = evaluate(surface, turn)
|
||||
shaped_unwind = evaluate(surface, unwind)
|
||||
self.assertNotEqual(shaped_turn.feedforward_scale, evaluate(neutral, turn).feedforward_scale)
|
||||
self.assertNotEqual(shaped_turn.center_taper, evaluate(neutral, turn).center_taper)
|
||||
self.assertNotEqual(shaped_turn.output_after_angle_assist, evaluate(neutral, turn).output_after_angle_assist)
|
||||
self.assertNotEqual(shaped_unwind.directional_taper_target, evaluate(neutral, unwind).directional_taper_target)
|
||||
self.assertNotEqual(shaped_unwind.friction_threshold, evaluate(neutral, unwind).friction_threshold)
|
||||
self.assertGreater(shaped_turn.center_deadband_deg, 0.0)
|
||||
pressed = SurfaceInput(3.0, 0.8, 1.2, 12.0, 1.0, 0.2, True, 0.9)
|
||||
self.assertEqual(evaluate(surface, pressed).output_after_angle_assist, 0.2)
|
||||
|
||||
def test_filtered_taper_is_separate_controller_owned_state(self):
|
||||
surface = Ioniq6Surface.validated("standard", {})
|
||||
i = SurfaceInput(14.0, -0.8, 1.2, -6.0, -2.0, 0.2, False, filtered_directional_taper=0.91)
|
||||
shape = evaluate(surface, i)
|
||||
self.assertAlmostEqual(shape.feedforward_scale,
|
||||
baseline.get_ioniq_6_ff_scale(i.setpoint, i.jerk, i.speed, directional_taper_scale=0.91))
|
||||
self.assertNotEqual(shape.directional_taper_target, 0.91)
|
||||
for bad in (math.nan, math.inf, -2.1):
|
||||
with self.assertRaises(ValueError):
|
||||
SurfaceInput(i.speed, i.setpoint, i.jerk, i.desired_angle_deg, i.actual_angle_deg, i.output_torque, False, bad)
|
||||
for bad in (True, 10 ** 1000):
|
||||
with self.assertRaises(ValueError):
|
||||
SurfaceInput(bad, i.setpoint, i.jerk, i.desired_angle_deg, i.actual_angle_deg, i.output_torque, False, 0.9)
|
||||
unchecked_input = mock.Mock(wraps=SurfaceInput)
|
||||
with self.assertRaises(ValueError):
|
||||
unchecked_input(i.speed, i.setpoint, i.jerk, i.desired_angle_deg, i.actual_angle_deg, i.output_torque, "false", 0.9)
|
||||
with self.assertRaises(ValueError):
|
||||
unchecked_input(i.speed, i.setpoint, i.jerk, i.desired_angle_deg, i.actual_angle_deg, i.output_torque, False, None)
|
||||
|
||||
def test_frozen_ioniq_stage_vectors(self):
|
||||
# Compact values from frozen 678af783 latcontrol_vehicle_tunes.py SHA256
|
||||
# 2a7793c6ee4b53b45070d3267a01e8c7105dfd8df9d38cdfc96cfe4b672a125b.
|
||||
# Generated with private AST oracle, not by importing the frozen checkout.
|
||||
surface = Ioniq6Surface.validated("standard", {
|
||||
"ff_gain_left": 0.11, "ff_gain_right": 0.09,
|
||||
"turn_in_boost_left": 2.2, "turn_in_boost_right": 2.4,
|
||||
"unwind_taper_left": 5.0, "unwind_taper_right": 10.0,
|
||||
"center_taper_max": 0.13, "highway_center_taper_max": 0.08,
|
||||
"turn_in_threshold_reduction_left": 1.1, "turn_in_threshold_reduction_right": 1.6,
|
||||
"unwind_threshold_increase_left": 5.0, "unwind_threshold_increase_right": 11.0,
|
||||
"crawl_turn_in_ff_boost_left": 0.33, "crawl_turn_in_ff_boost_right": 0.38,
|
||||
"low_speed_angle_assist_max_torque": 0.60,
|
||||
})
|
||||
# speed, accel, jerk, desired angle, actual angle; then frozen direction,
|
||||
# center, combined pre-2023 FF, threshold and pose output from 0.2 torque.
|
||||
vectors = (
|
||||
(3.0, 0.18, 0.42, 11.0, 2.0, 0.988394829429103, 0.9978605797219613,
|
||||
1.4749555335910585, 0.32048565350593106, -0.13901469137077216),
|
||||
(14.0, -0.32, 0.55, -9.0, -15.0, 0.49398782437927313, 0.9746594981685954,
|
||||
0.4814699250108986, 0.40460794823460716, 0.2),
|
||||
(27.0, 0.19, 0.50, 9.0, 4.0, 0.9444309506239349, 0.8839299279089594,
|
||||
0.9260528746519242, 0.4179582730864161, 0.2),
|
||||
)
|
||||
for speed, accel, jerk, desired, actual, direction, center, ff, threshold, pose in vectors:
|
||||
with self.subTest(speed=speed, accel=accel, jerk=jerk):
|
||||
shape = evaluate(surface, SurfaceInput(speed, accel, jerk, desired, actual, 0.2, False, direction))
|
||||
self.assertAlmostEqual(shape.directional_taper_target, direction, places=11)
|
||||
self.assertAlmostEqual(shape.center_taper, center, places=11)
|
||||
self.assertAlmostEqual(shape.feedforward_scale * shape.center_taper, ff, places=11)
|
||||
self.assertAlmostEqual(shape.friction_threshold, threshold, places=11)
|
||||
self.assertAlmostEqual(shape.output_after_angle_assist, pose, places=11)
|
||||
|
||||
def test_historical_combined_extreme_is_preserved_but_unqualified(self):
|
||||
# Every individual value is inside frozen metadata, yet the combination
|
||||
# reverses the directional multiplier. Pure math must expose it, not clip it.
|
||||
surface = Ioniq6Surface.validated("standard", {name: high for name, (_, high) in _BOUNDS.items()})
|
||||
target = directional_taper_target(surface, 18.0, 0.9, -3.0)
|
||||
self.assertAlmostEqual(target, -0.13824656992744921, places=11)
|
||||
shape = evaluate(surface, SurfaceInput(18.0, 0.9, -3.0, 8.0, 4.0, 0.2, False, target))
|
||||
self.assertEqual(shape.directional_taper_target, target)
|
||||
self.assertLess(shape.feedforward_scale, 0.0)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
|
||||
class TestGmSurface(unittest.TestCase):
|
||||
def test_selected_neutral_and_rich_default_laws(self):
|
||||
from openpilot.starpilot.flm.torque_surface import GmSurface
|
||||
from openpilot.starpilot.lateral import bolt_shaping as gm
|
||||
neutral = GmSurface('torque_universal', {})
|
||||
rich = GmSurface('gm_bolt_2022_2023', {})
|
||||
for speed, setpoint, jerk in ((3., .8, 1.2), (14., -.8, 1.2), (27., .8, -1.2), (26., 0., 0.)):
|
||||
sample = SurfaceInput(speed, setpoint, jerk, 0., 0., 0., False, 1.)
|
||||
ff, threshold = neutral.stages(sample, setpoint, gm.get_gm_base_friction_threshold(speed))
|
||||
self.assertEqual(ff, setpoint)
|
||||
self.assertEqual(threshold, gm.get_gm_base_friction_threshold(speed))
|
||||
self.assertEqual(neutral.deadband(speed), 0.)
|
||||
rich_ff, rich_threshold = rich.stages(sample, setpoint, threshold, rich=True)
|
||||
self.assertAlmostEqual(rich_ff, setpoint * gm.get_bolt_2022_2023_ff_scale(setpoint, jerk, speed), places=12)
|
||||
self.assertAlmostEqual(rich_threshold, gm.get_bolt_2022_2023_friction_threshold(speed, setpoint, jerk), places=12)
|
||||
self.assertEqual(rich.angle_assist(sample), 0.)
|
||||
|
||||
def test_explicit_surface_bounds_composition_and_immutable_document(self):
|
||||
from openpilot.starpilot.flm.torque_surface import GmSurface, GmFlmBinding
|
||||
knobs = {'ff_gain_left': .3, 'ff_gain_right': -.1, 'center_deadband_low_deg': .1}
|
||||
surface = GmSurface('torque_universal', knobs, [.16, .18, .20, .23, .27])
|
||||
knobs['ff_gain_left'] = .6
|
||||
self.assertEqual(surface.knobs['ff_gain_left'], .3)
|
||||
with self.assertRaises(TypeError):
|
||||
mock.Mock(wraps=setitem)(surface.knobs, 'ff_gain_left', .5)
|
||||
self.assertEqual(GmSurface.from_document(surface.document()).document(), surface.document())
|
||||
self.assertGreater(surface.deadband(5.), 0.)
|
||||
self.assertAlmostEqual(surface.base_threshold(10.), .20)
|
||||
for speed in (3., 14., 27.):
|
||||
for sign in (-1., 1.):
|
||||
sample = SurfaceInput(speed, sign*.8, sign*1.2, 0., 0., 0., False, 1.)
|
||||
ff, threshold = surface.stages(sample, sign*.8, .2)
|
||||
self.assertGreater(ff * sign, 0.)
|
||||
if speed == 3.:
|
||||
self.assertGreater(ff, .8) if sign > 0 else self.assertLess(abs(ff), .8)
|
||||
self.assertTrue(math.isfinite(threshold) and threshold > 0.)
|
||||
for knobs, curve in (({'ff_gain_left': -.4, 'turn_in_boost_left': 2.8}, None),
|
||||
({'ff_gain_left': math.nan}, None), ({'ff_gain_left': 10**1000}, None),
|
||||
({'ff_gain_left': True}, None), ({'curvy_speed_min': 25.}, None),
|
||||
({}, [.2]*4), ({}, [.2, .2, math.inf, .2, .2]), ({}, [10**1000]*5)):
|
||||
with self.assertRaises(ValueError):
|
||||
GmSurface('torque_universal', knobs, curve)
|
||||
binding = GmFlmBinding('starpilot', 'ordinary_ascm', (2., 0., .1), (('one', 'Surface', surface),), 'one', True)
|
||||
self.assertEqual(GmFlmBinding.from_document(binding.document()), binding)
|
||||
for value in ({**binding.document(), 'active': 'missing'}, {**binding.document(), 'baselineActive': 'one', 'baselineApplied': True}):
|
||||
with self.assertRaises(ValueError):
|
||||
GmFlmBinding.from_document(value)
|
||||
|
||||
def test_actual_selected_controller_neutral_surface_has_no_double_application(self):
|
||||
from types import SimpleNamespace
|
||||
from opendbc.car.gm.interface import CarInterface
|
||||
from opendbc.car.gm.tests.test_ascm_intercept import params as ordinary_params
|
||||
from opendbc.car.gm.tests.test_bolt_cc import params as bolt_params
|
||||
from opendbc.car.gm.values import CAR
|
||||
from opendbc.car.vehicle_model import VehicleModel
|
||||
from openpilot.common.params import Params
|
||||
from openpilot.common.prefix import OpenpilotPrefix
|
||||
from openpilot.selfdrive.controls.lib.latcontrol_torque import LatControlTorque
|
||||
from openpilot.starpilot.flm.live import gm_capability
|
||||
from openpilot.starpilot.flm import live as flm
|
||||
from openpilot.starpilot.flm.torque_surface import GmFlmBinding, GmSurface
|
||||
from openpilot.starpilot.lateral.controller_selection import ControllerMode, replace_mode
|
||||
from openpilot.starpilot.lateral.torque_settings import DOCUMENT_KEY, PlatformProfile, FieldChoice, serialize_document
|
||||
import json
|
||||
cases = (ordinary_params(CAR.CHEVROLET_MALIBU_ASCM), bolt_params(CAR.CHEVROLET_BOLT_CC_2022_2023, alpha=True))
|
||||
for cp_builder in cases:
|
||||
cp = cp_builder.as_reader()
|
||||
for mode in ControllerMode:
|
||||
with OpenpilotPrefix():
|
||||
saved = Params()
|
||||
saved.put('LateralControllerSelection', json.loads(replace_mode(None, cp, mode)), block=True)
|
||||
baseline = LatControlTorque(cp, CarInterface(cp), .01, controller_mode=mode)
|
||||
overlay = LatControlTorque(cp, CarInterface(cp), .01, controller_mode=mode)
|
||||
cap = gm_capability(cp, mode)
|
||||
surface = GmSurface(cap['profile'], {})
|
||||
cs = SimpleNamespace(vEgo=20., steeringAngleDeg=0., steeringPressed=False, steeringRateDeg=0., standstill=False)
|
||||
params = SimpleNamespace(angleOffsetDeg=0., roll=0.)
|
||||
vm = VehicleModel(cp)
|
||||
with mock.patch('openpilot.starpilot.flm.live.time.monotonic_ns', return_value=1_000_000_000):
|
||||
baseline.flm_source.sample(active=True, speed=cs.vEgo)
|
||||
binding = GmFlmBinding(str(mode), cap['policy'], cap['basis'], (('neutral', 'Neutral', surface),), 'neutral', True)
|
||||
saved.put(DOCUMENT_KEY, json.loads(serialize_document({str(cp.carFingerprint): PlatformProfile(cap['basis'], FieldChoice(),
|
||||
FieldChoice(), flm=binding)})), block=True)
|
||||
with mock.patch('openpilot.starpilot.flm.live.stages', wraps=flm.stages) as stages:
|
||||
for tick in range(100):
|
||||
curvature = .001 if tick < 50 else -.001
|
||||
before = baseline.update(True, cs, vm, params, False, curvature, False, .2)
|
||||
after = overlay.update(True, cs, vm, params, False, curvature, False, .2)
|
||||
self.assertEqual(before[:2], after[:2], (cp.carFingerprint, mode, tick))
|
||||
self.assertEqual(before[2].to_dict(), after[2].to_dict(), (cp.carFingerprint, mode, tick))
|
||||
self.assertEqual(stages.call_count, 200, 'exactly one generic stage call per actual controller update')
|
||||
self.assertIsNotNone(overlay.flm_surface)
|
||||
self.assertIsNone(baseline.flm_surface)
|
||||
self.assertEqual(overlay.update(False, cs, vm, params, False, .001, False, .2)[0], 0.)
|
||||
self.assertIsNone(overlay.flm_surface)
|
||||
|
||||
|
||||
def test_standard_bolt_explicit_universal_angle_assist_reaches_actual_generic_controller(self):
|
||||
import json
|
||||
from types import SimpleNamespace
|
||||
from opendbc.car.gm.interface import CarInterface
|
||||
from opendbc.car.gm.tests.test_bolt_cc import params as bolt_params
|
||||
from opendbc.car.gm.values import CAR
|
||||
from opendbc.car.vehicle_model import VehicleModel
|
||||
from openpilot.common.params import Params
|
||||
from openpilot.common.prefix import OpenpilotPrefix
|
||||
from openpilot.selfdrive.controls.lib.latcontrol_torque import LatControlTorque
|
||||
from openpilot.starpilot.flm import live as flm
|
||||
from openpilot.starpilot.flm.live import gm_capability
|
||||
from openpilot.starpilot.flm.torque_surface import GmFlmBinding, GmSurface
|
||||
from openpilot.starpilot.lateral.controller_selection import ControllerMode, replace_mode
|
||||
from openpilot.starpilot.lateral.torque_settings import DOCUMENT_KEY, PlatformProfile, FieldChoice, serialize_document
|
||||
cp = bolt_params(CAR.CHEVROLET_BOLT_CC_2022_2023, alpha=True).as_reader()
|
||||
mode = ControllerMode.STANDARD
|
||||
with OpenpilotPrefix():
|
||||
params = Params()
|
||||
params.put('LateralControllerSelection', json.loads(replace_mode(None, cp, mode)), block=True)
|
||||
controller = LatControlTorque(cp, CarInterface(cp), .01, controller_mode=mode)
|
||||
self.assertIsNone(controller.starpilot_extension)
|
||||
cap = gm_capability(cp, mode)
|
||||
surface = GmSurface(cap['profile'], {'low_speed_angle_assist_max_torque': .1})
|
||||
binding = GmFlmBinding(str(mode), cap['policy'], cap['basis'], (('assist', 'Assist', surface),), 'assist', True)
|
||||
params.put(DOCUMENT_KEY, json.loads(serialize_document({cap['fingerprint']: PlatformProfile(cap['basis'],
|
||||
FieldChoice(), FieldChoice(), flm=binding)})), block=True)
|
||||
cs = SimpleNamespace(vEgo=3., steeringAngleDeg=0., steeringPressed=False, steeringRateDeg=0., standstill=False)
|
||||
learned = SimpleNamespace(angleOffsetDeg=0., roll=0.)
|
||||
observed = []
|
||||
original_angle = flm.angle_assist
|
||||
def actual_angle(*args):
|
||||
output = original_angle(*args)
|
||||
observed.append((args[-1], output))
|
||||
return output
|
||||
with mock.patch('openpilot.starpilot.flm.live.time.monotonic_ns', return_value=1_000_000_000), \
|
||||
mock.patch('openpilot.starpilot.flm.live.angle_assist', side_effect=actual_angle):
|
||||
result = controller.update(True, cs, VehicleModel(cp), learned, False, .003, False, .2)
|
||||
self.assertTrue(result[2].active)
|
||||
self.assertEqual(len(observed), 1)
|
||||
self.assertGreater(abs(observed[0][1] - observed[0][0]), 1e-6)
|
||||
self.assertTrue(math.isfinite(result[0]) and abs(result[0]) <= 1.)
|
||||
@@ -0,0 +1,21 @@
|
||||
from unittest.mock import patch
|
||||
|
||||
from openpilot.starpilot.flm import operation_worker as worker
|
||||
|
||||
|
||||
def test_unlimited_linux_limits_get_finite_ceiling():
|
||||
with patch.object(worker.sys, "platform", "linux"), patch.object(worker.os, "nice"), \
|
||||
patch.object(worker.resource, "getrlimit", return_value=(-1, -1)), \
|
||||
patch.object(worker.resource, "setrlimit") as set_limit:
|
||||
worker._limits()
|
||||
assert set_limit.call_args_list[0].args == (worker.resource.RLIMIT_AS, (worker.LINUX_ADDRESS_SPACE_BYTES, -1))
|
||||
assert set_limit.call_args_list[1].args == (worker.resource.RLIMIT_CPU, (worker.LINUX_CPU_SECONDS, -1))
|
||||
|
||||
|
||||
def test_existing_tighter_linux_limits_are_preserved():
|
||||
with patch.object(worker.sys, "platform", "linux"), patch.object(worker.os, "nice"), \
|
||||
patch.object(worker.resource, "getrlimit", side_effect=[(1000000, 2000000), (-1, 60)]), \
|
||||
patch.object(worker.resource, "setrlimit") as set_limit:
|
||||
worker._limits()
|
||||
assert set_limit.call_args_list[0].args == (worker.resource.RLIMIT_AS, (1000000, 2000000))
|
||||
assert set_limit.call_args_list[1].args == (worker.resource.RLIMIT_CPU, (60, 60))
|
||||
@@ -0,0 +1,791 @@
|
||||
{
|
||||
"sourceCommit": "678af783",
|
||||
"controllerSha256": "3561d5ac43a72f9b68bc9e44042b8f5cbdca406dec940e7648c64607862a60f7",
|
||||
"inputFields": ["active", "speed", "angle", "curvature", "pressed", "limited"],
|
||||
"outputFields": ["output", "desiredLateralAccel", "desiredLateralJerk", "p", "i", "f", "directionalFilter"],
|
||||
"sequence": [
|
||||
[false, 0.3, 10.0, -0.001, false, false],
|
||||
[false, 0.3, 10.0, -0.001, false, false],
|
||||
[false, 0.3, 10.0, -0.001, false, false],
|
||||
[true, 0.3, 10.0, -0.001, false, false],
|
||||
[true, 0.3, 10.0, -0.001, false, false],
|
||||
[true, 0.3, 10.0, -0.001, false, false],
|
||||
[true, 0.3, 10.0, -0.001, false, false],
|
||||
[true, 0.3, 10.0, -0.001, false, false],
|
||||
[true, 0.3, 10.0, -0.001, false, false],
|
||||
[true, 0.3, 10.0, -0.001, false, false],
|
||||
[true, 0.3, 10.0, -0.001, false, false],
|
||||
[true, 0.3, 10.0, -0.001, false, false],
|
||||
[true, 0.3, 10.0, -0.001, false, false],
|
||||
[true, 0.3, 10.0, -0.001, false, false],
|
||||
[true, 0.3, 10.0, -0.001, false, false],
|
||||
[true, 2.0, 5.0, -0.001, false, false],
|
||||
[true, 2.0, 5.0, -0.001, false, false],
|
||||
[true, 2.0, 5.0, -0.001, false, false],
|
||||
[true, 2.0, 5.0, -0.001, false, false],
|
||||
[true, 2.0, 5.0, -0.001, false, false],
|
||||
[true, 2.0, 5.0, -0.001, false, false],
|
||||
[true, 2.0, 5.0, -0.001, false, false],
|
||||
[true, 2.0, 5.0, -0.001, false, false],
|
||||
[true, 2.0, 5.0, -0.001, false, false],
|
||||
[true, 2.0, 5.0, -0.001, false, false],
|
||||
[true, 2.0, 5.0, -0.001, false, false],
|
||||
[true, 2.0, 5.0, -0.001, false, false],
|
||||
[true, 2.0, 5.0, -0.001, false, false],
|
||||
[true, 2.0, 5.0, -0.001, false, false],
|
||||
[true, 2.0, 5.0, -0.001, false, false],
|
||||
[true, 14.0, -2.0, 0.0007, false, false],
|
||||
[true, 14.0, -2.0, 0.0007, false, false],
|
||||
[true, 14.0, -2.0, 0.0007, false, false],
|
||||
[true, 14.0, -2.0, 0.0007, false, false],
|
||||
[true, 14.0, -2.0, 0.0007, false, false],
|
||||
[true, 14.0, -2.0, 0.0007, false, false],
|
||||
[true, 14.0, -2.0, 0.0007, false, false],
|
||||
[true, 14.0, -2.0, 0.0007, false, false],
|
||||
[true, 14.0, -2.0, 0.0007, false, false],
|
||||
[true, 14.0, -2.0, 0.0007, false, false],
|
||||
[true, 14.0, -2.0, 0.0007, false, false],
|
||||
[true, 14.0, -2.0, 0.0007, false, false],
|
||||
[true, 14.0, -2.0, 0.0007, false, false],
|
||||
[true, 14.0, -2.0, 0.0007, false, false],
|
||||
[true, 14.0, -2.0, 0.0007, false, false],
|
||||
[true, 14.0, -2.0, 0.0007, false, false],
|
||||
[true, 14.0, -2.0, 0.0007, false, false],
|
||||
[true, 14.0, -2.0, 0.0007, false, false],
|
||||
[true, 14.0, -2.0, 0.0007, false, false],
|
||||
[true, 14.0, -2.0, 0.0007, false, false],
|
||||
[true, 14.0, -8.0, -0.00025, false, false],
|
||||
[true, 14.0, -8.0, -0.00025, false, false],
|
||||
[true, 14.0, -8.0, -0.00025, false, false],
|
||||
[true, 14.0, -8.0, -0.00025, false, false],
|
||||
[true, 14.0, -8.0, -0.00025, false, false],
|
||||
[true, 14.0, -8.0, -0.00025, false, false],
|
||||
[true, 14.0, -8.0, -0.00025, false, false],
|
||||
[true, 14.0, -8.0, -0.00025, false, false],
|
||||
[true, 14.0, -8.0, -0.00025, false, false],
|
||||
[true, 14.0, -8.0, -0.00025, false, false],
|
||||
[true, 14.0, -8.0, -0.00025, false, false],
|
||||
[true, 14.0, -8.0, -0.00025, false, false],
|
||||
[true, 27.0, 2.0, -0.0009, false, false],
|
||||
[true, 27.0, 2.0, -0.0009, false, false],
|
||||
[true, 27.0, 2.0, -0.0009, false, false],
|
||||
[true, 27.0, 2.0, -0.0009, false, false],
|
||||
[true, 27.0, 2.0, -0.0009, false, false],
|
||||
[true, 27.0, 2.0, -0.0009, false, false],
|
||||
[true, 27.0, 2.0, -0.0009, false, false],
|
||||
[true, 27.0, 2.0, -0.0009, false, false],
|
||||
[true, 27.0, 2.0, -0.0009, false, false],
|
||||
[true, 27.0, 2.0, -0.0009, false, false],
|
||||
[true, 27.0, 2.0, -0.0009, false, false],
|
||||
[true, 27.0, 2.0, -0.0009, false, false],
|
||||
[true, 27.0, 2.0, -0.0009, false, false],
|
||||
[true, 27.0, 2.0, -0.0009, false, false],
|
||||
[true, 27.0, 2.0, -0.0009, false, false],
|
||||
[true, 27.0, 2.0, -0.0009, false, false],
|
||||
[true, 27.0, 2.0, -0.0009, false, false],
|
||||
[true, 27.0, 2.0, -0.0009, false, false],
|
||||
[true, 27.0, 2.0, -0.0009, false, false],
|
||||
[true, 27.0, 2.0, -0.0009, false, false],
|
||||
[true, 27.0, 2.0, -0.0009, false, false],
|
||||
[true, 27.0, 2.0, -0.0009, false, false],
|
||||
[true, 27.0, 2.0, -0.0009, false, false],
|
||||
[true, 27.0, 2.0, -0.0009, false, false],
|
||||
[true, 27.0, 2.0, -0.0009, false, false],
|
||||
[true, 27.0, 8.0, 0.00025, false, false],
|
||||
[true, 27.0, 8.0, 0.00025, false, false],
|
||||
[true, 27.0, 8.0, 0.00025, false, false],
|
||||
[true, 27.0, 8.0, 0.00025, false, false],
|
||||
[true, 27.0, 8.0, 0.00025, false, false],
|
||||
[true, 27.0, 8.0, 0.00025, false, false],
|
||||
[true, 27.0, 8.0, 0.00025, false, false],
|
||||
[true, 27.0, 8.0, 0.00025, false, false],
|
||||
[true, 27.0, 8.0, 0.00025, false, false],
|
||||
[true, 27.0, 8.0, 0.00025, false, false],
|
||||
[true, 27.0, 8.0, 0.00025, false, false],
|
||||
[true, 27.0, 8.0, 0.00025, false, false],
|
||||
[true, 20.0, 2.0, -0.0005, true, false],
|
||||
[true, 20.0, 2.0, -0.0005, true, false],
|
||||
[true, 20.0, 2.0, -0.0005, true, false],
|
||||
[true, 20.0, 2.0, -0.0005, true, false],
|
||||
[true, 20.0, 2.0, -0.0005, true, false],
|
||||
[true, 20.0, 2.0, -0.0005, false, false],
|
||||
[true, 20.0, 2.0, -0.0005, false, false],
|
||||
[true, 20.0, 2.0, -0.0005, false, false],
|
||||
[true, 20.0, 2.0, -0.0005, false, false],
|
||||
[true, 20.0, 2.0, -0.0005, false, false],
|
||||
[true, 20.0, 2.0, -0.0005, false, false],
|
||||
[true, 20.0, 2.0, -0.0005, false, false],
|
||||
[true, 20.0, 2.0, -0.0005, false, false],
|
||||
[true, 20.0, 2.0, 0.008, false, true],
|
||||
[true, 20.0, 2.0, 0.008, false, true],
|
||||
[true, 20.0, 2.0, 0.008, false, true],
|
||||
[true, 20.0, 2.0, 0.008, false, true],
|
||||
[true, 20.0, 2.0, 0.008, false, true],
|
||||
[true, 30.0, -3.0, 0.009, false, false],
|
||||
[true, 30.0, -3.0, 0.009, false, false],
|
||||
[true, 30.0, -3.0, 0.009, false, false],
|
||||
[true, 30.0, -3.0, 0.009, false, false],
|
||||
[true, 30.0, -3.0, 0.009, false, false],
|
||||
[true, 30.0, -3.0, 0.009, false, false],
|
||||
[true, 30.0, -3.0, 0.009, false, false],
|
||||
[true, 30.0, -3.0, 0.009, false, false],
|
||||
[true, 30.0, -3.0, 0.009, false, false],
|
||||
[true, 30.0, -3.0, 0.009, false, false],
|
||||
[true, 30.0, -3.0, 0.009, false, false],
|
||||
[true, 30.0, -3.0, 0.009, false, false],
|
||||
[true, 30.0, 3.0, -0.009, false, false],
|
||||
[true, 30.0, 3.0, -0.009, false, false],
|
||||
[true, 30.0, 3.0, -0.009, false, false],
|
||||
[true, 30.0, 3.0, -0.009, false, false],
|
||||
[true, 30.0, 3.0, -0.009, false, false],
|
||||
[true, 30.0, 3.0, -0.009, false, false],
|
||||
[true, 30.0, 3.0, -0.009, false, false],
|
||||
[true, 30.0, 3.0, -0.009, false, false],
|
||||
[true, 30.0, 3.0, -0.009, false, false],
|
||||
[true, 30.0, 3.0, -0.009, false, false],
|
||||
[true, 30.0, 3.0, -0.009, false, false],
|
||||
[true, 30.0, 3.0, -0.009, false, false],
|
||||
[false, 0.0, 8.0, -0.001, false, false],
|
||||
[false, 0.0, 8.0, -0.001, false, false],
|
||||
[false, 0.0, 8.0, -0.001, false, false],
|
||||
[true, 3.0, 8.0, -0.001, false, false],
|
||||
[true, 3.0, 8.0, -0.001, false, false],
|
||||
[true, 3.0, 8.0, -0.001, false, false],
|
||||
[true, 3.0, 8.0, -0.001, false, false],
|
||||
[true, 3.0, 8.0, -0.001, false, false],
|
||||
[true, 3.0, 8.0, -0.001, false, false],
|
||||
[true, 3.0, 8.0, -0.001, false, false],
|
||||
[true, 3.0, 8.0, -0.001, false, false],
|
||||
[true, 3.0, 8.0, -0.001, false, false],
|
||||
[true, 3.0, 8.0, -0.001, false, false]
|
||||
],
|
||||
"cases": {
|
||||
"2023_default": [
|
||||
[-0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0],
|
||||
[-0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0],
|
||||
[-0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0],
|
||||
[-0.10946385067439653, -6.3100724219111726e-06, -6.310072058113292e-05, 0.1341981738805771, 1.8787743556458736e-06, 0.00032710772939026356, 0.9996100118902765],
|
||||
[-0.10883246512145582, -1.2177733879070729e-05, -0.00012177733879070729, 0.1318926364183426, 3.725271199073177e-06, 0.00031992016010917723, 0.9992295059317203],
|
||||
[-0.10824537411387734, -1.7634001778787933e-05, -0.00017634002142585814, 0.12974874675273895, 5.541753580473596e-06, 0.00031323812436312437, 0.9988582529369309],
|
||||
[-0.10769947128273318, -2.2707719836034812e-05, -0.00022707720927428454, 0.12775516510009766, 7.330325843213359e-06, 0.00030702617368660867, 0.9984960291624968],
|
||||
[-0.10719187355088806, -2.7425710868556052e-05, -0.00027425712323747575, 0.12590137124061584, 9.09294521989068e-06, 0.0003012513043358922, 0.998142616186421],
|
||||
[-0.10671988928055773, -3.181291322107427e-05, -0.0003181291394867003, 0.12417753040790558, 1.0831430699909106e-05, 0.00029588284087367356, 0.9977978007878223],
|
||||
[-0.10628102618360663, -3.589252446545288e-05, -0.00035892523010261357, 0.1225745677947998, 1.2547474398161285e-05, 0.0002908922324422747, 0.9974613748289103],
|
||||
[-0.09686010100009308, -0.00012337604130152613, -0.00033376028295606375, 0.08820036798715591, 1.378227989334846e-05, 0.00018323057156521827, 0.9971327104622644],
|
||||
[-0.09711245617035859, -0.00012103597691748291, -0.00031035972642712295, 0.08911982923746109, 1.5029957467049826e-05, 0.00018614112923387438, 0.9968120741787946],
|
||||
[-0.09734714586614258, -0.00011885998537763953, -0.00028859981102868915, 0.08997482806444168, 1.6289604900521226e-05, 0.0001888489641714841, 0.9964992693384843],
|
||||
[-0.09756540626975398, -0.00011683656339300796, -0.0002683655184227973, 0.09076987206935883, 1.7560383639647625e-05, 0.00019136829359922558, 0.9961941041558584],
|
||||
[-0.09776839378969632, -0.00011495500075398013, -0.00024954992113634944, 0.09150917828083038, 1.88415124284802e-05, 0.00019371230155229568, 0.9958963915774781],
|
||||
[-0.04090147625093484, -0.004023205488920212, -0.00023205348406918347, 0.31463244557380676, 3.578325777198188e-05, -0.22863617539405823, 0.9955856059993178],
|
||||
[-0.04097017598155184, -0.0040215784683823586, -0.00021578377345576882, 0.3147938847541809, 5.273369970382191e-05, -0.2285631000995636, 0.9952824091350698],
|
||||
[-0.0410352771200895, -0.004020065534859896, -0.0002006547583732754, 0.31494399905204773, 6.96922215865925e-05, -0.2284919172525406, 0.9949866152926238],
|
||||
[-0.041097000895768086, -0.004018658772110939, -0.00018658647604752332, 0.3150835931301117, 8.665826317155734e-05, -0.22842256724834442, 0.9946980433511353],
|
||||
[-0.04115555977774558, -0.004017350263893604, -0.00017350453708786517, 0.3152133822441101, 0.0001036312896758318, -0.22835500538349152, 0.9944165166465714],
|
||||
[-0.04121116576736435, -0.0040161339566111565, -0.000161339805345051, 0.3153340816497803, 0.00012061082088621333, -0.2282891720533371, 0.9941418628602553],
|
||||
[-0.04126399733776618, -0.004015002865344286, -0.0001500279613537714, 0.31544631719589233, 0.00013759639114141464, -0.22822502255439758, 0.9938739139103233],
|
||||
[-0.04131423253346301, -0.004013950936496258, -0.000139509211294353, 0.31555068492889404, 0.00015458758571185172, -0.22816252708435059, 0.9936125058460087],
|
||||
[-0.041362040718768846, -0.004012972582131624, -0.00012972795229870826, 0.31564775109291077, 0.00017158400441985577, -0.22810161113739014, 0.99335747874467],
|
||||
[-0.04140755778402792, -0.004012063145637512, -0.00012063248141203076, 0.3157379925251007, 0.00018858526891563088, -0.22804224491119385, 0.9931086766114875],
|
||||
[-0.04145094405318292, -0.004011217504739761, -0.00011217471183044836, 0.31582191586494446, 0.00020559107360895723, -0.22798439860343933, 0.9928659472817497],
|
||||
[-0.04149231813809619, -0.004010431002825499, -0.0001043099255184643, 0.31589996814727783, 0.00022260106925386935, -0.22792799770832062, 0.9926291423256576],
|
||||
[-0.04153181484392212, -0.004009699448943138, -9.699655493022874e-05, 0.31597253680229187, 0.0002396149793639779, -0.2278730422258377, 0.9923981169555751],
|
||||
[-0.041569535562070485, -0.004009019583463669, -9.019594290293753e-05, 0.3160400092601776, 0.0002566325129009783, -0.22781947255134583, 0.9921727299356587],
|
||||
[-0.04160559790412195, -0.004008387215435505, -8.387213165406138e-05, 0.3161027431488037, 0.0002736534224823117, -0.2277672439813614, 0.991952843493798],
|
||||
[0.39149452693873815, -0.17847982048988342, 0.17520178854465485, -0.9919443130493164, -0.0012358271051198244, -0.4408690929412842, 0.9875400426961929],
|
||||
[0.37430655796667994, -0.16218021512031555, 0.33819782733917236, -0.9469498991966248, -0.0012358271051198244, -0.4235963821411133, 0.9836890276104427],
|
||||
[0.3521089741311741, -0.14702340960502625, 0.4897659122943878, -0.9051101207733154, -0.0012358271051198244, -0.38455620408058167, 0.9802772670978159],
|
||||
[0.33180054687547955, -0.13292928040027618, 0.6307072639465332, -0.8662038445472717, -0.0012358271051198244, -0.34926027059555054, 0.9772155204395125],
|
||||
[0.3131357750502409, -0.11982330679893494, 0.7617669701576233, -0.830025315284729, -0.0012358271051198244, -0.3171355724334717, 0.9744541209523172],
|
||||
[0.2959267284560149, -0.1076362207531929, 0.8836377859115601, -0.7963834404945374, -0.0012358271051198244, -0.287752240896225, 0.9719767824781306],
|
||||
[0.2800275202058069, -0.09630359709262848, 0.9969640374183655, -0.7651001811027527, -0.0012358271051198244, -0.26078182458877563, 0.9697871497690216],
|
||||
[0.26531816675540615, -0.0857655256986618, 1.1023447513580322, -0.7360102534294128, -0.0012358271051198244, -0.23596204817295074, 0.9678939521880274],
|
||||
[0.25198985745877733, -0.07596629858016968, 1.2003370523452759, -0.7089598774909973, -0.002314679091796279, -0.2130759358406067, 0.9663002834303565],
|
||||
[0.2396477597851904, -0.06685411185026169, 1.2914588451385498, -0.6838060617446899, -0.0033552534878253937, -0.1919393688440323, 0.9649991785284114],
|
||||
[-0.09422456384566856, 0.2572912275791168, 1.2009122371673584, 0.21098390221595764, -0.003034190973266959, 0.13744576275348663, 0.9640429283994295],
|
||||
[-0.07978759632768234, 0.24887140095233917, 1.1167140007019043, 0.18774132430553436, -0.002748497761785984, 0.10748443752527237, 0.9631736928535165],
|
||||
[-0.0664175214480964, 0.241041898727417, 1.0384190082550049, 0.16612830758094788, -0.002495693741366267, 0.07983637601137161, 0.9623884128742163],
|
||||
[-0.053728477209861736, 0.23376135528087616, 0.9656134843826294, 0.14603063464164734, -0.0022734731901437044, 0.05319900065660477, 0.9616834933561276],
|
||||
[-0.04201910414965606, 0.22699125111103058, 0.8979125022888184, 0.12734206020832062, -0.0020796917378902435, 0.028771236538887024, 0.9610549332646039],
|
||||
[-0.031218250517506735, 0.22069580852985382, 0.8349581360816956, 0.10996375977993011, -0.0019123556558042765, 0.006389177404344082, 0.9604984525950518],
|
||||
[-0.021263405719875502, 0.21484176814556122, 0.77641761302948, 0.09380389004945755, -0.0017696106806397438, -0.014086096547544003, 0.960009608840235],
|
||||
[-0.012098686887233694, 0.20939815044403076, 0.7219814658164978, 0.078777015209198, -0.0016497325850650668, -0.03277546167373657, 0.9595838985390357],
|
||||
[-0.003672592715702306, 0.20433619618415833, 0.6713619828224182, 0.06480371952056885, -0.0015511182136833668, -0.04978952929377556, 0.9592168418991078],
|
||||
[0.00406393343230147, 0.19962915778160095, 0.6242915391921997, 0.05181010439991951, -0.001472276751883328, -0.06523533910512924, 0.9589040503149374],
|
||||
[0.48410737514213165, 0.18219728767871857, 0.44997286796569824, -1.1394410133361816, -0.001472276751883328, -0.6335095763206482, 0.9587681111885773],
|
||||
[0.49315757002758503, 0.16598761081695557, 0.28787603974342346, -1.1841872930526733, -0.001472276751883328, -0.6214309334754944, 0.9587904679721979],
|
||||
[0.5019417267515031, 0.15091441571712494, 0.13714411854743958, -1.225796103477478, -0.001472276751883328, -0.6114248037338257, 0.9589498270423709],
|
||||
[0.5066429697011797, 0.13689802587032318, -0.003019690979272127, -1.2644877433776855, -0.001472276751883328, -0.5896181464195251, 0.9592242556540338],
|
||||
[0.5101462535718515, 0.12386436760425568, -0.13335634768009186, -1.3004666566848755, -0.001472276751883328, -0.5670620203018188, 0.9595791248723795],
|
||||
[0.5142910196551662, 0.11174451559782028, -0.2545548677444458, -1.333923101425171, -0.001472276751883328, -0.5495010018348694, 0.9599940969615668],
|
||||
[0.5201145837768681, 0.10047440975904465, -0.36725589632987976, -1.365033745765686, -0.001472276751883328, -0.5403749346733093, 0.9604526447819721],
|
||||
[0.5266811298830298, 0.08999447524547577, -0.4720552861690521, -1.393963098526001, -0.001472276751883328, -0.535976767539978, 0.960942258826627],
|
||||
[0.5338802248892695, 0.08024930208921432, -0.5695069432258606, -1.4208643436431885, -0.0036344616673886776, -0.5336002111434937, 0.9614542357182847],
|
||||
[0.5408488076228934, 0.07118739187717438, -0.6601260900497437, -1.4458792209625244, -0.0058347126469016075, -0.5321179628372192, 0.9619831418920445],
|
||||
[0.7028698686034933, -0.11038433760404587, -0.6138433814048767, -1.9471006393432617, -0.008797692134976387, -0.6217712163925171, 0.9607405300190316],
|
||||
[0.6994011993598761, -0.1060805693268776, -0.5708056688308716, -1.9352203607559204, -0.01174259278923273, -0.6179541945457458, 0.9596426684609639],
|
||||
[0.23312593818015387, -0.2528565227985382, -0.7060651779174805, 0.0008099577389657497, -0.011739371344447136, -0.9908731579780579, 0.952430201176377],
|
||||
[0.2434041360989544, -0.2654341459274292, -0.8318413496017456, -0.010858933441340923, -0.01178255956619978, -1.025451421737671, 0.9449690078640667],
|
||||
[0.253317730894443, -0.2771299183368683, -0.9487991333007812, -0.02170969545841217, -0.011868905276060104, -1.0575085878372192, 0.9373360301855578],
|
||||
[0.26255685417824387, -0.28800567984580994, -1.0575568675994873, -0.031799692660570145, -0.01199538167566061, -1.086762547492981, 0.9295956164929802],
|
||||
[0.2710665935147652, -0.29811891913414, -1.158689260482788, -0.0411822572350502, -0.012159174308180809, -1.1133455038070679, 0.9218004861200195],
|
||||
[0.27887848906778195, -0.30752310156822205, -1.2527310848236084, -0.04990699514746666, -0.01235766801983118, -1.1375019550323486, 0.9139932139127096],
|
||||
[0.2860453251332994, -0.3162679374217987, -1.3401795625686646, -0.05802002176642418, -0.012588429264724255, -1.1594711542129517, 0.9062078294862433],
|
||||
[0.29262013944878107, -0.3243996798992157, -1.4214967489242554, -0.06556423008441925, -0.012849196791648865, -1.1794589757919312, 0.8984713202557664],
|
||||
[0.2965762375070544, -0.3319612741470337, -1.4971126317977905, -0.07257950305938721, -0.013137864880263805, -1.1887227296829224, 0.890804948172658],
|
||||
[0.29673017429383713, -0.338992714881897, -1.5674270391464233, -0.07910291105508804, -0.013452478684484959, -1.1821510791778564, 0.8832253574194441],
|
||||
[0.41061267535808227, -0.8018531799316406, -1.4575316905975342, -0.5085219144821167, -0.015475008636713028, -1.1757267713546753, 0.875901053699282],
|
||||
[0.40652346184609994, -0.7916341423988342, -1.3553414344787598, -0.4990411698818207, -0.01745983213186264, -1.1687333583831787, 0.8685500023249335],
|
||||
[0.40265765780722296, -0.782131552696228, -1.2603157758712769, -0.4902251958847046, -0.01940959133207798, -1.1617332696914673, 0.8612116165161448],
|
||||
[0.3990088976545998, -0.7732952833175659, -1.1719526052474976, -0.4820272922515869, -0.021326744928956032, -1.1547510623931885, 0.8539169219698891],
|
||||
[0.3955735707575926, -0.7650784850120544, -1.089784860610962, -0.47440415620803833, -0.02321358025074005, -1.1478044986724854, 0.8466900757753881],
|
||||
[0.3923516701322979, -0.7574377655982971, -1.0133779048919678, -0.4673154652118683, -0.025072220712900162, -1.1409056186676025, 0.8395496933996105],
|
||||
[0.3893475132440573, -0.7503328323364258, -0.9423280358314514, -0.4607238173484802, -0.026904644444584846, -1.13406240940094, 0.8325099606152043],
|
||||
[0.3865700034207256, -0.7437259554862976, -0.8762596249580383, -0.45459431409835815, -0.028712689876556396, -1.1272797584533691, 0.8255815419106031],
|
||||
[0.3840324206232294, -0.7375823259353638, -0.8148233890533447, -0.4488946199417114, -0.030498066917061806, -1.1205604076385498, 0.818772311184273],
|
||||
[0.38175135472175165, -0.7318694591522217, -0.7576946020126343, -0.44359442591667175, -0.03226236253976822, -1.1139053106307983, 0.8120879340440293],
|
||||
[0.3797449488321292, -0.7265571355819702, -0.7045711874961853, -0.4386659264564514, -0.034007057547569275, -1.1073145866394043, 0.8055323294502604],
|
||||
[0.3780300673806064, -0.7216172218322754, -0.6551723480224609, -0.434082955121994, -0.03573352470993996, -1.1007879972457886, 0.7991080348309247],
|
||||
[0.37661911222198174, -0.7170236706733704, -0.6092369556427002, -0.42982131242752075, -0.03744304180145264, -1.0943243503570557, 0.7928164947139084],
|
||||
[0.375516623653327, -0.7127522230148315, -0.5665221810340881, -0.42585843801498413, -0.039136793464422226, -1.0879226922988892, 0.7866582890856323],
|
||||
[0.3747164794461302, -0.7087802290916443, -0.5268022418022156, -0.422173410654068, -0.040815893560647964, -1.0815815925598145, 0.7806333143686989],
|
||||
[-0.20772754196718846, -0.6875587105751038, -0.3145873546600342, 0.6213363409042358, -0.038344670087099075, 0.2443287968635559, 0.7746891641094066],
|
||||
[-0.21866468578859813, -0.6678251028060913, -0.11725125461816788, 0.639644205570221, -0.03580063208937645, 0.22835691273212433, 0.768857914097388],
|
||||
[-0.21585936135228045, -0.64947509765625, 0.06624923646450043, 0.6566684246063232, -0.03318887948989868, 0.19066141545772552, 0.7629371203539954],
|
||||
[-0.21170539564628826, -0.6324115991592407, 0.23688414692878723, 0.6724991202354431, -0.030514167621731758, 0.18755827844142914, 0.7569298493810652],
|
||||
[-0.20825468733893712, -0.6165444254875183, 0.3955555260181427, 0.6872198581695557, -0.027780907228589058, 0.1886463463306427, 0.7509517971922638],
|
||||
[-0.20765131927666683, -0.6017897725105286, 0.5431021451950073, 0.7009085416793823, -0.024993203580379486, 0.189396932721138, 0.7449545261546827],
|
||||
[-0.20931310703436964, -0.5880696177482605, 0.6803039908409119, 0.7136374115943909, -0.022154873237013817, 0.1900661140680313, 0.7388997712783383],
|
||||
[-0.2119479932436941, -0.5753113627433777, 0.8078863620758057, 0.7254738807678223, -0.019269464537501335, 0.19072134792804718, 0.7327627342863612],
|
||||
[-0.214879791806119, -0.5634476542472839, 0.9265236854553223, 0.7364804148674011, -0.016340281814336777, 0.19137808680534363, 0.726534773886686],
|
||||
[-0.21783949300901684, -0.552415668964386, 1.0368430614471436, 0.7467153668403625, -0.013370390981435776, 0.1920388787984848, 0.72022400558647],
|
||||
[-0.4000595975484858, 0.27866479754447937, 0.9641480445861816, 1.5177505016326904, -0.013370390981435776, 0.21871788799762726, 0.724840854185572],
|
||||
[-0.3994851887388485, 0.27190497517585754, 0.8965498208999634, 1.511479139328003, -0.007358826231211424, 0.21651430428028107, 0.7293932460262814],
|
||||
[-0.12559398326384016, 0.16584111750125885, 0.6584112048149109, 0.5665791034698486, -0.007358826231211424, -0.08538465946912766, 0.7349058161108437],
|
||||
[-0.10789803604675546, 0.1436968892812729, 0.43696895241737366, 0.5290815234184265, -0.007358826231211424, -0.11545012146234512, 0.7405128616799562],
|
||||
[-0.0862580050786427, 0.1231052428483963, 0.2310524582862854, 0.4942130148410797, -0.007358826231211424, -0.16420002281665802, 0.7461701549526497],
|
||||
[-0.07228152550883607, 0.10395731776952744, 0.039573147892951965, 0.46178919076919556, -0.007358826231211424, -0.18570244312286377, 0.7518367441941683],
|
||||
[-0.059641074877463084, 0.08615188300609589, -0.13848116993904114, 0.4316386580467224, -0.007358826231211424, -0.2014855146408081, 0.7574720838700055],
|
||||
[-0.048077934326112653, 0.06959482282400131, -0.3040517568588257, 0.40360206365585327, -0.005887060891836882, -0.2165762484073639, 0.7630477127348814],
|
||||
[-0.032830461086908264, 0.05419861152768135, -0.4580138921737671, 0.37753111124038696, -0.005887060891836882, -0.24716003239154816, 0.768545673778488],
|
||||
[-0.019114990494410455, 0.03988185524940491, -0.6011814475059509, 0.35328808426856995, -0.005887060891836882, -0.2746863067150116, 0.7739557730076617],
|
||||
[-0.006568739275635086, 0.026568876579403877, -0.7343112230300903, 0.33074474334716797, -0.005887060891836882, -0.29983335733413696, 0.7792738195520029],
|
||||
[0.005020647807338746, 0.014189294539391994, -0.8581070303916931, 0.3097819983959198, -0.005887060891836882, -0.32303452491760254, 0.7844993819957966],
|
||||
[0.22014447128082382, -0.2797943651676178, -0.7979435324668884, -0.18803030252456665, -0.006316260434687138, -0.632738471031189, 0.7807180815256229],
|
||||
[0.2115738977363323, -0.27419981360435486, -0.7419981956481934, -0.178556889295578, -0.006723836064338684, -0.6094859838485718, 0.777189561263008],
|
||||
[0.20363067710926294, -0.26899752020835876, -0.6899752616882324, -0.16974768042564392, -0.007111303508281708, -0.5878965258598328, 0.7739044654886423],
|
||||
[-0.5364496390516296, -0.24663199484348297, -0.4663200080394745, -0.13187538087368011, -0.007111303508281708, 2.147817850112915, 0.7714640447550488],
|
||||
[-0.5626995659039997, -0.22583456337451935, -0.25834566354751587, -0.09665840119123459, -0.007111303508281708, 2.1954567432403564, 0.7699120400719075],
|
||||
[-0.5788702079428418, -0.2064952701330185, -0.06495276838541031, -0.06391053646802902, -0.007111303508281708, 2.2071051597595215, 0.7692452258750052],
|
||||
[-0.5566819383639362, -0.1885119080543518, 0.11488097161054611, -0.033458687365055084, -0.007111303508281708, 2.100590705871582, 0.7693473090415099],
|
||||
[-0.5595099396933427, -0.17178937792778015, 0.2821062207221985, -0.005141880363225937, -0.007111303508281708, 2.100940704345703, 0.7700537236118319],
|
||||
[-0.7111987419920223, -0.4062393009662628, 0.4376069903373718, -0.7280921936035156, -0.01135850790888071, 5.69326639175415, 0.7638278009790337],
|
||||
[-0.6951031781564898, -0.39177948236465454, 0.5822052955627441, -0.7190147042274475, -0.015552760101854801, 5.644999980926514, 0.7576461193038383],
|
||||
[-0.6882315389308565, -0.3783334493637085, 0.7166655659675598, -0.7105735540390015, -0.019697772338986397, 5.596573829650879, 0.7514720746944674],
|
||||
[-0.6852953059998048, -0.3658301532268524, 0.8416985273361206, -0.7027242183685303, -0.02379699796438217, 5.547639846801758, 0.7452774336652609],
|
||||
[-0.6838971368725925, -0.3542034924030304, 0.9579651951789856, -0.695425271987915, -0.027853645384311676, 5.497928619384766, 0.7390478495218085],
|
||||
[-0.8196721119253407, 7.306608200073242, 1.0660802125930786, 4.113862037658691, -0.027853645384311676, 6.132761478424072, 0.7446808313863519],
|
||||
[-0.8196721119253435, 7.316661357879639, 1.1666151285171509, 4.12017297744751, -0.027853645384311676, 6.175716876983643, 0.7501764234493237],
|
||||
[-0.8196721119253461, 7.326010227203369, 1.2601011991500854, 4.126042366027832, -0.027853645384311676, 6.21760368347168, 0.7555379766814936],
|
||||
[-0.8196721119253482, 7.33470344543457, 1.347032904624939, 4.131499290466309, -0.027853645384311676, 6.258456707000732, 0.7607687603226371],
|
||||
[-0.8196721119253502, 7.34278678894043, 1.4278696775436401, 4.1365742683410645, -0.027853645384311676, 6.298305988311768, 0.765871963874974],
|
||||
[-0.819672111925403, 8.232775688171387, 1.327759027481079, 4.695289611816406, -0.027853645384311676, 6.337148666381836, 0.7708506990480516],
|
||||
[-0.8196721119254029, 8.223466873168945, 1.2346673011779785, 4.689445495605469, -0.027853645384311676, 6.375036239624023, 0.775708001655932],
|
||||
[0.21049512553768698, 8.197281837463379, 0.9728226065635681, 5.45698881149292, 0.003978789318352938, -6.231379508972168, 0.780446833468498],
|
||||
[0.2167229865238455, 8.172933578491211, 0.7293363809585571, 5.441702842712402, 0.03572205454111099, -6.270630836486816, 0.7850700840173425],
|
||||
[0.22259849652426045, 8.15029239654541, 0.5029214024543762, 5.427489280700684, 0.06738241016864777, -6.309582233428955, 0.7895805723576782],
|
||||
[0.22835713541223146, 8.12923812866211, 0.2923808693885803, 5.414271831512451, 0.09896565973758698, -6.349024772644043, 0.7939810487872736],
|
||||
[0.23442855370863105, 8.109660148620605, 0.09660171717405319, 5.401981353759766, 0.13047721982002258, -6.390467166900635, 0.7982741965234642],
|
||||
[0.248353420679028, 8.09145450592041, -0.08545099198818207, 5.390552520751953, 0.16192211210727692, -6.4614481925964355, 0.8020599373232822],
|
||||
[0.25067633677385975, 8.074525833129883, -0.2547396421432495, 5.379924774169922, 0.19330500066280365, -6.4907050132751465, 0.8054052405018639],
|
||||
[0.25126092480715734, 8.058784484863281, -0.41215911507606506, 5.37004280090332, 0.22463025152683258, -6.514287948608398, 0.808214631238123],
|
||||
[0.250099985295841, 8.044145584106445, -0.5585416555404663, 5.36085319519043, 0.25590190291404724, -6.532121181488037, 0.8103390489042367],
|
||||
[0.24689576802597524, 8.030533790588379, -0.694661021232605, 5.3523077964782715, 0.2871236801147461, -6.543070316314697, 0.8116433931864653],
|
||||
[0.8196721119254027, -8.164595603942871, -0.6459569931030273, -4.814634799957275, 0.2871236801147461, -7.163768768310547, 0.8135545394151179],
|
||||
[0.8196721119254027, -8.160066604614258, -0.6006677150726318, -4.81179141998291, 0.2871236801147461, -7.178984642028809, 0.8154190723211203],
|
||||
[-0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0],
|
||||
[-0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0],
|
||||
[-0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0],
|
||||
[0.6282397257481224, -0.0759519413113594, 0.05048057436943054, -2.187089681625366, -0.0002551604702603072, -0.3603832423686981, 0.9991124139302132],
|
||||
[0.5691325038955412, -0.0712578147649765, 0.09742186218500137, -1.9766871929168701, -0.00048577398410998285, -0.35422271490097046, 0.9982771386678583],
|
||||
[0.5141920378419026, -0.06689280271530151, 0.14107200503349304, -1.781036376953125, -0.0006935615674592555, -0.3485835790634155, 0.9974910563680077],
|
||||
[0.4631199568724304, -0.06283382326364517, 0.18166175484657288, -1.5991029739379883, -0.0008801235817372799, -0.34340646862983704, 0.9967511103297959],
|
||||
[0.4156403360710332, -0.05905943363904953, 0.21940568089485168, -1.4299253225326538, -0.0010469482513144612, -0.33864158391952515, 0.996054354716816],
|
||||
[0.37152292685438515, -0.05554967001080513, 0.2545033097267151, -1.272608995437622, -0.0011954192304983735, -0.3343393802642822, 0.9953979847183112],
|
||||
[0.33049756880200193, -0.05228598415851593, 0.2871401607990265, -1.1263223886489868, -0.0013268234906718135, -0.3303412199020386, 0.9947793526160259],
|
||||
[-0.5128558334344437, 0.01770082116127014, 0.2670082151889801, 2.0106611251831055, -0.0013268234906718135, -0.26141688227653503, 0.9947870032699171],
|
||||
[-0.489527715216843, 0.015828775241971016, 0.24828776717185974, 1.9267513751983643, -0.001102035865187645, -0.26311376690864563, 0.9947971654884007],
|
||||
[-0.46783530644871996, 0.014087983407080173, 0.23087982833385468, 1.8487247228622437, -0.0008863512775860727, -0.2646978199481964, 0.9948095529007845]
|
||||
],
|
||||
"2023_tuned": [
|
||||
[-0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0],
|
||||
[-0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0],
|
||||
[-0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0],
|
||||
[-0.10946365319690253, -6.3100724219111726e-06, -6.310072058113292e-05, 0.1341981738805771, 1.8787743556458736e-06, 0.00032638496486470103, 0.9996100118902765],
|
||||
[-0.10883226781007806, -1.2177733879070729e-05, -0.00012177733879070729, 0.1318926364183426, 3.725271199073177e-06, 0.0003191980067640543, 0.9992295059317203],
|
||||
[-0.10824517696030346, -1.7634001778787933e-05, -0.00017634002142585814, 0.12974874675273895, 5.541753580473596e-06, 0.00031251655309461057, 0.9988582529369309],
|
||||
[-0.10769927427915203, -2.2707719836034812e-05, -0.00022707720927428454, 0.12775516510009766, 7.330325843213359e-06, 0.00030630515539087355, 0.9984960291624968],
|
||||
[-0.10719167668995669, -2.7425710868556052e-05, -0.00027425712323747575, 0.12590137124061584, 9.09294521989068e-06, 0.0003005308099091053, 0.998142616186421],
|
||||
[-0.10671969255537025, -3.181291322107427e-05, -0.0003181291394867003, 0.12417753040790558, 1.0831430699909106e-05, 0.0002951628412120044, 0.9977978007878223],
|
||||
[-0.10628082958766569, -3.589252446545288e-05, -0.00035892523010261357, 0.1225745677947998, 1.2547474398161285e-05, 0.00029017269844189286, 0.9974613748289103],
|
||||
[-0.0968599058624398, -0.00012337604130152613, -0.00033376028295606375, 0.08820036798715591, 1.378227989334846e-05, 0.00018251637811772525, 0.9971327104622644],
|
||||
[-0.09711226105667088, -0.00012103597691748291, -0.00031035972642712295, 0.08911982923746109, 1.5029957467049826e-05, 0.0001854270085459575, 0.9968120741787946],
|
||||
[-0.09734695077753276, -0.00011885998537763953, -0.00028859981102868915, 0.08997482806444168, 1.6289604900521226e-05, 0.00018813494534697384, 0.9964992693384843],
|
||||
[-0.09756521120718856, -0.00011683656339300796, -0.0002683655184227973, 0.09076987206935883, 1.7560383639647625e-05, 0.0001906543766381219, 0.9961941041558584],
|
||||
[-0.09776819875400798, -0.00011495500075398013, -0.00024954992113634944, 0.09150917828083038, 1.88415124284802e-05, 0.00019299845735076815, 0.9958963915774781],
|
||||
[-0.04038609594503885, -0.004023205488920212, -0.00023205348406918347, 0.31463244557380676, 3.578325777198188e-05, -0.23052246868610382, 0.9955856059993178],
|
||||
[-0.04045497259462703, -0.0040215784683823586, -0.00021578377345576882, 0.3147938847541809, 5.273369970382191e-05, -0.23044875264167786, 0.9952824091350698],
|
||||
[-0.04052024540574341, -0.004020065534859896, -0.0002006547583732754, 0.31494399905204773, 6.96922215865925e-05, -0.2303769439458847, 0.9949866152926238],
|
||||
[-0.04058213580150532, -0.004018658772110939, -0.00018658647604752332, 0.3150835931301117, 8.665826317155734e-05, -0.2303069829940796, 0.9946980433511353],
|
||||
[-0.04064085643555087, -0.004017350263893604, -0.00017350453708786517, 0.3152133822441101, 0.0001036312896758318, -0.23023882508277893, 0.9944165166465714],
|
||||
[-0.04069661948485031, -0.0040161339566111565, -0.000161339805345051, 0.3153340816497803, 0.00012061082088621333, -0.23017242550849915, 0.9941418628602553],
|
||||
[-0.04074960358984859, -0.004015002865344286, -0.0001500279613537714, 0.31544631719589233, 0.00013759639114141464, -0.23010770976543427, 0.9938739139103233],
|
||||
[-0.040799986954527745, -0.004013950936496258, -0.000139509211294353, 0.31555068492889404, 0.00015458758571185172, -0.2300446629524231, 0.9936125058460087],
|
||||
[-0.04084793909529766, -0.004012972582131624, -0.00012972795229870826, 0.31564775109291077, 0.00017158400441985577, -0.22998322546482086, 0.99335747874467],
|
||||
[-0.040893596047652886, -0.004012063145637512, -0.00012063248141203076, 0.3157379925251007, 0.00018858526891563088, -0.22992335259914398, 0.9931086766114875],
|
||||
[-0.040937118274140864, -0.004011217504739761, -0.00011217471183044836, 0.31582191586494446, 0.00020559107360895723, -0.22986499965190887, 0.9928659472817497],
|
||||
[-0.0409786245190571, -0.004010431002825499, -0.0001043099255184643, 0.31589996814727783, 0.00022260106925386935, -0.22980812191963196, 0.9926291423256576],
|
||||
[-0.041018249714166545, -0.004009699448943138, -9.699655493022874e-05, 0.31597253680229187, 0.0002396149793639779, -0.22975268959999084, 0.9923981169555751],
|
||||
[-0.041056095371993916, -0.004009019583463669, -9.019594290293753e-05, 0.3160400092601776, 0.0002566325129009783, -0.22969865798950195, 0.9921727299356587],
|
||||
[-0.041092279220044096, -0.004008387215435505, -8.387213165406138e-05, 0.3161027431488037, 0.0002736534224823117, -0.2296459972858429, 0.991952843493798],
|
||||
[0.3910602049801107, -0.17847982048988342, 0.17520178854465485, -0.9919443130493164, -0.0012358271051198244, -0.43927818536758423, 0.9875400426961929],
|
||||
[0.3728127754776832, -0.16218021512031555, 0.33819782733917236, -0.9469498991966248, -0.0012358271051198244, -0.418121874332428, 0.9836890276104427],
|
||||
[0.3507208261109926, -0.14702340960502625, 0.4897659122943878, -0.9051101207733154, -0.0012358271051198244, -0.3794669806957245, 0.9802772670978159],
|
||||
[0.33052168875038607, -0.13292928040027618, 0.6307072639465332, -0.8662038445472717, -0.0012358271051198244, -0.34457075595855713, 0.9772155204395125],
|
||||
[0.31196315588541873, -0.11982330679893494, 0.7617669701576233, -0.830025315284729, -0.0012358271051198244, -0.31283509731292725, 0.9744541209523172],
|
||||
[0.2948547458290457, -0.1076362207531929, 0.8836377859115601, -0.7963834404945374, -0.0012358271051198244, -0.2838205397129059, 0.9719767824781306],
|
||||
[0.27904976480994237, -0.09630359709262848, 0.9969640374183655, -0.7651001811027527, -0.0012358271051198244, -0.25719547271728516, 0.9697871497690216],
|
||||
[0.2644281689694541, -0.0857655256986618, 1.1023447513580322, -0.7360102534294128, -0.0012358271051198244, -0.23269745707511902, 0.9678939521880274],
|
||||
[0.25118140077284884, -0.07596629858016968, 1.2003370523452759, -0.7089598774909973, -0.002314679091796279, -0.2101103514432907, 0.9663002834303565],
|
||||
[0.2389150006695386, -0.06685411185026169, 1.2914588451385498, -0.6838060617446899, -0.0033552534878253937, -0.1892513930797577, 0.9649991785284114],
|
||||
[-0.07901424315348991, 0.2572912275791168, 1.2009122371673584, 0.21098390221595764, -0.003034190973266959, 0.08168985694646835, 0.9640429283994295],
|
||||
[-0.06462022053982568, 0.24887140095233917, 1.1167140007019043, 0.18774132430553436, -0.002748497761785984, 0.051885414868593216, 0.9631736928535165],
|
||||
[-0.051341863217181795, 0.241041898727417, 1.0384190082550049, 0.16612830758094788, -0.002495693741366267, 0.024573015049099922, 0.9623884128742163],
|
||||
[-0.038794570414420915, 0.23376135528087616, 0.9656134843826294, 0.14603063464164734, -0.0022734731901437044, -0.0015452472725883126, 0.9616834933561276],
|
||||
[-0.02727243474777478, 0.22699125111103058, 0.8979125022888184, 0.12734206020832062, -0.0020796917378902435, -0.025287091732025146, 0.9610549332646039],
|
||||
[-0.016701299459840592, 0.22069580852985382, 0.8349581360816956, 0.10996375977993011, -0.0019123556558042765, -0.046827398240566254, 0.9604984525950518],
|
||||
[-0.007015004831310648, 0.21484176814556122, 0.77641761302948, 0.09380389004945755, -0.0017696106806397438, -0.06631841510534286, 0.960009608840235],
|
||||
[0.0018467047985609802, 0.20939815044403076, 0.7219814658164978, 0.078777015209198, -0.0016497325850650668, -0.08389700949192047, 0.9595838985390357],
|
||||
[0.00994047632837133, 0.20433619618415833, 0.6713619828224182, 0.06480371952056885, -0.0015511182136833668, -0.09969261288642883, 0.9592168418991078],
|
||||
[0.01732120216671505, 0.19962915778160095, 0.6242915391921997, 0.05181010439991951, -0.001472276751883328, -0.11383365094661713, 0.9589040503149374],
|
||||
[0.5091351260568596, 0.18219728767871857, 0.44997286796569824, -1.1394410133361816, -0.001472276751883328, -0.7252450585365295, 0.9587681111885773],
|
||||
[0.5139989779286086, 0.16598761081695557, 0.28787603974342346, -1.1841872930526733, -0.001472276751883328, -0.6978006362915039, 0.9587904679721979],
|
||||
[0.5185418167319423, 0.15091441571712494, 0.13714411854743958, -1.225796103477478, -0.001472276751883328, -0.6722335815429688, 0.9589498270423709],
|
||||
[0.51885924037396, 0.13689802587032318, -0.003019690979272127, -1.2644877433776855, -0.001472276751883328, -0.6343601942062378, 0.9592242556540338],
|
||||
[0.5173505210709428, 0.12386436760425568, -0.13335634768009186, -1.3004666566848755, -0.001472276751883328, -0.593455970287323, 0.9595791248723795],
|
||||
[0.5184302249753999, 0.11174451559782028, -0.2545548677444458, -1.333923101425171, -0.001472276751883328, -0.5646713376045227, 0.9599940969615668],
|
||||
[0.5224928584304824, 0.10047440975904465, -0.36725589632987976, -1.365033745765686, -0.001472276751883328, -0.5490943193435669, 0.9604526447819721],
|
||||
[0.5280438958049607, 0.08999447524547577, -0.4720552861690521, -1.393963098526001, -0.001472276751883328, -0.5409742593765259, 0.960942258826627],
|
||||
[0.5346631335970315, 0.08024930208921432, -0.5695069432258606, -1.4208643436431885, -0.0036344616673886776, -0.5364716649055481, 0.9614542357182847],
|
||||
[0.5413127450841172, 0.07118739187717438, -0.6601260900497437, -1.4458792209625244, -0.0058347126469016075, -0.5338196754455566, 0.9619831418920445],
|
||||
[0.7082116168003382, -0.11038433760404587, -0.6138433814048767, -1.9471006393432617, -0.008797692134976387, -0.6413612365722656, 0.9607405300190316],
|
||||
[0.7042939608425406, -0.1060805693268776, -0.5708056688308716, -1.9352203607559204, -0.01174259278923273, -0.6358973979949951, 0.9596426684609639],
|
||||
[0.24831279792116212, -0.2528565227985382, -0.7060651779174805, 0.0008099577389657497, -0.011739371344447136, -1.0561350584030151, 0.952430201176377],
|
||||
[0.2605646218326958, -0.2654341459274292, -0.8318413496017456, -0.010858933441340923, -0.01178255956619978, -1.09934401512146, 0.9449690078640667],
|
||||
[0.2718220379521747, -0.2771299183368683, -0.9487991333007812, -0.02170969545841217, -0.011868905276060104, -1.1372101306915283, 0.9373360301855578],
|
||||
[0.28187099517007774, -0.28800567984580994, -1.0575568675994873, -0.031799692660570145, -0.01199538167566061, -1.1699283123016357, 0.9295956164929802],
|
||||
[0.2907922906315725, -0.29811891913414, -1.158689260482788, -0.0411822572350502, -0.012159174308180809, -1.1982460021972656, 0.9218004861200195],
|
||||
[0.29874013254349824, -0.30752310156822205, -1.2527310848236084, -0.04990699514746666, -0.01235766801983118, -1.2229489088058472, 0.9139932139127096],
|
||||
[0.30586049504387924, -0.3162679374217987, -1.3401795625686646, -0.05802002176642418, -0.012588429264724255, -1.2446823120117188, 0.9062078294862433],
|
||||
[0.31227171779225527, -0.3243996798992157, -1.4214967489242554, -0.06556423008441925, -0.012849196791648865, -1.2639342546463013, 0.8984713202557664],
|
||||
[0.31613837939627004, -0.3319612741470337, -1.4971126317977905, -0.07257950305938721, -0.013137864880263805, -1.2727845907211304, 0.890804948172658],
|
||||
[0.31598466647005247, -0.338992714881897, -1.5674270391464233, -0.07910291105508804, -0.013452478684484959, -1.2648652791976929, 0.8832253574194441],
|
||||
[0.412307398886842, -0.8018531799316406, -1.4575316905975342, -0.5085219144821167, -0.015475008636713028, -1.1827421188354492, 0.875901053699282],
|
||||
[0.40834035227403603, -0.7916341423988342, -1.3553414344787598, -0.4990411698818207, -0.01745983213186264, -1.1762652397155762, 0.8685500023249335],
|
||||
[0.40459407470573316, -0.782131552696228, -1.2603157758712769, -0.4902251958847046, -0.01940959133207798, -1.1697709560394287, 0.8612116165161448],
|
||||
[0.4010615788878822, -0.7732952833175659, -1.1719526052474976, -0.4820272922515869, -0.021326744928956032, -1.1632810831069946, 0.8539169219698891],
|
||||
[0.39773876014683174, -0.7650784850120544, -1.089784860610962, -0.47440415620803833, -0.02321358025074005, -1.1568107604980469, 0.8466900757753881],
|
||||
[0.3946252502771808, -0.7574377655982971, -1.0133779048919678, -0.4673154652118683, -0.025072220712900162, -1.1503701210021973, 0.8395496933996105],
|
||||
[0.3917251408411536, -0.7503328323364258, -0.9423280358314514, -0.4607238173484802, -0.026904644444584846, -1.1439656019210815, 0.8325099606152043],
|
||||
[0.38904724328331075, -0.7437259554862976, -0.8762596249580383, -0.45459431409835815, -0.028712689876556396, -1.1376007795333862, 0.8255815419106031],
|
||||
[0.3866048728576752, -0.7375823259353638, -0.8148233890533447, -0.4488946199417114, -0.030498066917061806, -1.1312776803970337, 0.818772311184273],
|
||||
[0.3844147674325609, -0.7318694591522217, -0.7576946020126343, -0.44359442591667175, -0.03226236253976822, -1.1249967813491821, 0.8120879340440293],
|
||||
[0.38249530688908656, -0.7265571355819702, -0.7045711874961853, -0.4386659264564514, -0.034007057547569275, -1.118757963180542, 0.8055323294502604],
|
||||
[0.3808636470380862, -0.7216172218322754, -0.6551723480224609, -0.434082955121994, -0.03573352470993996, -1.1125606298446655, 0.7991080348309247],
|
||||
[0.3795324926695101, -0.7170236706733704, -0.6092369556427002, -0.42982131242752075, -0.03744304180145264, -1.106404185295105, 0.7928164947139084],
|
||||
[0.37850665054287286, -0.7127522230148315, -0.5665221810340881, -0.42585843801498413, -0.039136793464422226, -1.100287675857544, 0.7866582890856323],
|
||||
[0.3777801819633453, -0.7087802290916443, -0.5268022418022156, -0.422173410654068, -0.040815893560647964, -1.094210147857666, 0.7806333143686989],
|
||||
[-0.20729777909370484, -0.6875587105751038, -0.3145873546600342, 0.6213363409042358, -0.038344670087099075, 0.2426171749830246, 0.7746891641094066],
|
||||
[-0.21818560264028714, -0.6678251028060913, -0.11725125461816788, 0.639644205570221, -0.03580063208937645, 0.22653359174728394, 0.768857914097388],
|
||||
[-0.21585936156737215, -0.64947509765625, 0.06624923646450043, 0.6566684246063232, -0.03318887948989868, 0.19066141545772552, 0.7629371203539954],
|
||||
[-0.21170539606511912, -0.6324115991592407, 0.23688414692878723, 0.6724991202354431, -0.030514167621731758, 0.18755827844142914, 0.7569298493810652],
|
||||
[-0.2082546880932433, -0.6165444254875183, 0.3955555260181427, 0.6872198581695557, -0.027780907228589058, 0.1886463463306427, 0.7509517971922638],
|
||||
[-0.20765132059944635, -0.6017897725105286, 0.5431021451950073, 0.7009085416793823, -0.024993203580379486, 0.1893969476222992, 0.7449545261546827],
|
||||
[-0.20931310928896568, -0.5880696177482605, 0.6803039908409119, 0.7136374115943909, -0.022154873237013817, 0.1900661289691925, 0.7388997712783383],
|
||||
[-0.21194799696328787, -0.5753113627433777, 0.8078863620758057, 0.7254738807678223, -0.019269464537501335, 0.19072136282920837, 0.7327627342863612],
|
||||
[-0.21487979774071636, -0.5634476542472839, 0.9265236854553223, 0.7364804148674011, -0.016340281814336777, 0.19137810170650482, 0.726534773886686],
|
||||
[-0.217839502176056, -0.552415668964386, 1.0368430614471436, 0.7467153668403625, -0.013370390981435776, 0.19203892350196838, 0.72022400558647],
|
||||
[-0.3953891079754344, 0.27866479754447937, 0.9641480445861816, 1.5177505016326904, -0.013370390981435776, 0.1986016035079956, 0.724840854185572],
|
||||
[-0.39486614266660935, 0.27190497517585754, 0.8965498208999634, 1.511479139328003, -0.007358826231211424, 0.19661948084831238, 0.7293932460262814],
|
||||
[-0.10759649751357757, 0.16584111750125885, 0.6584112048149109, 0.5665791034698486, -0.007358826231211424, -0.15328480303287506, 0.7349058161108437],
|
||||
[-0.09036072132795119, 0.1436968892812729, 0.43696895241737366, 0.5290815234184265, -0.007358826231211424, -0.18148404359817505, 0.7405128616799562],
|
||||
[-0.07369937041296183, 0.1231052428483963, 0.2310524582862854, 0.4942130148410797, -0.007358826231211424, -0.21117648482322693, 0.7461701549526497],
|
||||
[-0.06381701228028135, 0.10395731776952744, 0.039573147892951965, 0.46178919076919556, -0.007358826231211424, -0.217171773314476, 0.7518367441941683],
|
||||
[-0.055415743881643206, 0.08615188300609589, -0.13848116993904114, 0.4316386580467224, -0.007358826231211424, -0.21726959943771362, 0.7574720838700055],
|
||||
[-0.0466145040604287, 0.06959482282400131, -0.3040517568588257, 0.40360206365585327, -0.005887060891836882, -0.22208988666534424, 0.7630477127348814],
|
||||
[-0.03318032454594341, 0.05419861152768135, -0.4580138921737671, 0.37753111124038696, -0.005887060891836882, -0.24583345651626587, 0.768545673778488],
|
||||
[-0.020609027396592147, 0.03988185524940491, -0.6011814475059509, 0.35328808426856995, -0.005887060891836882, -0.26900291442871094, 0.7739557730076617],
|
||||
[-0.00884738160424083, 0.026568876579403877, -0.7343112230300903, 0.33074474334716797, -0.005887060891836882, -0.29115262627601624, 0.7792738195520029],
|
||||
[0.0021526107575593704, 0.014189294539391994, -0.8581070303916931, 0.3097819983959198, -0.005887060891836882, -0.3121010661125183, 0.7844993819957966],
|
||||
[0.23092860055943876, -0.2797943651676178, -0.7979435324668884, -0.18803030252456665, -0.006316260434687138, -0.6732545495033264, 0.7807180815256229],
|
||||
[0.22203645253943774, -0.27419981360435486, -0.7419981956481934, -0.178556889295578, -0.006723836064338684, -0.6487880349159241, 0.777189561263008],
|
||||
[0.21375181990764777, -0.26899752020835876, -0.6899752616882324, -0.16974768042564392, -0.007111303508281708, -0.6259075403213501, 0.7739044654886423],
|
||||
[-0.5908803176998131, -0.24663199484348297, -0.4663200080394745, -0.13187538087368011, -0.007111303508281708, 2.3516433238983154, 0.7714640447550488],
|
||||
[-0.6025141066934809, -0.22583456337451935, -0.25834566354751587, -0.09665840119123459, -0.007111303508281708, 2.343456745147705, 0.7699120400719075],
|
||||
[-0.6035832997589058, -0.2064952701330185, -0.06495276838541031, -0.06391053646802902, -0.007111303508281708, 2.2982985973358154, 0.7692452258750052],
|
||||
[-0.5297092393754228, -0.1885119080543518, 0.11488097161054611, -0.033458687365055084, -0.007111303508281708, 2.00077748298645, 0.7693473090415099],
|
||||
[-0.5292549307682339, -0.17178937792778015, 0.2821062207221985, -0.005141880363225937, -0.007111303508281708, 1.9879966974258423, 0.7700537236118319],
|
||||
[-0.7111987419920223, -0.4062393009662628, 0.4376069903373718, -0.7280921936035156, -0.01135850790888071, 5.69266414642334, 0.7638278009790337],
|
||||
[-0.6951031781564898, -0.39177948236465454, 0.5822052955627441, -0.7190147042274475, -0.015552760101854801, 5.643935680389404, 0.7576461193038383],
|
||||
[-0.6882315389308565, -0.3783334493637085, 0.7166655659675598, -0.7105735540390015, -0.019697772338986397, 5.59476900100708, 0.7514720746944674],
|
||||
[-0.6852953059998048, -0.3658301532268524, 0.8416985273361206, -0.7027242183685303, -0.02379699796438217, 5.54469633102417, 0.7452774336652609],
|
||||
[-0.6838971368725925, -0.3542034924030304, 0.9579651951789856, -0.695425271987915, -0.027853645384311676, 5.493298530578613, 0.7390478495218085],
|
||||
[-0.8196721119253407, 7.306608200073242, 1.0660802125930786, 4.113862037658691, -0.027853645384311676, 6.132761478424072, 0.7446808313863519],
|
||||
[-0.8196721119253435, 7.316661357879639, 1.1666151285171509, 4.12017297744751, -0.027853645384311676, 6.175716876983643, 0.7501764234493237],
|
||||
[-0.8196721119253461, 7.326010227203369, 1.2601011991500854, 4.126042366027832, -0.027853645384311676, 6.21760368347168, 0.7555379766814936],
|
||||
[-0.8196721119253482, 7.33470344543457, 1.347032904624939, 4.131499290466309, -0.027853645384311676, 6.258456707000732, 0.7607687603226371],
|
||||
[-0.8196721119253502, 7.34278678894043, 1.4278696775436401, 4.1365742683410645, -0.027853645384311676, 6.298305988311768, 0.765871963874974],
|
||||
[-0.819672111925403, 8.232775688171387, 1.327759027481079, 4.695289611816406, -0.027853645384311676, 6.337148666381836, 0.7708506990480516],
|
||||
[-0.8196721119254029, 8.223466873168945, 1.2346673011779785, 4.689445495605469, -0.027853645384311676, 6.375036239624023, 0.775708001655932],
|
||||
[0.21049512553768698, 8.197281837463379, 0.9728226065635681, 5.45698881149292, 0.003978789318352938, -6.231379508972168, 0.780446833468498],
|
||||
[0.2167229865238455, 8.172933578491211, 0.7293363809585571, 5.441702842712402, 0.03572205454111099, -6.270630836486816, 0.7850700840173425],
|
||||
[0.22259849652426045, 8.15029239654541, 0.5029214024543762, 5.427489280700684, 0.06738241016864777, -6.309582233428955, 0.7895805723576782],
|
||||
[0.22835713541223146, 8.12923812866211, 0.2923808693885803, 5.414271831512451, 0.09896565973758698, -6.349024772644043, 0.7939810487872736],
|
||||
[0.23442855370863105, 8.109660148620605, 0.09660171717405319, 5.401981353759766, 0.13047721982002258, -6.390467166900635, 0.7982741965234642],
|
||||
[0.248353420679028, 8.09145450592041, -0.08545099198818207, 5.390552520751953, 0.16192211210727692, -6.4614481925964355, 0.8020599373232822],
|
||||
[0.25067633677385975, 8.074525833129883, -0.2547396421432495, 5.379924774169922, 0.19330500066280365, -6.4907050132751465, 0.8054052405018639],
|
||||
[0.25126092480715734, 8.058784484863281, -0.41215911507606506, 5.37004280090332, 0.22463025152683258, -6.514287948608398, 0.808214631238123],
|
||||
[0.250099985295841, 8.044145584106445, -0.5585416555404663, 5.36085319519043, 0.25590190291404724, -6.532121181488037, 0.8103390489042367],
|
||||
[0.24689576802597524, 8.030533790588379, -0.694661021232605, 5.3523077964782715, 0.2871236801147461, -6.543070316314697, 0.8116433931864653],
|
||||
[0.8196721119254027, -8.164595603942871, -0.6459569931030273, -4.814634799957275, 0.2871236801147461, -7.163768768310547, 0.8135545394151179],
|
||||
[0.8196721119254027, -8.160066604614258, -0.6006677150726318, -4.81179141998291, 0.2871236801147461, -7.178984642028809, 0.8154190723211203],
|
||||
[-0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0],
|
||||
[-0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0],
|
||||
[-0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0],
|
||||
[0.6300897116143003, -0.0759519413113594, 0.05048057436943054, -2.187089681625366, -0.0002551604702603072, -0.36715421080589294, 0.9991124139302132],
|
||||
[0.570021419692685, -0.0712578147649765, 0.09742186218500137, -1.9766871929168701, -0.00048577398410998285, -0.357476145029068, 0.9982771386678583],
|
||||
[0.5144052650105083, -0.06689280271530151, 0.14107200503349304, -1.781036376953125, -0.0006935615674592555, -0.3493639826774597, 0.9974910563680077],
|
||||
[0.4630606278577127, -0.06283382326364517, 0.18166175484657288, -1.5991029739379883, -0.0008801235817372799, -0.3431893289089203, 0.9967511103297959],
|
||||
[0.4156212116391389, -0.05905943363904953, 0.21940568089485168, -1.4299253225326538, -0.0010469482513144612, -0.33857160806655884, 0.996054354716816],
|
||||
[0.37150541385694374, -0.05554967001080513, 0.2545033097267151, -1.272608995437622, -0.0011954192304983735, -0.3342752754688263, 0.9953979847183112],
|
||||
[0.3304802499251104, -0.05228598415851593, 0.2871401607990265, -1.1263223886489868, -0.0013268234906718135, -0.33027783036231995, 0.9947793526160259],
|
||||
[-0.5103119485721853, 0.01770082116127014, 0.2670082151889801, 2.0106611251831055, -0.0013268234906718135, -0.27072757482528687, 0.9947870032699171],
|
||||
[-0.4871247531139276, 0.015828775241971016, 0.24828776717185974, 1.9267513751983643, -0.001102035865187645, -0.27190864086151123, 0.9947971654884007],
|
||||
[-0.4655545265752654, 0.014087983407080173, 0.23087982833385468, 1.8487247228622437, -0.0008863512775860727, -0.27304553985595703, 0.9948095529007845]
|
||||
],
|
||||
"2025_default": [
|
||||
[-0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0],
|
||||
[-0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0],
|
||||
[-0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0],
|
||||
[-0.1000419596173212, -6.3100724219111726e-06, -6.310072058113292e-05, 0.09995962679386139, 1.399434836457658e-06, 0.00010129198199138045, 0.9996100118902765],
|
||||
[-0.09957267603318784, -1.2177733879070729e-05, -0.00012177733879070729, 0.09824388474225998, 2.774849235720467e-06, 9.798955579753965e-05, 0.9992295059317203],
|
||||
[-0.09913630335274988, -1.7634001778787933e-05, -0.00017634002142585814, 0.09664839506149292, 4.127926786168246e-06, 9.492012031842023e-05, 0.9988582529369309],
|
||||
[-0.0987305336073542, -2.2707719836034812e-05, -0.00022707720927428454, 0.0951647162437439, 5.460232841869583e-06, 9.206731920130551e-05, 0.9984960291624968],
|
||||
[-0.0983532241033397, -2.7425710868556052e-05, -0.00027425712323747575, 0.09378502517938614, 6.773223049094668e-06, 8.941596024669707e-05, 0.998142616186421],
|
||||
[-0.09800238149944195, -3.181291322107427e-05, -0.0003181291394867003, 0.09250204265117645, 8.06825210020179e-06, 8.695188444107771e-05, 0.9977978007878223],
|
||||
[-0.09767614986126376, -3.589252446545288e-05, -0.00035892523010261357, 0.09130898118019104, 9.3465778263635e-06, 8.46619441290386e-05, 0.9974613748289103],
|
||||
[-0.0906673555152992, -0.00012337604130152613, -0.00033376028295606375, 0.06570431590080261, 1.0266438039252535e-05, 3.4840086300391704e-05, 0.9971327104622644],
|
||||
[-0.0908549993923562, -0.00012103597691748291, -0.00031035972642712295, 0.06638883799314499, 1.119588159781415e-05, 3.6202189221512526e-05, 0.9968120741787946],
|
||||
[-0.09102950607063971, -0.00011885998537763953, -0.00028859981102868915, 0.06702535599470139, 1.2134236385463737e-05, 3.74701339751482e-05, 0.9964992693384843],
|
||||
[-0.09119179556600669, -0.00011683656339300796, -0.0002683655184227973, 0.06761724501848221, 1.3080877579341177e-05, 3.865048711304553e-05, 0.9961941041558584],
|
||||
[-0.09134272615685958, -0.00011495500075398013, -0.00024954992113634944, 0.06816762685775757, 1.4035224921826739e-05, 3.974936407757923e-05, 0.9958963915774781],
|
||||
[-0.01996371573553552, -0.004023205488920212, -0.00023205348406918347, 0.23997238278388977, 2.695681541808881e-05, -0.23059208691120148, 0.9955856059993178],
|
||||
[-0.020020306586320584, -0.0040215784683823586, -0.00021578377345576882, 0.24009454250335693, 3.9884980651549995e-05, -0.23052002489566803, 0.9952824091350698],
|
||||
[-0.020074058243435496, -0.004020065534859896, -0.0002006547583732754, 0.24020811915397644, 5.281926496536471e-05, -0.23044979572296143, 0.9949866152926238],
|
||||
[-0.02012515337474716, -0.004018658772110939, -0.00018658647604752332, 0.24031373858451843, 6.575923907803372e-05, -0.2303813248872757, 0.9946980433511353],
|
||||
[-0.020173757713139062, -0.004017350263893604, -0.00017350453708786517, 0.24041196703910828, 7.870449917390943e-05, -0.23031458258628845, 0.9944165166465714],
|
||||
[-0.020220024205998142, -0.0040161339566111565, -0.000161339805345051, 0.24050329625606537, 9.165467781713232e-05, -0.23024950921535492, 0.9941418628602553],
|
||||
[-0.020264097164136057, -0.004015002865344286, -0.0001500279613537714, 0.2405882328748703, 0.00010460942576173693, -0.2301860749721527, 0.9938739139103233],
|
||||
[-0.020306108140690598, -0.004013950936496258, -0.000139509211294353, 0.2406671941280365, 0.00011756843014154583, -0.23012422025203705, 0.9936125058460087],
|
||||
[-0.02034618421336529, -0.004012972582131624, -0.00012972795229870826, 0.24074062705039978, 0.00013053139264229685, -0.23006391525268555, 0.99335747874467],
|
||||
[-0.020384443862206083, -0.004012063145637512, -0.00012063248141203076, 0.24080891907215118, 0.00014349802222568542, -0.23000513017177582, 0.9931086766114875],
|
||||
[-0.020420996981293797, -0.004011217504739761, -0.00011217471183044836, 0.24087241291999817, 0.00015646807150915265, -0.22994780540466309, 0.9928659472817497],
|
||||
[-0.020455940755107285, -0.004010431002825499, -0.0001043099255184643, 0.2409314513206482, 0.0001694413076620549, -0.22989189624786377, 0.9926291423256576],
|
||||
[-0.02048937620788005, -0.004009699448943138, -9.699655493022874e-05, 0.24098636209964752, 0.0001824174978537485, -0.22983740270137787, 0.9923981169555751],
|
||||
[-0.02052139167532128, -0.004009019583463669, -9.019594290293753e-05, 0.24103742837905884, 0.00019539643835742027, -0.22978425025939941, 0.9921727299356587],
|
||||
[-0.02055206694872401, -0.004008387215435505, -8.387213165406138e-05, 0.24108490347862244, 0.000208377925446257, -0.2297324240207672, 0.991952843493798],
|
||||
[0.37125703585399955, -0.17847982048988342, 0.17520178854465485, -0.9918082356452942, -0.0013008954701945186, -0.3814098834991455, 0.9875400426961929],
|
||||
[0.3563249116250143, -0.16218021512031555, 0.33819782733917236, -0.946868360042572, -0.0013008954701945186, -0.37206515669822693, 0.9836890276104427],
|
||||
[0.3400332838792249, -0.14702340960502625, 0.4897659122943878, -0.9050739407539368, -0.0013008954701945186, -0.35422003269195557, 0.9802772670978159],
|
||||
[0.3217350521682795, -0.13292928040027618, 0.6307072639465332, -0.8661898374557495, -0.0013008954701945186, -0.32572245597839355, 0.9772155204395125],
|
||||
[0.30491287464790134, -0.11982330679893494, 0.7617669701576233, -0.8300200700759888, -0.0013008954701945186, -0.29980576038360596, 0.9744541209523172],
|
||||
[0.2894013817616517, -0.1076362207531929, 0.8836377859115601, -0.7963812947273254, -0.0013008954701945186, -0.2761189341545105, 0.9719767824781306],
|
||||
[0.2750710937464448, -0.09630359709262848, 0.9969640374183655, -0.7650993466377258, -0.0013008954701945186, -0.2543935775756836, 0.9697871497690216],
|
||||
[0.26181467125900454, -0.0857655256986618, 1.1023447513580322, -0.7360098361968994, -0.0013008954701945186, -0.23441553115844727, 0.9678939521880274],
|
||||
[0.24983044597727005, -0.07596629858016968, 1.2003370523452759, -0.7089597582817078, -0.0023797473404556513, -0.21600757539272308, 0.9663002834303565],
|
||||
[0.23873606444946352, -0.06685411185026169, 1.2914588451385498, -0.6838060021400452, -0.0034203215036541224, -0.19901923835277557, 0.9649991785284114],
|
||||
[-0.0705208363838269, 0.2572912275791168, 1.2009122371673584, 0.21098388731479645, -0.0030992592219263315, 0.052963316440582275, 0.9640429283994295],
|
||||
[-0.05791127976724981, 0.24887140095233917, 1.1167140007019043, 0.1877412647008896, -0.0028135660104453564, 0.029326602816581726, 0.9631736928535165],
|
||||
[-0.04623994586562036, 0.241041898727417, 1.0384190082550049, 0.1661282330751419, -0.002560762222856283, 0.007540617138147354, 0.9623884128742163],
|
||||
[-0.03523192766033561, 0.23376135528087616, 0.9656134843826294, 0.1460305154323578, -0.0023385416716337204, -0.013294951058924198, 0.9616834933561276],
|
||||
[-0.025079714113015437, 0.22699125111103058, 0.8979125022888184, 0.1273418664932251, -0.002144760685041547, -0.0323595255613327, 0.9610549332646039],
|
||||
[-0.01572118218989378, 0.22069580852985382, 0.8349581360816956, 0.10996348410844803, -0.0019774248357862234, -0.049782607704401016, 0.9604984525950518],
|
||||
[-0.007101273280377882, 0.21484176814556122, 0.77641761302948, 0.0938035100698471, -0.0018346804426982999, -0.06567493826150894, 0.960009608840235],
|
||||
[0.0008297808296861664, 0.20939815044403076, 0.7219814658164978, 0.0787765309214592, -0.0017148031620308757, -0.08013449609279633, 0.9595838985390357],
|
||||
[0.008118299997240544, 0.20433619618415833, 0.6713619828224182, 0.0648031160235405, -0.0016161897219717503, -0.0932527706027031, 0.9592168418991078],
|
||||
[0.014808633638411376, 0.19962915778160095, 0.6242915391921997, 0.05180941894650459, -0.0015373493079096079, -0.1051197424530983, 0.9589040503149374],
|
||||
[0.4621020573416811, 0.18219728767871857, 0.44997286796569824, -1.139389991760254, -0.0015373493079096079, -0.5709168910980225, 0.9587681111885773],
|
||||
[0.4713936456137784, 0.16598761081695557, 0.28787603974342346, -1.1840639114379883, -0.0015373493079096079, -0.5606254935264587, 0.9587904679721979],
|
||||
[0.4803378636321708, 0.15091441571712494, 0.13714411854743958, -1.2255961894989014, -0.0015373493079096079, -0.5520401000976562, 0.9589498270423709],
|
||||
[0.48935347370831944, 0.13689802587032318, -0.003019690979272127, -1.2642362117767334, -0.0015373493079096079, -0.5467880964279175, 0.9592242556540338],
|
||||
[0.49761720293209916, 0.12386436760425568, -0.13335634768009186, -1.3002347946166992, -0.0015373493079096079, -0.542256772518158, 0.9595791248723795],
|
||||
[0.5055234657170684, 0.11174451559782028, -0.2545548677444458, -1.3337390422821045, -0.0015373493079096079, -0.5389915108680725, 0.9599940969615668],
|
||||
[0.5130901657853517, 0.10047440975904465, -0.36725589632987976, -1.3649104833602905, -0.0015373493079096079, -0.5367147326469421, 0.9604526447819721],
|
||||
[0.5203109047218069, 0.08999447524547577, -0.4720552861690521, -1.393890619277954, -0.0015373493079096079, -0.5351468920707703, 0.960942258826627],
|
||||
[0.5277450384735141, 0.08024930208921432, -0.5695069432258606, -1.4208241701126099, -0.0036994728725403547, -0.5340712070465088, 0.9614542357182847],
|
||||
[0.5348026953298156, 0.07118739187717438, -0.6601260900497437, -1.4458574056625366, -0.0058996910229325294, -0.5333346724510193, 0.9619831418920445],
|
||||
[0.6780078736348712, -0.11038433760404587, -0.6138433814048767, -1.9470629692077637, -0.008862612769007683, -0.559460461139679, 0.9607405300190316],
|
||||
[0.6747115695706011, -0.1060805693268776, -0.5708056688308716, -1.9351692199707031, -0.011807435192167759, -0.5562520027160645, 0.9596426684609639],
|
||||
[0.17851530759705644, -0.2528565227985382, -0.7060651779174805, 0.0008099577389657497, -0.011804213747382164, -0.9532887935638428, 0.952430201176377],
|
||||
[0.18678538061932282, -0.2654341459274292, -0.8318413496017456, -0.010858933441340923, -0.011847402900457382, -0.9791561961174011, 0.9449690078640667],
|
||||
[0.1949221573654882, -0.2771299183368683, -0.9487991333007812, -0.02170969545841217, -0.011933748610317707, -1.0030080080032349, 0.9373360301855578],
|
||||
[0.2026603194855928, -0.28800567984580994, -1.0575568675994873, -0.031799692660570145, -0.012060224078595638, -1.024595022201538, 0.9295956164929802],
|
||||
[0.2099276450828452, -0.29811891913414, -1.158689260482788, -0.0411822572350502, -0.012224017642438412, -1.0440384149551392, 0.9218004861200195],
|
||||
[0.21672051159074684, -0.30752310156822205, -1.2527310848236084, -0.04990699514746666, -0.012422511354088783, -1.0615546703338623, 0.9139932139127096],
|
||||
[0.22305534883649292, -0.3162679374217987, -1.3401795625686646, -0.05802002176642418, -0.012653272598981857, -1.077350378036499, 0.9062078294862433],
|
||||
[0.22895277393356475, -0.3243996798992157, -1.4214967489242554, -0.06556423008441925, -0.012914039194583893, -1.0915987491607666, 0.8984713202557664],
|
||||
[0.23443345341931823, -0.3319612741470337, -1.4971126317977905, -0.07257950305938721, -0.013202708214521408, -1.1044427156448364, 0.890804948172658],
|
||||
[0.23951749819606138, -0.338992714881897, -1.5674270391464233, -0.07910291105508804, -0.013517322018742561, -1.1160025596618652, 0.8832253574194441],
|
||||
[0.39289334290020206, -0.8018531799316406, -1.4575316905975342, -0.5085219144821167, -0.01553985197097063, -1.1072732210159302, 0.875901053699282],
|
||||
[0.388718206914192, -0.7916341423988342, -1.3553414344787598, -0.4990411698818207, -0.01752467453479767, -1.100295901298523, 0.8685500023249335],
|
||||
[0.3847635472904388, -0.782131552696228, -1.2603157758712769, -0.4902251958847046, -0.019474433735013008, -1.0933153629302979, 0.8612116165161448],
|
||||
[0.3810239175048684, -0.7732952833175659, -1.1719526052474976, -0.4820272922515869, -0.02139158733189106, -1.0863571166992188, 0.8539169219698891],
|
||||
[0.3774964362735405, -0.7650784850120544, -1.089784860610962, -0.47440415620803833, -0.02327842265367508, -1.0794397592544556, 0.8466900757753881],
|
||||
[0.3741815825976844, -0.7574377655982971, -1.0133779048919678, -0.4673154652118683, -0.02513706311583519, -1.0725765228271484, 0.8395496933996105],
|
||||
[0.3710838694605647, -0.7503328323364258, -0.9423280358314514, -0.4607238173484802, -0.026969488710165024, -1.0657763481140137, 0.8325099606152043],
|
||||
[0.3682120755403503, -0.7437259554862976, -0.8762596249580383, -0.45459431409835815, -0.028777534142136574, -1.0590451955795288, 0.8255815419106031],
|
||||
[0.36557903498433153, -0.7375823259353638, -0.8148233890533447, -0.4488946199417114, -0.030562909319996834, -1.05238676071167, 0.818772311184273],
|
||||
[0.36320061149412136, -0.7318694591522217, -0.7576946020126343, -0.44359442591667175, -0.03232720494270325, -1.0458028316497803, 0.8120879340440293],
|
||||
[0.3610940314528291, -0.7265571355819702, -0.7045711874961853, -0.4386659264564514, -0.0340718999505043, -1.0392942428588867, 0.8055323294502604],
|
||||
[0.35927519417236253, -0.7216172218322754, -0.6551723480224609, -0.434082955121994, -0.035798367112874985, -1.0328611135482788, 0.7991080348309247],
|
||||
[0.35775566889097404, -0.7170236706733704, -0.6092369556427002, -0.42982131242752075, -0.037507884204387665, -1.0265032052993774, 0.7928164947139084],
|
||||
[0.35653949259157774, -0.7127522230148315, -0.5665221810340881, -0.42585843801498413, -0.03920163959264755, -1.0202194452285767, 0.7866582890856323],
|
||||
[0.3556205446497881, -0.7087802290916443, -0.5268022418022156, -0.422173410654068, -0.04088073596358299, -1.01400887966156, 0.7806333143686989],
|
||||
[-0.18928970090431746, -0.6875587105751038, -0.3145873546600342, 0.6213363409042358, -0.0384095124900341, 0.1780533492565155, 0.7746891641094066],
|
||||
[-0.1998281345720566, -0.6678251028060913, -0.11725125461816788, 0.639644205570221, -0.03586547449231148, 0.1654033213853836, 0.768857914097388],
|
||||
[-0.19824261810433141, -0.64947509765625, 0.06624923646450043, 0.6566684246063232, -0.03325372561812401, 0.13446398079395294, 0.7629371203539954],
|
||||
[-0.19419930945511207, -0.6324115991592407, 0.23688414692878723, 0.6724991202354431, -0.030579011887311935, 0.13123857975006104, 0.7569298493810652],
|
||||
[-0.19074162262832509, -0.6165444254875183, 0.3955555260181427, 0.6872198581695557, -0.027845751494169235, 0.1318981796503067, 0.7509517971922638],
|
||||
[-0.1899161965066632, -0.6017897725105286, 0.5431021451950073, 0.7009085416793823, -0.025058045983314514, 0.13255788385868073, 0.7449545261546827],
|
||||
[-0.1911287448852193, -0.5880696177482605, 0.6803039908409119, 0.7136374115943909, -0.022219715639948845, 0.1332218497991562, 0.7388997712783383],
|
||||
[-0.19318406105815286, -0.5753113627433777, 0.8078863620758057, 0.7254738807678223, -0.019334308803081512, 0.1338927447795868, 0.7327627342863612],
|
||||
[-0.19546555151826855, -0.5634476542472839, 0.9265236854553223, 0.7364804148674011, -0.016405124217271805, 0.13457146286964417, 0.726534773886686],
|
||||
[-0.19773300519680453, -0.552415668964386, 1.0368430614471436, 0.7467153668403625, -0.013435234315693378, 0.1352570652961731, 0.72022400558647],
|
||||
[-0.3129858658797515, 0.27866479754447937, 0.9641480445861816, 1.5177505016326904, -0.013435234315693378, 0.15824465453624725, 0.724840854185572],
|
||||
[-0.31099166787599797, 0.27190497517585754, 0.8965498208999634, 1.511479139328003, -0.007423669099807739, 0.1564316302537918, 0.7293932460262814],
|
||||
[-0.1016954787246937, 0.16584111750125885, 0.6584112048149109, 0.5665790438652039, -0.007423669099807739, -0.1395522952079773, 0.7349058161108437],
|
||||
[-0.08300327240505596, 0.1436968892812729, 0.43696895241737366, 0.5290812253952026, -0.007423669099807739, -0.1789565533399582, 0.7405128616799562],
|
||||
[-0.06918421965186021, 0.1231052428483963, 0.2310524582862854, 0.4942123293876648, -0.007423669099807739, -0.2024339735507965, 0.7461701549526497],
|
||||
[-0.05736861692440621, 0.10395731776952744, 0.039573147892951965, 0.46178823709487915, -0.007423669099807739, -0.2196238934993744, 0.7518367441941683],
|
||||
[-0.046647800181232595, 0.08615188300609589, -0.13848116993904114, 0.43163782358169556, -0.007423669099807739, -0.23217642307281494, 0.7574720838700055],
|
||||
[-0.03697180534157927, 0.06959482282400131, -0.3040517568588257, 0.4036014974117279, -0.0059389350935816765, -0.2439926415681839, 0.7630477127348814],
|
||||
[-0.027750959294197044, 0.05419861152768135, -0.4580138921737671, 0.37753087282180786, -0.0059389350935816765, -0.2554107904434204, 0.768545673778488],
|
||||
[-0.01650420513479283, 0.03988185524940491, -0.6011814475059509, 0.3532879948616028, -0.0059389350935816765, -0.27798032760620117, 0.7739557730076617],
|
||||
[-0.006215064317218847, 0.026568876579403877, -0.7343112230300903, 0.33074474334716797, -0.0059389350935816765, -0.29863041639328003, 0.7792738195520029],
|
||||
[0.0032896441892095135, 0.014189294539391994, -0.8581070303916931, 0.3097819983959198, -0.0059389350935816765, -0.31771352887153625, 0.7844993819957966],
|
||||
[0.1867415263504139, -0.2797943651676178, -0.7979435324668884, -0.18803030252456665, -0.00636813510209322, -0.5570378303527832, 0.7807180815256229],
|
||||
[0.17962014109123528, -0.27419981360435486, -0.7419981956481934, -0.178556889295578, -0.006775710266083479, -0.5382837653160095, 0.777189561263008],
|
||||
[0.17304498228624188, -0.26899752020835876, -0.6899752616882324, -0.16974766552448273, -0.007163177710026503, -0.520890474319458, 0.7739044654886423],
|
||||
[-0.5087494300864623, -0.24663199484348297, -0.4663200080394745, -0.13187535107135773, -0.007163177710026503, 2.1945619583129883, 0.7714640447550488],
|
||||
[-0.5218161964776654, -0.22583456337451935, -0.25834566354751587, -0.09665831178426743, -0.007163177710026503, 2.205286979675293, 0.7699120400719075],
|
||||
[-0.5338882181449203, -0.2064952701330185, -0.06495276838541031, -0.06391043961048126, -0.007163177710026503, 2.212782382965088, 0.7692452258750052],
|
||||
[-0.5112945374698926, -0.1885119080543518, 0.11488097161054611, -0.033458638936281204, -0.007163177710026503, 2.1033742427825928, 0.7693473090415099],
|
||||
[-0.5120801247826361, -0.17178937792778015, 0.2821062207221985, -0.0051418752409517765, -0.007163177710026503, 2.1013295650482178, 0.7700537236118319],
|
||||
[-0.6318228120428708, -0.4062393009662628, 0.4376069903373718, -0.7280921936035156, -0.011410382576286793, 5.746920108795166, 0.7638278009790337],
|
||||
[-0.6102463073064712, -0.39177948236465454, 0.5822052955627441, -0.7190147042274475, -0.015604634769260883, 5.698555946350098, 0.7576461193038383],
|
||||
[-0.5973168223220888, -0.3783334493637085, 0.7166655659675598, -0.7105735540390015, -0.01974964700639248, 5.6500163078308105, 0.7514720746944674],
|
||||
[-0.5882638545461184, -0.3658301532268524, 0.8416985273361206, -0.7027242183685303, -0.023848872631788254, 5.600953578948975, 0.7452774336652609],
|
||||
[-0.5809686456967957, -0.3542034924030304, 0.9579651951789856, -0.695425271987915, -0.027905520051717758, 5.551097869873047, 0.7390478495218085],
|
||||
[-0.8196721119253407, 7.306608200073242, 1.0660802125930786, 4.113862037658691, -0.027905520051717758, 6.068759918212891, 0.7446808313863519],
|
||||
[-0.8196721119253435, 7.316661357879639, 1.1666151285171509, 4.12017297744751, -0.027905520051717758, 6.111703872680664, 0.7501764234493237],
|
||||
[-0.8196721119253461, 7.326010227203369, 1.2601011991500854, 4.126042366027832, -0.027905520051717758, 6.153583526611328, 0.7555379766814936],
|
||||
[-0.8196721119253482, 7.33470344543457, 1.347032904624939, 4.131499290466309, -0.027905520051717758, 6.194431781768799, 0.7607687603226371],
|
||||
[-0.8196721119253502, 7.34278678894043, 1.4278696775436401, 4.1365742683410645, -0.027905520051717758, 6.234278202056885, 0.765871963874974],
|
||||
[-0.819672111925403, 8.232775688171387, 1.327759027481079, 4.695289611816406, -0.027905520051717758, 6.273124694824219, 0.7708506990480516],
|
||||
[-0.8196721119254029, 8.223466873168945, 1.2346673011779785, 4.689445495605469, -0.027905520051717758, 6.311017990112305, 0.775708001655932],
|
||||
[0.22799154825718387, 8.197281837463379, 0.9728226065635681, 5.45698881149292, 0.0039269146509468555, -6.295364856719971, 0.780446833468498],
|
||||
[0.23419523367937423, 8.172933578491211, 0.7293363809585571, 5.441702842712402, 0.03567017987370491, -6.334527492523193, 0.7850700840173425],
|
||||
[0.24001124821910183, 8.15029239654541, 0.5029214024543762, 5.427489280700684, 0.06733053922653198, -6.373260974884033, 0.7895805723576782],
|
||||
[0.24563307844267657, 8.12923812866211, 0.2923808693885803, 5.414271831512451, 0.09891378879547119, -6.412202835083008, 0.7939810487872736],
|
||||
[0.2514091635182312, 8.109660148620605, 0.09660171717405319, 5.401981353759766, 0.1304253488779068, -6.452564239501953, 0.7982741965234642],
|
||||
[0.26319184231767545, 8.09145450592041, -0.08545099198818207, 5.390552520751953, 0.16187024116516113, -6.51570463180542, 0.8020599373232822],
|
||||
[0.265450510692521, 8.074525833129883, -0.2547396421432495, 5.379924774169922, 0.19325312972068787, -6.544726848602295, 0.8054052405018639],
|
||||
[0.26603509872581854, 8.058784484863281, -0.41215911507606506, 5.37004280090332, 0.2245783805847168, -6.568309783935547, 0.808214631238123],
|
||||
[0.2648741592145022, 8.044145584106445, -0.5585416555404663, 5.36085319519043, 0.25585001707077026, -6.586142539978027, 0.8103390489042367],
|
||||
[0.26166994194463644, 8.030533790588379, -0.694661021232605, 5.3523077964782715, 0.2870718240737915, -6.5970916748046875, 0.8116433931864653],
|
||||
[0.8196721119254027, -8.164595603942871, -0.6459569931030273, -4.814634799957275, 0.2870718240737915, -7.096859455108643, 0.8135545394151179],
|
||||
[0.8196721119254027, -8.160066604614258, -0.6006677150726318, -4.81179141998291, 0.2870718240737915, -7.112162113189697, 0.8154190723211203],
|
||||
[-0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0],
|
||||
[-0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0],
|
||||
[-0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0],
|
||||
[0.38513324930148474, -0.0759519413113594, 0.05048057436943054, -1.7808427810668945, -0.00020776498422492296, -0.33449462056159973, 0.9991124139302132],
|
||||
[0.40075537473288914, -0.0712578147649765, 0.09742186218500137, -1.6257919073104858, -0.00039744071546010673, -0.33135300874710083, 0.9982771386678583],
|
||||
[0.4201164532492807, -0.06689280271530151, 0.14107200503349304, -1.483040452003479, -0.0005704620853066444, -0.32857346534729004, 0.9974910563680077],
|
||||
[0.3903238460794766, -0.06283382326364517, 0.18166175484657288, -1.3503772020339966, -0.0007280061254277825, -0.3260654807090759, 0.9967511103297959],
|
||||
[0.35570301596556403, -0.05905943363904953, 0.21940568089485168, -1.2258175611495972, -0.0008710181573405862, -0.32375097274780273, 0.996054354716816],
|
||||
[0.3229205375893875, -0.05554967001080513, 0.2545033097267151, -1.1077765226364136, -0.0010002587223425508, -0.32166072726249695, 0.9953979847183112],
|
||||
[0.2916296151630097, -0.05228598415851593, 0.2871401607990265, -0.995150089263916, -0.001116359606385231, -0.31962889432907104, 0.9947793526160259],
|
||||
[-0.4353541850257815, 0.01770082116127014, 0.2670082151889801, 1.7472336292266846, -0.001116359606385231, -0.28161153197288513, 0.9947870032699171],
|
||||
[-0.410655696054713, 0.015828775241971016, 0.24828776717185974, 1.658023476600647, -0.0009229235001839697, -0.28300604224205017, 0.9947971654884007],
|
||||
[-0.38813969742745874, 0.014087983407080173, 0.23087982833385468, 1.5766654014587402, -0.0007389792008325458, -0.284253865480423, 0.9948095529007845]
|
||||
],
|
||||
"2025_tuned": [
|
||||
[-0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0],
|
||||
[-0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0],
|
||||
[-0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0],
|
||||
[-0.10004176588515235, -6.3100724219111726e-06, -6.310072058113292e-05, 0.09995962679386139, 1.399434836457658e-06, 0.00010058288171421736, 0.9996100118902765],
|
||||
[-0.0995724824028674, -1.2177733879070729e-05, -0.00012177733879070729, 0.09824388474225998, 2.774849235720467e-06, 9.72808338701725e-05, 0.9992295059317203],
|
||||
[-0.09913610982047417, -1.7634001778787933e-05, -0.00017634002142585814, 0.09664839506149292, 4.127926786168246e-06, 9.421175491297618e-05, 0.9988582529369309],
|
||||
[-0.09873034016950431, -2.2707719836034812e-05, -0.00022707720927428454, 0.0951647162437439, 5.460232841869583e-06, 9.135930304182693e-05, 0.9984960291624968],
|
||||
[-0.09835303075647045, -2.7425710868556052e-05, -0.00027425712323747575, 0.09378502517938614, 6.773223049094668e-06, 8.870827150531113e-05, 0.998142616186421],
|
||||
[-0.09800218824027186, -3.181291322107427e-05, -0.0003181291394867003, 0.09250204265117645, 8.06825210020179e-06, 8.62445158418268e-05, 0.9977978007878223],
|
||||
[-0.09767595668666544, -3.589252446545288e-05, -0.00035892523010261357, 0.09130898118019104, 9.3465778263635e-06, 8.39548883959651e-05, 0.9974613748289103],
|
||||
[-0.09066716284226353, -0.00012337604130152613, -0.00033376028295606375, 0.06570431590080261, 1.0266438039252535e-05, 3.4134864108636975e-05, 0.9971327104622644],
|
||||
[-0.0908548067688955, -0.00012103597691748291, -0.00031035972642712295, 0.06638883799314499, 1.119588159781415e-05, 3.549714892869815e-05, 0.9968120741787946],
|
||||
[-0.09102931349607103, -0.00011885998537763953, -0.00028859981102868915, 0.06702535599470139, 1.2134236385463737e-05, 3.6765271943295375e-05, 0.9964992693384843],
|
||||
[-0.09119160303962716, -0.00011683656339300796, -0.0002683655184227973, 0.06761724501848221, 1.3080877579341177e-05, 3.794580334215425e-05, 0.9961941041558584],
|
||||
[-0.09134253367794945, -0.00011495500075398013, -0.00024954992113634944, 0.06816762685775757, 1.4035224921826739e-05, 3.904485492967069e-05, 0.9958963915774781],
|
||||
[-0.01944845290711774, -0.004023205488920212, -0.00023205348406918347, 0.23997238278388977, 2.695681541808881e-05, -0.23247814178466797, 0.9955856059993178],
|
||||
[-0.019505220691704045, -0.0040215784683823586, -0.00021578377345576882, 0.24009454250335693, 3.9884980651549995e-05, -0.23240543901920319, 0.9952824091350698],
|
||||
[-0.019559144034443626, -0.004020065534859896, -0.0002006547583732754, 0.24020811915397644, 5.281926496536471e-05, -0.23233458399772644, 0.9949866152926238],
|
||||
[-0.01961040579724358, -0.004018658772110939, -0.00018658647604752332, 0.24031373858451843, 6.575923907803372e-05, -0.23226550221443176, 0.9946980433511353],
|
||||
[-0.019659171897600212, -0.004017350263893604, -0.00017350453708786517, 0.24041196703910828, 7.870449917390943e-05, -0.23219816386699677, 0.9944165166465714],
|
||||
[-0.019705595458651293, -0.0040161339566111565, -0.000161339805345051, 0.24050329625606537, 9.165467781713232e-05, -0.23213252425193787, 0.9941418628602553],
|
||||
[-0.01974982095862555, -0.004015002865344286, -0.0001500279613537714, 0.2405882328748703, 0.00010460942576173693, -0.2320685237646103, 0.9938739139103233],
|
||||
[-0.019791980110236407, -0.004013950936496258, -0.000139509211294353, 0.2406671941280365, 0.00011756843014154583, -0.23200613260269165, 0.9936125058460087],
|
||||
[-0.01983220014338104, -0.004012972582131624, -0.00012972795229870826, 0.24074062705039978, 0.00013053139264229685, -0.23194530606269836, 0.99335747874467],
|
||||
[-0.01987059968334614, -0.004012063145637512, -0.00012063248141203076, 0.24080891907215118, 0.00014349802222568542, -0.23188599944114685, 0.9931086766114875],
|
||||
[-0.019907288762901165, -0.004011217504739761, -0.00011217471183044836, 0.24087241291999817, 0.00015646807150915265, -0.23182816803455353, 0.9928659472817497],
|
||||
[-0.01994236469903559, -0.004010431002825499, -0.0001043099255184643, 0.2409314513206482, 0.0001694413076620549, -0.2317717969417572, 0.9926291423256576],
|
||||
[-0.019975928642665286, -0.004009699448943138, -9.699655493022874e-05, 0.24098636209964752, 0.0001824174978537485, -0.2317168116569519, 0.9923981169555751],
|
||||
[-0.020008069050680716, -0.004009019583463669, -9.019594290293753e-05, 0.24103742837905884, 0.00019539643835742027, -0.23166321218013763, 0.9921727299356587],
|
||||
[-0.020038865830360516, -0.004008387215435505, -8.387213165406138e-05, 0.24108490347862244, 0.000208377925446257, -0.23161093890666962, 0.991952843493798],
|
||||
[0.370812088545753, -0.17847982048988342, 0.17520178854465485, -0.9918082356452942, -0.0013008954701945186, -0.37976253032684326, 0.9875400426961929],
|
||||
[0.3550224507624517, -0.16218021512031555, 0.33819782733917236, -0.946868360042572, -0.0013008954701945186, -0.3672393560409546, 0.9836890276104427],
|
||||
[0.3387657012828988, -0.14702340960502625, 0.4897659122943878, -0.9050739407539368, -0.0013008954701945186, -0.349520742893219, 0.9802772670978159],
|
||||
[0.320553117201625, -0.13292928040027618, 0.6307072639465332, -0.8661898374557495, -0.0013008954701945186, -0.32133904099464417, 0.9772155204395125],
|
||||
[0.3038147853950517, -0.11982330679893494, 0.7617669701576233, -0.8300200700759888, -0.0013008954701945186, -0.29573220014572144, 0.9744541209523172],
|
||||
[0.28838297435341453, -0.1076362207531929, 0.8836377859115601, -0.7963812947273254, -0.0013008954701945186, -0.27234020829200745, 0.9719767824781306],
|
||||
[0.27412739976950157, -0.09630359709262848, 0.9969640374183655, -0.7650993466377258, -0.0013008954701945186, -0.2508915066719055, 0.9697871497690216],
|
||||
[0.2609405940688192, -0.0857655256986618, 1.1023447513580322, -0.7360098361968994, -0.0013008954701945186, -0.2311713993549347, 0.9678939521880274],
|
||||
[0.24902105124313956, -0.07596629858016968, 1.2003370523452759, -0.7089597582817078, -0.0023797473404556513, -0.21300318837165833, 0.9663002834303565],
|
||||
[0.2379866968422148, -0.06685411185026169, 1.2914588451385498, -0.6838060021400452, -0.0034203215036541224, -0.19623741507530212, 0.9649991785284114],
|
||||
[-0.05555523899531584, 0.2572912275791168, 1.2009122371673584, 0.21098388731479645, -0.0030992592219263315, -0.0023925956338644028, 0.9640429283994295],
|
||||
[-0.04300703739640971, 0.24887140095233917, 1.1167140007019043, 0.1877412647008896, -0.0028135660104453564, -0.025814607739448547, 0.9631736928535165],
|
||||
[-0.03144173312508024, 0.241041898727417, 1.0384190082550049, 0.1661282330751419, -0.002560762222856283, -0.04721926525235176, 0.9623884128742163],
|
||||
[-0.020584306498731966, 0.23376135528087616, 0.9656134843826294, 0.1460305154323578, -0.0023385416716337204, -0.0675073191523552, 0.9616834933561276],
|
||||
[-0.010623455738642828, 0.22699125111103058, 0.8979125022888184, 0.1273418664932251, -0.002144760685041547, -0.08587225526571274, 0.9610549332646039],
|
||||
[-0.001494547853067832, 0.22069580852985382, 0.8349581360816956, 0.10996348410844803, -0.0019774248357862234, -0.10245289653539658, 0.9604984525950518],
|
||||
[0.0068604057005683195, 0.21484176814556122, 0.77641761302948, 0.0938035100698471, -0.0018346804426982999, -0.11737086623907089, 0.960009608840235],
|
||||
[0.014494764465175735, 0.20939815044403076, 0.7219814658164978, 0.0787765309214592, -0.0017148031620308757, -0.13073746860027313, 0.9595838985390357],
|
||||
[0.02145925383556136, 0.20433619618415833, 0.6713619828224182, 0.0648031160235405, -0.0016161897219717503, -0.14266054332256317, 0.9592168418991078],
|
||||
[0.027803413077598614, 0.19962915778160095, 0.6242915391921997, 0.05180941894650459, -0.0015373493079096079, -0.1532493233680725, 0.9589040503149374],
|
||||
[0.4868611346439523, 0.18219728767871857, 0.44997286796569824, -1.139389991760254, -0.0015373493079096079, -0.6626362204551697, 0.9587681111885773],
|
||||
[0.491999825957422, 0.16598761081695557, 0.28787603974342346, -1.1840639114379883, -0.0015373493079096079, -0.6369588971138, 0.9587904679721979],
|
||||
[0.49674077912054715, 0.15091441571712494, 0.13714411854743958, -1.2255961894989014, -0.0015373493079096079, -0.6127965450286865, 0.9589498270423709],
|
||||
[0.5020593921318688, 0.13689802587032318, -0.003019690979272127, -1.2642362117767334, -0.0015373493079096079, -0.5938507318496704, 0.9592242556540338],
|
||||
[0.5055839611899835, 0.12386436760425568, -0.13335634768009186, -1.3002347946166992, -0.0015373493079096079, -0.5717793107032776, 0.9595791248723795],
|
||||
[0.5103376594592743, 0.11174451559782028, -0.2545548677444458, -1.3337390422821045, -0.0015373493079096079, -0.5568405389785767, 0.9599940969615668],
|
||||
[0.5159163517262825, 0.10047440975904465, -0.36725589632987976, -1.3649104833602905, -0.0015373493079096079, -0.5471976399421692, 0.9604526447819721],
|
||||
[0.5219334806488688, 0.08999447524547577, -0.4720552861690521, -1.393890619277954, -0.0015373493079096079, -0.5411673784255981, 0.960942258826627],
|
||||
[0.5286669727750853, 0.08024930208921432, -0.5695069432258606, -1.4208241701126099, -0.0036994728725403547, -0.5374927520751953, 0.9614542357182847],
|
||||
[0.5353362743544783, 0.07118739187717438, -0.6601260900497437, -1.4458574056625366, -0.0058996910229325294, -0.535315215587616, 0.9619831418920445],
|
||||
[0.6832885473599156, -0.11038433760404587, -0.6138433814048767, -1.9470629692077637, -0.008862612769007683, -0.5790515542030334, 0.9607405300190316],
|
||||
[0.6795462170511046, -0.1060805693268776, -0.5708056688308716, -1.9351692199707031, -0.011807435192167759, -0.5741888880729675, 0.9596426684609639],
|
||||
[0.1908011113905084, -0.2528565227985382, -0.7060651779174805, 0.0008099577389657497, -0.011804213747382164, -1.0196528434753418, 0.952430201176377],
|
||||
[0.20074079294495029, -0.2654341459274292, -0.8318413496017456, -0.010858933441340923, -0.011847402900457382, -1.054008960723877, 0.9449690078640667],
|
||||
[0.21005581328971235, -0.2771299183368683, -0.9487991333007812, -0.02170969545841217, -0.011933748610317707, -1.0834929943084717, 0.9373360301855578],
|
||||
[0.2185519968501357, -0.28800567984580994, -1.0575568675994873, -0.031799692660570145, -0.012060224078595638, -1.108378291130066, 0.9295956164929802],
|
||||
[0.22625973138345304, -0.29811891913414, -1.158689260482788, -0.0411822572350502, -0.012224017642438412, -1.129418134689331, 0.9218004861200195],
|
||||
[0.2332688587860026, -0.30752310156822205, -1.2527310848236084, -0.04990699514746666, -0.012422511354088783, -1.1473722457885742, 0.9139932139127096],
|
||||
[0.23966734021868588, -0.3162679374217987, -1.3401795625686646, -0.05802002176642418, -0.012653272598981857, -1.1628490686416626, 0.9062078294862433],
|
||||
[0.245526388718592, -0.3243996798992157, -1.4214967489242554, -0.06556423008441925, -0.012914039194583893, -1.1762992143630981, 0.8984713202557664],
|
||||
[0.250901259515652, -0.3319612741470337, -1.4971126317977905, -0.07257950305938721, -0.013202708214521408, -1.1880501508712769, 0.890804948172658],
|
||||
[0.2558354548718358, -0.338992714881897, -1.5674270391464233, -0.07910291105508804, -0.013517322018742561, -1.198344111442566, 0.8832253574194441],
|
||||
[0.3945829136566075, -0.8018531799316406, -1.4575316905975342, -0.5085219144821167, -0.01553985197097063, -1.1142884492874146, 0.875901053699282],
|
||||
[0.39052898584298695, -0.7916341423988342, -1.3553414344787598, -0.4990411698818207, -0.01752467453479767, -1.1078277826309204, 0.8685500023249335],
|
||||
[0.3866928098321055, -0.782131552696228, -1.2603157758712769, -0.4902251958847046, -0.019474433735013008, -1.1013531684875488, 0.8612116165161448],
|
||||
[0.3830683242096016, -0.7732952833175659, -1.1719526052474976, -0.4820272922515869, -0.02139158733189106, -1.094887137413025, 0.8539169219698891],
|
||||
[0.37965216174232946, -0.7650784850120544, -1.089784860610962, -0.47440415620803833, -0.02327842265367508, -1.088446021080017, 0.8466900757753881],
|
||||
[0.3764444491749428, -0.7574377655982971, -1.0133779048919678, -0.4673154652118683, -0.02513706311583519, -1.0820410251617432, 0.8395496933996105],
|
||||
[0.37344948299404424, -0.7503328323364258, -0.9423280358314514, -0.4607238173484802, -0.026969488710165024, -1.0756795406341553, 0.8325099606152043],
|
||||
[0.3706759594198795, -0.7437259554862976, -0.8762596249580383, -0.45459431409835815, -0.028777534142136574, -1.0693663358688354, 0.8255815419106031],
|
||||
[0.36813675695663267, -0.7375823259353638, -0.8148233890533447, -0.4488946199417114, -0.030562909319996834, -1.0631040334701538, 0.818772311184273],
|
||||
[0.36584789570646514, -0.7318694591522217, -0.7576946020126343, -0.44359442591667175, -0.03232720494270325, -1.056894302368164, 0.8120879340440293],
|
||||
[0.3638268463778931, -0.7265571355819702, -0.7045711874961853, -0.4386659264564514, -0.0340718999505043, -1.0507375001907349, 0.8055323294502604],
|
||||
[0.36208980635370175, -0.7216172218322754, -0.6551723480224609, -0.434082955121994, -0.035798367112874985, -1.0446338653564453, 0.7991080348309247],
|
||||
[0.36064865374996596, -0.7170236706733704, -0.6092369556427002, -0.42982131242752075, -0.037507884204387665, -1.0385830402374268, 0.7928164947139084],
|
||||
[0.35950769748704137, -0.7127522230148315, -0.5665221810340881, -0.42585843801498413, -0.03920163959264755, -1.0325844287872314, 0.7866582890856323],
|
||||
[0.35866100585350397, -0.7087802290916443, -0.5268022418022156, -0.422173410654068, -0.04088073596358299, -1.0266374349594116, 0.7806333143686989],
|
||||
[-0.18886394348797958, -0.6875587105751038, -0.3145873546600342, 0.6213363409042358, -0.0384095124900341, 0.1763417273759842, 0.7746891641094066],
|
||||
[-0.19935445167851054, -0.6678251028060913, -0.11725125461816788, 0.639644205570221, -0.03586547449231148, 0.1635800153017044, 0.768857914097388],
|
||||
[-0.19824261830173168, -0.64947509765625, 0.06624923646450043, 0.6566684246063232, -0.03325372561812401, 0.13446398079395294, 0.7629371203539954],
|
||||
[-0.19419930983956415, -0.6324115991592407, 0.23688414692878723, 0.6724991202354431, -0.030579011887311935, 0.13123857975006104, 0.7569298493810652],
|
||||
[-0.19074162332080974, -0.6165444254875183, 0.3955555260181427, 0.6872198581695557, -0.027845751494169235, 0.1318981796503067, 0.7509517971922638],
|
||||
[-0.18991619771810794, -0.6017897725105286, 0.5431021451950073, 0.7009085416793823, -0.025058045983314514, 0.13255789875984192, 0.7449545261546827],
|
||||
[-0.19112874694352874, -0.5880696177482605, 0.6803039908409119, 0.7136374115943909, -0.022219715639948845, 0.13322186470031738, 0.7388997712783383],
|
||||
[-0.19318406444226807, -0.5753113627433777, 0.8078863620758057, 0.7254738807678223, -0.019334308803081512, 0.13389275968074799, 0.7327627342863612],
|
||||
[-0.19546555689832368, -0.5634476542472839, 0.9265236854553223, 0.7364804148674011, -0.016405124217271805, 0.13457147777080536, 0.726534773886686],
|
||||
[-0.19773301347682157, -0.552415668964386, 1.0368430614471436, 0.7467153668403625, -0.013435234315693378, 0.13525710999965668, 0.72022400558647],
|
||||
[-0.30919366177723145, 0.27866479754447937, 0.9641480445861816, 1.5177505016326904, -0.013435234315693378, 0.138100728392601, 0.724840854185572],
|
||||
[-0.30725900353129726, 0.27190497517585754, 0.8965498208999634, 1.511479139328003, -0.007423669099807739, 0.13650169968605042, 0.7293932460262814],
|
||||
[-0.08521481290160546, 0.16584111750125885, 0.6584112048149109, 0.5665790438652039, -0.007423669099807739, -0.2075527459383011, 0.7349058161108437],
|
||||
[-0.06783400791318979, 0.1436968892812729, 0.43696895241737366, 0.5290812253952026, -0.007423669099807739, -0.24158689379692078, 0.7405128616799562],
|
||||
[-0.05825252475310051, 0.1231052428483963, 0.2310524582862854, 0.4942123293876648, -0.007423669099807739, -0.24736443161964417, 0.7461701549526497],
|
||||
[-0.05012086249249722, 0.10395731776952744, 0.039573147892951965, 0.46178823709487915, -0.007423669099807739, -0.24928022921085358, 0.7518367441941683],
|
||||
[-0.04321249616872257, 0.08615188300609589, -0.13848116993904114, 0.43163782358169556, -0.007423669099807739, -0.2463187426328659, 0.7574720838700055],
|
||||
[-0.035995895467763134, 0.06959482282400131, -0.3040517568588257, 0.4036014974117279, -0.0059389350935816765, -0.24804891645908356, 0.7630477127348814],
|
||||
[-0.02817185116153802, 0.05419861152768135, -0.4580138921737671, 0.37753087282180786, -0.0059389350935816765, -0.25364869832992554, 0.768545673778488],
|
||||
[-0.017897620847901936, 0.03988185524940491, -0.6011814475059509, 0.3532879948616028, -0.0059389350935816765, -0.27212369441986084, 0.7739557730076617],
|
||||
[-0.008261216107912184, 0.026568876579403877, -0.7343112230300903, 0.33074474334716797, -0.0059389350935816765, -0.2900128662586212, 0.7792738195520029],
|
||||
[0.0007627783865820081, 0.014189294539391994, -0.8581070303916931, 0.3097819983959198, -0.0059389350935816765, -0.30705922842025757, 0.7844993819957966],
|
||||
[0.1969936943180487, -0.2797943651676178, -0.7979435324668884, -0.18803030252456665, -0.00636813510209322, -0.5982919335365295, 0.7807180815256229],
|
||||
[0.18958238737076302, -0.27419981360435486, -0.7419981956481934, -0.178556889295578, -0.006775710266083479, -0.5784175992012024, 0.777189561263008],
|
||||
[0.1826990815770707, -0.26899752020835876, -0.6899752616882324, -0.16974766552448273, -0.007163177710026503, -0.5598204731941223, 0.7739044654886423],
|
||||
[-0.5589129262720587, -0.24663199484348297, -0.4663200080394745, -0.13187535107135773, -0.007163177710026503, 2.397239923477173, 0.7714640447550488],
|
||||
[-0.5584810415223166, -0.22583456337451935, -0.25834566354751587, -0.09665831178426743, -0.007163177710026503, 2.3529441356658936, 0.7699120400719075],
|
||||
[-0.5565616659645832, -0.2064952701330185, -0.06495276838541031, -0.06391043961048126, -0.007163177710026503, 2.3037376403808594, 0.7692452258750052],
|
||||
[-0.4865217168598598, -0.1885119080543518, 0.11488097161054611, -0.033458638936281204, -0.007163177710026503, 2.003431558609009, 0.7693473090415099],
|
||||
[-0.4843897726047696, -0.17178937792778015, 0.2821062207221985, -0.0051418752409517765, -0.007163177710026503, 1.9883670806884766, 0.7700537236118319],
|
||||
[-0.6318228120428708, -0.4062393009662628, 0.4376069903373718, -0.7280921936035156, -0.011410382576286793, 5.746318817138672, 0.7638278009790337],
|
||||
[-0.6102463073064712, -0.39177948236465454, 0.5822052955627441, -0.7190147042274475, -0.015604634769260883, 5.697494029998779, 0.7576461193038383],
|
||||
[-0.5973168223220888, -0.3783334493637085, 0.7166655659675598, -0.7105735540390015, -0.01974964700639248, 5.648215293884277, 0.7514720746944674],
|
||||
[-0.5882638545461184, -0.3658301532268524, 0.8416985273361206, -0.7027242183685303, -0.023848872631788254, 5.598015308380127, 0.7452774336652609],
|
||||
[-0.5809686456967957, -0.3542034924030304, 0.9579651951789856, -0.695425271987915, -0.027905520051717758, 5.546477317810059, 0.7390478495218085],
|
||||
[-0.8196721119253407, 7.306608200073242, 1.0660802125930786, 4.113862037658691, -0.027905520051717758, 6.068759918212891, 0.7446808313863519],
|
||||
[-0.8196721119253435, 7.316661357879639, 1.1666151285171509, 4.12017297744751, -0.027905520051717758, 6.111703872680664, 0.7501764234493237],
|
||||
[-0.8196721119253461, 7.326010227203369, 1.2601011991500854, 4.126042366027832, -0.027905520051717758, 6.153583526611328, 0.7555379766814936],
|
||||
[-0.8196721119253482, 7.33470344543457, 1.347032904624939, 4.131499290466309, -0.027905520051717758, 6.194431781768799, 0.7607687603226371],
|
||||
[-0.8196721119253502, 7.34278678894043, 1.4278696775436401, 4.1365742683410645, -0.027905520051717758, 6.234278202056885, 0.765871963874974],
|
||||
[-0.819672111925403, 8.232775688171387, 1.327759027481079, 4.695289611816406, -0.027905520051717758, 6.273124694824219, 0.7708506990480516],
|
||||
[-0.8196721119254029, 8.223466873168945, 1.2346673011779785, 4.689445495605469, -0.027905520051717758, 6.311017990112305, 0.775708001655932],
|
||||
[0.22799154825718387, 8.197281837463379, 0.9728226065635681, 5.45698881149292, 0.0039269146509468555, -6.295364856719971, 0.780446833468498],
|
||||
[0.23419523367937423, 8.172933578491211, 0.7293363809585571, 5.441702842712402, 0.03567017987370491, -6.334527492523193, 0.7850700840173425],
|
||||
[0.24001124821910183, 8.15029239654541, 0.5029214024543762, 5.427489280700684, 0.06733053922653198, -6.373260974884033, 0.7895805723576782],
|
||||
[0.24563307844267657, 8.12923812866211, 0.2923808693885803, 5.414271831512451, 0.09891378879547119, -6.412202835083008, 0.7939810487872736],
|
||||
[0.2514091635182312, 8.109660148620605, 0.09660171717405319, 5.401981353759766, 0.1304253488779068, -6.452564239501953, 0.7982741965234642],
|
||||
[0.26319184231767545, 8.09145450592041, -0.08545099198818207, 5.390552520751953, 0.16187024116516113, -6.51570463180542, 0.8020599373232822],
|
||||
[0.265450510692521, 8.074525833129883, -0.2547396421432495, 5.379924774169922, 0.19325312972068787, -6.544726848602295, 0.8054052405018639],
|
||||
[0.26603509872581854, 8.058784484863281, -0.41215911507606506, 5.37004280090332, 0.2245783805847168, -6.568309783935547, 0.808214631238123],
|
||||
[0.2648741592145022, 8.044145584106445, -0.5585416555404663, 5.36085319519043, 0.25585001707077026, -6.586142539978027, 0.8103390489042367],
|
||||
[0.26166994194463644, 8.030533790588379, -0.694661021232605, 5.3523077964782715, 0.2870718240737915, -6.5970916748046875, 0.8116433931864653],
|
||||
[0.8196721119254027, -8.164595603942871, -0.6459569931030273, -4.814634799957275, 0.2870718240737915, -7.096859455108643, 0.8135545394151179],
|
||||
[0.8196721119254027, -8.160066604614258, -0.6006677150726318, -4.81179141998291, 0.2870718240737915, -7.112162113189697, 0.8154190723211203],
|
||||
[-0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0],
|
||||
[-0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0],
|
||||
[-0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0],
|
||||
[0.38513324930148474, -0.0759519413113594, 0.05048057436943054, -1.7808427810668945, -0.00020776498422492296, -0.34127020835876465, 0.9991124139302132],
|
||||
[0.40075537473288914, -0.0712578147649765, 0.09742186218500137, -1.6257919073104858, -0.00039744071546010673, -0.33461055159568787, 0.9982771386678583],
|
||||
[0.4201164532492807, -0.06689280271530151, 0.14107200503349304, -1.483040452003479, -0.0005704620853066444, -0.32935744524002075, 0.9974910563680077],
|
||||
[0.3902653702713881, -0.06283382326364517, 0.18166175484657288, -1.3503772020339966, -0.0007280061254277825, -0.3258514404296875, 0.9967511103297959],
|
||||
[0.3556846194505165, -0.05905943363904953, 0.21940568089485168, -1.2258175611495972, -0.0008710181573405862, -0.32368361949920654, 0.996054354716816],
|
||||
[0.3229036446280457, -0.05554967001080513, 0.2545033097267151, -1.1077765226364136, -0.0010002587223425508, -0.3215988874435425, 0.9953979847183112],
|
||||
[0.29161282059042204, -0.05228598415851593, 0.2871401607990265, -0.995150089263916, -0.001116359606385231, -0.31956741213798523, 0.9947793526160259],
|
||||
[-0.43281167838121426, 0.01770082116127014, 0.2670082151889801, 1.7472336292266846, -0.001116359606385231, -0.29091861844062805, 0.9947870032699171],
|
||||
[-0.40825407552453624, 0.015828775241971016, 0.24828776717185974, 1.658023476600647, -0.0009229235001839697, -0.29179736971855164, 0.9947971654884007],
|
||||
[-0.38586022378762674, 0.014087983407080173, 0.23087982833385468, 1.5766654014587402, -0.0007389792008325458, -0.29259806871414185, 0.9948095529007845]
|
||||
]
|
||||
},
|
||||
"corrections": {
|
||||
"2746116c4f1040ff28312cd481ed59a43ace3fc1": "Unwind freezes the integrator when steering magnitude decreases in either direction."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,681 @@
|
||||
{
|
||||
"sourceControllerSha256": "3561d5ac43a72f9b68bc9e44042b8f5cbdca406dec940e7648c64607862a60f7",
|
||||
"fields": ["output", "desiredLateralAccel", "desiredLateralJerk", "p", "i", "f", "directionalFilter"],
|
||||
"cases": {
|
||||
"2023_default": {
|
||||
"before": {
|
||||
"factor": 3.6600000858306885,
|
||||
"negLimit": -3.0,
|
||||
"posLimit": 3.0
|
||||
},
|
||||
"after": {
|
||||
"factor": 3.6600000858306885,
|
||||
"negLimit": -3.6600000858306885,
|
||||
"posLimit": 3.6600000858306885
|
||||
},
|
||||
"rows": [
|
||||
[-0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0],
|
||||
[-0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0],
|
||||
[-0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0],
|
||||
[-0.10946385067439653, -6.3100724219111726e-06, -6.310072058113292e-05, 0.1341981738805771, 1.8787743556458736e-06, 0.00032710772939026356, 0.9996100118902765],
|
||||
[-0.10883246512145582, -1.2177733879070729e-05, -0.00012177733879070729, 0.1318926364183426, 3.725271199073177e-06, 0.00031992016010917723, 0.9992295059317203],
|
||||
[-0.10824537411387734, -1.7634001778787933e-05, -0.00017634002142585814, 0.12974874675273895, 5.541753580473596e-06, 0.00031323812436312437, 0.9988582529369309],
|
||||
[-0.10769947128273318, -2.2707719836034812e-05, -0.00022707720927428454, 0.12775516510009766, 7.330325843213359e-06, 0.00030702617368660867, 0.9984960291624968],
|
||||
[-0.10719187355088806, -2.7425710868556052e-05, -0.00027425712323747575, 0.12590137124061584, 9.09294521989068e-06, 0.0003012513043358922, 0.998142616186421],
|
||||
[-0.10671988928055773, -3.181291322107427e-05, -0.0003181291394867003, 0.12417753040790558, 1.0831430699909106e-05, 0.00029588284087367356, 0.9977978007878223],
|
||||
[-0.10628102618360663, -3.589252446545288e-05, -0.00035892523010261357, 0.1225745677947998, 1.2547474398161285e-05, 0.0002908922324422747, 0.9974613748289103],
|
||||
[-0.09686010100009308, -0.00012337604130152613, -0.00033376028295606375, 0.08820036798715591, 1.378227989334846e-05, 0.00018323057156521827, 0.9971327104622644],
|
||||
[-0.09711245617035859, -0.00012103597691748291, -0.00031035972642712295, 0.08911982923746109, 1.5029957467049826e-05, 0.00018614112923387438, 0.9968120741787946],
|
||||
[-0.09734714586614258, -0.00011885998537763953, -0.00028859981102868915, 0.08997482806444168, 1.6289604900521226e-05, 0.0001888489641714841, 0.9964992693384843],
|
||||
[-0.09756540626975398, -0.00011683656339300796, -0.0002683655184227973, 0.09076987206935883, 1.7560383639647625e-05, 0.00019136829359922558, 0.9961941041558584],
|
||||
[-0.09776839378969632, -0.00011495500075398013, -0.00024954992113634944, 0.09150917828083038, 1.88415124284802e-05, 0.00019371230155229568, 0.9958963915774781],
|
||||
[-0.04090147625093484, -0.004023205488920212, -0.00023205348406918347, 0.31463244557380676, 3.578325777198188e-05, -0.22863617539405823, 0.9955856059993178],
|
||||
[-0.04097017598155184, -0.0040215784683823586, -0.00021578377345576882, 0.3147938847541809, 5.273369970382191e-05, -0.2285631000995636, 0.9952824091350698],
|
||||
[-0.0410352771200895, -0.004020065534859896, -0.0002006547583732754, 0.31494399905204773, 6.96922215865925e-05, -0.2284919172525406, 0.9949866152926238],
|
||||
[-0.041097000895768086, -0.004018658772110939, -0.00018658647604752332, 0.3150835931301117, 8.665826317155734e-05, -0.22842256724834442, 0.9946980433511353],
|
||||
[-0.04115555977774558, -0.004017350263893604, -0.00017350453708786517, 0.3152133822441101, 0.0001036312896758318, -0.22835500538349152, 0.9944165166465714],
|
||||
[-0.04121116576736435, -0.0040161339566111565, -0.000161339805345051, 0.3153340816497803, 0.00012061082088621333, -0.2282891720533371, 0.9941418628602553],
|
||||
[-0.04126399733776618, -0.004015002865344286, -0.0001500279613537714, 0.31544631719589233, 0.00013759639114141464, -0.22822502255439758, 0.9938739139103233],
|
||||
[-0.04131423253346301, -0.004013950936496258, -0.000139509211294353, 0.31555068492889404, 0.00015458758571185172, -0.22816252708435059, 0.9936125058460087],
|
||||
[-0.041362040718768846, -0.004012972582131624, -0.00012972795229870826, 0.31564775109291077, 0.00017158400441985577, -0.22810161113739014, 0.99335747874467],
|
||||
[-0.04140755778402792, -0.004012063145637512, -0.00012063248141203076, 0.3157379925251007, 0.00018858526891563088, -0.22804224491119385, 0.9931086766114875],
|
||||
[-0.04145094405318292, -0.004011217504739761, -0.00011217471183044836, 0.31582191586494446, 0.00020559107360895723, -0.22798439860343933, 0.9928659472817497],
|
||||
[-0.04149231813809619, -0.004010431002825499, -0.0001043099255184643, 0.31589996814727783, 0.00022260106925386935, -0.22792799770832062, 0.9926291423256576],
|
||||
[-0.04153181484392212, -0.004009699448943138, -9.699655493022874e-05, 0.31597253680229187, 0.0002396149793639779, -0.2278730422258377, 0.9923981169555751],
|
||||
[-0.041569535562070485, -0.004009019583463669, -9.019594290293753e-05, 0.3160400092601776, 0.0002566325129009783, -0.22781947255134583, 0.9921727299356587],
|
||||
[-0.04160559790412195, -0.004008387215435505, -8.387213165406138e-05, 0.3161027431488037, 0.0002736534224823117, -0.2277672439813614, 0.991952843493798],
|
||||
[0.39149452693873815, -0.17847982048988342, 0.17520178854465485, -0.9919443130493164, -0.0012358271051198244, -0.4408690929412842, 0.9875400426961929],
|
||||
[0.37430655796667994, -0.16218021512031555, 0.33819782733917236, -0.9469498991966248, -0.0012358271051198244, -0.4235963821411133, 0.9836890276104427],
|
||||
[0.3521089741311741, -0.14702340960502625, 0.4897659122943878, -0.9051101207733154, -0.0012358271051198244, -0.38455620408058167, 0.9802772670978159],
|
||||
[0.33180054687547955, -0.13292928040027618, 0.6307072639465332, -0.8662038445472717, -0.0012358271051198244, -0.34926027059555054, 0.9772155204395125],
|
||||
[0.3131357750502409, -0.11982330679893494, 0.7617669701576233, -0.830025315284729, -0.0012358271051198244, -0.3171355724334717, 0.9744541209523172],
|
||||
[0.2959267284560149, -0.1076362207531929, 0.8836377859115601, -0.7963834404945374, -0.0012358271051198244, -0.287752240896225, 0.9719767824781306],
|
||||
[0.2800275202058069, -0.09630359709262848, 0.9969640374183655, -0.7651001811027527, -0.0012358271051198244, -0.26078182458877563, 0.9697871497690216],
|
||||
[0.26531816675540615, -0.0857655256986618, 1.1023447513580322, -0.7360102534294128, -0.0012358271051198244, -0.23596204817295074, 0.9678939521880274],
|
||||
[0.25198985745877733, -0.07596629858016968, 1.2003370523452759, -0.7089598774909973, -0.002314679091796279, -0.2130759358406067, 0.9663002834303565],
|
||||
[0.2396477597851904, -0.06685411185026169, 1.2914588451385498, -0.6838060617446899, -0.0033552534878253937, -0.1919393688440323, 0.9649991785284114],
|
||||
[-0.09422456384566856, 0.2572912275791168, 1.2009122371673584, 0.21098390221595764, -0.003034190973266959, 0.13744576275348663, 0.9640429283994295],
|
||||
[-0.07978759632768234, 0.24887140095233917, 1.1167140007019043, 0.18774132430553436, -0.002748497761785984, 0.10748443752527237, 0.9631736928535165],
|
||||
[-0.0664175214480964, 0.241041898727417, 1.0384190082550049, 0.16612830758094788, -0.002495693741366267, 0.07983637601137161, 0.9623884128742163],
|
||||
[-0.053728477209861736, 0.23376135528087616, 0.9656134843826294, 0.14603063464164734, -0.0022734731901437044, 0.05319900065660477, 0.9616834933561276],
|
||||
[-0.04201910414965606, 0.22699125111103058, 0.8979125022888184, 0.12734206020832062, -0.0020796917378902435, 0.028771236538887024, 0.9610549332646039],
|
||||
[-0.031218250517506735, 0.22069580852985382, 0.8349581360816956, 0.10996375977993011, -0.0019123556558042765, 0.006389177404344082, 0.9604984525950518],
|
||||
[-0.021263405719875502, 0.21484176814556122, 0.77641761302948, 0.09380389004945755, -0.0017696106806397438, -0.014086096547544003, 0.960009608840235],
|
||||
[-0.012098686887233694, 0.20939815044403076, 0.7219814658164978, 0.078777015209198, -0.0016497325850650668, -0.03277546167373657, 0.9595838985390357],
|
||||
[-0.003672592715702306, 0.20433619618415833, 0.6713619828224182, 0.06480371952056885, -0.0015511182136833668, -0.04978952929377556, 0.9592168418991078],
|
||||
[0.00406393343230147, 0.19962915778160095, 0.6242915391921997, 0.05181010439991951, -0.001472276751883328, -0.06523533910512924, 0.9589040503149374],
|
||||
[0.48410737514213165, 0.18219728767871857, 0.44997286796569824, -1.1394410133361816, -0.001472276751883328, -0.6335095763206482, 0.9587681111885773],
|
||||
[0.49315757002758503, 0.16598761081695557, 0.28787603974342346, -1.1841872930526733, -0.001472276751883328, -0.6214309334754944, 0.9587904679721979],
|
||||
[0.5019417267515031, 0.15091441571712494, 0.13714411854743958, -1.225796103477478, -0.001472276751883328, -0.6114248037338257, 0.9589498270423709],
|
||||
[0.5066429697011797, 0.13689802587032318, -0.003019690979272127, -1.2644877433776855, -0.001472276751883328, -0.5896181464195251, 0.9592242556540338],
|
||||
[0.5101462535718515, 0.12386436760425568, -0.13335634768009186, -1.3004666566848755, -0.001472276751883328, -0.5670620203018188, 0.9595791248723795],
|
||||
[0.5142910196551662, 0.11174451559782028, -0.2545548677444458, -1.333923101425171, -0.001472276751883328, -0.5495010018348694, 0.9599940969615668],
|
||||
[0.5201145837768681, 0.10047440975904465, -0.36725589632987976, -1.365033745765686, -0.001472276751883328, -0.5403749346733093, 0.9604526447819721],
|
||||
[0.5266811298830298, 0.08999447524547577, -0.4720552861690521, -1.393963098526001, -0.001472276751883328, -0.535976767539978, 0.960942258826627],
|
||||
[0.5338802248892695, 0.08024930208921432, -0.5695069432258606, -1.4208643436431885, -0.0036344616673886776, -0.5336002111434937, 0.9614542357182847],
|
||||
[0.5408488076228934, 0.07118739187717438, -0.6601260900497437, -1.4458792209625244, -0.0058347126469016075, -0.5321179628372192, 0.9619831418920445],
|
||||
[0.7028698686034933, -0.11038433760404587, -0.6138433814048767, -1.9471006393432617, -0.008797692134976387, -0.6217712163925171, 0.9607405300190316],
|
||||
[0.6994011993598761, -0.1060805693268776, -0.5708056688308716, -1.9352203607559204, -0.01174259278923273, -0.6179541945457458, 0.9596426684609639],
|
||||
[0.23312593818015387, -0.2528565227985382, -0.7060651779174805, 0.0008099577389657497, -0.011739371344447136, -0.9908731579780579, 0.952430201176377],
|
||||
[0.2434041360989544, -0.2654341459274292, -0.8318413496017456, -0.010858933441340923, -0.01178255956619978, -1.025451421737671, 0.9449690078640667],
|
||||
[0.253317730894443, -0.2771299183368683, -0.9487991333007812, -0.02170969545841217, -0.011868905276060104, -1.0575085878372192, 0.9373360301855578],
|
||||
[0.26255685417824387, -0.28800567984580994, -1.0575568675994873, -0.031799692660570145, -0.01199538167566061, -1.086762547492981, 0.9295956164929802],
|
||||
[0.2710665935147652, -0.29811891913414, -1.158689260482788, -0.0411822572350502, -0.012159174308180809, -1.1133455038070679, 0.9218004861200195],
|
||||
[0.27887848906778195, -0.30752310156822205, -1.2527310848236084, -0.04990699514746666, -0.01235766801983118, -1.1375019550323486, 0.9139932139127096],
|
||||
[0.2860453251332994, -0.3162679374217987, -1.3401795625686646, -0.05802002176642418, -0.012588429264724255, -1.1594711542129517, 0.9062078294862433],
|
||||
[0.29262013944878107, -0.3243996798992157, -1.4214967489242554, -0.06556423008441925, -0.012849196791648865, -1.1794589757919312, 0.8984713202557664],
|
||||
[0.2965762375070544, -0.3319612741470337, -1.4971126317977905, -0.07257950305938721, -0.013137864880263805, -1.1887227296829224, 0.890804948172658],
|
||||
[0.29673017429383713, -0.338992714881897, -1.5674270391464233, -0.07910291105508804, -0.013452478684484959, -1.1821510791778564, 0.8832253574194441],
|
||||
[0.41061267535808227, -0.8018531799316406, -1.4575316905975342, -0.5085219144821167, -0.015475008636713028, -1.1757267713546753, 0.875901053699282],
|
||||
[0.40652346184609994, -0.7916341423988342, -1.3553414344787598, -0.4990411698818207, -0.01745983213186264, -1.1687333583831787, 0.8685500023249335],
|
||||
[0.40265765780722296, -0.782131552696228, -1.2603157758712769, -0.4902251958847046, -0.01940959133207798, -1.1617332696914673, 0.8612116165161448],
|
||||
[0.3990088976545998, -0.7732952833175659, -1.1719526052474976, -0.4820272922515869, -0.021326744928956032, -1.1547510623931885, 0.8539169219698891],
|
||||
[0.3955735707575926, -0.7650784850120544, -1.089784860610962, -0.47440415620803833, -0.02321358025074005, -1.1478044986724854, 0.8466900757753881],
|
||||
[0.3923516701322979, -0.7574377655982971, -1.0133779048919678, -0.4673154652118683, -0.025072220712900162, -1.1409056186676025, 0.8395496933996105],
|
||||
[0.3893475132440573, -0.7503328323364258, -0.9423280358314514, -0.4607238173484802, -0.026904644444584846, -1.13406240940094, 0.8325099606152043],
|
||||
[0.3865700034207256, -0.7437259554862976, -0.8762596249580383, -0.45459431409835815, -0.028712689876556396, -1.1272797584533691, 0.8255815419106031],
|
||||
[0.3840324206232294, -0.7375823259353638, -0.8148233890533447, -0.4488946199417114, -0.030498066917061806, -1.1205604076385498, 0.818772311184273],
|
||||
[0.38175135472175165, -0.7318694591522217, -0.7576946020126343, -0.44359442591667175, -0.03226236253976822, -1.1139053106307983, 0.8120879340440293],
|
||||
[0.3797449488321292, -0.7265571355819702, -0.7045711874961853, -0.4386659264564514, -0.034007057547569275, -1.1073145866394043, 0.8055323294502604],
|
||||
[0.3780300673806064, -0.7216172218322754, -0.6551723480224609, -0.434082955121994, -0.03573352470993996, -1.1007879972457886, 0.7991080348309247],
|
||||
[0.37661911222198174, -0.7170236706733704, -0.6092369556427002, -0.42982131242752075, -0.03744304180145264, -1.0943243503570557, 0.7928164947139084],
|
||||
[0.375516623653327, -0.7127522230148315, -0.5665221810340881, -0.42585843801498413, -0.039136793464422226, -1.0879226922988892, 0.7866582890856323],
|
||||
[0.3747164794461302, -0.7087802290916443, -0.5268022418022156, -0.422173410654068, -0.040815893560647964, -1.0815815925598145, 0.7806333143686989],
|
||||
[-0.20772754196718846, -0.6875587105751038, -0.3145873546600342, 0.6213363409042358, -0.038344670087099075, 0.2443287968635559, 0.7746891641094066],
|
||||
[-0.21866468578859813, -0.6678251028060913, -0.11725125461816788, 0.639644205570221, -0.03580063208937645, 0.22835691273212433, 0.768857914097388],
|
||||
[-0.21585936135228045, -0.64947509765625, 0.06624923646450043, 0.6566684246063232, -0.03318887948989868, 0.19066141545772552, 0.7629371203539954],
|
||||
[-0.21170539564628826, -0.6324115991592407, 0.23688414692878723, 0.6724991202354431, -0.030514167621731758, 0.18755827844142914, 0.7569298493810652],
|
||||
[-0.20825468733893712, -0.6165444254875183, 0.3955555260181427, 0.6872198581695557, -0.027780907228589058, 0.1886463463306427, 0.7509517971922638],
|
||||
[-0.20765131927666683, -0.6017897725105286, 0.5431021451950073, 0.7009085416793823, -0.024993203580379486, 0.189396932721138, 0.7449545261546827],
|
||||
[-0.20931310703436964, -0.5880696177482605, 0.6803039908409119, 0.7136374115943909, -0.022154873237013817, 0.1900661140680313, 0.7388997712783383],
|
||||
[-0.2119479932436941, -0.5753113627433777, 0.8078863620758057, 0.7254738807678223, -0.019269464537501335, 0.19072134792804718, 0.7327627342863612],
|
||||
[-0.214879791806119, -0.5634476542472839, 0.9265236854553223, 0.7364804148674011, -0.016340281814336777, 0.19137808680534363, 0.726534773886686],
|
||||
[-0.21783949300901684, -0.552415668964386, 1.0368430614471436, 0.7467153668403625, -0.013370390981435776, 0.1920388787984848, 0.72022400558647],
|
||||
[-0.4000595975484858, 0.27866479754447937, 0.9641480445861816, 1.5177505016326904, -0.013370390981435776, 0.21871788799762726, 0.724840854185572],
|
||||
[-0.3994851887388485, 0.27190497517585754, 0.8965498208999634, 1.511479139328003, -0.007358826231211424, 0.21651430428028107, 0.7293932460262814],
|
||||
[-0.12559398326384016, 0.16584111750125885, 0.6584112048149109, 0.5665791034698486, -0.007358826231211424, -0.08538465946912766, 0.7349058161108437],
|
||||
[-0.10789803604675546, 0.1436968892812729, 0.43696895241737366, 0.5290815234184265, -0.007358826231211424, -0.11545012146234512, 0.7405128616799562],
|
||||
[-0.0862580050786427, 0.1231052428483963, 0.2310524582862854, 0.4942130148410797, -0.007358826231211424, -0.16420002281665802, 0.7461701549526497],
|
||||
[-0.07228152550883607, 0.10395731776952744, 0.039573147892951965, 0.46178919076919556, -0.007358826231211424, -0.18570244312286377, 0.7518367441941683],
|
||||
[-0.059641074877463084, 0.08615188300609589, -0.13848116993904114, 0.4316386580467224, -0.007358826231211424, -0.2014855146408081, 0.7574720838700055],
|
||||
[-0.048077934326112653, 0.06959482282400131, -0.3040517568588257, 0.40360206365585327, -0.005887060891836882, -0.2165762484073639, 0.7630477127348814],
|
||||
[-0.032830461086908264, 0.05419861152768135, -0.4580138921737671, 0.37753111124038696, -0.005887060891836882, -0.24716003239154816, 0.768545673778488],
|
||||
[-0.019114990494410455, 0.03988185524940491, -0.6011814475059509, 0.35328808426856995, -0.005887060891836882, -0.2746863067150116, 0.7739557730076617],
|
||||
[-0.006568739275635086, 0.026568876579403877, -0.7343112230300903, 0.33074474334716797, -0.005887060891836882, -0.29983335733413696, 0.7792738195520029],
|
||||
[0.005020647807338746, 0.014189294539391994, -0.8581070303916931, 0.3097819983959198, -0.005887060891836882, -0.32303452491760254, 0.7844993819957966],
|
||||
[0.22014447128082382, -0.2797943651676178, -0.7979435324668884, -0.18803030252456665, -0.006316260434687138, -0.632738471031189, 0.7807180815256229],
|
||||
[0.2115738977363323, -0.27419981360435486, -0.7419981956481934, -0.178556889295578, -0.006723836064338684, -0.6094859838485718, 0.777189561263008],
|
||||
[0.20363067710926294, -0.26899752020835876, -0.6899752616882324, -0.16974768042564392, -0.007111303508281708, -0.5878965258598328, 0.7739044654886423],
|
||||
[-0.5364496390516296, -0.24663199484348297, -0.4663200080394745, -0.13187538087368011, -0.007111303508281708, 2.147817850112915, 0.7714640447550488],
|
||||
[-0.5626995659039997, -0.22583456337451935, -0.25834566354751587, -0.09665840119123459, -0.007111303508281708, 2.1954567432403564, 0.7699120400719075],
|
||||
[-0.5788702079428418, -0.2064952701330185, -0.06495276838541031, -0.06391053646802902, -0.007111303508281708, 2.2071051597595215, 0.7692452258750052],
|
||||
[-0.5566819383639362, -0.1885119080543518, 0.11488097161054611, -0.033458687365055084, -0.007111303508281708, 2.100590705871582, 0.7693473090415099],
|
||||
[-0.5595099396933427, -0.17178937792778015, 0.2821062207221985, -0.005141880363225937, -0.007111303508281708, 2.100940704345703, 0.7700537236118319],
|
||||
[-0.8676624855778264, -0.4062393009662628, 0.4376069903373718, -0.7280921936035156, -0.01135850790888071, 5.69326639175415, 0.7638278009790337],
|
||||
[-0.8480258972379789, -0.39177948236465454, 0.5822052955627441, -0.7190147042274475, -0.015552760101854801, 5.644999980926514, 0.7576461193038383],
|
||||
[-0.8396424971861073, -0.3783334493637085, 0.7166655659675598, -0.7105735540390015, -0.019697772338986397, 5.596573829650879, 0.7514720746944674],
|
||||
[-0.836060292926218, -0.3658301532268524, 0.8416985273361206, -0.7027242183685303, -0.02379699796438217, 5.547639846801758, 0.7452774336652609],
|
||||
[-0.8343545265510168, -0.3542034924030304, 0.9579651951789856, -0.695425271987915, -0.027853645384311676, 5.497928619384766, 0.7390478495218085],
|
||||
[-0.999999999999923, 7.306608200073242, 1.0660802125930786, 4.113862037658691, -0.027853645384311676, 6.132761478424072, 0.7446808313863519],
|
||||
[-0.9999999999999263, 7.316661357879639, 1.1666151285171509, 4.12017297744751, -0.027853645384311676, 6.175716876983643, 0.7501764234493237],
|
||||
[-0.9999999999999294, 7.326010227203369, 1.2601011991500854, 4.126042366027832, -0.027853645384311676, 6.21760368347168, 0.7555379766814936],
|
||||
[-0.999999999999932, 7.33470344543457, 1.347032904624939, 4.131499290466309, -0.027853645384311676, 6.258456707000732, 0.7607687603226371],
|
||||
[-0.9999999999999345, 7.34278678894043, 1.4278696775436401, 4.1365742683410645, -0.027853645384311676, 6.298305988311768, 0.765871963874974],
|
||||
[-0.9999999999999989, 8.232775688171387, 1.327759027481079, 4.695289611816406, -0.027853645384311676, 6.337148666381836, 0.7708506990480516],
|
||||
[-0.9999999999999988, 8.223466873168945, 1.2346673011779785, 4.689445495605469, -0.027853645384311676, 6.375036239624023, 0.775708001655932],
|
||||
[0.21049512553768698, 8.197281837463379, 0.9728226065635681, 5.45698881149292, 0.003978789318352938, -6.231379508972168, 0.780446833468498],
|
||||
[0.2167229865238455, 8.172933578491211, 0.7293363809585571, 5.441702842712402, 0.03572205454111099, -6.270630836486816, 0.7850700840173425],
|
||||
[0.22259849652426045, 8.15029239654541, 0.5029214024543762, 5.427489280700684, 0.06738241016864777, -6.309582233428955, 0.7895805723576782],
|
||||
[0.22835713541223146, 8.12923812866211, 0.2923808693885803, 5.414271831512451, 0.09896565973758698, -6.349024772644043, 0.7939810487872736],
|
||||
[0.23442855370863105, 8.109660148620605, 0.09660171717405319, 5.401981353759766, 0.13047721982002258, -6.390467166900635, 0.7982741965234642],
|
||||
[0.248353420679028, 8.09145450592041, -0.08545099198818207, 5.390552520751953, 0.16192211210727692, -6.4614481925964355, 0.8020599373232822],
|
||||
[0.25067633677385975, 8.074525833129883, -0.2547396421432495, 5.379924774169922, 0.19330500066280365, -6.4907050132751465, 0.8054052405018639],
|
||||
[0.25126092480715734, 8.058784484863281, -0.41215911507606506, 5.37004280090332, 0.22463025152683258, -6.514287948608398, 0.808214631238123],
|
||||
[0.250099985295841, 8.044145584106445, -0.5585416555404663, 5.36085319519043, 0.25590190291404724, -6.532121181488037, 0.8103390489042367],
|
||||
[0.24689576802597524, 8.030533790588379, -0.694661021232605, 5.3523077964782715, 0.2871236801147461, -6.543070316314697, 0.8116433931864653],
|
||||
[0.9999999999999986, -8.164595603942871, -0.6459569931030273, -4.814634799957275, 0.2871236801147461, -7.163768768310547, 0.8135545394151179],
|
||||
[0.9999999999999986, -8.160066604614258, -0.6006677150726318, -4.81179141998291, 0.2871236801147461, -7.178984642028809, 0.8154190723211203],
|
||||
[-0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0],
|
||||
[-0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0],
|
||||
[-0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0],
|
||||
[0.6282397257481224, -0.0759519413113594, 0.05048057436943054, -2.187089681625366, -0.0002551604702603072, -0.3603832423686981, 0.9991124139302132],
|
||||
[0.5691325038955412, -0.0712578147649765, 0.09742186218500137, -1.9766871929168701, -0.00048577398410998285, -0.35422271490097046, 0.9982771386678583],
|
||||
[0.5141920378419026, -0.06689280271530151, 0.14107200503349304, -1.781036376953125, -0.0006935615674592555, -0.3485835790634155, 0.9974910563680077],
|
||||
[0.4631199568724304, -0.06283382326364517, 0.18166175484657288, -1.5991029739379883, -0.0008801235817372799, -0.34340646862983704, 0.9967511103297959],
|
||||
[0.4156403360710332, -0.05905943363904953, 0.21940568089485168, -1.4299253225326538, -0.0010469482513144612, -0.33864158391952515, 0.996054354716816],
|
||||
[0.37152292685438515, -0.05554967001080513, 0.2545033097267151, -1.272608995437622, -0.0011954192304983735, -0.3343393802642822, 0.9953979847183112],
|
||||
[0.33049756880200193, -0.05228598415851593, 0.2871401607990265, -1.1263223886489868, -0.0013268234906718135, -0.3303412199020386, 0.9947793526160259],
|
||||
[-0.5128558334344437, 0.01770082116127014, 0.2670082151889801, 2.0106611251831055, -0.0013268234906718135, -0.26141688227653503, 0.9947870032699171],
|
||||
[-0.489527715216843, 0.015828775241971016, 0.24828776717185974, 1.9267513751983643, -0.001102035865187645, -0.26311376690864563, 0.9947971654884007],
|
||||
[-0.46783530644871996, 0.014087983407080173, 0.23087982833385468, 1.8487247228622437, -0.0008863512775860727, -0.2646978199481964, 0.9948095529007845]
|
||||
]
|
||||
},
|
||||
"2023_tuned": {
|
||||
"before": {
|
||||
"factor": 3.6600000858306885,
|
||||
"negLimit": -3.0,
|
||||
"posLimit": 3.0
|
||||
},
|
||||
"after": {
|
||||
"factor": 3.6600000858306885,
|
||||
"negLimit": -3.6600000858306885,
|
||||
"posLimit": 3.6600000858306885
|
||||
},
|
||||
"rows": [
|
||||
[-0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0],
|
||||
[-0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0],
|
||||
[-0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0],
|
||||
[-0.10946365319690253, -6.3100724219111726e-06, -6.310072058113292e-05, 0.1341981738805771, 1.8787743556458736e-06, 0.00032638496486470103, 0.9996100118902765],
|
||||
[-0.10883226781007806, -1.2177733879070729e-05, -0.00012177733879070729, 0.1318926364183426, 3.725271199073177e-06, 0.0003191980067640543, 0.9992295059317203],
|
||||
[-0.10824517696030346, -1.7634001778787933e-05, -0.00017634002142585814, 0.12974874675273895, 5.541753580473596e-06, 0.00031251655309461057, 0.9988582529369309],
|
||||
[-0.10769927427915203, -2.2707719836034812e-05, -0.00022707720927428454, 0.12775516510009766, 7.330325843213359e-06, 0.00030630515539087355, 0.9984960291624968],
|
||||
[-0.10719167668995669, -2.7425710868556052e-05, -0.00027425712323747575, 0.12590137124061584, 9.09294521989068e-06, 0.0003005308099091053, 0.998142616186421],
|
||||
[-0.10671969255537025, -3.181291322107427e-05, -0.0003181291394867003, 0.12417753040790558, 1.0831430699909106e-05, 0.0002951628412120044, 0.9977978007878223],
|
||||
[-0.10628082958766569, -3.589252446545288e-05, -0.00035892523010261357, 0.1225745677947998, 1.2547474398161285e-05, 0.00029017269844189286, 0.9974613748289103],
|
||||
[-0.0968599058624398, -0.00012337604130152613, -0.00033376028295606375, 0.08820036798715591, 1.378227989334846e-05, 0.00018251637811772525, 0.9971327104622644],
|
||||
[-0.09711226105667088, -0.00012103597691748291, -0.00031035972642712295, 0.08911982923746109, 1.5029957467049826e-05, 0.0001854270085459575, 0.9968120741787946],
|
||||
[-0.09734695077753276, -0.00011885998537763953, -0.00028859981102868915, 0.08997482806444168, 1.6289604900521226e-05, 0.00018813494534697384, 0.9964992693384843],
|
||||
[-0.09756521120718856, -0.00011683656339300796, -0.0002683655184227973, 0.09076987206935883, 1.7560383639647625e-05, 0.0001906543766381219, 0.9961941041558584],
|
||||
[-0.09776819875400798, -0.00011495500075398013, -0.00024954992113634944, 0.09150917828083038, 1.88415124284802e-05, 0.00019299845735076815, 0.9958963915774781],
|
||||
[-0.04038609594503885, -0.004023205488920212, -0.00023205348406918347, 0.31463244557380676, 3.578325777198188e-05, -0.23052246868610382, 0.9955856059993178],
|
||||
[-0.04045497259462703, -0.0040215784683823586, -0.00021578377345576882, 0.3147938847541809, 5.273369970382191e-05, -0.23044875264167786, 0.9952824091350698],
|
||||
[-0.04052024540574341, -0.004020065534859896, -0.0002006547583732754, 0.31494399905204773, 6.96922215865925e-05, -0.2303769439458847, 0.9949866152926238],
|
||||
[-0.04058213580150532, -0.004018658772110939, -0.00018658647604752332, 0.3150835931301117, 8.665826317155734e-05, -0.2303069829940796, 0.9946980433511353],
|
||||
[-0.04064085643555087, -0.004017350263893604, -0.00017350453708786517, 0.3152133822441101, 0.0001036312896758318, -0.23023882508277893, 0.9944165166465714],
|
||||
[-0.04069661948485031, -0.0040161339566111565, -0.000161339805345051, 0.3153340816497803, 0.00012061082088621333, -0.23017242550849915, 0.9941418628602553],
|
||||
[-0.04074960358984859, -0.004015002865344286, -0.0001500279613537714, 0.31544631719589233, 0.00013759639114141464, -0.23010770976543427, 0.9938739139103233],
|
||||
[-0.040799986954527745, -0.004013950936496258, -0.000139509211294353, 0.31555068492889404, 0.00015458758571185172, -0.2300446629524231, 0.9936125058460087],
|
||||
[-0.04084793909529766, -0.004012972582131624, -0.00012972795229870826, 0.31564775109291077, 0.00017158400441985577, -0.22998322546482086, 0.99335747874467],
|
||||
[-0.040893596047652886, -0.004012063145637512, -0.00012063248141203076, 0.3157379925251007, 0.00018858526891563088, -0.22992335259914398, 0.9931086766114875],
|
||||
[-0.040937118274140864, -0.004011217504739761, -0.00011217471183044836, 0.31582191586494446, 0.00020559107360895723, -0.22986499965190887, 0.9928659472817497],
|
||||
[-0.0409786245190571, -0.004010431002825499, -0.0001043099255184643, 0.31589996814727783, 0.00022260106925386935, -0.22980812191963196, 0.9926291423256576],
|
||||
[-0.041018249714166545, -0.004009699448943138, -9.699655493022874e-05, 0.31597253680229187, 0.0002396149793639779, -0.22975268959999084, 0.9923981169555751],
|
||||
[-0.041056095371993916, -0.004009019583463669, -9.019594290293753e-05, 0.3160400092601776, 0.0002566325129009783, -0.22969865798950195, 0.9921727299356587],
|
||||
[-0.041092279220044096, -0.004008387215435505, -8.387213165406138e-05, 0.3161027431488037, 0.0002736534224823117, -0.2296459972858429, 0.991952843493798],
|
||||
[0.3910602049801107, -0.17847982048988342, 0.17520178854465485, -0.9919443130493164, -0.0012358271051198244, -0.43927818536758423, 0.9875400426961929],
|
||||
[0.3728127754776832, -0.16218021512031555, 0.33819782733917236, -0.9469498991966248, -0.0012358271051198244, -0.418121874332428, 0.9836890276104427],
|
||||
[0.3507208261109926, -0.14702340960502625, 0.4897659122943878, -0.9051101207733154, -0.0012358271051198244, -0.3794669806957245, 0.9802772670978159],
|
||||
[0.33052168875038607, -0.13292928040027618, 0.6307072639465332, -0.8662038445472717, -0.0012358271051198244, -0.34457075595855713, 0.9772155204395125],
|
||||
[0.31196315588541873, -0.11982330679893494, 0.7617669701576233, -0.830025315284729, -0.0012358271051198244, -0.31283509731292725, 0.9744541209523172],
|
||||
[0.2948547458290457, -0.1076362207531929, 0.8836377859115601, -0.7963834404945374, -0.0012358271051198244, -0.2838205397129059, 0.9719767824781306],
|
||||
[0.27904976480994237, -0.09630359709262848, 0.9969640374183655, -0.7651001811027527, -0.0012358271051198244, -0.25719547271728516, 0.9697871497690216],
|
||||
[0.2644281689694541, -0.0857655256986618, 1.1023447513580322, -0.7360102534294128, -0.0012358271051198244, -0.23269745707511902, 0.9678939521880274],
|
||||
[0.25118140077284884, -0.07596629858016968, 1.2003370523452759, -0.7089598774909973, -0.002314679091796279, -0.2101103514432907, 0.9663002834303565],
|
||||
[0.2389150006695386, -0.06685411185026169, 1.2914588451385498, -0.6838060617446899, -0.0033552534878253937, -0.1892513930797577, 0.9649991785284114],
|
||||
[-0.07901424315348991, 0.2572912275791168, 1.2009122371673584, 0.21098390221595764, -0.003034190973266959, 0.08168985694646835, 0.9640429283994295],
|
||||
[-0.06462022053982568, 0.24887140095233917, 1.1167140007019043, 0.18774132430553436, -0.002748497761785984, 0.051885414868593216, 0.9631736928535165],
|
||||
[-0.051341863217181795, 0.241041898727417, 1.0384190082550049, 0.16612830758094788, -0.002495693741366267, 0.024573015049099922, 0.9623884128742163],
|
||||
[-0.038794570414420915, 0.23376135528087616, 0.9656134843826294, 0.14603063464164734, -0.0022734731901437044, -0.0015452472725883126, 0.9616834933561276],
|
||||
[-0.02727243474777478, 0.22699125111103058, 0.8979125022888184, 0.12734206020832062, -0.0020796917378902435, -0.025287091732025146, 0.9610549332646039],
|
||||
[-0.016701299459840592, 0.22069580852985382, 0.8349581360816956, 0.10996375977993011, -0.0019123556558042765, -0.046827398240566254, 0.9604984525950518],
|
||||
[-0.007015004831310648, 0.21484176814556122, 0.77641761302948, 0.09380389004945755, -0.0017696106806397438, -0.06631841510534286, 0.960009608840235],
|
||||
[0.0018467047985609802, 0.20939815044403076, 0.7219814658164978, 0.078777015209198, -0.0016497325850650668, -0.08389700949192047, 0.9595838985390357],
|
||||
[0.00994047632837133, 0.20433619618415833, 0.6713619828224182, 0.06480371952056885, -0.0015511182136833668, -0.09969261288642883, 0.9592168418991078],
|
||||
[0.01732120216671505, 0.19962915778160095, 0.6242915391921997, 0.05181010439991951, -0.001472276751883328, -0.11383365094661713, 0.9589040503149374],
|
||||
[0.5091351260568596, 0.18219728767871857, 0.44997286796569824, -1.1394410133361816, -0.001472276751883328, -0.7252450585365295, 0.9587681111885773],
|
||||
[0.5139989779286086, 0.16598761081695557, 0.28787603974342346, -1.1841872930526733, -0.001472276751883328, -0.6978006362915039, 0.9587904679721979],
|
||||
[0.5185418167319423, 0.15091441571712494, 0.13714411854743958, -1.225796103477478, -0.001472276751883328, -0.6722335815429688, 0.9589498270423709],
|
||||
[0.51885924037396, 0.13689802587032318, -0.003019690979272127, -1.2644877433776855, -0.001472276751883328, -0.6343601942062378, 0.9592242556540338],
|
||||
[0.5173505210709428, 0.12386436760425568, -0.13335634768009186, -1.3004666566848755, -0.001472276751883328, -0.593455970287323, 0.9595791248723795],
|
||||
[0.5184302249753999, 0.11174451559782028, -0.2545548677444458, -1.333923101425171, -0.001472276751883328, -0.5646713376045227, 0.9599940969615668],
|
||||
[0.5224928584304824, 0.10047440975904465, -0.36725589632987976, -1.365033745765686, -0.001472276751883328, -0.5490943193435669, 0.9604526447819721],
|
||||
[0.5280438958049607, 0.08999447524547577, -0.4720552861690521, -1.393963098526001, -0.001472276751883328, -0.5409742593765259, 0.960942258826627],
|
||||
[0.5346631335970315, 0.08024930208921432, -0.5695069432258606, -1.4208643436431885, -0.0036344616673886776, -0.5364716649055481, 0.9614542357182847],
|
||||
[0.5413127450841172, 0.07118739187717438, -0.6601260900497437, -1.4458792209625244, -0.0058347126469016075, -0.5338196754455566, 0.9619831418920445],
|
||||
[0.7082116168003382, -0.11038433760404587, -0.6138433814048767, -1.9471006393432617, -0.008797692134976387, -0.6413612365722656, 0.9607405300190316],
|
||||
[0.7042939608425406, -0.1060805693268776, -0.5708056688308716, -1.9352203607559204, -0.01174259278923273, -0.6358973979949951, 0.9596426684609639],
|
||||
[0.24831279792116212, -0.2528565227985382, -0.7060651779174805, 0.0008099577389657497, -0.011739371344447136, -1.0561350584030151, 0.952430201176377],
|
||||
[0.2605646218326958, -0.2654341459274292, -0.8318413496017456, -0.010858933441340923, -0.01178255956619978, -1.09934401512146, 0.9449690078640667],
|
||||
[0.2718220379521747, -0.2771299183368683, -0.9487991333007812, -0.02170969545841217, -0.011868905276060104, -1.1372101306915283, 0.9373360301855578],
|
||||
[0.28187099517007774, -0.28800567984580994, -1.0575568675994873, -0.031799692660570145, -0.01199538167566061, -1.1699283123016357, 0.9295956164929802],
|
||||
[0.2907922906315725, -0.29811891913414, -1.158689260482788, -0.0411822572350502, -0.012159174308180809, -1.1982460021972656, 0.9218004861200195],
|
||||
[0.29874013254349824, -0.30752310156822205, -1.2527310848236084, -0.04990699514746666, -0.01235766801983118, -1.2229489088058472, 0.9139932139127096],
|
||||
[0.30586049504387924, -0.3162679374217987, -1.3401795625686646, -0.05802002176642418, -0.012588429264724255, -1.2446823120117188, 0.9062078294862433],
|
||||
[0.31227171779225527, -0.3243996798992157, -1.4214967489242554, -0.06556423008441925, -0.012849196791648865, -1.2639342546463013, 0.8984713202557664],
|
||||
[0.31613837939627004, -0.3319612741470337, -1.4971126317977905, -0.07257950305938721, -0.013137864880263805, -1.2727845907211304, 0.890804948172658],
|
||||
[0.31598466647005247, -0.338992714881897, -1.5674270391464233, -0.07910291105508804, -0.013452478684484959, -1.2648652791976929, 0.8832253574194441],
|
||||
[0.412307398886842, -0.8018531799316406, -1.4575316905975342, -0.5085219144821167, -0.015475008636713028, -1.1827421188354492, 0.875901053699282],
|
||||
[0.40834035227403603, -0.7916341423988342, -1.3553414344787598, -0.4990411698818207, -0.01745983213186264, -1.1762652397155762, 0.8685500023249335],
|
||||
[0.40459407470573316, -0.782131552696228, -1.2603157758712769, -0.4902251958847046, -0.01940959133207798, -1.1697709560394287, 0.8612116165161448],
|
||||
[0.4010615788878822, -0.7732952833175659, -1.1719526052474976, -0.4820272922515869, -0.021326744928956032, -1.1632810831069946, 0.8539169219698891],
|
||||
[0.39773876014683174, -0.7650784850120544, -1.089784860610962, -0.47440415620803833, -0.02321358025074005, -1.1568107604980469, 0.8466900757753881],
|
||||
[0.3946252502771808, -0.7574377655982971, -1.0133779048919678, -0.4673154652118683, -0.025072220712900162, -1.1503701210021973, 0.8395496933996105],
|
||||
[0.3917251408411536, -0.7503328323364258, -0.9423280358314514, -0.4607238173484802, -0.026904644444584846, -1.1439656019210815, 0.8325099606152043],
|
||||
[0.38904724328331075, -0.7437259554862976, -0.8762596249580383, -0.45459431409835815, -0.028712689876556396, -1.1376007795333862, 0.8255815419106031],
|
||||
[0.3866048728576752, -0.7375823259353638, -0.8148233890533447, -0.4488946199417114, -0.030498066917061806, -1.1312776803970337, 0.818772311184273],
|
||||
[0.3844147674325609, -0.7318694591522217, -0.7576946020126343, -0.44359442591667175, -0.03226236253976822, -1.1249967813491821, 0.8120879340440293],
|
||||
[0.38249530688908656, -0.7265571355819702, -0.7045711874961853, -0.4386659264564514, -0.034007057547569275, -1.118757963180542, 0.8055323294502604],
|
||||
[0.3808636470380862, -0.7216172218322754, -0.6551723480224609, -0.434082955121994, -0.03573352470993996, -1.1125606298446655, 0.7991080348309247],
|
||||
[0.3795324926695101, -0.7170236706733704, -0.6092369556427002, -0.42982131242752075, -0.03744304180145264, -1.106404185295105, 0.7928164947139084],
|
||||
[0.37850665054287286, -0.7127522230148315, -0.5665221810340881, -0.42585843801498413, -0.039136793464422226, -1.100287675857544, 0.7866582890856323],
|
||||
[0.3777801819633453, -0.7087802290916443, -0.5268022418022156, -0.422173410654068, -0.040815893560647964, -1.094210147857666, 0.7806333143686989],
|
||||
[-0.20729777909370484, -0.6875587105751038, -0.3145873546600342, 0.6213363409042358, -0.038344670087099075, 0.2426171749830246, 0.7746891641094066],
|
||||
[-0.21818560264028714, -0.6678251028060913, -0.11725125461816788, 0.639644205570221, -0.03580063208937645, 0.22653359174728394, 0.768857914097388],
|
||||
[-0.21585936156737215, -0.64947509765625, 0.06624923646450043, 0.6566684246063232, -0.03318887948989868, 0.19066141545772552, 0.7629371203539954],
|
||||
[-0.21170539606511912, -0.6324115991592407, 0.23688414692878723, 0.6724991202354431, -0.030514167621731758, 0.18755827844142914, 0.7569298493810652],
|
||||
[-0.2082546880932433, -0.6165444254875183, 0.3955555260181427, 0.6872198581695557, -0.027780907228589058, 0.1886463463306427, 0.7509517971922638],
|
||||
[-0.20765132059944635, -0.6017897725105286, 0.5431021451950073, 0.7009085416793823, -0.024993203580379486, 0.1893969476222992, 0.7449545261546827],
|
||||
[-0.20931310928896568, -0.5880696177482605, 0.6803039908409119, 0.7136374115943909, -0.022154873237013817, 0.1900661289691925, 0.7388997712783383],
|
||||
[-0.21194799696328787, -0.5753113627433777, 0.8078863620758057, 0.7254738807678223, -0.019269464537501335, 0.19072136282920837, 0.7327627342863612],
|
||||
[-0.21487979774071636, -0.5634476542472839, 0.9265236854553223, 0.7364804148674011, -0.016340281814336777, 0.19137810170650482, 0.726534773886686],
|
||||
[-0.217839502176056, -0.552415668964386, 1.0368430614471436, 0.7467153668403625, -0.013370390981435776, 0.19203892350196838, 0.72022400558647],
|
||||
[-0.3953891079754344, 0.27866479754447937, 0.9641480445861816, 1.5177505016326904, -0.013370390981435776, 0.1986016035079956, 0.724840854185572],
|
||||
[-0.39486614266660935, 0.27190497517585754, 0.8965498208999634, 1.511479139328003, -0.007358826231211424, 0.19661948084831238, 0.7293932460262814],
|
||||
[-0.10759649751357757, 0.16584111750125885, 0.6584112048149109, 0.5665791034698486, -0.007358826231211424, -0.15328480303287506, 0.7349058161108437],
|
||||
[-0.09036072132795119, 0.1436968892812729, 0.43696895241737366, 0.5290815234184265, -0.007358826231211424, -0.18148404359817505, 0.7405128616799562],
|
||||
[-0.07369937041296183, 0.1231052428483963, 0.2310524582862854, 0.4942130148410797, -0.007358826231211424, -0.21117648482322693, 0.7461701549526497],
|
||||
[-0.06381701228028135, 0.10395731776952744, 0.039573147892951965, 0.46178919076919556, -0.007358826231211424, -0.217171773314476, 0.7518367441941683],
|
||||
[-0.055415743881643206, 0.08615188300609589, -0.13848116993904114, 0.4316386580467224, -0.007358826231211424, -0.21726959943771362, 0.7574720838700055],
|
||||
[-0.0466145040604287, 0.06959482282400131, -0.3040517568588257, 0.40360206365585327, -0.005887060891836882, -0.22208988666534424, 0.7630477127348814],
|
||||
[-0.03318032454594341, 0.05419861152768135, -0.4580138921737671, 0.37753111124038696, -0.005887060891836882, -0.24583345651626587, 0.768545673778488],
|
||||
[-0.020609027396592147, 0.03988185524940491, -0.6011814475059509, 0.35328808426856995, -0.005887060891836882, -0.26900291442871094, 0.7739557730076617],
|
||||
[-0.00884738160424083, 0.026568876579403877, -0.7343112230300903, 0.33074474334716797, -0.005887060891836882, -0.29115262627601624, 0.7792738195520029],
|
||||
[0.0021526107575593704, 0.014189294539391994, -0.8581070303916931, 0.3097819983959198, -0.005887060891836882, -0.3121010661125183, 0.7844993819957966],
|
||||
[0.23092860055943876, -0.2797943651676178, -0.7979435324668884, -0.18803030252456665, -0.006316260434687138, -0.6732545495033264, 0.7807180815256229],
|
||||
[0.22203645253943774, -0.27419981360435486, -0.7419981956481934, -0.178556889295578, -0.006723836064338684, -0.6487880349159241, 0.777189561263008],
|
||||
[0.21375181990764777, -0.26899752020835876, -0.6899752616882324, -0.16974768042564392, -0.007111303508281708, -0.6259075403213501, 0.7739044654886423],
|
||||
[-0.5908803176998131, -0.24663199484348297, -0.4663200080394745, -0.13187538087368011, -0.007111303508281708, 2.3516433238983154, 0.7714640447550488],
|
||||
[-0.6025141066934809, -0.22583456337451935, -0.25834566354751587, -0.09665840119123459, -0.007111303508281708, 2.343456745147705, 0.7699120400719075],
|
||||
[-0.6035832997589058, -0.2064952701330185, -0.06495276838541031, -0.06391053646802902, -0.007111303508281708, 2.2982985973358154, 0.7692452258750052],
|
||||
[-0.5297092393754228, -0.1885119080543518, 0.11488097161054611, -0.033458687365055084, -0.007111303508281708, 2.00077748298645, 0.7693473090415099],
|
||||
[-0.5292549307682339, -0.17178937792778015, 0.2821062207221985, -0.005141880363225937, -0.007111303508281708, 1.9879966974258423, 0.7700537236118319],
|
||||
[-0.8676624855778264, -0.4062393009662628, 0.4376069903373718, -0.7280921936035156, -0.01135850790888071, 5.69266414642334, 0.7638278009790337],
|
||||
[-0.8480258972379789, -0.39177948236465454, 0.5822052955627441, -0.7190147042274475, -0.015552760101854801, 5.643935680389404, 0.7576461193038383],
|
||||
[-0.8396424971861073, -0.3783334493637085, 0.7166655659675598, -0.7105735540390015, -0.019697772338986397, 5.59476900100708, 0.7514720746944674],
|
||||
[-0.836060292926218, -0.3658301532268524, 0.8416985273361206, -0.7027242183685303, -0.02379699796438217, 5.54469633102417, 0.7452774336652609],
|
||||
[-0.8343545265510168, -0.3542034924030304, 0.9579651951789856, -0.695425271987915, -0.027853645384311676, 5.493298530578613, 0.7390478495218085],
|
||||
[-0.999999999999923, 7.306608200073242, 1.0660802125930786, 4.113862037658691, -0.027853645384311676, 6.132761478424072, 0.7446808313863519],
|
||||
[-0.9999999999999263, 7.316661357879639, 1.1666151285171509, 4.12017297744751, -0.027853645384311676, 6.175716876983643, 0.7501764234493237],
|
||||
[-0.9999999999999294, 7.326010227203369, 1.2601011991500854, 4.126042366027832, -0.027853645384311676, 6.21760368347168, 0.7555379766814936],
|
||||
[-0.999999999999932, 7.33470344543457, 1.347032904624939, 4.131499290466309, -0.027853645384311676, 6.258456707000732, 0.7607687603226371],
|
||||
[-0.9999999999999345, 7.34278678894043, 1.4278696775436401, 4.1365742683410645, -0.027853645384311676, 6.298305988311768, 0.765871963874974],
|
||||
[-0.9999999999999989, 8.232775688171387, 1.327759027481079, 4.695289611816406, -0.027853645384311676, 6.337148666381836, 0.7708506990480516],
|
||||
[-0.9999999999999988, 8.223466873168945, 1.2346673011779785, 4.689445495605469, -0.027853645384311676, 6.375036239624023, 0.775708001655932],
|
||||
[0.21049512553768698, 8.197281837463379, 0.9728226065635681, 5.45698881149292, 0.003978789318352938, -6.231379508972168, 0.780446833468498],
|
||||
[0.2167229865238455, 8.172933578491211, 0.7293363809585571, 5.441702842712402, 0.03572205454111099, -6.270630836486816, 0.7850700840173425],
|
||||
[0.22259849652426045, 8.15029239654541, 0.5029214024543762, 5.427489280700684, 0.06738241016864777, -6.309582233428955, 0.7895805723576782],
|
||||
[0.22835713541223146, 8.12923812866211, 0.2923808693885803, 5.414271831512451, 0.09896565973758698, -6.349024772644043, 0.7939810487872736],
|
||||
[0.23442855370863105, 8.109660148620605, 0.09660171717405319, 5.401981353759766, 0.13047721982002258, -6.390467166900635, 0.7982741965234642],
|
||||
[0.248353420679028, 8.09145450592041, -0.08545099198818207, 5.390552520751953, 0.16192211210727692, -6.4614481925964355, 0.8020599373232822],
|
||||
[0.25067633677385975, 8.074525833129883, -0.2547396421432495, 5.379924774169922, 0.19330500066280365, -6.4907050132751465, 0.8054052405018639],
|
||||
[0.25126092480715734, 8.058784484863281, -0.41215911507606506, 5.37004280090332, 0.22463025152683258, -6.514287948608398, 0.808214631238123],
|
||||
[0.250099985295841, 8.044145584106445, -0.5585416555404663, 5.36085319519043, 0.25590190291404724, -6.532121181488037, 0.8103390489042367],
|
||||
[0.24689576802597524, 8.030533790588379, -0.694661021232605, 5.3523077964782715, 0.2871236801147461, -6.543070316314697, 0.8116433931864653],
|
||||
[0.9999999999999986, -8.164595603942871, -0.6459569931030273, -4.814634799957275, 0.2871236801147461, -7.163768768310547, 0.8135545394151179],
|
||||
[0.9999999999999986, -8.160066604614258, -0.6006677150726318, -4.81179141998291, 0.2871236801147461, -7.178984642028809, 0.8154190723211203],
|
||||
[-0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0],
|
||||
[-0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0],
|
||||
[-0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0],
|
||||
[0.6300897116143003, -0.0759519413113594, 0.05048057436943054, -2.187089681625366, -0.0002551604702603072, -0.36715421080589294, 0.9991124139302132],
|
||||
[0.570021419692685, -0.0712578147649765, 0.09742186218500137, -1.9766871929168701, -0.00048577398410998285, -0.357476145029068, 0.9982771386678583],
|
||||
[0.5144052650105083, -0.06689280271530151, 0.14107200503349304, -1.781036376953125, -0.0006935615674592555, -0.3493639826774597, 0.9974910563680077],
|
||||
[0.4630606278577127, -0.06283382326364517, 0.18166175484657288, -1.5991029739379883, -0.0008801235817372799, -0.3431893289089203, 0.9967511103297959],
|
||||
[0.4156212116391389, -0.05905943363904953, 0.21940568089485168, -1.4299253225326538, -0.0010469482513144612, -0.33857160806655884, 0.996054354716816],
|
||||
[0.37150541385694374, -0.05554967001080513, 0.2545033097267151, -1.272608995437622, -0.0011954192304983735, -0.3342752754688263, 0.9953979847183112],
|
||||
[0.3304802499251104, -0.05228598415851593, 0.2871401607990265, -1.1263223886489868, -0.0013268234906718135, -0.33027783036231995, 0.9947793526160259],
|
||||
[-0.5103119485721853, 0.01770082116127014, 0.2670082151889801, 2.0106611251831055, -0.0013268234906718135, -0.27072757482528687, 0.9947870032699171],
|
||||
[-0.4871247531139276, 0.015828775241971016, 0.24828776717185974, 1.9267513751983643, -0.001102035865187645, -0.27190864086151123, 0.9947971654884007],
|
||||
[-0.4655545265752654, 0.014087983407080173, 0.23087982833385468, 1.8487247228622437, -0.0008863512775860727, -0.27304553985595703, 0.9948095529007845]
|
||||
]
|
||||
},
|
||||
"2025_default": {
|
||||
"before": {
|
||||
"factor": 3.6600000858306885,
|
||||
"negLimit": -3.0,
|
||||
"posLimit": 3.0
|
||||
},
|
||||
"after": {
|
||||
"factor": 3.6600000858306885,
|
||||
"negLimit": -3.6600000858306885,
|
||||
"posLimit": 3.6600000858306885
|
||||
},
|
||||
"rows": [
|
||||
[-0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0],
|
||||
[-0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0],
|
||||
[-0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0],
|
||||
[-0.1000419596173212, -6.3100724219111726e-06, -6.310072058113292e-05, 0.09995962679386139, 1.399434836457658e-06, 0.00010129198199138045, 0.9996100118902765],
|
||||
[-0.09957267603318784, -1.2177733879070729e-05, -0.00012177733879070729, 0.09824388474225998, 2.774849235720467e-06, 9.798955579753965e-05, 0.9992295059317203],
|
||||
[-0.09913630335274988, -1.7634001778787933e-05, -0.00017634002142585814, 0.09664839506149292, 4.127926786168246e-06, 9.492012031842023e-05, 0.9988582529369309],
|
||||
[-0.0987305336073542, -2.2707719836034812e-05, -0.00022707720927428454, 0.0951647162437439, 5.460232841869583e-06, 9.206731920130551e-05, 0.9984960291624968],
|
||||
[-0.0983532241033397, -2.7425710868556052e-05, -0.00027425712323747575, 0.09378502517938614, 6.773223049094668e-06, 8.941596024669707e-05, 0.998142616186421],
|
||||
[-0.09800238149944195, -3.181291322107427e-05, -0.0003181291394867003, 0.09250204265117645, 8.06825210020179e-06, 8.695188444107771e-05, 0.9977978007878223],
|
||||
[-0.09767614986126376, -3.589252446545288e-05, -0.00035892523010261357, 0.09130898118019104, 9.3465778263635e-06, 8.46619441290386e-05, 0.9974613748289103],
|
||||
[-0.0906673555152992, -0.00012337604130152613, -0.00033376028295606375, 0.06570431590080261, 1.0266438039252535e-05, 3.4840086300391704e-05, 0.9971327104622644],
|
||||
[-0.0908549993923562, -0.00012103597691748291, -0.00031035972642712295, 0.06638883799314499, 1.119588159781415e-05, 3.6202189221512526e-05, 0.9968120741787946],
|
||||
[-0.09102950607063971, -0.00011885998537763953, -0.00028859981102868915, 0.06702535599470139, 1.2134236385463737e-05, 3.74701339751482e-05, 0.9964992693384843],
|
||||
[-0.09119179556600669, -0.00011683656339300796, -0.0002683655184227973, 0.06761724501848221, 1.3080877579341177e-05, 3.865048711304553e-05, 0.9961941041558584],
|
||||
[-0.09134272615685958, -0.00011495500075398013, -0.00024954992113634944, 0.06816762685775757, 1.4035224921826739e-05, 3.974936407757923e-05, 0.9958963915774781],
|
||||
[-0.01996371573553552, -0.004023205488920212, -0.00023205348406918347, 0.23997238278388977, 2.695681541808881e-05, -0.23059208691120148, 0.9955856059993178],
|
||||
[-0.020020306586320584, -0.0040215784683823586, -0.00021578377345576882, 0.24009454250335693, 3.9884980651549995e-05, -0.23052002489566803, 0.9952824091350698],
|
||||
[-0.020074058243435496, -0.004020065534859896, -0.0002006547583732754, 0.24020811915397644, 5.281926496536471e-05, -0.23044979572296143, 0.9949866152926238],
|
||||
[-0.02012515337474716, -0.004018658772110939, -0.00018658647604752332, 0.24031373858451843, 6.575923907803372e-05, -0.2303813248872757, 0.9946980433511353],
|
||||
[-0.020173757713139062, -0.004017350263893604, -0.00017350453708786517, 0.24041196703910828, 7.870449917390943e-05, -0.23031458258628845, 0.9944165166465714],
|
||||
[-0.020220024205998142, -0.0040161339566111565, -0.000161339805345051, 0.24050329625606537, 9.165467781713232e-05, -0.23024950921535492, 0.9941418628602553],
|
||||
[-0.020264097164136057, -0.004015002865344286, -0.0001500279613537714, 0.2405882328748703, 0.00010460942576173693, -0.2301860749721527, 0.9938739139103233],
|
||||
[-0.020306108140690598, -0.004013950936496258, -0.000139509211294353, 0.2406671941280365, 0.00011756843014154583, -0.23012422025203705, 0.9936125058460087],
|
||||
[-0.02034618421336529, -0.004012972582131624, -0.00012972795229870826, 0.24074062705039978, 0.00013053139264229685, -0.23006391525268555, 0.99335747874467],
|
||||
[-0.020384443862206083, -0.004012063145637512, -0.00012063248141203076, 0.24080891907215118, 0.00014349802222568542, -0.23000513017177582, 0.9931086766114875],
|
||||
[-0.020420996981293797, -0.004011217504739761, -0.00011217471183044836, 0.24087241291999817, 0.00015646807150915265, -0.22994780540466309, 0.9928659472817497],
|
||||
[-0.020455940755107285, -0.004010431002825499, -0.0001043099255184643, 0.2409314513206482, 0.0001694413076620549, -0.22989189624786377, 0.9926291423256576],
|
||||
[-0.02048937620788005, -0.004009699448943138, -9.699655493022874e-05, 0.24098636209964752, 0.0001824174978537485, -0.22983740270137787, 0.9923981169555751],
|
||||
[-0.02052139167532128, -0.004009019583463669, -9.019594290293753e-05, 0.24103742837905884, 0.00019539643835742027, -0.22978425025939941, 0.9921727299356587],
|
||||
[-0.02055206694872401, -0.004008387215435505, -8.387213165406138e-05, 0.24108490347862244, 0.000208377925446257, -0.2297324240207672, 0.991952843493798],
|
||||
[0.37125703585399955, -0.17847982048988342, 0.17520178854465485, -0.9918082356452942, -0.0013008954701945186, -0.3814098834991455, 0.9875400426961929],
|
||||
[0.3563249116250143, -0.16218021512031555, 0.33819782733917236, -0.946868360042572, -0.0013008954701945186, -0.37206515669822693, 0.9836890276104427],
|
||||
[0.3400332838792249, -0.14702340960502625, 0.4897659122943878, -0.9050739407539368, -0.0013008954701945186, -0.35422003269195557, 0.9802772670978159],
|
||||
[0.3217350521682795, -0.13292928040027618, 0.6307072639465332, -0.8661898374557495, -0.0013008954701945186, -0.32572245597839355, 0.9772155204395125],
|
||||
[0.30491287464790134, -0.11982330679893494, 0.7617669701576233, -0.8300200700759888, -0.0013008954701945186, -0.29980576038360596, 0.9744541209523172],
|
||||
[0.2894013817616517, -0.1076362207531929, 0.8836377859115601, -0.7963812947273254, -0.0013008954701945186, -0.2761189341545105, 0.9719767824781306],
|
||||
[0.2750710937464448, -0.09630359709262848, 0.9969640374183655, -0.7650993466377258, -0.0013008954701945186, -0.2543935775756836, 0.9697871497690216],
|
||||
[0.26181467125900454, -0.0857655256986618, 1.1023447513580322, -0.7360098361968994, -0.0013008954701945186, -0.23441553115844727, 0.9678939521880274],
|
||||
[0.24983044597727005, -0.07596629858016968, 1.2003370523452759, -0.7089597582817078, -0.0023797473404556513, -0.21600757539272308, 0.9663002834303565],
|
||||
[0.23873606444946352, -0.06685411185026169, 1.2914588451385498, -0.6838060021400452, -0.0034203215036541224, -0.19901923835277557, 0.9649991785284114],
|
||||
[-0.0705208363838269, 0.2572912275791168, 1.2009122371673584, 0.21098388731479645, -0.0030992592219263315, 0.052963316440582275, 0.9640429283994295],
|
||||
[-0.05791127976724981, 0.24887140095233917, 1.1167140007019043, 0.1877412647008896, -0.0028135660104453564, 0.029326602816581726, 0.9631736928535165],
|
||||
[-0.04623994586562036, 0.241041898727417, 1.0384190082550049, 0.1661282330751419, -0.002560762222856283, 0.007540617138147354, 0.9623884128742163],
|
||||
[-0.03523192766033561, 0.23376135528087616, 0.9656134843826294, 0.1460305154323578, -0.0023385416716337204, -0.013294951058924198, 0.9616834933561276],
|
||||
[-0.025079714113015437, 0.22699125111103058, 0.8979125022888184, 0.1273418664932251, -0.002144760685041547, -0.0323595255613327, 0.9610549332646039],
|
||||
[-0.01572118218989378, 0.22069580852985382, 0.8349581360816956, 0.10996348410844803, -0.0019774248357862234, -0.049782607704401016, 0.9604984525950518],
|
||||
[-0.007101273280377882, 0.21484176814556122, 0.77641761302948, 0.0938035100698471, -0.0018346804426982999, -0.06567493826150894, 0.960009608840235],
|
||||
[0.0008297808296861664, 0.20939815044403076, 0.7219814658164978, 0.0787765309214592, -0.0017148031620308757, -0.08013449609279633, 0.9595838985390357],
|
||||
[0.008118299997240544, 0.20433619618415833, 0.6713619828224182, 0.0648031160235405, -0.0016161897219717503, -0.0932527706027031, 0.9592168418991078],
|
||||
[0.014808633638411376, 0.19962915778160095, 0.6242915391921997, 0.05180941894650459, -0.0015373493079096079, -0.1051197424530983, 0.9589040503149374],
|
||||
[0.4621020573416811, 0.18219728767871857, 0.44997286796569824, -1.139389991760254, -0.0015373493079096079, -0.5709168910980225, 0.9587681111885773],
|
||||
[0.4713936456137784, 0.16598761081695557, 0.28787603974342346, -1.1840639114379883, -0.0015373493079096079, -0.5606254935264587, 0.9587904679721979],
|
||||
[0.4803378636321708, 0.15091441571712494, 0.13714411854743958, -1.2255961894989014, -0.0015373493079096079, -0.5520401000976562, 0.9589498270423709],
|
||||
[0.48935347370831944, 0.13689802587032318, -0.003019690979272127, -1.2642362117767334, -0.0015373493079096079, -0.5467880964279175, 0.9592242556540338],
|
||||
[0.49761720293209916, 0.12386436760425568, -0.13335634768009186, -1.3002347946166992, -0.0015373493079096079, -0.542256772518158, 0.9595791248723795],
|
||||
[0.5055234657170684, 0.11174451559782028, -0.2545548677444458, -1.3337390422821045, -0.0015373493079096079, -0.5389915108680725, 0.9599940969615668],
|
||||
[0.5130901657853517, 0.10047440975904465, -0.36725589632987976, -1.3649104833602905, -0.0015373493079096079, -0.5367147326469421, 0.9604526447819721],
|
||||
[0.5203109047218069, 0.08999447524547577, -0.4720552861690521, -1.393890619277954, -0.0015373493079096079, -0.5351468920707703, 0.960942258826627],
|
||||
[0.5277450384735141, 0.08024930208921432, -0.5695069432258606, -1.4208241701126099, -0.0036994728725403547, -0.5340712070465088, 0.9614542357182847],
|
||||
[0.5348026953298156, 0.07118739187717438, -0.6601260900497437, -1.4458574056625366, -0.0058996910229325294, -0.5333346724510193, 0.9619831418920445],
|
||||
[0.6780078736348712, -0.11038433760404587, -0.6138433814048767, -1.9470629692077637, -0.008862612769007683, -0.559460461139679, 0.9607405300190316],
|
||||
[0.6747115695706011, -0.1060805693268776, -0.5708056688308716, -1.9351692199707031, -0.011807435192167759, -0.5562520027160645, 0.9596426684609639],
|
||||
[0.17851530759705644, -0.2528565227985382, -0.7060651779174805, 0.0008099577389657497, -0.011804213747382164, -0.9532887935638428, 0.952430201176377],
|
||||
[0.18678538061932282, -0.2654341459274292, -0.8318413496017456, -0.010858933441340923, -0.011847402900457382, -0.9791561961174011, 0.9449690078640667],
|
||||
[0.1949221573654882, -0.2771299183368683, -0.9487991333007812, -0.02170969545841217, -0.011933748610317707, -1.0030080080032349, 0.9373360301855578],
|
||||
[0.2026603194855928, -0.28800567984580994, -1.0575568675994873, -0.031799692660570145, -0.012060224078595638, -1.024595022201538, 0.9295956164929802],
|
||||
[0.2099276450828452, -0.29811891913414, -1.158689260482788, -0.0411822572350502, -0.012224017642438412, -1.0440384149551392, 0.9218004861200195],
|
||||
[0.21672051159074684, -0.30752310156822205, -1.2527310848236084, -0.04990699514746666, -0.012422511354088783, -1.0615546703338623, 0.9139932139127096],
|
||||
[0.22305534883649292, -0.3162679374217987, -1.3401795625686646, -0.05802002176642418, -0.012653272598981857, -1.077350378036499, 0.9062078294862433],
|
||||
[0.22895277393356475, -0.3243996798992157, -1.4214967489242554, -0.06556423008441925, -0.012914039194583893, -1.0915987491607666, 0.8984713202557664],
|
||||
[0.23443345341931823, -0.3319612741470337, -1.4971126317977905, -0.07257950305938721, -0.013202708214521408, -1.1044427156448364, 0.890804948172658],
|
||||
[0.23951749819606138, -0.338992714881897, -1.5674270391464233, -0.07910291105508804, -0.013517322018742561, -1.1160025596618652, 0.8832253574194441],
|
||||
[0.39289334290020206, -0.8018531799316406, -1.4575316905975342, -0.5085219144821167, -0.01553985197097063, -1.1072732210159302, 0.875901053699282],
|
||||
[0.388718206914192, -0.7916341423988342, -1.3553414344787598, -0.4990411698818207, -0.01752467453479767, -1.100295901298523, 0.8685500023249335],
|
||||
[0.3847635472904388, -0.782131552696228, -1.2603157758712769, -0.4902251958847046, -0.019474433735013008, -1.0933153629302979, 0.8612116165161448],
|
||||
[0.3810239175048684, -0.7732952833175659, -1.1719526052474976, -0.4820272922515869, -0.02139158733189106, -1.0863571166992188, 0.8539169219698891],
|
||||
[0.3774964362735405, -0.7650784850120544, -1.089784860610962, -0.47440415620803833, -0.02327842265367508, -1.0794397592544556, 0.8466900757753881],
|
||||
[0.3741815825976844, -0.7574377655982971, -1.0133779048919678, -0.4673154652118683, -0.02513706311583519, -1.0725765228271484, 0.8395496933996105],
|
||||
[0.3710838694605647, -0.7503328323364258, -0.9423280358314514, -0.4607238173484802, -0.026969488710165024, -1.0657763481140137, 0.8325099606152043],
|
||||
[0.3682120755403503, -0.7437259554862976, -0.8762596249580383, -0.45459431409835815, -0.028777534142136574, -1.0590451955795288, 0.8255815419106031],
|
||||
[0.36557903498433153, -0.7375823259353638, -0.8148233890533447, -0.4488946199417114, -0.030562909319996834, -1.05238676071167, 0.818772311184273],
|
||||
[0.36320061149412136, -0.7318694591522217, -0.7576946020126343, -0.44359442591667175, -0.03232720494270325, -1.0458028316497803, 0.8120879340440293],
|
||||
[0.3610940314528291, -0.7265571355819702, -0.7045711874961853, -0.4386659264564514, -0.0340718999505043, -1.0392942428588867, 0.8055323294502604],
|
||||
[0.35927519417236253, -0.7216172218322754, -0.6551723480224609, -0.434082955121994, -0.035798367112874985, -1.0328611135482788, 0.7991080348309247],
|
||||
[0.35775566889097404, -0.7170236706733704, -0.6092369556427002, -0.42982131242752075, -0.037507884204387665, -1.0265032052993774, 0.7928164947139084],
|
||||
[0.35653949259157774, -0.7127522230148315, -0.5665221810340881, -0.42585843801498413, -0.03920163959264755, -1.0202194452285767, 0.7866582890856323],
|
||||
[0.3556205446497881, -0.7087802290916443, -0.5268022418022156, -0.422173410654068, -0.04088073596358299, -1.01400887966156, 0.7806333143686989],
|
||||
[-0.18928970090431746, -0.6875587105751038, -0.3145873546600342, 0.6213363409042358, -0.0384095124900341, 0.1780533492565155, 0.7746891641094066],
|
||||
[-0.1998281345720566, -0.6678251028060913, -0.11725125461816788, 0.639644205570221, -0.03586547449231148, 0.1654033213853836, 0.768857914097388],
|
||||
[-0.19824261810433141, -0.64947509765625, 0.06624923646450043, 0.6566684246063232, -0.03325372561812401, 0.13446398079395294, 0.7629371203539954],
|
||||
[-0.19419930945511207, -0.6324115991592407, 0.23688414692878723, 0.6724991202354431, -0.030579011887311935, 0.13123857975006104, 0.7569298493810652],
|
||||
[-0.19074162262832509, -0.6165444254875183, 0.3955555260181427, 0.6872198581695557, -0.027845751494169235, 0.1318981796503067, 0.7509517971922638],
|
||||
[-0.1899161965066632, -0.6017897725105286, 0.5431021451950073, 0.7009085416793823, -0.025058045983314514, 0.13255788385868073, 0.7449545261546827],
|
||||
[-0.1911287448852193, -0.5880696177482605, 0.6803039908409119, 0.7136374115943909, -0.022219715639948845, 0.1332218497991562, 0.7388997712783383],
|
||||
[-0.19318406105815286, -0.5753113627433777, 0.8078863620758057, 0.7254738807678223, -0.019334308803081512, 0.1338927447795868, 0.7327627342863612],
|
||||
[-0.19546555151826855, -0.5634476542472839, 0.9265236854553223, 0.7364804148674011, -0.016405124217271805, 0.13457146286964417, 0.726534773886686],
|
||||
[-0.19773300519680453, -0.552415668964386, 1.0368430614471436, 0.7467153668403625, -0.013435234315693378, 0.1352570652961731, 0.72022400558647],
|
||||
[-0.3129858658797515, 0.27866479754447937, 0.9641480445861816, 1.5177505016326904, -0.013435234315693378, 0.15824465453624725, 0.724840854185572],
|
||||
[-0.31099166787599797, 0.27190497517585754, 0.8965498208999634, 1.511479139328003, -0.007423669099807739, 0.1564316302537918, 0.7293932460262814],
|
||||
[-0.1016954787246937, 0.16584111750125885, 0.6584112048149109, 0.5665790438652039, -0.007423669099807739, -0.1395522952079773, 0.7349058161108437],
|
||||
[-0.08300327240505596, 0.1436968892812729, 0.43696895241737366, 0.5290812253952026, -0.007423669099807739, -0.1789565533399582, 0.7405128616799562],
|
||||
[-0.06918421965186021, 0.1231052428483963, 0.2310524582862854, 0.4942123293876648, -0.007423669099807739, -0.2024339735507965, 0.7461701549526497],
|
||||
[-0.05736861692440621, 0.10395731776952744, 0.039573147892951965, 0.46178823709487915, -0.007423669099807739, -0.2196238934993744, 0.7518367441941683],
|
||||
[-0.046647800181232595, 0.08615188300609589, -0.13848116993904114, 0.43163782358169556, -0.007423669099807739, -0.23217642307281494, 0.7574720838700055],
|
||||
[-0.03697180534157927, 0.06959482282400131, -0.3040517568588257, 0.4036014974117279, -0.0059389350935816765, -0.2439926415681839, 0.7630477127348814],
|
||||
[-0.027750959294197044, 0.05419861152768135, -0.4580138921737671, 0.37753087282180786, -0.0059389350935816765, -0.2554107904434204, 0.768545673778488],
|
||||
[-0.01650420513479283, 0.03988185524940491, -0.6011814475059509, 0.3532879948616028, -0.0059389350935816765, -0.27798032760620117, 0.7739557730076617],
|
||||
[-0.006215064317218847, 0.026568876579403877, -0.7343112230300903, 0.33074474334716797, -0.0059389350935816765, -0.29863041639328003, 0.7792738195520029],
|
||||
[0.0032896441892095135, 0.014189294539391994, -0.8581070303916931, 0.3097819983959198, -0.0059389350935816765, -0.31771352887153625, 0.7844993819957966],
|
||||
[0.1867415263504139, -0.2797943651676178, -0.7979435324668884, -0.18803030252456665, -0.00636813510209322, -0.5570378303527832, 0.7807180815256229],
|
||||
[0.17962014109123528, -0.27419981360435486, -0.7419981956481934, -0.178556889295578, -0.006775710266083479, -0.5382837653160095, 0.777189561263008],
|
||||
[0.17304498228624188, -0.26899752020835876, -0.6899752616882324, -0.16974766552448273, -0.007163177710026503, -0.520890474319458, 0.7739044654886423],
|
||||
[-0.5087494300864623, -0.24663199484348297, -0.4663200080394745, -0.13187535107135773, -0.007163177710026503, 2.1945619583129883, 0.7714640447550488],
|
||||
[-0.5218161964776654, -0.22583456337451935, -0.25834566354751587, -0.09665831178426743, -0.007163177710026503, 2.205286979675293, 0.7699120400719075],
|
||||
[-0.5338882181449203, -0.2064952701330185, -0.06495276838541031, -0.06391043961048126, -0.007163177710026503, 2.212782382965088, 0.7692452258750052],
|
||||
[-0.5112945374698926, -0.1885119080543518, 0.11488097161054611, -0.033458638936281204, -0.007163177710026503, 2.1033742427825928, 0.7693473090415099],
|
||||
[-0.5120801247826361, -0.17178937792778015, 0.2821062207221985, -0.0051418752409517765, -0.007163177710026503, 2.1013295650482178, 0.7700537236118319],
|
||||
[-0.7708238487688981, -0.4062393009662628, 0.4376069903373718, -0.7280921936035156, -0.011410382576286793, 5.746920108795166, 0.7638278009790337],
|
||||
[-0.7445005123731817, -0.39177948236465454, 0.5822052955627441, -0.7190147042274475, -0.015604634769260883, 5.698555946350098, 0.7576461193038383],
|
||||
[-0.7287265403223198, -0.3783334493637085, 0.7166655659675598, -0.7105735540390015, -0.01974964700639248, 5.6500163078308105, 0.7514720746944674],
|
||||
[-0.7176819193766284, -0.3658301532268524, 0.8416985273361206, -0.7027242183685303, -0.023848872631788254, 5.600953578948975, 0.7452774336652609],
|
||||
[-0.7087817643717371, -0.3542034924030304, 0.9579651951789856, -0.695425271987915, -0.027905520051717758, 5.551097869873047, 0.7390478495218085],
|
||||
[-0.9199999685889073, 7.306608200073242, 1.0660802125930786, 4.113862037658691, -0.027905520051717758, 6.068759918212891, 0.7446808313863519],
|
||||
[-0.9199999685889073, 7.316661357879639, 1.1666151285171509, 4.12017297744751, -0.027905520051717758, 6.111703872680664, 0.7501764234493237],
|
||||
[-0.9199999685889073, 7.326010227203369, 1.2601011991500854, 4.126042366027832, -0.027905520051717758, 6.153583526611328, 0.7555379766814936],
|
||||
[-0.9199999685889073, 7.33470344543457, 1.347032904624939, 4.131499290466309, -0.027905520051717758, 6.194431781768799, 0.7607687603226371],
|
||||
[-0.9199999685889073, 7.34278678894043, 1.4278696775436401, 4.1365742683410645, -0.027905520051717758, 6.234278202056885, 0.765871963874974],
|
||||
[-0.9199999685889073, 8.232775688171387, 1.327759027481079, 4.695289611816406, -0.027905520051717758, 6.273124694824219, 0.7708506990480516],
|
||||
[-0.9199999685889073, 8.223466873168945, 1.2346673011779785, 4.689445495605469, -0.027905520051717758, 6.311017990112305, 0.775708001655932],
|
||||
[0.22799154825718387, 8.197281837463379, 0.9728226065635681, 5.45698881149292, 0.0039269146509468555, -6.295364856719971, 0.780446833468498],
|
||||
[0.23419523367937423, 8.172933578491211, 0.7293363809585571, 5.441702842712402, 0.03567017987370491, -6.334527492523193, 0.7850700840173425],
|
||||
[0.24001124821910183, 8.15029239654541, 0.5029214024543762, 5.427489280700684, 0.06733053922653198, -6.373260974884033, 0.7895805723576782],
|
||||
[0.24563307844267657, 8.12923812866211, 0.2923808693885803, 5.414271831512451, 0.09891378879547119, -6.412202835083008, 0.7939810487872736],
|
||||
[0.2514091635182312, 8.109660148620605, 0.09660171717405319, 5.401981353759766, 0.1304253488779068, -6.452564239501953, 0.7982741965234642],
|
||||
[0.26319184231767545, 8.09145450592041, -0.08545099198818207, 5.390552520751953, 0.16187024116516113, -6.51570463180542, 0.8020599373232822],
|
||||
[0.265450510692521, 8.074525833129883, -0.2547396421432495, 5.379924774169922, 0.19325312972068787, -6.544726848602295, 0.8054052405018639],
|
||||
[0.26603509872581854, 8.058784484863281, -0.41215911507606506, 5.37004280090332, 0.2245783805847168, -6.568309783935547, 0.808214631238123],
|
||||
[0.2648741592145022, 8.044145584106445, -0.5585416555404663, 5.36085319519043, 0.25585001707077026, -6.586142539978027, 0.8103390489042367],
|
||||
[0.26166994194463644, 8.030533790588379, -0.694661021232605, 5.3523077964782715, 0.2870718240737915, -6.5970916748046875, 0.8116433931864653],
|
||||
[0.9199999685889073, -8.164595603942871, -0.6459569931030273, -4.814634799957275, 0.2870718240737915, -7.096859455108643, 0.8135545394151179],
|
||||
[0.9199999685889073, -8.160066604614258, -0.6006677150726318, -4.81179141998291, 0.2870718240737915, -7.112162113189697, 0.8154190723211203],
|
||||
[-0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0],
|
||||
[-0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0],
|
||||
[-0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0],
|
||||
[0.38513324930148474, -0.0759519413113594, 0.05048057436943054, -1.7808427810668945, -0.00020776498422492296, -0.33449462056159973, 0.9991124139302132],
|
||||
[0.40075537473288914, -0.0712578147649765, 0.09742186218500137, -1.6257919073104858, -0.00039744071546010673, -0.33135300874710083, 0.9982771386678583],
|
||||
[0.4201164532492807, -0.06689280271530151, 0.14107200503349304, -1.483040452003479, -0.0005704620853066444, -0.32857346534729004, 0.9974910563680077],
|
||||
[0.3903238460794766, -0.06283382326364517, 0.18166175484657288, -1.3503772020339966, -0.0007280061254277825, -0.3260654807090759, 0.9967511103297959],
|
||||
[0.35570301596556403, -0.05905943363904953, 0.21940568089485168, -1.2258175611495972, -0.0008710181573405862, -0.32375097274780273, 0.996054354716816],
|
||||
[0.3229205375893875, -0.05554967001080513, 0.2545033097267151, -1.1077765226364136, -0.0010002587223425508, -0.32166072726249695, 0.9953979847183112],
|
||||
[0.2916296151630097, -0.05228598415851593, 0.2871401607990265, -0.995150089263916, -0.001116359606385231, -0.31962889432907104, 0.9947793526160259],
|
||||
[-0.4353541850257815, 0.01770082116127014, 0.2670082151889801, 1.7472336292266846, -0.001116359606385231, -0.28161153197288513, 0.9947870032699171],
|
||||
[-0.410655696054713, 0.015828775241971016, 0.24828776717185974, 1.658023476600647, -0.0009229235001839697, -0.28300604224205017, 0.9947971654884007],
|
||||
[-0.38813969742745874, 0.014087983407080173, 0.23087982833385468, 1.5766654014587402, -0.0007389792008325458, -0.284253865480423, 0.9948095529007845]
|
||||
]
|
||||
},
|
||||
"2025_tuned": {
|
||||
"before": {
|
||||
"factor": 3.6600000858306885,
|
||||
"negLimit": -3.0,
|
||||
"posLimit": 3.0
|
||||
},
|
||||
"after": {
|
||||
"factor": 3.6600000858306885,
|
||||
"negLimit": -3.6600000858306885,
|
||||
"posLimit": 3.6600000858306885
|
||||
},
|
||||
"rows": [
|
||||
[-0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0],
|
||||
[-0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0],
|
||||
[-0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0],
|
||||
[-0.10004176588515235, -6.3100724219111726e-06, -6.310072058113292e-05, 0.09995962679386139, 1.399434836457658e-06, 0.00010058288171421736, 0.9996100118902765],
|
||||
[-0.0995724824028674, -1.2177733879070729e-05, -0.00012177733879070729, 0.09824388474225998, 2.774849235720467e-06, 9.72808338701725e-05, 0.9992295059317203],
|
||||
[-0.09913610982047417, -1.7634001778787933e-05, -0.00017634002142585814, 0.09664839506149292, 4.127926786168246e-06, 9.421175491297618e-05, 0.9988582529369309],
|
||||
[-0.09873034016950431, -2.2707719836034812e-05, -0.00022707720927428454, 0.0951647162437439, 5.460232841869583e-06, 9.135930304182693e-05, 0.9984960291624968],
|
||||
[-0.09835303075647045, -2.7425710868556052e-05, -0.00027425712323747575, 0.09378502517938614, 6.773223049094668e-06, 8.870827150531113e-05, 0.998142616186421],
|
||||
[-0.09800218824027186, -3.181291322107427e-05, -0.0003181291394867003, 0.09250204265117645, 8.06825210020179e-06, 8.62445158418268e-05, 0.9977978007878223],
|
||||
[-0.09767595668666544, -3.589252446545288e-05, -0.00035892523010261357, 0.09130898118019104, 9.3465778263635e-06, 8.39548883959651e-05, 0.9974613748289103],
|
||||
[-0.09066716284226353, -0.00012337604130152613, -0.00033376028295606375, 0.06570431590080261, 1.0266438039252535e-05, 3.4134864108636975e-05, 0.9971327104622644],
|
||||
[-0.0908548067688955, -0.00012103597691748291, -0.00031035972642712295, 0.06638883799314499, 1.119588159781415e-05, 3.549714892869815e-05, 0.9968120741787946],
|
||||
[-0.09102931349607103, -0.00011885998537763953, -0.00028859981102868915, 0.06702535599470139, 1.2134236385463737e-05, 3.6765271943295375e-05, 0.9964992693384843],
|
||||
[-0.09119160303962716, -0.00011683656339300796, -0.0002683655184227973, 0.06761724501848221, 1.3080877579341177e-05, 3.794580334215425e-05, 0.9961941041558584],
|
||||
[-0.09134253367794945, -0.00011495500075398013, -0.00024954992113634944, 0.06816762685775757, 1.4035224921826739e-05, 3.904485492967069e-05, 0.9958963915774781],
|
||||
[-0.01944845290711774, -0.004023205488920212, -0.00023205348406918347, 0.23997238278388977, 2.695681541808881e-05, -0.23247814178466797, 0.9955856059993178],
|
||||
[-0.019505220691704045, -0.0040215784683823586, -0.00021578377345576882, 0.24009454250335693, 3.9884980651549995e-05, -0.23240543901920319, 0.9952824091350698],
|
||||
[-0.019559144034443626, -0.004020065534859896, -0.0002006547583732754, 0.24020811915397644, 5.281926496536471e-05, -0.23233458399772644, 0.9949866152926238],
|
||||
[-0.01961040579724358, -0.004018658772110939, -0.00018658647604752332, 0.24031373858451843, 6.575923907803372e-05, -0.23226550221443176, 0.9946980433511353],
|
||||
[-0.019659171897600212, -0.004017350263893604, -0.00017350453708786517, 0.24041196703910828, 7.870449917390943e-05, -0.23219816386699677, 0.9944165166465714],
|
||||
[-0.019705595458651293, -0.0040161339566111565, -0.000161339805345051, 0.24050329625606537, 9.165467781713232e-05, -0.23213252425193787, 0.9941418628602553],
|
||||
[-0.01974982095862555, -0.004015002865344286, -0.0001500279613537714, 0.2405882328748703, 0.00010460942576173693, -0.2320685237646103, 0.9938739139103233],
|
||||
[-0.019791980110236407, -0.004013950936496258, -0.000139509211294353, 0.2406671941280365, 0.00011756843014154583, -0.23200613260269165, 0.9936125058460087],
|
||||
[-0.01983220014338104, -0.004012972582131624, -0.00012972795229870826, 0.24074062705039978, 0.00013053139264229685, -0.23194530606269836, 0.99335747874467],
|
||||
[-0.01987059968334614, -0.004012063145637512, -0.00012063248141203076, 0.24080891907215118, 0.00014349802222568542, -0.23188599944114685, 0.9931086766114875],
|
||||
[-0.019907288762901165, -0.004011217504739761, -0.00011217471183044836, 0.24087241291999817, 0.00015646807150915265, -0.23182816803455353, 0.9928659472817497],
|
||||
[-0.01994236469903559, -0.004010431002825499, -0.0001043099255184643, 0.2409314513206482, 0.0001694413076620549, -0.2317717969417572, 0.9926291423256576],
|
||||
[-0.019975928642665286, -0.004009699448943138, -9.699655493022874e-05, 0.24098636209964752, 0.0001824174978537485, -0.2317168116569519, 0.9923981169555751],
|
||||
[-0.020008069050680716, -0.004009019583463669, -9.019594290293753e-05, 0.24103742837905884, 0.00019539643835742027, -0.23166321218013763, 0.9921727299356587],
|
||||
[-0.020038865830360516, -0.004008387215435505, -8.387213165406138e-05, 0.24108490347862244, 0.000208377925446257, -0.23161093890666962, 0.991952843493798],
|
||||
[0.370812088545753, -0.17847982048988342, 0.17520178854465485, -0.9918082356452942, -0.0013008954701945186, -0.37976253032684326, 0.9875400426961929],
|
||||
[0.3550224507624517, -0.16218021512031555, 0.33819782733917236, -0.946868360042572, -0.0013008954701945186, -0.3672393560409546, 0.9836890276104427],
|
||||
[0.3387657012828988, -0.14702340960502625, 0.4897659122943878, -0.9050739407539368, -0.0013008954701945186, -0.349520742893219, 0.9802772670978159],
|
||||
[0.320553117201625, -0.13292928040027618, 0.6307072639465332, -0.8661898374557495, -0.0013008954701945186, -0.32133904099464417, 0.9772155204395125],
|
||||
[0.3038147853950517, -0.11982330679893494, 0.7617669701576233, -0.8300200700759888, -0.0013008954701945186, -0.29573220014572144, 0.9744541209523172],
|
||||
[0.28838297435341453, -0.1076362207531929, 0.8836377859115601, -0.7963812947273254, -0.0013008954701945186, -0.27234020829200745, 0.9719767824781306],
|
||||
[0.27412739976950157, -0.09630359709262848, 0.9969640374183655, -0.7650993466377258, -0.0013008954701945186, -0.2508915066719055, 0.9697871497690216],
|
||||
[0.2609405940688192, -0.0857655256986618, 1.1023447513580322, -0.7360098361968994, -0.0013008954701945186, -0.2311713993549347, 0.9678939521880274],
|
||||
[0.24902105124313956, -0.07596629858016968, 1.2003370523452759, -0.7089597582817078, -0.0023797473404556513, -0.21300318837165833, 0.9663002834303565],
|
||||
[0.2379866968422148, -0.06685411185026169, 1.2914588451385498, -0.6838060021400452, -0.0034203215036541224, -0.19623741507530212, 0.9649991785284114],
|
||||
[-0.05555523899531584, 0.2572912275791168, 1.2009122371673584, 0.21098388731479645, -0.0030992592219263315, -0.0023925956338644028, 0.9640429283994295],
|
||||
[-0.04300703739640971, 0.24887140095233917, 1.1167140007019043, 0.1877412647008896, -0.0028135660104453564, -0.025814607739448547, 0.9631736928535165],
|
||||
[-0.03144173312508024, 0.241041898727417, 1.0384190082550049, 0.1661282330751419, -0.002560762222856283, -0.04721926525235176, 0.9623884128742163],
|
||||
[-0.020584306498731966, 0.23376135528087616, 0.9656134843826294, 0.1460305154323578, -0.0023385416716337204, -0.0675073191523552, 0.9616834933561276],
|
||||
[-0.010623455738642828, 0.22699125111103058, 0.8979125022888184, 0.1273418664932251, -0.002144760685041547, -0.08587225526571274, 0.9610549332646039],
|
||||
[-0.001494547853067832, 0.22069580852985382, 0.8349581360816956, 0.10996348410844803, -0.0019774248357862234, -0.10245289653539658, 0.9604984525950518],
|
||||
[0.0068604057005683195, 0.21484176814556122, 0.77641761302948, 0.0938035100698471, -0.0018346804426982999, -0.11737086623907089, 0.960009608840235],
|
||||
[0.014494764465175735, 0.20939815044403076, 0.7219814658164978, 0.0787765309214592, -0.0017148031620308757, -0.13073746860027313, 0.9595838985390357],
|
||||
[0.02145925383556136, 0.20433619618415833, 0.6713619828224182, 0.0648031160235405, -0.0016161897219717503, -0.14266054332256317, 0.9592168418991078],
|
||||
[0.027803413077598614, 0.19962915778160095, 0.6242915391921997, 0.05180941894650459, -0.0015373493079096079, -0.1532493233680725, 0.9589040503149374],
|
||||
[0.4868611346439523, 0.18219728767871857, 0.44997286796569824, -1.139389991760254, -0.0015373493079096079, -0.6626362204551697, 0.9587681111885773],
|
||||
[0.491999825957422, 0.16598761081695557, 0.28787603974342346, -1.1840639114379883, -0.0015373493079096079, -0.6369588971138, 0.9587904679721979],
|
||||
[0.49674077912054715, 0.15091441571712494, 0.13714411854743958, -1.2255961894989014, -0.0015373493079096079, -0.6127965450286865, 0.9589498270423709],
|
||||
[0.5020593921318688, 0.13689802587032318, -0.003019690979272127, -1.2642362117767334, -0.0015373493079096079, -0.5938507318496704, 0.9592242556540338],
|
||||
[0.5055839611899835, 0.12386436760425568, -0.13335634768009186, -1.3002347946166992, -0.0015373493079096079, -0.5717793107032776, 0.9595791248723795],
|
||||
[0.5103376594592743, 0.11174451559782028, -0.2545548677444458, -1.3337390422821045, -0.0015373493079096079, -0.5568405389785767, 0.9599940969615668],
|
||||
[0.5159163517262825, 0.10047440975904465, -0.36725589632987976, -1.3649104833602905, -0.0015373493079096079, -0.5471976399421692, 0.9604526447819721],
|
||||
[0.5219334806488688, 0.08999447524547577, -0.4720552861690521, -1.393890619277954, -0.0015373493079096079, -0.5411673784255981, 0.960942258826627],
|
||||
[0.5286669727750853, 0.08024930208921432, -0.5695069432258606, -1.4208241701126099, -0.0036994728725403547, -0.5374927520751953, 0.9614542357182847],
|
||||
[0.5353362743544783, 0.07118739187717438, -0.6601260900497437, -1.4458574056625366, -0.0058996910229325294, -0.535315215587616, 0.9619831418920445],
|
||||
[0.6832885473599156, -0.11038433760404587, -0.6138433814048767, -1.9470629692077637, -0.008862612769007683, -0.5790515542030334, 0.9607405300190316],
|
||||
[0.6795462170511046, -0.1060805693268776, -0.5708056688308716, -1.9351692199707031, -0.011807435192167759, -0.5741888880729675, 0.9596426684609639],
|
||||
[0.1908011113905084, -0.2528565227985382, -0.7060651779174805, 0.0008099577389657497, -0.011804213747382164, -1.0196528434753418, 0.952430201176377],
|
||||
[0.20074079294495029, -0.2654341459274292, -0.8318413496017456, -0.010858933441340923, -0.011847402900457382, -1.054008960723877, 0.9449690078640667],
|
||||
[0.21005581328971235, -0.2771299183368683, -0.9487991333007812, -0.02170969545841217, -0.011933748610317707, -1.0834929943084717, 0.9373360301855578],
|
||||
[0.2185519968501357, -0.28800567984580994, -1.0575568675994873, -0.031799692660570145, -0.012060224078595638, -1.108378291130066, 0.9295956164929802],
|
||||
[0.22625973138345304, -0.29811891913414, -1.158689260482788, -0.0411822572350502, -0.012224017642438412, -1.129418134689331, 0.9218004861200195],
|
||||
[0.2332688587860026, -0.30752310156822205, -1.2527310848236084, -0.04990699514746666, -0.012422511354088783, -1.1473722457885742, 0.9139932139127096],
|
||||
[0.23966734021868588, -0.3162679374217987, -1.3401795625686646, -0.05802002176642418, -0.012653272598981857, -1.1628490686416626, 0.9062078294862433],
|
||||
[0.245526388718592, -0.3243996798992157, -1.4214967489242554, -0.06556423008441925, -0.012914039194583893, -1.1762992143630981, 0.8984713202557664],
|
||||
[0.250901259515652, -0.3319612741470337, -1.4971126317977905, -0.07257950305938721, -0.013202708214521408, -1.1880501508712769, 0.890804948172658],
|
||||
[0.2558354548718358, -0.338992714881897, -1.5674270391464233, -0.07910291105508804, -0.013517322018742561, -1.198344111442566, 0.8832253574194441],
|
||||
[0.3945829136566075, -0.8018531799316406, -1.4575316905975342, -0.5085219144821167, -0.01553985197097063, -1.1142884492874146, 0.875901053699282],
|
||||
[0.39052898584298695, -0.7916341423988342, -1.3553414344787598, -0.4990411698818207, -0.01752467453479767, -1.1078277826309204, 0.8685500023249335],
|
||||
[0.3866928098321055, -0.782131552696228, -1.2603157758712769, -0.4902251958847046, -0.019474433735013008, -1.1013531684875488, 0.8612116165161448],
|
||||
[0.3830683242096016, -0.7732952833175659, -1.1719526052474976, -0.4820272922515869, -0.02139158733189106, -1.094887137413025, 0.8539169219698891],
|
||||
[0.37965216174232946, -0.7650784850120544, -1.089784860610962, -0.47440415620803833, -0.02327842265367508, -1.088446021080017, 0.8466900757753881],
|
||||
[0.3764444491749428, -0.7574377655982971, -1.0133779048919678, -0.4673154652118683, -0.02513706311583519, -1.0820410251617432, 0.8395496933996105],
|
||||
[0.37344948299404424, -0.7503328323364258, -0.9423280358314514, -0.4607238173484802, -0.026969488710165024, -1.0756795406341553, 0.8325099606152043],
|
||||
[0.3706759594198795, -0.7437259554862976, -0.8762596249580383, -0.45459431409835815, -0.028777534142136574, -1.0693663358688354, 0.8255815419106031],
|
||||
[0.36813675695663267, -0.7375823259353638, -0.8148233890533447, -0.4488946199417114, -0.030562909319996834, -1.0631040334701538, 0.818772311184273],
|
||||
[0.36584789570646514, -0.7318694591522217, -0.7576946020126343, -0.44359442591667175, -0.03232720494270325, -1.056894302368164, 0.8120879340440293],
|
||||
[0.3638268463778931, -0.7265571355819702, -0.7045711874961853, -0.4386659264564514, -0.0340718999505043, -1.0507375001907349, 0.8055323294502604],
|
||||
[0.36208980635370175, -0.7216172218322754, -0.6551723480224609, -0.434082955121994, -0.035798367112874985, -1.0446338653564453, 0.7991080348309247],
|
||||
[0.36064865374996596, -0.7170236706733704, -0.6092369556427002, -0.42982131242752075, -0.037507884204387665, -1.0385830402374268, 0.7928164947139084],
|
||||
[0.35950769748704137, -0.7127522230148315, -0.5665221810340881, -0.42585843801498413, -0.03920163959264755, -1.0325844287872314, 0.7866582890856323],
|
||||
[0.35866100585350397, -0.7087802290916443, -0.5268022418022156, -0.422173410654068, -0.04088073596358299, -1.0266374349594116, 0.7806333143686989],
|
||||
[-0.18886394348797958, -0.6875587105751038, -0.3145873546600342, 0.6213363409042358, -0.0384095124900341, 0.1763417273759842, 0.7746891641094066],
|
||||
[-0.19935445167851054, -0.6678251028060913, -0.11725125461816788, 0.639644205570221, -0.03586547449231148, 0.1635800153017044, 0.768857914097388],
|
||||
[-0.19824261830173168, -0.64947509765625, 0.06624923646450043, 0.6566684246063232, -0.03325372561812401, 0.13446398079395294, 0.7629371203539954],
|
||||
[-0.19419930983956415, -0.6324115991592407, 0.23688414692878723, 0.6724991202354431, -0.030579011887311935, 0.13123857975006104, 0.7569298493810652],
|
||||
[-0.19074162332080974, -0.6165444254875183, 0.3955555260181427, 0.6872198581695557, -0.027845751494169235, 0.1318981796503067, 0.7509517971922638],
|
||||
[-0.18991619771810794, -0.6017897725105286, 0.5431021451950073, 0.7009085416793823, -0.025058045983314514, 0.13255789875984192, 0.7449545261546827],
|
||||
[-0.19112874694352874, -0.5880696177482605, 0.6803039908409119, 0.7136374115943909, -0.022219715639948845, 0.13322186470031738, 0.7388997712783383],
|
||||
[-0.19318406444226807, -0.5753113627433777, 0.8078863620758057, 0.7254738807678223, -0.019334308803081512, 0.13389275968074799, 0.7327627342863612],
|
||||
[-0.19546555689832368, -0.5634476542472839, 0.9265236854553223, 0.7364804148674011, -0.016405124217271805, 0.13457147777080536, 0.726534773886686],
|
||||
[-0.19773301347682157, -0.552415668964386, 1.0368430614471436, 0.7467153668403625, -0.013435234315693378, 0.13525710999965668, 0.72022400558647],
|
||||
[-0.30919366177723145, 0.27866479754447937, 0.9641480445861816, 1.5177505016326904, -0.013435234315693378, 0.138100728392601, 0.724840854185572],
|
||||
[-0.30725900353129726, 0.27190497517585754, 0.8965498208999634, 1.511479139328003, -0.007423669099807739, 0.13650169968605042, 0.7293932460262814],
|
||||
[-0.08521481290160546, 0.16584111750125885, 0.6584112048149109, 0.5665790438652039, -0.007423669099807739, -0.2075527459383011, 0.7349058161108437],
|
||||
[-0.06783400791318979, 0.1436968892812729, 0.43696895241737366, 0.5290812253952026, -0.007423669099807739, -0.24158689379692078, 0.7405128616799562],
|
||||
[-0.05825252475310051, 0.1231052428483963, 0.2310524582862854, 0.4942123293876648, -0.007423669099807739, -0.24736443161964417, 0.7461701549526497],
|
||||
[-0.05012086249249722, 0.10395731776952744, 0.039573147892951965, 0.46178823709487915, -0.007423669099807739, -0.24928022921085358, 0.7518367441941683],
|
||||
[-0.04321249616872257, 0.08615188300609589, -0.13848116993904114, 0.43163782358169556, -0.007423669099807739, -0.2463187426328659, 0.7574720838700055],
|
||||
[-0.035995895467763134, 0.06959482282400131, -0.3040517568588257, 0.4036014974117279, -0.0059389350935816765, -0.24804891645908356, 0.7630477127348814],
|
||||
[-0.02817185116153802, 0.05419861152768135, -0.4580138921737671, 0.37753087282180786, -0.0059389350935816765, -0.25364869832992554, 0.768545673778488],
|
||||
[-0.017897620847901936, 0.03988185524940491, -0.6011814475059509, 0.3532879948616028, -0.0059389350935816765, -0.27212369441986084, 0.7739557730076617],
|
||||
[-0.008261216107912184, 0.026568876579403877, -0.7343112230300903, 0.33074474334716797, -0.0059389350935816765, -0.2900128662586212, 0.7792738195520029],
|
||||
[0.0007627783865820081, 0.014189294539391994, -0.8581070303916931, 0.3097819983959198, -0.0059389350935816765, -0.30705922842025757, 0.7844993819957966],
|
||||
[0.1969936943180487, -0.2797943651676178, -0.7979435324668884, -0.18803030252456665, -0.00636813510209322, -0.5982919335365295, 0.7807180815256229],
|
||||
[0.18958238737076302, -0.27419981360435486, -0.7419981956481934, -0.178556889295578, -0.006775710266083479, -0.5784175992012024, 0.777189561263008],
|
||||
[0.1826990815770707, -0.26899752020835876, -0.6899752616882324, -0.16974766552448273, -0.007163177710026503, -0.5598204731941223, 0.7739044654886423],
|
||||
[-0.5589129262720587, -0.24663199484348297, -0.4663200080394745, -0.13187535107135773, -0.007163177710026503, 2.397239923477173, 0.7714640447550488],
|
||||
[-0.5584810415223166, -0.22583456337451935, -0.25834566354751587, -0.09665831178426743, -0.007163177710026503, 2.3529441356658936, 0.7699120400719075],
|
||||
[-0.5565616659645832, -0.2064952701330185, -0.06495276838541031, -0.06391043961048126, -0.007163177710026503, 2.3037376403808594, 0.7692452258750052],
|
||||
[-0.4865217168598598, -0.1885119080543518, 0.11488097161054611, -0.033458638936281204, -0.007163177710026503, 2.003431558609009, 0.7693473090415099],
|
||||
[-0.4843897726047696, -0.17178937792778015, 0.2821062207221985, -0.0051418752409517765, -0.007163177710026503, 1.9883670806884766, 0.7700537236118319],
|
||||
[-0.7708238487688981, -0.4062393009662628, 0.4376069903373718, -0.7280921936035156, -0.011410382576286793, 5.746318817138672, 0.7638278009790337],
|
||||
[-0.7445005123731817, -0.39177948236465454, 0.5822052955627441, -0.7190147042274475, -0.015604634769260883, 5.697494029998779, 0.7576461193038383],
|
||||
[-0.7287265403223198, -0.3783334493637085, 0.7166655659675598, -0.7105735540390015, -0.01974964700639248, 5.648215293884277, 0.7514720746944674],
|
||||
[-0.7176819193766284, -0.3658301532268524, 0.8416985273361206, -0.7027242183685303, -0.023848872631788254, 5.598015308380127, 0.7452774336652609],
|
||||
[-0.7087817643717371, -0.3542034924030304, 0.9579651951789856, -0.695425271987915, -0.027905520051717758, 5.546477317810059, 0.7390478495218085],
|
||||
[-0.9199999685889073, 7.306608200073242, 1.0660802125930786, 4.113862037658691, -0.027905520051717758, 6.068759918212891, 0.7446808313863519],
|
||||
[-0.9199999685889073, 7.316661357879639, 1.1666151285171509, 4.12017297744751, -0.027905520051717758, 6.111703872680664, 0.7501764234493237],
|
||||
[-0.9199999685889073, 7.326010227203369, 1.2601011991500854, 4.126042366027832, -0.027905520051717758, 6.153583526611328, 0.7555379766814936],
|
||||
[-0.9199999685889073, 7.33470344543457, 1.347032904624939, 4.131499290466309, -0.027905520051717758, 6.194431781768799, 0.7607687603226371],
|
||||
[-0.9199999685889073, 7.34278678894043, 1.4278696775436401, 4.1365742683410645, -0.027905520051717758, 6.234278202056885, 0.765871963874974],
|
||||
[-0.9199999685889073, 8.232775688171387, 1.327759027481079, 4.695289611816406, -0.027905520051717758, 6.273124694824219, 0.7708506990480516],
|
||||
[-0.9199999685889073, 8.223466873168945, 1.2346673011779785, 4.689445495605469, -0.027905520051717758, 6.311017990112305, 0.775708001655932],
|
||||
[0.22799154825718387, 8.197281837463379, 0.9728226065635681, 5.45698881149292, 0.0039269146509468555, -6.295364856719971, 0.780446833468498],
|
||||
[0.23419523367937423, 8.172933578491211, 0.7293363809585571, 5.441702842712402, 0.03567017987370491, -6.334527492523193, 0.7850700840173425],
|
||||
[0.24001124821910183, 8.15029239654541, 0.5029214024543762, 5.427489280700684, 0.06733053922653198, -6.373260974884033, 0.7895805723576782],
|
||||
[0.24563307844267657, 8.12923812866211, 0.2923808693885803, 5.414271831512451, 0.09891378879547119, -6.412202835083008, 0.7939810487872736],
|
||||
[0.2514091635182312, 8.109660148620605, 0.09660171717405319, 5.401981353759766, 0.1304253488779068, -6.452564239501953, 0.7982741965234642],
|
||||
[0.26319184231767545, 8.09145450592041, -0.08545099198818207, 5.390552520751953, 0.16187024116516113, -6.51570463180542, 0.8020599373232822],
|
||||
[0.265450510692521, 8.074525833129883, -0.2547396421432495, 5.379924774169922, 0.19325312972068787, -6.544726848602295, 0.8054052405018639],
|
||||
[0.26603509872581854, 8.058784484863281, -0.41215911507606506, 5.37004280090332, 0.2245783805847168, -6.568309783935547, 0.808214631238123],
|
||||
[0.2648741592145022, 8.044145584106445, -0.5585416555404663, 5.36085319519043, 0.25585001707077026, -6.586142539978027, 0.8103390489042367],
|
||||
[0.26166994194463644, 8.030533790588379, -0.694661021232605, 5.3523077964782715, 0.2870718240737915, -6.5970916748046875, 0.8116433931864653],
|
||||
[0.9199999685889073, -8.164595603942871, -0.6459569931030273, -4.814634799957275, 0.2870718240737915, -7.096859455108643, 0.8135545394151179],
|
||||
[0.9199999685889073, -8.160066604614258, -0.6006677150726318, -4.81179141998291, 0.2870718240737915, -7.112162113189697, 0.8154190723211203],
|
||||
[-0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0],
|
||||
[-0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0],
|
||||
[-0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0],
|
||||
[0.38513324930148474, -0.0759519413113594, 0.05048057436943054, -1.7808427810668945, -0.00020776498422492296, -0.34127020835876465, 0.9991124139302132],
|
||||
[0.40075537473288914, -0.0712578147649765, 0.09742186218500137, -1.6257919073104858, -0.00039744071546010673, -0.33461055159568787, 0.9982771386678583],
|
||||
[0.4201164532492807, -0.06689280271530151, 0.14107200503349304, -1.483040452003479, -0.0005704620853066444, -0.32935744524002075, 0.9974910563680077],
|
||||
[0.3902653702713881, -0.06283382326364517, 0.18166175484657288, -1.3503772020339966, -0.0007280061254277825, -0.3258514404296875, 0.9967511103297959],
|
||||
[0.3556846194505165, -0.05905943363904953, 0.21940568089485168, -1.2258175611495972, -0.0008710181573405862, -0.32368361949920654, 0.996054354716816],
|
||||
[0.3229036446280457, -0.05554967001080513, 0.2545033097267151, -1.1077765226364136, -0.0010002587223425508, -0.3215988874435425, 0.9953979847183112],
|
||||
[0.29161282059042204, -0.05228598415851593, 0.2871401607990265, -0.995150089263916, -0.001116359606385231, -0.31956741213798523, 0.9947793526160259],
|
||||
[-0.43281167838121426, 0.01770082116127014, 0.2670082151889801, 1.7472336292266846, -0.001116359606385231, -0.29091861844062805, 0.9947870032699171],
|
||||
[-0.40825407552453624, 0.015828775241971016, 0.24828776717185974, 1.658023476600647, -0.0009229235001839697, -0.29179736971855164, 0.9947971654884007],
|
||||
[-0.38586022378762674, 0.014087983407080173, 0.23087982833385468, 1.5766654014587402, -0.0007389792008325458, -0.29259806871414185, 0.9948095529007845]
|
||||
]
|
||||
}
|
||||
},
|
||||
"corrections": {
|
||||
"2746116c4f1040ff28312cd481ed59a43ace3fc1": "Unwind freezes the integrator when steering magnitude decreases in either direction."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,139 @@
|
||||
{
|
||||
"sourceCommit": "678af783",
|
||||
"controllerSha256": "3561d5ac43a72f9b68bc9e44042b8f5cbdca406dec940e7648c64607862a60f7",
|
||||
"helperSha256": "2a7793c6ee4b53b45070d3267a01e8c7105dfd8df9d38cdfc96cfe4b672a125b",
|
||||
"fields": ["output", "desiredLateralAccel", "desiredLateralJerk", "p", "i", "f", "directionalFilter"],
|
||||
"cases": {
|
||||
"2023_default": [
|
||||
[-0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0],
|
||||
[-0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0],
|
||||
[-0.10946385067439653, -6.3100724219111726e-06, -6.310072058113292e-05, 0.1341981738805771, 1.8787743556458736e-06, 0.00032710772939026356, 0.9996100118902765],
|
||||
[-0.10883246512145582, -1.2177733879070729e-05, -0.00012177733879070729, 0.1318926364183426, 3.725271199073177e-06, 0.00031992016010917723, 0.9992295059317203],
|
||||
[-0.10824537411387734, -1.7634001778787933e-05, -0.00017634002142585814, 0.12974874675273895, 5.541753580473596e-06, 0.00031323812436312437, 0.9988582529369309],
|
||||
[-0.10769947128273318, -2.2707719836034812e-05, -0.00022707720927428454, 0.12775516510009766, 7.330325843213359e-06, 0.00030702617368660867, 0.9984960291624968],
|
||||
[-0.28297200469611916, -0.000652122835163027, -0.006521228235214949, 1.1880364418029785, 0.00014593458035960793, -0.2816479206085205, 0.9981391809934517],
|
||||
[-0.2756437166861801, -0.0012374084908515215, -0.012374084442853928, 1.1618024110794067, 0.0002814781910274178, -0.28237107396125793, 0.9977880370052482],
|
||||
[-0.26883225664052884, -0.0017816586187109351, -0.017816586419939995, 1.1374077796936035, 0.0004141757672186941, -0.2830390930175781, 0.9974426531218326],
|
||||
[-0.26250143520346325, -0.0022877503652125597, -0.02287750318646431, 1.1147234439849854, 0.0005442268447950482, -0.2836558222770691, 0.9971030722974821],
|
||||
[0.4601949453186658, -0.1805993765592575, 0.1540062576532364, -1.188317060470581, -0.0012640818022191525, -0.49601319432258606, 0.992499586928128],
|
||||
[0.4465996195441572, -0.1641511619091034, 0.31848835945129395, -1.14291250705719, -0.0012640818022191525, -0.4924542307853699, 0.9884772861214742],
|
||||
[0.43407732863292336, -0.14885616302490234, 0.47143831849098206, -1.100691318511963, -0.0012640818022191525, -0.4894025921821594, 0.9849106631692192],
|
||||
[0.41633289657380795, -0.13463354110717773, 0.6136646270751953, -1.0614302158355713, -0.0012640818022191525, -0.46395212411880493, 0.9817055989940047],
|
||||
[0.39730472578123277, -0.12140807509422302, 0.7459192276000977, -1.0249220132827759, -0.0012640818022191525, -0.4308745861053467, 0.9788075568573854],
|
||||
[0.4297113013265992, -0.6421098709106445, 0.8689011931419373, -1.042867660522461, -0.0012640818022191525, -0.7659497857093811, 0.9666235589852955],
|
||||
[0.4248670128656576, -0.6306739449501038, 0.9832606315612793, -1.0322579145431519, -0.0012640818022191525, -0.7597172856330872, 0.954489222066301],
|
||||
[0.42049364468176326, -0.6200397610664368, 1.0896021127700806, -1.0223921537399292, -0.0012640818022191525, -0.7535170316696167, 0.9424195214508498],
|
||||
[0.4164368811483507, -0.6101512312889099, 1.1884877681732178, -1.0132180452346802, -0.0012640818022191525, -0.7473620176315308, 0.9304395954054268],
|
||||
[0.3199540924834166, -0.06795595586299896, 1.2804404497146606, -0.8773695230484009, -0.0012640818022191525, -0.29505154490470886, 0.9299817995128876],
|
||||
[0.060078582417879084, 0.1974666267633438, 1.1906663179397583, -0.14468130469322205, -0.0012640818022191525, -0.07431123405694962, 0.9303986060329053],
|
||||
[0.07382922238852245, 0.1891186386346817, 1.1071864366531372, -0.1677255779504776, -0.0012665000976994634, -0.10168427973985672, 0.9308865510565729],
|
||||
[0.08651897274157169, 0.18135595321655273, 1.0295594930648804, -0.18915419280529022, -0.0015543433837592602, -0.1265009641647339, 0.9314381973895504],
|
||||
[0.09815910618563091, 0.17413750290870667, 0.9573751091957092, -0.20908039808273315, -0.0018725092522799969, -0.14894376695156097, 0.9320461536047748],
|
||||
[-0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0],
|
||||
[-0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0],
|
||||
[-0.2513814549455434, -0.003141704946756363, -0.004417050164192915, 1.0764470100402832, 0.00012558548769447953, -0.28566011786460876, 0.9995935936517069],
|
||||
[-0.24625808545922598, -0.0035524412523955107, -0.008524413220584393, 1.0580368041992188, 0.0002490231127012521, -0.28612491488456726, 0.999194945848787],
|
||||
[-0.2414972946123882, -0.003934380132704973, -0.012343800626695156, 1.0409173965454102, 0.0003704634727910161, -0.28655150532722473, 0.9988040108797638],
|
||||
[-0.31353200913731205, 0.00156875466927886, -0.02031245268881321, 1.2875816822052002, 0.0005206813220866024, -0.2697177231311798, 0.9987354006918017]
|
||||
],
|
||||
"2023_tuned": [
|
||||
[-0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0],
|
||||
[-0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0],
|
||||
[-0.10946365319690253, -6.3100724219111726e-06, -6.310072058113292e-05, 0.1341981738805771, 1.8787743556458736e-06, 0.00032638496486470103, 0.9996100118902765],
|
||||
[-0.10883226781007806, -1.2177733879070729e-05, -0.00012177733879070729, 0.1318926364183426, 3.725271199073177e-06, 0.0003191980067640543, 0.9992295059317203],
|
||||
[-0.10824517696030346, -1.7634001778787933e-05, -0.00017634002142585814, 0.12974874675273895, 5.541753580473596e-06, 0.00031251655309461057, 0.9988582529369309],
|
||||
[-0.10769927427915203, -2.2707719836034812e-05, -0.00022707720927428454, 0.12775516510009766, 7.330325843213359e-06, 0.00030630515539087355, 0.9984960291624968],
|
||||
[-0.28233191056000917, -0.000652122835163027, -0.006521228235214949, 1.1880364418029785, 0.00014593458035960793, -0.28399068117141724, 0.9981391809934517],
|
||||
[-0.2749949064500627, -0.0012374084908515215, -0.012374084442853928, 1.1618024110794067, 0.0002814781910274178, -0.2847457230091095, 0.9977880370052482],
|
||||
[-0.26817517909605, -0.0017816586187109351, -0.017816586419939995, 1.1374077796936035, 0.0004141757672186941, -0.2854440212249756, 0.9974426531218326],
|
||||
[-0.26183652822545644, -0.0022877503652125597, -0.02287750318646431, 1.1147234439849854, 0.0005442268447950482, -0.28608939051628113, 0.9971030722974821],
|
||||
[0.4595698571302159, -0.1805993765592575, 0.1540062576532364, -1.188317060470581, -0.0012640818022191525, -0.49372363090515137, 0.992499586928128],
|
||||
[0.44595244427846414, -0.1641511619091034, 0.31848835945129395, -1.14291250705719, -0.0012640818022191525, -0.4900825619697571, 0.9884772861214742],
|
||||
[0.43341988321633484, -0.14885616302490234, 0.47143831849098206, -1.100691318511963, -0.0012640818022191525, -0.48699232935905457, 0.9849106631692192],
|
||||
[0.4146338623062182, -0.13463354110717773, 0.6136646270751953, -1.0614302158355713, -0.0012640818022191525, -0.4577219784259796, 0.9817055989940047],
|
||||
[0.39571172853313513, -0.12140807509422302, 0.7459192276000977, -1.0249220132827759, -0.0012640818022191525, -0.42503249645233154, 0.9788075568573854],
|
||||
[0.4297113005126837, -0.6421098709106445, 0.8689011931419373, -1.042867660522461, -0.0012640818022191525, -0.7659497857093811, 0.9666235589852955],
|
||||
[0.4248670116005044, -0.6306739449501038, 0.9832606315612793, -1.0322579145431519, -0.0012640818022191525, -0.7597172856330872, 0.954489222066301],
|
||||
[0.4204936427763009, -0.6200397610664368, 1.0896021127700806, -1.0223921537399292, -0.0012640818022191525, -0.7535170316696167, 0.9424195214508498],
|
||||
[0.4164368783622407, -0.6101512312889099, 1.1884877681732178, -1.0132180452346802, -0.0012640818022191525, -0.7473620176315308, 0.9304395954054268],
|
||||
[0.3188361342080046, -0.06795595586299896, 1.2804404497146606, -0.8773695230484009, -0.0012640818022191525, -0.2909505367279053, 0.9299817995128876],
|
||||
[0.07886541128383386, 0.1974666267633438, 1.1906663179397583, -0.14468130469322205, -0.0012640818022191525, -0.14318642020225525, 0.9303986060329053],
|
||||
[0.09212774529529907, 0.1891186386346817, 1.1071864366531372, -0.1677255779504776, -0.0012665000976994634, -0.16877123713493347, 0.9308865510565729],
|
||||
[0.10426233987400049, 0.18135595321655273, 1.0295594930648804, -0.18915419280529022, -0.0015543433837592602, -0.1915545016527176, 0.9314381973895504],
|
||||
[0.11528450629035937, 0.17413750290870667, 0.9573751091957092, -0.20908039808273315, -0.0018725092522799969, -0.2117334008216858, 0.9320461536047748],
|
||||
[-0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0],
|
||||
[-0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0],
|
||||
[-0.2507020459817548, -0.003141704946756363, -0.004417050164192915, 1.0764470100402832, 0.00012558548769447953, -0.2881467640399933, 0.9995935936517069],
|
||||
[-0.24557222240998797, -0.0035524412523955107, -0.008524413220584393, 1.0580368041992188, 0.0002490231127012521, -0.2886351943016052, 0.999194945848787],
|
||||
[-0.24080535398236808, -0.003934380132704973, -0.012343800626695156, 1.0409173965454102, 0.0003704634727910161, -0.2890840172767639, 0.9988040108797638],
|
||||
[-0.31192240501086027, 0.00156875466927886, -0.02031245268881321, 1.2875816822052002, 0.0005206813220866024, -0.2756088972091675, 0.9987354006918017]
|
||||
],
|
||||
"2025_default": [
|
||||
[-0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0],
|
||||
[-0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0],
|
||||
[-0.1000419596173212, -6.3100724219111726e-06, -6.310072058113292e-05, 0.09995962679386139, 1.399434836457658e-06, 0.00010129198199138045, 0.9996100118902765],
|
||||
[-0.09957267603318784, -1.2177733879070729e-05, -0.00012177733879070729, 0.09824388474225998, 2.774849235720467e-06, 9.798955579753965e-05, 0.9992295059317203],
|
||||
[-0.09913630335274988, -1.7634001778787933e-05, -0.00017634002142585814, 0.09664839506149292, 4.127926786168246e-06, 9.492012031842023e-05, 0.9988582529369309],
|
||||
[-0.0987305336073542, -2.2707719836034812e-05, -0.00022707720927428454, 0.0951647162437439, 5.460232841869583e-06, 9.206731920130551e-05, 0.9984960291624968],
|
||||
[-0.20914663037612374, -0.000652122835163027, -0.006521228235214949, 0.9331316947937012, 0.00011432559404056519, -0.29679471254348755, 0.9981391809934517],
|
||||
[-0.20378671594561765, -0.0012374084908515215, -0.012374084442853928, 0.913754940032959, 0.0002209303347626701, -0.2971450090408325, 0.9977880370052482],
|
||||
[-0.19880095039411716, -0.0017816586187109351, -0.017816586419939995, 0.895721435546875, 0.00032543117413297296, -0.29746678471565247, 0.9974426531218326],
|
||||
[-0.19416335817561867, -0.0022877503652125597, -0.02287750318646431, 0.8789377212524414, 0.00042797389323823154, -0.2977619171142578, 0.9971030722974821],
|
||||
[0.4392321660999833, -0.1805993765592575, 0.1540062576532364, -1.1881484985351562, -0.0013800781453028321, -0.4364989101886749, 0.992499586928128],
|
||||
[0.4258132064536378, -0.1641511619091034, 0.31848835945129395, -1.1428061723709106, -0.0013800781453028321, -0.4333744943141937, 0.9884772861214742],
|
||||
[0.4134643642642225, -0.14885616302490234, 0.47143831849098206, -1.100642204284668, -0.0013800781453028321, -0.43070998787879944, 0.9849106631692192],
|
||||
[0.4020555760971033, -0.13463354110717773, 0.6136646270751953, -1.0614110231399536, -0.0013800781453028321, -0.42824599146842957, 0.9817055989940047],
|
||||
[0.3848995656490656, -0.12140807509422302, 0.7459192276000977, -1.0249145030975342, -0.0013800781453028321, -0.4015149474143982, 0.9788075568573854],
|
||||
[0.4109087335446737, -0.6421098709106445, 0.8689011931419373, -1.042867660522461, -0.0013800781453028321, -0.7119354009628296, 0.9666235589852955],
|
||||
[0.40548124993066065, -0.6306739449501038, 0.9832606315612793, -1.0322579145431519, -0.0013800781453028321, -0.705704391002655, 0.954489222066301],
|
||||
[0.40050714696593104, -0.6200397610664368, 1.0896021127700806, -1.0223921537399292, -0.0013800781453028321, -0.6995058655738831, 0.9424195214508498],
|
||||
[0.39584261470068033, -0.6101512312889099, 1.1884877681732178, -1.0132180452346802, -0.0013800781453028321, -0.6933526992797852, 0.9304395954054268],
|
||||
[0.3149811146942059, -0.06795595586299896, 1.2804404497146606, -0.8773694038391113, -0.0013800781453028321, -0.29052385687828064, 0.9299817995128876],
|
||||
[0.07278191701495691, 0.1974666267633438, 1.1906663179397583, -0.14468127489089966, -0.0013800781453028321, -0.12354271858930588, 0.9303986060329053],
|
||||
[0.08476103001121033, 0.1891186386346817, 1.1071864366531372, -0.16772553324699402, -0.0013592970790341496, -0.1449497640132904, 0.9308865510565729],
|
||||
[0.09583379534180414, 0.18135595321655273, 1.0295594930648804, -0.18915407359600067, -0.0016471401322633028, -0.16431504487991333, 0.9314381973895504],
|
||||
[0.10599475260681573, 0.17413750290870667, 0.9573751091957092, -0.20908012986183167, -0.001965305535122752, -0.18178008496761322, 0.9320461536047748],
|
||||
[-0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0],
|
||||
[-0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0],
|
||||
[-0.18455691150215894, -0.003141704946756363, -0.004417050164192915, 0.8457168340682983, 9.866696200333536e-05, -0.2993770241737366, 0.9995935936517069],
|
||||
[-0.1807869478147606, -0.0035524412523955107, -0.008524413220584393, 0.8320255279541016, 0.00019573660392779857, -0.2995831072330475, 0.999194945848787],
|
||||
[-0.1772817750930907, -0.003934380132704973, -0.012343800626695156, 0.8192852139472961, 0.00029131988412700593, -0.2997693419456482, 0.9988040108797638],
|
||||
[-0.23438617884934018, 0.00156875466927886, -0.02031245268881321, 1.0144683122634888, 0.00040967451059259474, -0.2860351800918579, 0.9987354006918017]
|
||||
],
|
||||
"2025_tuned": [
|
||||
[-0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0],
|
||||
[-0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0],
|
||||
[-0.10004176588515235, -6.3100724219111726e-06, -6.310072058113292e-05, 0.09995962679386139, 1.399434836457658e-06, 0.00010058288171421736, 0.9996100118902765],
|
||||
[-0.0995724824028674, -1.2177733879070729e-05, -0.00012177733879070729, 0.09824388474225998, 2.774849235720467e-06, 9.72808338701725e-05, 0.9992295059317203],
|
||||
[-0.09913610982047417, -1.7634001778787933e-05, -0.00017634002142585814, 0.09664839506149292, 4.127926786168246e-06, 9.421175491297618e-05, 0.9988582529369309],
|
||||
[-0.09873034016950431, -2.2707719836034812e-05, -0.00022707720927428454, 0.0951647162437439, 5.460232841869583e-06, 9.135930304182693e-05, 0.9984960291624968],
|
||||
[-0.20850737366620653, -0.000652122835163027, -0.006521228235214949, 0.9331316947937012, 0.00011432559404056519, -0.299134761095047, 0.9981391809934517],
|
||||
[-0.20313872630464402, -0.0012374084908515215, -0.012374084442853928, 0.913754940032959, 0.0002209303347626701, -0.29951703548431396, 0.9977880370052482],
|
||||
[-0.1981446778400448, -0.0017816586187109351, -0.017816586419939995, 0.895721435546875, 0.00032543117413297296, -0.2998691201210022, 0.9974426531218326],
|
||||
[-0.1934992417196338, -0.0022877503652125597, -0.02287750318646431, 0.8789377212524414, 0.00042797389323823154, -0.3001929819583893, 0.9971030722974821],
|
||||
[0.4385985958463555, -0.1805993765592575, 0.1540062576532364, -1.1881484985351562, -0.0013800781453028321, -0.4341534674167633, 0.992499586928128],
|
||||
[0.42515705373587437, -0.1641511619091034, 0.31848835945129395, -1.1428061723709106, -0.0013800781453028321, -0.4309435486793518, 0.9884772861214742],
|
||||
[0.41279772620131083, -0.14885616302490234, 0.47143831849098206, -1.100642204284668, -0.0013800781453028321, -0.42823871970176697, 0.9849106631692192],
|
||||
[0.4005006910087692, -0.13463354110717773, 0.6136646270751953, -1.0614110231399536, -0.0013800781453028321, -0.42247965931892395, 0.9817055989940047],
|
||||
[0.3834282557554281, -0.12140807509422302, 0.7459192276000977, -1.0249145030975342, -0.0013800781453028321, -0.39605703949928284, 0.9788075568573854],
|
||||
[0.41090873272070005, -0.6421098709106445, 0.8689011931419373, -1.042867660522461, -0.0013800781453028321, -0.7119354009628296, 0.9666235589852955],
|
||||
[0.4054812486515245, -0.6306739449501038, 0.9832606315612793, -1.0322579145431519, -0.0013800781453028321, -0.705704391002655, 0.954489222066301],
|
||||
[0.40050714504196294, -0.6200397610664368, 1.0896021127700806, -1.0223921537399292, -0.0013800781453028321, -0.6995058655738831, 0.9424195214508498],
|
||||
[0.3958426118913092, -0.6101512312889099, 1.1884877681732178, -1.0132180452346802, -0.0013800781453028321, -0.6933526396751404, 0.9304395954054268],
|
||||
[0.31389254542210765, -0.06795595586299896, 1.2804404497146606, -0.8773694038391113, -0.0013800781453028321, -0.28648287057876587, 0.9299817995128876],
|
||||
[0.09121441906277902, 0.1974666267633438, 1.1906663179397583, -0.14468127489089966, -0.0013800781453028321, -0.19182172417640686, 0.9303986060329053],
|
||||
[0.10272071436991616, 0.1891186386346817, 1.1071864366531372, -0.16772553324699402, -0.0013592970790341496, -0.21148933470249176, 0.9308865510565729],
|
||||
[0.11325653863995695, 0.18135595321655273, 1.0295594930648804, -0.18915407359600067, -0.0016471401322633028, -0.2288757711648941, 0.9314381973895504],
|
||||
[0.1228192862316972, 0.17413750290870667, 0.9573751091957092, -0.20908012986183167, -0.001965305535122752, -0.24413321912288666, 0.9320461536047748],
|
||||
[-0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0],
|
||||
[-0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0],
|
||||
[-0.1838782763203542, -0.003141704946756363, -0.004417050164192915, 0.8457168340682983, 9.866696200333536e-05, -0.3018612265586853, 0.9995935936517069],
|
||||
[-0.18010184692892778, -0.0035524412523955107, -0.008524413220584393, 0.8320255279541016, 0.00019573660392779857, -0.30209097266197205, 0.999194945848787],
|
||||
[-0.176590585847015, -0.003934380132704973, -0.012343800626695156, 0.8192852139472961, 0.00029131988412700593, -0.30229949951171875, 0.9988040108797638],
|
||||
[-0.23277761972196384, 0.00156875466927886, -0.02031245268881321, 1.0144683122634888, 0.00040967451059259474, -0.2919234335422516, 0.9987354006918017]
|
||||
]
|
||||
},
|
||||
"corrections": {
|
||||
"2746116c4f1040ff28312cd481ed59a43ace3fc1": "Unwind freezes the integrator when steering magnitude decreases in either direction."
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user