34 return compact_map_[result] == sparse_index ? result : -1;
58 ReverseN(&sparse_size,
sizeof(sparse_size));
60 if (sparse_size > UINT16_MAX)
return false;
76 Init(sparse_size,
false);
77 for (
int i = start; i < end; ++i)
89 for (
int i = 0; i < size; ++i)
96 sparse_map_[sparse_index] = mapped ? 0 : -1;
103 int compact_size = 0;
104 for (
int i = 0; i < sparse_map_.
size(); ++i) {
105 if (sparse_map_[i] >= 0) {
106 sparse_map_[i] = compact_size++;
110 for (
int i = 0; i < sparse_map_.
size(); ++i) {
111 if (sparse_map_[i] >= 0) {
120 sparse_map_ = src.sparse_map_;
130 compact_index1 = MasterCompactIndex(compact_index1);
131 compact_index2 = MasterCompactIndex(compact_index2);
133 if (compact_index1 > compact_index2) {
134 int tmp = compact_index1;
135 compact_index1 = compact_index2;
136 compact_index2 = tmp;
137 }
else if (compact_index1 == compact_index2) {
144 sparse_map_[
compact_map_[compact_index2]] = compact_index1;
145 if (compact_index1 >= 0)
162 int compact_size = 0;
163 for (
int i = 0; i < sparse_map_.
size(); ++i) {
164 int compact_index = MasterCompactIndex(sparse_map_[i]);
165 sparse_map_[i] = compact_index;
166 if (compact_index >= compact_size)
167 compact_size = compact_index + 1;
171 for (
int i = 0; i < sparse_map_.
size(); ++i) {
172 if (sparse_map_[i] >= 0) {
184 tmp_compact_map[i] = compact_size;
190 for (
int i = 0; i < sparse_map_.
size(); ++i) {
191 if (sparse_map_[i] >= 0) {
192 sparse_map_[i] = tmp_compact_map[sparse_map_[i]];
204 for (
int i = 0; i < sparse_map_.
size(); ++i) {
205 if (sparse_map_[i] >= 0 &&
compact_map_[sparse_map_[i]] != i) {
207 remaining_pairs.
push_back(sparse_map_[i]);
210 if (!remaining_pairs.
Serialize(fp))
return false;
219 if (!remaining_pairs.
DeSerialize(swap, fp))
return false;
224 for (
int i = 0; i < remaining_pairs.
size(); ++i) {
225 int sparse_index = remaining_pairs[i++];
226 sparse_map_[sparse_index] = remaining_pairs[i];
239 int num_features = sparse.
size();
240 int missed_features = 0;
241 int prev_good_feature = -1;
242 for (
int f = 0; f < num_features; ++f) {
243 int feature = sparse_map_[sparse[f]];
245 if (feature != prev_good_feature) {
247 prev_good_feature = feature;
253 return missed_features;