14#ifndef OR_TOOLS_SET_COVER_SET_COVER_VIEWS_H
15#define OR_TOOLS_SET_COVER_SET_COVER_VIEWS_H
17#include <absl/meta/type_traits.h>
46#define ENABLE_EXPLICIT_STRONG_TYPE_CAST(FROM, TO) \
47 constexpr TO StrongIntConvert(FROM j, TO* ) { \
48 return TO(static_cast<FROM::ValueType>(j)); \
84 struct SparseColTransform {
87 ElementIndex, ColumnEntryIndex,
94 struct SparseRowTransform {
96 SubsetIndex, RowEntryIndex,
111 return {&model_->subset_costs()};
115 SparseColTransform> {
116 return {&model_->columns()};
119 SparseRowTransform> {
120 return {&model_->rows()};
123 return {FullSubsetIndex(), FullSubsetIndex(
num_subsets())};
126 return {FullElementIndex(), FullElementIndex(
num_elements())};
140 const std::vector<SubsetIndex>* cols_focus,
141 const std::vector<ElementIndex>* rows_focus)
143 cols_sizes_(cols_sizes),
144 rows_sizes_(rows_sizes),
145 cols_focus_(cols_focus),
146 rows_focus_(rows_focus) {}
154 return {&model_->subset_costs(), cols_focus_};
159 return {{&model_->columns(), cols_focus_}, rows_sizes_};
163 return {{&model_->rows(), rows_focus_}, cols_sizes_};
165 const std::vector<SubsetIndex>&
SubsetRange()
const {
return *cols_focus_; }
166 const std::vector<ElementIndex>&
ElementRange()
const {
return *rows_focus_; }
168 DCHECK(ElementIndex() <= core_i && core_i < ElementIndex(
num_elements()));
169 return static_cast<FullElementIndex
>(core_i);
172 DCHECK(FullElementIndex() <= full_i &&
174 return static_cast<ElementIndex
>(full_i);
177 DCHECK(SubsetIndex() <= core_j && core_j < SubsetIndex(
num_subsets()));
178 return static_cast<FullSubsetIndex
>(core_j);
181 DCHECK(SubsetIndex() <= j && j < SubsetIndex(
num_subsets()));
182 return (*cols_sizes_)[j];
185 DCHECK(ElementIndex() <= i && i < ElementIndex(
num_elements()));
186 return (*rows_sizes_)[i];
194 const std::vector<SubsetIndex>* cols_focus_;
195 const std::vector<ElementIndex>* rows_focus_;
210 is_focus_col_(cols_sizes),
211 is_focus_row_(rows_sizes),
222 return {&model_->subset_costs(), is_focus_col_};
227 return {{&model_->columns(), is_focus_col_}, is_focus_row_};
232 return {{&model_->rows(), is_focus_row_}, is_focus_col_};
236 return {is_focus_col_};
240 return {is_focus_row_};
242 bool IsFocusCol(SubsetIndex j)
const {
return (*is_focus_col_)[j]; }
243 bool IsFocusRow(ElementIndex i)
const {
return (*is_focus_row_)[i]; }
auto ElementRange() const -> util_intops::FilterIndexRangeView< ElementIndex, ElementBoolVector >
BaseInt num_subsets() const
BaseInt num_focus_elements() const
const SetCoverModel & base() const
bool IsFocusCol(SubsetIndex j) const
auto columns() const -> util_intops::TwoLevelsView< util_intops::IndexFilterView< SparseColumn, SubsetBoolVector >, ElementBoolVector >
FilterModelView(const SetCoverModel *model, const SubsetBoolVector *cols_sizes, const ElementBoolVector *rows_sizes, BaseInt num_subsets, BaseInt num_elements)
bool IsFocusRow(ElementIndex i) const
auto rows() const -> util_intops::TwoLevelsView< util_intops::IndexFilterView< SparseRow, ElementBoolVector >, SubsetBoolVector >
BaseInt num_elements() const
FilterModelView()=default
auto SubsetRange() const -> util_intops::FilterIndexRangeView< SubsetIndex, SubsetBoolVector >
auto subset_costs() const -> util_intops::IndexFilterView< Cost, SubsetBoolVector >
BaseInt num_focus_subsets() const
BaseInt column_size(SubsetIndex j) const
auto columns() const -> util_intops::TwoLevelsView< util_intops::IndexListView< SparseColumn, SubsetIndex >, ElementToIntVector >
BaseInt num_focus_subsets() const
IndexListModelView()=default
const SetCoverModel & base() const
FullSubsetIndex MapCoreToFullSubsetIndex(SubsetIndex core_j) const
IndexListModelView(const SetCoverModel *model, const SubsetToIntVector *cols_sizes, const ElementToIntVector *rows_sizes, const std::vector< SubsetIndex > *cols_focus, const std::vector< ElementIndex > *rows_focus)
BaseInt num_subsets() const
BaseInt num_focus_elements() const
FullElementIndex MapCoreToFullElementIndex(ElementIndex core_i) const
BaseInt row_size(ElementIndex i) const
auto rows() const -> util_intops::TwoLevelsView< util_intops::IndexListView< SparseRow, ElementIndex >, SubsetToIntVector >
const std::vector< ElementIndex > & ElementRange() const
auto subset_costs() const -> util_intops::IndexListView< Cost, SubsetIndex >
const std::vector< SubsetIndex > & SubsetRange() const
ElementIndex MapFullToCoreElementIndex(FullElementIndex full_i) const
BaseInt num_elements() const
Main class for describing a weighted set-covering problem.
auto rows() const -> util_intops::TransformView< SparseRow, FullElementIndex, SparseRowTransform >
StrongModelView()=default
auto SubsetRange() const -> util_intops::StrongIntRange< FullSubsetIndex >
BaseInt num_subsets() const
BaseInt num_elements() const
auto ElementRange() const -> util_intops::StrongIntRange< FullElementIndex >
StrongModelView(const SetCoverModel *model)
auto subset_costs() const -> util_intops::TransformView< Cost, FullSubsetIndex >
const SetCoverModel & base() const
auto columns() const -> util_intops::TransformView< SparseColumn, FullSubsetIndex, SparseColTransform >
In SWIG mode, we don't want anything besides these top-level includes.
util_intops::StrongVector< FullElementIndex, BaseInt > FullElementToIntVector
util_intops::StrongVector< SubsetIndex, FullSubsetIndex > CoreToFullSubsetMapVector
util_intops::StrongVector< FullSubsetIndex, SubsetIndex > FullToCoreSubsetMapVector
util_intops::StrongVector< RowEntryIndex, SubsetIndex > SparseRow
util_intops::StrongVector< FullElementIndex, ElementIndex > FullToCoreElementMapVector
util_intops::StrongVector< FullElementIndex, Cost > FullElementCostVector
util_intops::StrongVector< ElementIndex, FullElementIndex > CoreToFullElementMapVector
util_intops::StrongVector< FullSubsetIndex, bool > FullSubsetBoolVector
util_intops::StrongVector< FullSubsetIndex, BaseInt > FullSubsetToIntVector
util_intops::StrongVector< SubsetIndex, BaseInt > SubsetToIntVector
util_intops::StrongVector< FullSubsetIndex, Cost > FullSubsetCostVector
util_intops::StrongVector< ElementIndex, BaseInt > ElementToIntVector
util_intops::StrongVector< SubsetIndex, bool > SubsetBoolVector
util_intops::StrongVector< FullElementIndex, bool > FullElementBoolVector
util_intops::StrongVector< ElementIndex, bool > ElementBoolVector
double Cost
Basic non-strict type for cost. The speed penalty for using double is ~2%.
util_intops::StrongVector< ColumnEntryIndex, ElementIndex > SparseColumn
#define ENABLE_EXPLICIT_STRONG_TYPE_CAST(FROM, TO)
#define DEFINE_STRONG_INT_TYPE(type_name, value_type)