1. Summary
  2. Files
  3. Support
  4. Report Spam
  5. Create account
  6. Log in
Warning: Can't synchronize with the repository (/nfs/sf-svn/j/ju/jung does not appear to be a Subversion repository.). Look in the Trac log for more information.

NOTE: These notes cover only changes made since version 2.0 beta1; they don't cover all changes since v1.7.6. The closest that we currently have to a comprehensive guide of such changes may be found in the class migration guide.


This section is for changes that have been made in CVS but not yet formally released, so that we (the JUNG team) can keep track of what we've done. NOTE: the usual warning about unreleased code: changes listed here are not guaranteed to be released: it's quite rare for us to revert something that we've written up in our 'unreleased' release notes, but it can happen.

bug fixes:

  • EditingPopupGraphMousePlugin bug fixed so menu items are no longer duplicated.
  • FourPassImageShaper improved to not clip parts of image vertices (as was visible in the LensVertexImageShaperDemo). A unit test case was also added for this class.


  • EditingGraphMousePlugin refactored to extract the code that creates vertices and edges, and the code the provides visual effects while creating an edge. The new interfaces are:
    • VertexSupport - create a new vertex
    • EdgeSupport - create a new edge
    • EdgeEffects - overlay a visual effect while a new edge is being dragged into position
  • Implementations are:
    • SimpleVertexSupport
    • SimpleEdgeSupport
    • CubicCurveEdgeEffects
  • EditingGraphMousePlugin now has settable properties for VertexSupport and EdgeSupport
  • SimpleEdgeSupport has a settable property for EdgeEffects

Version 2.0.1 (Compliments Day 2010)

bug fixes:

  • AbstractLayout.setInitializer() now prevents the user from supplying 'this' as its own initializer
  • PluggableRendererDemo: fixed bug introduced by use of NumberFormattingTransformer
  • BetwennessCentrality: removed bad println
  • MinimumSpanningForest: fixed bug in initializer with no edge weights
  • GraphMLWriter: fixed ordering problem in save()
  • OrderedKAryTree: fixed instantiation bug (internals now use List rather than an array)
  • DistanceCentrality
    • is now properly ignoring self distances when required
    • fixed assignment problem at end of getScore() method (now returns correct value on the first (uncached) invocation)
  • DirectedSparseMultigraph.findEdge(): added contains check on arguments to replace unexpected NullPointerException with a more comprehensible IllegalArgumentException
  • MinimumSpanningForest: changed use of ConstantTransformer to take a double instead of an integer to avoid a ClassCastException
  • DijkstraDistance: fixed handling of maxDistance: now allows multiple destinations/paths at max_distance (used to stop after 1) and disallows any destinations at > max_distance (used to allow exactly 1)
  • CircleLayout: fixed bug in setVertexOrder(Comparator)
  • DijkstraShortestPath: changed Transformer signature in constructors to allow subclasses of Number for edge weights
  • added Serializable tagging interface to AbstractGraph, GraphDecorator (fixes some serialization problems)
  • TreeLayout: fixed hardcoding of distances (now properly uses this.distX and this.distY where appropriate)
  • RadialTreeLayout: fixed support for modifications (esp. collapsing)
  • MinimumSpanningForest2: fixed initialization bug with null weights leading to NPE
  • DelegateTree.getPath() now returns vertices in order specified (was reverse order)
  • GraphMLReader: now correctly handles text of any length between tags
  • Lattice2DGenerator: now correctly generates undirected and directed flat and toroidal lattices (no longer adds superfluous edges)
  • WeightedChoice: fixed bug in calculating bucket weights
  • KleinbergSmallWorldGenerator: miscellaneous bug fixes (inc. use of WeightedChoice), generalized graph types that it accepts

new features:

  • support for rendering edge arrows in the middle of the edge (see PluggableRendererDemo for an example)

known issues:

  • algorithms.scoring.BetweennessCentrality does not work properly for all weighted graphs

Version 2.0 (Easter 2009)

bug fixes:

  • DistanceCentralityScorer constructor now correctly initializes all internal data structures
  • DelegateForest.removeVertex() now creates a new data structure to iterate over to avoid ConcurrentModificationException
  • ShortestPathUtils.getPath now uses Object.equals() instead of ==
  • EdgePredicateFilter now properly populates filtered graph (instead of original graph) with Predicate-passing edges
  • PersistentLayoutImpl.done() modified so that it calls super.done() (this should hopefully reduce its CPU usage)
  • BarabasiAlbertGenerator now handles edge direction/parallel edges sanely and correctly
  • DirectionTransformer now correctly adds edges to newly generated graphs rather than the original ones (!)
  • OrderedKAryTree: now initializes internal data structures, added new null/sanity checks
  • TreeLayout.setGraph() now works (roots were not being reset)


  • added ObservableCachingLayout.done()
  • MapBinaryHeap now implements java.util.Queue (pop() is now deprecated in favor of poll() or remove())
  • all algorithms in algorithms.scoring and everything in algorithms.shortestpath (except ShortestPathUtils.getPath()) now work on Hypergraphs rather than Graphs
  • fixed ObservableGraph.removeVertex() so that it causes events to be fired for the attendant removal of incident edges also
  • TreeLayout.setSize() now throws UnsupportedOperationException
  • CircleLayout: orderVertices replaced by setVertexOrder (which actually does what the name implies :) )
  • moved RandomLocationTransformer from algorithms.util to algorithms.layout.util
  • DistanceCentralityScorer (and its subclasses ClosenessCentrality and Barycenter) now returns a score of 1 / (the value previously returned); this assigns a higher score to vertices with short {average, total} distances. Vertices which have a 0 average/total distance are now assigned a score of Double.POSITIVE_INFINITY.
  • EdgeBetweennessClusterer now uses the implementation of BetweennessCentrality in algorithms.scoring.
  • UndirectedSparseGraph.addEdge() now returns false if the user attempts to add an edge that would be parallel to an existing edge, rather than throwing IllegalArgumentException; this makes its behavior consistent with SparseGraph and DirectedSparseGraph.
  • moved getChildren(), getChildCount(), getChildEdges(), getParent(), getParentEdge() from Tree to Forest
  • GraphMatrixOperations methods now assign vertices to indices in order of the vertices' being encountered (in iteration over an existing collection) or created (in generation by the vertex Factory); this means it's the user's responsibility to supply a factory or collection that provides vertices in the desired order.
    no longer needs undirected and directed graph Factory instances; it will use whatever graph Factory you specify. (If you want to know whether the matrix is symmetric, you can use the Colt Property.isSymmetric() method.)
    version with String 'key' is now removed (obsolete)
  • The use of the CERN Colt libraries has been reduced further. NOTE: JUNG does not now directly use (and never has used) the hep.aida libraries which are part of the main Colt distribution, which have a different license (LGPL, no military use). FRLayout: no longer uses Colt's matrix classes for internal data
    ISOMLayout: no longer uses Colt's matrix classes for internal data; refactored and cleaned up somewhat
    JUNG no longer uses CERN (Colt) for random number generation (affects VoltageClusterer, KMeansClusterer)
    MatrixFile: no longer uses Colt's corejava.Format for string formatting, or DoubleArrayList
    remaining uses: GraphMatrixOperations; classes in algorithms.importance that use GMO (!RandomWalkSTBetweenness, MarkovCentrality); MatrixFile


  • obsolete decorators from visualization.decorators: Arrow, EdgeWeightLabeller, GradientEdgePaintRenderer, MapNumberVertexValue, Number*Value*; introduced NumberFormattingTransformer as a replacement
  • obsolete GraphML I/O classes: GraphMLFile, GraphMLFileHandler, TestGraphMLFile
  • deprecated classes from algorithms.importance (and associated tests): BaryCenter, DegreeDistributionRanker, HITS[WithPriors], PageRank[WithPriors], VoltageRanker; see algorithms.scoring for replacements
  • algorithms.util.NumericalPrecision
  • KNeighborhoodFilter.getName(): part of obsolete Filter design
  • BarabasiAlbertGenerator.reset()
  • DelegateTree.getRoots() [plural]: not relevant to this class
  • AbstractLayout.getVertices(): use layout.getGraph().getVertices() instead
  • BFSDistanceLabeler.removeDecorations(): not needed in 2.0 design

new features:

  • Hypergraph.getDefaultEdgeType(), AbstractTypedGraph
  • new GraphML parser
  • SortedSparseMultigraph now includes a setVertexComparator() method
  • algorithms.util.WeightedChoice: selects items from arbitrary (specified) distribution
  • algorithms.generator.Lattice2D (ported from JUNG 1.x)
  • algorithms.generator.random.KleinbergSmallWorldGenerator
  • TreeUtils.getRoots(Forest)