47 objectInstances = wm->getObjectInstancesSegment();
48 objectClasses = prior->getObjectClassesSegment();
49 objectRelations = wm->getRelationsSegment();
52 memoryx::PredicateInstanceList
56 PredicateInstanceList worldState;
57 observablePredicateInstances.clear();
59 std::unique_lock lock(updaterMutex);
61 auto start = IceUtil::Time::now().toMilliSeconds();
63 ARMARX_VERBOSE << msg << ": " << (IceUtil::Time::now().toMilliSeconds() - start) << "ms"; \
64 start = IceUtil::Time::now().toMilliSeconds();
66 for (
const auto& pair : updaters)
68 PredicateInstanceList allowedPredicates;
70 ARMARX_INFO <<
"calculating predicates of '" << pair.first <<
"'";
73 for (
const PredicateInstance& predicate : pair.second->calcPredicates())
75 if (areAllowed(predicate.argValues))
77 allowedPredicates.push_back(predicate);
86 addListToList(worldState, allowedPredicates);
91 addListToList(worldState, getNonobservableRelationsAndPredicates());
99 auto it = std::find_if(updaters.cbegin(),
101 [&](
const std::pair<std::string, WorldStateUpdaterInterfacePrx>& arg)
103 for (const auto& predicateInfo : arg.second->getPredicateInfos())
105 if (predicateInfo.name == predicateName)
113 return it != updaters.end();
117 WorldStateObserver::updatePredicateValue(
const PredicateInstance&
pi,
118 bool removePredicate,
121 memoryx::RelationBasePtr relation =
122 objectRelations->getRelationByAttrValues(
pi.name,
pi.argValues,
pi.sign);
129 objectRelations->removeEntity(relation->getId());
134 <<
", but it doesn't exist";
143 memoryx::RelationBasePtr relation =
new Relation(
pi.name,
pi.argValues,
pi.sign);
144 objectRelations->addEntity(relation);
148 ARMARX_VERBOSE <<
"Trying to add the relation " << relation->getName()
149 <<
", but it is already there";
158 WorldStateObserver::setPredicateArgumentWhitelist(
const EntityBaseList& argumentWhitelist,
161 this->argumentWhitelist = argumentWhitelist;
165 WorldStateObserver::resetPredicateArgumentWhitelist(
const Ice::Current&)
167 argumentWhitelist.clear();
171 WorldStateObserver::areAllowed(
const std::vector<EntityRefBasePtr>& entityRefs)
173 if (argumentWhitelist.empty())
178 for (
const auto& ref : entityRefs)
180 auto id = ref->entityId;
182 if (
auto instance = ObjectInstancePtr::dynamicCast(ref->getEntity()))
184 id = objectClasses->getEntityByName(instance->getMostProbableClass())->getId();
187 bool whitelisted = std::find_if(argumentWhitelist.cbegin(),
188 argumentWhitelist.cend(),
189 [&](
const EntityBasePtr& entity) {
190 return entity->getId() == id;
191 }) != argumentWhitelist.cend();
203 WorldStateObserver::addListToList(PredicateInstanceList&
target,
204 const PredicateInstanceList&
source)
207 for (
size_t i = 0; i <
source.size(); i++)
209 std::string entityNames;
211 for (
const auto& entity :
source.at(i).argValues)
213 entityNames += entity->entityName +
", ";
216 ARMARX_DEBUG <<
"adding to target: " <<
source.at(i).name <<
" args: " << entityNames;
221 PredicateInstanceList
222 WorldStateObserver::getNonobservableRelationsAndPredicates()
224 PredicateInstanceList returnPIList;
226 EntityIdList allEntityIDs = objectRelations->getAllEntityIds();
228 <<
" relations from the relations segment to the world state";
230 for (
const std::string&
id : allEntityIDs)
232 const RelationBasePtr relation = objectRelations->getRelationById(
id);
234 returnPIList.push_back(PredicateInstance{
235 relation->getName(), relation->getEntities(), relation->getSign()});
243 const PredicateInstanceList& predicates,
246 observablePredicateInstances.insert(
247 observablePredicateInstances.end(), predicates.begin(), predicates.end());
252 const WorldStateUpdaterInterfacePrx& updater,
255 std::unique_lock lock(updaterMutex);
257 if (updaters.find(name) != updaters.end())
259 throw armarx::LocalException()
260 <<
"Updater with name " << name <<
" already registered.";
263 updaters.insert(std::make_pair(name, updater));
266 WorldStateUpdaterInterfaceList
269 WorldStateUpdaterInterfaceList result;
271 for (
const auto& updater : updaters)
273 result.push_back(updater.second);