| Line | Hits | Source |
|---|---|---|
| 1 | /* | |
| 2 | * Created on Mar 29, 2004 | |
| 3 | * | |
| 4 | * Copyright (c) 2004, the JUNG Project and the Regents of the University | |
| 5 | * of California | |
| 6 | * All rights reserved. | |
| 7 | * | |
| 8 | * This software is open-source under the BSD license; see either | |
| 9 | * "license.txt" or | |
| 10 | * http://jung.sourceforge.net/license.txt for a description. | |
| 11 | */ | |
| 12 | package edu.uci.ics.jung.graph.impl; | |
| 13 | ||
| 14 | import java.util.Collection; | |
| 15 | import java.util.Iterator; | |
| 16 | ||
| 17 | import org.apache.commons.collections.Predicate; | |
| 18 | import org.apache.commons.collections.functors.OnePredicate; | |
| 19 | ||
| 20 | import edu.uci.ics.jung.graph.Edge; | |
| 21 | import edu.uci.ics.jung.graph.Graph; | |
| 22 | import edu.uci.ics.jung.graph.KPartiteGraph; | |
| 23 | import edu.uci.ics.jung.graph.Vertex; | |
| 24 | import edu.uci.ics.jung.graph.predicates.KPartiteEdgePredicate; | |
| 25 | import edu.uci.ics.jung.utils.SubsetManager; | |
| 26 | ||
| 27 | ||
| 28 | /** | |
| 29 | * An implementation of KPartiteGraph based on SparseGraph. | |
| 30 | * This implementation optionally creates a subset for each partition | |
| 31 | * specified in the constructor. | |
| 32 | * | |
| 33 | * <p>Vertex constraints imposed by this class: predicates in | |
| 34 | * <code>partitions</code> constructor argument</p> | |
| 35 | * <p>Edge constraints imposed by this class: | |
| 36 | * <code>KPartiteEdgePredicate(partitions)</code></p> | |
| 37 | * | |
| 38 | * @author Joshua O'Madadhain | |
| 39 | */ | |
| 40 | public class KPartiteSparseGraph extends SparseGraph implements KPartiteGraph | |
| 41 | { | |
| 42 | protected Collection partitions; | |
| 43 | ||
| 44 | /** | |
| 45 | * Creates a KPartiteSparseGraph whose partitions are specified by | |
| 46 | * the predicates in the <code>partitions</code> array. If the | |
| 47 | * <code>subsets</code> argument is true, creates a subset for | |
| 48 | * each partition. | |
| 49 | */ | |
| 50 | public KPartiteSparseGraph(Collection partitions, boolean subsets) | |
| 51 | { | |
| 52 | 18 | super(); |
| 53 | 18 | if (partitions.size() < 2) |
| 54 | 0 | throw new IllegalArgumentException("Constructor must " + |
| 55 | "specify >= 2 vertex partition predicates"); | |
| 56 | 18 | this.partitions = partitions; |
| 57 | ||
| 58 | // each vertex added must satisfy exactly 1 partition-specific predicate | |
| 59 | 18 | getVertexConstraints().add(OnePredicate.getInstance(partitions)); |
| 60 | ||
| 61 | // each edge added must connect vertices in distinct partitions | |
| 62 | // user_edge_requirements.add(new KPartiteEdgePredicate(partitions)); | |
| 63 | 18 | getEdgeConstraints().add(new KPartiteEdgePredicate(partitions)); |
| 64 | ||
| 65 | // create a subset for each vertex predicate | |
| 66 | 18 | if (subsets) |
| 67 | { | |
| 68 | 18 | SubsetManager sm = SubsetManager.getInstance(this); |
| 69 | 18 | for (Iterator p_iter = partitions.iterator(); p_iter.hasNext(); ) |
| 70 | 36 | sm.addVertexSubset((Predicate)p_iter.next()); |
| 71 | } | |
| 72 | 18 | } |
| 73 | ||
| 74 | /** | |
| 75 | * <p> | |
| 76 | * Creates a new <code>KPartiteSparseGraph</code> which contains all the | |
| 77 | * vertices and edges in <code>g</code>. The new graph contains all the | |
| 78 | * user data from the original graph and its components. | |
| 79 | * </p> | |
| 80 | * <p> | |
| 81 | * This method performs no tagging or structural conversion. If | |
| 82 | * <code>g</code> is not compatible with the constraints specified by | |
| 83 | * <code>partitions</code>, this constructor will throw an | |
| 84 | * <code>IllegalArgumentException</code>. Thus, each vertex in | |
| 85 | * <code>g</code> must be a member of exactly one partition, and each edge | |
| 86 | * must join vertices in distinct partitions. | |
| 87 | * </p> | |
| 88 | */ | |
| 89 | public KPartiteSparseGraph(Graph g, Collection partitions, boolean subsets) | |
| 90 | { | |
| 91 | 4 | this(partitions, subsets); |
| 92 | ||
| 93 | 4 | addAllNotInitializers(getEdgeConstraints(), g.getEdgeConstraints()); |
| 94 | 4 | addAllNotInitializers(getVertexConstraints(), g.getVertexConstraints()); |
| 95 | 4 | for (Iterator iter = g.getVertices().iterator(); iter.hasNext();) |
| 96 | { | |
| 97 | 16 | Vertex av = (Vertex) iter.next(); |
| 98 | 16 | av.copy(this); |
| 99 | } | |
| 100 | ||
| 101 | 3 | for (Iterator iter = g.getEdges().iterator(); iter.hasNext();) |
| 102 | { | |
| 103 | 8 | Edge ae = (Edge) iter.next(); |
| 104 | 8 | ae.copy(this); |
| 105 | } | |
| 106 | ||
| 107 | 1 | this.importUserData(g); |
| 108 | 1 | } |
| 109 | ||
| 110 | public Collection getPartitions() | |
| 111 | { | |
| 112 | 3 | return partitions; |
| 113 | } | |
| 114 | } |
|
this report was generated by version 1.0.5 of jcoverage. |
copyright © 2003, jcoverage ltd. all rights reserved. |