import scipy.linalg.norm lazily

This commit is contained in:
Laura Klünder 2024-02-07 20:05:15 +01:00
parent 43b4b63a63
commit 2b0df524cb

View file

@ -6,7 +6,6 @@ from pprint import pprint
from typing import Optional, Self, Sequence, TypeAlias from typing import Optional, Self, Sequence, TypeAlias
import numpy as np import numpy as np
import scipy
from django.conf import settings from django.conf import settings
from c3nav.mapdata.models import MapUpdate, Space from c3nav.mapdata.models import MapUpdate, Space
@ -203,6 +202,12 @@ class Locator:
from scipy.optimize import least_squares from scipy.optimize import least_squares
return least_squares return least_squares
@cached_property
def norm_func(self):
# this is effectively a lazy import to save memory… todo: do we need that?
from scipy.linalg import norm
return norm
def locate_range(self, scan_data: ScanData, permissions=None, orig_addr=None): def locate_range(self, scan_data: ScanData, permissions=None, orig_addr=None):
pprint(scan_data) pprint(scan_data)
@ -238,10 +243,10 @@ class Locator:
# rating the guess by calculating the distances # rating the guess by calculating the distances
def diff_func(guess): def diff_func(guess):
result = scipy.linalg.norm(np_ranges[:, :dimensions] - guess[:dimensions], axis=1) - measured_ranges result = self.norm_func(np_ranges[:, :dimensions] - guess[:dimensions], axis=1) - measured_ranges
# print(result) # print(result)
return result return result
# factors = scipy.linalg.norm(np_ranges[:, :dimensions] - guess[:dimensions], axis=1) / measured_ranges # factors = self.norm_func(np_ranges[:, :dimensions] - guess[:dimensions], axis=1) / measured_ranges
# return factors - np.mean(factors) # return factors - np.mean(factors)
def cost_func(guess): def cost_func(guess):
@ -294,12 +299,12 @@ class Locator:
print() print()
print("measured ranges:", ", ".join(("%.2f" % i) for i in tuple(np_ranges[:, 3]))) print("measured ranges:", ", ".join(("%.2f" % i) for i in tuple(np_ranges[:, 3])))
print("result ranges:", ", ".join( print("result ranges:", ", ".join(
("%.2f" % i) for i in tuple(scipy.linalg.norm(np_ranges[:, :dimensions] - result_pos[:dimensions], axis=1)) ("%.2f" % i) for i in tuple(self.norm_func(np_ranges[:, :dimensions] - result_pos[:dimensions], axis=1))
)) ))
if orig_xyz is not None: if orig_xyz is not None:
print("correct ranges:", ", ".join( print("correct ranges:", ", ".join(
("%.2f" % i) ("%.2f" % i)
for i in tuple(scipy.linalg.norm(np_ranges[:, :dimensions] - orig_xyz[:dimensions], axis=1)) for i in tuple(self.norm_func(np_ranges[:, :dimensions] - orig_xyz[:dimensions], axis=1))
)) ))
print() print()
print("diff result-measured:", ", ".join( print("diff result-measured:", ", ".join(