Package org.geotools.graph.structure

Examples of org.geotools.graph.structure.Node


    }
    return node;
  }

  private Node retrieveNode(Coordinate c) {
    Node node = m_coord2node.get(c);
    if (node == null && useTolerance()) {
      node = findClosestNodeWithinTolerance(c);
    }
    return node;
  }
View Full Code Here


  /**
   * @see Edge#reverse()
   */
  public void reverse() {
    Node n = m_nodeA;
    m_nodeA = m_nodeB;
    m_nodeB = n;
  }
View Full Code Here

   */
  public void cont(Graphable current, GraphTraversal traversal) {
    DijkstraNode currdn = (DijkstraNode)nodemap.get(current);
   
    for (Iterator itr = getRelated(current); itr.hasNext();) {
      Node related = (Node)itr.next();
      if (!traversal.isVisited(related)) {
        DijkstraNode reldn = (DijkstraNode)nodemap.get(related);
       
        //calculate cost from current node to related node
        double cost = weighter.getWeight(currdn.node.getEdge(related))
View Full Code Here

      m_partition = new ArrayList();
     
      while(m_nvisited > 0) {
       
        //find a node that hasn't been visited and set as source of traversal
        Node source = null;
        while(sources.hasNext() && (source = (Node)sources.next()).isVisited());
      
        //if we could not find a source, return false
        if (source == null || source.isVisited()) return(false);
       
        iterator.setSource(source);
        traversal.traverse();
      }
     
      //create the individual graphs
      HashSet nodes = null;
      HashSet edges = null;
      ArrayList graphs = new ArrayList();
     
      for (Iterator itr = m_partitions.iterator(); itr.hasNext();) {
        m_partition = (ArrayList)itr.next();
        if (m_partition.size() == 0) continue;
       
        nodes = new HashSet();
        edges = new HashSet();
        for (Iterator nitr = m_partition.iterator(); nitr.hasNext();) {
          Node node = (Node)nitr.next();
          nodes.add(node);
          edges.addAll(node.getEdges());
        }
       
        graphs.add(new BasicGraph(nodes, edges));
      }
     
View Full Code Here

   *
   * @return 2 element object array containing references to the end points of
   * the graph. (The nodes of degree 1 at the end of the graph.
   */
  public static Node[] buildNoBifurcations(GraphBuilder builder, int nnodes) {
    Node n1 = builder.buildNode();
    builder.addNode(n1);
    n1.setID(0);
   
    Node n2 = null;
    Edge e = null;
    Node first = n1;
   
    for (int i = 1; i < nnodes; i++) {
      n2 = builder.buildNode();
      builder.addNode(n2);
      n2.setID(i);
View Full Code Here

 
  public static Node[] buildSingleBifurcation(
    final GraphBuilder builder, int nnodes, final int bifurcation
  ) {
    Node[] ends = buildNoBifurcations(builder, nnodes-1);
    final Node n = builder.buildNode();
    final ArrayList bif = new ArrayList();
   
    builder.getGraph().visitNodes(
      new GraphVisitor() {
       public int visit(Graphable component) {
View Full Code Here

    GraphBuilder builder, int levels
  ) {
    HashMap id2node = new HashMap();
   
    //a balanced binary tree
    Node root = builder.buildNode();
    root.setObject(new String("0"));
    id2node.put(root.getObject(), root);
   
    builder.addNode(root);
   
    FIFOQueue queue = new FIFOQueue((int)Math.pow(2, levels+1));
    queue.enq(root);
   
    //build a complete binary tree
    // number of nodes = 2^(n+1) - 1
    int level = 0;
    while (level < levels) {  
      int nnodes = (int)Math.pow(2, level);
      for (int i = 0; i < nnodes; i++) {
        Node n = (Node)queue.deq()
       
        Node ln = builder.buildNode();
        ln.setObject(n.getObject() + ".0");
        id2node.put(ln.getObject(), ln);
       
        Node rn = builder.buildNode();
        rn.setObject(n.getObject() + ".1");
        id2node.put(rn.getObject(), rn);
       
        Edge le = builder.buildEdge(n, ln);
        Edge re = builder.buildEdge(n, rn);
       
        builder.addNode(ln);
View Full Code Here

    // number of nodes = 2^(n+1) - 1
    int level = 0;
    while (level < levels) {  
      int nnodes = (int)Math.pow(2, level);
      for (int i = 0; i < nnodes; i++) {
        Node n = (Node)queue.deq()
       
        OptNode ln = (OptNode) builder.buildNode();
        if (level < levels-1) ln.setDegree(3);
        else ln.setDegree(1);
       
View Full Code Here

    // number of nodes = 2^(n+1) - 1
    int level = 0;
    while (level < levels) {  
      int nnodes = (int)Math.pow(2, level);
      for (int i = 0; i < nnodes; i++) {
        Node n = (Node)queue.deq()
       
        OptDirectedNode ln = (OptDirectedNode) builder.buildNode();
        if (level < levels-1) {
          ln.setInDegree(1);
          ln.setOutDegree(2);
View Full Code Here

    //create walker for first stage
    // if the walker sees a node of degree 2 it adds it to the current
    // set of nodes, else it starts a new set
    m_walker = new GraphWalker() {
      public int visit(Graphable element, GraphTraversal traversal) {
        Node node = (Node)element;
       
        //if the node is not of degree 2, start a new set
        if (node.getDegree() != 2) {
          finish()
        }
        else {
          //add node to current set
          m_nodes.add(node);
          m_ndegree2--;
        }
      
        return(GraphTraversal.CONTINUE);
      }

      public void finish() {
        //no need to recreate if empty
        if (!m_nodes.isEmpty()) {
          m_sets.add(m_nodes);
          m_nodes = new ArrayList();
        }
      }
    };
   
    //perform a topological depth first traversal
    m_traversal = new BasicGraphTraversal(
      m_graph, m_walker, new DepthFirstTopologicalIterator()
    );
   
    //initialise set and node collections
    m_sets = new ArrayList();
    m_nodes = new ArrayList();
   
 
    m_ndegree2 = m_graph.getNodesOfDegree(2).size();
    if (m_ndegree2 == 0) return(true); // nothing to fuse
   
    m_traversal.init();
   
    //reset edge visited flags
    m_graph.visitNodes(
      new GraphVisitor() {
        public int visit(Graphable component) {
          component.setVisited(false);
          return 0;
        }
      }
    );
   
    //perform the traversal
    m_traversal.traverse();
   
    //if all nodes of degree 2 have been visited, we are finished
    if (m_ndegree2 > 0) {
   
      //if there are still nodes of degree 2 that havent been visited, it means
      // that the graph has a cycle and that the remaining degree 2 nodes are
      // internal to the cycle, so the strategy for the second stage is to
      // find all unvisited nodes of degree 2 that are not visited and start
      // a no bifurcation traversal from them
      Iterator sources = m_graph.queryNodes(
        new GraphVisitor() {
          public int visit(Graphable component) {
            Node node = (Node)component;
            if (!node.isVisited() && node.getDegree() == 2) {
              //check for adjacent node of degree > 2
              for (Iterator itr = node.getRelated(); itr.hasNext(); ) {
                Node rel = (Node)itr.next();
                if (rel.getDegree() > 2) return(Graph.PASS_AND_CONTINUE);
              }
            }
            return(Graph.FAIL_QUERY);
          }
        }
      ).iterator();
     
      //if the query returned no nodes, it means that all the cycle is
      // disconnected from the rest of graph, so just pick any node of degree 2
      if (!sources.hasNext()) {
        sources = m_graph.queryNodes(
          new GraphVisitor() {
            public int visit(Graphable component) {
              if (!component.isVisited()) return(Graph.PASS_AND_STOP);
              return(Graph.FAIL_QUERY);
            }
          }
        ).iterator()
      }
 
      //create stage 2 walker, simple add any nodes visited nodes to the
      // current node set
      m_walker = new GraphWalker() {
        public int visit(Graphable element, GraphTraversal traversal) {
          m_ndegree2--;
          m_nodes.add(element);
          return(GraphTraversal.CONTINUE);
        }
 
        public void finish() {
          m_sets.add(m_nodes);
          m_nodes = new ArrayList();
        }
      };
      m_traversal.setWalker(m_walker);
      m_traversal.setIterator(new NoBifurcationIterator());
     
      //clear current node list
      m_nodes = new ArrayList();
           
      Node source = null;
      while(sources.hasNext()) {
        while(sources.hasNext()) {
          source = (Node)sources.next();
          if (source.isVisited()) continue;
 
          ((SourceGraphIterator)m_traversal.getIterator()).setSource(source);
          m_traversal.traverse();
        }
      }
    }
   
    // should be zero, if not something wierd not accounted for
    if(m_ndegree2 == 0) {
     
      //build the fused graph
      for(Iterator sitr = m_sets.iterator(); sitr.hasNext();) {
        ArrayList nodes = (ArrayList)sitr.next();
        ArrayList edges = new ArrayList();
        Node first = null; //node of degree != 2 adjacent to first node in set
        Node last = null; //node of degree != 2 adjacent to last node in set
        
        if (nodes.size() == 1) {
          //set first and last to be related nodes
          Iterator related = ((Node)nodes.get(0)).getRelated();
          first = (Node)related.next();
          last = (Node)related.next();
         
          edges.addAll(((Node)nodes.get(0)).getEdges());
        }
        else {
         
          //get the node of degree != 2 adjacent to first node in set
          Node node = (Node)nodes.get(0);
          Iterator rel = node.getRelated();
          first = (Node)rel.next();
          if (first.equals(nodes.get(1))) first = (Node)rel.next();
        
          //get the node of degree != 2 adjacent to last node in set
          node = (Node)nodes.get(nodes.size()-1);
          rel = node.getRelated();
          last = (Node)rel.next();
          if (last.equals(nodes.get(nodes.size()-2))) last = (Node)rel.next();
         
          //check to see that the first node is not of degree 2, if it is we
          // have a set of nodes that forms a cycle with no bifurcations
          // set first to point to node at index 1, and last index x, also
          // remove node at index 0 from node set so it doesn't get removed
          if (first.getDegree() == 2) {
            first = (Node)nodes.get(1);
            last = (Node)nodes.get(0);
            first = last = (Node)nodes.get(0);
           
            //remove first node from list so that it doesn't get deleted
            nodes.remove(0);
          }
         
          //add edge between first node in set, and the node of degree != 2
          // that is adjacent to it
          edges.add(first.getEdge((Node)nodes.get(0)));
         
          //add middle edges
          for (int i = 1; i < nodes.size(); i++) {
            Node curr = (Node)nodes.get(i);
            Node prev = (Node)nodes.get(i-1);
            edges.add(curr.getEdge(prev));
          }
        
          //add edge between last node in set, and the node of degree != 2
          // that is adjacent to it
View Full Code Here

TOP

Related Classes of org.geotools.graph.structure.Node

Copyright © 2018 www.massapicom. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.