Page MenuHomePhorge

No OneTemporary

Size
41 KB
Referenced Files
None
Subscribers
None
diff --git a/include/rosa/agent/SignalState.hpp b/include/rosa/agent/SignalState.hpp
index 77d575c..dcbcba4 100644
--- a/include/rosa/agent/SignalState.hpp
+++ b/include/rosa/agent/SignalState.hpp
@@ -1,415 +1,420 @@
-//===-- rosa/agent/State.hpp ----------------------------*- C++ -*-===//
+//===-- rosa/agent/SignalState.hpp ------------------------------*- C++ -*-===//
//
// The RoSA Framework
//
//===----------------------------------------------------------------------===//
///
-/// \file rosa/agent/State.hpp
+/// \file rosa/agent/SignalState.hpp
///
/// \author Maximilian Götzinger (maximilian.goetzinger@tuwien.ac.at)
///
/// \date 2019
///
-/// \brief Definition of *state* *functionality*.
+/// \brief Definition of *signal state* *functionality*.
///
//===----------------------------------------------------------------------===//
-// TODO: change to signal state
-
-#ifndef ROSA_AGENT_STATE_HPP
-#define ROSA_AGENT_STATE_HPP
+#ifndef ROSA_AGENT_SIGNALSTATE_HPP
+#define ROSA_AGENT_SIGNALSTATE_HPP
#include "rosa/agent/FunctionAbstractions.hpp"
#include "rosa/agent/Functionality.h"
#include "rosa/agent/History.hpp"
#include <cstdarg>
namespace rosa {
namespace agent {
-/// State conditions defining how the condition of a \c rosa::agent::State is
-/// saved in \c rosa::agent::StateInformation.
-enum class VariableStateCondition {
- STABLE, ///< The state is stable
- DRIFTING, ///< The state is drifting
- UNKNOWN ///< The state is unknown
+/// Signal state conditions defining how the condition of a \c
+/// rosa::agent::SignalState is saved in \c rosa::agent::SignalStateInformation.
+enum class SignalStateCondition {
+ STABLE, ///< The signal state is stable
+ DRIFTING, ///< The signal state is drifting
+ UNKNOWN ///< The signal state is unknown
};
-template <typename CONFDATATYPE> struct StateInformation {
+template <typename CONFDATATYPE> struct SignalStateInformation {
// Make sure the actual type arguments are matching our expectations.
STATIC_ASSERT((std::is_arithmetic<CONFDATATYPE>::value),
"confidence type is not to arithmetic");
- /// The state ID saved as an unsigned integer number
- unsigned int StateID;
- /// The StateConfidence shows the overall confidence value of the state.
- CONFDATATYPE StateConfidence;
- /// The VariableStateCondition shows the condition of a state (stable or
+ /// The signal state ID saved as an unsigned integer number
+ unsigned int SignalStateID;
+ /// The SignalStateConfidence shows the overall confidence value of the signal
+ /// state.
+ CONFDATATYPE SignalStateConfidence;
+ /// The SignalStateCondition shows the condition of a signal state (stable or
/// drifting)
- VariableStateCondition VariableStateCondition;
- /// The StateIsValid shows whether a state is valid or invalid. In this
- /// context, valid means that enough samples which are in close proximitry
- /// have been inserted into the state.
- bool StateIsValid;
- /// The StateJustGotValid shows whether a state got valid (toggled from
- /// invalid to valid) during the current inserted sample.
- bool StateJustGotValid;
- /// The StateIsValidAfterReentrance shows whether a state is valid after the
- /// variable changed back to it again.
- bool StateIsValidAfterReentrance;
+ SignalStateCondition SignalStateCondition;
+ /// The SignalStateIsValid shows whether a signal state is valid or invalid.
+ /// In this context, valid means that enough samples which are in close
+ /// proximitry have been inserted into the signal state.
+ bool SignalStateIsValid;
+ /// The SignalStateJustGotValid shows whether a signal state got valid
+ /// (toggled from invalid to valid) during the current inserted sample.
+ bool SignalStateJustGotValid;
+ /// The SignalStateIsValidAfterReentrance shows whether a signal state is
+ /// valid after the variable changed back to it again.
+ bool SignalStateIsValidAfterReentrance;
};
// @Benedikt: now there are 4 datatypes. Do you think we can merge PROCDATATYPE
// and PROCDATATYPE somehow?
/// \tparam INDATATYPE type of input data, \tparam CONFDATATYPE type of
/// data in that the confidence values are given, \param PROCDATATYPE type of
/// the relative distance and the type of data in which DABs are saved.
template <typename INDATATYPE, typename CONFDATATYPE, typename PROCDATATYPE>
-class State : public Functionality {
+class SignalState : public Functionality {
// Make sure the actual type arguments are matching our expectations.
STATIC_ASSERT((std::is_arithmetic<INDATATYPE>::value),
"input data type not arithmetic");
STATIC_ASSERT((std::is_arithmetic<CONFDATATYPE>::value),
"confidence data type is not to arithmetic");
STATIC_ASSERT(
(std::is_arithmetic<PROCDATATYPE>::value),
"process data type (DAB and Relative Distance) is not to arithmetic");
private:
// For the convinience to write a shorter data type name
using PartFuncPointer =
std::shared_ptr<PartialFunction<INDATATYPE, CONFDATATYPE>>;
using StepFuncPointer =
std::shared_ptr<StepFunction<INDATATYPE, CONFDATATYPE>>;
- /// StateInfo is a struct StateInformation that contains information about the
- /// current state.
- StateInformation<CONFDATATYPE> StateInfo;
+ /// SignalStateInfo is a struct SignalStateInformation that contains
+ /// information about the current state.
+ SignalStateInformation<CONFDATATYPE> SignalStateInfo;
/// The FuzzyFunctionSampleMatches is the fuzzy function that gives the
/// confidence how good the new sample matches another sample in the sample
/// history.
PartFuncPointer FuzzyFunctionSampleMatches;
/// The FuzzyFunctionSampleMismatches is the fuzzy function that gives the
/// confidence how bad the new sample matches another sample in the sample
/// history.
PartFuncPointer FuzzyFunctionSampleMismatches;
/// The FuzzyFunctionNumOfSamplesMatches is the fuzzy function that gives the
/// confidence how many samples from the sampe history match the new sample.
StepFuncPointer FuzzyFunctionNumOfSamplesMatches;
/// The FuzzyFunctionNumOfSamplesMismatches is the fuzzy function that gives
/// the confidence how many samples from the sampe history mismatch the new
/// sample.
StepFuncPointer FuzzyFunctionNumOfSamplesMismatches;
/// The FuzzyFunctionSignalIsDrifting is the fuzzy function that gives the
/// confidence how likely it is that the signal (resp. the state of a signal)
/// is drifting.
PartFuncPointer FuzzyFunctionSignalIsDrifting;
/// The FuzzyFunctionSignalIsStable is the fuzzy function that gives the
/// confidence how likely it is that the signal (resp. the state of a signal)
/// is stable (not drifting).
PartFuncPointer FuzzyFunctionSignalIsStable;
/// SampleHistory is a history in that the last sample values are stored.
DynamicLengthHistory<INDATATYPE, HistoryPolicy::FIFO> SampleHistory;
/// DAB is a (usually) small history of the last sample values of which a
/// average is calculated if the DAB is full.
DynamicLengthHistory<INDATATYPE, HistoryPolicy::SRWF> DAB;
/// DABHistory is a history in that the last DABs (to be exact, the averages
/// of the last DABs) are stored.
DynamicLengthHistory<PROCDATATYPE, HistoryPolicy::LIFO> DABHistory;
- /// The StateIsValid shows whether a state is valid or invalid. In this
- /// context, valid means that enough samples which are in close proximitry
- /// have been inserted into the state.
- bool StateIsValid;
- /// The StateIsValidAfterReentrance shows whether a state is valid after the
- /// variable changed back to it again.
- bool StateIsValidAfterReentrance;
+ /// The SignalStateIsValid shows whether a signal state is valid or invalid.
+ /// In this context, valid means that enough samples which are in close
+ /// proximitry have been inserted into the signal state.
+ bool SignalStateIsValid;
+ /// The SignalStateIsValidAfterReentrance shows whether a signal state is
+ /// valid after the variable changed back to it again.
+ bool SignalStateIsValidAfterReentrance;
public:
// @Maxi doxygen per default doesn't display private attributes of a class. So
// I copied them to the constructor. So the user has more information.
/// Creates an instance by setting all parameters
- /// \param StateID The Id of the Stateinfo \c StateInformation .
+ /// \param SignalStateID The Id of the SignalStateinfo \c
+ /// SignalStateInformation.
///
/// \param FuzzyFunctionSampleMatches The FuzzyFunctionSampleMatches is the
/// fuzzy function that gives the confidence how good the new sample matches
/// another sample in the sample history.
///
/// \param FuzzyFunctionSampleMismatches The FuzzyFunctionSampleMismatches is
/// the fuzzy function that gives the confidence how bad the new sample
/// matches another sample in the sample history.
///
/// \param FuzzyFunctionNumOfSamplesMatches The
/// FuzzyFunctionNumOfSamplesMatches is the fuzzy function that gives the
/// confidence how many samples from the sampe history match the new sample.
///
/// \param FuzzyFunctionNumOfSamplesMismatches The
/// FuzzyFunctionNumOfSamplesMismatches is the fuzzy function that gives the
/// confidence how many samples from the sampe history mismatch the new
/// sample.
///
/// \param FuzzyFunctionSignalIsDrifting The FuzzyFunctionSignalIsDrifting is
/// the fuzzy function that gives the confidence how likely it is that the
/// signal (resp. the state of a signal) is drifting.
///
/// \param FuzzyFunctionSignalIsStable The FuzzyFunctionSignalIsStable is the
/// fuzzy function that gives the confidence how likely it is that the signal
/// (resp. the state of a signal) is stable (not drifting).
///
/// \param SampleHistorySize Size of the Sample History \c
/// DynamicLengthHistory . SampleHistory is a history in that the last sample
/// values are stored.
///
/// \param DABSize Size of DAB \c DynamicLengthHistory . DAB is a (usually)
/// small history of the last sample values of which a average is calculated
/// if the DAB is full.
///
/// \param DABHistorySize Size of the DABHistory \c DynamicLengthHistory .
/// DABHistory is a history in that the last DABs (to be exact, the averages
/// of the last DABs) are stored.
///
- State(unsigned int StateID, PartFuncPointer FuzzyFunctionSampleMatches,
- PartFuncPointer FuzzyFunctionSampleMismatches,
- StepFuncPointer FuzzyFunctionNumOfSamplesMatches,
- StepFuncPointer FuzzyFunctionNumOfSamplesMismatches,
- PartFuncPointer FuzzyFunctionSignalIsDrifting,
- PartFuncPointer FuzzyFunctionSignalIsStable,
- unsigned int SampleHistorySize, unsigned int DABSize,
- unsigned int DABHistorySize) noexcept
- : StateInfo(StateID, 0, VariableStateCondition::UNKNOWN, false, false),
+ SignalState(unsigned int SignalStateID,
+ PartFuncPointer FuzzyFunctionSampleMatches,
+ PartFuncPointer FuzzyFunctionSampleMismatches,
+ StepFuncPointer FuzzyFunctionNumOfSamplesMatches,
+ StepFuncPointer FuzzyFunctionNumOfSamplesMismatches,
+ PartFuncPointer FuzzyFunctionSignalIsDrifting,
+ PartFuncPointer FuzzyFunctionSignalIsStable,
+ unsigned int SampleHistorySize, unsigned int DABSize,
+ unsigned int DABHistorySize) noexcept
+ : SignalStateInfo(SignalStateID, 0, SignalStateCondition::UNKNOWN, false,
+ false),
SampleHistory(SampleHistorySize), DAB(DABSize),
DABHistory(DABHistorySize),
FuzzyFunctionSampleMatches(FuzzyFunctionSampleMatches),
FuzzyFunctionSampleMismatches(FuzzyFunctionSampleMismatches),
FuzzyFunctionNumOfSamplesMatches(FuzzyFunctionNumOfSamplesMatches),
FuzzyFunctionNumOfSamplesMismatches(
FuzzyFunctionNumOfSamplesMismatches),
FuzzyFunctionSignalIsDrifting(FuzzyFunctionSignalIsDrifting),
FuzzyFunctionSignalIsStable(FuzzyFunctionSignalIsStable) {}
/// Destroys \p this object.
- ~State(void) = default;
+ ~SignalState(void) = default;
- void leaveState(void) noexcept {
+ void leaveSignalState(void) noexcept {
DAB.clear();
- StateIsValidAfterReentrance = false;
+ SignalStateIsValidAfterReentrance = false;
}
- StateInformation<CONFDATATYPE> insertSample(INDATATYPE Sample) noexcept {
+ SignalStateInformation<CONFDATATYPE>
+ insertSample(INDATATYPE Sample) noexcept {
SampleHistory.addEntry(Sample);
DAB.addEntry(Sample);
if (DAB.full()) {
PROCDATATYPE AvgOfDAB = DAB.template average<PROCDATATYPE>();
DABHistory.addEntry(AvgOfDAB);
DAB.clear();
}
FuzzyFunctionNumOfSamplesMatches->setRightLimit(
SampleHistory->numberOfEntries());
FuzzyFunctionNumOfSamplesMismatches->setRightLimit(
SampleHistory->numberOfEntries());
- // TODO: calculate whether state is valid and properly set StateIsValid,
- // StateJustGotValid, StateIsValidAfterReentrance
+ // TODO: calculate whether signal state is valid and properly set
+ // SignalStateIsValid, SignalStateJustGotValid,
+ // SignalStateIsValidAfterReentrance
- // TODO: check actual state whether it drifts
+ // TODO: check current signal state whether it drifts
- // TODO: write in StateInfo
+ // TODO: write in SignalStateInfo
- return StateInfo;
+ return SignalStateInfo;
}
- /// Gives the confidence how likely the new sample matches the state.
+ /// Gives the confidence how likely the new sample matches the signal state.
///
/// \param Sample is the actual sample of the observed signal.
///
- /// \return the confidence of the new sample is matching the state.
+ /// \return the confidence of the new sample is matching the signal state.
CONFDATATYPE
- confSampleMatchesState(INDATATYPE Sample) noexcept {
+ confidenceSampleMatchesSignalState(INDATATYPE Sample) noexcept {
CONFDATATYPE ConfidenceOfBestCase = 0;
DynamicLengthHistory<PROCDATATYPE, HistoryPolicy::FIFO>
RelativeDistanceHistory;
// calculate distances to all history samples
for (auto &HistorySample : SampleHistory) {
PROCDATATYPE RelativeDistance = relativeDistance(Sample, HistorySample);
RelativeDistanceHistory.addEntry(RelativeDistance);
}
// sort all calculated distances so that the lowest distance (will get the
// highest confidence) is at the beginning.
RelativeDistanceHistory.sortAscending();
CONFDATATYPE ConfidenceOfWorstFittingSample = 1;
// Case 1 means that one (the best fitting) sample of the history is
// compared with the new sample. Case 2 means the two best history samples
// are compared with the new sample. And so on.
// TODO (future): to accelerate -> don't start with 1 start with some higher
// number because a low number (i guess lower than 5) will definetely lead
// to a low confidence. except the history is not full.
for (unsigned int Case = 0;
Case < RelativeDistanceHistory.numberOfEntries(); Case++) {
CONFDATATYPE ConfidenceFromRelativeDistance;
if (std::isinf(RelativeDistanceHistory[Case])) {
// TODO (future) if fuzzy is defined in a way that infinity is not 0 it
// would be a problem
//@benedikt: check if your partialfunctions can take infinity as
// argument
ConfidenceFromRelativeDistance = 0;
} else {
ConfidenceFromRelativeDistance =
FuzzyFunctionSampleMatches(RelativeDistanceHistory[Case]);
}
ConfidenceOfWorstFittingSample = fuzzyAND(ConfidenceOfWorstFittingSample,
ConfidenceFromRelativeDistance);
// @benedikt: change old-style cast to one of these: reinterpret_cast,
// static_cast, dynamic_cast or const_cast. Which should I use? Or should
// the HistSampleCounter variable already be CONFDATATYPE type?
ConfidenceOfBestCase = fuzzyOR(
ConfidenceOfBestCase,
fuzzyAND(ConfidenceOfWorstFittingSample,
FuzzyFunctionNumOfSamplesMatches((CONFDATATYPE)Case + 1)));
}
return ConfidenceOfBestCase;
}
- /// Gives the confidence how likely the new sample mismatches the state.
+ /// Gives the confidence how likely the new sample mismatches the signal
+ /// state.
///
/// \param Sample is the actual sample of the observed signal.
///
- /// \return the confidence of the new sample is mismatching the state.
+ /// \return the confidence of the new sample is mismatching the signal state.
CONFDATATYPE
- confSampleMismatchesState(INDATATYPE Sample) noexcept {
+ confidenceSampleMismatchesSignalState(INDATATYPE Sample) noexcept {
float ConfidenceOfWorstCase = 1;
DynamicLengthHistory<PROCDATATYPE, HistoryPolicy::FIFO>
RelativeDistanceHistory;
// calculate distances to all history samples
for (auto &HistorySample : SampleHistory) {
RelativeDistanceHistory.addEntry(relativeDistance(Sample, HistorySample));
}
// sort all calculated distances so that the highest distance (will get the
// lowest confidence) is at the beginning.
RelativeDistanceHistory.sortDescending();
CONFDATATYPE ConfidenceOfBestFittingSample = 0;
unsigned int Case = 1;
// Case 1 means that one (the worst fitting) sample of the history is
// compared with the new sample. Case 2 means the two worst history samples
// are compared with the new sample. And so on.
// TODO (future): to accelerate -> don't go until end. Confidences will only
// get higher. See comment in "CONFDATATYPE
- // confSampleMatchesState(INDATATYPE Sample)".
+ // confidenceSampleMatchesSignalState(INDATATYPE Sample)".
for (unsigned int Case = 0;
Case < RelativeDistanceHistory.numberOfEntries(); Case++) {
CONFDATATYPE ConfidenceFromRelativeDistance;
if (std::isinf(RelativeDistanceHistory[Case])) {
ConfidenceFromRelativeDistance = 1;
} else {
ConfidenceFromRelativeDistance =
FuzzyFunctionSampleMismatches(RelativeDistanceHistory[Case]);
}
ConfidenceOfBestFittingSample = fuzzyOR(ConfidenceOfBestFittingSample,
ConfidenceFromRelativeDistance);
// @benedikt: change old-style cast to one of these: reinterpret_cast,
// static_cast, dynamic_cast or const_cast. Which should I use? Or should
// the HistSampleCounter variable already be CONFDATATYPE type?
ConfidenceOfWorstCase = fuzzyAND(
ConfidenceOfWorstCase,
fuzzyOR(ConfidenceOfBestFittingSample,
FuzzyFunctionNumOfSamplesMismatches((CONFDATATYPE)Case + 1)));
}
return ConfidenceOfWorstCase;
}
- /// Gives information about the current state.
+ /// Gives information about the current signal state.
///
- /// \return a struct StateInformation that contains information about the
- /// current state.
- StateInformation<CONFDATATYPE> stateInformation(void) noexcept {
- return StateInfo;
+ /// \return a struct SignalStateInformation that contains information about
+ /// the current signal state.
+ SignalStateInformation<CONFDATATYPE> signalStateInformation(void) noexcept {
+ return SignalStateInfo;
}
private:
// @David: Where should these next functions (fuzzyAND, fuzzyOR,
// relativeDistance) moved to (I guess we will use them also somewhere else)?
// copied from the internet and adapted
// (https://stackoverflow.com/questions/1657883/variable-number-of-arguments-in-c)
CONFDATATYPE fuzzyAND(int n_args, ...) noexcept {
va_list ap;
va_start(ap, n_args);
CONFDATATYPE min = va_arg(ap, CONFDATATYPE);
for (int i = 2; i <= n_args; i++) {
CONFDATATYPE a = va_arg(ap, CONFDATATYPE);
min = std::min(a, min);
}
va_end(ap);
return min;
}
// copied from the internet
// (https://stackoverflow.com/questions/1657883/variable-number-of-arguments-in-c)
CONFDATATYPE fuzzyOR(int n_args, ...) noexcept {
va_list ap;
va_start(ap, n_args);
CONFDATATYPE max = va_arg(ap, CONFDATATYPE);
for (int i = 2; i <= n_args; i++) {
CONFDATATYPE a = va_arg(ap, CONFDATATYPE);
std::max(a, max);
}
va_end(ap);
return max;
}
PROCDATATYPE relativeDistance(INDATATYPE SampleValue,
INDATATYPE HistoryValue) noexcept {
PROCDATATYPE Dist = HistoryValue - SampleValue;
if (Dist == 0) {
return 0;
} else {
Dist = Dist / SampleValue;
if (Dist < 0) {
//@benedikt: I guess this multiplication here should not be done because
// it could be that the distance fuzzy functions are not symetrical
//(negative and positive side)
Dist = Dist * (-1);
}
return (Dist);
}
}
};
} // End namespace agent
} // End namespace rosa
-#endif // ROSA_AGENT_STATE_HPP
+#endif // ROSA_AGENT_SIGNALSTATE_HPP
diff --git a/include/rosa/agent/SignalStateDetector.hpp b/include/rosa/agent/SignalStateDetector.hpp
index 288cf74..b306ede 100644
--- a/include/rosa/agent/SignalStateDetector.hpp
+++ b/include/rosa/agent/SignalStateDetector.hpp
@@ -1,356 +1,367 @@
-//===-- rosa/agent/StateDetector.hpp ----------------------------*- C++ -*-===//
+//===-- rosa/agent/SignalStateDetector.hpp ----------------------------*- C++
+//-*-===//
//
// The RoSA Framework
//
//===----------------------------------------------------------------------===//
///
-/// \file rosa/agent/StateDetector.hpp
+/// \file rosa/agent/SignalStateDetector.hpp
///
/// \author Maximilian Götzinger (maximilian.goetzinger@tuwien.ac.at)
///
/// \date 2019
///
-/// \brief Definition of *state detector* *functionality*.
+/// \brief Definition of *signal state detector* *functionality*.
///
//===----------------------------------------------------------------------===//
-
-#ifndef ROSA_AGENT_STATEDETECTOR_HPP
-#define ROSA_AGENT_STATEDETECTOR_HPP
+#ifndef ROSA_AGENT_SIGNALSTATEDETECTOR_HPP
+#define ROSA_AGENT_SIGNALSTATEDETECTOR_HPP
#include "rosa/agent/FunctionAbstractions.hpp"
#include "rosa/agent/Functionality.h"
#include "rosa/agent/SignalState.hpp"
#include <vector>
-// TODO: change everything from state to signal state
-
namespace rosa {
namespace agent {
-/// Implements \c rosa::agent::StateDetector as a functionality that detects
-/// states given on input samples.
+/// Implements \c rosa::agent::SignalStateDetector as a functionality that
+/// detects signal states given on input samples.
///
/// \note This implementation is supposed to be used for samples of an
/// arithmetic type.
///
/// \tparam INDATATYPE is the type of input data, \tparam CONFDATATYPE is type
/// of
/// data in that the confidence values are given
template <typename INDATATYPE, typename CONFDATATYPE>
class SignalStateDetector : public Functionality {
// Make sure the actual type arguments are matching our expectations.
STATIC_ASSERT((std::is_arithmetic<INDATATYPE>::value),
"input data type not arithmetic");
STATIC_ASSERT((std::is_arithmetic<CONFDATATYPE>::value),
"confidence abstraction type is not to arithmetic");
private:
// For the convinience to write a shorter data type name
using PartFuncPointer =
std::shared_ptr<PartialFunction<INDATATYPE, CONFDATATYPE>>;
using StepFuncPointer =
std::shared_ptr<StepFunction<INDATATYPE, CONFDATATYPE>>;
- using StatePtr = std::shared_ptr<StateInformation<CONFDATATYPE>>;
- using StateInfoPtr = std::shared_ptr<StateInformation<CONFDATATYPE>>;
+ using SignalStatePtr = std::shared_ptr<SignalStateInformation<CONFDATATYPE>>;
+ using SignalStateInfoPtr =
+ std::shared_ptr<SignalStateInformation<CONFDATATYPE>>;
- /// The NextStateID is a counter variable which stores the ID which the next
- /// state shall have.
- unsigned int NextStateID;
+ /// The NextSignalStateID is a counter variable which stores the ID which the
+ /// next signal state shall have.
+ unsigned int NextSignalStateID;
- /// The SignalStateHasChanged is a flag that show whether a state change has
- /// happened.
+ /// The SignalStateHasChanged is a flag that show whether a signal has changed
+ /// its state.
bool SignalStateHasChanged;
- /// The CurrentState is a pointer to the (saved) state in which the actual
- /// variable (signal) of the observed system is.
- StatePtr CurrentState;
+ /// The CurrentSignalState is a pointer to the (saved) signal state in which
+ /// the actual variable (signal) of the observed system is.
+ SignalStatePtr CurrentSignalState;
- /// The DetectedStates is vector in that all detected states are saved.
+ /// The DetectedSignalStates is vector in that all detected signal states are
+ /// saved.
// TODO: make it to history
- std::vector<StatePtr> DetectedStates;
+ DynamicLengthHistory<SignalStatePtr, HistoryPolicy::SRWF>
+ DetectedSignalStates;
+ // std::vector<SignalStatePtr> DetectedSignalStates;
/// The FuzzyFunctionSampleMatches is the fuzzy function that gives the
/// confidence how good the new sample matches another sample in the sample
/// history.
PartFuncPointer FuzzyFunctionSampleMatches;
/// The FuzzyFunctionSampleMismatches is the fuzzy function that gives the
/// confidence how bad the new sample matches another sample in the sample
/// history.
PartFuncPointer FuzzyFunctionSampleMismatches;
/// The FuzzyFunctionNumOfSamplesMatches is the fuzzy function that gives the
/// confidence how many samples from the sampe history match the new sample.
StepFuncPointer FuzzyFunctionNumOfSamplesMatches;
/// The FuzzyFunctionNumOfSamplesMismatches is the fuzzy function that gives
/// the confidence how many samples from the sampe history mismatch the new
/// sample.
StepFuncPointer FuzzyFunctionNumOfSamplesMismatches;
/// The FuzzyFunctionSignalIsDrifting is the fuzzy function that gives the
/// confidence how likely it is that the signal is drifting.
PartFuncPointer FuzzyFunctionSignalIsDrifting;
/// The FuzzyFunctionSignalIsStable is the fuzzy function that gives the
/// confidence how likely it is that the signal is stable (not drifting).
PartFuncPointer FuzzyFunctionSignalIsStable;
/// SampleHistorySize is the (maximum) size of the sample history.
unsigned int SampleHistorySize;
/// DABSize the size of a DAB (Discrete Average Block).
unsigned int DABSize;
/// DABHistorySize is the (maximum) size of the DAB history.
unsigned int DABHistorySize;
public:
/// Creates an instance by setting all parameters
/// \param FuzzyFunctionSampleMatches The FuzzyFunctionSampleMatches is the
/// fuzzy function that gives the confidence how good the new sample matches
/// another sample in the sample history.
///
/// \param FuzzyFunctionSampleMismatches The FuzzyFunctionSampleMismatches is
/// the fuzzy function that gives the confidence how bad the new sample
/// matches another sample in the sample history.
///
/// \param FuzzyFunctionNumOfSamplesMatches The
/// FuzzyFunctionNumOfSamplesMatches is the fuzzy function that gives the
/// confidence how many samples from the sampe history match the new sample.
///
/// \param FuzzyFunctionNumOfSamplesMismatches The
/// FuzzyFunctionNumOfSamplesMismatches is the fuzzy function that gives the
/// confidence how many samples from the sampe history mismatch the new
/// sample.
///
/// \param FuzzyFunctionSignalIsDrifting The FuzzyFunctionSignalIsDrifting is
/// the fuzzy function that gives the confidence how likely it is that the
/// signal (resp. the state of a signal) is drifting.
///
/// \param FuzzyFunctionSignalIsStable The FuzzyFunctionSignalIsStable is the
/// fuzzy function that gives the confidence how likely it is that the signal
/// (resp. the state of a signal) is stable (not drifting).
///
/// \param SampleHistorySize Sets the History size which will be used by \c
- /// State .
+ /// SignalState.
///
- /// \param DABSize Sets the DAB size which will be used by \c State .
+ /// \param DABSize Sets the DAB size which will be used by \c SignalState.
///
- /// \param DABHistorySize Sets the size which will be used by \c State .
+ /// \param DABHistorySize Sets the size which will be used by \c SignalState.
///
- StateDetector(PartFuncPointer FuzzyFunctionSampleMatches,
- PartFuncPointer FuzzyFunctionSampleMismatches,
- StepFuncPointer FuzzyFunctionNumOfSamplesMatches,
- StepFuncPointer FuzzyFunctionNumOfSamplesMismatches,
- PartFuncPointer FuzzyFunctionSignalIsDrifting,
- PartFuncPointer FuzzyFunctionSignalIsStable,
- unsigned int SampleHistorySize, unsigned int DABSize,
- unsigned int DABHistorySize) noexcept
- : NextStateID(1), StateHasChanged(false), CurrentState(NULL),
+ SignalStateDetector(PartFuncPointer FuzzyFunctionSampleMatches,
+ PartFuncPointer FuzzyFunctionSampleMismatches,
+ StepFuncPointer FuzzyFunctionNumOfSamplesMatches,
+ StepFuncPointer FuzzyFunctionNumOfSamplesMismatches,
+ PartFuncPointer FuzzyFunctionSignalIsDrifting,
+ PartFuncPointer FuzzyFunctionSignalIsStable,
+ unsigned int SampleHistorySize, unsigned int DABSize,
+ unsigned int DABHistorySize) noexcept
+ : NextSignalStateID(1), SignalStateHasChanged(false),
+ CurrentSignalState(NULL),
FuzzyFunctionSampleMatches(FuzzyFunctionSampleMatches),
FuzzyFunctionSampleMismatches(FuzzyFunctionSampleMismatches),
FuzzyFunctionNumOfSamplesMatches(FuzzyFunctionNumOfSamplesMatches),
FuzzyFunctionNumOfSamplesMismatches(
FuzzyFunctionNumOfSamplesMismatches),
FuzzyFunctionSignalIsDrifting(FuzzyFunctionSignalIsDrifting),
FuzzyFunctionSignalIsStable(FuzzyFunctionSignalIsStable),
SampleHistorySize(SampleHistorySize), DABSize(DABSize),
DABHistorySize(DABHistorySize) {}
/// Destroys \p this object.
~SignalStateDetector(void) = default;
/// Detects a signal state to which the new sample belongs or create a new
- /// state if
- /// the new sample does not match to any of the saved states.
+ /// signal state if the new sample does not match to any of the saved signal
+ /// states.
///
/// \param Sample is the actual sample of the observed signal.
///
- /// \return the signal state ID as unsigend integer type. State IDs start with
- /// number
- /// 1; that means if there is no current state, the return value is 0.
+ /// \return the signal state ID as unsigend integer type. Signal state IDs
+ /// start with number 1; that means if there is no current signal state, the
+ /// return value is 0.
unsigned int detectSignalState(INDATATYPE Sample) noexcept {
- StateInfoPtr StateInfo = detectState__debug(Sample);
- return StateInfo->StateID;
+ SignalStateInfoPtr SignalStateInfo = detectSignalState__debug(Sample);
+ return SignalStateInfo->SignalStateID;
}
- /// Gives information about the current state.
+ /// Gives information about the current signal state.
///
- /// \return a the Signal State ID (as unsigned integer type) of the current
- /// state.
- /// State IDs start with number 1; that means if there is no current state,
- /// the return value is 0.
+ /// \return a the signal state ID (as unsigned integer type) of the current
+ /// signal state. Signal state IDs start with number 1; that means if there is
+ /// no current signal state, the return value is 0.
unsigned int currentSignalStateInformation(void) noexcept {
- StateInfoPtr StateInfo = currentStateInformation__debug();
- if (StateInfo) {
- return StateInfo->StateID;
+ SignalStateInfoPtr SignalStateInfo = currentSignalStateInformation__debug();
+ if (SignalStateInfo) {
+ return SignalStateInfo->SignalStateID;
} else {
return 0;
}
}
- /// Gives information whether a state change has happened or not.
+ /// Gives information whether a signal state change has happened or not.
///
- /// \return true if a state change has happened, and false if not.
- bool SignallStateHasChanged(void) noexcept { return SignallStateHasChanged; }
+ /// \return true if a signal state change has happened, and false if not.
+ bool signalStateHasChanged(void) noexcept { return SignalStateHasChanged; }
private:
// TODO: change exlaination! it is not totally right
//@maxi \param is there to Document a specific parameter of a method/function
// this method doesn't have any parameters.
- /// Creates a new state and adds this state to the state vector in which all
- /// known states are saved.
+ /// Creates a new signal state and adds it to the signal state vector in which
+ /// all known states are saved.
///
/// \param SampleHistorySize the (maximum) size of the sample history.
/// \param DABSize the size of a DAB.
/// \param DABHistorySize the (maximum) size of the DAB history.
/// \param FuzzyFunctionSampleMatches the
/// \param FuzzyFunctionSampleMismatches
/// \param FuzzyFunctionNumOfSamplesMatches
/// \param FuzzyFunctionNumOfSamplesMismatches
///
- /// \return a pointer to the newly created state or NULL if no state could be
- /// created.
- StatePtr createNewState(void) noexcept {
- StatePtr S = new (std::nothrow) State(
- NextStateID, SampleHistorySize, DABSize, DABHistorySize,
+ /// \return a pointer to the newly created signal state or NULL if no state
+ /// could be created.
+ SignalStatePtr createNewSignalState(void) noexcept {
+ SignalStatePtr S = new (std::nothrow) SignalState(
+ NextSignalStateID, SampleHistorySize, DABSize, DABHistorySize,
FuzzyFunctionSampleMatches, FuzzyFunctionSampleMismatches,
FuzzyFunctionNumOfSamplesMatches, FuzzyFunctionNumOfSamplesMismatches);
// @benedikt: todo: assert in history, which checks if push_back worked
- DetectedStates.push_back(S);
+ DetectedSignalStates.addEntry(S);
return S;
}
-#ifdef STATEDETECTORDEBUGMODE
+#ifdef SIGNALSTATEDETECTORDEBUGMODE
public:
#else
private:
-#endif // STATEDETECTORDEBUGMODE
+#endif // SIGNALSTATEDETECTORDEBUGMODE
// @maxi is this a debug method or is it a method that will be used and
// you simply want to have access to it in debug mode?
// debug -> extend the preprocessor around the function
// access -> remove the __debug from the name ( it is confusing)
// if you want to have it marked as a debug method for auto
// complete you can do something like this :
//
//#ifdef STATEDETECTORDEBUGMODE
// public:
// StateInfoPtr debug_detectState(INDATATYPE Sample) {
// return detectState(Sample);
// }
//#endif // STATEDETECTORDEBUGMODE
// private :
// StateInfoPtr detectState(INDATATYPE Sample) { ...
//
- /// Detects the state to which the new sample belongs or create a new state if
- /// the new sample does not match to any of the saved states.
+ /// Detects the signal state to which the new sample belongs or create a new
+ /// signal state if the new sample does not match to any of the saved states.
///
/// \param Sample is the actual sample of the observed signal.
///
- /// \return the information of the actual state (state ID and other
+ /// \return the information of the current signal state (signal state ID and
+ /// other
/// parameters).
// TODO: return something const.. cannot remember exactly (ask benedikt)
//
// maybe: you are returning a pointer to the state info so who ever has that
// pointer can actually change the information if you want to return only the
// *current info* return a copy of the state info
// like this:
//
// StateInfoPtr detectState__debug(INDATATYPE Sample) ->
// StateInformation<CONFTYPE> detectState__debug(INDATATYPE Sample)
//
// return CurrentState->stateInformation(); ->
// return *(CurrentState->stateInformation());
- StateInfoPtr detectState__debug(INDATATYPE Sample) noexcept {
+ SignalStateInfoPtr detectSignalState__debug(INDATATYPE Sample) noexcept {
- if (!CurrentState) {
- ASSERT(DetectedStates.empty());
+ if (!CurrentSignalState) {
+ ASSERT(DetectedSignalStates.empty());
- StatePtr S = createNewState();
- CurrentState = S;
+ SignalStatePtr S = createNewSignalState();
+ CurrentSignalState = S;
} else {
- CONFDATATYPE ConfidenceSampleMatchesState =
- CurrentState->confSampleMatchesState(Sample);
- CONFDATATYPE ConfidenceSampleMismatchesState =
- CurrentState->confSampleMismatchesState(Sample);
+ CONFDATATYPE ConfidenceSampleMatchesSignalState =
+ CurrentSignalState->confSampleMatchesSignalState(Sample);
+ CONFDATATYPE ConfidenceSampleMismatchesSignalState =
+ CurrentSignalState->confSampleMismatchesSignalState(Sample);
- if (ConfidenceSampleMatchesState > ConfidenceSampleMismatchesState) {
+ if (ConfidenceSampleMatchesSignalState >
+ ConfidenceSampleMismatchesSignalState) {
SignalStateHasChanged = false;
} else {
SignalStateHasChanged = true;
- if (CurrentState->stateInformation()->StateIsValid) {
- CurrentState->leaveState();
+ if (CurrentSignalState->signalStateInformation()->SignalStateIsValid) {
+ CurrentSignalState->leaveSignalState();
} else {
- DetectedStates.erase(std::find(DetectedStates.begin(),
- DetectedStates.end(), CurrentState));
+ //@benedikt: changed from vector to history. can i still do the next
+ // line?
+ DetectedSignalStates.erase(std::find(DetectedSignalStates.begin(),
+ DetectedSignalStates.end(),
+ CurrentSignalState));
}
- // TODO (future): additionally save averages to enable fast
- // iteration through recorded state vector (maybe sort vector based on
- // these average values)
- CurrentState = nullptr;
-
- for (auto &SavedState : DetectedStates) {
- if (SavedState != CurrentState) {
- CONFDATATYPE ConfidenceSampleMatchesState =
- SavedState->confSampleMatchesState(Sample);
- CONFDATATYPE ConfidenceSampleMismatchesState =
- SavedState->confSampleMismatchesState(Sample);
-
- if (ConfidenceSampleMatchesState >
- ConfidenceSampleMismatchesState) {
+ // TODO (future): additionally save averages to enable fast iteration
+ // through recorded signl state history (maybe sort vector based on
+ // these
+ // average values)
+ CurrentSignalState = nullptr;
+
+ //@benedikt: same question
+ for (auto &SavedSignalState : DetectedSignalStates) {
+ if (SavedSignalState != CurrentSignalState) {
+ CONFDATATYPE ConfidenceSampleMatchesSignalState =
+ SavedSignalState->confSampleMatchesSignalState(Sample);
+ CONFDATATYPE ConfidenceSampleMismatchesSignalState =
+ SavedSignalState->confSampleMismatchesSignalState(Sample);
+
+ if (ConfidenceSampleMatchesSignalState >
+ ConfidenceSampleMismatchesSignalState) {
// TODO (future): maybe it would be better to compare
- // ConfidenceSampleMatchesState of all states in the vector in
- // order to find the best matching state.
- CurrentState = SavedState;
+ // ConfidenceSampleMatchesSignalState of all signal states in the
+ // vector in order to find the best matching signal state.
+ CurrentSignalState = SavedSignalState;
break;
}
}
}
- if (!CurrentState) {
- StatePtr S = createNewState();
- CurrentState = S;
+ if (!CurrentSignalState) {
+ SignalStatePtr S = createNewSignalState();
+ CurrentSignalState = S;
}
}
}
- StateInformation<CONFDATATYPE> StateInfo =
- CurrentState->insertSample(Sample);
+ SignalStateInformation<CONFDATATYPE> SignalStateInfo =
+ CurrentSignalState->insertSample(Sample);
- if (StateInfo.StateJustGotValid) {
- NextStateID++;
+ if (SignalStateInfo.SignalStateJustGotValid) {
+ NextSignalStateID++;
}
- return StateInfo;
+ return SignalStateInfo;
}
-#ifdef STATEDETECTORDEBUGMODE
+#ifdef SIGNALSTATEDETECTORDEBUGMODE
public:
#else
private:
-#endif // STATEDETECTORDEBUGMODE
+#endif // SIGNALSTATEDETECTORDEBUGMODE
- /// Gives information about the current state.
+ /// Gives information about the current signal state.
///
- /// \return a struct StateInformation that contains information about the
- /// current state or NULL if no current state exists.
- StateInformation<CONFDATATYPE> currentStateInformation__debug(void) noexcept {
- if (CurrentState) {
- return CurrentState->stateInformation();
+ /// \return a struct SignalStateInformation that contains information about
+ /// the
+ /// current signal state or NULL if no current signal state exists.
+ SignalStateInformation<CONFDATATYPE>
+ currentSignalStateInformation__debug(void) noexcept {
+ if (CurrentSignalState) {
+ return CurrentSignalState->signalStateInformation();
} else {
return NULL;
}
}
};
} // End namespace agent
} // End namespace rosa
-#endif // ROSA_AGENT_STATEDETECTOR_HPP
+#endif // ROSA_AGENT_SIGNALSTATEDETECTOR_HPP

File Metadata

Mime Type
text/x-diff
Expires
Thu, Jul 3, 10:21 PM (9 h, 4 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
157376
Default Alt Text
(41 KB)

Event Timeline