You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
211 lines
8.1 KiB
211 lines
8.1 KiB
/*
|
|
* LabeledValues.h
|
|
*
|
|
* Created on: 26.09.2013
|
|
* Author: Christian Dehnert
|
|
*/
|
|
|
|
#ifndef STORM_STORAGE_LABELEDVALUES_H
|
|
#define STORM_STORAGE_LABELEDVALUES_H
|
|
|
|
#include <list>
|
|
#include <boost/container/flat_set.hpp>
|
|
|
|
namespace storm {
|
|
namespace utility {
|
|
template<class ValueType>
|
|
static ValueType constantZero();
|
|
}
|
|
|
|
namespace storage {
|
|
// This class provides the functionality to store a list of values, each of which is labeled with possibly several
|
|
// labels.
|
|
template<class ValueType>
|
|
class LabeledValues {
|
|
public:
|
|
/*!
|
|
* Default-constructs an empty object.
|
|
*/
|
|
explicit LabeledValues() : valueLabelList() {
|
|
// Intentionally left empty.
|
|
}
|
|
|
|
/*!
|
|
* Constructs an object that stores the single probability value without any label.
|
|
*
|
|
* @param value The probability to sto
|
|
*/
|
|
explicit LabeledValues(ValueType value) : valueLabelList() {
|
|
addValue(value);
|
|
}
|
|
|
|
/*!
|
|
* Adds an (unlabeled) value to the list of labeled values.
|
|
*
|
|
* @param value The value to add.
|
|
* @return A reference to the list of labels that is associated with the given value.
|
|
*/
|
|
boost::container::flat_set<uint_fast64_t>& addValue(ValueType value) {
|
|
valueLabelList.emplace_back(value, boost::container::flat_set<uint_fast64_t>());
|
|
return valueLabelList.back().second;
|
|
}
|
|
|
|
/*!
|
|
* Adds a labeled value to the list of labeled values.
|
|
*
|
|
* @param value The value to add.
|
|
* @param labels The labels to associate with this value.
|
|
* @return A reference to the list of labels that is associated with the given value.
|
|
*/
|
|
boost::container::flat_set<uint_fast64_t>& addValue(ValueType value, boost::container::flat_set<uint_fast64_t> const& labels) {
|
|
valueLabelList.emplace_back(value, labels);
|
|
return valueLabelList.back().second;
|
|
}
|
|
|
|
/*!
|
|
* Returns an iterator pointing to the first labeled probability.
|
|
*
|
|
* @return An iterator pointing to the first labeled probability.
|
|
*/
|
|
typename std::list<std::pair<ValueType, boost::container::flat_set<uint_fast64_t>>>::iterator begin() {
|
|
return valueLabelList.begin();
|
|
}
|
|
|
|
/*!
|
|
* Returns an iterator pointing past the last labeled probability.
|
|
*
|
|
* @return An iterator pointing past the last labeled probability.
|
|
*/
|
|
typename std::list<std::pair<ValueType, boost::container::flat_set<uint_fast64_t>>>::const_iterator end() {
|
|
return valueLabelList.end();
|
|
}
|
|
|
|
/*!
|
|
* Returns a const iterator pointing to the first labeled probability.
|
|
*
|
|
* @return A const iterator pointing to the first labeled probability.
|
|
*/
|
|
typename std::list<std::pair<ValueType, boost::container::flat_set<uint_fast64_t>>>::const_iterator begin() const {
|
|
return valueLabelList.begin();
|
|
}
|
|
|
|
/*!
|
|
* Returns a const iterator pointing past the last labeled probability.
|
|
*
|
|
* @return A const iterator pointing past the last labeled probability.
|
|
*/
|
|
typename std::list<std::pair<ValueType, boost::container::flat_set<uint_fast64_t>>>::const_iterator end() const {
|
|
return valueLabelList.end();
|
|
}
|
|
|
|
/*!
|
|
* Inserts the contents of this object to the given output stream.
|
|
*
|
|
* @param out The stream in which to insert the contents.
|
|
*/
|
|
friend std::ostream& operator<<(std::ostream& out, LabeledValues const& labeledValues) {
|
|
out << "[";
|
|
for (auto const& element : labeledValues) {
|
|
out << element.first << " (";
|
|
for (auto const& label : element.second) {
|
|
out << label << ", ";
|
|
}
|
|
out << ") ";
|
|
}
|
|
out << "]";
|
|
return out;
|
|
}
|
|
|
|
/*!
|
|
* Adds all labeled values of the given object to the current one.
|
|
*
|
|
* @param labeledValues The labeled values to add to the object.
|
|
*/
|
|
LabeledValues<ValueType>& operator+=(LabeledValues<ValueType> const& labeledValues) {
|
|
for (auto const& valueLabelListPair : labeledValues) {
|
|
this->valueLabelList.push_back(valueLabelListPair);
|
|
}
|
|
return *this;
|
|
}
|
|
|
|
/*!
|
|
* Divides the values by the given value.
|
|
*
|
|
* @param value The value by which to divide.
|
|
* @return A collection of labeled values that have the same labels as the current object, but whose values
|
|
* are divided by the given one.
|
|
*/
|
|
LabeledValues<ValueType> operator/(ValueType value) const {
|
|
LabeledValues<ValueType> result;
|
|
for (auto const& valueLabelListPair : valueLabelList) {
|
|
result.addValue(valueLabelListPair.first / value, valueLabelListPair.second);
|
|
}
|
|
return result;
|
|
}
|
|
|
|
/*!
|
|
* Divides the values by the given unsigned integer value.
|
|
*
|
|
* @param value The unsigned integer value by which to divide.
|
|
* @return A collection of labeled values that have the same labels as the current object, but whose values
|
|
* are divided by the given one.
|
|
*/
|
|
LabeledValues<ValueType> operator/(uint_fast64_t value) const {
|
|
LabeledValues<ValueType> result;
|
|
for (auto const& valueLabelListPair : valueLabelList) {
|
|
result.addValue(valueLabelListPair.first / value, valueLabelListPair.second);
|
|
}
|
|
return result;
|
|
}
|
|
|
|
/*!
|
|
* Converts the object into the value type by returning the sum.
|
|
*
|
|
* @return The sum of the values.
|
|
*/
|
|
operator ValueType() const {
|
|
return this->getSum();
|
|
}
|
|
|
|
/*!
|
|
* Retrieves the number of separate entries in this object.
|
|
*
|
|
* @return The number of separate entries in this object.
|
|
*/
|
|
size_t size() const {
|
|
return this->valueLabelList.size();
|
|
}
|
|
|
|
private:
|
|
// The actual storage used to store the list of values and the associated labels.
|
|
std::list<std::pair<ValueType, boost::container::flat_set<uint_fast64_t>>> valueLabelList;
|
|
|
|
/*!
|
|
* Returns the sum of the values.
|
|
*
|
|
* @return The sum of the values.
|
|
*/
|
|
ValueType getSum() const {
|
|
ValueType sum = storm::utility::constantZero<ValueType>();
|
|
for (auto const& valueLabelListPair : *this) {
|
|
sum += valueLabelListPair.first;
|
|
}
|
|
return sum;
|
|
}
|
|
};
|
|
|
|
/*!
|
|
* Computes the hash value of a given labeled probabilities object.
|
|
*
|
|
* @param labeledProbabilities The labeled probabilities object for which to compute the hash value.
|
|
* @return A hash value for the labeled probabilities object.
|
|
*/
|
|
template<typename ValueType>
|
|
std::size_t hash_value(LabeledValues<ValueType> const& labeledValues) {
|
|
return labeledValues.size();
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
#endif /* STORM_STORAGE_LABELEDVALUES_H */
|