Page Menu
Home
Phorge
Search
Configure Global Search
Log In
Files
F10549291
SystemState.hpp
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Size
8 KB
Referenced Files
None
Subscribers
None
SystemState.hpp
View Options
//===-- rosa/agent/SystemState.hpp ------------------------------*- C++ -*-===//
//
// The RoSA Framework
//
//===----------------------------------------------------------------------===//
///
/// \file rosa/agent/SystemState.hpp
///
/// \author Maximilian Götzinger (maximilian.goetzinger@tuwien.ac.at)
///
/// \date 2019
///
/// \brief Definition of *system state* *functionality*.
///
//===----------------------------------------------------------------------===//
#ifndef ROSA_AGENT_SYSTEMSTATE_HPP
#define ROSA_AGENT_SYSTEMSTATE_HPP
#include
"rosa/agent/Functionality.h"
#include
"rosa/agent/SignalState.hpp"
#include
"rosa/agent/State.hpp"
#include
"rosa/support/debug.hpp"
#include
<vector>
namespace
rosa
{
namespace
agent
{
enum
class
SystemStateRelation
:
uint8_t
{
STATEISMATCHING
=
0
,
///< The system state is matching
ONLYINPUTISMATCHING
=
1
,
///< Only inputs of the system state are matching
ONLYOUTPUTISMATCHING
=
2
,
///< Only outputs of the system state are matching
STATEISMISMATCHING
=
3
///< The system state is mismatching
};
/// TODO: write description
template
<
typename
CONFDATATYPE
>
struct
SystemStateInformation
:
StateInformation
<
CONFDATATYPE
>
{
/// TODO: describe
CONFDATATYPE
ConfidenceStateIsFunctioning
;
CONFDATATYPE
ConfidenceStateIsMalfunctioning
;
CONFDATATYPE
ConfidenceOfAllDecisions
;
};
// todo: do we need PROCDATATYPE?
/// TODO TEXT
template
<
typename
INDATATYPE
,
typename
CONFDATATYPE
,
typename
PROCDATATYPE
>
class
SystemState
:
public
State
<
INDATATYPE
,
CONFDATATYPE
,
PROCDATATYPE
>
{
// Make sure the actual type arguments are matching our expectations.
STATIC_ASSERT
(
std
::
is_arithmetic
<
INDATATYPE
>::
value
,
"input data type is not to arithmetic"
);
STATIC_ASSERT
(
std
::
is_arithmetic
<
CONFDATATYPE
>::
value
,
"confidence abstraction type is not to arithmetic"
);
STATIC_ASSERT
(
std
::
is_arithmetic
<
PROCDATATYPE
>::
value
,
"process data type is not to arithmetic"
);
private
:
/// SignalStateInfo is a struct of SignalStateInformation that contains
/// information about the current signal state.
SystemStateInformation
<
CONFDATATYPE
>
SystemStateInfo
;
std
::
vector
<
SignalStateInformation
<
CONFDATATYPE
>>
SignalStateInfos
;
uint32_t
NumberOfSignals
;
public
:
/// TODO: write description
SystemState
(
uint32_t
StateID
,
uint32_t
NumberOfSignals
)
noexcept
:
SystemStateInfo
{
StateID
,
StateConditions
::
UNKNOWN
,
false
,
false
,
false
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
},
NumberOfSignals
(
NumberOfSignals
)
{
//@benedikt: there is now possibility to not doing the resize within these
//{}-brackets, right?
SignalStateInfos
.
resize
(
NumberOfSignals
);
}
/// Destroys \p this object.
~
SystemState
(
void
)
=
default
;
/// TODO: write description
SystemStateInformation
<
CONFDATATYPE
>
insertSignalStateInformation
(
const
std
::
vector
<
SignalStateInformation
<
CONFDATATYPE
>>
_SignalStateInfos
)
noexcept
{
ASSERT
(
_SignalStateInfos
.
size
()
<
NumberOfSignals
);
bool
AllSignalsAreValid
=
true
;
bool
AtLeastOneSignalJustGotValid
=
false
;
bool
AllSignalsAreValidAfterReentrance
=
true
;
bool
AllSignalsAreStable
=
true
;
CONFDATATYPE
CombinedConfidenceOfMatchingState
=
_SignalStateInfos
.
front
().
ConfidenceOfMatchingState
;
CONFDATATYPE
CombinedConfidenceOfMismatchingState
=
_SignalStateInfos
.
front
().
ConfidenceOfMismatchingState
;
CONFDATATYPE
CombinedConfidenceStateIsValid
=
_SignalStateInfos
.
front
().
ConfidenceStateIsValid
;
CONFDATATYPE
CombinedConfidenceStateIsInvalid
=
_SignalStateInfos
.
front
().
ConfidenceStateIsInvalid
;
CONFDATATYPE
CombinedConfidenceStateIsStable
=
_SignalStateInfos
.
front
().
ConfidenceStateIsStable
;
CONFDATATYPE
CombinedConfidenceStateIsDrifting
=
_SignalStateInfos
.
front
().
ConfidenceStateIsDrifting
;
std
::
size_t
counter
=
0
;
for
(
auto
SSI
:
_SignalStateInfos
)
{
if
(
!
SSI
.
StateIsValid
)
AllSignalsAreValid
=
false
;
if
(
SSI
.
StateJustGotValid
)
AtLeastOneSignalJustGotValid
=
true
;
if
(
!
SSI
.
StateIsValidAfterReentrance
)
AllSignalsAreValidAfterReentrance
=
false
;
if
(
SSI
.
StateCondition
==
StateConditions
::
DRIFTING
)
AllSignalsAreStable
=
false
;
//@benedikt: instead of the initializing above and the and/or with itself,
// I could make here an if (counter == 0)
CombinedConfidenceOfMatchingState
=
fuzzyAND
(
CombinedConfidenceOfMatchingState
,
SSI
.
ConfidenceOfMatchingState
);
CombinedConfidenceOfMismatchingState
=
fuzzyOR
(
CombinedConfidenceOfMismatchingState
,
SSI
.
ConfidenceOfMismatchingState
);
CombinedConfidenceStateIsValid
=
fuzzyAND
(
CombinedConfidenceStateIsValid
,
SSI
.
ConfidenceStateIsValid
);
CombinedConfidenceStateIsInvalid
=
fuzzyOR
(
CombinedConfidenceStateIsInvalid
,
SSI
.
ConfidenceStateIsInvalid
);
CombinedConfidenceStateIsStable
=
fuzzyAND
(
CombinedConfidenceStateIsStable
,
SSI
.
ConfidenceStateIsStable
);
CombinedConfidenceStateIsDrifting
=
fuzzyOR
(
CombinedConfidenceStateIsDrifting
,
SSI
.
ConfidenceStateIsDrifting
);
this
->
SignalStateInfos
.
at
(
counter
)
=
SSI
;
counter
++
;
}
SystemStateInfo
.
StateIsValid
=
AllSignalsAreValid
;
SystemStateInfo
.
StateJustGotValid
=
AllSignalsAreValid
&&
AtLeastOneSignalJustGotValid
;
SystemStateInfo
.
StateIsValidAfterReentrance
=
AllSignalsAreValidAfterReentrance
;
return
SystemStateInfo
;
}
/// TODO: write description
// TODO (future): think about saving the state information in a history
SystemStateRelation
compareSignalStateInformation
(
const
std
::
vector
<
SignalStateInformation
<
CONFDATATYPE
>>
_SignalStateInfos
)
noexcept
{
bool
inputsAreMatching
=
true
;
bool
outputsAreMatching
=
true
;
std
::
size_t
counter
=
0
;
for
(
auto
SSI
:
_SignalStateInfos
)
{
if
(
this
->
SignalStateInfos
.
at
(
counter
).
StateID
!=
SSI
.
StateID
)
{
if
(
SSI
.
SignalProperty
==
SignalProperties
::
INPUT
)
inputsAreMatching
=
false
;
else
// SignalProperties::OUTPUT
outputsAreMatching
=
false
;
}
counter
++
;
}
if
(
inputsAreMatching
&&
outputsAreMatching
)
return
SystemStateRelation
::
STATEISMATCHING
;
else
if
(
inputsAreMatching
&&
!
outputsAreMatching
)
return
SystemStateRelation
::
ONLYINPUTISMATCHING
;
else
if
(
!
inputsAreMatching
&&
outputsAreMatching
)
return
SystemStateRelation
::
ONLYOUTPUTISMATCHING
;
else
return
SystemStateRelation
::
STATEISMISMATCHING
;
}
#ifdef ADDITIONAL_FUNCTIONS
/// TODO: write description
template
<
std
::
size_t
size
>
void
insertSignalStateInformation
(
const
std
::
array
<
SystemStateInformation
<
CONFDATATYPE
>
,
size
>
&
Data
)
noexcept
{
ASSERT
(
size
<=
NumberOfSignals
);
std
::
size_t
counter
=
0
;
for
(
auto
tmp
:
Data
)
{
Signals
.
at
(
counter
)
=
tmp
;
counter
++
;
}
}
/// TODO: write description
template
<
typename
...
Types
>
std
::
enable_if_t
<
std
::
conjunction_v
<
std
::
is_same
<
Types
,
SystemStateInformation
<
CONFDATATYPE
>>
...
>
,
void
>
insertSignalStateInformation
(
Types
...
Data
)
{
// TODO (future): think about saving the state information in a history
insertSignalStateInfos
(
std
::
array
<
SystemStateInformation
<
CONFDATATYPE
>
,
sizeof
...(
Data
)
>
(
{
Data
...}));
}
// returns true if they are identical
/// TODO: write description
template
<
std
::
size_t
size
>
bool
compareSignalStateInformation
(
const
std
::
array
<
SystemStateInformation
<
CONFDATATYPE
>
,
size
>
&
Data
)
noexcept
{
// TODO (future): think about saving the state information in a history
std
::
size_t
counter
=
0
;
for
(
auto
tmp
:
Data
)
{
if
(
Signals
.
at
(
counter
)
!=
tmp
)
return
false
;
counter
++
;
}
return
true
;
}
// checks only the given amount
/// TODO: write description
template
<
typename
...
Types
>
std
::
enable_if_t
<
std
::
conjunction_v
<
std
::
is_same
<
Types
,
SystemStateInformation
<
CONFDATATYPE
>>
...
>
,
bool
>
compareSignalStateInformation
(
Types
...
Data
)
{
return
compareSignalStateInfos
(
std
::
array
<
SystemStateInformation
<
CONFDATATYPE
>
,
sizeof
...(
Data
)
>
(
{
Data
...}));
}
#endif
/// Gives information about the current signal state.
///
/// \return a struct SignalStateInformation that contains information about
/// the current signal state.
SystemStateInformation
<
CONFDATATYPE
>
systemStateInformation
(
void
)
noexcept
{
return
SystemStateInfo
;
}
};
}
// End namespace agent
}
// End namespace rosa
#endif
// ROSA_AGENT_SYSTEMSTATE_HPP
File Metadata
Details
Attached
Mime Type
text/x-c++
Expires
Sat, May 30, 11:57 PM (1 d, 1 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
328492
Default Alt Text
SystemState.hpp (8 KB)
Attached To
Mode
R20 SoC_Rosa_repo
Attached
Detach File
Event Timeline
Log In to Comment