-/* Copyright (c) 2004-2021. The SimGrid Team. All rights reserved. */
+/* Copyright (c) 2004-2022. The SimGrid Team. All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
* under the terms of the license (GNU LGPL) which comes with this package. */
#define SURF_MAXMIN_HPP
#include "simgrid/kernel/resource/Action.hpp"
+#include "simgrid/kernel/resource/Model.hpp"
#include "simgrid/s4u/Link.hpp"
#include "src/surf/surf_interface.hpp"
#include "xbt/asserts.h"
// - if CPU, then probably 1.
// - If network, then 1 in forward direction and 0.05 backward for the ACKs
double consumption_weight;
+ // maximum consumption weight (can be different from consumption_weight with subflows/ptasks)
+ double max_consumption_weight = 0;
};
class ConstraintLight {
*/
class XBT_PUBLIC Constraint {
public:
- enum class SharingPolicy { SHARED = 1, FATPIPE = 0 };
+ enum class SharingPolicy { NONLINEAR = 2, SHARED = 1, FATPIPE = 0 };
+
Constraint() = delete;
Constraint(resource::Resource* id_value, double bound_value);
void unshare() { sharing_policy_ = SharingPolicy::FATPIPE; }
/** @brief Set how a constraint is shared */
- void set_sharing_policy(SharingPolicy policy) { sharing_policy_ = policy; }
+ void set_sharing_policy(SharingPolicy policy, const s4u::NonLinearResourceCb& cb);
/** @brief Check how a constraint is shared */
SharingPolicy get_sharing_policy() const { return sharing_policy_; }
double remaining_ = 0.0;
double usage_ = 0.0;
double bound_;
+ double dynamic_bound_ = 0.0; //!< dynamic bound for this constraint, defined by user's callback
// TODO MARTIN Check maximum value across resources at the end of simulation and give a warning is more than e.g. 500
int concurrency_current_ = 0; /* The current concurrency */
int concurrency_maximum_ = 0; /* The maximum number of (enabled and disabled) variables associated to the constraint
double lambda_ = 0.0;
double new_lambda_ = 0.0;
ConstraintLight* cnst_light_ = nullptr;
+ s4u::NonLinearResourceCb dyn_constraint_cb_;
private:
static int next_rank_; // To give a separate rank_ to each constraint
std::unique_ptr<resource::Action::ModifiedSet> modified_set_ = nullptr;
+protected:
+ bool selective_update_active; /* flag to update partially the system only selecting changed portions */
+ boost::intrusive::list<Constraint, boost::intrusive::member_hook<Constraint, boost::intrusive::list_member_hook<>,
+ &Constraint::modified_constraint_set_hook_>>
+ modified_constraint_set;
+
private:
using dyn_light_t = std::vector<int>;
std::vector<ConstraintLight> cnst_light_vec;
dyn_light_t saturated_constraints;
- bool selective_update_active; /* flag to update partially the system only selecting changed portions */
unsigned visited_counter_ = 1; /* used by System::update_modified_set() and System::remove_all_modified_set() to
* cleverly (un-)flag the constraints (more details in these functions) */
boost::intrusive::list<Constraint, boost::intrusive::member_hook<Constraint, boost::intrusive::list_member_hook<>,
&Constraint::constraint_set_hook_>>
constraint_set;
- boost::intrusive::list<Constraint, boost::intrusive::member_hook<Constraint, boost::intrusive::list_member_hook<>,
- &Constraint::modified_constraint_set_hook_>>
- modified_constraint_set;
xbt_mallocator_t variable_mallocator_ =
xbt_mallocator_new(65536, System::variable_mallocator_new_f, System::variable_mallocator_free_f, nullptr);
};