Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
e59483186fb8e1d78fe2f84b8a45ed2dc1d70390
[simgrid.git] / src / surf / solver.h
1 #include <xbt.h>
2 #include <math.h>
3
4 #ifndef SURF_SOLVER_H_
5 #define SURF_SOLVER_H_
6
7 static double MAXMIN_PRECISION = 0.001;
8 extern double sg_maxmin_precision;
9
10 static XBT_INLINE int double_equals(double value1, double value2)
11 {
12   return (fabs(value1 - value2) < MAXMIN_PRECISION);
13 }
14
15 static XBT_INLINE void double_update(double *variable, double value)
16 {
17   *variable -= value;
18   if (*variable < MAXMIN_PRECISION)
19     *variable = 0.0;
20 }
21
22 #ifdef __cplusplus
23 #include <vector>
24 #include <boost/smart_ptr.hpp>
25 #include <boost/pool/object_pool.hpp>
26 #include <boost/bind.hpp>
27
28 using namespace std;
29
30 static XBT_INLINE int double_positive(double value)
31 {
32   return (value > MAXMIN_PRECISION);
33 }
34
35 class Solver;
36 class Element;
37 class Constraint;
38 class ConstraintLight;
39 class Variable;
40
41 /*struct ElementPtrOps
42 {
43   bool operator()( const ElementPtr & a, const ElementPtr & b )
44     { return true; } //a > b; }
45 };*/
46
47 #else
48   typedef struct Solver Solver;
49   typedef struct Element Element;
50   typedef struct Constraint Constraint;
51   typedef struct ConstraintLight ConstraintLight;
52   typedef struct Variable Variable;
53
54 #endif
55 typedef Element *ElementPtr;
56 typedef Variable *VariablePtr;
57 typedef Constraint *ConstraintPtr;
58 typedef ConstraintLight *ConstraintLightPtr;
59 typedef Solver *SolverPtr;
60
61 typedef ElementPtr lmm_element_t;
62 typedef VariablePtr lmm_variable_t;
63 typedef ConstraintPtr lmm_constraint_t;
64 typedef ConstraintLightPtr lmm_constraint_light_t;
65 typedef SolverPtr lmm_system_t;
66
67 extern double (*func_f_def) (lmm_variable_t, double);
68 extern double (*func_fp_def) (lmm_variable_t, double);
69 extern double (*func_fpi_def) (lmm_variable_t, double);
70
71 #ifdef __cplusplus
72 extern "C" {
73 #endif
74
75   extern void _simgrid_log_category__surf_lagrange__constructor__(void);
76   extern void _simgrid_log_category__surf_maxmin__constructor__(void);
77   extern void _simgrid_log_category__surf_lagrange_dichotomy__constructor__(void);
78
79   extern void lmm_set_default_protocol_function(double (*func_f)(lmm_variable_t var, double x),
80                                                 double (*func_fp) (lmm_variable_t var, double x),
81                                                 double (*func_fpi) (lmm_variable_t var, double x));
82   extern double func_reno_f(lmm_variable_t var, double x);
83   extern double func_reno_fp(lmm_variable_t var, double x);
84   extern double func_reno_fpi(lmm_variable_t var, double x);
85   extern double func_reno2_f(lmm_variable_t var, double x);
86   extern double func_reno2_fp(lmm_variable_t var, double x);
87   extern double func_reno2_fpi(lmm_variable_t var, double x);
88   extern double func_vegas_f(lmm_variable_t var, double x);
89   extern double func_vegas_fp(lmm_variable_t var, double x);
90   extern double func_vegas_fpi(lmm_variable_t var, double x);
91
92
93   //extern int double_equals(double value1, double value2);
94   //extern void double_update(double *variable, double value);
95
96   extern lmm_variable_t lmm_get_var_from_cnst(lmm_system_t sys, lmm_constraint_t cnst, lmm_element_t * elem);
97   extern lmm_constraint_t lmm_get_cnst_from_var(lmm_system_t sys, lmm_variable_t var, int num);
98   extern double lmm_get_cnst_weight_from_var(lmm_system_t sys, lmm_variable_t var, int num);
99   extern int lmm_get_number_of_cnst_from_var(lmm_system_t sys, lmm_variable_t var);
100
101   extern lmm_variable_t lmm_variable_new(lmm_system_t sys, void *id,
102                                             double weight_value,
103                                             double bound,
104                                             int number_of_constraints); 
105   extern void *lmm_variable_id(lmm_variable_t var);       
106   extern double lmm_variable_getvalue(lmm_variable_t var);
107   extern double lmm_get_variable_weight(lmm_variable_t var);
108   extern void lmm_variable_free(lmm_system_t sys, lmm_variable_t var);
109   
110   extern lmm_constraint_t lmm_constraint_new(lmm_system_t sys, void *id,
111                                     double bound_value);          
112   extern void *lmm_constraint_id(lmm_constraint_t cnst);
113   extern void lmm_constraint_shared(lmm_constraint_t cnst);
114   extern int lmm_constraint_is_shared(lmm_constraint_t cnst);
115   extern int lmm_constraint_used(lmm_system_t sys, lmm_constraint_t cnst);
116   extern void lmm_constraint_free(lmm_system_t sys, lmm_constraint_t cnst);
117
118   extern lmm_system_t lmm_system_new(int selective_update);       
119   extern int lmm_system_modified(lmm_system_t solver);    
120   extern void lmm_expand(lmm_system_t sys, lmm_constraint_t cnst, lmm_variable_t var, double value);
121   extern void lmm_expand_add(lmm_system_t sys, lmm_constraint_t cnst,
122                     lmm_variable_t var, double value);
123   extern void lmm_update_variable_bound(lmm_system_t sys, lmm_variable_t var,
124                                double bound);
125   extern void lmm_update_variable_weight(lmm_system_t sys,
126                                             lmm_variable_t var,
127                                             double weight);       
128   extern void lmm_update_constraint_bound(lmm_system_t sys,
129                                              lmm_constraint_t cnst,
130                                              double bound);
131   extern void lmm_solve(lmm_system_t solver);
132   extern void lagrange_solve(lmm_system_t solver);
133   extern void bottleneck_solve(lmm_system_t solver);
134   extern void lmm_system_free(lmm_system_t solver);
135
136   extern void c_function(lmm_system_t);   /* ANSI C prototypes */
137   extern lmm_system_t cplusplus_callback_function(lmm_system_t);
138   extern void lmm_print(lmm_system_t sys);
139   
140   /*********
141    * FIXES *
142    *********/
143   extern int fix_constraint_is_active(lmm_system_t sys, lmm_constraint_t cnst);
144
145 #ifdef __cplusplus
146 }
147 #endif
148
149
150
151
152
153 #endif /* SURF_SOLVER_H_ */