1 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2 /* */
3 /* This file is part of the class library */
4 /* SoPlex --- the Sequential object-oriented simPlex. */
5 /* */
6 /* Copyright (C) 1996-2022 Konrad-Zuse-Zentrum */
7 /* fuer Informationstechnik Berlin */
8 /* */
9 /* SoPlex is distributed under the terms of the ZIB Academic Licence. */
10 /* */
11 /* You should have received a copy of the ZIB Academic License */
12 /* along with SoPlex; see the file COPYING. If not email to soplex@zib.de. */
13 /* */
14 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
15
16 #include <iostream>
17
18 #include "soplex/spxdefines.h"
(1) Event include_recursion: |
#include file "/sapmnt/home1/d029903/my_work/SCIPSoPlex_coverity/scipoptsuite-8.0.1/soplex/src/soplex/spxhybridpr.h" includes itself: spxhybridpr.h -> spxhybridpr.hpp -> spxhybridpr.h |
(2) Event caretline: |
^ |
19 #include "soplex/spxhybridpr.h"
20 #include "soplex/spxout.h"
21
22 namespace soplex
23 {
24 template <class R>
25 bool SPxHybridPR<R>::isConsistent() const
26 {
27 #ifdef ENABLE_CONSISTENCY_CHECKS
28
29 if(this->thesolver != 0 &&
30 (this->thesolver != steep.solver() ||
31 this->thesolver != devex.solver() ||
32 this->thesolver != parmult.solver()))
33 return MSGinconsistent("SPxHybridPR");
34
35 return steep.isConsistent()
36 && devex.isConsistent()
37 && parmult.isConsistent();
38 #else
39 return true;
40 #endif
41 }
42
43 template <class R>
44 void SPxHybridPR<R>::load(SPxSolverBase<R>* p_solver)
45 {
46 steep.load(p_solver);
47 devex.load(p_solver);
48 parmult.load(p_solver);
49 this->thesolver = p_solver;
50 setType(p_solver->type());
51 }
52
53 template <class R>
54 void SPxHybridPR<R>::clear()
55 {
56 steep.clear();
57 devex.clear();
58 parmult.clear();
59 this->thesolver = 0;
60 }
61
62 template <class R>
63 void SPxHybridPR<R>::setEpsilon(R eps)
64 {
65 steep.setEpsilon(eps);
66 devex.setEpsilon(eps);
67 parmult.setEpsilon(eps);
68 }
69
70 template <class R>
71 void SPxHybridPR<R>::setType(typename SPxSolverBase<R>::Type tp)
72 {
73 if(tp == SPxSolverBase<R>::LEAVE)
74 {
75 thepricer = &steep;
76 this->thesolver->setPricing(SPxSolverBase<R>::FULL);
77 }
78 else
79 {
80 if(this->thesolver->dim() > hybridFactor * this->thesolver->coDim())
81 {
82 /**@todo I changed from devex to steepest edge pricing here
83 * because of numerical difficulties, this should be
84 * investigated.
85 */
86 // thepricer = &devex;
87 thepricer = &steep;
88 this->thesolver->setPricing(SPxSolverBase<R>::FULL);
89 }
90 else
91 {
92 thepricer = &parmult;
93 this->thesolver->setPricing(SPxSolverBase<R>::PARTIAL);
94 }
95 }
96
97 MSG_INFO1((*this->thesolver->spxout), (*this->thesolver->spxout) << "IPRHYB01 switching to "
98 << thepricer->getName() << std::endl;)
99
100 thepricer->setType(tp);
101 }
102
103 template <class R>
104 void SPxHybridPR<R>::setRep(typename SPxSolverBase<R>::Representation rep)
105 {
106 steep.setRep(rep);
107 devex.setRep(rep);
108 parmult.setRep(rep);
109 }
110
111 template <class R>
112 int SPxHybridPR<R>::selectLeave()
113 {
114 return thepricer->selectLeave();
115 }
116
117 template <class R>
118 void SPxHybridPR<R>::left4(int n, SPxId id)
119 {
120 thepricer->left4(n, id);
121 }
122
123 template <class R>
124 SPxId SPxHybridPR<R>::selectEnter()
125 {
126 return thepricer->selectEnter();
127 }
128
129 template <class R>
130 void SPxHybridPR<R>::entered4(SPxId id, int n)
131 {
132 thepricer->entered4(id, n);
133 }
134
135 template <class R>
136 void SPxHybridPR<R>::addedVecs(int n)
137 {
138 steep.addedVecs(n);
139 devex.addedVecs(n);
140 parmult.addedVecs(n);
141 }
142
143 template <class R>
144 void SPxHybridPR<R>::addedCoVecs(int n)
145 {
146 steep.addedCoVecs(n);
147 devex.addedCoVecs(n);
148 parmult.addedCoVecs(n);
149 }
150
151 } // namespace soplex
152