@@ -183,6 +183,7 @@ void SetCoverModel::UpdateAllSubsetsList() {
183183}
184184
185185void SetCoverModel::AddEmptySubset (Cost cost) {
186+ elements_in_subsets_are_sorted_ = false ;
186187 subset_costs_.push_back (cost);
187188 columns_.push_back (SparseColumn ());
188189 all_subsets_.push_back (SubsetIndex (num_subsets_));
@@ -194,6 +195,7 @@ void SetCoverModel::AddEmptySubset(Cost cost) {
194195}
195196
196197void SetCoverModel::AddElementToLastSubset (BaseInt element) {
198+ elements_in_subsets_are_sorted_ = false ;
197199 columns_.back ().push_back (ElementIndex (element));
198200 num_elements_ = std::max (num_elements_, element + 1 );
199201 // No need to update the list all_subsets_.
@@ -206,6 +208,7 @@ void SetCoverModel::AddElementToLastSubset(ElementIndex element) {
206208}
207209
208210void SetCoverModel::SetSubsetCost (BaseInt subset, Cost cost) {
211+ elements_in_subsets_are_sorted_ = false ;
209212 CHECK (std::isfinite (cost));
210213 DCHECK_GE (subset, 0 );
211214 if (subset >= num_subsets ()) {
@@ -223,6 +226,7 @@ void SetCoverModel::SetSubsetCost(SubsetIndex subset, Cost cost) {
223226}
224227
225228void SetCoverModel::AddElementToSubset (BaseInt element, BaseInt subset) {
229+ elements_in_subsets_are_sorted_ = false ;
226230 if (subset >= num_subsets ()) {
227231 num_subsets_ = subset + 1 ;
228232 subset_costs_.resize (num_subsets_, 0.0 );
@@ -264,6 +268,13 @@ void SetCoverModel::ReserveNumElementsInSubset(ElementIndex num_elements,
264268 ReserveNumElementsInSubset (num_elements.value (), subset.value ());
265269}
266270
271+ void SetCoverModel::SortElementsInSubsets () {
272+ for (const SubsetIndex subset : SubsetRange ()) {
273+ std::sort (columns_[subset].begin (), columns_[subset].end ());
274+ }
275+ elements_in_subsets_are_sorted_ = true ;
276+ }
277+
267278void SetCoverModel::CreateSparseRowView () {
268279 if (row_view_is_valid_) {
269280 return ;
@@ -287,6 +298,7 @@ void SetCoverModel::CreateSparseRowView() {
287298 }
288299 }
289300 row_view_is_valid_ = true ;
301+ elements_in_subsets_are_sorted_ = true ;
290302}
291303
292304bool SetCoverModel::ComputeFeasibility () const {
@@ -319,13 +331,15 @@ bool SetCoverModel::ComputeFeasibility() const {
319331 return true ;
320332}
321333
322- SetCoverProto SetCoverModel::ExportModelAsProto () {
334+ SetCoverProto SetCoverModel::ExportModelAsProto () const {
335+ CHECK (elements_in_subsets_are_sorted_);
323336 SetCoverProto message;
324337 for (const SubsetIndex subset : SubsetRange ()) {
325338 SetCoverProto::Subset* subset_proto = message.add_subset ();
326339 subset_proto->set_cost (subset_costs_[subset]);
327- std::sort (columns_[subset].begin (), columns_[subset].end ());
328- for (const ElementIndex element : columns_[subset]) {
340+ SparseColumn column = columns_[subset];
341+ std::sort (column.begin (), column.end ());
342+ for (const ElementIndex element : column) {
329343 subset_proto->add_element (element.value ());
330344 }
331345 }
@@ -433,8 +447,9 @@ std::vector<T> ComputeDeciles(std::vector<T> values) {
433447 const int kNumDeciles = 10 ;
434448 std::vector<T> deciles;
435449 deciles.reserve (kNumDeciles );
450+ const float step = values.size () / kNumDeciles ;
436451 for (int i = 1 ; i <= kNumDeciles ; ++i) {
437- const size_t point = values. size () * i / kNumDeciles - 1 ;
452+ const size_t point = std::max< float >( 0 , i * step - 1 ) ;
438453 std::nth_element (values.begin (), values.begin () + point, values.end ());
439454 deciles.push_back (values[point]);
440455 }
0 commit comments