// $Id: SIG_DIAGRAM.java,v 1.2 1998/04/07 13:34:10 mich Exp $
package agg.xt_basis.colim;
//-------------------------------------------------------------------
// Colimit of a Signature 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;
import java.util.Enumeration;
public class SIG_DIAGRAM implements COLIM_DEFS {
//---------------- creation --------------------------------
public SIG_DIAGRAM()
{
f_sort_diagram = new SET_DIAGRAM();
f_op_diagram = new SET_DIAGRAM();
f_coprod_arity = new COLIM_VECTOR();
f_coprod_arity.push_back(null);
f_colimit_valid = false;
}
//---------------- diagram construction --------------------
@SuppressWarnings("unused")
public int insert_object(COLIM_VECTOR sorts, COLIM_VECTOR ops,
COLIM_VECTOR arity, String name)
{
int lower = f_sort_diagram.coproduct_size();
int sort_node = f_sort_diagram.insert_object(sorts,name);
int op_node = f_op_diagram.insert_object(ops,name);
for (int i = 0; i < arity.size(); i++) {
INT_VECTOR arity_sorts = (INT_VECTOR) arity.item (i);
INT_VECTOR cop_sorts = new INT_VECTOR(arity_sorts.size());
for (int arity_sort = 0;
arity_sort < arity_sorts.size(); arity_sort++)
cop_sorts.push_back(arity_sorts.item(arity_sort) + lower);
f_coprod_arity.push_back(cop_sorts);
}
f_colimit_valid = false;
return sort_node;
}
@SuppressWarnings("unused")
public int insert_morphism(INT_VECTOR sort_morphism,
INT_VECTOR op_morphism,
int v, int w)
{
int sort_edge = f_sort_diagram.insert_morphism(sort_morphism,v,w);
int op_edge = f_op_diagram.insert_morphism(op_morphism,v,w);
f_colimit_valid = false;
return sort_edge;
}
//---------------- colimit computation ---------------------
public COLIM_VECTOR get_colimit_sorts()
{
return f_sort_diagram.get_colimit_set();
}
public COLIM_VECTOR get_colimit_ops()
{
return f_op_diagram.get_colimit_set();
}
public COLIM_VECTOR get_colimit_arity()
{
if (!f_colimit_valid) compute_colimit();
return f_colimit_arity;
}
//---------------- utilities ---------------------
INT_VECTOR get_arity(int operation)
{
return (INT_VECTOR) f_coprod_arity.item(operation);
}
SET_DIAGRAM get_sort_diagram() { return f_sort_diagram; }
SET_DIAGRAM get_op_diagram() { return f_op_diagram; }
//---------------- test output ---------------------
public String toString()
{
StringBuffer Result = new StringBuffer("\nsort diagram:\n");
Result.append(f_sort_diagram.toString());
Result.append("\nop_diagram:\n");
Result.append(f_op_diagram.toString());
Result.append("\ncoproduct:\n");
Result.append(out_object(f_sort_diagram.get_coproduct_set(),
f_op_diagram.get_coproduct_set(),
f_coprod_arity));
Result.append("\n");
return new String(Result);
}
@SuppressWarnings("rawtypes")
public String out_object(COLIM_VECTOR sorts,
COLIM_VECTOR ops,
COLIM_VECTOR arity)
{
StringBuffer Result = new StringBuffer("\nsorts: ");
for (Enumeration en = sorts.elements();
en.hasMoreElements(); ) {
Object sort = en.nextElement();
if (sort != null) {
Result.append(sort.toString());
if (en.hasMoreElements()) Result.append(",");
}
}
Result.append("\noperations: ");
Enumeration arity_en = arity.elements();
for (Enumeration en = ops.elements();
en.hasMoreElements(); ) {
Object op = en.nextElement();
INT_VECTOR arity_sorts = (INT_VECTOR) arity_en.nextElement();
if (op != null) {
Result.append(out_operation(op,arity_sorts,sorts));
if (en.hasMoreElements()) Result.append("; ");
}
}
return new String(Result);
}
public String out_operation(Object op, INT_VECTOR arity_sorts,
COLIM_VECTOR sorts)
{
StringBuffer Result = new StringBuffer("");
Result.append(op.toString());
Result.append(": ");
if (arity_sorts.size() > 0) {
int last = arity_sorts.item(0);
for (int arity_sort = 1; arity_sort < arity_sorts.size(); ) {
Result.append((sorts.item(last)).toString());
last = arity_sorts.item(arity_sort);
arity_sort++;
if (arity_sort < arity_sorts.size()) Result.append(",");
}
Result.append("->");
Result.append((sorts.item(last)).toString());
}
return new String(Result);
}
//---------------- private implementation features ---------------------
@SuppressWarnings("unused")
private void compute_colimit()
{
INT_VECTOR colimit_sorts = f_sort_diagram.get_colimit_indices();
INT_VECTOR colimit_ops = f_op_diagram.get_colimit_indices();
f_colimit_arity = new COLIM_VECTOR(colimit_ops.size());
for (int op = 0; op < colimit_ops.size(); op++) {
INT_VECTOR arity_sorts = (INT_VECTOR)
f_coprod_arity.item(colimit_ops.item(op));
INT_VECTOR colim_arity = new INT_VECTOR(arity_sorts.size());
for (int sort = 0; sort < arity_sorts.size(); sort++)
colim_arity.push_back(f_sort_diagram.get_colimit_pos(
arity_sorts.item(sort)));
f_colimit_arity.push_back(colim_arity);
}
f_colimit_valid = true;
}
private SET_DIAGRAM f_sort_diagram;
private SET_DIAGRAM f_op_diagram;
private COLIM_VECTOR f_coprod_arity;
private COLIM_VECTOR f_colimit_arity;
private boolean f_colimit_valid;
}