Page Menu
Home
Phorge
Search
Configure Global Search
Log In
Files
F480290
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Size
32 KB
Referenced Files
None
Subscribers
None
View Options
diff --git a/.gitignore b/.gitignore
index e136fcf..386d354 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,3 @@
.vscode
-.vs
\ No newline at end of file
+.vs
+
diff --git a/include/rosa/agent/Abstraction.hpp b/include/rosa/agent/Abstraction.hpp
index 1c5a3c1..032c970 100644
--- a/include/rosa/agent/Abstraction.hpp
+++ b/include/rosa/agent/Abstraction.hpp
@@ -1,194 +1,225 @@
//===-- rosa/agent/Abstraction.hpp ------------------------------*- C++ -*-===//
//
// The RoSA Framework
//
//===----------------------------------------------------------------------===//
///
/// \file rosa/agent/Abstraction.hpp
///
/// \author David Juhasz (david.juhasz@tuwien.ac.at)
///
/// \date 2017
///
/// \brief Definition of *abstraction* *functionality*.
///
//===----------------------------------------------------------------------===//
#ifndef ROSA_AGENT_ABSTRACTION_HPP
#define ROSA_AGENT_ABSTRACTION_HPP
#include "rosa/agent/Functionality.h"
#include "rosa/support/debug.hpp"
#include <algorithm>
#include <map>
namespace rosa {
namespace agent {
/// Abstracts values from a type to another one.
///
/// \tparam T type to abstract from
/// \tparam A type to abstract to
template <typename T, typename A> class Abstraction : public Functionality {
-
-public:
-
+protected:
/// Value to abstract to by default.
const A Default;
-
+public:
/// Creates an instance.
///
/// \param Default value to abstract to by default
Abstraction(const A Default) noexcept : Default(Default) {}
/// Destroys \p this object.
~Abstraction(void) = default;
+ /// Checks wether the Abstraction evaluates to default at the given position
+ bool isDefaultAt(const T &V) const{
+ (void)V;
+ return true;
+ }
+
/// Abstracts a value from type \p T to type \p A.
///
/// \note The default implementation always returns
/// \c rosa::agent::Abstraction::Default, hence the actual argument is
/// ignored.
///
/// \return the abstracted value
virtual A operator()(const T &) const noexcept { return Default; }
};
/// Implements \c rosa::agent::Abstraction as a \c std::map from a type to
/// another one.
///
/// \note This implementation is supposed to be used to abstract between
/// enumeration types, which is statically enforced.
///
/// \tparam T type to abstract from
/// \tparam A type to abstract to
template <typename T, typename A>
class MapAbstraction : public Abstraction<T, A>, private std::map<T, A> {
// Make sure the actual type arguments are enumerations.
STATIC_ASSERT((std::is_enum<T>::value && std::is_enum<A>::value),
"mapping not enumerations");
// Bringing into scope inherited members.
using Abstraction<T, A>::Default;
using std::map<T, A>::end;
using std::map<T, A>::find;
public:
/// Creates an instance by initializing the underlying \c std::map.
///
/// \param Map the mapping to do abstraction according to
/// \param Default value to abstract to by default
MapAbstraction(const std::map<T, A> &Map, const A Default) noexcept
: Abstraction<T, A>(Default),
std::map<T, A>(Map) {}
/// Destroys \p this object.
~MapAbstraction(void) = default;
+ /// Checks wether the Abstraction evaluates to default at the given position
+ bool isDefaultAt(const T &V) const {
+ const auto I = find(V);
+ return I == end() ? true : false;
+ }
+
/// Abstracts a value from type \p T to type \p A based on the set mapping.
///
/// Results in the value associated by the set mapping to the argument, or
/// \c rosa::agent::MapAbstraction::Default if the actual argument is not
/// associated with anything by the set mapping.
///
/// \param V value to abstract
///
/// \return the abstracted value based on the set mapping
A operator()(const T &V) const noexcept override {
const auto I = find(V);
return I == end() ? Default : *I;
}
};
/// Implements \c rosa::agent::Abstraction as a \c std::map from ranges of a
/// type to values of another type.
///
/// \note This implementation is supposed to be used to abstract ranges of
/// arithmetic types into enumerations, which is statically enforced.
///
/// \invariant The keys in the underlying \c std::map define valid ranges
/// such that `first <= second` and there are no overlapping ranges defined by
/// the keys.
///
/// \tparam T type to abstract from
/// \tparam A type to abstract to
template <typename T, typename A>
class RangeAbstraction : public Abstraction<T, A>,
private std::map<std::pair<T, T>, A> {
// Make sure the actual type arguments are matching our expectations.
STATIC_ASSERT((std::is_arithmetic<T>::value), "abstracting not arithmetic");
/// \todo check if this compiles with the definition of abstractions as
/// self-aware properties
//STATIC_ASSERT((std::is_enum<A>::value), "abstracting not to enumeration");
// Bringing into scope inherited members.
using Abstraction<T, A>::Default;
using std::map<std::pair<T, T>, A>::begin;
using std::map<std::pair<T, T>, A>::end;
using std::map<std::pair<T, T>, A>::find;
public:
/// Creates an instance by Initializing the unserlying \c std::map.
///
/// \param Map the mapping to do abstraction according to
/// \param Default value to abstract to by default
///
/// \pre Each key defines a valid range such that `first <= second` and
/// there are no overlapping ranges defined by the keys.
RangeAbstraction(const std::map<std::pair<T, T>, A> &Map, const A &Default)
: Abstraction<T, A>(Default), std::map<std::pair<T, T>, A>(Map) {
// Sanity check.
ASSERT(std::all_of(
begin(), end(), [this](const std::pair<std::pair<T, T>, A> &P) {
return P.first.first <= P.first.second &&
std::all_of(++find(P.first), end(),
[&P](const std::pair<std::pair<T, T>, A> &R) {
// \note Values in \c Map are sorted.
return P.first.first < P.first.second &&
P.first.second <= R.first.first ||
P.first.first == P.first.second &&
P.first.second < R.first.first;
});
}));
}
/// Destroys \p this object.
~RangeAbstraction(void) = default;
+ /// Checks wether the Abstraction evaluates to default at the given position
+ bool isDefaultAt(const T &V) const{
+ auto I = begin();
+ bool Found = false; // Indicates if \c I refers to a matching range.
+ bool Failed = false; // Indicates if it is pointless to continue searching.
+ while (!Found && !Failed && I != end()) {
+ if (V < I->first.first) {
+ // No match so far and \p V is below the next range, never will match.
+ // \note Keys are sorted in the map.
+ return true;
+ } else if (I->first.first <= V && V < I->first.second) {
+ // Matching range found.
+ return false;
+ } else {
+ // Cannot conclude in this step, move to the next range.
+ ++I;
+ }
+ }
+ return true;
+ }
+
/// Abstracts a value from type \p T to type \p A based on the set mapping.
///
/// Results in the value associated by the set mapping to the argument, or
/// \c rosa::agent::RangeAbstraction::Default if the actual argument is not
/// included in any of the ranges in the set mapping.
///
/// \param V value to abstract
///
/// \return the abstracted value based on the set mapping
A operator()(const T &V) const noexcept override {
auto I = begin();
bool Found = false; // Indicates if \c I refers to a matching range.
bool Failed = false; // Indicates if it is pointless to continue searching.
while (!Found && !Failed && I != end()) {
if (V < I->first.first) {
// No match so far and \p V is below the next range, never will match.
// \note Keys are sorted in the map.
Failed = true;
} else if (I->first.first <= V && V < I->first.second) {
// Matching range found.
Found = true;
} else {
// Cannot conclude in this step, move to the next range.
++I;
}
}
ASSERT(!Found || I != end());
return Found ? I->second : Default;
}
};
} // End namespace agent
} // End namespace rosa
#endif // ROSA_AGENT_ABSTRACTION_HPP
diff --git a/include/rosa/agent/CrossReliability.h b/include/rosa/agent/CrossReliability.h
new file mode 100644
index 0000000..03c6410
--- /dev/null
+++ b/include/rosa/agent/CrossReliability.h
@@ -0,0 +1,345 @@
+//===-- rosa/delux/CrossReliability.h ---------------------------*- C++ -*-===//
+//
+// The RoSA Framework
+//
+//===----------------------------------------------------------------------===//
+///
+/// \file rosa/delux/CrossReliability.h
+///
+/// \author Daniel Schnoell
+///
+/// \date 2019
+///
+/// \brief
+///
+/// \todo there is 1 exception that needs to be handled correctly.
+/// \note the default search function is extremely slow maby this could be done
+/// via template for storage class and the functions/methods to efficiently find
+/// the correct LinearFunction
+//===----------------------------------------------------------------------===//
+#ifndef ROSA_AGENT_CROSSRELIABILITY_H
+#define ROSA_AGENT_CROSSRELIABILITY_H
+
+#define ROSA_LOG_LEVEL 100
+
+#include "rosa/agent/Abstraction.hpp"
+#include "rosa/agent/Functionality.h"
+#include "rosa/core/forward_declarations.h" // needed for id_t
+#include "rosa/support/log.h" // needed for error "handling"
+
+// nedded headers
+
+#include <string>
+#include <type_traits> //assert
+#include <vector>
+// for static methods
+#include <algorithm>
+#include <numeric>
+
+namespace rosa {
+namespace agent {
+
+/// Calculates the Cross Reliability
+/// \brief it uses the state represented by a numerical value and calculates the
+/// Reliability of a given agent( represented by there id ) in connection to all
+/// other given agents
+///
+/// \note all combination of agents and there coresponding Cross Reliability
+/// function have to be specified
+template <typename StateType, typename Type>
+class CrossReliability : public Abstraction<StateType, Type> {
+ using Abstraction = typename rosa::agent::Abstraction<StateType, Type>;
+
+ struct Functionblock {
+ bool exists = false;
+ id_t A;
+ id_t B;
+ Abstraction *Funct;
+ };
+
+ /// From Maxi in his code defined as 1 can be changed by set
+ Type crossReliabilityParameter = 1;
+
+ /// Stored Cross Reliability Functions
+ std::vector<Functionblock> Functions;
+
+ /// Method which is used to combine the generated values
+ Type (*Method)(std::vector<Type> values) = AVERAGE;
+
+ //--------------------------------------------------------------------------------
+ // helper function
+ /// evalues the absolute distance between two values
+ /// \note this is actually the absolute distance but to ceep it somewhat
+ /// conform with maxis code
+ template <typename Type_t> Type_t AbsuluteValue(Type_t A, Type_t B) {
+ static_assert(std::is_arithmetic<Type_t>::value);
+ return ((A - B) < 0) ? B - A : A - B;
+ }
+
+ /// verry inefficient searchFunction
+ Functionblock (*searchFunction)(std::vector<Functionblock> vect,
+ const id_t nameA, const id_t nameB) =
+ [](std::vector<Functionblock> vect, const id_t nameA,
+ const id_t nameB) -> Functionblock {
+ for (Functionblock tmp : vect) {
+ if (tmp.A == nameA && tmp.B == nameB)
+ return tmp;
+ if (tmp.A == nameB && tmp.B == nameA)
+ return tmp;
+ }
+ return Functionblock();
+ };
+
+ /// evaluest the corisponding LinearFunction thith the score difference
+ /// \param nameA these two parameters are the unique identifiers
+ /// \param nameB these two parameters are the unique identifiers
+ /// for the LinerFunction
+ ///
+ /// \note If the block nameA nameB doesn't exist it logs the error and returns
+ /// 0
+ /// \note it doesn't matter if they are swapped
+ Type getCrossReliabilityFromProfile(id_t nameA, id_t nameB,
+ StateType scoreDifference) {
+ Functionblock block = searchFunction(Functions, nameA, nameB);
+ if (!block.exists) {
+ LOG_ERROR(("CrossReliability: Block:" + std::to_string(nameA) + "," +
+ std::to_string(nameB) + "doesn't exist returning 0"));
+ return 0;
+ }
+ return block.Funct->operator()(scoreDifference);
+ }
+
+public:
+ /// adds a Cross Reliability Profile used to get the Reliability of the state
+ /// difference
+ void addCrossReliabilityProfile(id_t idA, id_t idB, Abstraction *Function) {
+ Functions.push_back({true, idA, idB, Function});
+ }
+
+ /// sets the cross reliability parameter
+ void setCrossReliabilityParameter(Type val) {
+ crossReliabilityParameter = val;
+ }
+ /// sets the used method to combine the values
+ void setCrossReliabilityMethod(Type (*Meth)(std::vector<Type> values)) {
+ Method = Meth;
+ }
+
+ ~CrossReliability() {
+ for (auto tmp : Functions)
+ delete tmp.Funct;
+ Functions.clear();
+ }
+
+ /// Calculets the CrossReliability
+ /// \note both Main and Slaveagents are represented by there data and an
+ /// unique identifier
+ ///
+ /// \param MainAgent defines the value pair around which the Cross Reliability
+ /// is calculated
+ /// \param SlaveAgents defines all value pairs of the connected Agents it
+ /// doesn't matter if Main agent exists inside this vector
+ Type operator()(std::pair<id_t, StateType> &MainAgent,
+ std::vector<std::pair<id_t, StateType>> &SlaveAgents);
+
+ /// predefined combination method
+ static Type CONJUNCTION(std::vector<Type> values) {
+ static_assert(std::is_arithmetic<Type>::value); // sanitny check
+ return *std::min_element(values.begin(), values.end());
+ }
+
+ /// predefined combination method
+ static Type AVERAGE(std::vector<Type> values) {
+ static_assert(std::is_arithmetic<Type>::value); // sanitny check
+ return std::accumulate(values.begin(), values.end(), 0.0) / values.size();
+ }
+
+ /// predefined combination method
+ static Type DISJUNCTION(std::vector<Type> values) {
+ static_assert(std::is_arithmetic<Type>::value); // sanitny check
+ return *std::max_element(values.begin(), values.end());
+ }
+};
+
+template <typename StateType, typename Type>
+inline Type CrossReliability<StateType, Type>::
+operator()(std::pair<id_t, StateType> &MainAgent,
+ std::vector<std::pair<id_t, StateType>> &SlaveAgents) {
+ static_assert(std::is_arithmetic<Type>::value); // sanitny check
+ static_assert(std::is_arithmetic<StateType>::value); // sanitny check
+
+ Type crossReliabiability;
+ std::vector<Type> values;
+
+ for (std::pair<id_t, StateType> SlaveAgent : SlaveAgents) {
+
+ if (SlaveAgent.first == MainAgent.first)
+ continue;
+
+ if (MainAgent.second == SlaveAgent.second)
+ crossReliabiability = 1;
+ else
+ crossReliabiability =
+ 1 / (crossReliabilityParameter *
+ AbsuluteValue(MainAgent.second, SlaveAgent.second));
+
+ // profile reliability
+ Type crossReliabilityFromProfile = getCrossReliabilityFromProfile(
+ MainAgent.first, SlaveAgent.first,
+ AbsuluteValue(MainAgent.second, SlaveAgent.second));
+ values.push_back(
+ std::max(crossReliabiability, crossReliabilityFromProfile));
+ }
+ return Method(values);
+}
+
+/// Calculates the Cross Confidence
+/// \brief It uses the a theoretical state represented by a numerical value and
+/// calculates the Reliability of a given agent( represented by there id ) in
+/// connection to all other given agents this can be used to get a Confidence of
+/// the current state
+///
+/// \note all combination of agents and there coresponding Cross Reliability
+/// function have to be specified
+template <typename StateType, typename Type>
+class CrossConfidence : public Abstraction<StateType, Type> {
+ using Abstraction = typename rosa::agent::Abstraction<StateType, Type>;
+
+ struct Functionblock {
+ bool exists = false;
+ id_t A;
+ id_t B;
+ Abstraction *Funct;
+ };
+
+ /// From Maxi in his code defined as 1 can be changed by set
+ Type crossReliabilityParameter = 1;
+
+ /// Stored Cross Reliability Functions
+ std::vector<Functionblock> Functions;
+
+ /// Method which is used to combine the generated values
+ Type (*Method)(std::vector<Type> values) = AVERAGE;
+
+ //--------------------------------------------------------------------------------
+ // helper function
+ /// evalues the absolute distance between two values
+ /// \note this is actually the absolute distance but to ceep it somewhat
+ /// conform with maxis code
+ template <typename Type_t> Type_t AbsuluteValue(Type_t A, Type_t B) {
+ static_assert(std::is_arithmetic<Type_t>::value);
+ return ((A - B) < 0) ? B - A : A - B;
+ }
+
+ /// verry inefficient searchFunction
+ Functionblock (*searchFunction)(std::vector<Functionblock> vect,
+ const id_t nameA, const id_t nameB) =
+ [](std::vector<Functionblock> vect, const id_t nameA,
+ const id_t nameB) -> Functionblock {
+ for (Functionblock tmp : vect) {
+ if (tmp.A == nameA && tmp.B == nameB)
+ return tmp;
+ if (tmp.A == nameB && tmp.B == nameA)
+ return tmp;
+ }
+ return Functionblock();
+ };
+
+ /// evaluest the corisponding LinearFunction thith the score difference
+ /// \param nameA these two parameters are the unique identifiers
+ /// \param nameB these two parameters are the unique identifiers
+ /// for the LinerFunction
+ ///
+ /// \note it doesn't matter if they are swapped
+ Type getCrossReliabilityFromProfile(id_t nameA, id_t nameB,
+ StateType scoreDifference) {
+ Functionblock block = searchFunction(Functions, nameA, nameB);
+ if (!block.exists) {
+ LOG_ERROR(("CrossReliability: Block:" + std::to_string(nameA) + "," +
+ std::to_string(nameB) + "doesn't exist returning 0"));
+ return 0;
+ }
+ return block.Funct->operator()(scoreDifference);
+ }
+
+public:
+ /// adds a Cross Reliability Profile used to get the Reliability of the state
+ /// difference
+ void addCrossReliabilityProfile(id_t idA, id_t idB, Abstraction *Function) {
+ Functions.push_back({true, idA, idB, Function});
+ }
+
+ /// sets the cross reliability parameter
+ void setCrossReliabilityParameter(Type val) {
+ crossReliabilityParameter = val;
+ }
+ /// sets the used method to combine the values
+ void setCrossReliabilityMethod(Type (*Meth)(std::vector<Type> values)) {
+ Method = Meth;
+ }
+
+ ~CrossConfidence() {
+ for (auto tmp : Functions)
+ delete tmp.Funct;
+ Functions.clear();
+ }
+
+ Type operator()(id_t MainAgent, StateType TheoreticalValue,
+ std::vector<std::pair<id_t, StateType>> &SlaveAgents);
+
+ /// predefined combination method
+ static Type CONJUNCTION(std::vector<Type> values) {
+ static_assert(std::is_arithmetic<Type>::value); // sanitny check
+ return *std::min_element(values.begin(), values.end());
+ }
+
+ /// predefined combination method
+ static Type AVERAGE(std::vector<Type> values) {
+ static_assert(std::is_arithmetic<Type>::value); // sanitny check
+ return std::accumulate(values.begin(), values.end(), 0.0) / values.size();
+ }
+
+ /// predefined combination method
+ static Type DISJUNCTION(std::vector<Type> values) {
+ static_assert(std::is_arithmetic<Type>::value); // sanitny check
+ return *std::max_element(values.begin(), values.end());
+ }
+};
+
+template <typename StateType, typename Type>
+inline Type CrossConfidence<StateType, Type>::
+operator()(id_t MainAgent, StateType TheoreticalValue,
+ std::vector<std::pair<id_t, StateType>> &SlaveAgents) {
+ static_assert(std::is_arithmetic<Type>::value); // sanitny check
+ static_assert(std::is_arithmetic<StateType>::value); // sanitny check
+
+ Type crossReliabiability;
+
+ std::vector<Type> values;
+
+ for (std::pair<id_t, StateType> SlaveAgent : SlaveAgents) {
+
+ if (SlaveAgent.first == MainAgent)
+ continue;
+
+ if (TheoreticalValue == SlaveAgent.second)
+ crossReliabiability = 1;
+ else
+ crossReliabiability =
+ 1 / (crossReliabilityParameter *
+ AbsuluteValue(TheoreticalValue, SlaveAgent.second));
+
+ // profile reliability
+ Type crossReliabilityFromProfile = getCrossReliabilityFromProfile(
+ MainAgent, SlaveAgent.first,
+ AbsuluteValue(TheoreticalValue, SlaveAgent.second));
+ values.push_back(
+ std::max(crossReliabiability, crossReliabilityFromProfile));
+ }
+ return Method(values);
+}
+
+} // End namespace agent
+} // End namespace rosa
+
+#endif // ROSA_AGENT_CROSSRELIABILITY_H
\ No newline at end of file
diff --git a/include/rosa/agent/FunctionAbstractions.hpp b/include/rosa/agent/FunctionAbstractions.hpp
index 31bbea4..606125a 100644
--- a/include/rosa/agent/FunctionAbstractions.hpp
+++ b/include/rosa/agent/FunctionAbstractions.hpp
@@ -1,175 +1,194 @@
//===-- rosa/agent/FunctionAbstractions.hpp ---------------------*- C++ -*-===//
//
// The RoSA Framework
//
//===----------------------------------------------------------------------===//
///
/// \file rosa/agent/FunctionAbstractions.hpp
///
/// \author Benedikt Tutzer (benedikt.tutzer@tuwien.ac.at)
///
/// \date 2019
///
/// \brief Definition of *FunctionAbstractions* *functionality*.
///
//===----------------------------------------------------------------------===//
#ifndef ROSA_AGENT_FUNCTIONABSTRACTIONS_HPP
#define ROSA_AGENT_FUNCTIONABSTRACTIONS_HPP
#include "rosa/agent/Functionality.h"
#include "rosa/agent/Abstraction.hpp"
#include "rosa/support/debug.hpp"
#include <algorithm>
#include <vector>
#include <cmath>
#include <memory>
namespace rosa {
namespace agent {
/// Evaluates a linear function at a given value.
///
/// \tparam T type of the functions domain
/// \tparam A type of the functions range
template <typename T, typename A> class LinearFunction :
public Abstraction<T, A>{
// Make sure the actual type arguments are matching our expectations.
STATIC_ASSERT((std::is_arithmetic<T>::value),
"LinearFunction not arithmetic T");
STATIC_ASSERT((std::is_arithmetic<A>::value),
"LinearFunction not to arithmetic");
protected:
const T Intercept;
const T Coefficient;
public:
/// Creates an instance.
///
/// \param Intercept the intercept of the linear function
/// \param Coefficient the coefficient of the linear function
/// domain
LinearFunction(T Intercept, T Coefficient) noexcept
: Abstraction<T, A>(Intercept),
Intercept(Intercept),
Coefficient(Coefficient) {}
/// Destroys \p this object.
~LinearFunction(void) = default;
+ /// Checks wether the Abstraction evaluates to default at the given position
+ /// As LinearFunctions can be evaluated everythwere, this is always false
+ bool isDefaultAt(const T &V) const{
+ (void)V;
+ return false;
+ }
+
/// Evaluates the linear function
///
/// \param X the value at which to evaluate the function
/// \return the result
virtual A operator()(const T &X) const noexcept override {
return Intercept + X*Coefficient;
}
};
/// Evaluates a sine function at a given value.
///
/// \tparam T type of the functions domain
/// \tparam A type of the functions range
template <typename T, typename A> class SineFunction :
public Abstraction<T, A>{
// Make sure the actual type arguments are matching our expectations.
STATIC_ASSERT((std::is_arithmetic<T>::value),
"SineFunction not arithmetic T");
STATIC_ASSERT((std::is_arithmetic<A>::value),
"SineFunction not to arithmetic");
protected:
const T Frequency;
const T Amplitude;
const T Phase;
const T Average;
public:
/// Creates an instance.
///
/// \param Frequency the frequency of the sine wave
/// \param Amplitude the amplitude of the sine wave
/// \param Phase the phase of the sine wave
/// \param Average the average of the sine wave
/// domain
SineFunction(T Frequency, T Amplitude, T Phase, T Average) noexcept
: Abstraction<T, A>(Average),
Frequency(Frequency),
Amplitude(Amplitude),
Phase(Phase),
Average(Average) {}
/// Destroys \p this object.
~SineFunction(void) = default;
+ /// Checks wether the Abstraction evaluates to default at the given position
+ /// As SineFunctions can be evaluated everythwere, this is always false
+ bool isDefaultAt(const T &V) const{
+ (void)V;
+ return false;
+ }
+
/// Evaluates the linear function
///
/// \param X the value at which to evaluate the function
/// \return the result
virtual A operator()(const T &X) const noexcept override {
return Amplitude*sin(Frequency * X + Phase) + Average;
}
};
/// Implements \c rosa::agent::RangeAbstraction as an abstraction from
/// \c std::map from ranges of a type to abstractions of that type to another
/// type. The resulting abstractions are evaluated for the given values.
///
/// \note This implementation is supposed to be used to abstract ranges of
/// arithmetic types into abstractions from that type to another arithmetic
/// type, which is statically enforced.
///
/// \invariant The keys in the underlying \c std::map define valid ranges
/// such that `first <= second` and there are no overlapping ranges defined by
/// the keys.
///
/// \tparam T type to abstract from
/// \tparam A type to abstract to
template <typename T, typename A>
class PartialFunction : public Abstraction<T, A> {
// Make sure the actual type arguments are matching our expectations.
STATIC_ASSERT((std::is_arithmetic<T>::value), "abstracting not arithmetic");
STATIC_ASSERT((std::is_arithmetic<A>::value),
"abstracting not to arithmetic");
private:
RangeAbstraction<T, std::shared_ptr<Abstraction<T, A>>> RA;
public:
/// Creates an instance by Initializing the underlying \c RangeAbstraction.
///
/// \param Map the mapping to do abstraction according to
/// \param Default abstraction to abstract to by default
///
/// \pre Each key defines a valid range such that `first <= second` and
/// there are no overlapping ranges defined by the keys.
PartialFunction(const std::map<std::pair<T, T>,
std::shared_ptr<Abstraction<T, A>>> &Map,
const A Default)
: Abstraction<T, A>(Default),
RA(Map, std::shared_ptr<Abstraction<T, A>>
(new Abstraction<T, A>(Default))) {
}
/// Destroys \p this object.
~PartialFunction(void) = default;
+ /// Checks wether the Abstraction evaluates to default at the given position
+ bool isDefaultAt(const T &V) const{
+ return RA.isDefaultAt(V);
+ }
+
/// Evaluates an Abstraction from type \p T to type \p A based on the set
/// mapping.
///
/// Results in the value associated by the set mapping to the argument, or
/// \c rosa::agent::RangeAbstraction::Default if the actual argument is not
/// included in any of the ranges in the set mapping.
///
/// \param V value to abstract
///
/// \return the abstracted value based on the set mapping
A operator()(const T &V) const noexcept override {
return RA(V)->operator()(V);
}
};
} // End namespace agent
} // End namespace rosa
#endif // ROSA_AGENT_FUNCTIONABSTRACTIONS_HPP
diff --git a/include/rosa/agent/RangeConfidence.hpp b/include/rosa/agent/RangeConfidence.hpp
index c5e86a6..83ba518 100644
--- a/include/rosa/agent/RangeConfidence.hpp
+++ b/include/rosa/agent/RangeConfidence.hpp
@@ -1,96 +1,90 @@
//===-- rosa/agent/RangeConfidence.hpp --------------------------*- C++ -*-===//
//
// The RoSA Framework
//
//===----------------------------------------------------------------------===//
///
/// \file rosa/agent/RangeConfidence.hpp
///
/// \author Benedikt Tutzer (benedikt.tutzer@tuwien.ac.at)
///
/// \date 2019
///
/// \brief Definition of *RangeConfidence* *functionality*.
///
//===----------------------------------------------------------------------===//
#ifndef ROSA_AGENT_RANGECONFIDENCE_HPP
#define ROSA_AGENT_RANGECONFIDENCE_HPP
#include "rosa/agent/Functionality.h"
#include "rosa/agent/Abstraction.hpp"
#include "rosa/agent/FunctionAbstractions.hpp"
#include "rosa/support/debug.hpp"
#include <algorithm>
#include <vector>
#include <cmath>
#include <memory>
namespace rosa {
namespace agent {
/// Evaluates a vector of Abstractions at a given value and returns the results
/// as a vector
///
/// \note This implementation is supposed to be used to abstract ranges of
/// arithmetic types into vectors of another arithmetic type, which is
/// statically enforced.
///
/// \tparam T type to abstract from
/// \tparam A type to abstract a vector of to
template <typename T, typename A, typename B>
class RangeConfidence : protected Abstraction<T, std::map<A, B>>,
private std::map<A, PartialFunction<T, B>>{
// Make sure the actual type arguments are matching our expectations.
STATIC_ASSERT((std::is_arithmetic<T>::value), "abstracting not arithmetic");
STATIC_ASSERT((std::is_arithmetic<B>::value),
"abstracting not to arithmetic");
- // Bringing into scope inherited members.
- using std::map<A, PartialFunction<T, B>>::size;
- using std::map<A, PartialFunction<T, B>>::begin;
- using std::map<A, PartialFunction<T, B>>::end;
-
private:
bool IgnoreDefaults;
public:
/// Creates an instance by Initializing the underlying \c RangeAbstraction.
///
/// \param Abstractions the Abstractions to be evaluated
RangeConfidence(const std::map<A, PartialFunction<T, B>> &Abstractions,
bool IgnoreDefaults = false)
: Abstraction<T, std::map<A, B>>({}),
std::map<A, PartialFunction<T, B>>(Abstractions),
IgnoreDefaults(IgnoreDefaults){
}
/// Destroys \p this object.
~RangeConfidence(void) = default;
/// Evaluates an Abstraction from type \p T to type \p A based on the set
/// mapping.
///
/// Results in the value associated by the set mapping to the argument, or
/// \c rosa::agent::RangeAbstraction::Default if the actual argument is not
/// included in any of the ranges in the set mapping.
///
/// \param V value to abstract
///
/// \return the abstracted value based on the set mapping
std::map<A, B> operator()(const T &V) const noexcept override {
std::map<A, B> ret;
for (auto const& p : ((std::map<A, PartialFunction<T, B>>)*this)){
- B res = p.second(V);
- if(!IgnoreDefaults || p.second.Default != res)
- ret.insert(std::pair<A, B>(p.first, res));
+ if(!IgnoreDefaults || !p.second.isDefaultAt(V))
+ ret.insert(std::pair<A, B>(p.first, p.second(V)));
}
return ret;
}
};
} // End namespace agent
} // End namespace rosa
#endif // ROSA_AGENT_RANGECONFIDENCE_HPP
diff --git a/lib/agent/CMakeLists.txt b/lib/agent/CMakeLists.txt
index 7edb556..d4bdebc 100644
--- a/lib/agent/CMakeLists.txt
+++ b/lib/agent/CMakeLists.txt
@@ -1,18 +1,20 @@
set(LIB_INCLUDE_DIR ${ROSA_MAIN_INCLUDE_DIR}/rosa/agent)
add_library(ROSAAgent
${LIB_INCLUDE_DIR}/namespace.h
namespace.cpp
${LIB_INCLUDE_DIR}/Functionality.h
Functionality.cpp
${LIB_INCLUDE_DIR}/Abstraction.hpp
Abstraction.cpp
${LIB_INCLUDE_DIR}/FunctionAbstractions.hpp
FunctionAbstractions.cpp
${LIB_INCLUDE_DIR}/RangeConfidence.hpp
RangeConfidence.cpp
${LIB_INCLUDE_DIR}/History.hpp
History.cpp
${LIB_INCLUDE_DIR}/Confidence.hpp
Confidence.cpp
+ ${LIB_INCLUDE_DIR}/CrossReliability.h
+ CrossReliability.cpp
)
diff --git a/lib/agent/CrossReliability.cpp b/lib/agent/CrossReliability.cpp
new file mode 100644
index 0000000..21ed3b4
--- /dev/null
+++ b/lib/agent/CrossReliability.cpp
@@ -0,0 +1,20 @@
+//===-- agent/CrossReliability.cpp ------------------------------*- C++ -*-===//
+//
+// The RoSA Framework
+//
+//===----------------------------------------------------------------------===//
+///
+/// \file agent/CrossReliability.cpp
+///
+/// \author Daniel Schnoell (daniel.schnoell@tuwien.ac.at)
+///
+/// \date 2019
+///
+/// \brief Implementation for rosa/agent/CrossReliability.cpp
+///
+/// \note Empty implementation, source file here to have a compile database
+/// entry for rosa/agent/CrossReliability.h
+///
+//===----------------------------------------------------------------------===//
+
+#include "rosa/agent/CrossReliability.h"
File Metadata
Details
Attached
Mime Type
text/x-diff
Expires
Mon, Oct 20, 7:16 AM (18 h, 36 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
199671
Default Alt Text
(32 KB)
Attached To
Mode
R20 SoC_Rosa_repo
Attached
Detach File
Event Timeline
Log In to Comment