class TestCGA3D(_TestBase): layout, blades, stuff = clifford.conformalize(clifford.Cl(3)[0]) e1 = blades['e1'] e2 = blades['e2'] e3 = blades['e3'] @pytest.fixture(params=[ layout.scalar, e1, e1^e2, e1^e2^e3, ]) def direction(self, request): return request.param @pytest.fixture(params=[ layout.scalar * 0, 3*e1, ]) def location(self, request): return request.param def test_inferred_dims(self): """ Test that the appropriate subclass is inferred from arguments """ e1, e2, e3 = self.e1, self.e2, self.e3 C = Round(location=e1, direction=e2^e3, radius=1) assert isinstance(C, Circle) S = Round(location=e1, direction=e1^e2^e3, radius=1) assert isinstance(S, Sphere) # wrong grade with pytest.raises(ValueError): Sphere(location=e1, direction=e1^e2, radius=1) with pytest.raises(ValueError): Circle(location=e1, direction=e1^e2^e3, radius=1)
def __init__(self, dimensions) -> None: self.dimensions = dimensions self.layout, self.blades = cf.Cl(dimensions) for name in self.blades: setattr(self, name, self.blades[name]) self.unitvectors = self.layout.blades_of_grade(1)
def test_hitzer_inverse(self, p, q): Ntests = 100 layout, blades = cf.Cl(p, q) for i in range(Ntests): mv = layout.randomMV() mv_inv = mv.hitzer_inverse() np.testing.assert_almost_equal((mv * mv_inv).value, layout.scalar.value)
def test_hitzer_inverse(self, p, q, r, rng): # noqa: F811 Ntests = 10 layout, blades = cf.Cl(p, q, r) for i in range(Ntests): mv = layout.randomMV(rng=rng) mv_inv = mv.hitzer_inverse() np.testing.assert_allclose((mv * mv_inv).value, layout.scalar.value, rtol=1E-5, atol=1E-6)
def __init__(self, dimensions) -> None: """ Creates Geometric Algebra Rotations class for n-dimensions Args: dimensions (int): number of dimensions """ self.dimensions = dimensions self.layout, self.blades = clifford.Cl(dimensions) for name in self.blades: setattr(self, name, self.blades[name]) self.unitvectors = self.layout.blades_of_grade(1)
def test_shirokov_inverse(self, p, q, r, rng): # noqa: F811 Ntests = 5 layout, blades = cf.Cl(p, q, r) if p + q + r > 7: # This is perhaps a little extreme but algorithm really does struggle # with larger algebras atol = 0.15 else: atol = 1E-6 for i in range(Ntests): mv = layout.randomMV(rng=rng) mv_inv = mv.shirokov_inverse() np.testing.assert_allclose((mv * mv_inv).value, layout.scalar.value, rtol=1E-5, atol=atol)
class TestCGA2D(_TestBase): layout, blades, stuff = clifford.conformalize(clifford.Cl(2)[0]) e1 = blades['e1'] e2 = blades['e2'] @pytest.fixture(params=[ layout.scalar, e1, e1^e2, ]) def direction(self, request): return request.param @pytest.fixture(params=[ layout.scalar * 0, 3*e1, ]) def location(self, request): return request.param
for k in range(1, N): Ck = (Decimal(N) / Decimal(k)) * Uk.value[0] adjU = +Uk adjU.value[0] = adjU.value[0] - Ck # adjU = (Uk - Ck) Uk = U * adjU if Uk.value[0] == 0: raise ValueError('Multivector has no inverse') return adjU / Uk.value[0] return shirokov_inverse rng = np.random.default_rng(1) layout, blades = cf.Cl(8, 0, 1) sinv = get_shirokov_inverse(layout) sinv_dec = get_shirokov_inverse_decimal(layout) # for i in range(10): # avalue = rng.standard_normal(layout.gaDims) # a = layout.MultiVector(avalue) # ainv = sinv(a) # print(np.linalg.norm((1 - a * ainv).value)) # # # rng = np.random.default_rng(1) # for i in range(10): # avalue = np.array([Decimal(x) for x in rng.standard_normal(layout.gaDims)], dtype=object) # a = layout.MultiVector(avalue)
import clifford as cf layout, blades = cf.Cl(2) # creates a 2-dimensional clifford algebra e1 = blades['e1'] e2 = blades['e2'] e12 = blades['e12'] (e1^e2) - e12 abs((e1^e2) - e12) 2^e1^e2 - 7^e12 (2^e1^e2) - (7^e12)