@@ -43,16 +43,16 @@ namespace cp_algo::linalg {
43
43
return res;
44
44
}
45
45
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 ) {
47
47
assert (false );
48
48
for (; i < size (*this ); i++) {
49
49
(*this )[i] += scale * b[i];
50
50
}
51
51
}
52
- auto & normalize () {
53
- return *this ;
52
+ virtual vec & normalize () {
53
+ return *static_cast <vec*>( this ) ;
54
54
}
55
- auto & normalize (size_t i) {
55
+ virtual base & normalize (size_t i) {
56
56
return (*this )[i];
57
57
}
58
58
void read () {
@@ -80,10 +80,9 @@ namespace cp_algo::linalg {
80
80
// Generally, vec shouldn't be modified
81
81
// after it's pivot index is set
82
82
std::pair<size_t , base> find_pivot () {
83
- auto true_this = static_cast <vec*>(this );
84
83
if (pivot == size_t (-1 )) {
85
84
pivot = 0 ;
86
- while (pivot < size (*this ) && true_this-> normalize (pivot) == base (0 )) {
85
+ while (pivot < size (*this ) && normalize (pivot) == base (0 )) {
87
86
pivot++;
88
87
}
89
88
if (pivot < size (*this )) {
@@ -93,10 +92,9 @@ namespace cp_algo::linalg {
93
92
return {pivot, pivot_inv};
94
93
}
95
94
void reduce_by (vec &t) {
96
- auto true_this = static_cast <vec*>(this );
97
95
auto [pivot, pinv] = t.find_pivot ();
98
96
if (pivot < size (*this )) {
99
- true_this-> add_scaled (t, -true_this-> normalize (pivot) * pinv, pivot);
97
+ add_scaled (t, -normalize (pivot) * pinv, pivot);
100
98
}
101
99
}
102
100
private:
@@ -117,7 +115,7 @@ namespace cp_algo::linalg {
117
115
using Base = vec_base<vec<base>, base>;
118
116
using Base::Base;
119
117
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 {
121
119
for (; i < size (*this ); i++) {
122
120
(*this )[i].add_unsafe (scale.r * b[i].r );
123
121
}
@@ -128,13 +126,13 @@ namespace cp_algo::linalg {
128
126
counter = 0 ;
129
127
}
130
128
}
131
- auto & normalize () {
129
+ vec & normalize () override {
132
130
for (auto &it: *this ) {
133
131
it.normalize ();
134
132
}
135
133
return *this ;
136
134
}
137
- auto & normalize (size_t i) {
135
+ base & normalize (size_t i) override {
138
136
return (*this )[i].normalize ();
139
137
}
140
138
private:
0 commit comments