use of com.vaticle.typedb.core.pattern.equivalence.AlphaEquivalence in project grakn by graknlabs.
the class ResolverRegistry method registerConcludable.
// note: must be thread safe. We could move to a ConcurrentHashMap if we create an alpha-equivalence wrapper
private synchronized ResolverView.MappedConcludable registerConcludable(Concludable concludable) {
LOG.debug("Register ConcludableResolver: '{}'", concludable.pattern());
for (Map.Entry<Concludable, Actor.Driver<ConcludableResolver>> c : concludableResolvers.entrySet()) {
// TODO: This needs to be optimised from a linear search to use an alpha hash
AlphaEquivalence alphaEquality = concludable.alphaEquals(c.getKey());
if (alphaEquality.isValid()) {
return ResolverView.concludable(c.getValue(), alphaEquality.asValid().idMapping());
}
}
Actor.Driver<ConcludableResolver> resolver = Actor.driver(driver -> new ConcludableResolver(driver, concludable, this, traversalEngine, conceptMgr, logicMgr, resolutionTracing), executorService);
concludableResolvers.put(concludable, resolver);
resolvers.add(resolver);
// guard races without synchronized
if (terminated.get())
throw TypeDBException.of(RESOLUTION_TERMINATED);
return ResolverView.concludable(resolver, identity(concludable));
}
use of com.vaticle.typedb.core.pattern.equivalence.AlphaEquivalence in project grakn by graknlabs.
the class RelationConstraint method alphaEquals.
@Override
public AlphaEquivalence alphaEquals(RelationConstraint that) {
return AlphaEquivalence.valid().validIf(players().size() == that.players().size()).addOrInvalidate(() -> Iterators.permutation(players()).stream().map(playersPermutation -> {
Iterator<RolePlayer> thisRolePlayersIt = playersPermutation.iterator();
Iterator<RolePlayer> thatRolePlayersIt = that.players().iterator();
AlphaEquivalence permutationMap = AlphaEquivalence.valid();
while (thisRolePlayersIt.hasNext() && thatRolePlayersIt.hasNext()) {
permutationMap = permutationMap.validIfAlphaEqual(thisRolePlayersIt.next(), thatRolePlayersIt.next());
if (!permutationMap.isValid())
return permutationMap;
}
return permutationMap;
}).filter(AlphaEquivalence::isValid).findFirst().orElse(AlphaEquivalence.invalid()));
}
Aggregations