package org.aksw.jena_sparql_api.concept_cache.combinatorics;
import java.util.Collection;
import java.util.Map;
import java.util.Set;
import java.util.stream.Stream;
import org.aksw.combinatorics.solvers.Problem;
import org.aksw.combinatorics.solvers.ProblemNeighborhoodAware;
import org.aksw.jena_sparql_api.utils.QuadPatternUtils;
import org.apache.jena.sparql.core.Quad;
import org.apache.jena.sparql.core.Var;
public class ProblemVarMappingQuad
extends ProblemMappingVarsBase<Quad, Quad, Var, Var>
{
/**
* The constraints that apply to the given quads
*/
public ProblemVarMappingQuad(Collection<Quad> as, Collection<Quad> bs, Map<Var, Var> baseSolution) {
super(as, bs, baseSolution);
}
@Override
public Stream<Map<Var, Var>> generateSolutions() {
Stream<Map<Var, Var>> result = CombinatoricsUtils.createSolutions(as, bs, baseSolution);
return result;
}
@Override
public Collection<ProblemNeighborhoodAware<Map<Var, Var>, Var>> refine(Map<Var, Var> partialSolution) {
Collection<ProblemNeighborhoodAware<Map<Var, Var>, Var>> result = Refinement.refineQuads(
as,
bs,
baseSolution,
partialSolution);
return result;
}
@Override
public Collection<Var> getSourceNeighbourhood() {
Set<Var> result = QuadPatternUtils.getVarsMentioned(as);
return result;
}
// @Override
// public Collection<Var> exposeTargetNeighbourhood() {
// Set<Var> result = QuadPatternUtils.getVarsMentioned(bs);
// return result;
// }
// public static Multimap<Set<Expr>, Set<Expr>> signatureToClauses(Iterable<? extends Iterable<Expr>> clauses) {
// Multimap<Set<Expr>, Set<Expr>> result = HashMultimap.create();
// for(Iterable<Expr> clause : clauses) {
// Set<Expr> signature = ClauseUtils.signaturize(clause);
// Set<Expr> c = SetUtils.asSet(clause);
// result.put(signature, c);
// }
//
// return result;
// }
//
//
// /**
// *
// * { v1: (g, s, x, a),
// * v2: (g, s, y, b) }
// *
// * fn(s, x, g)
// *
// * { (a -> x), (b -> y) }
// *
// * label(join_v1_v2(v1, v2)):
// *
// *
// * every state can have a set of open problems and a flag of whether its parent may have open problems.
// *
// *
// *
// * @param quads
// * @param varMap
// */
// public static Collection<Collection<Quad>> refine(Collection<Quad> quads, Map<Var, Var> varMap) {
// return null;
// }
//
// public static QuadFilterPatternCanonical refine(QuadFilterPatternCanonical qfpc, Map<Var, Var> varMap) {
//// QuadFilterPatternCanonical aQfpc = new QuadFilterPatternCanonical(as, aCnf);
//// QuadFilterPatternCanonical bQfpc = new QuadFilterPatternCanonical(bs, bCnf);
// QuadFilterPatternCanonical aQfpc = new QuadFilterPatternCanonical(null, null);
// QuadFilterPatternCanonical bQfpc = new QuadFilterPatternCanonical(null, null);
//
// QuadFilterPatternCanonical aNewQfpc = QuadFilterPatternCanonical.applyVarMapping(aQfpc, varMap);
// QuadFilterPatternCanonical bNewQfpc = QuadFilterPatternCanonical.applyVarMapping(bQfpc, varMap);
//
// IBiSetMultimap<Quad, Set<Set<Expr>>> aQuadToCnf = SparqlCacheUtils.createMapQuadsToFilters(aNewQfpc);
// IBiSetMultimap<Quad, Set<Set<Expr>>> bQuadToCnf = SparqlCacheUtils.createMapQuadsToFilters(bNewQfpc);
//
// IBiSetMultimap<Set<Set<Expr>>, Quad> aCnfToQuad = aQuadToCnf.getInverse();
// IBiSetMultimap<Set<Set<Expr>>, Quad> bCnfToQuad = bQuadToCnf.getInverse();
//
//// Set<Set<Set<Expr>>> keys = Sets.union(aCnfToQuad.keySet(), bCnfToQuad.keySet());
//// for()
//
// List<Problem<Map<Var, Var>>> problems = new ArrayList<>();
// Map<Set<Set<Expr>>, Entry<Set<Quad>, Set<Quad>>> quadGroups = groupByKey(aCnfToQuad, bCnfToQuad);
//
// for(Entry<Set<Quad>, Set<Quad>> quadGroup : quadGroups.values()) {
// Set<Quad> as = quadGroup.getKey();
// Set<Quad> bs = quadGroup.getValue();
// Problem<Map<Var, Var>> x = new ProblemVarMappingQuad(as, bs, varMap);
// problems.add(x);
// }
//
//
// Multimap<Set<Expr>, Set<Expr>> mapA = signatureToClauses(aQfpc.getFilterCnf());
// Multimap<Set<Expr>, Set<Expr>> mapB = signatureToClauses(bQfpc.getFilterCnf());
//
// Map<Set<Expr>, Entry<Set<Set<Expr>>, Set<Set<Expr>>>> exprGroups = groupByKey(mapA.asMap(), mapB.asMap());
//
// for(Entry<Set<Set<Expr>>, Set<Set<Expr>>> entry : exprGroups.values()) {
// Set<Set<Expr>> as = entry.getKey();
// Set<Set<Expr>> bs = entry.getValue();
// Problem<Map<Var, Var>> x = null; //new ProblemVarMappingExpr(as, bs, varMap);
// problems.add(x);
// }
//
//
//
// // re-index the expressions
// //SparqlCacheUtils.createM
//
//
//
// //quadGroups.entrySet().stream()
//
//
//
// //NodeTransform nodeTransform = new Node
// return null;
// }
// public static <K, V> Map<K, Entry<Set<V>, Set<V>>> groupByKey(Multimap<K, V> a, Map<K, V> b) {
// Map<K, Entry<V, V>> result = new HashMap<>();
//
// Set<K> keys = Sets.union(a.keySet(), b.keySet());
// keys.forEach(
// k -> {
// Set<V> av = SetUtils.asSet(a.get(k));
// Set<V> bv = SetUtils.asSet(b.get(k));
//
// Entry<Set<V>, Set<V>> e = new SimpleEntry<>(av, bv);
// result.put(k, e);
// }
// );
//
// return result;
// }
}