Permalink
Browse files

Fixed layout bug and computation of dynamic Entropy Statistic

  • Loading branch information...
1 parent 9ffedee commit 7adad1baa77a4c5cfbbce866425d2acf5c6cc4ab @zitterbewegung committed May 13, 2012
@@ -1 +1,3 @@
+OpenIDE-Module-Long-Description=\
+ Copyright 2012 University of Illinois at Chicago
OpenIDE-Module-Name=DyNSPK
@@ -1,48 +1,49 @@
/*
-Copyright 2008-2010 Gephi
-Authors : Mathieu Bastian <mathieu.bastian@gephi.org>
-Website : http://www.gephi.org
-
-This file is part of Gephi.
-
-DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
-
-Copyright 2011 Gephi Consortium. All rights reserved.
-
-The contents of this file are subject to the terms of either the GNU
-General Public License Version 3 only ("GPL") or the Common
-Development and Distribution License("CDDL") (collectively, the
-"License"). You may not use this file except in compliance with the
-License. You can obtain a copy of the License at
-http://gephi.org/about/legal/license-notice/
-or /cddl-1.0.txt and /gpl-3.0.txt. See the License for the
-specific language governing permissions and limitations under the
-License. When distributing the software, include this License Header
-Notice in each file and include the License files at
-/cddl-1.0.txt and /gpl-3.0.txt. If applicable, add the following below the
-License Header, with the fields enclosed by brackets [] replaced by
-your own identifying information:
-"Portions Copyrighted [year] [name of copyright owner]"
-
-If you wish your version of this file to be governed by only the CDDL
-or only the GPL Version 3, indicate your decision by adding
-"[Contributor] elects to include this software in this distribution
-under the [CDDL or GPL Version 3] license." If you do not indicate a
-single choice of license, a recipient has the option to distribute
-your version of this file under either the CDDL, the GPL Version 3 or
-to extend the choice of license to its licensees as provided above.
-However, if you add GPL Version 3 code and therefore, elected the GPL
-Version 3 license, then the option applies only if the new code is
-made subject to such option by the copyright holder.
-
-Contributor(s):
-
-Portions Copyrighted 2011 Gephi Consortium.
+ Copyright 2008-2010 Gephi
+ Authors : Mathieu Bastian <mathieu.bastian@gephi.org>
+ Website : http://www.gephi.org
+
+ This file is part of Gephi.
+
+ DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+
+ Copyright 2011 Gephi Consortium. All rights reserved.
+
+ The contents of this file are subject to the terms of either the GNU
+ General Public License Version 3 only ("GPL") or the Common
+ Development and Distribution License("CDDL") (collectively, the
+ "License"). You may not use this file except in compliance with the
+ License. You can obtain a copy of the License at
+ http://gephi.org/about/legal/license-notice/
+ or /cddl-1.0.txt and /gpl-3.0.txt. See the License for the
+ specific language governing permissions and limitations under the
+ License. When distributing the software, include this License Header
+ Notice in each file and include the License files at
+ /cddl-1.0.txt and /gpl-3.0.txt. If applicable, add the following below the
+ License Header, with the fields enclosed by brackets [] replaced by
+ your own identifying information:
+ "Portions Copyrighted [year] [name of copyright owner]"
+
+ If you wish your version of this file to be governed by only the CDDL
+ or only the GPL Version 3, indicate your decision by adding
+ "[Contributor] elects to include this software in this distribution
+ under the [CDDL or GPL Version 3] license." If you do not indicate a
+ single choice of license, a recipient has the option to distribute
+ your version of this file under either the CDDL, the GPL Version 3 or
+ to extend the choice of license to its licensees as provided above.
+ However, if you add GPL Version 3 code and therefore, elected the GPL
+ Version 3 license, then the option applies only if the new code is
+ made subject to such option by the copyright holder.
+
+ Contributor(s):
+
+ Portions Copyrighted 2011 Gephi Consortium.
*/
package edu.uic.cs.compbio.DyNSPK;
import java.text.DecimalFormat;
import java.text.NumberFormat;
+import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import org.gephi.data.attributes.api.AttributeColumn;
@@ -66,14 +67,12 @@ Development and Distribution License("CDDL") (collectively, the
import org.jfree.data.xy.XYSeriesCollection;
import org.openide.util.Lookup;
-
/**
*
* @author Mathieu Bastian
*/
public class DynamicEntropy implements DynamicStatistics, LongTask {
-
//Data
private GraphModel graphModel;
private DynamicModel dynamicModel;
@@ -110,140 +109,172 @@ public void execute(GraphModel graphModel, AttributeModel attributeModel) {
this.isDirected = graphModel.isDirected();
this.dynamicModel = Lookup.getDefault().lookup(DynamicController.class).getModel(graphModel.getWorkspace());
-
+
}
- public String makeChart(Map<Double, Double> data, String filename){
- //Time series
- XYSeries dSeries = ChartUtils.createXYSeries(data, "Node Time Series");
+
+ public String makeChart(Map<Double, Double> data, String filename, String Title, String XAxis, String YAxis) {
+ //Time series
+
+
+ XYSeries dSeries = ChartUtils.createXYSeries(data, Title);
XYSeriesCollection dataset = new XYSeriesCollection();
dataset.addSeries(dSeries);
JFreeChart chart = ChartFactory.createXYLineChart(
- "Degree Time Series",
- "Count",
- "Count",
+ Title,
+ XAxis,
+ YAxis,
dataset,
- PlotOrientation.VERTICAL,
+ PlotOrientation.HORIZONTAL,
true,
false,
false);
chart.removeLegend();
ChartUtils.decorateChart(chart);
ChartUtils.scaleChart(chart, dSeries, false);
- String degreeImageFile = ChartUtils.renderChart(chart, filename);
+ String degreeImageFile = ChartUtils.renderChart(chart, filename);
return degreeImageFile;
}
+
public String getReport() {
NumberFormat f = new DecimalFormat("#0.000000");
- String report = "<HTML> <BODY> <h1>Dynamic Degree Report </h1> "
+ String report = "<HTML> <BODY> <h1>Dynamic Entropy Report </h1> "
+ "<hr>"
+ "<br> Bounds: from " + f.format(bounds.getLow()) + " to " + f.format(bounds.getHigh())
+ "<br> Window: " + window
+ "<br> Tick: " + tick
+ "<br><br><h2> Average degrees over time: </h2>"
- + "<br /><br />" + makeChart(this.nodedata, "nodets.png") + makeChart(this.edgedata, "edgets.png") + makeChart(this.sumdata, "sumts.png") ;
-/*
- * private Map<Double, Double> nodedata;
- private Map<Double, Double> edgedata;
- private Map<Double, Double> sumdata;
- */
- /*for (Interval<Double> average : averages) {
- report += average.toString(dynamicModel.getTimeFormat().equals(DynamicModel.TimeFormat.DOUBLE)) + "<br />";
- }*/
+ + "<br /><br />" + makeChart(this.nodedata, "nodets.png", "Node Entropy Time Series", " Time", "Node Changes" ) +
+ makeChart(this.edgedata, "edgets.png", "Edge Entropy Time Series", " Time" ,"Edge Changes" ) +
+ makeChart(this.sumdata, "sumts.png", "Entropy Time Series"," Time" , "Total Changes" );
+ /*
+ * private Map<Double, Double> nodedata; private Map<Double, Double>
+ * edgedata; private Map<Double, Double> sumdata;
+ */
+ /*
+ * for (Interval<Double> average : averages) { report +=
+ * average.toString(dynamicModel.getTimeFormat().equals(DynamicModel.TimeFormat.DOUBLE))
+ * + "<br />";
+ }
+ */
report += "<br /><br /></BODY></HTML>";
return report;
}
public void loop(GraphView window, Interval interval) {
+
+ //Time complexity of this algorithm is the cost of visiting each window twice and seeing if there is a change of edges or nodes.
HierarchicalGraph graph = graphModel.getHierarchicalGraph(window);
HierarchicalDirectedGraph directedGraph = null;
+ graph.readLock();
if (isDirected) {
directedGraph = graphModel.getHierarchicalDirectedGraph(window);
- if(this.first == 0){
- //Initialization. Since this is executed first we allow for the previous window to be accessed
- first++;
- previousedges = directedGraph.getEdges().toArray();
+ if (this.first == 0) {
+ //Initialization. Since this is executed first we allow for the previous window to be accessed
+ first++;
+ previousedges = directedGraph.getEdges().toArray();
+
+ previousnodes = directedGraph.getNodes().toArray();
+ edgedata.put(interval.getHigh(), 0.0);
+ nodedata.put(interval.getHigh(), 0.0);
+ } else if (this.first == 1) {
+
+ //Here we count the changes
+ double edgedelta = 0.0;
+
+ for (Edge prevedge : previousedges) {
+ if (!directedGraph.contains(prevedge)) {
+
+ edgedelta++;
+ }
+ for(Edge nextedge : directedGraph.getEdges())
+ if(!prevedge.equals(nextedge)){
+ edgedelta++;
+ }
- previousnodes = directedGraph.getNodes().toArray();
- edgedata.put(interval.getHigh(), 0.0);
- nodedata.put(interval.getHigh(), 0.0);
- }
- else if(this.first == 1){
-
- //Here we count the changes
- double edgedelta = 0.0;
-
- for (Edge prevedge : previousedges) {
- if(directedGraph.contains(prevedge)){
- edgedelta++;
}
-
- }
- edgedata.put(interval.getHigh(), edgedelta);
- double nodedelta = 0;
- for (Node prevnode : previousnodes) {
- if(directedGraph.contains(prevnode)){
- nodedelta++;
+
+
+ // edgedelta = edgedelta / Collections.max(edgedata.values());
+
+ edgedata.put(interval.getHigh(), edgedelta);
+ double nodedelta = 0;
+ for (Node prevnode : previousnodes) {
+ if (!directedGraph.contains(prevnode)) {
+ nodedelta++;
+ }
+ for(Node nextnode : directedGraph.getNodes())
+ if(!prevnode.equals(nextnode)){
+ edgedelta++;
+ }
+
+
}
-
- }
-
- nodedata.put(interval.getHigh(), nodedelta);
- Double sumdelta = nodedelta + edgedelta;
- sumdata.put(interval.getHigh(), sumdelta);
- //Now we mutate previous edge and node so we can compare it in the next window
- previousedges = directedGraph.getEdges().toArray();
- previousnodes = directedGraph.getNodes().toArray();
+
+ //nodedelta = nodedelta / Collections.max(edgedata.values());
+ nodedata.put(interval.getHigh(), nodedelta);
+ Double sumdelta = (nodedelta + edgedelta);
+ sumdata.put(interval.getHigh(), sumdelta);
+ //Now we mutate previous edge and node so we can compare it in the next window
+ previousedges = directedGraph.getEdges().toArray();
+ previousnodes = directedGraph.getNodes().toArray();
}
- }
- else {
- if(this.first == 0){
- //Initialization. Since this is executed first we allow for the previous window to be accessed
- first++;
- previousedges = graph.getEdges().toArray();
-
- previousnodes = graph.getNodes().toArray();
- edgedata.put(interval.getHigh(), 0.0);
- nodedata.put(interval.getHigh(), 0.0);
- }
- else if(this.first == 1){
-
- //Here we count the changes
- double edgedelta = 0.0;
-
- for (Edge prevedge : previousedges) {
- if(graph.contains(prevedge)){
- edgedelta++;
+ } else {
+ if (this.first == 0) {
+ //Initialization. Since this is executed first we allow for the previous window to be accessed
+ first++;
+ previousedges = graph.getEdges().toArray();
+
+ previousnodes = graph.getNodes().toArray();
+ edgedata.put(interval.getHigh(), 0.0);
+ nodedata.put(interval.getHigh(), 0.0);
+ } else if (this.first == 1) {
+
+ //Here we count the changes
+ double edgedelta = 0.0;
+
+ for (Edge prevedge : previousedges) {
+ if (!graph.contains(prevedge)) {
+ edgedelta++;
+ }
+ for(Edge nextedge : graph.getEdges())
+ if(!prevedge.equals(nextedge)){
+ edgedelta++;
+ }
+
}
-
- }
- edgedata.put(interval.getHigh(), edgedelta);
- double nodedelta = 0;
- for (Node prevnode : previousnodes) {
- if(graph.contains(prevnode)){
- nodedelta++;
+ edgedata.put(interval.getHigh(), edgedelta);
+ double nodedelta = 0;
+ for (Node prevnode : previousnodes) {
+ if (!graph.contains(prevnode)) {
+ nodedelta++;
+ }
+ for(Node nextnode : graph.getNodes())
+ if(!prevnode.equals(nextnode)){
+ edgedelta++;
+ }
+
+
+
}
-
- }
-
- nodedata.put(interval.getHigh(), nodedelta);
- Double sumdelta = nodedelta + edgedelta;
- sumdata.put(interval.getHigh(), sumdelta);
- //Now we mutate previous edge and node so we can compare it in the next window
- previousedges = graph.getEdges().toArray();
- previousnodes = graph.getNodes().toArray();
+
+ nodedata.put(interval.getHigh(), nodedelta);
+ Double sumdelta = nodedelta + edgedelta;
+ sumdata.put(interval.getHigh(), sumdelta);
+ //Now we mutate previous edge and node so we can compare it in the next window
+ previousedges = graph.getEdges().toArray();
+ previousnodes = graph.getNodes().toArray();
}
}
+ graph.readUnlockAll();
- long sum = 0;
-
-
}
+
public void end() {
}

0 comments on commit 7adad1b

Please sign in to comment.