/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /* */ /* This file is part of the HiGHS linear optimization suite */ /* */ /* Written and engineered 2008-2022 at the University of Edinburgh */ /* */ /* Available as open-source under the MIT License */ /* */ /* Authors: Julian Hall, Ivet Galabova, Leona Gottwald and Michael */ /* Feldmeier */ /* */ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /**@file test/DevKkt.h * @brief */ #ifndef TEST_DEV_KKT_H_ #define TEST_DEV_KKT_H_ #include #include #include "lp_data/HConst.h" namespace presolve { namespace dev_kkt_check { struct State { State( const HighsInt numCol_, const HighsInt numRow_, const std::vector& Astart_, const std::vector& Aend_, const std::vector& Aindex_, const std::vector& Avalue_, const std::vector& ARstart_, const std::vector& ARindex_, const std::vector& ARvalue_, const std::vector& colCost_, const std::vector& colLower_, const std::vector& colUpper_, const std::vector& rowLower_, const std::vector& rowUpper_, const std::vector& flagCol_, const std::vector& flagRow_, const std::vector& colValue_, const std::vector& colDual_, const std::vector& rowValue_, const std::vector& rowDual_, const std::vector& col_status_, const std::vector& row_status_) : numCol(numCol_), numRow(numRow_), Astart(Astart_), Aend(Aend_), Aindex(Aindex_), Avalue(Avalue_), ARstart(ARstart_), ARindex(ARindex_), ARvalue(ARvalue_), colCost(colCost_), colLower(colLower_), colUpper(colUpper_), rowLower(rowLower_), rowUpper(rowUpper_), flagCol(flagCol_), flagRow(flagRow_), colValue(colValue_), colDual(colDual_), rowValue(rowValue_), rowDual(rowDual_), col_status(col_status_), row_status(row_status_) {} const HighsInt numCol; const HighsInt numRow; const std::vector& Astart; const std::vector& Aend; const std::vector& Aindex; const std::vector& Avalue; const std::vector& ARstart; const std::vector& ARindex; const std::vector& ARvalue; const std::vector& colCost; const std::vector& colLower; const std::vector& colUpper; const std::vector& rowLower; const std::vector& rowUpper; const std::vector& flagCol; const std::vector& flagRow; // solution const std::vector& colValue; const std::vector& colDual; const std::vector& rowValue; const std::vector& rowDual; // basis const std::vector& col_status; const std::vector& row_status; }; enum class KktCondition { kColBounds, kPrimalFeasibility, kDualFeasibility, kComplementarySlackness, kStationarityOfLagrangian, kBasicFeasibleSolution, kUnset, }; struct KktConditionDetails { KktConditionDetails() {} KktConditionDetails(KktCondition type_) : type(type_) {} KktCondition type = KktCondition::kUnset; double max_violation = 0.0; double sum_violation_2 = 0.0; HighsInt checked = 0; HighsInt violated = 0; }; struct KktInfo { std::map rules; bool pass_col_bounds = false; bool pass_primal_feas_matrix = false; bool pass_dual_feas = false; bool pass_st_of_L = false; bool pass_comp_slackness = false; bool pass_bfs = false; }; KktInfo initInfo(); bool checkKkt(const State& state, KktInfo& info); void checkPrimalBounds(const State& state, KktConditionDetails& details); void checkPrimalFeasMatrix(const State& state, KktConditionDetails& details); void checkDualFeasibility(const State& state, KktConditionDetails& details); void checkComplementarySlackness(const State& state, KktConditionDetails& details); void checkStationarityOfLagrangian(const State& state, KktConditionDetails& details); void checkBasicFeasibleSolution(const State& state, KktConditionDetails& details); } // namespace dev_kkt_check } // namespace presolve #endif /* TEST_KKTCHSTEP_H_ */