struct Scalar {
// 1
float g0;
};
struct MultiVector {
// 1, e0
vec2 g0;
};
Scalar scalar_zero() {
return Scalar(0.0);
}
Scalar scalar_one() {
return Scalar(1.0);
}
Scalar scalar_neg(Scalar self) {
return Scalar(self.g0 * -1.0);
}
Scalar scalar_automorph(Scalar self) {
return Scalar(self.g0);
}
Scalar scalar_transpose(Scalar self) {
return Scalar(self.g0);
}
Scalar scalar_conjugate(Scalar self) {
return Scalar(self.g0);
}
Scalar scalar_scalar_add(Scalar self, Scalar other) {
return Scalar(self.g0 + other.g0);
}
Scalar scalar_scalar_sub(Scalar self, Scalar other) {
return Scalar(self.g0 - other.g0);
}
Scalar scalar_scalar_geometric_product(Scalar self, Scalar other) {
return Scalar(self.g0 * other.g0);
}
Scalar scalar_scalar_outer_product(Scalar self, Scalar other) {
return Scalar(self.g0 * other.g0);
}
Scalar scalar_scalar_inner_product(Scalar self, Scalar other) {
return Scalar(self.g0 * other.g0);
}
Scalar scalar_scalar_left_contraction(Scalar self, Scalar other) {
return Scalar(self.g0 * other.g0);
}
Scalar scalar_scalar_right_contraction(Scalar self, Scalar other) {
return Scalar(self.g0 * other.g0);
}
Scalar scalar_scalar_scalar_product(Scalar self, Scalar other) {
return Scalar(self.g0 * other.g0);
}
MultiVector scalar_multi_vector_add(Scalar self, MultiVector other) {
return MultiVector(vec2(self.g0) * vec2(1.0, 0.0) + other.g0);
}
MultiVector scalar_multi_vector_sub(Scalar self, MultiVector other) {
return MultiVector(vec2(self.g0) * vec2(1.0, 0.0) - other.g0);
}
MultiVector scalar_multi_vector_geometric_product(Scalar self, MultiVector other) {
return MultiVector(vec2(self.g0) * other.g0);
}
Scalar scalar_multi_vector_regressive_product(Scalar self, MultiVector other) {
return Scalar(self.g0 * other.g0.y);
}
MultiVector scalar_multi_vector_outer_product(Scalar self, MultiVector other) {
return MultiVector(vec2(self.g0) * other.g0);
}
MultiVector scalar_multi_vector_inner_product(Scalar self, MultiVector other) {
return MultiVector(vec2(self.g0) * other.g0);
}
MultiVector scalar_multi_vector_left_contraction(Scalar self, MultiVector other) {
return MultiVector(vec2(self.g0) * other.g0);
}
Scalar scalar_multi_vector_right_contraction(Scalar self, MultiVector other) {
return Scalar(self.g0 * other.g0.x);
}
Scalar scalar_multi_vector_scalar_product(Scalar self, MultiVector other) {
return Scalar(self.g0 * other.g0.x);
}
Scalar scalar_squared_magnitude(Scalar self) {
return scalar_scalar_scalar_product(self, scalar_conjugate(self));
}
Scalar scalar_magnitude(Scalar self) {
return Scalar(sqrt(scalar_squared_magnitude(self).g0));
}
Scalar scalar_signum(Scalar self) {
return scalar_scalar_geometric_product(self, Scalar(1.0 / scalar_magnitude(self).g0));
}
Scalar scalar_inverse(Scalar self) {
return scalar_scalar_geometric_product(scalar_conjugate(self), Scalar(1.0 / scalar_squared_magnitude(self).g0));
}
MultiVector multi_vector_zero() {
return MultiVector(vec2(0.0));
}
MultiVector multi_vector_one() {
return MultiVector(vec2(1.0, 0.0));
}
MultiVector multi_vector_neg(MultiVector self) {
return MultiVector(self.g0 * vec2(-1.0));
}
MultiVector multi_vector_automorph(MultiVector self) {
return MultiVector(self.g0 * vec2(1.0, -1.0));
}
MultiVector multi_vector_transpose(MultiVector self) {
return MultiVector(self.g0);
}
MultiVector multi_vector_conjugate(MultiVector self) {
return MultiVector(self.g0 * vec2(1.0, -1.0));
}
MultiVector multi_vector_dual(MultiVector self) {
return MultiVector(self.g0.yx);
}
Scalar multi_vector_scalar_into(MultiVector self) {
return Scalar(self.g0.x);
}
MultiVector multi_vector_scalar_add(MultiVector self, Scalar other) {
return MultiVector(self.g0 + vec2(other.g0) * vec2(1.0, 0.0));
}
MultiVector multi_vector_scalar_sub(MultiVector self, Scalar other) {
return MultiVector(self.g0 - vec2(other.g0) * vec2(1.0, 0.0));
}
MultiVector multi_vector_scalar_geometric_product(MultiVector self, Scalar other) {
return MultiVector(self.g0 * vec2(other.g0));
}
Scalar multi_vector_scalar_regressive_product(MultiVector self, Scalar other) {
return Scalar(self.g0.y * other.g0);
}
MultiVector multi_vector_scalar_outer_product(MultiVector self, Scalar other) {
return MultiVector(self.g0 * vec2(other.g0));
}
MultiVector multi_vector_scalar_inner_product(MultiVector self, Scalar other) {
return MultiVector(self.g0 * vec2(other.g0));
}
Scalar multi_vector_scalar_left_contraction(MultiVector self, Scalar other) {
return Scalar(self.g0.x * other.g0);
}
MultiVector multi_vector_scalar_right_contraction(MultiVector self, Scalar other) {
return MultiVector(self.g0 * vec2(other.g0));
}
Scalar multi_vector_scalar_scalar_product(MultiVector self, Scalar other) {
return Scalar(self.g0.x * other.g0);
}
MultiVector multi_vector_multi_vector_add(MultiVector self, MultiVector other) {
return MultiVector(self.g0 + other.g0);
}
MultiVector multi_vector_multi_vector_sub(MultiVector self, MultiVector other) {
return MultiVector(self.g0 - other.g0);
}
MultiVector multi_vector_multi_vector_geometric_product(MultiVector self, MultiVector other) {
return MultiVector(vec2(self.g0.x) * other.g0 + vec2(self.g0.y) * other.g0.yx * vec2(-1.0, 1.0));
}
MultiVector multi_vector_multi_vector_regressive_product(MultiVector self, MultiVector other) {
return MultiVector(vec2(self.g0.y) * other.g0 + vec2(self.g0.x) * other.g0.yx * vec2(1.0, 0.0));
}
MultiVector multi_vector_multi_vector_outer_product(MultiVector self, MultiVector other) {
return MultiVector(vec2(self.g0.x) * other.g0 + self.g0 * vec2(other.g0.x) * vec2(0.0, 1.0));
}
MultiVector multi_vector_multi_vector_inner_product(MultiVector self, MultiVector other) {
return MultiVector(vec2(self.g0.x) * other.g0 + vec2(self.g0.y) * other.g0.yx * vec2(-1.0, 1.0));
}
MultiVector multi_vector_multi_vector_left_contraction(MultiVector self, MultiVector other) {
return MultiVector(vec2(self.g0.x) * other.g0 + vec2(self.g0.y) * vec2(other.g0.y) * vec2(-1.0, 0.0));
}
MultiVector multi_vector_multi_vector_right_contraction(MultiVector self, MultiVector other) {
return MultiVector(vec2(self.g0.y) * other.g0.yx * vec2(-1.0, 1.0) + vec2(self.g0.x) * vec2(other.g0.x) * vec2(1.0, 0.0));
}
Scalar multi_vector_multi_vector_scalar_product(MultiVector self, MultiVector other) {
return Scalar(self.g0.x * other.g0.x - self.g0.y * other.g0.y);
}
Scalar multi_vector_squared_magnitude(MultiVector self) {
return multi_vector_multi_vector_scalar_product(self, multi_vector_conjugate(self));
}
Scalar multi_vector_magnitude(MultiVector self) {
return Scalar(sqrt(multi_vector_squared_magnitude(self).g0));
}
MultiVector multi_vector_signum(MultiVector self) {
return multi_vector_scalar_geometric_product(self, Scalar(1.0 / multi_vector_magnitude(self).g0));
}
MultiVector multi_vector_inverse(MultiVector self) {
return multi_vector_scalar_geometric_product(multi_vector_conjugate(self), Scalar(1.0 / multi_vector_squared_magnitude(self).g0));
}
MultiVector scalar_multi_vector_mul(Scalar self, MultiVector other) {
return scalar_multi_vector_geometric_product(self, other);
}
MultiVector scalar_multi_vector_div(Scalar self, MultiVector other) {
return scalar_multi_vector_geometric_product(self, multi_vector_inverse(other));
}
MultiVector scalar_multi_vector_reflection(Scalar self, MultiVector other) {
return multi_vector_scalar_geometric_product(scalar_multi_vector_geometric_product(self, other), self);
}
MultiVector scalar_multi_vector_transformation(Scalar self, MultiVector other) {
return multi_vector_scalar_geometric_product(scalar_multi_vector_geometric_product(self, other), scalar_conjugate(self));
}
Scalar scalar_scalar_mul(Scalar self, Scalar other) {
return scalar_scalar_geometric_product(self, other);
}
Scalar scalar_powi(Scalar self, int exponent) {
if(exponent == 0) {
return scalar_one();
}
Scalar x = (exponent < 0) ? scalar_inverse(self) : self;
Scalar y = scalar_one();
int n = abs(exponent);
while(1 < n) {
if((n & 1) == 1) {
y = scalar_scalar_geometric_product(x, y);
}
x = scalar_scalar_geometric_product(x, x);
n = n >> 1;
}
return scalar_scalar_geometric_product(x, y);
}
Scalar scalar_scalar_div(Scalar self, Scalar other) {
return scalar_scalar_geometric_product(self, scalar_inverse(other));
}
Scalar scalar_scalar_reflection(Scalar self, Scalar other) {
return scalar_scalar_geometric_product(scalar_scalar_geometric_product(self, other), self);
}
Scalar scalar_scalar_transformation(Scalar self, Scalar other) {
return scalar_scalar_geometric_product(scalar_scalar_geometric_product(self, other), scalar_conjugate(self));
}
MultiVector multi_vector_multi_vector_mul(MultiVector self, MultiVector other) {
return multi_vector_multi_vector_geometric_product(self, other);
}
MultiVector multi_vector_powi(MultiVector self, int exponent) {
if(exponent == 0) {
return multi_vector_one();
}
MultiVector x = (exponent < 0) ? multi_vector_inverse(self) : self;
MultiVector y = multi_vector_one();
int n = abs(exponent);
while(1 < n) {
if((n & 1) == 1) {
y = multi_vector_multi_vector_geometric_product(x, y);
}
x = multi_vector_multi_vector_geometric_product(x, x);
n = n >> 1;
}
return multi_vector_multi_vector_geometric_product(x, y);
}
MultiVector multi_vector_multi_vector_div(MultiVector self, MultiVector other) {
return multi_vector_multi_vector_geometric_product(self, multi_vector_inverse(other));
}
MultiVector multi_vector_multi_vector_reflection(MultiVector self, MultiVector other) {
return multi_vector_multi_vector_geometric_product(multi_vector_multi_vector_geometric_product(self, other), self);
}
MultiVector multi_vector_multi_vector_transformation(MultiVector self, MultiVector other) {
return multi_vector_multi_vector_geometric_product(multi_vector_multi_vector_geometric_product(self, other), multi_vector_conjugate(self));
}
MultiVector multi_vector_scalar_mul(MultiVector self, Scalar other) {
return multi_vector_scalar_geometric_product(self, other);
}
MultiVector multi_vector_scalar_div(MultiVector self, Scalar other) {
return multi_vector_scalar_geometric_product(self, scalar_inverse(other));
}
Scalar multi_vector_scalar_reflection(MultiVector self, Scalar other) {
return multi_vector_scalar_into(multi_vector_multi_vector_geometric_product(multi_vector_scalar_geometric_product(self, other), self));
}
Scalar multi_vector_scalar_transformation(MultiVector self, Scalar other) {
return multi_vector_scalar_into(multi_vector_multi_vector_geometric_product(multi_vector_scalar_geometric_product(self, other), multi_vector_conjugate(self)));
}