use of catdata.fql.decl.InstExp.Plus in project fql by CategoricalData.
the class TransChecker method visit.
@Override
public Pair<String, String> visit(FQLProgram env, Inl e) {
InstExp x = env.insts.get(e.obj);
if (x == null) {
throw new RuntimeException("Missing " + e.obj + " in " + e);
}
if (!(x instanceof Plus)) {
throw new RuntimeException(e.obj + " is not a plus: " + x);
}
Plus y = (Plus) x;
return new Pair<>(y.a, e.obj);
}
use of catdata.fql.decl.InstExp.Plus in project fql by CategoricalData.
the class TransChecker method visit.
@Override
public Pair<String, String> visit(FQLProgram env, Case e) {
InstExp x = env.insts.get(e.obj);
if (x == null) {
throw new RuntimeException("Missing " + e.obj + " in " + e);
}
if (!(x instanceof Plus)) {
throw new RuntimeException(e.obj + " is not a plus: " + x);
}
// InstExp.Plus y = (InstExp.Plus) x;
Pair<String, String> a = e.l.accept(env, this);
Pair<String, String> b = e.r.accept(env, this);
if (!a.second.equals(b.second)) {
throw new RuntimeException("Codomain mismatch: " + e + " with " + a.second + " and " + b.second);
}
return new Pair<>(e.obj, a.second);
}
use of catdata.fql.decl.InstExp.Plus in project fql by CategoricalData.
the class FqlDisplay method handleInstanceFlowEdge.
private void handleInstanceFlowEdge(Object o) {
InstExp i = (InstExp) o;
Object f = i.accept(new Unit(), new InstExpVisitor<Object, Unit>() {
@Override
public MapExp visit(Unit env, Zero e) {
return null;
}
@Override
public MapExp visit(Unit env, One e) {
return null;
}
@Override
public MapExp visit(Unit env, Two e) {
throw new RuntimeException();
}
@Override
public MapExp visit(Unit env, Plus e) {
return null;
}
@Override
public MapExp visit(Unit env, Times e) {
return null;
}
@Override
public MapExp visit(Unit env, Exp e) {
throw new RuntimeException();
}
@Override
public MapExp visit(Unit env, Const e) {
return null;
}
@Override
public MapExp visit(Unit env, Delta e) {
return e.F;
}
@Override
public MapExp visit(Unit env, Sigma e) {
return e.F;
}
@Override
public MapExp visit(Unit env, Pi e) {
return e.F;
}
@Override
public MapExp visit(Unit env, FullSigma e) {
return e.F;
}
@Override
public Unit visit(Unit env, Relationalize e) {
return null;
}
@Override
public Unit visit(Unit env, External e) {
return null;
}
@Override
public Object visit(Unit env, Eval e) {
return e.q;
}
@Override
public Object visit(Unit env, FullEval e) {
return e.q;
}
@Override
public Object visit(Unit env, Kernel e) {
return null;
}
@Override
public Object visit(Unit env, Step e) {
// (Step) this should return a pair
return null;
}
});
if (f == null) {
return;
}
if (f instanceof QueryExp) {
QueryExp q = (QueryExp) f;
if (q instanceof QueryExp.Var) {
QueryExp.Var qq = (QueryExp.Var) q;
yyy.setSelectedValue(indices.get(qq.v), true);
return;
}
String k = FQLProgram.revLookup(prog.queries, q);
if (k != null) {
yyy.setSelectedValue(indices.get(k), true);
return;
}
String str = q.toString();
if (!extraInsts.contains(str)) {
Query view = q.toQuery(prog);
JPanel p = showQuery(prog, env, view);
x.add(p, str);
extraInsts.add(str);
}
yyy.clearSelection();
cl.show(x, str);
} else if (f instanceof FullQueryExp) {
FullQueryExp q = (FullQueryExp) f;
if (q instanceof FullQueryExp.Var) {
FullQueryExp.Var qq = (FullQueryExp.Var) q;
yyy.setSelectedValue(indices.get(qq.v), true);
return;
}
String k = FQLProgram.revLookup(prog.full_queries, q);
if (k != null) {
yyy.setSelectedValue(indices.get(k), true);
return;
}
String str = q.toString();
if (!extraInsts.contains(str)) {
FullQuery view = q.toFullQuery(prog);
JPanel p = showFullQuery(prog, env, view, q);
x.add(p, str);
extraInsts.add(str);
}
yyy.clearSelection();
cl.show(x, str);
} else if (f instanceof MapExp) {
MapExp q = (MapExp) f;
if (q instanceof MapExp.Var) {
MapExp.Var qq = (MapExp.Var) q;
yyy.setSelectedValue(indices.get(qq.v), true);
return;
}
String k = FQLProgram.revLookup(prog.maps, q);
if (k != null) {
yyy.setSelectedValue(indices.get(k), true);
return;
}
String str = q.toString();
if (!extraInsts.contains(str)) {
Mapping view = q.toMap(prog);
JPanel p = showMapping(env, prog.smap(view.source.toConst()), prog.smap(view.target.toConst()), view);
x.add(p, str);
extraInsts.add(str);
}
yyy.clearSelection();
cl.show(x, str);
} else {
throw new RuntimeException();
}
}
use of catdata.fql.decl.InstExp.Plus in project fql by CategoricalData.
the class FQLParser method toInst.
@SuppressWarnings("rawtypes")
private static InstExp toInst(Object o) {
try {
Tuple4 t = (Tuple4) o;
Token z = (Token) t.a;
String y = z.toString();
if (y.equals("step")) {
return new Step(t.d.toString(), toMapping(t.b), toMapping(t.c));
}
} catch (RuntimeException cce) {
}
try {
Tuple3 t = (Tuple3) o;
Token z = (Token) t.a;
String y = z.toString();
switch(y) {
case "delta":
return new InstExp.Delta(toMapping(t.b), t.c.toString());
case "sigma":
return new InstExp.Sigma(toMapping(t.b), t.c.toString());
case "SIGMA":
return new FullSigma(toMapping(t.b), t.c.toString());
case "pi":
return new InstExp.Pi(toMapping(t.b), t.c.toString());
case "external":
return new External(toSchema(t.b), t.c.toString());
case "eval":
return new Eval(toQuery(t.b), t.c.toString());
case "EVAL":
return new FullEval(toFullQuery(t.b), t.c.toString());
default:
break;
}
} catch (RuntimeException cce) {
}
try {
Tuple3 t = (Tuple3) o;
Token z = (Token) t.b;
String y = z.toString();
if (y.equals("+")) {
return new Plus(t.a.toString(), t.c.toString());
} else if (y.equals("*")) {
return new Times(t.a.toString(), t.c.toString());
}
if (y.equals("^")) {
return new Exp(t.a.toString(), (t.c).toString());
}
} catch (RuntimeException cce) {
}
try {
org.jparsec.functors.Pair pr = (org.jparsec.functors.Pair) o;
if (pr.a.toString().equals("unit")) {
return new One(toSchema(pr.b));
} else if (pr.a.toString().equals("void")) {
return new Zero(toSchema(pr.b));
} else if (pr.a.toString().equals("prop")) {
return new Two(toSchema(pr.b));
} else if (pr.a.toString().equals("relationalize")) {
return new Relationalize(pr.b.toString());
} else if (pr.a.toString().equals("kernel")) {
return new Kernel(pr.b.toString());
}
throw new RuntimeException();
} catch (RuntimeException cce) {
}
return toInstConst(o);
}
use of catdata.fql.decl.InstExp.Plus in project fql by CategoricalData.
the class InstOps method visit.
@Override
public Pair<List<PSM>, Object> visit(String dst, Plus e) {
SigExp k = e.type(prog);
Signature s = k.toSig(prog);
List<PSM> ret = new LinkedList<>();
for (Node n : s.nodes) {
List<Flower> l = new LinkedList<>();
l.add(new CopyFlower(e.a + "_" + n.string, "c0", "c1"));
l.add(new CopyFlower(e.b + "_" + n.string, "c0", "c1"));
ret.add(new InsertSQL(dst + "_" + n.string, new Union(l), "c0", "c1"));
}
for (Attribute<Node> n : s.attrs) {
List<Flower> l = new LinkedList<>();
l.add(new CopyFlower(e.a + "_" + n.name, "c0", "c1"));
l.add(new CopyFlower(e.b + "_" + n.name, "c0", "c1"));
ret.add(new InsertSQL(dst + "_" + n.name, new Union(l), "c0", "c1"));
}
for (Edge n : s.edges) {
List<Flower> l = new LinkedList<>();
l.add(new CopyFlower(e.a + "_" + n.name, "c0", "c1"));
l.add(new CopyFlower(e.b + "_" + n.name, "c0", "c1"));
ret.add(new InsertSQL(dst + "_" + n.name, new Union(l), "c0", "c1"));
}
ret.addAll(PSMGen.guidify(dst, s, true));
ret.addAll(PSMGen.makeTables(dst + "_inl", s, false));
ret.addAll(PSMGen.makeTables(dst + "_inr", s, false));
for (Node n : s.nodes) {
SQL f = PSMGen.compose(e.a + "_" + n.string, dst + "_" + n.string + "_subst");
ret.add(new InsertSQL(dst + "_inl_" + n.string, f, "c0", "c1"));
SQL f0 = PSMGen.compose(e.b + "_" + n.string, dst + "_" + n.string + "_subst");
ret.add(new InsertSQL(dst + "_inr_" + n.string, f0, "c0", "c1"));
}
// (f+g) : A+B -> C f : A -> C g : B -> C
Fn<Quad<String, String, String, String>, List<PSM>> fn = x -> {
// e.a -> x.third
String f = x.first;
// e.b -> x.third
String g = x.second;
// String C = x.third;
String dst0 = x.fourth;
// must be a map dst -> x.third
List<PSM> ret1 = new LinkedList<>();
for (Node n : s.nodes) {
Flower sql1 = PSMGen.compose(dst + "_" + n.string + "_subst_inv", f + "_" + n.string);
Flower sql2 = PSMGen.compose(dst + "_" + n.string + "_subst_inv", g + "_" + n.string);
List<Flower> flowers = new LinkedList<>();
flowers.add(sql1);
flowers.add(sql2);
ret1.add(new InsertSQL(dst0 + "_" + n.string, new Union(flowers), "c0", "c1"));
}
return ret1;
};
return new Pair<>(ret, fn);
}
Aggregations