1 /* 2 * Licensed to the Apache Software Foundation (ASF) under one 3 * or more contributor license agreements. See the NOTICE file 4 * distributed with this work for additional information 5 * regarding copyright ownership. The ASF licenses this file 6 * to you under the Apache License, Version 2.0 (the 7 * "License"); you may not use this file except in compliance 8 * with the License. You may obtain a copy of the License at 9 * 10 * http://www.apache.org/licenses/LICENSE-2.0 11 * 12 * Unless required by applicable law or agreed to in writing, software 13 * distributed under the License is distributed on an "AS IS" BASIS, 14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 * See the License for the specific language governing permissions and 16 * limitations under the License. 17 */ 18 19 package org.apache.giraph.graph; 20 21 import org.apache.giraph.conf.ImmutableClassesGiraphConfigurable; 22 import org.apache.giraph.edge.Edge; 23 import org.apache.giraph.edge.MutableEdge; 24 import org.apache.hadoop.io.Writable; 25 import org.apache.hadoop.io.WritableComparable; 26 27 /** 28 * Class which holds vertex id, data and edges. 29 * 30 * @param <I> Vertex id 31 * @param <V> Vertex data 32 * @param <E> Edge data 33 */ 34 public interface Vertex<I extends WritableComparable, 35 V extends Writable, E extends Writable> extends 36 ImmutableClassesGiraphConfigurable<I, V, E> { 37 /** 38 * Initialize id, value, and edges. 39 * This method (or the alternative form initialize(id, value)) must be called 40 * after instantiation, unless readFields() is called. 41 * 42 * @param id Vertex id 43 * @param value Vertex value 44 * @param edges Iterable of edges 45 */ 46 void initialize(I id, V value, Iterable<Edge<I, E>> edges); 47 48 /** 49 * Initialize id and value. Vertex edges will be empty. 50 * This method (or the alternative form initialize(id, value, edges)) 51 * must be called after instantiation, unless readFields() is called. 52 * 53 * @param id Vertex id 54 * @param value Vertex value 55 */ 56 void initialize(I id, V value); 57 58 /** 59 * Get the vertex id. 60 * 61 * @return My vertex id. 62 */ 63 I getId(); 64 65 /** 66 * Get the vertex value (data stored with vertex) 67 * 68 * @return Vertex value 69 */ 70 V getValue(); 71 72 /** 73 * Set the vertex data (immediately visible in the computation) 74 * 75 * @param value Vertex data to be set 76 */ 77 void setValue(V value); 78 79 /** 80 * After this is called, the compute() code will no longer be called for 81 * this vertex unless a message is sent to it. Then the compute() code 82 * will be called once again until this function is called. The 83 * application finishes only when all vertices vote to halt. 84 */ 85 void voteToHalt(); 86 87 /** 88 * Get the number of outgoing edges on this vertex. 89 * 90 * @return the total number of outbound edges from this vertex 91 */ 92 int getNumEdges(); 93 94 /** 95 * Get a read-only view of the out-edges of this vertex. 96 * Note: edge objects returned by this iterable may be invalidated as soon 97 * as the next element is requested. Thus, keeping a reference to an edge 98 * almost always leads to undesired behavior. 99 * Accessing the edges with other methods (e.g., addEdge()) during iteration 100 * leads to undefined behavior. 101 * 102 * @return the out edges (sort order determined by subclass implementation). 103 */ 104 Iterable<Edge<I, E>> getEdges(); 105 106 /** 107 * Set the outgoing edges for this vertex. 108 * 109 * @param edges Iterable of edges 110 */ 111 void setEdges(Iterable<Edge<I, E>> edges); 112 113 /** 114 * Get an iterable of out-edges that can be modified in-place. 115 * This can mean changing the current edge value or removing the current edge 116 * (by using the iterator version). 117 * Note: accessing the edges with other methods (e.g., addEdge()) during 118 * iteration leads to undefined behavior. 119 * 120 * @return An iterable of mutable out-edges 121 */ 122 Iterable<MutableEdge<I, E>> getMutableEdges(); 123 124 /** 125 * Return the value of the first edge with the given target vertex id, 126 * or null if there is no such edge. 127 * Note: edge value objects returned by this method may be invalidated by 128 * the next call. Thus, keeping a reference to an edge value almost always 129 * leads to undesired behavior. 130 * 131 * @param targetVertexId Target vertex id 132 * @return Edge value (or null if missing) 133 */ 134 E getEdgeValue(I targetVertexId); 135 136 /** 137 * If an edge to the target vertex exists, set it to the given edge value. 138 * This only makes sense with strict graphs. 139 * 140 * @param targetVertexId Target vertex id 141 * @param edgeValue Edge value 142 */ 143 void setEdgeValue(I targetVertexId, E edgeValue); 144 145 /** 146 * Get an iterable over the values of all edges with the given target 147 * vertex id. This only makes sense for multigraphs (i.e. graphs with 148 * parallel edges). 149 * Note: edge value objects returned by this method may be invalidated as 150 * soon as the next element is requested. Thus, keeping a reference to an 151 * edge value almost always leads to undesired behavior. 152 * 153 * @param targetVertexId Target vertex id 154 * @return Iterable of edge values 155 */ 156 Iterable<E> getAllEdgeValues(final I targetVertexId); 157 158 /** 159 * Add an edge for this vertex (happens immediately) 160 * 161 * @param edge Edge to add 162 */ 163 void addEdge(Edge<I, E> edge); 164 165 /** 166 * Removes all edges pointing to the given vertex id. 167 * 168 * @param targetVertexId the target vertex id 169 */ 170 void removeEdges(I targetVertexId); 171 172 /** 173 * If a {@link org.apache.giraph.edge.MutableEdgesWrapper} was used to 174 * provide a mutable iterator, copy any remaining edges to the new 175 * {@link org.apache.giraph.edge.OutEdges} data structure and keep a direct 176 * reference to it (thus discarding the wrapper). 177 * Called by the Giraph infrastructure after computation. 178 */ 179 void unwrapMutableEdges(); 180 181 /** 182 * Re-activate vertex if halted. 183 */ 184 void wakeUp(); 185 186 /** 187 * Is this vertex done? 188 * 189 * @return True if halted, false otherwise. 190 */ 191 boolean isHalted(); 192 } 193