4 #include <unordered_map> 15 #define MAP_ANONYMOUS MAP_ANON 22 typedef std::unordered_map<uint64_t, weight*>
weight_map;
38 sparse_iterator(weight_map::iterator& iter, uint32_t stride) : _iter(iter), _stride(stride) {}
46 uint64_t
index() {
return _iter->first; }
85 , default_data(nullptr)
88 default_value = calloc_mergable_or_throw<weight>(stride());
92 : _map(), _weight_mask(0), _stride_shift(0), _seeded(false), _delete(false), default_data(nullptr), fun(nullptr)
94 default_value = calloc_mergable_or_throw<weight>(stride());
97 bool not_null() {
return (_weight_mask > 0 && !_map.empty()); }
107 weight_map::iterator i = _map.begin();
108 return iterator(i, stride());
112 weight_map::iterator i = _map.end();
113 return iterator(i, stride());
119 weight_map::iterator i = _map.begin();
120 return const_iterator(i, stride());
124 weight_map::iterator i = _map.begin();
125 return const_iterator(i, stride());
130 uint64_t
index = i & _weight_mask;
131 weight_map::iterator iter = _map.find(index);
132 if (iter == _map.end())
134 _map.insert(std::make_pair(index, calloc_mergable_or_throw<weight>(stride())));
135 iter = _map.find(index);
137 fun(iter->second, default_data);
139 return *(iter->second);
144 uint64_t
index = i & _weight_mask;
145 weight_map::const_iterator iter = _map.find(index);
146 if (iter == _map.end())
147 return *default_value;
148 return *(iter->second);
158 for (
auto iter = _map.begin(); iter != _map.end(); ++iter) free(iter->second);
164 default_value = calloc_mergable_or_throw<weight>(stride());
170 template <
class R,
class T>
173 R& new_R = calloc_or_throw<R>();
175 default_data = &new_R;
176 fun = (void (*)(
const weight*,
void*))T::func;
177 fun(default_value, default_data);
183 fun = (void (*)(
const weight*,
void*))T::func;
188 for (weight_map::iterator iter = _map.begin(); iter != _map.end(); ++iter) (&(*(iter->second)))[offset] = 0;
191 uint64_t
mask()
const {
return _weight_mask; }
193 uint64_t
seeded()
const {
return _seeded; }
195 uint32_t
stride()
const {
return 1 << _stride_shift; }
203 default_value = calloc_mergable_or_throw<weight>(stride());
205 fun(default_value, default_data);
214 if (!_delete && !_seeded)
216 for (
auto iter = _map.begin(); iter != _map.end(); ++iter) free(iter->second);
220 if (default_data !=
nullptr)
239 return sparse_weights[i];
241 return dense_weights[i];
255 return sparse_weights.
stride();
257 return dense_weights.
stride();
263 return sparse_weights.
mask();
265 return dense_weights.
mask();
271 return sparse_weights.
seeded();
273 return dense_weights.
seeded();
292 #ifndef DISABLE_SHARED_WEIGHTS 296 sparse_weights.
share(length);
298 dense_weights.
share(length);
const weight & operator[](size_t i) const
void stride_shift(uint32_t stride_shift)
weight & operator[](size_t i)
uint64_t stride_shift(const stagewise_poly &poly, uint64_t idx)
bool operator!=(const sparse_iterator &rhs) const
uint32_t stride_shift() const
sparse_iterator< weight > iterator
void set_default(R &info)
void shallow_copy(const sparse_parameters &input)
void set_zero(size_t offset)
bool operator==(const sparse_iterator &rhs) const
sparse_iterator & operator++()
weight & strided_index(size_t index)
void stride_shift(uint32_t stride_shift)
void share(size_t length)
sparse_iterator< const weight > const_iterator
void set_zero(size_t offset)
void share(size_t length)
dense_parameters dense_weights
weight & strided_index(size_t index)
void set_zero(size_t offset)
sparse_parameters(const sparse_parameters &other)
sparse_iterator & operator=(const sparse_iterator &other)
ptrdiff_t difference_type
weight & strided_index(size_t index)
std::forward_iterator_tag iterator_category
#define THROW_OR_RETURN(...)
std::unordered_map< uint64_t, weight * > weight_map
sparse_parameters sparse_weights
sparse_parameters(size_t length, uint32_t stride_shift=0)
weight_map::iterator _iter
weight & operator[](size_t i)
void shallow_copy(const parameters &input)
void shallow_copy(const dense_parameters &input)
uint32_t stride_shift() const
sparse_iterator(weight_map::iterator &iter, uint32_t stride)