2 #ifndef OPENGM_LEARNABLE_UNARY_FUNCTION_HXX 3 #define OPENGM_LEARNABLE_UNARY_FUNCTION_HXX 22 template<
class V,
class I>
31 template<
class T,
class I ,
class L>
59 const LabelType numberOfLabels,
62 const bool makeFirstEntryConst
66 L shape(
const size_t)
const;
68 size_t dimension()
const;
69 template<
class ITERATOR> T operator()(ITERATOR)
const;
77 return weightIds_.size();
81 return weightIds_[weightNumber];
84 template<
class ITERATOR>
85 T weightGradient(
size_t,ITERATOR)
const;
93 return offsets_[0*numberOfLabels_ + l];
96 return offsets_[1*numberOfLabels_ + l];
99 return offsets_[2*numberOfLabels_ + l];
115 template <class T, class I, class L>
117 const opengm::learning::Weights<T>& weights,
118 const LabelType numberOfLabels,
119 marray::Marray< size_t > weightIds,
120 marray::Marray< ValueType> features,
121 const bool makeFirstEntryConst
125 numberOfLabels_(numberOfLabels),
126 offsets_(numberOfLabels*3),
130 const size_t pFeatDim = features.
dimension();
131 const size_t pWeightIdDim = weightIds.
dimension();
134 OPENGM_CHECK_OP(weightIds.
shape(0)+int(makeFirstEntryConst), ==, numberOfLabels ,
"wrong shape");
137 const size_t nWeights = weightIds.
size();
138 weightIds_.resize(nWeights);
140 const size_t nFeat = features.
size();
141 features_.resize(nFeat);
148 for(
size_t fi=0; fi<nFeat; ++fi){
152 size_t nwForL = weightIds.
shape(1);
155 if(makeFirstEntryConst){
159 offsets_[0*numberOfLabels_ + 0] = 0;
160 offsets_[1*numberOfLabels_ + 0] = 0;
161 offsets_[2*numberOfLabels_ + 0] = 0;
163 for(LabelType l=1; l<numberOfLabels_; ++l){
164 offsets_[0*numberOfLabels_ + l] = nwForL;
165 offsets_[1*numberOfLabels_ + l] = wOffset;
166 offsets_[2*numberOfLabels_ + l] = 0;
168 for(
size_t wi=0; wi<nwForL; ++wi){
169 weightIds_[wOffset + wi] =
weightIds(l-1,wi);
176 for(LabelType l=0; l<numberOfLabels_; ++l){
178 offsets_[0*numberOfLabels_ + l] = nwForL;
179 offsets_[1*numberOfLabels_ + l] = wOffset;
180 offsets_[2*numberOfLabels_ + l] = 0;
182 for(
size_t wi=0; wi<nwForL; ++wi){
183 weightIds_[wOffset + wi] =
weightIds(l,wi);
191 template <
class T,
class I,
class L>
200 numberOfLabels_(featuresAndIndicesPerLabel.size()),
201 offsets_(featuresAndIndicesPerLabel.size()*3),
211 for(
size_t l=0; l<featuresAndIndicesPerLabel.size(); ++l){
212 const size_t nwForL = featuresAndIndicesPerLabel[l].weightIds.size();
213 const size_t nfForL = featuresAndIndicesPerLabel[l].features.size();
215 "must be the same for a given label within this overload of LUnary<T, I, L>::LUnary");
217 offsets_[0*numberOfLabels_ + l] = nwForL;
218 offsets_[1*numberOfLabels_ + l] = wOffset;
219 offsets_[2*numberOfLabels_ + l] = fOffset;
225 weightIds_.resize(wOffset);
226 features_.resize(fOffset);
229 for(
size_t l=0; l<featuresAndIndicesPerLabel.size(); ++l){
230 const size_t nwForL = numWeightsForL(l);
231 for(
size_t i=0; i<nwForL; ++i){
232 weightIds_[featureOffset(l)+i] = featuresAndIndicesPerLabel[l].weightIds[i];
233 features_[featureOffset(l)+i] = featuresAndIndicesPerLabel[l].features[i];
239 idSet.
reserve(weightIds_.size());
240 idSet.
insert(weightIds_.begin(), weightIds_.end());
247 template <
class T,
class I,
class L>
248 template <
class ITERATOR>
256 "weightNumber must be smaller than number of weights");
257 const LabelType l(*begin);
258 const size_t nwForL = numWeightsForL(l);
260 const size_t wiStart = weightIdOffset(l);
261 const size_t wiEnd = weightIdOffset(l)+nwForL;
262 if(weightNumber >= wiStart && weightNumber < wiEnd ){
263 const size_t wii = weightNumber - wiStart;
264 return features_[featureOffset(l) + wii];
267 return static_cast<ValueType
>(0);
270 template <
class T,
class I,
class L>
271 template <
class ITERATOR>
281 const LabelType l(*begin);
282 const size_t nwForL = numWeightsForL(l);
286 for(
size_t i=0; i<nwForL; ++i){
290 const size_t wi = weightIds_[weightIdOffset(l)+i];
293 val += weights_->
getWeight(wi) * features_[featureOffset(l)+i];
300 template <
class T,
class I,
class L>
306 return numberOfLabels_;
309 template <
class T,
class I,
class L>
315 template <
class T,
class I,
class L>
318 return numberOfLabels_;
326 template<
class T,
class I,
class L>
333 template<
class INDEX_OUTPUT_ITERATOR,
class VALUE_OUTPUT_ITERATOR>
335 template<
class INDEX_INPUT_ITERATOR,
class VALUE_INPUT_ITERATOR>
339 template<
class T,
class I,
class L>
346 template<
class T,
class I,
class L>
358 size += 3*src.
shape(0);
364 template<
class T,
class I,
class L>
373 template<
class T,
class I,
class L>
374 template<
class INDEX_OUTPUT_ITERATOR,
class VALUE_OUTPUT_ITERATOR >
379 INDEX_OUTPUT_ITERATOR indexOutIterator,
380 VALUE_OUTPUT_ITERATOR valueOutIterator
387 *indexOutIterator = src.
shape(0);
395 *indexOutIterator = src.
features_.size();
399 for(
size_t i=0; i<src.
offsets_.size(); ++i){
400 *indexOutIterator = src.
offsets_[i];
405 for(
size_t i=0; i<src.
weightIds_.size(); ++i){
414 for(
size_t i=0; i<src.
features_.size(); ++i){
420 template<
class T,
class I,
class L>
421 template<
class INDEX_INPUT_ITERATOR,
class VALUE_INPUT_ITERATOR >
425 INDEX_INPUT_ITERATOR indexInIterator,
426 VALUE_INPUT_ITERATOR valueInIterator,
443 const size_t nW =*indexInIterator;
449 const size_t nF = *indexInIterator;
455 for(
size_t i=0; i<dst.
offsets_.size(); ++i){
461 for(
size_t i=0; i<dst.
weightIds_.size(); ++i){
470 for(
size_t i=0; i<dst.
features_.size(); ++i){
478 #endif // #ifndef OPENGM_LEARNABLE_FUNCTION_HXX
Fallback implementation of member functions of OpenGM functions.
IndexType numberOfLabels_
T weightGradient(size_t, ITERATOR) const
size_t featureOffset(const LabelType l) const
size_type size() const
number of elements of the set
const opengm::learning::Weights< T > * weights_
size_t numberOfWeights() const
ValueType getWeight(const size_t pi) const
L shape(const size_t) const
I weightIndex(const size_t weightNumber) const
const size_t FUNCTION_TYPE_ID_OFFSET
User-defined function have ids smaller than FUNCTION_TYPE_ID_OFFSET.
size_t numWeightsForL(const LabelType l) const
std::vector< IndexType > offsets_
std::vector< size_t > weightIds_
std::pair< const_iterator, bool > insert(const value_type &)
void reserve(const size_t size)
const size_t dimension() const
Get the dimension.
std::vector< ValueType > features_
size_t weightIdOffset(const LabelType l) const
#define OPENGM_CHECK_OP(A, OP, B, TXT)
Runtime-flexible multi-dimensional array.
void setWeights(const opengm::learning::Weights< T > &weights) const
const size_t shape(const size_t) const
Get the shape in one dimension.
opengm::functions::learnable::LUnary< T, I, L >::ValueType ValueType
std::vector< I > weightIds
std::vector< V > features
const size_t size() const
Get the number of data items.