Search in sources :

Example 6 with OplMapping

use of catdata.opl.OplExp.OplMapping in project fql by CategoricalData.

the class OplWarehouse method computeColimit.

// /////////////////////////////////////////////////////////////////////////
private static void computeColimit(Map<String, OplExp> env, OplGraph<String, String> shape, String base) {
    OplUnion u0 = new OplUnion(new LinkedList<>(shape.nodes), base);
    OplObject u1 = union(env, u0);
    OplSCHEMA0<String, String, String> u = (OplSCHEMA0<String, String, String>) u1;
    Map<String, Set<String>> equivs = new HashMap<>();
    Map<String, String> equivs0 = new HashMap<>();
    for (String schname : shape.nodes) {
        if (!(env.get(schname) instanceof OplSCHEMA0)) {
            throw new RuntimeException("Not a SCHEMA: " + schname);
        }
        OplSCHEMA0<String, String, String> sch = (OplSCHEMA0<String, String, String>) env.get(schname);
        for (String ename : sch.entities) {
            Set<String> set = new HashSet<>();
            set.add(schname + "_" + ename);
            equivs.put(schname + "_" + ename, set);
        }
    }
    // TODO: aql type check colimit
    for (String mname : shape.edges.keySet()) {
        Pair<String, String> mt = shape.edges.get(mname);
        String s = mt.first;
        String t = mt.second;
        OplSCHEMA0<String, String, String> s0 = (OplSCHEMA0<String, String, String>) env.get(s);
        OplMapping<String, String, String, String, String> m0 = (OplMapping<String, String, String, String, String>) env.get(mname);
        if (!m0.src0.equals(s)) {
            throw new RuntimeException("Source of " + m0 + " is " + m0.src + " and not " + s + "as expected");
        }
        if (!m0.dst0.equals(t)) {
            throw new RuntimeException("Target of " + m0 + " is " + m0.dst + " and not " + t + "as expected");
        }
        for (String ob : s0.entities) {
            String ob0 = m0.sorts.get(ob);
            Set<String> set1 = equivs.get(s + "_" + ob);
            Set<String> set2 = equivs.get(t + "_" + ob0);
            set1.addAll(set2);
            equivs.put(s + "_" + ob, set1);
            equivs.put(t + "_" + ob0, set1);
        }
    }
    for (String k : equivs.keySet()) {
        List<String> v = new LinkedList<>(equivs.get(k));
        v.sort(String.CASE_INSENSITIVE_ORDER);
        equivs0.put(k, Util.sep(v, "__"));
    }
    Set<String> entities = new HashSet<>(equivs0.values());
    Map<String, Pair<List<String>, String>> edges = new HashMap<>();
    Map<String, Pair<List<String>, String>> attrs = new HashMap<>();
    List<Triple<OplCtx<String, String>, OplTerm<String, String>, OplTerm<String, String>>> pathEqs = new LinkedList<>();
    List<Triple<OplCtx<String, String>, OplTerm<String, String>, OplTerm<String, String>>> obsEqs = new LinkedList<>();
    Function<String, String> fun = x -> {
        if (equivs0.containsKey(x)) {
            return equivs0.get(x);
        }
        return x;
    };
    for (String edge : u.edges.keySet()) {
        Pair<List<String>, String> ty = u.edges.get(edge);
        edges.put(edge, new Pair<>(ty.first.stream().map(fun).collect(Collectors.toList()), fun.apply(ty.second)));
    }
    for (String attr : u.attrs.keySet()) {
        Pair<List<String>, String> ty = u.attrs.get(attr);
        attrs.put(attr, new Pair<>(ty.first.stream().map(fun).collect(Collectors.toList()), fun.apply(ty.second)));
    }
    for (Triple<OplCtx<String, String>, OplTerm<String, String>, OplTerm<String, String>> eq : u.pathEqs) {
        OplCtx<String, String> ctx = new OplCtx<>(eq.first.values2().stream().map(x -> new Pair<>(x.first, fun.apply(x.second))).collect(Collectors.toList()));
        pathEqs.add(new Triple<>(ctx, OplOps.fun2(equivs0, eq.second), OplOps.fun2(equivs0, eq.third)));
    }
    for (Triple<OplCtx<String, String>, OplTerm<String, String>, OplTerm<String, String>> eq : u.obsEqs) {
        OplCtx<String, String> ctx = new OplCtx<>(eq.first.values2().stream().map(x -> new Pair<>(x.first, fun.apply(x.second))).collect(Collectors.toList()));
        obsEqs.add(new Triple<>(ctx, OplOps.fun2(equivs0, eq.second), OplOps.fun2(equivs0, eq.third)));
    }
    for (String mname : shape.edges.keySet()) {
        Pair<String, String> mt = shape.edges.get(mname);
        String s = mt.first;
        String t = mt.second;
        OplSCHEMA0<String, String, String> s0 = (OplSCHEMA0<String, String, String>) env.get(s);
        // OplSchema<String, String, String> t0 = (OplSchema<String, String, String>) ENV.get(t);
        OplMapping<String, String, String, String, String> m0 = (OplMapping<String, String, String, String, String>) env.get(mname);
        for (String edge : s0.edges.keySet()) {
            Pair<OplCtx<String, String>, OplTerm<String, String>> edge2 = m0.symbols.get(edge);
            List<OplTerm<String, String>> args = edge2.first.vars0.keySet().stream().map((Function<String, OplTerm<String, String>>) OplTerm::new).collect(Collectors.toList());
            OplTerm<String, String> lhs = OplOps.fun2(equivs0, new OplTerm<>(s + "_" + edge, args));
            OplCtx<String, String> ctx = new OplCtx<>(edge2.first.values2().stream().map(x -> new Pair<>(x.first, fun.apply(s + "_" + x.second))).collect(Collectors.toList()));
            OplTerm<String, String> rhs = OplOps.fun2(equivs0, OplOps.prepend(t, edge2.second));
            pathEqs.add(new Triple<>(ctx, lhs, rhs));
        }
        for (String edge : s0.attrs.keySet()) {
            Pair<OplCtx<String, String>, OplTerm<String, String>> edge2 = m0.symbols.get(edge);
            List<OplTerm<String, String>> args = edge2.first.vars0.keySet().stream().map((Function<String, OplTerm<String, String>>) OplTerm::new).collect(Collectors.toList());
            OplTerm<String, String> lhs = OplOps.fun2(equivs0, new OplTerm<>(s + "_" + edge, args));
            OplCtx<String, String> ctx = new OplCtx<>(edge2.first.values2().stream().map(x -> new Pair<>(x.first, fun.apply(s + "_" + x.second))).collect(Collectors.toList()));
            OplTerm<String, String> rhs = OplOps.fun2(equivs0, OplOps.prepend(t, edge2.second));
            obsEqs.add(new Triple<>(ctx, lhs, rhs));
        }
    }
    OplSCHEMA0<String, String, String> ret = new OplSCHEMA0<>(new HashMap<>(), entities, edges, attrs, pathEqs, obsEqs, base);
    env.putIfAbsent(SCHEMA + "_Colimit", ret);
    for (String schname : shape.nodes) {
        OplSCHEMA0<String, String, String> sch = (OplSCHEMA0<String, String, String>) env.get(schname);
        Map<String, String> inj_sorts = new HashMap<>();
        Map<String, Pair<OplCtx<String, String>, OplTerm<String, String>>> inj_symbols = new HashMap<>();
        for (String ename : sch.entities) {
            inj_sorts.put(ename, fun.apply(schname + "_" + ename));
        }
        for (String c1 : sch.attrs.keySet()) {
            Pair<List<String>, String> t = sch.attrs.get(c1);
            List<Pair<String, String>> l = new LinkedList<>();
            List<OplTerm<String, String>> vs = new LinkedList<>();
            for (String s1 : t.first) {
                String v = new VIt().next();
                vs.add(new OplTerm<>(v));
                l.add(new Pair<>(v, fun.apply(schname + "_" + s1)));
            }
            OplCtx<String, String> ctx = new OplCtx<>(l);
            OplTerm<String, String> value = OplOps.fun2(equivs0, new OplTerm<>(schname + "_" + c1, vs));
            inj_symbols.put(c1, new Pair<>(ctx, value));
        }
        for (String c1 : sch.edges.keySet()) {
            Pair<List<String>, String> t = sch.edges.get(c1);
            List<Pair<String, String>> l = new LinkedList<>();
            List<OplTerm<String, String>> vs = new LinkedList<>();
            for (String s1 : t.first) {
                String v = new VIt().next();
                vs.add(new OplTerm<>(v));
                l.add(new Pair<>(v, fun.apply(schname + "_" + s1)));
            }
            OplCtx<String, String> ctx = new OplCtx<>(l);
            OplTerm<String, String> value = OplOps.fun2(equivs0, new OplTerm<>(schname + "_" + c1, vs));
            inj_symbols.put(c1, new Pair<>(ctx, value));
        }
        OplMapping<String, String, String, String, String> mapping = new OplMapping<>(inj_sorts, inj_symbols, schname, SCHEMA + "_Colimit");
        env.putIfAbsent(MAPPING + "_" + schname + "_colimit", mapping);
    }
}
Also used : OplPres(catdata.opl.OplExp.OplPres) JSplitPane(javax.swing.JSplitPane) HashMap(java.util.HashMap) Function(java.util.function.Function) OplSig(catdata.opl.OplExp.OplSig) GridLayout(java.awt.GridLayout) HashSet(java.util.HashSet) LinkedHashMap(java.util.LinkedHashMap) WizardModel(catdata.ide.WizardModel) OplPresTrans(catdata.opl.OplExp.OplPresTrans) Map(java.util.Map) JTabbedPane(javax.swing.JTabbedPane) VIt(catdata.opl.OplParser.VIt) ChangeListener(javax.swing.event.ChangeListener) LinkedList(java.util.LinkedList) JComboBox(javax.swing.JComboBox) Pair(catdata.Pair) ChangeEvent(javax.swing.event.ChangeEvent) CodeTextPanel(catdata.ide.CodeTextPanel) Util(catdata.Util) Set(java.util.Set) BorderFactory(javax.swing.BorderFactory) Collectors(java.util.stream.Collectors) OplSCHEMA0(catdata.opl.OplExp.OplSCHEMA0) List(java.util.List) OplUnion(catdata.opl.OplExp.OplUnion) OplGraph(catdata.opl.OplExp.OplGraph) Program(catdata.Program) Triple(catdata.Triple) OplInst0(catdata.opl.OplExp.OplInst0) OplSigma(catdata.opl.OplExp.OplSigma) OplMapping(catdata.opl.OplExp.OplMapping) JPanel(javax.swing.JPanel) HashSet(java.util.HashSet) Set(java.util.Set) HashMap(java.util.HashMap) LinkedHashMap(java.util.LinkedHashMap) Function(java.util.function.Function) LinkedList(java.util.LinkedList) List(java.util.List) HashSet(java.util.HashSet) Pair(catdata.Pair) VIt(catdata.opl.OplParser.VIt) OplUnion(catdata.opl.OplExp.OplUnion) OplSCHEMA0(catdata.opl.OplExp.OplSCHEMA0) LinkedList(java.util.LinkedList) Triple(catdata.Triple) OplMapping(catdata.opl.OplExp.OplMapping)

Example 7 with OplMapping

use of catdata.opl.OplExp.OplMapping in project fql by CategoricalData.

the class OplOps method visit.

@Override
public OplObject visit(Program<OplExp> env, OplMapping e) {
    OplObject src = ENV.get(e.src0);
    OplObject dst = ENV.get(e.dst0);
    if (src instanceof OplSig && dst instanceof OplSig) {
        OplSig src0 = (OplSig) src;
        OplSig dst0 = (OplSig) dst;
        for (Object k2 : e.imports) {
            String k = (String) k2;
            OplExp o = env.exps.get(k);
            if (!(o instanceof OplMapping)) {
                throw new RuntimeException("Not a mapping: " + k);
            }
            OplMapping a = (OplMapping) o;
            Util.putAllSafely(e.sorts, a.sorts);
            Util.putAllSafely(e.symbols, a.symbols);
        }
        e.validate(src0, dst0);
        return e;
    } else if (src instanceof OplSchema && dst instanceof OplSchema) {
        OplSchema src0 = (OplSchema) src;
        OplSchema dst0 = (OplSchema) dst;
        for (Object k2 : e.imports) {
            String k = (String) k2;
            OplExp o = (OplExp) ENV.get(k);
            if (!(o instanceof OplTyMapping)) {
                throw new RuntimeException("Not a typed mapping: " + k + o.getClass());
            }
            OplTyMapping a = (OplTyMapping) o;
            Util.putAllSafely(e.sorts, a.m.sorts);
            Util.putAllSafely(e.symbols, a.m.symbols);
        }
        // e.validate(src0.projEA(), dst0.projEA());
        OplTyMapping ret = new OplTyMapping<>(e.src0, e.dst0, src0, dst0, e);
        return ret;
    }
    throw new RuntimeException("Source or Target is not a theory/schema in " + e);
}
Also used : OplSchema(catdata.opl.OplExp.OplSchema) OplSig(catdata.opl.OplExp.OplSig) OplMapping(catdata.opl.OplExp.OplMapping) OplTyMapping(catdata.opl.OplExp.OplTyMapping)

Aggregations

OplMapping (catdata.opl.OplExp.OplMapping)7 Pair (catdata.Pair)4 OplPres (catdata.opl.OplExp.OplPres)4 OplPresTrans (catdata.opl.OplExp.OplPresTrans)4 OplSig (catdata.opl.OplExp.OplSig)4 HashMap (java.util.HashMap)4 HashSet (java.util.HashSet)4 LinkedList (java.util.LinkedList)4 List (java.util.List)4 Program (catdata.Program)3 Triple (catdata.Triple)3 Util (catdata.Util)3 OplGraph (catdata.opl.OplExp.OplGraph)3 OplInst0 (catdata.opl.OplExp.OplInst0)3 OplSCHEMA0 (catdata.opl.OplExp.OplSCHEMA0)3 OplSigma (catdata.opl.OplExp.OplSigma)3 OplTyMapping (catdata.opl.OplExp.OplTyMapping)3 OplUnion (catdata.opl.OplExp.OplUnion)3 Map (java.util.Map)3 Set (java.util.Set)3