39 return compact_map_[result] == sparse_index ? result : -1;
65 ReverseN(&sparse_size,
sizeof(sparse_size));
68 if (sparse_size > UINT16_MAX) {
86 Init(sparse_size,
false);
87 for (
int i = start;
i < end; ++
i) {
101 sparse_map_.resize(size, -1);
103 for (
int i = 0;
i < size; ++
i) {
111 sparse_map_[sparse_index] = mapped ? 0 : -1;
118 int compact_size = 0;
119 for (
int &
i : sparse_map_) {
126 for (
size_t i = 0;
i < sparse_map_.size(); ++
i) {
127 if (sparse_map_[
i] >= 0) {
136 sparse_map_ = src.sparse_map_;
146 compact_index1 = MasterCompactIndex(compact_index1);
147 compact_index2 = MasterCompactIndex(compact_index2);
149 if (compact_index1 > compact_index2) {
150 int tmp = compact_index1;
151 compact_index1 = compact_index2;
152 compact_index2 = tmp;
153 }
else if (compact_index1 == compact_index2) {
160 sparse_map_[
compact_map_[compact_index2]] = compact_index1;
161 if (compact_index1 >= 0) {
179 int compact_size = 0;
180 for (
int &
i : sparse_map_) {
181 int compact_index = MasterCompactIndex(
i);
183 if (compact_index >= compact_size) {
184 compact_size = compact_index + 1;
190 for (
size_t i = 0;
i < sparse_map_.size(); ++
i) {
191 if (sparse_map_[
i] >= 0) {
199 std::vector<int32_t> tmp_compact_map(compact_size, -1);
203 tmp_compact_map[
i] = compact_size;
209 for (
int &
i : sparse_map_) {
211 i = tmp_compact_map[
i];
224 std::vector<int32_t> remaining_pairs;
225 for (
unsigned i = 0;
i < sparse_map_.size(); ++
i) {
226 if (sparse_map_[
i] >= 0 &&
static_cast<unsigned>(
compact_map_[sparse_map_[
i]]) !=
i) {
227 remaining_pairs.push_back(
i);
228 remaining_pairs.push_back(sparse_map_[
i]);
240 std::vector<int32_t> remaining_pairs;
249 for (
size_t i = 0;
i < remaining_pairs.size(); ++
i) {
250 int sparse_index = remaining_pairs[
i++];
251 sparse_map_[sparse_index] = remaining_pairs[
i];
263 int num_features = sparse.size();
264 int missed_features = 0;
265 int prev_good_feature = -1;
266 for (
int f = 0; f < num_features; ++f) {
267 int feature = sparse_map_[sparse[f]];
269 if (feature != prev_good_feature) {
270 compact->push_back(feature);
271 prev_good_feature = feature;
277 return missed_features;
void ReverseN(void *ptr, int num_bytes)
bool DeSerialize(bool swap, FILE *fp, std::vector< T > &data)
bool Serialize(FILE *fp, const std::vector< T > &data)
bool Serialize(FILE *fp) const
bool DeSerialize(bool swap, FILE *fp)
void CopyFrom(const IndexMap &src)
virtual int SparseToCompact(int sparse_index) const
std::vector< int32_t > compact_map_
void Init(int size, bool all_mapped)
int MapFeatures(const std::vector< int > &sparse, std::vector< int > *compact) const
bool Merge(int compact_index1, int compact_index2)
void CopyFrom(const IndexMapBiDi &src)
void SetMap(int sparse_index, bool mapped)
int SparseSize() const override
void InitAndSetupRange(int sparse_size, int start, int end)
bool Serialize(FILE *fp) const
bool DeSerialize(bool swap, FILE *fp)