it.unimi.dsi.webgraph.labelling
Class UnionArcLabelledImmutableGraph

java.lang.Object
  extended by it.unimi.dsi.webgraph.ImmutableGraph
      extended by it.unimi.dsi.webgraph.labelling.ArcLabelledImmutableGraph
          extended by it.unimi.dsi.webgraph.labelling.UnionArcLabelledImmutableGraph
All Implemented Interfaces:
FlyweightPrototype<ImmutableGraph>

public class UnionArcLabelledImmutableGraph
extends ArcLabelledImmutableGraph

An arc-labelled immutable graph representing the union of two given such graphs. Here by “union” we mean that an arc will belong to the union iff it belongs to at least one of the two graphs (the number of nodes of the union is taken to be the maximum among the number of nodes of each graph). Labels are assumed to have the same prototype in both graphs, and are treated as follows: if an arc is present in but one graph, its label in the resulting graph is going to be the label of the arc in the graph where it comes from; if an arc is present in both graphs, the labels are combined using a provided LabelMergeStrategy.

Remarks about the implementation

Due to the lack of multiple inheritance, we could not extend both UnionImmutableGraph and ArcLabelledImmutableGraph, hence we forcedly decided to extend the latter. The possibility of using delegation on the former was also discarded because the code for reading and merging labels is so tightly coupled with the rest that it would have been essentially useless (and even dangerous) to delegate the iteration methods. As a result, some of the code of this class is actually almost a duplicate of the code of UnionImmutableGraph.


Nested Class Summary
 
Nested classes/interfaces inherited from class it.unimi.dsi.webgraph.ImmutableGraph
ImmutableGraph.LoadMethod
 
Field Summary
 
Fields inherited from class it.unimi.dsi.webgraph.labelling.ArcLabelledImmutableGraph
UNDERLYINGGRAPH_PROPERTY_KEY, UNDERLYINGGRAPH_SUFFIX
 
Fields inherited from class it.unimi.dsi.webgraph.ImmutableGraph
GRAPHCLASS_PROPERTY_KEY, PROPERTIES_EXTENSION
 
Constructor Summary
UnionArcLabelledImmutableGraph(ArcLabelledImmutableGraph g0, ArcLabelledImmutableGraph g1, LabelMergeStrategy labelMergeStrategy)
          Creates the union of two given graphs.
 
Method Summary
 UnionArcLabelledImmutableGraph copy()
          Returns a flyweight copy of this immutable graph.
 Label[] labelArray(int x)
          Returns a reference to an array containing the labels of the arcs going out of a given node in the same order as the order in which the corresponding successors are returned by ArcLabelledImmutableGraph.successors(int).
 ArcLabelledNodeIterator nodeIterator(int from)
          Returns a node iterator for scanning the graph sequentially, starting from the given node.
 int numNodes()
          Returns the number of nodes of this graph.
 int outdegree(int x)
          Returns the outdegree of a node.
 Label prototype()
          Returns a prototype of the labels used by this graph.
 boolean randomAccess()
          Checks whether this graph provides random access to successor lists.
 int[] successorArray(int x)
          Returns a reference to an array containing the successors of a given node.
 ArcLabelledNodeIterator.LabelledArcIterator successors(int x)
          Returns a lazy iterator over the successors of a given node.
 
Methods inherited from class it.unimi.dsi.webgraph.labelling.ArcLabelledImmutableGraph
equals, load, load, loadOffline, loadOffline, loadOnce, loadSequential, loadSequential, nodeIterator, toString
 
Methods inherited from class it.unimi.dsi.webgraph.ImmutableGraph
basename, hashCode, load, loadMapped, loadMapped, numArcs, outdegrees, store, store
 
Methods inherited from class java.lang.Object
clone, finalize, getClass, notify, notifyAll, wait, wait, wait
 

Constructor Detail

UnionArcLabelledImmutableGraph

public UnionArcLabelledImmutableGraph(ArcLabelledImmutableGraph g0,
                                      ArcLabelledImmutableGraph g1,
                                      LabelMergeStrategy labelMergeStrategy)
Creates the union of two given graphs.

Parameters:
g0 - the first graph.
g1 - the second graph.
labelMergeStrategy - the strategy used to merge labels when the same arc is present in both graphs.
Method Detail

copy

public UnionArcLabelledImmutableGraph copy()
Description copied from class: ImmutableGraph
Returns a flyweight copy of this immutable graph.

Specified by:
copy in interface FlyweightPrototype<ImmutableGraph>
Specified by:
copy in class ArcLabelledImmutableGraph
Returns:
a flyweight copy of this immutable graph.
See Also:
FlyweightPrototype

nodeIterator

public ArcLabelledNodeIterator nodeIterator(int from)
Description copied from class: ArcLabelledImmutableGraph
Returns a node iterator for scanning the graph sequentially, starting from the given node.

This implementation strengthens that provided in ImmutableGraph, but calls the labelled random-access method ArcLabelledImmutableGraph.successors(int).

Overrides:
nodeIterator in class ArcLabelledImmutableGraph
Parameters:
from - the node from which the iterator will iterate.
Returns:
an ArcLabelledNodeIterator for accessing nodes, successors and their labels sequentially.
See Also:
ImmutableGraph.nodeIterator()

numNodes

public int numNodes()
Description copied from class: ImmutableGraph
Returns the number of nodes of this graph.

Albeit this method is not optional, it is allowed that this method throws an UnsupportedOperationException if this graph has never been entirely traversed using a node iterator. This apparently bizarre behaviour is necessary to support implementations as ArcListASCIIGraph, which do not know the actual number of nodes until a traversal has been completed.

Specified by:
numNodes in class ImmutableGraph
Returns:
the number of nodes.

randomAccess

public boolean randomAccess()
Description copied from class: ImmutableGraph
Checks whether this graph provides random access to successor lists.

Specified by:
randomAccess in class ImmutableGraph
Returns:
true if this graph provides random access to successor lists.

successorArray

public int[] successorArray(int x)
Description copied from class: ImmutableGraph
Returns a reference to an array containing the successors of a given node.

The returned array may contain more entries than the outdegree of x. However, only those with indices from 0 (inclusive) to the outdegree of x (exclusive) contain valid data.

This implementation just unwraps the iterator returned by ImmutableGraph.successors(int). Subclasses are encouraged to override this implementation.

Warning: all implementations must guarantee that a distinct array is returned for each node. The caller, in turn, must treat the array as a read-only object.

Overrides:
successorArray in class ImmutableGraph
Parameters:
x - a node.
Returns:
an array whose first elements are the successors of the node; the array must not be modified by the caller.

outdegree

public int outdegree(int x)
Description copied from class: ImmutableGraph
Returns the outdegree of a node.

Specified by:
outdegree in class ImmutableGraph
Parameters:
x - a node.
Returns:
the outdegree of the given node.

labelArray

public Label[] labelArray(int x)
Description copied from class: ArcLabelledImmutableGraph
Returns a reference to an array containing the labels of the arcs going out of a given node in the same order as the order in which the corresponding successors are returned by ArcLabelledImmutableGraph.successors(int).

The returned array may contain more entries than the outdegree of x. However, only those with indices from 0 (inclusive) to the outdegree of x (exclusive) contain valid data.

This implementation just unwrap the iterator returned by ArcLabelledImmutableGraph.successors(int) and writes in a newly allocated array copies of the labels returned by ArcLabelledNodeIterator.LabelledArcIterator.label().

Overrides:
labelArray in class ArcLabelledImmutableGraph
Returns:
an array whose first elements are the labels of the arcs going out of x; the array must not be modified by the caller.

successors

public ArcLabelledNodeIterator.LabelledArcIterator successors(int x)
Description copied from class: ImmutableGraph
Returns a lazy iterator over the successors of a given node. The iteration terminates when -1 is returned.

This implementation just wraps the array returned by ImmutableGraph.successorArray(int). Subclasses are encouraged to override this implementation.

The semantics of this method has been significantly modified in WebGraph 2.0 to take advantage of the new, faster lazy architecture.

Specified by:
successors in class ArcLabelledImmutableGraph
Parameters:
x - a node.
Returns:
a lazy iterator over the successors of the node.

prototype

public Label prototype()
Description copied from class: ArcLabelledImmutableGraph
Returns a prototype of the labels used by this graph. The prototype can be used to produce new copies, but must not be modified by the caller.

Specified by:
prototype in class ArcLabelledImmutableGraph
Returns:
a prototype for the labels of this graph.