// $Id: GRAPH_DIAGRAM.java,v 1.2 1998/04/07 13:34:10 mich Exp $
package agg.xt_basis.colim;
//-------------------------------------------------------------------
// Colimit of a Graph Diagram
//-------------------------------------------------------------------
// Copyright (c) 1995 Technical University of Berlin, Dept TFS.
// All rights reserved.
// Colimes Computation Project V1.0 98/02/15
// Author: Dietmar Wolz, Technical University Berlin FB 13, WE 1331
// email: dietmar@cs.tu-berlin.de
//-------------------------------------------------------------------
// import COLIM_DEFS;
// import COPROD_OBJECT;
// import INT_VECTOR;
// import COLIM_VECTOR;
// import SET_DIAGRAM;
public class GRAPH_DIAGRAM implements COLIM_DEFS {
//---------------- creation --------------------------------
public GRAPH_DIAGRAM()
{
f_node_diagram = new SET_DIAGRAM();
f_edge_diagram = new SET_DIAGRAM();
f_coprod_source = new INT_VECTOR();
f_coprod_target = new INT_VECTOR();
f_coprod_source.push_back(bottom);
f_coprod_target.push_back(bottom);
f_colimit_valid = false;
}
//---------------- diagram construction --------------------
@SuppressWarnings("unused")
public int insert_object(COLIM_GRAPH graph, String name)
{
int lower = f_node_diagram.coproduct_size();
int nodes = f_node_diagram.insert_object(graph.f_node,name);
int edges = f_edge_diagram.insert_object(graph.f_edge,name);
for (int edge = 0; edge < graph.f_edge.size(); edge++) {
f_coprod_source.push_back(graph.f_source.item(edge) + lower);
f_coprod_target.push_back(graph.f_target.item(edge) + lower);
}
f_colimit_valid = false;
return nodes;
}
@SuppressWarnings("unused")
public int insert_morphism(INT_VECTOR node_morphism,
INT_VECTOR edge_morphism,
int v, int w)
{
int nodes = f_node_diagram.insert_morphism(node_morphism,v,w);
int edges = f_edge_diagram.insert_morphism(edge_morphism,v,w);
f_colimit_valid = false;
return nodes;
}
//---------------- colimit computation ---------------------
public COLIM_GRAPH get_colimit_graph()
{
if (!f_colimit_valid) compute_colimit();
return f_colim_graph;
}
public COLIM_VECTOR get_colimit_nodes()
{
return f_node_diagram.get_colimit_set();
}
public COLIM_VECTOR get_colimit_edges()
{
return f_edge_diagram.get_colimit_set();
}
//---------------- utilities ---------------------
public Object get_source(int edge)
{
return f_node_diagram.get_element(f_coprod_source.item(edge));
}
public Object get_target(int edge)
{
return f_node_diagram.get_element(f_coprod_target.item(edge));
}
public SET_DIAGRAM get_node_diagram() { return f_node_diagram; }
public SET_DIAGRAM get_edge_diagram() { return f_edge_diagram; }
//---------------- test output ---------------------
public String toString()
{
StringBuffer Result = new StringBuffer("\nsort diagram:\n");
Result.append(f_node_diagram.toString());
Result.append("\nedge_diagram:\n");
Result.append(f_edge_diagram.toString());
COLIM_GRAPH coprod = new COLIM_GRAPH(f_node_diagram.get_coproduct_set(),
f_edge_diagram.get_coproduct_set(),
f_coprod_source, f_coprod_target);
Result.append("\ncoproduct:\n");
Result.append(coprod.toString());
Result.append("\n");
return new String(Result);
}
//---------------- private implementation features ---------------------
@SuppressWarnings("unused")
private void compute_colimit()
{
int f;
f_colim_graph = new COLIM_GRAPH();
INT_VECTOR colimit_nodes = f_node_diagram.get_colimit_indices();
for (int node = 0; node < colimit_nodes.size(); node++) {
COLIM_VECTOR node_attrs = new COLIM_VECTOR();
int m = f_colim_graph.insert_node(node_attrs);
}
INT_VECTOR colimit_edges = f_edge_diagram.get_colimit_indices();
for (int edge = 0; edge < colimit_edges.size(); edge++) {
COLIM_VECTOR edge_attrs = new COLIM_VECTOR();
int s = f_node_diagram.get_colimit_pos(
f_coprod_source.item(colimit_edges.item(edge)));
int t = f_node_diagram.get_colimit_pos(
f_coprod_target.item(colimit_edges.item(edge)));
if (s != undefined && t != undefined)
f = f_colim_graph.insert_edge(edge_attrs,s,t);
else f_edge_diagram.delete_element(colimit_edges.item(edge));
}
for (int node = 1; node < f_node_diagram.coproduct_size(); node++) {
int m = f_node_diagram.get_colimit_pos(node);
if (m != undefined) {
COLIM_VECTOR node_attrs = (COLIM_VECTOR) f_colim_graph.node_attr(m);
node_attrs.push_back(f_node_diagram.get_element(node));
}
}
for (int edge = 1; edge < f_edge_diagram.coproduct_size(); edge++) {
f = f_edge_diagram.get_colimit_pos(edge);
if (f != undefined) {
COLIM_VECTOR edge_attrs = (COLIM_VECTOR) f_colim_graph.edge_attr(f);
edge_attrs.push_back(f_edge_diagram.get_element(edge));
}
}
f_colimit_valid = true;
}
private SET_DIAGRAM f_node_diagram;
private SET_DIAGRAM f_edge_diagram;
private INT_VECTOR f_coprod_source;
private INT_VECTOR f_coprod_target;
private COLIM_GRAPH f_colim_graph;
private boolean f_colimit_valid;
}