This repository has been archived on 2022-02-23. You can view files and clone it, but cannot push or open issues or pull requests.
pathfinder/tests/model/test_model.py

129 lines
4.7 KiB
Python

import numpy
import pathfinder.model as model
import scipy.optimize
import pytest
def test_dotdipolemodel_repr():
mod = model.DotDipoleModel((), 1)
assert repr(mod) == "DotDipoleModel([], 1)"
def test_dotdipolemodel_m():
mod = model.DotDipoleModel([model.DotMeasurement(1, (0, 0, 0)), model.DotMeasurement(2, (0, 0, 0))], 1)
assert mod.m == 2
def test_dotdipolemodel_cost():
mod = model.DotDipoleModel([model.DotMeasurement(1, (0, 0, 1)), model.DotMeasurement(2, (1, 0, 0))], 1)
costs = mod.costs()
jac = mod.jac()
pt_to_test = numpy.array((1, 2, 3, 4, 5, 6))
expected_cost = [-1.05408565512728256, -2.05293155269909457]
expected_jacobian = [
[
-0.007460090362383803, -0.009325112952979752, -0.009325112952979752,
0.007968732887091788, 0.00856214916591777, 0.006697126575321822
], [
-0.00512240832571883, -0.008537347209531383, -0.01024481665143766,
0.005098015905120168, 0.007927536694564856, 0.008488562368334061
]
]
numpy.testing.assert_allclose(costs(pt_to_test), expected_cost, err_msg="Costs aren't as expected.")
numpy.testing.assert_allclose(jac(pt_to_test), expected_jacobian, err_msg="Jacobian aren't as expected.")
def print_result(msg, result):
print(msg)
print(f"\tResult: {result.x}")
print(f"\tSuccess: {result.success}. {result.message}")
try:
print(f"\tFunc evals: {result.nfev}")
except AttributeError:
pass
try:
print(f"\tJacb evals: {result.njev}")
except AttributeError:
pass
@pytest.mark.skip(reason="old")
def test_dot_dipole_model_jac():
v1 = -0.05547767706400186526225414
v2 = -0.06018573388098888319642888
v3 = -0.06364032191901859480476888
v4 = -0.06488383879243851188402150
v5 = -0.06297148063759813929659130
v6 = -0.05735489606460216
v7 = -0.07237320672886623
v8 = -0.1082531754730548
c1 = model.DotMeasurement(v1, [0, 0, 1])
c2 = model.DotMeasurement(v2, [0, 0, 2])
c3 = model.DotMeasurement(v3, [0, 0, 3])
c4 = model.DotMeasurement(v4, [0, 0, 4])
c5 = model.DotMeasurement(v5, [0, 0, 5])
c6 = model.DotMeasurement(v6, [0, 0, 6])
c7 = model.DotMeasurement(v7, [1, 1, 7])
c8 = model.DotMeasurement(v8, [1, 2, 3])
mod = model.DotDipoleModel([c1, c2, c3, c4, c5, c6], 1)
res = scipy.optimize.least_squares(mod.costs(), numpy.array([1, 2, 3, 4, 5, 6]), jac=mod.jac(), ftol=1e-12)
print_result("6 dots, least sq", res)
mod2 = model.DotDipoleModel([c1, c2, c3, c4, c5, c6, c7, c8], 1)
res2 = scipy.optimize.least_squares(mod2.costs(), numpy.array([0, 0, 0, 0, 0, 0]), jac=mod2.jac(), ftol=1e-12, gtol=3e-16)
print_result("7 dots, least squares", res2)
print(mod2.costs()(res2.x))
print(mod2.costs()(numpy.array([1, 3, 5, 5, 6, 7])))
@pytest.mark.skip(reason="bad test")
def test_dot_2dipoles_model_jac():
dots_12andone = [
model.DotMeasurement(-0.1978319326584865, [-4, -1, 0]),
model.DotMeasurement(-0.1273171638293727, [-4, -5, 0]),
model.DotMeasurement(-0.05545025617224288, [-4, -9, 0]),
model.DotMeasurement(-0.4960209997369774, [-1, -1, 0]),
model.DotMeasurement(-0.1763373289754278, [-1, -5, 0]),
model.DotMeasurement(-0.04946346672578462, [-1, -9, 0]),
model.DotMeasurement(-0.5633156098386561, [1, -1, 0]),
model.DotMeasurement(-0.113765134433174, [1, -5, 0]),
model.DotMeasurement(-0.0294893572499722, [1, -9, 0]),
model.DotMeasurement(0.7794941616360612, [4, -1, 0]),
model.DotMeasurement(0.1110683086477768, [4, -5, 0]),
model.DotMeasurement(0.01183272220840589, [4, -9, 0]),
model.DotMeasurement(-0.1096485462119833, [1, 1, 1]),
model.DotMeasurement(-0.3925851888077783, [1, 1, -1])
]
# dots = [
# model.Dot(-0.1978319326584865, [-4, -1, 0]),
# model.Dot(-0.1273171638293727, [-4, -5, 0]),
# model.Dot(-0.05545025617224288, [-4, -9, 0]),
# model.Dot(-0.4960209997369774, [-1, -1, 0]),
# model.Dot(-0.1763373289754278, [-1, -5, 0]),
# model.Dot(-0.04946346672578462, [-1, -9, 0]),
# model.Dot(-0.5633156098386561, [1, -1, 0]),
# model.Dot(-0.113765134433174, [1, -5, 0]),
# model.Dot(-0.0294893572499722, [1, -9, 0]),
# model.Dot(0.7794941616360612, [4, -1, 0]),
# model.Dot(0.1110683086477768, [4, -5, 0]),
# model.Dot(0.01183272220840589, [4, -9, 0]),
# model.Dot(-0.0261092728062841, [-4, -13, 0]),
# model.Dot(-0.02035559593904894, [-1, -13, 0]),
# model.Dot(-0.01296894715810522, [1, -13, 0]),
# model.Dot(0.0003306001626435171, [4, -13, 0]),
# model.Dot(0.2612817068810759, [7, -1, 0]),
# model.Dot(0.1203841445911355, [7, -5, 0]),
# model.Dot(0.03425933872931543, [7, -9, 0]),
# model.Dot(0.01068547688208644, [7, -13, 0]),
# ]
mod = model.DotDipoleModel(dots_12andone, 2)
res = scipy.optimize.least_squares(mod.costs(), numpy.array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), jac=mod.jac(), ftol=1e-12)
print_result("6 dots, least sq", res)
print(mod.costs()(res.x))
for val in res.x:
print(val)