22#include "absl/container/flat_hash_map.h" 
   23#include "absl/strings/str_format.h" 
   24#include "absl/strings/str_join.h" 
   25#include "absl/strings/string_view.h" 
   45  min_ = std::numeric_limits<int64_t>::min();
 
   46  max_ = std::numeric_limits<int64_t>::max();
 
 
   56  SetRange(element.min_, element.max_);
 
 
   67  min_ = int_var_assignment_proto.
min();
 
   68  max_ = int_var_assignment_proto.
max();
 
   69  if (int_var_assignment_proto.
active()) {
 
 
   77  if (var_ != element.var_) {
 
   88  return min_ == element.min_ && max_ == element.max_;
 
 
   93  int_var_assignment_proto->
set_var_id(var_->name());
 
   94  int_var_assignment_proto->
set_min(min_);
 
   95  int_var_assignment_proto->
set_max(max_);
 
 
  102      return absl::StrFormat(
"(%d)", min_);
 
  104      return absl::StrFormat(
"(%d..%d)", min_, max_);
 
 
  119  start_min_ = std::numeric_limits<int64_t>::min();
 
  120  start_max_ = std::numeric_limits<int64_t>::max();
 
  121  duration_min_ = std::numeric_limits<int64_t>::min();
 
  122  duration_max_ = std::numeric_limits<int64_t>::max();
 
  123  end_min_ = std::numeric_limits<int64_t>::min();
 
  124  end_max_ = std::numeric_limits<int64_t>::max();
 
 
  131  element->
Copy(*
this);
 
 
  149  performed_min_ = 
static_cast<int64_t
>(var_->MustBePerformed());
 
  150  performed_max_ = 
static_cast<int64_t
>(var_->MayBePerformed());
 
  151  if (performed_max_ != 0LL) {
 
  152    start_min_ = var_->StartMin();
 
  153    start_max_ = var_->StartMax();
 
  154    duration_min_ = var_->DurationMin();
 
  155    duration_max_ = var_->DurationMax();
 
  156    end_min_ = var_->EndMin();
 
  157    end_max_ = var_->EndMax();
 
 
  162  if (performed_max_ == performed_min_) {
 
  163    var_->SetPerformed(performed_min_);
 
  165  if (performed_max_ != 0LL) {
 
  166    var_->SetStartRange(start_min_, start_max_);
 
  167    var_->SetDurationRange(duration_min_, duration_max_);
 
  168    var_->SetEndRange(end_min_, end_max_);
 
 
  174  start_min_ = interval_var_assignment_proto.
start_min();
 
  175  start_max_ = interval_var_assignment_proto.
start_max();
 
  176  duration_min_ = interval_var_assignment_proto.
duration_min();
 
  177  duration_max_ = interval_var_assignment_proto.
duration_max();
 
  178  end_min_ = interval_var_assignment_proto.
end_min();
 
  179  end_max_ = interval_var_assignment_proto.
end_max();
 
  180  performed_min_ = interval_var_assignment_proto.
performed_min();
 
  181  performed_max_ = interval_var_assignment_proto.
performed_max();
 
  182  if (interval_var_assignment_proto.
active()) {
 
 
  191  interval_var_assignment_proto->
set_var_id(var_->name());
 
  196  interval_var_assignment_proto->
set_end_min(end_min_);
 
  197  interval_var_assignment_proto->
set_end_max(end_max_);
 
 
  206    absl::StrAppendFormat(&out, 
"(start = %d", start_min_);
 
  207    if (start_max_ != start_min_) {
 
  208      absl::StrAppendFormat(&out, 
"..%d", start_max_);
 
  210    absl::StrAppendFormat(&out, 
", duration = %d", duration_min_);
 
  211    if (duration_max_ != duration_min_) {
 
  212      absl::StrAppendFormat(&out, 
"..%d", duration_max_);
 
  214    absl::StrAppendFormat(&out, 
", status = %d", performed_min_);
 
  215    if (performed_max_ != performed_min_) {
 
  216      absl::StrAppendFormat(&out, 
"..%d", performed_max_);
 
 
  226  if (var_ != element.var_) {
 
  237  return start_min_ == element.start_min_ && start_max_ == element.start_max_ &&
 
  238         duration_min_ == element.duration_min_ &&
 
  239         duration_max_ == element.duration_max_ &&
 
  240         end_min_ == element.end_min_ && end_max_ == element.end_max_ &&
 
  241         performed_min_ == element.performed_min_ &&
 
  242         performed_max_ == element.performed_max_ && var_ == element.var_;
 
 
  253  forward_sequence_.clear();
 
  254  backward_sequence_.clear();
 
  255  unperformed_.clear();
 
 
  260  element->
Copy(*
this);
 
 
  265  forward_sequence_ = element.forward_sequence_;
 
  266  backward_sequence_ = element.backward_sequence_;
 
  267  unperformed_ = element.unperformed_;
 
 
  277  var_->
FillSequence(&forward_sequence_, &backward_sequence_, &unperformed_);
 
 
  281  var_->RankSequence(forward_sequence_, backward_sequence_, unperformed_);
 
 
  286  for (
const int32_t forward_sequence :
 
  288    forward_sequence_.push_back(forward_sequence);
 
  290  for (
const int32_t backward_sequence :
 
  292    backward_sequence_.push_back(backward_sequence);
 
  294  for (
const int32_t unperformed :
 
  296    unperformed_.push_back(unperformed);
 
  298  if (sequence_var_assignment_proto.
active()) {
 
  303  DCHECK(CheckClassInvariants());
 
 
  308  sequence_var_assignment_proto->
set_var_id(var_->name());
 
  310  for (
const int forward_sequence : forward_sequence_) {
 
  313  for (
const int backward_sequence : backward_sequence_) {
 
  316  for (
const int unperformed : unperformed_) {
 
 
  323    return absl::StrFormat(
"[forward %s, backward %s, unperformed [%s]]",
 
  324                           absl::StrJoin(forward_sequence_, 
" -> "),
 
  325                           absl::StrJoin(backward_sequence_, 
" -> "),
 
  326                           absl::StrJoin(unperformed_, 
", "));
 
 
  333  if (var_ != element.var_) {
 
  344  return forward_sequence_ == element.forward_sequence_ &&
 
  345         backward_sequence_ == element.backward_sequence_ &&
 
  346         unperformed_ == element.unperformed_;
 
 
  350  return forward_sequence_;
 
 
  354  return backward_sequence_;
 
 
  362                                     const std::vector<int>& backward_sequence,
 
  363                                     const std::vector<int>& unperformed) {
 
  364  forward_sequence_ = forward_sequence;
 
  365  backward_sequence_ = backward_sequence;
 
  366  unperformed_ = unperformed;
 
  367  DCHECK(CheckClassInvariants());
 
 
  371    const std::vector<int>& forward_sequence) {
 
  372  forward_sequence_ = forward_sequence;
 
 
  376    const std::vector<int>& backward_sequence) {
 
  377  backward_sequence_ = backward_sequence;
 
 
  381  unperformed_ = unperformed;
 
 
  384bool SequenceVarElement::CheckClassInvariants() {
 
  385  absl::flat_hash_set<int> visited;
 
  386  for (
const int forward_sequence : forward_sequence_) {
 
  387    if (visited.contains(forward_sequence)) {
 
  390    visited.insert(forward_sequence);
 
  392  for (
const int backward_sequence : backward_sequence_) {
 
  393    if (visited.contains(backward_sequence)) {
 
  396    visited.insert(backward_sequence);
 
  398  for (
const int unperformed : unperformed_) {
 
  399    if (visited.contains(unperformed)) {
 
  402    visited.insert(unperformed);
 
  411      int_var_container_(copy->int_var_container_),
 
  412      interval_var_container_(copy->interval_var_container_),
 
  413      sequence_var_container_(copy->sequence_var_container_),
 
  414      objective_elements_(copy->objective_elements_) {}
 
 
  420  objective_elements_.clear();
 
  421  int_var_container_.Clear();
 
  422  interval_var_container_.Clear();
 
  423  sequence_var_container_.Clear();
 
 
  427  int_var_container_.Store();
 
  428  interval_var_container_.Store();
 
  429  sequence_var_container_.Store();
 
  430  for (
IntVarElement& objective_element : objective_elements_) {
 
  431    objective_element.Store();
 
 
  437  int_var_container_.Restore();
 
  438  interval_var_container_.Restore();
 
  439  sequence_var_container_.Restore();
 
 
  445template <
class V, 
class E>
 
  447                    absl::flat_hash_map<std::string, E*>* id_to_element_map) {
 
  448  CHECK(id_to_element_map != 
nullptr);
 
  449  id_to_element_map->clear();
 
  450  for (
int i = 0; i < container->
Size(); ++i) {
 
  452    const V* 
const var = element->Var();
 
  453    const std::string& name = var->name();
 
  455      LOG(INFO) << 
"Cannot save/load variables with empty name" 
  456                << 
"; variable will be ignored";
 
  457    } 
else if (id_to_element_map->contains(name)) {
 
  458      LOG(INFO) << 
"Cannot save/load variables with duplicate names: " << name
 
  459                << 
"; variable will be ignored";
 
  461      (*id_to_element_map)[name] = element;
 
  466template <
class E, 
class P>
 
  467void LoadElement(
const absl::flat_hash_map<std::string, E*>& id_to_element_map,
 
  469  absl::string_view var_id = proto.var_id();
 
  470  CHECK(!var_id.empty());
 
  471  E* element = 
nullptr;
 
  473    element->LoadFromProto(proto);
 
  475    LOG(INFO) << 
"Variable " << var_id
 
  476              << 
" not in assignment; skipping variable";
 
  485    LOG(INFO) << 
"Cannot open " << filename;
 
 
  492  CHECK(
file != 
nullptr);
 
  496    LOG(INFO) << 
"No assignment found in " << 
file->filename();
 
  499  Load(assignment_proto);
 
  500  return reader.
Close();
 
 
  503template <
class Var, 
class Element, 
class Proto, 
class Container>
 
  505              Container* 
const container,
 
  508  bool fast_load = (container->Size() == (assignment_proto.*GetSize)());
 
  509  for (
int i = 0; fast_load && i < (assignment_proto.*GetSize)(); ++i) {
 
  510    Element* 
const element = container->MutableElement(i);
 
  511    const Proto& proto = (assignment_proto.*GetElem)(i);
 
  512    if (element->Var()->name() == proto.var_id()) {
 
  513      element->LoadFromProto(proto);
 
  519    absl::flat_hash_map<std::string, Element*> id_to_element_map;
 
  520    IdToElementMap<Var, Element>(container, &id_to_element_map);
 
  521    for (
int i = 0; i < (assignment_proto.*GetSize)(); ++i) {
 
  522      LoadElement<Element, Proto>(id_to_element_map,
 
  523                                  (assignment_proto.*GetElem)(i));
 
 
  530      assignment_proto, &int_var_container_,
 
  543    absl::string_view objective_id = objective.
var_id();
 
  544    DCHECK(!objective_id.empty());
 
  547      const int64_t obj_min = objective.
min();
 
  548      const int64_t obj_max = objective.
max();
 
 
  562    LOG(INFO) << 
"Cannot open " << filename;
 
 
  569  CHECK(
file != 
nullptr);
 
  571  Save(&assignment_proto);
 
 
  576template <
class Var, 
class Element, 
class Proto, 
class Container>
 
  579  for (
const Element& element : container.elements()) {
 
  580    const Var* 
const var = element.Var();
 
  581    const std::string& name = var->name();
 
  583      Proto* 
const var_assignment_proto = (assignment_proto->*Add)();
 
  584      element.WriteToProto(var_assignment_proto);
 
 
  590  assignment_proto->
Clear();
 
  592      assignment_proto, int_var_container_,
 
  600  for (
int i = 0; i < objective_elements_.size(); ++i) {
 
 
  612template <
class Container, 
class Element>
 
  614  for (
const Element& element : container.elements()) {
 
  615    if (element.Var() != 
nullptr) {
 
  616      absl::StrAppendFormat(out, 
"%s %s | ", element.Var()->name(),
 
  617                            element.DebugString());
 
 
  623  std::string out = 
"Assignment(";
 
  626      interval_var_container_, &out);
 
  628      sequence_var_container_, &out);
 
  629  std::vector<std::string> objective_str;
 
  630  for (
const IntVarElement& objective_element : objective_elements_) {
 
  631    if (objective_element.Activated()) {
 
  632      objective_str.push_back(objective_element.DebugString());
 
  635  absl::StrAppendFormat(&out, 
"%s)", absl::StrJoin(objective_str, 
", "));
 
 
  640  return int_var_container_.Add(var);
 
 
  644  for (
IntVar* 
const var : vars) {
 
 
  650  return int_var_container_.FastAdd(var);
 
 
  654  return int_var_container_.Element(var).
Min();
 
 
  658  return int_var_container_.Element(var).Max();
 
 
  662  return int_var_container_.Element(var).Value();
 
 
  666  return int_var_container_.Element(var).Bound();
 
 
  670  int_var_container_.MutableElement(var)->SetMin(m);
 
 
  674  int_var_container_.MutableElement(var)->SetMax(m);
 
 
  678  int_var_container_.MutableElement(var)->SetRange(l, u);
 
 
  682  int_var_container_.MutableElement(var)->SetValue(value);
 
 
  688  return interval_var_container_.Add(var);
 
 
  698  return interval_var_container_.FastAdd(var);
 
 
  702  return interval_var_container_.Element(var).StartMin();
 
 
  706  return interval_var_container_.Element(var).StartMax();
 
 
  710  return interval_var_container_.Element(var).StartValue();
 
 
  714  return interval_var_container_.Element(var).DurationMin();
 
 
  718  return interval_var_container_.Element(var).DurationMax();
 
 
  722  return interval_var_container_.Element(var).DurationValue();
 
 
  726  return interval_var_container_.Element(var).EndMin();
 
 
  730  return interval_var_container_.Element(var).EndMax();
 
 
  734  return interval_var_container_.Element(var).EndValue();
 
 
  738  return interval_var_container_.Element(var).PerformedMin();
 
 
  742  return interval_var_container_.Element(var).PerformedMax();
 
 
  746  return interval_var_container_.Element(var).PerformedValue();
 
 
  750  interval_var_container_.MutableElement(var)->SetStartMin(m);
 
 
  754  interval_var_container_.MutableElement(var)->SetStartMax(m);
 
 
  759  interval_var_container_.MutableElement(var)->SetStartRange(mi, ma);
 
 
  763  interval_var_container_.MutableElement(var)->SetStartValue(value);
 
 
  767  interval_var_container_.MutableElement(var)->SetDurationMin(m);
 
 
  771  interval_var_container_.MutableElement(var)->SetDurationMax(m);
 
 
  776  interval_var_container_.MutableElement(var)->SetDurationRange(mi, ma);
 
 
  780  interval_var_container_.MutableElement(var)->SetDurationValue(value);
 
 
  784  interval_var_container_.MutableElement(var)->SetEndMin(m);
 
 
  788  interval_var_container_.MutableElement(var)->SetEndMax(m);
 
 
  793  interval_var_container_.MutableElement(var)->SetEndRange(mi, ma);
 
 
  797  interval_var_container_.MutableElement(var)->SetEndValue(value);
 
 
  801  interval_var_container_.MutableElement(var)->SetPerformedMin(m);
 
 
  805  interval_var_container_.MutableElement(var)->SetPerformedMax(m);
 
 
  810  interval_var_container_.MutableElement(var)->SetPerformedRange(mi, ma);
 
 
  815  interval_var_container_.MutableElement(var)->SetPerformedValue(value);
 
 
  821  return sequence_var_container_.Add(var);
 
 
  831  return sequence_var_container_.FastAdd(var);
 
 
  836  return sequence_var_container_.Element(var).ForwardSequence();
 
 
  841  return sequence_var_container_.Element(var).BackwardSequence();
 
 
  846  return sequence_var_container_.Element(var).Unperformed();
 
 
  850                             const std::vector<int>& forward_sequence,
 
  851                             const std::vector<int>& backward_sequence,
 
  852                             const std::vector<int>& unperformed) {
 
  853  sequence_var_container_.MutableElement(var)->SetSequence(
 
  854      forward_sequence, backward_sequence, unperformed);
 
 
  858                                    const std::vector<int>& forward_sequence) {
 
  859  sequence_var_container_.MutableElement(var)->SetForwardSequence(
 
 
  864    const SequenceVar* 
const var, 
const std::vector<int>& backward_sequence) {
 
  865  sequence_var_container_.MutableElement(var)->SetBackwardSequence(
 
 
  870                                const std::vector<int>& unperformed) {
 
  871  sequence_var_container_.MutableElement(var)->SetUnperformed(unperformed);
 
 
  875  int_var_container_.MutableElement(var)->Activate();
 
 
  879  int_var_container_.MutableElement(var)->Deactivate();
 
 
  883  return int_var_container_.Element(var).Activated();
 
 
  887  interval_var_container_.MutableElement(var)->Activate();
 
 
  891  interval_var_container_.MutableElement(var)->Deactivate();
 
 
  895  return interval_var_container_.Element(var).Activated();
 
 
  899  sequence_var_container_.MutableElement(var)->Activate();
 
 
  903  sequence_var_container_.MutableElement(var)->Deactivate();
 
 
  907  return sequence_var_container_.Element(var).Activated();
 
 
  911  return int_var_container_.Contains(var);
 
 
  915  return interval_var_container_.Contains(var);
 
 
  919  return sequence_var_container_.Contains(var);
 
 
  923  int_var_container_.CopyIntersection(assignment->int_var_container_);
 
  924  interval_var_container_.CopyIntersection(assignment->interval_var_container_);
 
  925  sequence_var_container_.CopyIntersection(assignment->sequence_var_container_);
 
  926  for (
int i = 0; i < objective_elements_.size(); i++) {
 
  927    if (i >= assignment->objective_elements_.size() ||
 
  931        objective_elements_[i].Var() !=
 
  932            assignment->objective_elements_[i].Var()) {
 
  935    objective_elements_[i] = assignment->objective_elements_[i];
 
 
  941  int_var_container_.Copy(assignment->int_var_container_);
 
  942  interval_var_container_.Copy(assignment->interval_var_container_);
 
  943  sequence_var_container_.Copy(assignment->sequence_var_container_);
 
  944  objective_elements_ = assignment->objective_elements_;
 
 
  948                                 const std::vector<IntVar*>& target_vars,
 
  950                                 const std::vector<IntVar*>& source_vars) {
 
  951  const int vars_size = target_vars.size();
 
  952  CHECK_EQ(source_vars.size(), vars_size);
 
  953  CHECK(target_assignment != 
nullptr);
 
  954  CHECK(source_assignment != 
nullptr);
 
  956  target_assignment->
Clear();
 
  957  const Solver* 
const target_solver = target_assignment->
solver();
 
  958  const Solver* 
const source_solver = source_assignment->
solver();
 
  959  for (
int index = 0; index < vars_size; index++) {
 
  960    IntVar* target_var = target_vars[index];
 
  961    CHECK_EQ(target_var->
solver(), target_solver);
 
  962    IntVar* source_var = source_vars[index];
 
  963    CHECK_EQ(source_var->
solver(), source_solver);
 
  964    target_assignment->
Add(target_var)
 
 
  979  explicit RestoreAssignment(
Assignment* assignment)
 
  980      : assignment_(assignment) {}
 
  982  ~RestoreAssignment()
 override {}
 
  984  Decision* 
Next(Solver* 
const )
 override {
 
  985    assignment_->Restore();
 
  989  std::string DebugString()
 const override { 
return "RestoreAssignment"; }
 
  992  Assignment* 
const assignment_;
 
  997  explicit StoreAssignment(Assignment* assignment) : assignment_(assignment) {}
 
  999  ~StoreAssignment()
 override {}
 
 1001  Decision* 
Next(Solver* 
const )
 override {
 
 1002    assignment_->Store();
 
 1006  std::string DebugString()
 const override { 
return "StoreAssignment"; }
 
 1009  Assignment* 
const assignment_;
 
 1014  return RevAlloc(
new RestoreAssignment(assignment));
 
 
 1018  return RevAlloc(
new StoreAssignment(assignment));
 
 
E * MutableElement(const V *const var)
 
int objective_size() const
repeated .operations_research.IntVarAssignment objective = 3;
 
::operations_research::SequenceVarAssignment *PROTOBUF_NONNULL add_sequence_var_assignment()
 
const ::operations_research::SequenceVarAssignment & sequence_var_assignment(int index) const
 
ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL
 
int interval_var_assignment_size() const
repeated .operations_research.IntervalVarAssignment interval_var_assignment = 2;
 
const ::operations_research::IntVarAssignment & objective(int index) const
 
::operations_research::IntervalVarAssignment *PROTOBUF_NONNULL add_interval_var_assignment()
 
const ::operations_research::IntervalVarAssignment & interval_var_assignment(int index) const
 
int int_var_assignment_size() const
repeated .operations_research.IntVarAssignment int_var_assignment = 1;
 
::operations_research::IntVarAssignment *PROTOBUF_NONNULL add_int_var_assignment()
 
int sequence_var_assignment_size() const
repeated .operations_research.SequenceVarAssignment sequence_var_assignment = 6;
 
::operations_research::IntVarAssignment *PROTOBUF_NONNULL add_objective()
 
const ::operations_research::IntVarAssignment & int_var_assignment(int index) const
 
void Activate(const IntVar *var)
 
Assignment(Solver *solver)
 
void SetPerformedRange(const IntervalVar *var, int64_t mi, int64_t ma)
 
AssignmentContainer< SequenceVar, SequenceVarElement > SequenceContainer
 
int64_t Value(const IntVar *var) const
 
void SetStartMax(const IntervalVar *var, int64_t m)
 
void SetMax(const IntVar *var, int64_t m)
 
void SetForwardSequence(const SequenceVar *var, const std::vector< int > &forward_sequence)
 
int64_t EndMin(const IntervalVar *var) const
 
bool Activated(const IntVar *var) const
 
int64_t DurationMax(const IntervalVar *var) const
 
int64_t PerformedMin(const IntervalVar *var) const
 
int64_t Max(const IntVar *var) const
 
void SetBackwardSequence(const SequenceVar *var, const std::vector< int > &backward_sequence)
 
int64_t Min(const IntVar *var) const
 
void SetEndValue(const IntervalVar *var, int64_t value)
 
bool Contains(const IntVar *var) const
 
void SetValue(const IntVar *var, int64_t value)
 
void SetEndMin(const IntervalVar *var, int64_t m)
 
bool Load(const std::string &filename)
 
int64_t EndValue(const IntervalVar *var) const
 
void SetMin(const IntVar *var, int64_t m)
 
void DeactivateObjectiveFromIndex(int index)
 
const std::vector< int > & Unperformed(const SequenceVar *var) const
 
void SetPerformedValue(const IntervalVar *var, int64_t value)
 
int64_t PerformedValue(const IntervalVar *var) const
 
int64_t StartValue(const IntervalVar *var) const
 
IntVarElement * Add(IntVar *var)
 
void SetPerformedMax(const IntervalVar *var, int64_t m)
 
void ActivateObjectiveFromIndex(int index)
 
int64_t ObjectiveMinFromIndex(int index) const
 
std::string DebugString() const override
 
int64_t EndMax(const IntervalVar *var) const
 
int64_t StartMin(const IntervalVar *var) const
 
IntVarElement * FastAdd(IntVar *var)
Adds without checking if variable has been previously added.
 
void Deactivate(const IntVar *var)
 
void Copy(const Assignment *assignment)
 
const std::vector< int > & ForwardSequence(const SequenceVar *var) const
 
void SetRange(const IntVar *var, int64_t l, int64_t u)
 
int64_t ObjectiveMaxFromIndex(int index) const
 
bool ActivatedObjectiveFromIndex(int index) const
 
int64_t DurationMin(const IntervalVar *var) const
 
bool Bound(const IntVar *var) const
 
int64_t DurationValue(const IntervalVar *var) const
 
AssignmentContainer< IntervalVar, IntervalVarElement > IntervalContainer
 
void SetSequence(const SequenceVar *var, const std::vector< int > &forward_sequence, const std::vector< int > &backward_sequence, const std::vector< int > &unperformed)
 
void SetStartMin(const IntervalVar *var, int64_t m)
 
void SetDurationMin(const IntervalVar *var, int64_t m)
 
void SetStartValue(const IntervalVar *var, int64_t value)
 
void SetDurationMax(const IntervalVar *var, int64_t m)
 
void SetEndMax(const IntervalVar *var, int64_t m)
 
void SetStartRange(const IntervalVar *var, int64_t mi, int64_t ma)
 
void SetDurationValue(const IntervalVar *var, int64_t value)
 
void CopyIntersection(const Assignment *assignment)
 
void SetEndRange(const IntervalVar *var, int64_t mi, int64_t ma)
 
void SetDurationRange(const IntervalVar *var, int64_t mi, int64_t ma)
 
bool HasObjectiveFromIndex(int index) const
 
int64_t StartMax(const IntervalVar *var) const
 
IntVar * ObjectiveFromIndex(int index) const
 
bool Save(const std::string &filename) const
Saves the assignment to a file.
 
const std::vector< int > & BackwardSequence(const SequenceVar *var) const
 
void SetPerformedMin(const IntervalVar *var, int64_t m)
 
void SetObjectiveRangeFromIndex(int index, int64_t l, int64_t u)
 
void SetUnperformed(const SequenceVar *var, const std::vector< int > &unperformed)
 
int64_t PerformedMax(const IntervalVar *var) const
 
void set_max(::int64_t value)
 
const ::std::string & var_id() const
 
void set_active(bool value)
 
void set_var_id(Arg_ &&arg, Args_... args)
 
void set_min(::int64_t value)
 
bool operator==(const IntVarElement &element) const
 
void SetRange(int64_t l, int64_t u)
 
IntVarElement()
--------------— Solutions ---------------------—
 
std::string DebugString() const
 
void Copy(const IntVarElement &element)
 
void WriteToProto(IntVarAssignment *int_var_assignment_proto) const
 
void LoadFromProto(const IntVarAssignment &int_var_assignment_proto)
 
void set_end_max(::int64_t value)
 
::int64_t start_min() const
 
::int64_t duration_max() const
 
::int64_t performed_max() const
 
void set_duration_max(::int64_t value)
 
void set_end_min(::int64_t value)
 
::int64_t duration_min() const
 
void set_var_id(Arg_ &&arg, Args_... args)
 
::int64_t start_max() const
 
void set_active(bool value)
 
void set_start_min(::int64_t value)
 
void set_performed_max(::int64_t value)
 
void set_duration_min(::int64_t value)
 
void set_performed_min(::int64_t value)
 
void set_start_max(::int64_t value)
 
::int64_t performed_min() const
 
::int64_t end_min() const
 
::int64_t end_max() const
 
void SetDurationRange(int64_t mi, int64_t ma)
 
IntervalVarElement * Clone()
 
std::string DebugString() const
 
void WriteToProto(IntervalVarAssignment *interval_var_assignment_proto) const
 
void Reset(IntervalVar *var)
 
void Copy(const IntervalVarElement &element)
 
void SetEndRange(int64_t mi, int64_t ma)
 
IntervalVarElement()
--— IntervalVarElement --—
 
bool operator==(const IntervalVarElement &element) const
 
void SetStartRange(int64_t mi, int64_t ma)
 
void SetPerformedRange(int64_t mi, int64_t ma)
 
void LoadFromProto(const IntervalVarAssignment &interval_var_assignment_proto)
 
virtual std::string name() const
Object naming.
 
PropagationBaseObject(Solver *const s)
 
void set_active(bool value)
 
::int32_t forward_sequence(int index) const
 
void add_forward_sequence(::int32_t value)
 
::int32_t backward_sequence(int index) const
 
void set_var_id(Arg_ &&arg, Args_... args)
 
void add_backward_sequence(::int32_t value)
 
void add_unperformed(::int32_t value)
 
::int32_t unperformed(int index) const
 
void Reset(SequenceVar *var)
 
void WriteToProto(SequenceVarAssignment *sequence_var_assignment_proto) const
 
bool operator==(const SequenceVarElement &element) const
 
std::string DebugString() const
 
SequenceVarElement * Clone()
 
SequenceVarElement()
--— SequenceVarElement --—
 
void SetUnperformed(const std::vector< int > &unperformed)
 
const std::vector< int > & ForwardSequence() const
 
void Copy(const SequenceVarElement &element)
 
void SetBackwardSequence(const std::vector< int > &backward_sequence)
 
const std::vector< int > & BackwardSequence() const
 
void SetSequence(const std::vector< int > &forward_sequence, const std::vector< int > &backward_sequence, const std::vector< int > &unperformed)
 
void SetForwardSequence(const std::vector< int > &forward_sequence)
 
void LoadFromProto(const SequenceVarAssignment &sequence_var_assignment_proto)
 
const std::vector< int > & Unperformed() const
 
void FillSequence(std::vector< int > *rank_first, std::vector< int > *rank_last, std::vector< int > *unperformed) const
 
For the time being, Solver is neither MT_SAFE nor MT_HOT.
 
DecisionBuilder * MakeRestoreAssignment(Assignment *assignment)
 
DecisionBuilder * MakeStoreAssignment(Assignment *assignment)
 
Assignment * MakeAssignment()
This method creates an empty assignment.
 
bool Close()
Closes the underlying file.
 
bool ReadProtocolMessage(P *const proto)
 
bool Close()
Closes the underlying file.
 
bool WriteProtocolMessage(const P &proto)
 
absl::Status Open(absl::string_view file_name, absl::string_view mode, File **f, Options options)
As of 2016-01, these methods can only be used with flags = file::Defaults().
 
bool FindCopy(const Collection &collection, const Key &key, Value *const value)
 
void StoreAssignment(const VariablesAssignment &assignment, BooleanAssignment *output)
 
In SWIG mode, we don't want anything besides these top-level includes.
 
void RealLoad(const AssignmentProto &assignment_proto, Container *const container, int(AssignmentProto::*GetSize)() const, const Proto &(AssignmentProto::*GetElem)(int) const)
 
std::ostream & operator<<(std::ostream &out, const Assignment &assignment)
 
void RealDebugString(const Container &container, std::string *const out)
 
void SetAssignmentFromAssignment(Assignment *target_assignment, const std::vector< IntVar * > &target_vars, const Assignment *source_assignment, const std::vector< IntVar * > &source_vars)
NOLINT.
 
void RealSave(AssignmentProto *const assignment_proto, const Container &container, Proto *(AssignmentProto::*Add)())