#ifndef UTIL_FACTORTIMER_H_
#define UTIL_FACTORTIMER_H_
#include "HConfig.h"
#include "lp_data/HighsAnalysis.h"
#include "util/HighsTimer.h"
enum iClockFactor {
FactorInvert = 0, FactorInvertSimple, FactorInvertKernel, FactorInvertDeficient, FactorInvertFinish, FactorFtran, FactorFtranLower, FactorFtranLowerAPF, FactorFtranLowerDse, FactorFtranLowerSps, FactorFtranLowerHyper, FactorFtranUpper, FactorFtranUpperFT, FactorFtranUpperMPF, FactorFtranUpperDse, FactorFtranUpperSps0, FactorFtranUpperSps1, FactorFtranUpperSps2, FactorFtranUpperHyper0, FactorFtranUpperHyper1, FactorFtranUpperHyper2, FactorFtranUpperHyper3, FactorFtranUpperHyper4, FactorFtranUpperHyper5, FactorFtranUpperPF, FactorBtran, FactorBtranLower, FactorBtranLowerDse, FactorBtranLowerSps, FactorBtranLowerHyper, FactorBtranLowerAPF, FactorBtranUpper, FactorBtranUpperPF, FactorBtranUpperDse, FactorBtranUpperSps, FactorBtranUpperHyper, FactorBtranUpperFT, FactorBtranUpperMPF, FactorReinvert, FactorNumClock };
class FactorTimer {
public:
void start(const HighsInt factor_clock,
HighsTimerClock* factor_timer_clock_pointer) {
if (factor_timer_clock_pointer != NULL)
factor_timer_clock_pointer->timer_pointer_->start(
factor_timer_clock_pointer->clock_[factor_clock]);
};
void stop(const HighsInt factor_clock,
HighsTimerClock* factor_timer_clock_pointer) {
if (factor_timer_clock_pointer != NULL)
factor_timer_clock_pointer->timer_pointer_->stop(
factor_timer_clock_pointer->clock_[factor_clock]);
};
double read(const HighsInt factor_clock,
HighsTimerClock* factor_timer_clock_pointer) {
double argument = 0;
if (factor_timer_clock_pointer != NULL)
argument = factor_timer_clock_pointer->timer_pointer_->read(
factor_timer_clock_pointer->clock_[factor_clock]);
return argument;
};
void initialiseFactorClocks(HighsTimerClock& factor_timer_clock) {
HighsTimer* timer_pointer = factor_timer_clock.timer_pointer_;
std::vector<HighsInt>& clock = factor_timer_clock.clock_;
clock.resize(FactorNumClock);
clock[FactorInvert] = timer_pointer->clock_def("INVERT");
clock[FactorInvertSimple] = timer_pointer->clock_def("INVERT Simple");
clock[FactorInvertKernel] = timer_pointer->clock_def("INVERT Kernel");
clock[FactorInvertDeficient] = timer_pointer->clock_def("INVERT Deficient");
clock[FactorInvertFinish] = timer_pointer->clock_def("INVERT Finish");
clock[FactorFtran] = timer_pointer->clock_def("FTRAN");
clock[FactorFtranLower] = timer_pointer->clock_def("FTRAN Lower");
clock[FactorFtranLowerAPF] = timer_pointer->clock_def("FTRAN Lower APF");
clock[FactorFtranLowerDse] = timer_pointer->clock_def("FTRAN Lower Dse");
clock[FactorFtranLowerSps] = timer_pointer->clock_def("FTRAN Lower Sps");
clock[FactorFtranLowerHyper] =
timer_pointer->clock_def("FTRAN Lower Hyper");
clock[FactorFtranUpper] = timer_pointer->clock_def("FTRAN Upper");
clock[FactorFtranUpperFT] = timer_pointer->clock_def("FTRAN Upper FT");
clock[FactorFtranUpperMPF] = timer_pointer->clock_def("FTRAN Upper MPF");
clock[FactorFtranUpperDse] = timer_pointer->clock_def("FTRAN Upper Dse");
clock[FactorFtranUpperSps0] = timer_pointer->clock_def("FTRAN Upper Sps0");
clock[FactorFtranUpperSps1] = timer_pointer->clock_def("FTRAN Upper Sps1");
clock[FactorFtranUpperSps2] = timer_pointer->clock_def("FTRAN Upper Sps2");
clock[FactorFtranUpperHyper0] =
timer_pointer->clock_def("FTRAN Upper Hyper0");
clock[FactorFtranUpperHyper1] =
timer_pointer->clock_def("FTRAN Upper Hyper1");
clock[FactorFtranUpperHyper2] =
timer_pointer->clock_def("FTRAN Upper Hyper2");
clock[FactorFtranUpperHyper3] =
timer_pointer->clock_def("FTRAN Upper Hyper3");
clock[FactorFtranUpperHyper4] =
timer_pointer->clock_def("FTRAN Upper Hyper4");
clock[FactorFtranUpperHyper5] =
timer_pointer->clock_def("FTRAN Upper Hyper5");
clock[FactorFtranUpperPF] = timer_pointer->clock_def("FTRAN Upper PF");
clock[FactorBtran] = timer_pointer->clock_def("BTRAN");
clock[FactorBtranLower] = timer_pointer->clock_def("BTRAN Lower");
clock[FactorBtranLowerDse] = timer_pointer->clock_def("BTRAN Lower Dse");
clock[FactorBtranLowerSps] = timer_pointer->clock_def("BTRAN Lower Sps");
clock[FactorBtranLowerHyper] =
timer_pointer->clock_def("BTRAN Lower Hyper");
clock[FactorBtranLowerAPF] = timer_pointer->clock_def("BTRAN Lower APF");
clock[FactorBtranUpper] = timer_pointer->clock_def("BTRAN Upper");
clock[FactorBtranUpperPF] = timer_pointer->clock_def("BTRAN Upper PF");
clock[FactorBtranUpperDse] = timer_pointer->clock_def("BTRAN Upper Dse");
clock[FactorBtranUpperSps] = timer_pointer->clock_def("BTRAN Upper Sps");
clock[FactorBtranUpperHyper] =
timer_pointer->clock_def("BTRAN Upper Hyper");
clock[FactorBtranUpperFT] = timer_pointer->clock_def("BTRAN Upper FT");
clock[FactorBtranUpperMPF] = timer_pointer->clock_def("BTRAN Upper MPS");
clock[FactorReinvert] = timer_pointer->clock_def("ReINVERT");
};
void reportFactorClockList(const char* grepStamp,
HighsTimerClock& factor_timer_clock,
std::vector<HighsInt> factor_clock_list) {
HighsTimer* timer_pointer = factor_timer_clock.timer_pointer_;
std::vector<HighsInt>& clock = factor_timer_clock.clock_;
HighsInt factor_clock_list_size = factor_clock_list.size();
std::vector<HighsInt> clockList;
clockList.resize(factor_clock_list_size);
for (HighsInt en = 0; en < factor_clock_list_size; en++) {
clockList[en] = clock[factor_clock_list[en]];
}
double ideal_sum_time = 0;
ideal_sum_time += timer_pointer->read(clock[FactorInvert]);
ideal_sum_time += timer_pointer->read(clock[FactorFtran]);
ideal_sum_time += timer_pointer->read(clock[FactorBtran]);
timer_pointer->reportOnTolerance(grepStamp, clockList, ideal_sum_time,
1e-8);
};
void reportFactorLevel0Clock(HighsTimerClock& factor_timer_clock) {
std::vector<HighsInt> factor_clock_list{FactorInvert, FactorReinvert,
FactorFtran, FactorBtran};
reportFactorClockList("FactorLevel0", factor_timer_clock,
factor_clock_list);
};
void reportFactorLevel1Clock(HighsTimerClock& factor_timer_clock) {
std::vector<HighsInt> factor_clock_list{
FactorInvertSimple, FactorInvertKernel, FactorInvertDeficient,
FactorInvertFinish, FactorFtranLower, FactorFtranUpper,
FactorBtranLower, FactorBtranUpper};
reportFactorClockList("FactorLevel1", factor_timer_clock,
factor_clock_list);
};
void reportFactorLevel2Clock(HighsTimerClock& factor_timer_clock) {
std::vector<HighsInt> factor_clock_list{
FactorInvertSimple, FactorInvertKernel, FactorInvertDeficient,
FactorInvertFinish, FactorFtranLowerAPF, FactorFtranLowerDse,
FactorFtranLowerSps, FactorFtranLowerHyper, FactorFtranUpperFT,
FactorFtranUpperMPF, FactorFtranUpperDse, FactorFtranUpperSps0,
FactorFtranUpperSps1, FactorFtranUpperSps2, FactorFtranUpperHyper0,
FactorFtranUpperHyper1, FactorFtranUpperHyper2, FactorFtranUpperHyper3,
FactorFtranUpperHyper4, FactorFtranUpperHyper5, FactorFtranUpperPF,
FactorBtranLowerDse, FactorBtranLowerSps, FactorBtranLowerHyper,
FactorBtranLowerAPF, FactorBtranUpperPF, FactorBtranUpperDse,
FactorBtranUpperSps, FactorBtranUpperHyper, FactorBtranUpperFT,
FactorBtranUpperMPF};
reportFactorClockList("FactorLevel2", factor_timer_clock,
factor_clock_list);
};
void reportFactorClock(HighsTimerClock& factor_timer_clock) {
reportFactorLevel0Clock(factor_timer_clock);
reportFactorLevel1Clock(factor_timer_clock);
reportFactorLevel2Clock(factor_timer_clock);
}
};
#endif