Page Menu
Home
Phorge
Search
Configure Global Search
Log In
Files
F360730
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Size
21 KB
Referenced Files
None
Subscribers
None
View Options
diff --git a/examples/agent-functionalities/agent-functionalities.cpp b/examples/agent-functionalities/agent-functionalities.cpp
index 8ad2288..2da67b8 100644
--- a/examples/agent-functionalities/agent-functionalities.cpp
+++ b/examples/agent-functionalities/agent-functionalities.cpp
@@ -1,169 +1,170 @@
//===-- examples/agent-functionalities/agent-functionalities.cpp *-- C++-*-===//
//
// The RoSA Framework
//
//===----------------------------------------------------------------------===//
///
/// \file examples/agent-functionalities/agent-functionalities.cpp
///
/// \author David Juhasz (david.juhasz@tuwien.ac.at)
///
/// \date 2017
///
/// \brief A simple example on defining \c rosa::Agent instances using
/// \c rosa::agent::Functionality object as components.
///
//===----------------------------------------------------------------------===//
#include "rosa/agent/Abstraction.hpp"
-#include "rosa/agent/LinearFunctions.hpp"
+#include "rosa/agent/FunctionAbstractions.hpp"
+#include "rosa/agent/RangeConfidence.hpp"
#include "rosa/agent/Confidence.hpp"
#include "rosa/config/version.h"
#include "rosa/core/Agent.hpp"
#include "rosa/core/MessagingSystem.hpp"
#include "rosa/support/log.h"
#include "rosa/support/terminal_colors.h"
#include <vector>
using namespace rosa;
using namespace rosa::agent;
using namespace rosa::terminal;
/// A dummy wrapper for testing \c rosa::MessagingSystem.
///
/// \note Since we test \c rosa::MessagingSystem directly here, we need to get
/// access to its protected members. That we do by imitating to be a decent
/// subclass of \c rosa::MessagingSystem, while calling protected member
/// functions on an object of a type from which we actually don't inherit.
struct SystemTester : protected MessagingSystem {
template <typename T, typename... Funs>
static AgentHandle createMyAgent(MessagingSystem *S, const std::string &Name,
Funs &&... Fs) {
return ((SystemTester *)S)->createAgent<T>(Name, std::move(Fs)...);
}
static void destroyMyAgent(MessagingSystem *S, const AgentHandle &H) {
((SystemTester *)S)->destroyUnit(unwrapAgent(H));
}
};
/// A special \c rosa::Agent with its own state.
class MyAgent : public Agent {
public:
using Tick = AtomConstant<atom("tick")>;
private:
enum class Categories { Bad, Normal, Good };
static const std::map<Categories, const char *> CategoryNames;
History<uint8_t, 10, HistoryPolicy::FIFO> H;
Confidence<uint8_t> C;
RangeAbstraction<uint8_t, Categories> A;
PartialFunction<int, int> L;
RangeConfidence<float, float> RCL;
RangeConfidence<float, float> RCS;
public:
void handler(Tick, uint8_t V) noexcept {
// Record \p V to the \c rosa::agent::History, then print state info.
H << V;
ASSERT(H.entry() == V); // Sanity check.
LOG_INFO_STREAM << "\nNext value: " << PRINTABLE(V)
<< ", confidence: " << C(H)
<< ", category: " << CategoryNames.at(A(H.entry()))
<< ", partial: " << int(L(H.entry()))
<< ", range-confidence-linear: ";
std::vector<float> res_lin = RCL(H.entry());
for (auto i : res_lin){
LOG_INFO_STREAM << " " << i;
}
LOG_INFO_STREAM << ", range-confidence-sine: ";
std::vector<float> res_sine = RCS(H.entry());
for (auto i : res_sine){
LOG_INFO_STREAM << " " << i;
}
LOG_INFO_STREAM << '\n';
}
MyAgent(const AtomValue Kind, const rosa::id_t Id, const std::string &Name,
MessagingSystem &S)
: Agent(Kind, Id, Name, S, THISMEMBER(handler)), H(), C(5, 20, 1),
A({{{(uint8_t)10, (uint8_t)14}, Categories::Normal},
{{(uint8_t)15, (uint8_t)17}, Categories::Good},
{{(uint8_t)18, (uint8_t)19}, Categories::Normal}},
Categories::Bad),
L({{{0, 2}, std::make_shared<LinearFunction<int, int>>(0, 1)},
{{2, 4}, std::make_shared<LinearFunction<int, int>>(2, 0)},
{{4, 6}, std::make_shared<LinearFunction<int, int>>(6, -1)}},
0),
RCL({
PartialFunction<float, float>({
{{0, 3}, std::make_shared<LinearFunction<float, float>>(0, 1.0/3)},
{{3, 6}, std::make_shared<LinearFunction<float, float>>(1, 0)},
{{6, 9}, std::make_shared<LinearFunction<float, float>>(3.0, -1.0/3)},
},0),
PartialFunction<float, float>({
{{6, 9}, std::make_shared<LinearFunction<float, float>>(-2, 1.0/3)},
{{9, 12}, std::make_shared<LinearFunction<float, float>>(1, 0)},
{{12, 15}, std::make_shared<LinearFunction<float, float>>(5, -1.0/3)},
},0),
PartialFunction<float, float>({
{{12, 15}, std::make_shared<LinearFunction<float, float>>(-4, 1.0/3)},
{{15, 18}, std::make_shared<LinearFunction<float, float>>(1, 0)},
{{18, 21}, std::make_shared<LinearFunction<float, float>>(7, -1.0/3)},
},0)
}),
RCS({
PartialFunction<float, float>({
{{0, 3}, std::make_shared<SineFunction<float, float>>
(M_PI/3, 0.5, -M_PI/2, 0.5)},
{{3, 6}, std::make_shared<LinearFunction<float, float>>(1, 0)},
{{6, 9}, std::make_shared<SineFunction<float, float>>
(M_PI/3, 0.5, -M_PI/2 + 3, 0.5)},
},0),
PartialFunction<float, float>({
{{6, 9}, std::make_shared<SineFunction<float, float>>
(M_PI/3, 0.5, -M_PI/2, 0.5)},
{{9, 12}, std::make_shared<LinearFunction<float, float>>(1, 0)},
{{12, 15}, std::make_shared<SineFunction<float, float>>
(M_PI/3, 0.5, -M_PI/2 + 3, 0.5)},
},0),
PartialFunction<float, float>({
{{12, 15}, std::make_shared<SineFunction<float, float>>
(M_PI/3, 0.5, -M_PI/2, 0.5)},
{{15, 18}, std::make_shared<LinearFunction<float, float>>(1, 0)},
{{18, 21}, std::make_shared<SineFunction<float, float>>
(M_PI/3, 0.5, -M_PI/2 + 3, 0.5)},
},0)
}){}
};
const std::map<MyAgent::Categories, const char *> MyAgent::CategoryNames{
{Categories::Bad, "Bad"},
{Categories::Normal, "Normal"},
{Categories::Good, "Good"}};
int main(void) {
LOG_INFO_STREAM << library_string() << " -- " << Color::Red
<< "agent-functionalities example" << Color::Default
<< '\n';
std::unique_ptr<MessagingSystem> S = MessagingSystem::createSystem("Sys");
MessagingSystem *SP = S.get();
AgentHandle A = SystemTester::createMyAgent<MyAgent>(SP, "MyAgent");
std::vector<uint8_t> Vs{0, 1, 2, 3, 4, 5, 6, 7, 9, 10, 11, 13,
15, 14, 15, 16, 19, 20, 21};
for (auto I = Vs.begin(); I != Vs.end(); ++I) {
A.send<MyAgent::Tick, uint8_t>(MyAgent::Tick::Value, *I);
}
SystemTester::destroyMyAgent(SP, A);
return 0;
}
diff --git a/include/rosa/agent/LinearFunctions.hpp b/include/rosa/agent/FunctionAbstractions.hpp
similarity index 70%
rename from include/rosa/agent/LinearFunctions.hpp
rename to include/rosa/agent/FunctionAbstractions.hpp
index 56e425d..1cd0d10 100644
--- a/include/rosa/agent/LinearFunctions.hpp
+++ b/include/rosa/agent/FunctionAbstractions.hpp
@@ -1,228 +1,175 @@
-//===-- rosa/agent/LinearAbstractions.hpp --------------------------*- C++ -*-===//
+//===-- rosa/agent/FunctionAbstractions.hpp ---------------------*- C++ -*-===//
//
// The RoSA Framework
//
//===----------------------------------------------------------------------===//
///
-/// \file rosa/agent/LinearAbstractions.hpp
+/// \file rosa/agent/FunctionAbstractions.hpp
///
/// \author Benedikt Tutzer (benedikt.tutzer@tuwien.ac.at)
///
/// \date 2019
///
-/// \brief Definition of *LinearFunction* *functionality*.
+/// \brief Definition of *FunctionAbstractions* *functionality*.
///
//===----------------------------------------------------------------------===//
-#ifndef ROSA_AGENT_LINEARFUNCTIONS_HPP
-#define ROSA_AGENT_LINEARFUNCTIONS_HPP
+#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;
/// 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;
/// 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 : private 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;
/// 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);
}
};
-
-/// 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>
-class RangeConfidence : public Abstraction<T, std::vector<A>>,
- private std::vector<PartialFunction<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");
-
- // Bringing into scope inherited members.
- using std::vector<PartialFunction<T, A>>::size;
- using std::vector<PartialFunction<T, A>>::begin;
- using std::vector<PartialFunction<T, A>>::end;
-
-public:
- /// Creates an instance by Initializing the underlying \c RangeAbstraction.
- ///
- /// \param Abstractions the Abstractions to be evaluated
- RangeConfidence(const std::vector<PartialFunction<T, A>> &Abstractions)
- : Abstraction<T, std::vector<A>>({}),
- std::vector<PartialFunction<T, A>>(Abstractions) {
- }
-
- /// 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::vector<A> operator()(const T &V) const noexcept override {
- std::vector<A> ret;
- for (auto const& func : ((std::vector<PartialFunction<T, A>>)*this)){
- ret.push_back(func(V));
- }
- return ret;
- }
-};
} // End namespace agent
} // End namespace rosa
-#endif // ROSA_AGENT_ABSTRACTION_HPP
+#endif // ROSA_AGENT_FUNCTIONABSTRACTIONS_HPP
diff --git a/include/rosa/agent/RangeConfidence.hpp b/include/rosa/agent/RangeConfidence.hpp
new file mode 100644
index 0000000..0966a87
--- /dev/null
+++ b/include/rosa/agent/RangeConfidence.hpp
@@ -0,0 +1,89 @@
+//===-- 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>
+class RangeConfidence : public Abstraction<T, std::vector<A>>,
+ private std::vector<PartialFunction<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");
+
+ // Bringing into scope inherited members.
+ using std::vector<PartialFunction<T, A>>::size;
+ using std::vector<PartialFunction<T, A>>::begin;
+ using std::vector<PartialFunction<T, A>>::end;
+
+public:
+ /// Creates an instance by Initializing the underlying \c RangeAbstraction.
+ ///
+ /// \param Abstractions the Abstractions to be evaluated
+ RangeConfidence(const std::vector<PartialFunction<T, A>> &Abstractions)
+ : Abstraction<T, std::vector<A>>({}),
+ std::vector<PartialFunction<T, A>>(Abstractions) {
+ }
+
+ /// 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::vector<A> operator()(const T &V) const noexcept override {
+ std::vector<A> ret;
+ for (auto const& func : ((std::vector<PartialFunction<T, A>>)*this)){
+ ret.push_back(func(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 3d6e5ab..7edb556 100644
--- a/lib/agent/CMakeLists.txt
+++ b/lib/agent/CMakeLists.txt
@@ -1,16 +1,18 @@
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}/LinearFunctions.hpp
- LinearFunctions.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
)
diff --git a/lib/agent/LinearFunctions.cpp b/lib/agent/FunctionAbstractions.cpp
similarity index 60%
copy from lib/agent/LinearFunctions.cpp
copy to lib/agent/FunctionAbstractions.cpp
index 0b43abe..0206760 100644
--- a/lib/agent/LinearFunctions.cpp
+++ b/lib/agent/FunctionAbstractions.cpp
@@ -1,20 +1,20 @@
-//===-- agent/LinearFunctions.cpp -------------------------------*- C++ -*-===//
+//===-- agent/FunctionAbstractions.cpp --------------------------*- C++ -*-===//
//
// The RoSA Framework
//
//===----------------------------------------------------------------------===//
///
-/// \file agent/LinearFunctions.cpp
+/// \file agent/FunctionAbstractions.cpp
///
/// \author Benedikt Tutzer (benedikt.tutzer@tuwien.ac.at)
///
/// \date 2019
///
-/// \brief Implementation for rosa/agent/LinearFunctions.hpp.
+/// \brief Implementation for rosa/agent/FunctionAbstractions.hpp.
///
/// \note Empty implementation, source file here to have a compile database
-/// entry for rosa/agent/LinearFunctions.hpp.
+/// entry for rosa/agent/FunctionAbstractions.hpp.
///
//===----------------------------------------------------------------------===//
-#include "rosa/agent/LinearFunctions.hpp"
+#include "rosa/agent/FunctionAbstractions.hpp"
diff --git a/lib/agent/LinearFunctions.cpp b/lib/agent/RangeConfidence.cpp
similarity index 61%
rename from lib/agent/LinearFunctions.cpp
rename to lib/agent/RangeConfidence.cpp
index 0b43abe..415f11f 100644
--- a/lib/agent/LinearFunctions.cpp
+++ b/lib/agent/RangeConfidence.cpp
@@ -1,20 +1,20 @@
-//===-- agent/LinearFunctions.cpp -------------------------------*- C++ -*-===//
+//===-- agent/RangeConfidence.cpp -------------------------------*- C++ -*-===//
//
// The RoSA Framework
//
//===----------------------------------------------------------------------===//
///
-/// \file agent/LinearFunctions.cpp
+/// \file agent/RangeConfidence.cpp
///
/// \author Benedikt Tutzer (benedikt.tutzer@tuwien.ac.at)
///
/// \date 2019
///
-/// \brief Implementation for rosa/agent/LinearFunctions.hpp.
+/// \brief Implementation for rosa/agent/RangeConfidence.hpp.
///
/// \note Empty implementation, source file here to have a compile database
-/// entry for rosa/agent/LinearFunctions.hpp.
+/// entry for rosa/agent/RangeConfidence.hpp.
///
//===----------------------------------------------------------------------===//
-#include "rosa/agent/LinearFunctions.hpp"
+#include "rosa/agent/RangeConfidence.hpp"
File Metadata
Details
Attached
Mime Type
text/x-diff
Expires
Fri, May 16, 9:08 PM (16 h, 24 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
141480
Default Alt Text
(21 KB)
Attached To
Mode
R20 SoC_Rosa_repo
Attached
Detach File
Event Timeline
Log In to Comment