package i5.las2peer.services.ocd.adapters.coverInput; import i5.las2peer.services.ocd.adapters.AdapterException; import i5.las2peer.services.ocd.adapters.Adapters; import i5.las2peer.services.ocd.graphs.Cover; import i5.las2peer.services.ocd.graphs.CustomGraph; import java.io.Reader; import java.util.HashMap; import java.util.List; import java.util.Map; import org.la4j.matrix.Matrix; import org.la4j.matrix.sparse.CCSMatrix; import y.base.Node; import y.base.NodeCursor; /** * A cover input adapter for the labeled membership matrix format. * Each line of input contains first a node name and then n double values (where n is some natural number), using the space character (' ') as a delimiter. * The i-th double value of a row will define the node's membership degree for the i-th community. * There must be exactly one line for each node of the graph and each line must have the same number ("n") of double values. * @author Sebastian * */ public class LabeledMembershipMatrixCoverInputAdapter extends AbstractCoverInputAdapter { /** * Creates a new instance setting the reader attribute. * @param reader A reader that will be used to receive input from. */ public LabeledMembershipMatrixCoverInputAdapter(Reader reader) { this.setReader(reader); } /** * Creates a new instance. */ public LabeledMembershipMatrixCoverInputAdapter() { } @Override public Cover readCover(CustomGraph graph) throws AdapterException { NodeCursor nodes = graph.nodes(); Node node; Map<String, Node> reverseNodeNames = new HashMap<String, Node>(); while(nodes.ok()) { node = nodes.node(); reverseNodeNames.put(graph.getNodeName(node), node); nodes.next(); } try { List<String> line = Adapters.readLine(reader); Matrix memberships = new CCSMatrix(graph.nodeCount(), line.size() - 1); int nodeIndex; double belongingFactor; while(line.size() > 0) { nodeIndex = reverseNodeNames.get(line.get(0)).index(); for(int i=1; i<line.size(); i++) { belongingFactor = Double.parseDouble(line.get(i)); memberships.set(nodeIndex, i-1, belongingFactor); } line = Adapters.readLine(reader); } return new Cover(graph, memberships); } catch (Exception e) { throw new AdapterException(e); } finally { try { reader.close(); } catch (Exception e) { } } } }