COSTA: COSt and Termination Analyzer for Java Bytecode
    
    package memory.jolden.em3d;

import java.util.Enumeration;

/** 
 * A class that represents the irregular bipartite graph used in
 * EM3D.  The graph contains two linked structures that represent the
 * E nodes and the N nodes in the application.
 **/
final class BiGraph
{
  /**
   * Nodes that represent the electrical field.
   **/
  Node eNodes;
  /**
   * Nodes that representhe the magnetic field.
   **/
  Node hNodes;

  /**
   * Construct the bipartite graph.
   * @param e the nodes representing the electric fields
   * @param h the nodes representing the magnetic fields
   **/ 
  BiGraph(Node e, Node h)
  {
    eNodes = e;
    hNodes = h;
  }

  /**
   * Create the bi graph that contains the linked list of
   * e and h nodes.
   * @param numNodes the number of nodes to create
   * @param numDegree the out-degree of each node
   * @param verbose should we print out runtime messages
   * @return the bi graph that we've created.
   **/
  static BiGraph create(int numNodes, int numDegree, boolean verbose)
  {
    Node.initSeed(783);

    // making nodes (we create a table)
    if (verbose) System.out.println("making nodes (tables in orig. version)");
    Node[] hTable = Node.fillTable(numNodes, numDegree);
    Node[] eTable = Node.fillTable(numNodes, numDegree);

    // making neighbors
    if (verbose) System.out.println("updating from and coeffs");
    // for (Enumeration e = hTable[0].elements(); e.hasMoreElements(); ) {
    //   Node n = (Node) e.nextElement();
    //   n.makeUniqueNeighbors(eTable);
    // }
    // for (Node e=hTable[0]; e != null; ) {
    // 	//      Node n = (Node) e.nextElement();
    //   e=e.next;
    //   //n.makeUniqueNeighbors(eTable);
    // }
    // for (Enumeration e = eTable[0].elements(); e.hasMoreElements(); ) {
    //   Node n = (Node) e.nextElement();
    //   n.makeUniqueNeighbors(hTable);
    // }

    // // Create the fromNodes and coeff field
    // if (verbose) System.out.println("filling from fields");
    // for (Enumeration e = hTable[0].elements(); e.hasMoreElements(); ) {
    //   Node n = (Node) e.nextElement();
    //   n.makeFromNodes();
    // }
    // for (Enumeration e = eTable[0].elements(); e.hasMoreElements(); ) {
    //   Node n = (Node) e.nextElement();
    //   n.makeFromNodes();
    // }

    // // Update the fromNodes
    // for (Enumeration e = hTable[0].elements(); e.hasMoreElements(); ) {
    //   Node n = (Node) e.nextElement();
    //   n.updateFromNodes();
    // }
    // for (Enumeration e = eTable[0].elements(); e.hasMoreElements(); ) {
    //   Node n = (Node) e.nextElement();
    //   n.updateFromNodes();
    // }

    BiGraph g = new BiGraph(eTable[0], hTable[0]);
    return g;
  }

  /** 
   * Update the field values of e-nodes based on the values of
   * neighboring h-nodes and vice-versa.
   **/
  void compute()
  {
    for (Enumeration e = eNodes.elements(); e.hasMoreElements(); ) {
      Node n = (Node) e.nextElement();
      n.computeNewValue();
    }
    for (Enumeration e = hNodes.elements(); e.hasMoreElements(); ) {
      Node n = (Node) e.nextElement();
      n.computeNewValue();
    }
  }

  /**
   * Override the toString method to print out the values of the e and h nodes.
   * @return a string contain the values of the e and h nodes.
   **/
  public String toString()
  {
    StringBuffer retval = new StringBuffer();
    Node n = eNodes;
    while (n != null){
	retval.append("E: " + n + "\n");
	n = n.next;
    }
    /*
    for (Enumeration e = eNodes.elements(); e.hasMoreElements(); ) {
      Node n = (Node) e.nextElement();
      retval.append("E: " + n + "\n");
    }
    */

    n = hNodes;
    while (n != null){
	retval.append("H: " + n + "\n");
	n = n.next;
    }
    /*
    for (Enumeration e = hNodes.elements(); e.hasMoreElements(); ) {
      Node n = (Node) e.nextElement();
      retval.append("H: " + n + "\n");
    }
    */
    return retval.toString();
  }

    public static void main(String[] args){
	BiGraph graph = BiGraph.create(2,2,false);
	graph.toString();
    }

}