Example #1
0
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)
Example #2
0
    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)
Example #3
0
 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)
Example #4
0
 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)
Example #5
0
    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)
Example #6
0
 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)
Example #7
0
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)
Example #9
0
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)