1 /* Copyright (c) 2004-2014. The SimGrid Team.
2 * All rights reserved. */
4 /* This program is free software; you can redistribute it and/or modify it
5 * under the terms of the license (GNU LGPL) which comes with this package. */
7 #ifndef _SURF_MAXMIN_PRIVATE_H
8 #define _SURF_MAXMIN_PRIVATE_H
12 #include "surf/maxmin.h"
14 #include "xbt/mallocator.h"
15 #include "surf_interface.hpp"
19 * Elements can be seen as glue between constraint objects and variable objects.
20 * Basically, each variable will have a set of elements, one for each constraint where it is involved.
21 * Then, it is used to list all variables involved in constraint through constraint's xxx_element_set lists, or vice-versa list all constraints for a given variable.
23 typedef struct lmm_element {
24 /* hookup to constraint */
25 s_xbt_swag_hookup_t enabled_element_set_hookup;
26 s_xbt_swag_hookup_t disabled_element_set_hookup;
27 s_xbt_swag_hookup_t active_element_set_hookup;
29 lmm_constraint_t constraint;
30 lmm_variable_t variable;
33 #define make_elem_active(elem) xbt_swag_insert_at_head(elem,&(elem->constraint->active_element_set))
34 #define make_elem_inactive(elem) xbt_swag_remove(elem,&(elem->constraint->active_element_set))
36 typedef struct lmm_constraint_light {
37 double remaining_over_usage;
38 lmm_constraint_t cnst;
39 } s_lmm_constraint_light_t;
42 * @brief LMM constraint
43 * Each constraint contains several partially overlapping logical sets of elements:
44 * \li Disabled elements which variable's weight is zero. This variables are not at all processed by LMM, but eventually the corresponding action will enable it (at least this is the idea).
45 * \li Enabled elements which variable's weight is non-zero. They are utilized in some LMM functions.
46 * \li Active elements which variable's weight is non-zero (i.e. it is enabled) AND its element value is non-zero. LMM_solve iterates over active elements during resolution, dynamically making them active or unactive.
49 typedef struct lmm_constraint {
50 /* hookup to system */
51 s_xbt_swag_hookup_t constraint_set_hookup;
52 s_xbt_swag_hookup_t active_constraint_set_hookup;
53 s_xbt_swag_hookup_t modified_constraint_set_hookup;
54 s_xbt_swag_hookup_t saturated_constraint_set_hookup;
56 s_xbt_swag_t enabled_element_set; /* a list of lmm_element_t */
57 s_xbt_swag_t disabled_element_set; /* a list of lmm_element_t */
58 s_xbt_swag_t active_element_set; /* a list of lmm_element_t */
62 int concurrency_limit; /* The maximum number of variables that may be enabled at any time (stage variables if necessary) */
63 //TODO MARTIN Check maximum value across resources at the end of simulation and give a warning is more than e.g. 500
64 int concurrency_current; /* The current concurrency */
65 int concurrency_maximum; /* The maximum number of (enabled and disabled) variables associated to the constraint at any given time (essentially for tracing)*/
67 int sharing_policy; /* see @e_surf_link_sharing_policy_t (0: FATPIPE, 1: SHARED, 2: FULLDUPLEX) */
72 lmm_constraint_light_t cnst_light;
78 * When something prevents us from enabling a variable, we "stage" the weight that we would have like to set, so that as soon as possible we enable the variable with desired weight
80 typedef struct lmm_variable {
81 /* hookup to system */
82 s_xbt_swag_hookup_t variable_set_hookup;
83 s_xbt_swag_hookup_t saturated_variable_set_hookup;
85 s_lmm_element_t *cnsts;
88 double weight; /* weight > 0 means variable is considered by LMM, weight == 0 means variable is not considered by LMM*/
89 double staged_weight; /* If non-zero, variable is staged for addition as soon as maxconcurrency constraints will be met */
92 short int concurrency_share; /* The maximum number of elements that variable will add to a constraint */
95 unsigned visited; /* used by lmm_update_modified_set */
96 /* \begin{For Lagrange only} */
99 double (*func_f) (struct lmm_variable * var, double x); /* (f) */
100 double (*func_fp) (struct lmm_variable * var, double x); /* (f') */
101 double (*func_fpi) (struct lmm_variable * var, double x); /* (f')^{-1} */
102 /* \end{For Lagrange only} */
105 /** @ingroup SURF_lmm
108 typedef struct lmm_system {
110 int selective_update_active; /* flag to update partially the system only selecting changed portions */
111 unsigned visited_counter; /* used by lmm_update_modified_set and lmm_remove_modified_set to cleverly (un-)flag the constraints (more details in these functions)*/
112 s_xbt_swag_t variable_set; /* a list of lmm_variable_t */
113 s_xbt_swag_t constraint_set; /* a list of lmm_constraint_t */
115 s_xbt_swag_t active_constraint_set; /* a list of lmm_constraint_t */
116 s_xbt_swag_t modified_constraint_set; /* a list of modified lmm_constraint_t */
118 s_xbt_swag_t saturated_variable_set; /* a list of lmm_variable_t */
119 s_xbt_swag_t saturated_constraint_set; /* a list of lmm_constraint_t_t */
121 simgrid::surf::ActionLmmListPtr keep_track;
123 xbt_mallocator_t variable_mallocator;
126 #define extract_variable(sys) xbt_swag_extract(&(sys->variable_set))
127 #define extract_constraint(sys) xbt_swag_extract(&(sys->constraint_set))
128 #define insert_constraint(sys,cnst) xbt_swag_insert(cnst,&(sys->constraint_set))
129 #define remove_variable(sys,var) do {xbt_swag_remove(var,&(sys->variable_set));\
130 xbt_swag_remove(var,&(sys->saturated_variable_set));} while(0)
131 #define remove_constraint(sys,cnst) do {xbt_swag_remove(cnst,&(sys->constraint_set));\
132 xbt_swag_remove(cnst,&(sys->saturated_constraint_set));} while(0)
133 #define make_constraint_active(sys,cnst) xbt_swag_insert(cnst,&(sys->active_constraint_set))
134 #define make_constraint_inactive(sys,cnst) \
135 do { xbt_swag_remove(cnst, &sys->active_constraint_set); \
136 xbt_swag_remove(cnst, &sys->modified_constraint_set); } while (0)
138 /** @ingroup SURF_lmm
139 * @brief Print informations about a lmm system
141 * @param sys A lmm system
143 //XBT_PRIVATE void lmm_print(lmm_system_t sys);
145 extern XBT_PRIVATE double (*func_f_def) (lmm_variable_t, double);
146 extern XBT_PRIVATE double (*func_fp_def) (lmm_variable_t, double);
147 extern XBT_PRIVATE double (*func_fpi_def) (lmm_variable_t, double);
149 #endif /* _SURF_MAXMIN_PRIVATE_H */