Skip to content

Commit 5dc4550

Browse files
committed
Finally get rid of extra_space
1 parent ebde818 commit 5dc4550

File tree

3 files changed

+33
-27
lines changed

3 files changed

+33
-27
lines changed

highs/ipm/hipo/factorhighs/FormatHandler.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,8 +88,6 @@ class FormatHandler {
8888
virtual void extremeEntries() {}
8989
};
9090

91-
const Int64 extra_space_frontal = 1;
92-
9391
} // namespace hipo
9492

9593
#endif

highs/ipm/hipo/factorhighs/HybridHybridFormatHandler.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ void HybridHybridFormatHandler::initFrontal() {
2626
const Int n_blocks = (sn_size_ - 1) / nb_ + 1;
2727
diag_start_.resize(n_blocks);
2828
Int64 frontal_size = getDiagStart(ldf_, sn_size_, nb_, n_blocks, diag_start_);
29-
frontal_size += extra_space_frontal;
3029
frontal_.resize(frontal_size);
3130
std::memset(frontal_.data(), 0, frontal_size * sizeof(double));
3231

highs/ipm/hipo/factorhighs/HybridSolveHandler.cpp

Lines changed: 33 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -80,25 +80,26 @@ void HybridSolveHandler::forwardSolve(std::vector<double>& x) const {
8080
// temporary space for gemv
8181
const Int gemv_space = ldSn - nb * j - jb;
8282
std::vector<double> y(gemv_space);
83-
84-
callAndTime_dgemv('T', jb, gemv_space, 1.0, &sn_columns_[sn][SnCol_ind],
85-
jb, &x[x_start], 1, 0.0, y.data(), 1, data_);
86-
SnCol_ind += jb * gemv_space;
83+
if (gemv_space > 0) {
84+
callAndTime_dgemv('T', jb, gemv_space, 1.0, &sn_columns_[sn][SnCol_ind],
85+
jb, &x[x_start], 1, 0.0, y.data(), 1, data_);
86+
SnCol_ind += jb * gemv_space;
8787
#if HIPO_TIMING_LEVEL >= 2
88-
if (data_) data_->sumTime(kTimeSolveSolve_dense, clock.stop());
88+
if (data_) data_->sumTime(kTimeSolveSolve_dense, clock.stop());
8989
#endif
9090

9191
#if HIPO_TIMING_LEVEL >= 2
92-
clock.start();
92+
clock.start();
9393
#endif
94-
// scatter solution of gemv
95-
for (Int i = 0; i < gemv_space; ++i) {
96-
const Int row = S_.rows(start_row + nb * j + jb + i);
97-
x[row] -= y[i];
98-
}
94+
// scatter solution of gemv
95+
for (Int i = 0; i < gemv_space; ++i) {
96+
const Int row = S_.rows(start_row + nb * j + jb + i);
97+
x[row] -= y[i];
98+
}
9999
#if HIPO_TIMING_LEVEL >= 2
100-
if (data_) data_->sumTime(kTimeSolveSolve_sparse, clock.stop());
100+
if (data_) data_->sumTime(kTimeSolveSolve_sparse, clock.stop());
101101
#endif
102+
}
102103

103104
#ifdef HIPO_PIVOTING
104105
#if HIPO_TIMING_LEVEL >= 2
@@ -145,7 +146,7 @@ void HybridSolveHandler::backwardSolve(std::vector<double>& x) const {
145146

146147
// index to access snColumns[sn]
147148
// initialised with the total number of entries of snColumns[sn]
148-
Int64 SnCol_ind = sn_columns_[sn].size() - extra_space_frontal;
149+
Int64 SnCol_ind = sn_columns_[sn].size();
149150

150151
// go through blocks of columns for this supernode in reverse order
151152
for (Int j = n_blocks - 1; j >= 0; --j) {
@@ -173,26 +174,34 @@ void HybridSolveHandler::backwardSolve(std::vector<double>& x) const {
173174
// temporary space for gemv
174175
const Int gemv_space = ldSn - nb * j - jb;
175176
std::vector<double> y(gemv_space);
177+
if (gemv_space > 0) {
178+
#if HIPO_TIMING_LEVEL >= 2
179+
clock.start();
180+
#endif
181+
// scatter entries into y
182+
for (Int i = 0; i < gemv_space; ++i) {
183+
const Int row = S_.rows(start_row + nb * j + jb + i);
184+
y[i] = x[row];
185+
}
186+
#if HIPO_TIMING_LEVEL >= 2
187+
if (data_) data_->sumTime(kTimeSolveSolve_sparse, clock.stop());
188+
#endif
176189

177190
#if HIPO_TIMING_LEVEL >= 2
178-
clock.start();
191+
clock.start();
179192
#endif
180-
// scatter entries into y
181-
for (Int i = 0; i < gemv_space; ++i) {
182-
const Int row = S_.rows(start_row + nb * j + jb + i);
183-
y[i] = x[row];
184-
}
193+
SnCol_ind -= jb * gemv_space;
194+
callAndTime_dgemv('N', jb, gemv_space, -1.0,
195+
&sn_columns_[sn][SnCol_ind], jb, y.data(), 1, 1.0,
196+
&x[x_start], 1, data_);
185197
#if HIPO_TIMING_LEVEL >= 2
186-
if (data_) data_->sumTime(kTimeSolveSolve_sparse, clock.stop());
198+
if (data_) data_->sumTime(kTimeSolveSolve_dense, clock.stop());
187199
#endif
200+
}
188201

189202
#if HIPO_TIMING_LEVEL >= 2
190203
clock.start();
191204
#endif
192-
SnCol_ind -= jb * gemv_space;
193-
callAndTime_dgemv('N', jb, gemv_space, -1.0, &sn_columns_[sn][SnCol_ind],
194-
jb, y.data(), 1, 1.0, &x[x_start], 1, data_);
195-
196205
SnCol_ind -= diag_entries;
197206
callAndTime_dtrsv('U', 'N', 'U', jb, &sn_columns_[sn][SnCol_ind], jb,
198207
&x[x_start], 1, data_);

0 commit comments

Comments
 (0)