4 #include <boost/pool/object_pool.hpp>
5 #include <boost/bind.hpp>
7 #ifndef SURF_SOLVER_HPP_
8 #define SURF_SOLVER_HPP_
11 /*static void double_update(double *variable, double value)
14 if (*variable < MAXMIN_PRECISION)
21 class ConstraintLight;
26 bool operator()( const Element & a, const Element & b )
27 { return true; } //a > b; }
32 Element(ConstraintPtr cnst, VariablePtr var, double value);
33 ConstraintPtr p_constraint;
34 VariablePtr p_variable;
41 class ConstraintLight {
43 ConstraintLight(ConstraintPtr cnst, double remainingOverUsage):
44 m_remainingOverUsage(remainingOverUsage), p_cnst(cnst) {};
45 double m_remainingOverUsage;
51 Constraint(void *id, double bound);
53 std::cout << "Del Const:" << m_bound << std::endl;
59 VariablePtr getVar(ElementPtr elem);
60 void addElement(ElementPtr elem);
62 vector<ElementPtr> m_elementSet; /* a list of lmm_element_t */
63 int m_elementsZeroWeight;
64 vector<ElementPtr> m_activeElementSet; /* a list of lmm_element_t */
73 ConstraintLightPtr p_cnstLight;
78 Variable(void *id, double weight, double bound, int visited);
80 std::cout << "Del Variable" << std::endl;
87 int getNumberOfCnst();
88 ConstraintPtr getCnst(int num);
89 double getCnstWeight(int num);
90 double isLimitedByLatency();
92 /* \begin{For Lagrange only} */
93 double (*p_funcF) (VariablePtr var, double x); /* (f) */
94 double (*p_funcFP) (VariablePtr var, double x); /* (f') */
95 double (*p_funcFPI) (VariablePtr var, double x); /* (f')^{-1} */
96 /* \end{For Lagrange only} */
97 vector<ElementPtr> m_cnsts;
99 unsigned m_visited; /* used by lmm_update_modified_set */
109 /* \begin{For Lagrange only} */
110 /* \end{For Lagrange only} */
115 Solver(int selective_update);
117 std::cout << "Del Solver" << std::endl;
120 inline void disableVariable(VariablePtr var);
121 ConstraintPtr createConstraint(void *id, double bound_value);
122 VariablePtr createVariable(void *id, double weight, double bound);
123 void expand(ConstraintPtr cnst, VariablePtr var, double value);
124 void expandAdd(ConstraintPtr cnst, VariablePtr var, double value);
125 void elementSetValue(ConstraintPtr cnst, VariablePtr var, double value);
126 void saturatedConstraintSetUpdate(double usage, ConstraintLightPtr cnstLight,
127 vector<ConstraintLightPtr> saturatedConstraintSet,
129 void saturatedVariableSetUpdate(vector<ConstraintLightPtr> cnstLightList,
130 vector<ConstraintLightPtr> saturatedConstraintSet);
132 void update(ConstraintPtr cnst, VariablePtr var, double value);
133 void updateVariableBound(VariablePtr var, double bound);
134 void updateVariableWeight(VariablePtr var, double weight);
135 void updateConstraintBound(ConstraintPtr cnst, double bound);
136 bool constraintUsed(ConstraintPtr cnst);
137 ConstraintPtr getFirstActiveConstraint();
138 ConstraintPtr getNextActiveConstraint(ConstraintPtr cnst);
139 void updateModifiedSetRec(ConstraintPtr cnst);
140 void updateModifiedSet(ConstraintPtr cnst);
141 void removeAllModifiedSet();
142 void activateConstraint(ConstraintPtr cnst);
143 void inactivateConstraint(ConstraintPtr cnst);
146 vector<VariablePtr> m_variableSet; /* a list of lmm_variable_t */
147 vector<VariablePtr> m_saturatedVariableSet; /* a list of lmm_variable_t */
148 vector<ConstraintPtr> m_activeConstraintSet; /* a list of lmm_constraint_t */
149 vector<ConstraintPtr> m_constraintSet; /* a list of lmm_constraint_t */
150 vector<ConstraintPtr> m_modifiedConstraintSet; /* a list of modified lmm_constraint_t */
151 vector<ConstraintPtr> m_saturatedConstraintSet; /* a list of lmm_constraint_t_t */
158 bool m_selectiveUpdateActive; /* flag to update partially the system only selecting changed portions */
159 unsigned m_visitedCounter; /* used by lmm_update_modified_set */
162 boost::object_pool<Constraint> m_constraintAllocator;
163 boost::object_pool<Variable> m_variableAllocator;
164 boost::object_pool<Element> m_elementAllocator;
165 void destroyConstraint(Constraint* cnst);
166 void destroyVariable(Variable* var);
167 void destroyElement(Element* elem);
169 vector<void*> m_keepTrack;
171 //xbt_mallocator_t variable_mallocator;
174 #endif /* SURF_SOLVER_H_ */