# MLP specific settings
+# MAX_DURATION = 3 s
+# MAX_ITERATIONS = 1024
+
+
+
DUMP_MLP = NO
DUMP_SOLUTION = NO
DUMP_OVERWRITE = NO
static struct GNUNET_CONTAINER_MultiHashMap *addresses;
-static void *solver;
-
static unsigned long long wan_quota_in;
static unsigned long long wan_quota_out;
static int running;
+void *solver;
+
+struct GAS_Addresses_Handle
+{
+ int ats_mode;
+ /* Solver handle */
+ void *solver;
+
+ /* Solver functions */
+ GAS_solver_init s_init;
+ GAS_solver_done s_done;
+ GAS_solver_address_delete s_del;
+ GAS_solver_address_change_preference s_pref;
+};
+
static unsigned int
assemble_ats_information (struct ATS_Address *aa, struct GNUNET_ATS_Information **dest)
* @param cfg configuration to use
* @param stats the statistics handle to use
*/
-void
+struct GAS_Addresses_Handle *
GAS_addresses_init (const struct GNUNET_CONFIGURATION_Handle *cfg,
const struct GNUNET_STATISTICS_Handle *stats)
{
+ struct GAS_Addresses_Handle *ah;
int c;
char *quota_wan_in_str;
char *quota_wan_out_str;
}
}
+
+ ah = GNUNET_malloc (sizeof (struct GAS_Addresses_Handle));
+
/* Start configured solution method */
switch (ats_mode)
{
case MODE_MLP:
/* Init the MLP solver with default values */
- solver = GAS_mlp_init (cfg, stats, MLP_MAX_EXEC_DURATION, MLP_MAX_ITERATIONS);
- if (NULL != solver)
- {
- ats_mode = MODE_MLP;
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "ATS started in %s mode\n", "MLP");
- break;
- }
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Failed to initialize MLP solver!\n");
+#if HAVE_LIBGLPK
+ ah->ats_mode = MODE_MLP;
+ ah->s_init = &GAS_mlp_init;
+ ah->s_pref = &GAS_mlp_address_change_preference;
+ ah->s_del = &GAS_mlp_address_delete;
+ ah->s_done = &GAS_mlp_done;
+#else
+ GNUNET_freee (ah);
+ return NULL;
+#endif
+ break;
case MODE_SIMPLISTIC:
/* Init the simplistic solver with default values */
+ ah->ats_mode = MODE_SIMPLISTIC;
+ ah->s_init = &GAS_simplistic_init;
+ ah->s_pref = &GAS_simplistic_address_change_preference;
+ ah->s_del = &GAS_simplistic_address_delete;
+ ah->s_done = &GAS_simplistic_done;
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "ATS started in %s mode\n", "SIMPLISTIC");
- solver = GAS_simplistic_init (cfg, stats);
- if (NULL != solver)
- {
- ats_mode = MODE_SIMPLISTIC;
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "ATS started in %s mode\n", "SIMPLISTIC");
- break;
- }
- else
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Failed to initialize simplistic solver!\n");
- return;
- }
break;
default:
- GNUNET_break (0);
+ return NULL;
break;
}
+
+ GNUNET_assert (NULL != ah->s_init);
+ GNUNET_assert (NULL != ah->s_pref);
+ GNUNET_assert (NULL != ah->s_del);
+ GNUNET_assert (NULL != ah->s_done);
+
+ ah->solver = ah->s_init (cfg, stats);
+ /* REMOVE */ solver = ah->solver;
+ if (NULL == ah->solver)
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Failed to initialize MLP solver!\n");
+ GNUNET_free (ah);
+ return NULL;
+ }
+
/* up and running */
running = GNUNET_YES;
+ return ah;
}
int used;
};
+typedef void
+(*GAS_solver_address_change_preference) (void *solver,
+ const struct GNUNET_PeerIdentity *peer,
+ enum GNUNET_ATS_PreferenceKind kind,
+ float score);
+
+typedef void
+ (*GAS_solver_address_delete) (void *solver, struct GNUNET_CONTAINER_MultiHashMap * addresses, struct ATS_Address *address);
+
+
+typedef void *
+ (*GAS_solver_init) (const struct GNUNET_CONFIGURATION_Handle *cfg,
+ const struct GNUNET_STATISTICS_Handle *stats);
+
+
+typedef void
+ (*GAS_solver_done) (void *solver);
+
+
/**
* Initialize address subsystem.
*
* @param cfg configuration to use
* @param stats the statistics handle to use
*/
-void
+struct GAS_Addresses_Handle *
GAS_addresses_init (const struct GNUNET_CONFIGURATION_Handle *cfg,
const struct GNUNET_STATISTICS_Handle *stats);
-
/**
* Shutdown address subsystem.
*/
* @param max_iterations maximum time limit for the LP/MLP Solver
* @return struct GAS_MLP_Handle * on success, NULL on fail
*/
-struct GAS_MLP_Handle *
+void *
GAS_mlp_init (const struct GNUNET_CONFIGURATION_Handle *cfg,
- const struct GNUNET_STATISTICS_Handle *stats,
- struct GNUNET_TIME_Relative max_duration,
- unsigned int max_iterations)
+ const struct GNUNET_STATISTICS_Handle *stats)
{
struct GAS_MLP_Handle * mlp = GNUNET_malloc (sizeof (struct GAS_MLP_Handle));
char * quota_out_str;
char * quota_in_str;
+ struct GNUNET_TIME_Relative max_duration;
+ long long unsigned int max_iterations;
+
/* Init GLPK environment */
int res = glp_init_env();
switch (res) {
mlp->BIG_M = (double) BIG_M_VALUE;
+ /* Get maximum number of iterations */
+
+
+ /* Get timeout for iterations */
+ if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_time(cfg, "ats", "MAX_DURATION", &max_duration))
+ {
+ max_duration = MLP_MAX_EXEC_DURATION;
+ }
+
+
+ if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_size(cfg, "ats", "MAX_ITERATIONS", &max_iterations))
+ {
+ max_iterations = MLP_MAX_ITERATIONS;
+ }
+
/* Get diversity coefficient from configuration */
if (GNUNET_OK == GNUNET_CONFIGURATION_get_value_size (cfg, "ats",
"COEFFICIENT_D",
* @param address the address to delete
*/
void
-GAS_mlp_address_delete (struct GAS_MLP_Handle *mlp, struct GNUNET_CONTAINER_MultiHashMap * addresses, struct ATS_Address *address)
+GAS_mlp_address_delete (void *solver, struct GNUNET_CONTAINER_MultiHashMap * addresses, struct ATS_Address *address)
{
+ struct GAS_MLP_Handle *mlp = solver;
GNUNET_STATISTICS_update (mlp->stats,"# LP address deletions", 1, GNUNET_NO);
struct GAS_MLP_SolutionContext ctx;
* @param score the score
*/
void
-GAS_mlp_address_change_preference (struct GAS_MLP_Handle *mlp,
+GAS_mlp_address_change_preference (void *solver,
const struct GNUNET_PeerIdentity *peer,
enum GNUNET_ATS_PreferenceKind kind,
float score)
{
+ struct GAS_MLP_Handle *mlp = solver;
GNUNET_STATISTICS_update (mlp->stats,"# LP address preference changes", 1, GNUNET_NO);
//struct ATS_Peer *p = mlp_find_peer (mlp, peer);
//FIXME to finish implementation
/* Here we have to do the matching */
+
}
/**
* @param mlp the MLP handle
*/
void
-GAS_mlp_done (struct GAS_MLP_Handle *mlp)
+GAS_mlp_done (void *solver)
{
+ struct GAS_MLP_Handle *mlp = solver;
struct ATS_Peer * peer;
struct ATS_Address *addr;
* @param max_iterations maximum time limit for the LP/MLP Solver
* @return struct GAS_MLP_Handle * on success, NULL on fail
*/
-struct GAS_MLP_Handle *
+void *
GAS_mlp_init (const struct GNUNET_CONFIGURATION_Handle *cfg,
- const struct GNUNET_STATISTICS_Handle *stats,
- struct GNUNET_TIME_Relative max_duration,
- unsigned int max_iterations);
+ const struct GNUNET_STATISTICS_Handle *stats);
/**
* Solves the MLP problem on demand
* @param address the address to delete
*/
void
-GAS_mlp_address_delete (struct GAS_MLP_Handle *mlp, struct GNUNET_CONTAINER_MultiHashMap * addresses, struct ATS_Address *address);
+GAS_mlp_address_delete (void *solver, struct GNUNET_CONTAINER_MultiHashMap * addresses, struct ATS_Address *address);
/**
* @param score the score
*/
void
-GAS_mlp_address_change_preference (struct GAS_MLP_Handle *mlp,
+GAS_mlp_address_change_preference (void *solver,
const struct GNUNET_PeerIdentity *peer,
enum GNUNET_ATS_PreferenceKind kind,
float score);
* @param stats the GNUNET_STATISTICS handle
* @return struct GAS_SIMPLISTIC_Handle * on success, NULL on fail
*/
-struct GAS_SIMPLISTIC_Handle *
+void *
GAS_simplistic_init (const struct GNUNET_CONFIGURATION_Handle *cfg,
const struct GNUNET_STATISTICS_Handle *stats)
{
* Shutdown the simplistic problem solving component
*/
void
-GAS_simplistic_done (struct GAS_SIMPLISTIC_Handle *solver)
+GAS_simplistic_done (void *solver)
{
GNUNET_free (solver);
}
* @param address the address to update
*/
void
-GAS_simplistic_address_update (struct GAS_SIMPLISTIC_Handle *solver, struct GNUNET_CONTAINER_MultiHashMap * addresses, struct ATS_Address *address)
+GAS_simplistic_address_update (void *solver, struct GNUNET_CONTAINER_MultiHashMap * addresses, struct ATS_Address *address)
+{
+
+}
+
+void
+GAS_simplistic_address_delete (void *solver, struct GNUNET_CONTAINER_MultiHashMap * addresses, struct ATS_Address *address)
{
}
* @param score the score
*/
void
-GAS_simplistic_address_change_preference (struct GAS_SIMPLISTIC_Handle *solver,
+GAS_simplistic_address_change_preference (void *solver,
const struct GNUNET_PeerIdentity *peer,
enum GNUNET_ATS_PreferenceKind kind,
float score)
* @param stats the GNUNET_STATISTICS handle
* @return struct GAS_SIMPLISTIC_Handle * on success, NULL on fail
*/
-struct GAS_SIMPLISTIC_Handle *
+void *
GAS_simplistic_init (const struct GNUNET_CONFIGURATION_Handle *cfg,
const struct GNUNET_STATISTICS_Handle *stats);
* Shutdown the simplistic problem solving component
*/
void
-GAS_simplistic_done (struct GAS_SIMPLISTIC_Handle *);
+GAS_simplistic_done (void * solver);
/**
* @param address the address to update
*/
void
-GAS_simplistic_address_update (struct GAS_SIMPLISTIC_Handle *solver, struct GNUNET_CONTAINER_MultiHashMap * addresses, struct ATS_Address *address);
+GAS_simplistic_address_update (void *solver, struct GNUNET_CONTAINER_MultiHashMap * addresses, struct ATS_Address *address);
+
+void
+GAS_simplistic_address_delete (void *solver, struct GNUNET_CONTAINER_MultiHashMap * addresses, struct ATS_Address *address);
/**
* Changes the preferences for a peer in the problem
* @param score the score
*/
void
-GAS_simplistic_address_change_preference (struct GAS_SIMPLISTIC_Handle *solver,
+GAS_simplistic_address_change_preference (void *solver,
const struct GNUNET_PeerIdentity *peer,
enum GNUNET_ATS_PreferenceKind kind,
float score);
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Setting up %u peers with %u addresses per peer\n", peers, addresses);
- mlp = GAS_mlp_init (cfg, NULL, MLP_MAX_EXEC_DURATION, MLP_MAX_ITERATIONS);
+ mlp = GAS_mlp_init (cfg, NULL);
if (NULL == mlp)
{
GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Failed to init MLP\n");
addresses = GNUNET_CONTAINER_multihashmap_create (10, GNUNET_NO);
- mlp = GAS_mlp_init (cfg, NULL, MLP_MAX_EXEC_DURATION, MLP_MAX_ITERATIONS);
+ mlp = GAS_mlp_init (cfg, NULL);
mlp->auto_solve = GNUNET_NO;
struct GNUNET_PeerIdentity p[10];
addresses = GNUNET_CONTAINER_multihashmap_create (10, GNUNET_NO);
- mlp = GAS_mlp_init (cfg, NULL, MLP_MAX_EXEC_DURATION, MLP_MAX_ITERATIONS);
+ mlp = GAS_mlp_init (cfg, NULL);
mlp->auto_solve = GNUNET_NO;
struct GNUNET_PeerIdentity p[10];