use of catdata.fqlpp.cat.Category in project fql by CategoricalData.
the class CatOps method visit.
@Override
public Functor visit(FQLPPProgram env, Pushout e) {
Transform l = ENV.trans.get(e.l);
if (l == null) {
throw new RuntimeException("Missing transform: " + e.l);
}
Transform r = ENV.trans.get(e.r);
if (r == null) {
throw new RuntimeException("Missing transform: " + e.r);
}
if (!l.source.equals(r.source)) {
throw new RuntimeException("Source functors do not match.");
}
Category<Object, Object> D = l.source.source;
Set<String> objects = new HashSet<>();
objects.add("A");
objects.add("B");
objects.add("C");
Set<String> arrows = new HashSet<>();
arrows.add("f");
arrows.add("g");
arrows.add("a");
arrows.add("b");
arrows.add("c");
Map<String, String> sources = new HashMap<>();
sources.put("f", "A");
sources.put("g", "A");
sources.put("a", "A");
sources.put("b", "B");
sources.put("c", "C");
Map<String, String> targets = new HashMap<>();
targets.put("f", "B");
targets.put("g", "C");
targets.put("a", "A");
targets.put("b", "B");
targets.put("c", "C");
Map<Pair<String, String>, String> composition = new HashMap<>();
composition.put(new Pair<>("a", "a"), "a");
composition.put(new Pair<>("b", "b"), "b");
composition.put(new Pair<>("c", "c"), "c");
composition.put(new Pair<>("a", "f"), "f");
composition.put(new Pair<>("a", "g"), "g");
composition.put(new Pair<>("f", "b"), "f");
composition.put(new Pair<>("g", "c"), "g");
Map<String, String> identities = new HashMap<>();
identities.put("A", "a");
identities.put("B", "b");
identities.put("C", "c");
Category<String, String> span = new FiniteCategory<>(objects, arrows, sources, targets, composition, identities);
Category<Pair<Object, String>, Pair<Object, String>> Dspan = FinCat.product(D, span);
Functor<Pair<Object, String>, Pair<Object, String>, Object, Object> fst = FinCat.first(D, span);
FUNCTION<Pair<Object, String>, Set> o = p -> {
switch(p.second) {
case "A":
return (Set) l.source.applyO(p.first);
case "B":
return (Set) l.target.applyO(p.first);
case "C":
return (Set) r.target.applyO(p.first);
default:
throw new RuntimeException();
}
};
FUNCTION<Pair<Object, String>, Fn> x = fp -> {
Object f = fp.first;
String p = fp.second;
Object a = D.source(f);
// Object b = D.target(f);
// String i = span.source(p);
String j = span.target(p);
// Functor I = i == "A" ? l.source : i == "B" ? l.target : r.target;
Functor J = Objects.equals(j, "A") ? l.source : Objects.equals(j, "B") ? l.target : r.target;
// Fn If = (Fn) I.applyA(f);
Fn Jf = (Fn) J.applyA(f);
Transform P = Objects.equals(p, "f") ? l : Objects.equals(p, "g") ? r : Objects.equals(p, "a") ? Transform.id(l.source) : Objects.equals(p, "b") ? Transform.id(l.target) : Transform.id(r.target);
// Fn Pb = (Fn) P.apply(b);
Fn Pa = (Fn) P.apply(a);
return Fn.compose(Pa, Jf);
};
Functor I = new Functor(Dspan, FinSet.FinSet0(), o, x);
return FDM.sigmaF(fst).applyO(I);
}
use of catdata.fqlpp.cat.Category in project fql by CategoricalData.
the class FQLPPDriver method makeEnv.
public static FQLPPEnvironment makeEnv(String str, FQLPPProgram init, String... toUpdate) {
Map<String, Fn<?, ?>> fns = new HashMap<>();
Map<String, Set<?>> sets = new HashMap<>();
Map<String, Category<?, ?>> cats = new HashMap<>();
Map<String, Functor<?, ?, ?, ?>> ftrs = new HashMap<>();
Map<String, Transform<?, ?, ?, ?>> trans = new HashMap<>();
FQLPPEnvironment ret = new FQLPPEnvironment(init, str, sets, fns, cats, ftrs, trans);
for (Entry<String, CatExp> k : init.cats.entrySet()) {
init.cats.put(k.getKey(), k.getValue().accept(init, new PreProcessor()));
}
for (String k : init.order) {
SetExp se = init.sets.get(k);
if (se != null) {
try {
Set<?> xxx = se.accept(init, new SetOps(ret));
sets.put(k, xxx);
} catch (Throwable t) {
t.printStackTrace();
throw new LineException(t.getLocalizedMessage(), k, "set");
}
toUpdate[0] = "Last Processed: " + k;
}
FnExp fe = init.fns.get(k);
if (fe != null) {
try {
Fn<?, ?> xxx = fe.accept(init, new SetOps(ret));
fns.put(k, xxx);
toUpdate[0] = "Last Processed: " + k;
} catch (Throwable t) {
t.printStackTrace();
throw new LineException(t.getLocalizedMessage(), k, "function");
}
}
CatExp ce = init.cats.get(k);
// CatExp ce = ce0.accept(init, new PreProcessor());
if (ce != null) {
try {
Category<?, ?> xxx = ce.accept(init, new CatOps(ret));
cats.put(k, xxx);
toUpdate[0] = "Last Processed: " + k;
} catch (Throwable t) {
t.printStackTrace();
throw new LineException(t.getLocalizedMessage(), k, "category");
}
}
FunctorExp FE = init.ftrs.get(k);
if (FE != null) {
try {
Functor<?, ?, ?, ?> xxx = FE.accept(init, new CatOps(ret));
ftrs.put(k, xxx);
toUpdate[0] = "Last Processed: " + k;
} catch (Throwable t) {
t.printStackTrace();
throw new LineException(t.getLocalizedMessage(), k, "functor");
}
}
TransExp te = init.trans.get(k);
if (te != null) {
try {
Transform<?, ?, ?, ?> xxx = te.accept(init, new CatOps(ret));
trans.put(k, xxx);
toUpdate[0] = "Last Processed: " + k;
} catch (Throwable t) {
t.printStackTrace();
throw new LineException(t.getLocalizedMessage(), k, "transform");
}
}
}
return ret;
}
use of catdata.fqlpp.cat.Category in project fql by CategoricalData.
the class XCtx method makeTables.
// private Map<C, String> xgrid;
// public JComponent getGrid(C c) {
// if (xgrid != null) {
// return xgrid.get(c);
// }
// if (DEBUG.debug.x_tables) {
// // makeTables(x -> cat().arrows(), new HashSet<>());
// return getGrid(c);
// }
// return new JPanel();
// }
// have this suppress pair IDs when possible
@SuppressWarnings({ "unchecked", "rawtypes" })
private JComponent makeTables(Function<Unit, Collection<Triple<C, C, List<C>>>> fn, Set<C> ignore) {
cl = new CardLayout();
// xgrid = new HashMap<>();
clx = new JPanel();
clx.setLayout(cl);
clx.add(new JPanel(), "0");
cl.show(clx, "0");
// xgrid.put((C)"_1", "0");
int www = 1;
try {
// Category<C, Triple<C, C, List<C>>> cat = cat();
List<JComponent> grid = new LinkedList<>();
Collection<Triple<C, C, List<C>>> cat = fn.apply(new Unit());
// Map<C, Set<List<C>>> entities = new HashMap<>();
Map entities = new HashMap<>();
Map<C, Set<C>> m = new HashMap<>();
for (C c : allIds()) {
entities.put(c, new HashSet<>());
m.put(c, new HashSet<>());
}
for (Triple<C, C, List<C>> k : cat) {
if (k.first.equals("_1")) {
// uncomment causes exception
Set set = (Set<List<C>>) entities.get(k.second);
// set.add(k);
set.add(k.third);
}
}
for (C c : allTerms()) {
Pair<C, C> t = type(c);
Set<C> set = m.get(t.first);
set.add(c);
}
List<C> keys = new LinkedList<>(m.keySet());
keys.sort((Object o1, Object o2) -> ((Comparable) o1).compareTo(o2));
for (C c : keys) {
if (c.equals("_1")) {
continue;
}
if (ignore.contains(c)) {
continue;
}
Pair<C, C> t = type(c);
Set<List<C>> src = (Set<List<C>>) entities.get(t.first);
List<C> cols = new LinkedList<>(m.get(c));
cols = cols.stream().filter(x -> !x.toString().startsWith("!")).collect(Collectors.toList());
Object[][] rowData = new Object[src.size()][cols.size()];
int idx = cols.indexOf(c);
if (idx != -1) {
C old = cols.get(0);
cols.set(0, c);
cols.set(idx, old);
if (cols.size() > 1) {
List<C> colsX = new LinkedList<>(cols.subList(1, cols.size()));
colsX.sort(null);
colsX.add(0, c);
cols = colsX;
}
}
List<String> colNames3 = cols.stream().map(x -> type(x).second.equals(x) ? x.toString() : x + " (" + type(x).second + ")").collect(Collectors.toList());
Object[] colNames = colNames3.toArray();
int row = 0;
for (List<C> l : src) {
rowData[row][0] = l;
int cl = 0;
for (C col : cols) {
List<C> r = new LinkedList<>(l);
r.add(col);
for (Triple<C, C, List<C>> cand : cat) {
if (!cand.first.equals("_1")) {
continue;
}
if (!cand.second.equals(type(col).second)) {
continue;
}
if (kb.equiv(cand.third, r)) {
rowData[row][cl] = abbrPrint(cand.third);
break;
}
}
cl++;
}
row++;
}
JPanel table = GuiUtil.makeTable(BorderFactory.createEtchedBorder(), c + " (" + src.size() + ") rows", rowData, colNames);
JPanel table2 = GuiUtil.makeTable(BorderFactory.createEtchedBorder(), c + " (" + src.size() + ") rows", rowData, colNames);
// xgrid.put(c, Integer.toString(www));
clx.add(new JScrollPane(table2), Integer.toString(www));
www++;
grid.add(table);
}
return GuiUtil.makeGrid(grid);
} catch (Exception e) {
e.printStackTrace();
return new CodeTextPanel(BorderFactory.createEtchedBorder(), "", "ERROR\n\n" + e.getMessage());
}
}
use of catdata.fqlpp.cat.Category in project fql by CategoricalData.
the class XCtx method display.
@Override
@SuppressWarnings({ "unchecked", "ConstantConditions" })
public JComponent display() {
init();
JTabbedPane ret = new JTabbedPane();
if (DefunctGlobalOptions.debug.fpql.x_text) {
String kb_text = "types:\n " + Util.sep(allIds(), ",\n ");
List<String> tms = allTerms().stream().map(x -> x + " : " + type(x).first + " -> " + type(x).second).collect(Collectors.toList());
kb_text = kb_text.trim();
kb_text += "\n\nterms:\n " + Util.sep(tms, ",\n ");
List<String> xx = allEqs().stream().map(x -> Util.sep(x.first, ".") + " = " + Util.sep(x.second, ".")).collect(Collectors.toList());
kb_text = kb_text.trim();
kb_text += "\n\nequations:\n " + Util.sep(xx, ",\n ");
kb_text = kb_text.trim();
try {
kb.complete();
kb_text += "\n\nKnuth-Bendix Completion:\n" + kb;
} catch (Exception e) {
e.printStackTrace();
kb_text = "\n\nERROR in Knuth-Bendix\n\n" + e.getMessage();
}
JSplitPane pane = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
JPanel bot = new JPanel(new GridLayout(1, 3));
JTextField fff = new JTextField();
JButton but = new JButton("Reduce");
JTextField ggg = new JTextField();
bot.add(fff);
bot.add(but);
bot.add(ggg);
pane.setResizeWeight(1);
but.addActionListener(x -> {
String s = fff.getText();
List<C> l = XParser.path(s);
try {
ggg.setText(Util.sep(getKB().normalize("", l), "."));
} catch (Exception ex) {
ex.printStackTrace();
ggg.setText(ex.getMessage());
}
});
JComponent kbc = new CodeTextPanel(BorderFactory.createEtchedBorder(), "", kb_text);
pane.add(kbc);
pane.add(bot);
ret.addTab("Text", pane);
}
String cat = null;
if (DefunctGlobalOptions.debug.fpql.x_cat) {
try {
cat = cat().toString();
} catch (Exception e) {
e.printStackTrace();
cat = "ERROR\n\n" + e.getMessage();
}
JComponent ctp = new CodeTextPanel(BorderFactory.createEtchedBorder(), "", cat);
ret.addTab("Category", ctp);
}
if (schema != null) {
if (DefunctGlobalOptions.debug.fpql.x_tables) {
// if category tab blew up, so should this
JComponent tables = cat != null && cat.startsWith("ERROR") ? new CodeTextPanel(BorderFactory.createEtchedBorder(), "", cat) : makeTables(x -> cat().arrows(), new HashSet<>());
ret.addTab("Full Tables", tables);
}
if (DefunctGlobalOptions.debug.fpql.x_adom) {
ret.addTab("Adom Tables", makeTables(z -> foo(), global.ids));
}
}
if (DefunctGlobalOptions.debug.fpql.x_graph) {
ret.addTab("Graph", makeGraph(schema != null));
}
if (DefunctGlobalOptions.debug.fpql.x_graph && (schema != null)) {
ret.addTab("Elements", elements());
}
if (DefunctGlobalOptions.debug.fpql.x_json) {
String tj = toJSON();
if (tj != null) {
ret.addTab("JSON", new CodeTextPanel(BorderFactory.createEtchedBorder(), "", tj));
}
}
return ret;
}
Aggregations