use of catdata.fqlpp.cat.Functor in project fql by CategoricalData.
the class CatOps method visit.
@Override
public Functor visit(FQLPPProgram env, FinalConst ic) {
CatExp e = resolve(env, ic.src);
if (!(e instanceof Const)) {
throw new RuntimeException("Can only create functors from finitely-presented categories.");
}
Const c = (Const) e;
Category cat = c.accept(env, this);
Signature<String, String> sig = new Signature<>(c.nodes, c.arrows, c.eqs);
Category target = ic.C.accept(env, this);
Map<Node, Functor> nm = new HashMap<>();
for (Node n : sig.nodes) {
FunctorExp kkk = ic.nm.get(n.name);
if (kkk == null) {
throw new RuntimeException("Missing node mapping from " + n);
}
Functor F = kkk.accept(env, this);
nm.put(n, F);
}
Map<Edge, Transform> em = new HashMap<>();
for (Edge n : sig.edges) {
TransExp chc = ic.em.get(n.name);
if (chc == null) {
throw new RuntimeException("Missing edge mapping from " + n);
}
em.put(n, chc.accept(env, this));
}
FUNCTION fff = p0 -> {
Path p = (Path) p0;
Object fn = target.identity(nm.get(p.source));
for (Object nnn : p.path) {
Edge n = (Edge) nnn;
fn = target.compose(fn, em.get(n));
}
return fn;
};
return new Functor(cat, target, nm::get, fff);
}
use of catdata.fqlpp.cat.Functor in project fql by CategoricalData.
the class CatOps method visit.
@Override
public Functor visit(FQLPPProgram env, Case e) {
Functor l = e.l.accept(env, this);
Functor r = e.r.accept(env, this);
if (FinSet.FinSet.equals(l.target) && FinSet.FinSet.equals(r.target)) {
if (!l.source.equals(r.source)) {
throw new RuntimeException("Source categories do not match");
}
return Inst.get(l.source).coproduct(l, r);
}
if (FinCat.FinCat.equals(l.target) && FinCat.FinCat.equals(r.target)) {
if (!l.source.equals(r.source)) {
throw new RuntimeException("Source categories do not match");
}
return FunCat.get(l.source).coproduct(l, r);
}
return FinCat.match(l, r);
}
use of catdata.fqlpp.cat.Functor in project fql by CategoricalData.
the class CatOps method visit.
@Override
public Transform visit(FQLPPProgram env, ToSet e) {
Functor s = e.src.accept(env, this);
Functor t = e.dst.accept(env, this);
FUNCTION o = x -> {
Node n = (Node) x;
Chc<FnExp, SetExp> chc = e.fun.get(n.name);
if (chc == null) {
throw new RuntimeException("Missing object mapping for: " + n.name);
}
if (chc.left) {
return chc.l.accept(env, new SetOps(ENV));
} else {
Set src = (Set) s.applyO(n);
Set dst = (Set) t.applyO(n);
Set<Pair> p = (Set<Pair>) chc.r.accept(env, new SetOps(ENV));
Map<Object, Object> map = new HashMap<>();
for (Pair h : p) {
if (map.containsKey(h.first)) {
throw new RuntimeException("Duplicate arg: " + e);
}
map.put(h.first, h.second);
}
return new Fn(src, dst, map::get);
}
};
return new Transform(s, t, o);
}
use of catdata.fqlpp.cat.Functor in project fql by CategoricalData.
the class CatOps method visit.
@Override
public Functor visit(FQLPPProgram env, Comp e) {
Functor f = e.l.accept(env, this);
Functor g = e.r.accept(env, this);
return FinCat.FinCat.compose(f, g);
}
use of catdata.fqlpp.cat.Functor in project fql by CategoricalData.
the class CatOps method visit.
@Override
public Transform visit(FQLPPProgram env, Inj e) {
Functor l = e.l.accept(env, this);
Functor r = e.r.accept(env, this);
if (!l.source.equals(r.source)) {
throw new RuntimeException("Source category does not match");
}
if (l.target.equals(FinSet.FinSet)) {
return e.inj1 ? Inst.get(l.source).inleft(l, r) : Inst.get(l.source).inright(l, r);
} else if (l.target.equals(FinCat.FinCat)) {
return e.inj1 ? FunCat.get(l.source).inleft(l, r) : FunCat.get(l.source).inright(l, r);
} else {
throw new RuntimeException("Cannot inject: " + e + " to get a transform.");
}
}
Aggregations