Skip to content

Commit 65e1680

Browse files
committed
Use virtual functions for vec_base
1 parent dd69e90 commit 65e1680

File tree

1 file changed

+9
-11
lines changed

1 file changed

+9
-11
lines changed

cp-algo/linalg/vector.hpp

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -43,16 +43,16 @@ namespace cp_algo::linalg {
4343
return res;
4444
}
4545

46-
void add_scaled(vec const& b, base scale, size_t i = 0) {
46+
virtual void add_scaled(vec const& b, base scale, size_t i = 0) {
4747
assert(false);
4848
for(; i < size(*this); i++) {
4949
(*this)[i] += scale * b[i];
5050
}
5151
}
52-
auto& normalize() {
53-
return *this;
52+
virtual vec& normalize() {
53+
return *static_cast<vec*>(this);
5454
}
55-
auto& normalize(size_t i) {
55+
virtual base& normalize(size_t i) {
5656
return (*this)[i];
5757
}
5858
void read() {
@@ -80,10 +80,9 @@ namespace cp_algo::linalg {
8080
// Generally, vec shouldn't be modified
8181
// after it's pivot index is set
8282
std::pair<size_t, base> find_pivot() {
83-
auto true_this = static_cast<vec*>(this);
8483
if(pivot == size_t(-1)) {
8584
pivot = 0;
86-
while(pivot < size(*this) && true_this->normalize(pivot) == base(0)) {
85+
while(pivot < size(*this) && normalize(pivot) == base(0)) {
8786
pivot++;
8887
}
8988
if(pivot < size(*this)) {
@@ -93,10 +92,9 @@ namespace cp_algo::linalg {
9392
return {pivot, pivot_inv};
9493
}
9594
void reduce_by(vec &t) {
96-
auto true_this = static_cast<vec*>(this);
9795
auto [pivot, pinv] = t.find_pivot();
9896
if(pivot < size(*this)) {
99-
true_this->add_scaled(t, -true_this->normalize(pivot) * pinv, pivot);
97+
add_scaled(t, -normalize(pivot) * pinv, pivot);
10098
}
10199
}
102100
private:
@@ -117,7 +115,7 @@ namespace cp_algo::linalg {
117115
using Base = vec_base<vec<base>, base>;
118116
using Base::Base;
119117

120-
void add_scaled(vec const& b, base scale, size_t i = 0) {
118+
void add_scaled(vec const& b, base scale, size_t i = 0) override {
121119
for(; i < size(*this); i++) {
122120
(*this)[i].add_unsafe(scale.r * b[i].r);
123121
}
@@ -128,13 +126,13 @@ namespace cp_algo::linalg {
128126
counter = 0;
129127
}
130128
}
131-
auto& normalize() {
129+
vec& normalize() override {
132130
for(auto &it: *this) {
133131
it.normalize();
134132
}
135133
return *this;
136134
}
137-
auto& normalize(size_t i) {
135+
base& normalize(size_t i) override {
138136
return (*this)[i].normalize();
139137
}
140138
private:

0 commit comments

Comments
 (0)