@@ -109,6 +109,21 @@ void InstanceBuilder::set_bin_type_semi_trailer_truck_parameters(
109109 instance_.bin_types_ [bin_type_id].semi_trailer_truck_data = semi_trailer_truck_data;
110110}
111111
112+ void InstanceBuilder::add_bin_type_eligibility (
113+ BinTypeId bin_type_id,
114+ EligibilityId eligibility_id)
115+ {
116+ if (bin_type_id < 0 || bin_type_id >= instance_.bin_types_ .size ()) {
117+ throw std::invalid_argument (
118+ " packingsolver::onedimensional::InstanceBuilder::add_bin_type_eligibility: "
119+ " invalid 'bin_type_id'; "
120+ " bin_type_id: " + std::to_string (bin_type_id) + " ; "
121+ " instance_.bin_types_.size(): " + std::to_string (instance_.bin_types_ .size ()) + " ." );
122+ }
123+
124+ instance_.bin_types_ [bin_type_id].eligibility_ids .push_back (eligibility_id);
125+ }
126+
112127DefectId InstanceBuilder::add_defect (
113128 BinTypeId bin_type_id,
114129 Length pos_x,
@@ -153,6 +168,11 @@ void InstanceBuilder::add_bin_type(
153168 set_bin_type_semi_trailer_truck_parameters (
154169 bin_type_id,
155170 bin_type.semi_trailer_truck_data );
171+ for (EligibilityId eligibility_id: bin_type.eligibility_ids ) {
172+ add_bin_type_eligibility (
173+ bin_type_id,
174+ eligibility_id);
175+ }
156176 for (const Defect& defect: bin_type.defects ) {
157177 add_defect (
158178 bin_type_id,
@@ -276,6 +296,21 @@ void InstanceBuilder::set_item_type_weight(
276296 instance_.item_types_ [item_type_id].weight = weight;
277297}
278298
299+ void InstanceBuilder::set_item_type_eligibility (
300+ ItemTypeId item_type_id,
301+ EligibilityId eligibility_id)
302+ {
303+ if (item_type_id < 0 || item_type_id >= instance_.item_types_ .size ()) {
304+ throw std::invalid_argument (
305+ " packingsolver::onedimensional::InstanceBuilder::set_item_type_eligibility: "
306+ " invalid 'item_type_id'; "
307+ " item_type_id: " + std::to_string (item_type_id) + " ; "
308+ " instance_.item_types_.size(): " + std::to_string (instance_.item_types_ .size ()) + " ." );
309+ }
310+
311+ instance_.item_types_ [item_type_id].eligibility_id = eligibility_id;
312+ }
313+
279314void InstanceBuilder::add_item_type (
280315 const ItemType& item_type,
281316 Profit profit,
@@ -291,6 +326,9 @@ void InstanceBuilder::add_item_type(
291326 set_item_type_weight (
292327 item_type_id,
293328 item_type.weight );
329+ set_item_type_eligibility (
330+ item_type_id,
331+ item_type.eligibility_id );
294332}
295333
296334void InstanceBuilder::set_item_types_unweighted ()
@@ -657,6 +695,25 @@ Instance InstanceBuilder::build()
657695 instance_.number_of_defects_ += bin_type.defects .size ();
658696 }
659697
698+ // Compute bin_type.item_type_ids_.
699+ for (BinTypeId bin_type_id = 0 ; bin_type_id < instance_.number_of_bin_types (); ++bin_type_id) {
700+ BinType& bin_type = instance_.bin_types_ [bin_type_id];
701+ for (ItemTypeId item_type_id = 0 ;
702+ item_type_id < instance_.number_of_item_types ();
703+ ++item_type_id) {
704+ const ItemType& item_type = instance_.item_type (item_type_id);
705+ if (item_type.eligibility_id != -1
706+ && std::find (
707+ bin_type.eligibility_ids .begin (),
708+ bin_type.eligibility_ids .end (),
709+ item_type.eligibility_id )
710+ == bin_type.eligibility_ids .end ()) {
711+ continue ;
712+ }
713+ bin_type.item_type_ids .push_back (item_type_id);
714+ }
715+ }
716+
660717 // Compute number_of_groups_.
661718 for (ItemTypeId item_type_id = 0 ;
662719 item_type_id < instance_.number_of_item_types ();
0 commit comments