Learning Concepts in C++ Part 5: Vector Spaces
link to repository https://github.com/jgsuw/math_concepts_cxx
On the path to \(\text{SE}(3)\)
This entry is part 5 of an ongoing series cataloging my experiments with the Concepts and Contraints on templates in C++20. In part 1, I set a goal of creating a template library for the Special Euclidean Group \(\text{SE}(3)\) and its Lie Algebra \(\text{se}(3)\) by building a hierarchy of mathetmatical abstractions using constrained template concepts.
In my last post I implemented a Field
concept which built upon a Groups
which provides an abstraction for the algebra of rational numbers \(\mathbb{Q}\), reals numbers \(\mathbb{R}\), complex numbers \(\mathbb{C}\) among others. The field concept is an essential requirement for the topic of this post, Vector Spaces.
Vector Space Axioms
Keeping the approach from previous posts, I set out to create a VectorSpace
concept which encodes the axioms of a Vector Space as constraints on a template class. When I was an undergraduate student learning Linear Algebra, I was taught a definition of Vector Spaces that used 8 axioms. Fortunately, half of these axioms are already subsumed by the AbelianGroup
concept defined in part 3.
A Vector Space over a field \(\mathcal{F}\) is a set \(V\) with operations \((+_V,\cdot)\) called vector addition and scalar multiplication which satisfies
- \((V,+_V)\) is an Abelian Group
- \(\cdot: \mathcal{F} \times V \to V\), \((\alpha, x) \mapsto \alpha x\) satisfies: – \(1\), the identity of multiplication on \(\mathcal{F}\), fixes $\cdot$ to the identity function: \(\forall x \in V : 1\cdot x = x\) – scalar multiplication distributes through \(+_V\), i.e. \(\forall \alpha \in \mathcal{F}, x,y \in V : \alpha \cdot (x +_V y) = \alpha \cdot x +_V \alpha \cdot y\) – scalar multiplication distributes through \(+_\mathcal{F}\) i.e. \(\forall \alpha, \beta \in \mathcal{F}, x \in V : (\alpha +_\mathcal{F} \beta) \cdot x = \alpha \cdot x +_V \beta \cdot x\)
here I have used subscripts on addition to distinguish addition on the field \(+_\mathcal{F}\) with addition on the Vector Space \(+_V\). As we have seen several times before, these axioms involve the universal and existential quantifiers \(\forall, \exists\) which in English say “for all … there exists”. What follows these quantifications are predicates that vary over the set being quantified.
In this way, we may view the second axiom about the identity property of scalar multiplication as
\(\forall x \in V : P(x)\), where \(P(x) \iff 1 \cdot x = x\).
Remark on The Limitations of Concepts
It bears repeating that while the compiler is capable of evaluating \(P(x)\) for any constant expression \(x\) (i.e. where \(x\) refers to a compile time constant), it certainly cannot check the quantified predicate \(\forall x \in V : P(x)\) in general, because this would require enumerating every \(x \in V\) as a compile time constant. To drive this point home, the Lie Algebra \(\text{se}(3)\) is a vector space over the reals, which is an uncoutably infinite set.
Nevertheless, I will proceed in a similar fashion to previous posts, and encode the unqantified predicates of the above axioms into the Vector Space concept. This exercise is not just pedagogical; if done thoughtfully, encoding the unquantified predicates also documents the mathematical equivalent of the concept and provides a way to test the validity of the concept on a set of test data at compile time.
Vector Space Concept Definition
Here I implement a concept VectorSpace
which evaluates a template class VecSp
that represents a vector space over a field VecSp::F
, with vectors belonging to the (point) set VecSp::V
, and that has an addition operator VecSp::Add
and scalar multiplication operator VecSp::Mul
.
I have also introduced a new concept, MapsTo<Op,Domain,Target>
, which is a convenenience concept that checks that Domain
and Target
agree with Op::Domain
and Op::Target
. At this point some might say these concepts are a bit overlong. Myself is not wholly satisfied by the lengthy definition of VectorSpace
, despite its reuse of two key concepts Field
and AbelianGroup
I had previously defined. However, compare the above definition with the Wikipedia definition of vector space:
Comparing the length of the wikipedia definition with the C++ concept definition, I think its fair to say I haven’t done too bad.
Euclidean Space Template
The most common and arguably the canonical vectorspace is (\(n\)-dimensional) Euclidean Space, often simply reffered to as \(\mathbb{R}^n\). For this reason I chose to use \(\mathbb{R}^n\) as an example template that satisfies the VectorSpace
concept. For the field \(\mathbb{R}\) I used the RealNumberField
template from part 4. For the set of vectors \(V\), I created a template using the Vector
template from Eigen
:
With these templates, the Euclidean Space template is so defined