From e76cd00e7a19db900d55f5e5ce394eb0571ddf80 Mon Sep 17 00:00:00 2001 From: JSiv Date: Tue, 25 Oct 2022 16:07:32 +0000 Subject: [PATCH 01/16] MultiViz plugin codes added --- modules/MultiVizPlugin/README.md | 4 + modules/MultiVizPlugin/pom.xml | 68 +++ .../java/algorithms/basic/CircleLayout.java | 96 +++++ .../java/algorithms/basic/GridLayout.java | 103 +++++ .../java/algorithms/basic/LinearLayout.java | 61 +++ .../java/algorithms/basic/RandomLayout.java | 86 ++++ .../algorithms/force/ForceAtlas2Layout.java | 380 +++++++++++++++++ .../algorithms/force/ForceAtlasLayout.java | 229 ++++++++++ .../force/FruchtermanReingoldLayout.java | 195 +++++++++ .../AbstractProjectionPropertyEditor.java | 87 ++++ .../java/helpers/CustomComboBoxEditor.java | 32 ++ .../java/helpers/LayoutAlgorithmProperty.java | 67 +++ .../main/java/helpers/LayoutDropDowns.java | 33 ++ .../src/main/java/helpers/Point.java | 39 ++ .../src/main/java/helpers/VizUtils.java | 128 ++++++ .../src/main/java/multiviz/MLVBuilder.java | 95 +++++ .../multiviz/MultiLayerVisualization.java | 392 ++++++++++++++++++ .../src/main/java/multiviz/Readme.java | 56 +++ .../MultiVizPlugin/src/main/nbm/manifest.mf | 5 + .../target/classes/META-INF/MANIFEST.MF | 16 + .../org.gephi.layout.spi.LayoutBuilder | 1 + .../algorithms/basic/CircleLayout.class | Bin 0 -> 3189 bytes .../classes/algorithms/basic/GridLayout.class | Bin 0 -> 3108 bytes .../algorithms/basic/LinearLayout.class | Bin 0 -> 2757 bytes .../algorithms/basic/RandomLayout.class | Bin 0 -> 2663 bytes .../algorithms/force/ForceAtlas2Layout.class | Bin 0 -> 14341 bytes .../algorithms/force/ForceAtlasLayout.class | Bin 0 -> 7152 bytes .../force/FruchtermanReingoldLayout.class | Bin 0 -> 8454 bytes .../AbstractProjectionPropertyEditor.class | Bin 0 -> 2015 bytes .../helpers/CustomComboBoxEditor.class | Bin 0 -> 1125 bytes .../helpers/LayoutAlgorithmProperty.class | Bin 0 -> 1476 bytes .../classes/helpers/LayoutDropDowns.class | Bin 0 -> 305 bytes .../target/classes/helpers/Point.class | Bin 0 -> 1398 bytes .../target/classes/helpers/VizUtils.class | Bin 0 -> 9252 bytes .../classes/multiviz/MLVBuilder$1.class | Bin 0 -> 1089 bytes .../target/classes/multiviz/MLVBuilder.class | Bin 0 -> 822 bytes .../multiviz/MultiLayerVisualization.class | Bin 0 -> 17629 bytes .../target/classes/multiviz/Readme.class | Bin 0 -> 261 bytes .../target/maven-archiver/pom.properties | 3 + .../compile/default-compile/createdFiles.lst | 18 + .../compile/default-compile/inputFiles.lst | 16 + .../default-testCompile/createdFiles.lst | 0 .../default-testCompile/inputFiles.lst | 0 .../MultiVizPlugin/target/multiviz-1.0.0.jar | Bin 0 -> 40873 bytes .../MultiVizPlugin/target/multiviz-1.0.0.nbm | Bin 0 -> 40296 bytes .../target/nbm/multiviz-1.0.0.nbm | Bin 0 -> 40296 bytes .../config/Modules/amrita-multiviz.xml | 10 + .../plugins/modules/amrita-multiviz.jar | Bin 0 -> 40873 bytes .../update_tracking/amrita-multiviz.xml | 6 + pom.xml | 4 +- 50 files changed, 2228 insertions(+), 2 deletions(-) create mode 100644 modules/MultiVizPlugin/README.md create mode 100644 modules/MultiVizPlugin/pom.xml create mode 100644 modules/MultiVizPlugin/src/main/java/algorithms/basic/CircleLayout.java create mode 100644 modules/MultiVizPlugin/src/main/java/algorithms/basic/GridLayout.java create mode 100644 modules/MultiVizPlugin/src/main/java/algorithms/basic/LinearLayout.java create mode 100644 modules/MultiVizPlugin/src/main/java/algorithms/basic/RandomLayout.java create mode 100644 modules/MultiVizPlugin/src/main/java/algorithms/force/ForceAtlas2Layout.java create mode 100644 modules/MultiVizPlugin/src/main/java/algorithms/force/ForceAtlasLayout.java create mode 100644 modules/MultiVizPlugin/src/main/java/algorithms/force/FruchtermanReingoldLayout.java create mode 100644 modules/MultiVizPlugin/src/main/java/helpers/AbstractProjectionPropertyEditor.java create mode 100644 modules/MultiVizPlugin/src/main/java/helpers/CustomComboBoxEditor.java create mode 100644 modules/MultiVizPlugin/src/main/java/helpers/LayoutAlgorithmProperty.java create mode 100644 modules/MultiVizPlugin/src/main/java/helpers/LayoutDropDowns.java create mode 100644 modules/MultiVizPlugin/src/main/java/helpers/Point.java create mode 100644 modules/MultiVizPlugin/src/main/java/helpers/VizUtils.java create mode 100644 modules/MultiVizPlugin/src/main/java/multiviz/MLVBuilder.java create mode 100644 modules/MultiVizPlugin/src/main/java/multiviz/MultiLayerVisualization.java create mode 100644 modules/MultiVizPlugin/src/main/java/multiviz/Readme.java create mode 100644 modules/MultiVizPlugin/src/main/nbm/manifest.mf create mode 100644 modules/MultiVizPlugin/target/classes/META-INF/MANIFEST.MF create mode 100644 modules/MultiVizPlugin/target/classes/META-INF/services/org.gephi.layout.spi.LayoutBuilder create mode 100644 modules/MultiVizPlugin/target/classes/algorithms/basic/CircleLayout.class create mode 100644 modules/MultiVizPlugin/target/classes/algorithms/basic/GridLayout.class create mode 100644 modules/MultiVizPlugin/target/classes/algorithms/basic/LinearLayout.class create mode 100644 modules/MultiVizPlugin/target/classes/algorithms/basic/RandomLayout.class create mode 100644 modules/MultiVizPlugin/target/classes/algorithms/force/ForceAtlas2Layout.class create mode 100644 modules/MultiVizPlugin/target/classes/algorithms/force/ForceAtlasLayout.class create mode 100644 modules/MultiVizPlugin/target/classes/algorithms/force/FruchtermanReingoldLayout.class create mode 100644 modules/MultiVizPlugin/target/classes/helpers/AbstractProjectionPropertyEditor.class create mode 100644 modules/MultiVizPlugin/target/classes/helpers/CustomComboBoxEditor.class create mode 100644 modules/MultiVizPlugin/target/classes/helpers/LayoutAlgorithmProperty.class create mode 100644 modules/MultiVizPlugin/target/classes/helpers/LayoutDropDowns.class create mode 100644 modules/MultiVizPlugin/target/classes/helpers/Point.class create mode 100644 modules/MultiVizPlugin/target/classes/helpers/VizUtils.class create mode 100644 modules/MultiVizPlugin/target/classes/multiviz/MLVBuilder$1.class create mode 100644 modules/MultiVizPlugin/target/classes/multiviz/MLVBuilder.class create mode 100644 modules/MultiVizPlugin/target/classes/multiviz/MultiLayerVisualization.class create mode 100644 modules/MultiVizPlugin/target/classes/multiviz/Readme.class create mode 100644 modules/MultiVizPlugin/target/maven-archiver/pom.properties create mode 100644 modules/MultiVizPlugin/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst create mode 100644 modules/MultiVizPlugin/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst create mode 100644 modules/MultiVizPlugin/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst create mode 100644 modules/MultiVizPlugin/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst create mode 100644 modules/MultiVizPlugin/target/multiviz-1.0.0.jar create mode 100644 modules/MultiVizPlugin/target/multiviz-1.0.0.nbm create mode 100644 modules/MultiVizPlugin/target/nbm/multiviz-1.0.0.nbm create mode 100644 modules/MultiVizPlugin/target/nbm/netbeans/plugins/config/Modules/amrita-multiviz.xml create mode 100644 modules/MultiVizPlugin/target/nbm/netbeans/plugins/modules/amrita-multiviz.jar create mode 100644 modules/MultiVizPlugin/target/nbm/netbeans/plugins/update_tracking/amrita-multiviz.xml diff --git a/modules/MultiVizPlugin/README.md b/modules/MultiVizPlugin/README.md new file mode 100644 index 0000000000..f935d66cd5 --- /dev/null +++ b/modules/MultiVizPlugin/README.md @@ -0,0 +1,4 @@ +## MultiVizPlugin + +This README supports Markdown, see [syntax](https://help.github.com/articles/markdown-basics/) + diff --git a/modules/MultiVizPlugin/pom.xml b/modules/MultiVizPlugin/pom.xml new file mode 100644 index 0000000000..ca9d426d3b --- /dev/null +++ b/modules/MultiVizPlugin/pom.xml @@ -0,0 +1,68 @@ + + + 4.0.0 + + gephi-plugin-parent + org.gephi + 0.9.3 + + + amrita + multiviz + 1.0.0 + nbm + + MultiVizPlugin + + + + + org.gephi + layout-api + jar + + + org.gephi + graph-api + + + org.gephi + layout-plugin + jar + + + org.gephi + ui-utils + + + + + + + org.apache.netbeans.utilities + nbm-maven-plugin + + MIT + J + amenp2cse20006@am.students.amrita.edu + + + + + + + + + + + + + oss-sonatype + oss-sonatype + https://oss.sonatype.org/content/repositories/snapshots/ + + true + + + + \ No newline at end of file diff --git a/modules/MultiVizPlugin/src/main/java/algorithms/basic/CircleLayout.java b/modules/MultiVizPlugin/src/main/java/algorithms/basic/CircleLayout.java new file mode 100644 index 0000000000..b664c72949 --- /dev/null +++ b/modules/MultiVizPlugin/src/main/java/algorithms/basic/CircleLayout.java @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2010, Matt Groeninger + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + */ + +package algorithms.basic; + +import java.util.HashMap; +import java.util.List; +import helpers.VizUtils; +import org.gephi.graph.api.Node; + +/** + * + * @author J + */ +public class CircleLayout { + + private HashMap> layers; + private String initialLayer; + private Node initialNode; + private int layerDistance; + + public CircleLayout(int layerDistance, HashMap> layers, String initialLayer, Node initialNode, boolean sortLayers) { + this.initialLayer = initialLayer; + this.initialNode = initialNode; + if(sortLayers){ + this.layers = VizUtils.sortedLayers(layers); + } else this.layers = layers; + this.layerDistance = layerDistance; + } + + public void start() { + String previousLayer = initialLayer; + for (String currentLayer : layers.keySet()) { + float y = initialNode.y(); + if (!previousLayer.equals(currentLayer)) { + y = VizUtils.getLayerPlacement(layers, previousLayer, layerDistance); + } + List nodes = layers.get(currentLayer); + if (nodes.size() == 1) { + nodes.get(0).setX(initialNode.x()); + nodes.get(0).setY(y); + nodes.get(0).setZ(initialNode.z()); + } else { + double circumference = 0; + for (Node node : nodes) { + circumference += (node.size() * 2) + node.getTextProperties().getWidth(); + } + circumference = circumference * 1.2f; + + double diameter = circumference / Math.PI; + double theta = (2 * Math.PI) / circumference; + + double tempTheta = 0; + double nodeSize = 0; + + for (Node node : nodes) { + if (!node.isFixed()) { + nodeSize = node.size() + node.getTextProperties().getWidth() / 2; + double arc = nodeSize * 1.2f * theta; + float dx = (float) (diameter * (Math.cos((tempTheta + arc) + (Math.PI / 2)))); + float dy = (float) (diameter * (Math.sin((tempTheta + arc) + (Math.PI / 2)))); + tempTheta += nodeSize * 2 * theta * 1.2f; + node.setX(initialNode.x() + dx); + node.setY(y + dy); + node.setZ(initialNode.z()); + } + } + } + previousLayer = currentLayer; + } + } +} \ No newline at end of file diff --git a/modules/MultiVizPlugin/src/main/java/algorithms/basic/GridLayout.java b/modules/MultiVizPlugin/src/main/java/algorithms/basic/GridLayout.java new file mode 100644 index 0000000000..c30ae55d9f --- /dev/null +++ b/modules/MultiVizPlugin/src/main/java/algorithms/basic/GridLayout.java @@ -0,0 +1,103 @@ +/* +Copyright 2008-2011 Gephi +Authors : Mathieu Bastian +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 algorithms.basic; + +import java.util.HashMap; +import java.util.List; +import helpers.VizUtils; +import org.gephi.graph.api.Node; + +/** + * + * @author J + */ +public class GridLayout { + + private int layerDistance; + private HashMap> layers; + private String initialLayer; + private Node initialNode; + private boolean sortLayers; + + public GridLayout(int layerDistance, HashMap> layers, String initialLayer, Node initialNode, boolean sortLayers) { + this.layerDistance = layerDistance; + this.initialLayer = initialLayer; + this.initialNode = initialNode; + this.sortLayers = sortLayers; + if(this.sortLayers) { + this.layers = VizUtils.sortedLayers(layers); + } else this.layers = layers; + } + + public void start(){ + String previousLayer = initialLayer; + for (String currentLayer : layers.keySet()) { + Node biggestNode = VizUtils.getBiggestNode(layers, currentLayer); + float y = initialNode.y(); + + if(!previousLayer.equals(currentLayer)){ + y = VizUtils.getLayerPlacement(layers, previousLayer, layerDistance); + } + + int rows = (int) Math.round(Math.sqrt(layers.get(currentLayer).size())) + 1; + int cols = (int) Math.round(Math.sqrt(layers.get(currentLayer).size())) + 1; + double layerSize = VizUtils.getLayerSize(layers, biggestNode, currentLayer) * 1.2f; + + for (int i = 0; i < rows; i++) { + for (int j = 0; j < cols && (i * rows + j) < layers.get(currentLayer).size(); j++) { + + Node node = layers.get(currentLayer).get(i * rows + j); + + double nx = (-layerSize / 2f) + ((float) j / cols) * layerSize; + double ny = (layerSize / 2f) - ((float) i / rows) * layerSize; + + double tx = nx; + double ty = (y + (y + (ny - y))); + + if (i == 0 && j == 0) { + tx = ((initialNode.x() + (nx - initialNode.x())) + (0)); + } else { + tx = ((initialNode.x() + (nx - initialNode.x())) + (10 * j)); + } + node.setX((float) tx); + node.setY((float) ty); + node.setZ(initialNode.z()); + } + } + previousLayer = currentLayer; + } + } + +} diff --git a/modules/MultiVizPlugin/src/main/java/algorithms/basic/LinearLayout.java b/modules/MultiVizPlugin/src/main/java/algorithms/basic/LinearLayout.java new file mode 100644 index 0000000000..31cf368569 --- /dev/null +++ b/modules/MultiVizPlugin/src/main/java/algorithms/basic/LinearLayout.java @@ -0,0 +1,61 @@ + +package algorithms.basic; + +import java.util.HashMap; +import java.util.List; +import helpers.VizUtils; +import org.gephi.graph.api.Node; + +/** + * + * @author J + */ +public class LinearLayout { + + private HashMap> layers; + private String initialLayer; + private Node initialNode; + private boolean sortLayers; + private int layerDistance; + + public LinearLayout(int layerDistance, HashMap> layers, String initialLayer, Node initialNode, boolean sortLayers) { + this.initialLayer = initialLayer ; + this.initialNode = initialNode ; + this.sortLayers = sortLayers; + this.layers = layers ; + if(this.sortLayers){ + this.layers = VizUtils.sortedLayers(layers); + } + } + + public void start() { + String previousLayer = initialLayer; + for (String currentLayer : layers.keySet()) { + Node biggestNode = VizUtils.getBiggestNode(layers, currentLayer); + + float y = initialNode.y(); + + if(!previousLayer.equals(currentLayer)){ + y = VizUtils.getLayerPlacement(layers, previousLayer, layerDistance); + } + + double distance = 0; + int index = 0; + for (Node node : layers.get(currentLayer)) { + if(index == 0) { + node.setX(initialNode.x()); + node.setY(y); + } else { + distance += (node.size() * 2) + (node.getTextProperties().getWidth() + 20); + double randomY = Math.random() * ((biggestNode.size() + biggestNode.getTextProperties().getSize()) - 1 + 1) + 1; + + node.setX(initialNode.x() + (float)distance); + node.setY(y + (float)randomY); + } + node.setZ(initialNode.z()); + index++; + } + previousLayer = currentLayer; + } + } +} \ No newline at end of file diff --git a/modules/MultiVizPlugin/src/main/java/algorithms/basic/RandomLayout.java b/modules/MultiVizPlugin/src/main/java/algorithms/basic/RandomLayout.java new file mode 100644 index 0000000000..41e7ea042c --- /dev/null +++ b/modules/MultiVizPlugin/src/main/java/algorithms/basic/RandomLayout.java @@ -0,0 +1,86 @@ +/* + Copyright 2008-2010 Gephi + Authors : Helder Suzuki + 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 algorithms.basic; + +import java.util.HashMap; +import java.util.List; +import java.util.Random; +import helpers.VizUtils; +import org.gephi.graph.api.Node; + +/** + * + * @author J + */ +public class RandomLayout { + + private int layerDistance; + private HashMap> layers; + private String initialLayer; + private Node initialNode; + private boolean sortLayers; + + public RandomLayout(int layerDistance, HashMap> layers, String initialLayer, Node initialNode, boolean sortLayers) { + this.layerDistance = layerDistance; + this.initialLayer = initialLayer; + this.initialNode = initialNode; + this.sortLayers = sortLayers; + if(this.sortLayers) { + this.layers = VizUtils.sortedLayers(layers); + } else this.layers = layers; + } + + public void start() { + String previousLayer = initialLayer; + for (String currentLayer : layers.keySet()) { + float y = initialNode.y(); + if(!previousLayer.equals(currentLayer)){ + y = VizUtils.getLayerPlacement(layers, previousLayer, layerDistance); + } + Node biggestNode = VizUtils.getBiggestNode(layers, currentLayer); + float layerSize = VizUtils.getLayerSize(layers, biggestNode, currentLayer); + + for (Node node : layers.get(currentLayer)) { + double dx = initialNode.x() + node.size() + (float) (-layerSize / 2 + layerSize * new Random().nextDouble()); + double ly = (y + layerSize / 2) + (float) (-layerSize / 2 + layerSize * new Random().nextDouble()) + node.size(); + node.setX((float) dx); + node.setY((float) ly); + node.setZ(initialNode.y()); + } + previousLayer = currentLayer; + } + } +} diff --git a/modules/MultiVizPlugin/src/main/java/algorithms/force/ForceAtlas2Layout.java b/modules/MultiVizPlugin/src/main/java/algorithms/force/ForceAtlas2Layout.java new file mode 100644 index 0000000000..c2be32b819 --- /dev/null +++ b/modules/MultiVizPlugin/src/main/java/algorithms/force/ForceAtlas2Layout.java @@ -0,0 +1,380 @@ +/* + Copyright 2008-2011 Gephi + Authors : Mathieu Jacomy + 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 algorithms.force; + +import helpers.Point; +import java.util.HashMap; +import java.util.List; +import helpers.VizUtils; +import java.util.ArrayList; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; +import multiviz.MLVBuilder; +import org.gephi.graph.api.Edge; +import org.gephi.graph.api.Graph; +import org.gephi.graph.api.GraphModel; +import org.gephi.graph.api.Interval; +import org.gephi.graph.api.Node; +import org.gephi.layout.plugin.forceAtlas2.ForceAtlas2; +import org.gephi.layout.plugin.forceAtlas2.ForceAtlas2Builder; +import org.gephi.layout.plugin.forceAtlas2.ForceAtlas2LayoutData; +import org.gephi.layout.plugin.forceAtlas2.ForceFactory; +import org.gephi.layout.plugin.forceAtlas2.ForceFactory.RepulsionForce; +import org.gephi.layout.plugin.forceAtlas2.NodesThread; +import org.gephi.layout.plugin.forceAtlas2.Region; +import org.gephi.layout.spi.LayoutBuilder; + +/** + * + * @author J + */ +public class ForceAtlas2Layout { + + private final int layerDistance; + private final HashMap> layers; + private final String initialLayer; + private final Node initialNode; + private float speed; + private final double gravity; + private final boolean splitAsLevel; + private final boolean sortLayers; + + private double outboundAttCompensation; + private final double edgeWeightInfluence; + private final double jitterTolerance; + private double scalingRatio; + private double speedEfficiency; + private final boolean isOutboundAttractionDistribution; + private final boolean isAdjustSizes; + private boolean barnesHutOptimize; + private final double barnesHutTheta; + private final boolean linLogMode; + private final boolean normalizeEdgeWeights; + private final boolean strongGravityMode; + private int threadCount; + + private final int iterations; + private final int size; + boolean dynamicWeight; + private final List allNodes; + private final List allEdges; + Graph graph; + Interval timeInterval; + GraphModel graphModel; + + public ForceAtlas2Layout(int layerDistance, HashMap> layers, String initialLayer, Node initialNode, boolean splitAsLevel, boolean sortLayers, int noOfIterations, double area, float speed, double gravity, boolean isDynamicWeight, Interval interval, List nodes, List edges, Graph graph, GraphModel graphModel) { + this.strongGravityMode = false; + this.normalizeEdgeWeights = false; + this.linLogMode = false; + this.barnesHutTheta = 1.2; + this.barnesHutOptimize = false; + this.isAdjustSizes = true; + this.isOutboundAttractionDistribution = false; + this.speedEfficiency = 1.; + this.jitterTolerance = 1d; + this.edgeWeightInfluence = 1.; + this.outboundAttCompensation = 1; + this.layerDistance = layerDistance; + this.initialLayer = initialLayer; + this.initialNode = initialNode; + this.splitAsLevel = splitAsLevel; + this.sortLayers = sortLayers; + if (this.sortLayers) { + this.layers = VizUtils.sortedLayers(layers); + } else { + this.layers = layers; + } + this.speed = speed; + this.gravity = gravity; + this.iterations = noOfIterations; + this.size = nodes.size(); + this.dynamicWeight = isDynamicWeight; + this.graph = graph; + this.allNodes = nodes; + this.allEdges = edges; + this.timeInterval = interval; + this.barnesHutOptimize = size >= 1000; + this.threadCount = Math.min(4, Math.max(1, Runtime.getRuntime().availableProcessors() - 1)); + this.graphModel = graphModel; + } + + public void start() { + threadCount = (Math.max(1, Runtime.getRuntime().availableProcessors() - 1)); + + for (int i = 0; i < iterations; i++) { + if (splitAsLevel) { + if (size >= 100) { + scalingRatio = 2.0; + } else { + scalingRatio = 10.0; + } + runAlgorithm(allNodes, allEdges, null); + } else { + int counter = 0; + for (String layer : layers.keySet()) { + List nodes = layers.get(layer); + List edges = VizUtils.getLayerEdges(allEdges, nodes); + Point ghostLayer = new Point(initialNode.x(), initialNode.y() + layerDistance * counter); + barnesHutOptimize = nodes.size() >= 1000; + if (nodes.size() >= 100) { + scalingRatio = 2.0; + } else { + scalingRatio = 10.0; + } + runAlgorithm(nodes, edges, ghostLayer); +// ForceAtlas2 forceAtlas2Layout = new ForceAtlas2(new ForceAtlas2Builder()); +// forceAtlas2Layout.setAdjustSizes(true); +// forceAtlas2Layout.setGraphModel(graphModel); +// forceAtlas2Layout.setGravity(gravity); +// forceAtlas2Layout.goAlgo(); + counter++;} + } + } + VizUtils.initiateLayerSplitter(layers, initialLayer, initialNode, splitAsLevel, layerDistance); + } + + private void runAlgorithm(List nodes, List edges, Point ghost) { + Region rootRegion = null; + int currentThreadCount; + ExecutorService pool; + + for (Node node : nodes) { + if (node.getLayoutData() == null || !(node.getLayoutData() instanceof ForceAtlas2LayoutData)) { + ForceAtlas2LayoutData nLayout = new ForceAtlas2LayoutData(); + node.setLayoutData(nLayout); + } + org.gephi.layout.plugin.forceAtlas2.ForceAtlas2LayoutData nLayout = node.getLayoutData(); + nLayout.mass = 1 + graph.getDegree(node); + nLayout.old_dx = 0; + nLayout.old_dy = 0; + nLayout.dx = 0; + nLayout.dy = 0; + } + + pool = Executors.newFixedThreadPool(threadCount); + currentThreadCount = threadCount; + + /** + * If Barnes Hut active, initialize root region* + */ + Node[] nodes_arr = nodes.toArray(Node[]::new); + if (barnesHutOptimize) { + rootRegion = new Region(nodes_arr); + rootRegion.buildSubRegions(); + } + + /** + * If outboundAttractionDistribution active, compensate.* + */ + if (isOutboundAttractionDistribution) { + outboundAttCompensation = 0; + for (Node n : nodes) { + ForceAtlas2LayoutData nLayout = n.getLayoutData(); + outboundAttCompensation += nLayout.mass; + } + outboundAttCompensation /= nodes.size(); + } + + /** + * Repulsion (and gravity)Multi-threaded* + */ + RepulsionForce Repulsion = ForceFactory.builder.buildRepulsion(isAdjustSizes, scalingRatio); + int taskCount = 8 * currentThreadCount; + // The threadPool Executor Service will manage the fetching of tasks and threads. + + // We make more tasks than threads because some tasks may need more time to compute. + ArrayList threads = new ArrayList<>(); + + for (int t = taskCount; t > 0; t--) { + int from = (int) Math.floor(nodes.size() * (t - 1) / taskCount); + int to = (int) Math.floor(nodes.size() * t / taskCount); + java.util.concurrent.Future future = pool.submit(new NodesThread(nodes_arr, from, to, barnesHutOptimize, barnesHutTheta, gravity, (strongGravityMode) ? (ForceFactory.builder.getStrongGravity(scalingRatio)) : (Repulsion), scalingRatio, rootRegion, Repulsion)); + threads.add(future); + } + + threads.forEach(future -> { + try { + future.get(); + } catch (InterruptedException | ExecutionException e) { + throw new RuntimeException("Unable to layout " + this.getClass().getSimpleName() + ".", e); + } + }); + + // Attraction + ForceFactory.AttractionForce Attraction = ForceFactory.builder.buildAttraction(linLogMode, isOutboundAttractionDistribution, isAdjustSizes, 1 * ((isOutboundAttractionDistribution) ? (outboundAttCompensation) : (1))); + if (edgeWeightInfluence == 0) { + for (Edge e : edges) { + Attraction.apply(e.getSource(), e.getTarget(), 1); + } + } else if (edgeWeightInfluence == 1) { + if (normalizeEdgeWeights) { + Double w; + Double edgeWeightMin = Double.MAX_VALUE; + Double edgeWeightMax = Double.MIN_VALUE; + for (Edge e : edges) { + w = VizUtils.getEdgeWeight(e, dynamicWeight, timeInterval); + edgeWeightMin = Math.min(w, edgeWeightMin); + edgeWeightMax = Math.max(w, edgeWeightMax); + } + if (edgeWeightMin < edgeWeightMax) { + for (Edge e : edges) { + w = (VizUtils.getEdgeWeight(e, dynamicWeight, timeInterval) - edgeWeightMin) / (edgeWeightMax - edgeWeightMin); + Attraction.apply(e.getSource(), e.getTarget(), w); + } + } else { + for (Edge e : edges) { + Attraction.apply(e.getSource(), e.getTarget(), 1.); + } + } + } else { + for (Edge e : edges) { + Attraction.apply(e.getSource(), e.getTarget(), VizUtils.getEdgeWeight(e, dynamicWeight, timeInterval)); + } + } + } else { + if (normalizeEdgeWeights) { + Double w; + Double edgeWeightMin = Double.MAX_VALUE; + Double edgeWeightMax = Double.MIN_VALUE; + for (Edge e : edges) { + w = VizUtils.getEdgeWeight(e, dynamicWeight, timeInterval); + edgeWeightMin = Math.min(w, edgeWeightMin); + edgeWeightMax = Math.max(w, edgeWeightMax); + } + if (edgeWeightMin < edgeWeightMax) { + for (Edge e : edges) { + w = (VizUtils.getEdgeWeight(e, dynamicWeight, timeInterval) - edgeWeightMin) / (edgeWeightMax - edgeWeightMin); + Attraction.apply(e.getSource(), e.getTarget(), Math.pow(w, edgeWeightInfluence)); + } + } else { + edges.forEach(e -> { + Attraction.apply(e.getSource(), e.getTarget(), 1.); + }); + } + } else { + edges.forEach(e -> { + Attraction.apply(e.getSource(), e.getTarget(), Math.pow(VizUtils.getEdgeWeight(e, dynamicWeight, timeInterval), edgeWeightInfluence)); + }); + } + } + + double totalSwinging = 0d; // How much irregular movement + double totalEffectiveTraction = 0d; // Hom much useful movement + for (Node n : nodes) { + ForceAtlas2LayoutData nLayout = n.getLayoutData(); + if (!n.isFixed()) { + double swinging = Math.sqrt(Math.pow(nLayout.old_dx - nLayout.dx, 2) + Math.pow(nLayout.old_dy - nLayout.dy, 2)); + totalSwinging += nLayout.mass * swinging; // If the node has a burst change of direction, then it's not converging. + totalEffectiveTraction += nLayout.mass * 0.5 * Math.sqrt(Math.pow(nLayout.old_dx + nLayout.dx, 2) + Math.pow(nLayout.old_dy + nLayout.dy, 2)); + } + } + + // We want that swingingMovement < tolerance * convergenceMovement + // Optimize jitter tolerance + // The 'right' jitter tolerance for this network. Bigger networks need more tolerance. Denser networks need less tolerance. Totally empiric. + double estimatedOptimalJitterTolerance = 0.05 * Math.sqrt(nodes.size()); + double minJT = Math.sqrt(estimatedOptimalJitterTolerance); + double maxJT = 10; + double jt = jitterTolerance * Math.max(minJT, Math.min(maxJT, estimatedOptimalJitterTolerance * totalEffectiveTraction / Math.pow(nodes.size(), 2))); + + double minSpeedEfficiency = 0.05; + + // Protection against erratic behavior + if (totalSwinging / totalEffectiveTraction > 2.0) { + if (speedEfficiency > minSpeedEfficiency) { + speedEfficiency *= 0.5; + } + jt = Math.max(jt, jitterTolerance); + } + double targetSpeed = jt * speedEfficiency * totalEffectiveTraction / totalSwinging; + + // Speed efficiency is how the speed really corresponds to the swinging vs. convergence tradeoff + // We adjust it slowly and carefully + if (totalSwinging > jt * totalEffectiveTraction) { + if (speedEfficiency > minSpeedEfficiency) { + speedEfficiency *= 0.7; + } + } else if (speed < 1000) { + speedEfficiency *= 1.3; + } + + // But the speed shoudn't rise too much too quickly, since it would make the convergence drop dramatically. + double maxRise = 0.5; // Max rise: 50% + speed = (float) (speed + Math.min(targetSpeed - speed, maxRise * speed)); + + if (isAdjustSizes) { + // If nodes overlap prevention is active, it's not possible to trust the swinging mesure. + for (Node n : nodes) { + org.gephi.layout.plugin.forceAtlas2.ForceAtlas2LayoutData nLayout = n.getLayoutData(); + if (!n.isFixed()) { + + // Adaptive auto-speed: the speed of each node is lowered + // when the node swings. + double swinging = nLayout.mass * Math.sqrt( + (nLayout.old_dx - nLayout.dx) * (nLayout.old_dx - nLayout.dx) + + (nLayout.old_dy - nLayout.dy) * (nLayout.old_dy - nLayout.dy)); + double factor = 0.1 * speed / (1f + Math.sqrt(speed * swinging)); + + double df = Math.sqrt(Math.pow(nLayout.dx, 2) + Math.pow(nLayout.dy, 2)); + factor = Math.min(factor * df, 10.) / df; + + double x = n.x() + nLayout.dx * factor; + double y = n.y() + nLayout.dy * factor; + + n.setX((float) x); + n.setY((float) y); + } + } + } else { + nodes.forEach(n -> { + org.gephi.layout.plugin.forceAtlas2.ForceAtlas2LayoutData nLayout = n.getLayoutData(); + if (!n.isFixed()) { + // Adaptive auto-speed: the speed of each node is lowered + // when the node swings. + double swinging = nLayout.mass * Math.sqrt((nLayout.old_dx - nLayout.dx) * (nLayout.old_dx - nLayout.dx) + (nLayout.old_dy - nLayout.dy) * (nLayout.old_dy - nLayout.dy)); + double factor = speed / (1f + Math.sqrt(speed * swinging)); + + double x = n.x() + nLayout.dx * factor; + double y = n.y() + nLayout.dy * factor; + + n.setX((float) x); + n.setY((float) y); + } + }); + } + } +} \ No newline at end of file diff --git a/modules/MultiVizPlugin/src/main/java/algorithms/force/ForceAtlasLayout.java b/modules/MultiVizPlugin/src/main/java/algorithms/force/ForceAtlasLayout.java new file mode 100644 index 0000000000..26b2f6e3b9 --- /dev/null +++ b/modules/MultiVizPlugin/src/main/java/algorithms/force/ForceAtlasLayout.java @@ -0,0 +1,229 @@ +/* + Copyright 2008-2010 Gephi + Authors : Helder Suzuki + 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 algorithms.force; + +import helpers.Point; +import java.util.HashMap; +import java.util.List; +import helpers.VizUtils; +import org.gephi.graph.api.Edge; +import org.gephi.graph.api.Graph; +import org.gephi.graph.api.Interval; +import org.gephi.graph.api.Node; +import org.gephi.layout.plugin.ForceVectorNodeLayoutData; +import org.gephi.layout.plugin.ForceVectorUtils; + +/** + * + * @author J + */ +public class ForceAtlasLayout { + + private int layerDistance; + private HashMap> layers; + private String initialLayer; + private Node initialNode; + private boolean sortLayers; + private boolean splitAsLevel; + + public double inertia; + private double repulsionStrength; + private double attractionStrength; + private double maxDisplacement; + private boolean freezeBalance; + private double freezeStrength; + private double freezeInertia; + private double gravity; + private double speed; + private double cooling; + private boolean outboundAttractionDistribution; + private boolean isDynamicWeight; + private Interval timeInterval; + private List allNodes; + private List allEdges; + private Graph graph; + private int iterations; + + public ForceAtlasLayout(int layerDistance, HashMap> layers, String initialLayer, Node initialNode, boolean sortLayers, boolean splitAsLevel, double gravity, float speed, boolean isDynamicWeight, Interval interval, List nodes, List edges, Graph graph, int iterationnos) { + this.layerDistance = layerDistance; + this.initialLayer = initialLayer; + this.initialNode = initialNode; + this.sortLayers = sortLayers; + this.splitAsLevel = splitAsLevel; + if (this.sortLayers) { + this.layers = VizUtils.sortedLayers(layers); + } else { + this.layers = layers; + } + this.isDynamicWeight = isDynamicWeight; + this.timeInterval = interval; + this.iterations = iterationnos; + this.gravity = gravity; + this.speed = speed; + + this.inertia = 0.1; + this.repulsionStrength = 200d; + this.attractionStrength = 10d; + this.maxDisplacement = 10d; + + this.freezeBalance = true; + this.freezeStrength = 80d; + + //gravity = 30d; + //speed = 1d; + this.cooling = 1d; + + this.graph = graph; + this.outboundAttractionDistribution = false; + this.allNodes = nodes; + this.allEdges = edges; + } + + public void start() { + try { + for (int i = 0; i < iterations; i++) { + if (splitAsLevel) { + runAlgorithm(allNodes, allEdges, null); + } else { + int counter = 0; + for (String currentLayer : layers.keySet()) { + Point ghostPoint = new Point(initialNode.x(), initialNode.y() + (layerDistance * counter * 2)); + List nodes = layers.get(currentLayer); + List edges = VizUtils.getLayerEdges(layers, allEdges, nodes); + runAlgorithm(nodes, edges, ghostPoint); + counter++; + } + + } + } + } catch (Exception e) { + e.printStackTrace(); + } + VizUtils.initiateLayerSplitter(layers, initialLayer, initialNode, splitAsLevel, layerDistance); + } + + private void runAlgorithm(List nodes, List edges, Point ghostPoint) { + for (Node n : nodes) { + if (n.getLayoutData() == null || !(n.getLayoutData() instanceof ForceVectorNodeLayoutData)) { + n.setLayoutData(new ForceVectorNodeLayoutData()); + } + + ForceVectorNodeLayoutData layoutData = n.getLayoutData(); + layoutData.old_dx = layoutData.dx; + layoutData.old_dy = layoutData.dy; + layoutData.dx *= inertia; + layoutData.dy *= inertia; + } + // repulsion + for (Node n1 : nodes) { + for (Node n2 : nodes) { + if (n1 != n2) { + ForceVectorUtils.fcBiRepulsor_noCollide(n1, n2, repulsionStrength * (1 + graph.getDegree(n1)) * (1 + graph.getDegree(n2))); + } + } + } + // attraction + if (outboundAttractionDistribution) { + for (Edge e : edges) { + Node nf = e.getSource(); + Node nt = e.getTarget(); + double bonus = (nf.isFixed() || nt.isFixed()) ? (100) : (1); + bonus *= VizUtils.getEdgeWeight(e, isDynamicWeight, timeInterval); + ForceVectorUtils.fcBiAttractor_noCollide(nf, nt, + bonus * attractionStrength / (1 + graph.getDegree(nf))); + } + } else { + for (Edge e : edges) { + Node nf = e.getSource(); + Node nt = e.getTarget(); + double bonus = (nf.isFixed() || nt.isFixed()) ? (100) : (1); + bonus *= VizUtils.getEdgeWeight(e, isDynamicWeight, timeInterval); + ForceVectorUtils.fcBiAttractor_noCollide(nf, nt, bonus * attractionStrength); + } + } + + // gravity + for (Node n : nodes) { + float nx = n.x(); + float ny = n.y(); + double d = 0.0001 + Math.sqrt(nx * nx + ny * ny); + double gf = 0.0001 * gravity * d; + ForceVectorNodeLayoutData layoutData = n.getLayoutData(); + layoutData.dx -= gf * nx / d; + layoutData.dy -= gf * ny / d; + } + + // speed + if (freezeBalance) { + for (Node n : nodes) { + ForceVectorNodeLayoutData layoutData = n.getLayoutData(); + layoutData.dx *= speed * 10f; + layoutData.dy *= speed * 10f; + } + } else { + for (Node n : nodes) { + ForceVectorNodeLayoutData layoutData = n.getLayoutData(); + layoutData.dx *= speed; + layoutData.dy *= speed; + } + } + + // apply forces + for (Node n : nodes) { + ForceVectorNodeLayoutData nLayout = n.getLayoutData(); + if (!n.isFixed()) { + double d = 0.0001 + Math.sqrt(nLayout.dx * nLayout.dx + nLayout.dy * nLayout.dy); + float ratio; + if (freezeBalance) { + nLayout.freeze = (float) (freezeInertia * nLayout.freeze + + (1 - freezeInertia) * 0.1 * freezeStrength * (Math.sqrt(Math.sqrt( + (nLayout.old_dx - nLayout.dx) * (nLayout.old_dx - nLayout.dx) + + (nLayout.old_dy - nLayout.dy) * (nLayout.old_dy - nLayout.dy))))); + ratio = (float) Math.min((d / (d * (1f + nLayout.freeze))), maxDisplacement / d); + } else { + ratio = (float) Math.min(1, maxDisplacement / d); + } + nLayout.dx *= ratio / cooling; + nLayout.dy *= ratio / cooling; + float x = n.x() + nLayout.dx; + float y = n.y() + nLayout.dy; + + n.setX(x); + n.setY(y); + } + } + } +} diff --git a/modules/MultiVizPlugin/src/main/java/algorithms/force/FruchtermanReingoldLayout.java b/modules/MultiVizPlugin/src/main/java/algorithms/force/FruchtermanReingoldLayout.java new file mode 100644 index 0000000000..82a0c4e56b --- /dev/null +++ b/modules/MultiVizPlugin/src/main/java/algorithms/force/FruchtermanReingoldLayout.java @@ -0,0 +1,195 @@ +/* + Copyright 2008-2010 Gephi + Authors : Mathieu Jacomy + 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 algorithms.force; + +import helpers.Point; +import java.util.HashMap; +import java.util.List; +import helpers.VizUtils; +import org.gephi.graph.api.Edge; +import org.gephi.graph.api.Node; +import org.gephi.layout.plugin.ForceVectorNodeLayoutData; + +/** + * + * @author J + */ +public class FruchtermanReingoldLayout { + + + private static final float SPEED_DIVISOR = 800; + private static final float AREA_MULTIPLICATOR = 10000; + + private final int layerDistance; + private final HashMap> layers; + private final String initialLayer; + private final Node initialNode; + private final boolean sortLayers; + private final boolean splitAsLevel; + private final int iteration; + private final List allEdges; + private final List allNodes; + private final double gravity; + private final float speed; + private final double area; + + public FruchtermanReingoldLayout(int noOfIterations, int layerDistance, List edges, double area, double gravity, float speed, HashMap> layers, String initialLayer, Node initialNode, boolean sortLayers, boolean splitAsLevel, List nodes) { + this.layerDistance = layerDistance; + this.iteration = noOfIterations; + this.initialLayer = initialLayer; + this.initialNode = initialNode; + this.sortLayers = sortLayers; + this.splitAsLevel = splitAsLevel; + if (this.sortLayers) { + this.layers = VizUtils.sortedLayers(layers); + } else { + this.layers = layers; + } + this.allEdges = edges; + this.allNodes = nodes; + this.area = area; + this.gravity = gravity; + this.speed = speed; + } + + public void start() { + for (int i = 0; i < iteration; i++) { + if(splitAsLevel) runAlgorithm(allNodes, allEdges, null); + else { + int counter = 0; + for (String currentLayer : layers.keySet()) { + Point ghostPoint = new Point(initialNode.x(), initialNode.y() + (layerDistance * counter * 2)); + List nodes = layers.get(currentLayer); + List edges = VizUtils.getLayerEdges(layers, allEdges, nodes); + runAlgorithm(nodes, edges, ghostPoint); + counter++; + } + } + } + VizUtils.initiateLayerSplitter(layers, initialLayer, initialNode, splitAsLevel, layerDistance); + } + + private void runAlgorithm(List nodes, List edges, Point ghostPoint) { + try { + for (Node node : nodes) { + if (node.getLayoutData() == null || !(node.getLayoutData() instanceof ForceVectorNodeLayoutData)) { + node.setLayoutData(new ForceVectorNodeLayoutData()); + } + ForceVectorNodeLayoutData layoutData = node.getLayoutData(); + layoutData.dx = 0; + layoutData.dy = 0; + } + + // Déplacement limite : on peut le calibrer... + float maxDisplace = (float) (Math.sqrt(AREA_MULTIPLICATOR * area) / 10f); + + // La variable k, l'idée principale du layout. + float k = (float) Math.sqrt((AREA_MULTIPLICATOR * area) / (1f + nodes.size())); + + if (ghostPoint != null) { + /** + * use ghost nodes to attract nodes + */ + } + + // On fait toutes les paires de noeuds + nodes.forEach(N1 -> { + nodes.stream().filter(N2 -> (N1 != N2)).forEachOrdered(N2 -> { + // distance en x entre les deux noeuds + float xDist = N1.x() - N2.x(); + float yDist = N1.y() - N2.y(); + // distance tout court + float dist = (float) Math.sqrt(xDist * xDist + yDist * yDist); + if (dist > 0) { + // Force de répulsion + float repulsiveF = k * k / dist; + ForceVectorNodeLayoutData layoutData = N1.getLayoutData(); + // on l'applique... + layoutData.dx += xDist / dist * repulsiveF; + layoutData.dy += yDist / dist * repulsiveF; + } + }); + }); + edges.forEach(E -> { + // Idem, pour tous les noeuds on applique la force d'attraction + Node Nf = E.getSource(); + Node Nt = E.getTarget(); + float xDist = Nf.x() - Nt.x(); + float yDist = Nf.y() - Nt.y(); + float dist = (float) Math.sqrt(xDist * xDist + yDist * yDist); + float attractiveF = dist * dist / k; + if (dist > 0) { + ForceVectorNodeLayoutData sourceLayoutData = Nf.getLayoutData(); + ForceVectorNodeLayoutData targetLayoutData = Nt.getLayoutData(); + sourceLayoutData.dx -= xDist / dist * attractiveF; + sourceLayoutData.dy -= yDist / dist * attractiveF; + targetLayoutData.dx += xDist / dist * attractiveF; + targetLayoutData.dy += yDist / dist * attractiveF; + } + }); + // gravity + nodes.forEach(n -> { + ForceVectorNodeLayoutData layoutData = n.getLayoutData(); + float d = (float) Math.sqrt(n.x() * n.x() + n.y() * n.y()); + float gf = 0.01f * k * (float) gravity * d; + layoutData.dx -= gf * n.x() / d; + layoutData.dy -= gf * n.y() / d; + }); + // speed + nodes.forEach(n -> { + ForceVectorNodeLayoutData layoutData = n.getLayoutData(); + layoutData.dx *= speed / SPEED_DIVISOR; + layoutData.dy *= speed / SPEED_DIVISOR; + + }); + nodes.forEach(n -> { + // Maintenant on applique le déplacement calculé sur les noeuds. + // nb : le déplacement à chaque passe "instantanné" correspond à la force : c'est une sorte d'accélération. + ForceVectorNodeLayoutData layoutData = n.getLayoutData(); + float xDist = layoutData.dx; + float yDist = layoutData.dy; + float dist = (float) Math.sqrt(layoutData.dx * layoutData.dx + layoutData.dy * layoutData.dy); + if (dist > 0 && !n.isFixed()) { + float limitedDist = Math.min(maxDisplace * (speed / SPEED_DIVISOR), dist); + n.setX(n.x() + xDist / dist * limitedDist); + n.setY(n.y() + yDist / dist * limitedDist); + } + }); + } catch (Exception e) { + System.out.println("Frutcherman " + e.getMessage()); + } + } +} diff --git a/modules/MultiVizPlugin/src/main/java/helpers/AbstractProjectionPropertyEditor.java b/modules/MultiVizPlugin/src/main/java/helpers/AbstractProjectionPropertyEditor.java new file mode 100644 index 0000000000..76bf72e281 --- /dev/null +++ b/modules/MultiVizPlugin/src/main/java/helpers/AbstractProjectionPropertyEditor.java @@ -0,0 +1,87 @@ +/* +Copyright 2008 WebAtlas +Authors : Mathieu Bastian, Mathieu Jacomy, Julian Bilcke +Website : http://www.gephi.org + +This file is part of Gephi. + +Gephi is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Gephi is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Gephi. If not, see . + */ +package helpers; + +import java.beans.PropertyEditorSupport; + +/** + * + * @author Alexis Jacomy + */ +abstract class AbstractProjectionPropertyEditor extends PropertyEditorSupport { + + protected AbstractProjectionPropertyEditor() { + } + + private String selectedColumn; + private String[] tempoColumns = {"Node Label","Edge Type"}; + + @Override + public String[] getTags() { + if (multiviz.MultiLayerVisualization.selectableColumns.isEmpty()){ + return tempoColumns; + } else { + return multiviz.MultiLayerVisualization.selectableColumns.toArray(new String[multiviz.MultiLayerVisualization.selectableColumns.size()]); + } + } + + @Override + public Object getValue() { + return selectedColumn; + } + + @Override + public void setValue(Object value) { + if(multiviz.MultiLayerVisualization.selectableColumns.isEmpty()){ + for (String dummyColumn : tempoColumns) { + if (dummyColumn.equals((String)value)) { + selectedColumn = dummyColumn; + break; + } + } + } else { + for(int i=0;i. + */ +package helpers; + +/** + * + * @author Alexis Jacomy + */ +public class CustomComboBoxEditor extends AbstractProjectionPropertyEditor { + public CustomComboBoxEditor() { + super(); + } +} + diff --git a/modules/MultiVizPlugin/src/main/java/helpers/LayoutAlgorithmProperty.java b/modules/MultiVizPlugin/src/main/java/helpers/LayoutAlgorithmProperty.java new file mode 100644 index 0000000000..d1901a0f93 --- /dev/null +++ b/modules/MultiVizPlugin/src/main/java/helpers/LayoutAlgorithmProperty.java @@ -0,0 +1,67 @@ +/* +Copyright 2008 WebAtlas +Authors : Mathieu Bastian, Mathieu Jacomy, Julian Bilcke +Website : http://www.gephi.org + +This file is part of Gephi. + +Gephi is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Gephi is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Gephi. If not, see . + */ +package helpers; + +import java.beans.PropertyEditorSupport; + +/** + * + * @author J + */ +public abstract class LayoutAlgorithmProperty extends PropertyEditorSupport{ + + private String[] listOfAlgorithms = {"Circle Layout", "Grid Layout", "Linear Layout", "ForceAtlas", "ForceAtlas2", "Fruchterman Reingold"}; + private String selectedAlgorithm = "Linear Layout"; + + protected LayoutAlgorithmProperty(){ + } + + + @Override + public String[] getTags() { + return listOfAlgorithms; + } + + @Override + public Object getValue() { + return selectedAlgorithm; + } + + @Override + public void setValue(Object value) { + for (String algorithm : listOfAlgorithms) { + if(algorithm.equals((String) value)) { + selectedAlgorithm = algorithm; + break; + } + } + } + + @Override + public String getAsText() { + return getValue().toString(); + } + + @Override + public void setAsText(String text) throws IllegalArgumentException { + setValue(text); + } +} \ No newline at end of file diff --git a/modules/MultiVizPlugin/src/main/java/helpers/LayoutDropDowns.java b/modules/MultiVizPlugin/src/main/java/helpers/LayoutDropDowns.java new file mode 100644 index 0000000000..455937ea6d --- /dev/null +++ b/modules/MultiVizPlugin/src/main/java/helpers/LayoutDropDowns.java @@ -0,0 +1,33 @@ +/* +Copyright 2008 WebAtlas +Authors : Mathieu Bastian, Mathieu Jacomy, Julian Bilcke +Website : http://www.gephi.org + +This file is part of Gephi. + +Gephi is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Gephi is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Gephi. If not, see . + */ + + +package helpers; + +/** + * + * @author J + */ +public class LayoutDropDowns extends LayoutAlgorithmProperty{ + public LayoutDropDowns() { + super(); + } +} diff --git a/modules/MultiVizPlugin/src/main/java/helpers/Point.java b/modules/MultiVizPlugin/src/main/java/helpers/Point.java new file mode 100644 index 0000000000..6dd4b76b39 --- /dev/null +++ b/modules/MultiVizPlugin/src/main/java/helpers/Point.java @@ -0,0 +1,39 @@ +package helpers; + +public class Point +{ + + public Point(float x, float y) + { + this.x = x; + this.y = y; + } + public Point() + { + this(0,0); + } + public float GetX() + { + return x; + } + public float GetY() + { + return y; + } + public void SetX(float x) + { + this.x = x; + } + public void SetY(float y) + { + this.y = y; + } + + public void Print() + { + System.out.print("(" + x + "," + y + ")"); + } + + private float x; + private float y; +} \ No newline at end of file diff --git a/modules/MultiVizPlugin/src/main/java/helpers/VizUtils.java b/modules/MultiVizPlugin/src/main/java/helpers/VizUtils.java new file mode 100644 index 0000000000..8aff8f3c86 --- /dev/null +++ b/modules/MultiVizPlugin/src/main/java/helpers/VizUtils.java @@ -0,0 +1,128 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package helpers; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import org.gephi.graph.api.Column; +import org.gephi.graph.api.Edge; +import org.gephi.graph.api.Interval; +import org.gephi.graph.api.Node; +import org.gephi.graph.api.Table; + +/** + * + * @author J + */ +public class VizUtils { + + public static String getLabel(Node node, Column column) { + return node.getAttribute(column).toString(); + } + + public static Column getLabel(Table table, String column) { + Column label = table.getColumn(column); + if (label == null) { + label = table.getColumn(column.replace(" ", "_")); + } + return label; + } + + public static String getLabel(Edge edge, Column column) { + return edge.getAttribute(column).toString(); + } + + public static Float getLayerPlacement(HashMap> layers, String layer, int layerDistance) { + Node farthestNode = layers.get(layer).stream().max(Comparator.comparing(node -> node.y())).get(); + return farthestNode.y() + farthestNode.size() + farthestNode.getTextProperties().getSize() + layerDistance; + } + + public static Node getBiggestNode(HashMap> layers, String currentLayer) { + return layers.get(currentLayer).stream().max(Comparator.comparing(node -> node.size())).get(); + } + + public static Float getLayerSize(HashMap> layers, Node biggestNode, String currentLayer) { + return (biggestNode.size() + biggestNode.getTextProperties().getSize()) * layers.get(currentLayer).size(); + } + + public static HashMap> sortedLayers(HashMap> layers) { + List>> list = new ArrayList<>(layers.entrySet()); + Collections.sort(list, (Map.Entry> o1, Map.Entry> o2) -> Integer.compare(o2.getValue().size(), o1.getValue().size())); + HashMap> temp = new LinkedHashMap<>(); + for (Map.Entry> item : list) { + temp.put(item.getKey(), item.getValue()); + } + return temp; + } + + public static void nodesRandom(List nodes) { + for (Node node : nodes) { + float random = (float) ((0.01 + Math.random()) * 1000) - 500; + node.setX(random); + node.setY((float) ((0.01 + Math.random()) * 1000) - 500); + } + } + + public static List getLayerEdges(HashMap> layers, List allEdges, List nodes) { + List edges = new ArrayList<>(); + for (Edge edge : allEdges) { + if (nodes.contains(edge.getSource()) && nodes.contains(edge.getTarget())) { + if (!edges.contains(edge)) { + edges.add(edge); + } + } + } + return edges; + } + + public static void initiateLayerSplitter(HashMap> layers, String initialLayer, Node initialNode, boolean splitAsLevel, int layerDistance) { + String previousLayer = initialLayer; + for (String currentLayer : layers.keySet()) { + if(splitAsLevel){ + for (Node node : layers.get(currentLayer)) { + float y = node.y(); + if(currentLayer == null ? initialLayer != null : !currentLayer.equals(initialLayer)){ + y = y + getLayerPlacement(layers, previousLayer, layerDistance); + } + node.setY(y); + } + } else { + float y = initialNode.y(); + if(currentLayer == null ? initialLayer != null : !currentLayer.equals(initialLayer)){ + y = getLayerPlacement(layers, previousLayer, layerDistance); + } + for (Node node : layers.get(currentLayer)) { + node.setY(node.y() + y); + } + } + previousLayer = currentLayer; + } + } + + public static List getLayerEdges(List allEdges, List nodes) { + List temp_edges = new ArrayList<>(); + allEdges.forEach(e -> { + if (nodes.contains(e.getSource()) && nodes.contains(e.getTarget())) { + if (!temp_edges.contains(e)) { + temp_edges.add(e); + } + } + }); + return temp_edges; + } + + public static Double getEdgeWeight(Edge edge, boolean dynamicWeight, Interval timeInterval) { + if (dynamicWeight) { + return edge.getWeight(timeInterval); + } else { + return edge.getWeight(); + } + } +} diff --git a/modules/MultiVizPlugin/src/main/java/multiviz/MLVBuilder.java b/modules/MultiVizPlugin/src/main/java/multiviz/MLVBuilder.java new file mode 100644 index 0000000000..a4b0791573 --- /dev/null +++ b/modules/MultiVizPlugin/src/main/java/multiviz/MLVBuilder.java @@ -0,0 +1,95 @@ +/* +Copyright 2008-2011 Gephi +Authors : Mathieu Bastian +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 multiviz; + + +import javax.swing.Icon; +import javax.swing.JPanel; +import org.gephi.layout.spi.Layout; +import org.gephi.layout.spi.LayoutBuilder; +import org.gephi.layout.spi.LayoutUI; +import multiviz.MultiLayerVisualization; +import org.openide.util.lookup.ServiceProvider; + + +/** + * + * @author J + */ +@ServiceProvider(service = LayoutBuilder.class) +public class MLVBuilder implements LayoutBuilder{ + + @Override + public String getName() { + return "Multi Layer Visualization"; + } + + @Override + public LayoutUI getUI() { + return new LayoutUI() { + @Override + public String getDescription() { + return ""; + } + + @Override + public Icon getIcon() { + return null; + } + + @Override + public JPanel getSimplePanel(Layout layout) { + return null; + } + + @Override + public int getQualityRank() { + return -1; + } + + @Override + public int getSpeedRank() { + return -1; + } + }; + } + + @Override + public Layout buildLayout() { + return new MultiLayerVisualization(this); + } + +} diff --git a/modules/MultiVizPlugin/src/main/java/multiviz/MultiLayerVisualization.java b/modules/MultiVizPlugin/src/main/java/multiviz/MultiLayerVisualization.java new file mode 100644 index 0000000000..25fcca3dbf --- /dev/null +++ b/modules/MultiVizPlugin/src/main/java/multiviz/MultiLayerVisualization.java @@ -0,0 +1,392 @@ +package multiviz; + +import algorithms.basic.CircleLayout; +import algorithms.basic.GridLayout; +import algorithms.basic.LinearLayout; +import algorithms.basic.RandomLayout; +import algorithms.force.ForceAtlas2Layout; +import algorithms.force.ForceAtlasLayout; +import algorithms.force.FruchtermanReingoldLayout; +import helpers.CustomComboBoxEditor; +import helpers.LayoutDropDowns; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import helpers.VizUtils; +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; +import java.util.stream.Collectors; +import static java.util.stream.Collectors.toList; +import org.gephi.graph.api.Column; +import org.gephi.graph.api.Edge; +import org.gephi.graph.api.Graph; +import org.gephi.graph.api.GraphModel; +import org.gephi.graph.api.Interval; +import org.gephi.graph.api.Node; +import org.gephi.graph.api.Table; +import org.gephi.layout.spi.Layout; +import org.gephi.layout.spi.LayoutBuilder; +import org.gephi.layout.spi.LayoutProperty; + +/** + * + * @author Jaymohan + */ +public class MultiLayerVisualization implements Layout { + + private final LayoutBuilder builder; + private GraphModel graphModel; + private boolean executing = false; + + private int layerDistance; + private int noOfIterations; + + private String selectedColumn= "Node Label"; + private String layoutAlgorithm; + + private boolean horizontalLayout; + private boolean is3DLayout; + private boolean sortLayers = false; + + private int layerArea; + private double gravity; + private float speed; + private boolean splitAsLevel; + public static List selectableColumns = new ArrayList<>(); + + Graph graph; + + MultiLayerVisualization(MLVBuilder mBuilder) { + this.builder = mBuilder; + } + + @Override + public void initAlgo() { + executing = true; + } + + @Override + public void setGraphModel(GraphModel graphModel) { + this.graphModel = graphModel; + graph = this.graphModel.getGraphVisible(); + selectableColumns = new ArrayList<>(); + for (int i = 0; i < graphModel.getNodeTable().countColumns(); i++) { + selectableColumns.add("Node " + graphModel.getNodeTable().getColumn(i).getTitle()); + } + for (int i = 0; i < graphModel.getEdgeTable().countColumns(); i++) { + selectableColumns.add("Edge " + graphModel.getEdgeTable().getColumn(i).getTitle()); + } + } + + @Override + public void goAlgo() { + if (graphModel == null) return; + + graph = graphModel.getGraphVisible(); + graph.readLock(); + + HashMap> layers = new HashMap<>(); + List nodes = graph.getNodes().toCollection().stream().collect(toList()); + List edges = graph.getEdges().toCollection().stream().collect(toList()); + + Table selectedTable; + Column label; + + // case1 :layer disjoint + // case2 :node aligned + if(selectedColumn.startsWith("Node ")){ + + selectedTable = graph.getModel().getNodeTable(); + + //remove word 'Edge / Node ' from selected layer + label = VizUtils.getLabel(selectedTable, selectedColumn.substring(5)); + + for (Node node : nodes) { + String key = VizUtils.getLabel(node, label); + List values = layers.get(key); + if (values == null) values = new ArrayList<>(); + values.add(node); + layers.put(key, values); + } + + } else if(selectedColumn.startsWith("Edge ")) { + + selectedTable = graph.getModel().getEdgeTable(); + label = VizUtils.getLabel(selectedTable, selectedColumn.substring(5)); + + /** + * get nodes without any edges/connections* + */ + List edgeSourceNodes = edges.stream().map(v -> v.getTarget()).distinct().collect(Collectors.toList()); + List edgeTargetNodes = edges.stream().map(v -> v.getSource()).distinct().collect(Collectors.toList()); + List outliers = new ArrayList<>(); + + nodes.forEach(node -> { + if (edgeSourceNodes.contains(node) || edgeTargetNodes.contains(node)) { + } else { + outliers.add(node); + } + }); + + /** + * If same label/nodes exists in multiple layers then node should + * only be allowed to primary layer + */ + Set valueList = new HashSet<>(); + + edges.forEach(edge -> { + String key = VizUtils.getLabel(edge, label); + List value = layers.get(key); + if (value == null) { + value = new ArrayList<>(); + } + if (!value.contains(edge.getSource())) { + + if(!valueList.contains(edge.getSource())){ + value.add(edge.getSource()); + } + valueList.add(edge.getSource()); + } + if (!value.contains(edge.getTarget())) { + + if(!valueList.contains(edge.getTarget())){ + value.add(edge.getTarget()); + } + valueList.add(edge.getTarget()); + } + layers.put(key, value); + }); + + if (!outliers.isEmpty()) { + layers.put("outliers", outliers); + } + + for (List layer : layers.values()) { + Collections.sort(layer, (Node o1, Node o2) -> { + if (o1.getLabel() != null) { + try { + return (o1.getLabel()).compareTo(o2.getLabel()); + } catch (NumberFormatException e) { + return Integer.compare(o1.getStoreId(), o2.getStoreId()); + } + } else { + return Integer.compare(o1.getStoreId(), o2.getStoreId()); + } + }); + } + } else return; + + String initialLayer = layers.keySet().stream().findFirst().get(); + Node initialNode = layers.get(initialLayer).get(0); + + boolean isDynamicWeight = graphModel.getEdgeTable().getColumn("weight").isDynamic(); + Interval interval = graph.getView().getTimeInterval(); + + switch (layoutAlgorithm) { + case "Linear Layout": + new LinearLayout(getLayerDistance(), layers, initialLayer, initialNode, sortLayers).start(); + break; + case "Grid Layout": + new GridLayout(getLayerDistance(), layers, initialLayer, initialNode, sortLayers).start(); + break; + case "Circle Layout": + new CircleLayout(getLayerDistance(), layers, initialLayer, initialNode, sortLayers).start(); + break; + case "ForceAtlas": + //AbstractLayout.ensureSafeLayoutNodePositions(graphModel); + VizUtils.nodesRandom(nodes); + new ForceAtlasLayout(getLayerDistance(), layers, initialLayer, initialNode, sortLayers, splitAsLevel, getGravity(), getSpeed(), isDynamicWeight, interval, nodes, edges, graph, getNoOfIterations()).start(); + break; + case "ForceAtlas2": + VizUtils.nodesRandom(nodes); + //AbstractLayout.ensureSafeLayoutNodePositions(graphModel); + new ForceAtlas2Layout(getLayerDistance(), layers, initialLayer, initialNode, splitAsLevel, sortLayers, getNoOfIterations(), getArea(), getSpeed(), getGravity(), isDynamicWeight, interval, nodes, edges, graph, graphModel).start(); + break; + case "Fruchterman Reingold": + VizUtils.nodesRandom(nodes); + new FruchtermanReingoldLayout(getNoOfIterations(), getLayerDistance(), edges, getArea(), getGravity(), getSpeed(), layers, initialLayer, initialNode, sortLayers, splitAsLevel, nodes).start(); + break; + case "Random Layout": + new RandomLayout(getLayerDistance(), layers, initialLayer, initialNode, sortLayers).start(); + break; + default: + endAlgo(); + } + + if(is3DLayout()){ + for (Node node : nodes) { + double theta = 65 * Math.PI / 180; + //if(isHorizontalLayout()){ + node.setY((float) (node.y() * Math.cos(theta) - node.z() * Math.sin(theta))); + //} + node.setZ((float) (Math.random() * 0.01)); + } + } + + if(isHorizontalLayout()){ + double theta = 270 * Math.PI / 180; + float px = 0; + float py = 0; + for (Node u : nodes) { + if (!u.isFixed()) { + float dx = u.x() - px; + float dy = u.y() - py; + u.setX((float) (px + dx * Math.cos(theta) - dy * Math.sin(theta))); + u.setY((float) (py + dy * Math.cos(theta) + dx * Math.sin(theta))); + } + } + } + + graph.readUnlock(); + endAlgo(); + } + + @Override + public boolean canAlgo() { + return executing; + } + + @Override + public void endAlgo() { + executing = false; + try { + graph.readLock(); + for (Node node : graph.getNodes()) { + node.setLayoutData(null); + } + } finally { + graph.readUnlockAll(); + } + } + + @Override + public LayoutProperty[] getProperties() { + List properties = new ArrayList<>(); + final String BASIC = "Basic Features"; + final String FORCED = "Force Directed Features"; + + try{ + properties.add(LayoutProperty.createProperty(this, Integer.class, "Iterations", FORCED, "Number of iterations", "getNoOfIterations", "setNoOfIterations")); + properties.add(LayoutProperty.createProperty(this, Integer.class, "Set Area", FORCED, "Set area for a layer", "getArea", "setArea")); + properties.add(LayoutProperty.createProperty(this, Boolean.class, "Split by level", FORCED, "If selected, Layout Algorithm will be applied on the whole network before splitting in to layers, If not Algorithm will be applied on each layer.", "isSplitAsLevel", "setSplitAsLevel")); + properties.add(LayoutProperty.createProperty(this, Float.class, "Set Speed", FORCED, "Set Speed", "getSpeed", "setSpeed")); + properties.add(LayoutProperty.createProperty(this, Double.class, "Set Gravity", FORCED, "Set gravity to prevent nodes going off the screen in force directed layouts", "getGravity", "setGravity")); + properties.add(LayoutProperty.createProperty(this, Boolean.class, "Horizontal Layout", BASIC, "If selected, layers will be placed next to each other, instad of stacking top of one another", "isHorizontalLayout", "setHorizontalLayout")); + properties.add(LayoutProperty.createProperty(this, Boolean.class, "Set as 3D", BASIC, "Set nodes in 3 Dimension", "is3DLayout", "set3DLayout")); + properties.add(LayoutProperty.createProperty(this, Boolean.class, "Sort Layers", BASIC, "If selected, layers will sorted (layers with the least number of nodes will be placed at bottom/left)", "isSorted", "setSorted")); + properties.add(LayoutProperty.createProperty(this, Integer.class, "Layer Distance", BASIC, "Distance between two layers", "getLayerDistance", "setLayerDistance")); + properties.add(LayoutProperty.createProperty(this, String.class, "Select Layer", BASIC, "Select the feature which is to be considered as a layer", "getSelectedColumn", "setSelectedColumn", CustomComboBoxEditor.class)); + properties.add(LayoutProperty.createProperty(this, String.class, "Layout Algorithm", BASIC, "Select the layout algorithm which is to be applied to a layer", "getLayoutAlgorithm", "setLayoutAlgorithm", LayoutDropDowns.class)); + } catch(NoSuchMethodException e) { + e.printStackTrace(); + } + + return properties.toArray(LayoutProperty[]::new); + } + + @Override + public void resetPropertiesValues() { + layerDistance = 400; + gravity = 10d; + layerArea = 10000; + noOfIterations = 100; + horizontalLayout = false; + is3DLayout = false; + splitAsLevel = false; + speed = 1f; + } + + @Override + public LayoutBuilder getBuilder() { + return builder; + } + + public Integer getLayerDistance() { + return layerDistance; + } + + public void setLayerDistance(Integer layerDistance) { + this.layerDistance = layerDistance; + } + + public Integer getNoOfIterations() { + return noOfIterations; + } + + public void setNoOfIterations(Integer noOfIterations) { + this.noOfIterations = noOfIterations; + } + + public String getSelectedColumn() { + return this.selectedColumn; + } + + public void setSelectedColumn(String selectedColumn) { + this.selectedColumn = selectedColumn; + } + + public String getLayoutAlgorithm() { + return layoutAlgorithm; + } + + public void setLayoutAlgorithm(String layoutAlgorithm) { + this.layoutAlgorithm = layoutAlgorithm; + } + + public Boolean isHorizontalLayout() { + return horizontalLayout; + } + + public void setHorizontalLayout(Boolean horizontalLayout) { + this.horizontalLayout = horizontalLayout; + } + + public Boolean is3DLayout() { + return is3DLayout; + } + + public void set3DLayout(Boolean is3DLayout) { + this.is3DLayout = is3DLayout; + } + + public Integer getArea() { + return layerArea; + } + + public void setArea(Integer layerArea) { + this.layerArea = layerArea; + } + + public Double getGravity() { + return gravity; + } + + public void setGravity(Double gravity) { + this.gravity = gravity; + } + + public Float getSpeed() { + return speed; + } + + public void setSpeed(Float speed) { + this.speed = speed; + } + + public Boolean isSplitAsLevel() { + return splitAsLevel; + } + + public void setSplitAsLevel(Boolean splitAsLevel) { + this.splitAsLevel = splitAsLevel; + } + + public Boolean isSorted() { + return sortLayers; + } + + public void setSorted(Boolean sortLayers) { + this.sortLayers = sortLayers; + } +} diff --git a/modules/MultiVizPlugin/src/main/java/multiviz/Readme.java b/modules/MultiVizPlugin/src/main/java/multiviz/Readme.java new file mode 100644 index 0000000000..618d500b07 --- /dev/null +++ b/modules/MultiVizPlugin/src/main/java/multiviz/Readme.java @@ -0,0 +1,56 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package multiviz; + +/** + * + * @author J + */ +public class Readme { + + /** + * not use distance between layers , gravity can keep everything together + * repel communities (no need to perfectly stack on top) + * + */ + /** + * Hooke’s law + * repulsive forces between all nodes + * attractive forces between nodes that are adjacent + * + * forces between the nodes can be computed based on their graph theoretic distances, + * determined by the lengths of shortest paths between them. + * + * Kamada and Kawai uses spring forces proportional to the graph theoretic distances + * + * C60 bucky ball (60 vertices) one node connected to 3 others + * + * Old basic force-directed limited to small graphs and results are poor for graphs with more than a few hundred vertices + * + * fact that the physical model typically has many local minima + * + * all the edge lengths ought to be the same, and the layout should display as much symmetry as possible + * + * “even vertex distribution” + * + * “atomic particles or celestial bodies, exerting attractive and repulsive forces from one another.” + * fa(d) = d^2/k, fr(d) = −k^2/d + * distance d between two vertices + * optimal distance between vertices k + * k = C \sqrt( area / number of vertices ) + * O(|E|) attractive forces and O(|V|^2) repulsive forces + * the temperature could start at an initial value (say one tenth the width of the frame) and decay to 0 in an inverse linear fashion. + * temperature controls the displacement of vertices so that as the layout becomes better, the adjustments become smaller. + * technique called simulated annealing + * + * reduce the quadratic complexity of the repulsive forces, Fruchterman and Reingold suggest using a grid variant of their basic algorithm, where the repulsive forces between distant vertices are ignored. + * For sparse graphs, and with uniform distribution of the vertices, this method allows a O(|V |) time approximation to the repulsive forces calculation + * + * + */ + + + +} diff --git a/modules/MultiVizPlugin/src/main/nbm/manifest.mf b/modules/MultiVizPlugin/src/main/nbm/manifest.mf new file mode 100644 index 0000000000..5f33210c20 --- /dev/null +++ b/modules/MultiVizPlugin/src/main/nbm/manifest.mf @@ -0,0 +1,5 @@ +Manifest-Version: 1.0 +OpenIDE-Module-Name: MultiVizPlugin +OpenIDE-Module-Short-Description: multi layer visualization +OpenIDE-Module-Long-Description: visualizes multilayer complex networks +OpenIDE-Module-Display-Category: Layout diff --git a/modules/MultiVizPlugin/target/classes/META-INF/MANIFEST.MF b/modules/MultiVizPlugin/target/classes/META-INF/MANIFEST.MF new file mode 100644 index 0000000000..7044d6e6e6 --- /dev/null +++ b/modules/MultiVizPlugin/target/classes/META-INF/MANIFEST.MF @@ -0,0 +1,16 @@ +Manifest-Version: 1.0 +OpenIDE-Module-Name: MultiVizPlugin +OpenIDE-Module-Short-Description: multi layer visualization +OpenIDE-Module-Long-Description: visualizes multilayer complex network + s +OpenIDE-Module-Display-Category: Layout +OpenIDE-Module-Specification-Version: 1.0.0 +OpenIDE-Module-Implementation-Version: 1.0.0 +OpenIDE-Module-Build-Version: 202210251537 +OpenIDE-Module: amrita.multiviz +OpenIDE-Module-Public-Packages: - +OpenIDE-Module-Requires: org.openide.modules.ModuleFormat1 +OpenIDE-Module-Module-Dependencies: org.gephi.layout.api > 0.9.3, org. + gephi.graph.api > 0.9.3, org.gephi.layout.plugin > 0.9.3, org.gephi.u + i.utils > 0.9.3 + diff --git a/modules/MultiVizPlugin/target/classes/META-INF/services/org.gephi.layout.spi.LayoutBuilder b/modules/MultiVizPlugin/target/classes/META-INF/services/org.gephi.layout.spi.LayoutBuilder new file mode 100644 index 0000000000..a6faa3bb63 --- /dev/null +++ b/modules/MultiVizPlugin/target/classes/META-INF/services/org.gephi.layout.spi.LayoutBuilder @@ -0,0 +1 @@ +multiviz.MLVBuilder diff --git a/modules/MultiVizPlugin/target/classes/algorithms/basic/CircleLayout.class b/modules/MultiVizPlugin/target/classes/algorithms/basic/CircleLayout.class new file mode 100644 index 0000000000000000000000000000000000000000..fb7749bd1560f9781b643d4cd7951495afd0dbc5 GIT binary patch literal 3189 zcmbtXTXS3075=s?=}7XnVi`G>2s9)m!B*@jkOVBtbsS<$9260d<0PgHJw85>PAp5} z=qR<*%g~n6DG;Eg7XqcF7wTkq>P($Ry)cx%<)IJ#5uNE{r%#jy_uEHOEQ6ubsb_Nb z+H0@d{?^)SDK|d+-8%ptz|{~u=+NMm@WC(8eO|wyCyRP1pL}%gylFTB{!y!BIb#AH z{R1;W1Q65^lIVmKxKl6Y%eLhd7OTlQy=ocBBbIFx&5XWWu2EMiRZA~&Z`uMqnRW9y z$F@rOv@#f$*n)0>&Zcy>JZ}ozo+;b;WZtY4tYqHSD}|(9v6AX69YPOo(-4*D#a0Gg zFpCw_t|n)!izgkcSf%4?*>=o%*DtsI{SD7Go+gj#)xvSTk{;NEr^1Oz#Bn<>UQ|(2 z`?gOIyhGwnd`6(l6`ZiDj$SetxtI#!F6_{-Q{uC@TOi_IyWKghFPO_YlNd$%+XEph z-HF|}M?=5F01`C6uI(xWEXTBUr%XV%ZqS`-@@ZfYLmKu^Y`0ZITEqPtilmXnP7EWZVMHR0QGwVeC63T6yZ$CaIEXQc zLl`F#=2JCYC9SuarFMq{vntsSN*uuivC5l{o6{3T-7pu;62nhzmfMdP+Ef!|*Z5?y ztUD~DNj$9KsKk^Cd&_!py5|C+b4qSTFV;+z(MKdQIL-?&3W435Mcd}L@qUQdqXOae z3}jd)oyg)biN}#6+Ewc!YlcafQtXq;$Be>aL%>aA3h2`kXH>XiN$sAH_&mO#%$Uw; zF8z}OGm8JD#1~uqGm0@MVYq4+)y|YS*E(kMv$#ibEfv$Kq822ISZn}3&2l(lm-)gR z%Ve5%voJQx@J2ZnVHp(-Pf6Iy@6P|OA`l?5r>uFW;6L=w{rkt+qBLA+!RKb~xX#1z z;EoTbCx&AF@pyw!A%8{UtE$>Ht2${dne+Zb?>7!ZsNw4p-@rEsvr*;^y!{gc6N>#U ziDzAQ)hhXwJM||J%vt%8?$m51Cin5jKiZb%W*ci0QVAa26d<>EjitxZ0u%jHZ7Qvf zw29r#P;>3f4zNnRN8DDqC1aJ$Y;AGQw5RpCBBSoflnuQ&quZ9+H<@0iVDa|bGoRYE z8C^(q&sOggv+Oe)%`I12CcAQuZY;2yHeEck*}eX6y#8lgd~C%w->A3b;?tqq1|JL? zh-ZF@#H1qFiMk9l@(>C449hkTDMU!1rz~>Z9M`tNG=3-^KK?jtzocmmTiX@iZ zZCO-_CwS7R*|gWdk3K54dBG~zsxF=agCEiO)KXz8a^;$Bn3I;uYNUO-?o~YnJ2mXjF z#8|@vUc$@V(U%&Vj8su7W)*+Jjkd$3RJ>l7`Yyi5SYIJ6Z^^5heV?2dJZp62*ANgI z?$U5j!!V6{n+W`X8b73Gq3+qSL~1MF_IrunK+EvccMaR?*d=g$u#P!@Se zLp#F_Gp7XVm}Pp_5Bj`yoZY}_h_c}7nD<~s^o3J?Wi&4^5{L&HA!4th+!%*Pf-!$Q zSVuwqKv2YarCSo1yJV#ND{Fs=`J<>Vr2K0AQaKffVman7r$XVB45z{^+uiZ*rtP;B z)wCUnN9y>pz-xFxQS_mfmWQs=+@(}F7FPCSp@mdWED)2i9wUmc8Q1aj!pp7@h}zO59Lo{^IA$Sr*OqH_(1B7NSzUeXGj=J72|)=mv&Rz93wufJzm{b1+!A%$HS zVFjkS8|5?~!wi30=orUE9A^F>#1%~7Z9IebV!CCPqJn7c>tE~PTxC1|8 z?FOl7;#FKm5A}0I@pVLL-99`e?@uq zdI|{MM34Ju25;hi5}tqKtcL7Obn^cLga5*THU12hd|eG8CBfqk^~ZDI16)~C&EumI Sz#5~YtWu;Wffar|xbh#fIrpsq literal 0 HcmV?d00001 diff --git a/modules/MultiVizPlugin/target/classes/algorithms/basic/GridLayout.class b/modules/MultiVizPlugin/target/classes/algorithms/basic/GridLayout.class new file mode 100644 index 0000000000000000000000000000000000000000..f058a02a3f01d6f4b2ea134f4c3b09cfd9621a09 GIT binary patch literal 3108 zcmbtVTXS1i75=s^KJwAF9bc3v4W$=yu@t*%LUAL@xK3)EI+dMJrGmJn&9Qtc9Y>Lz zqoX8FA%!+g+6MOm^kTPkrh&oC@Wc!bHV;gnnc<;-pg*9)1J9ij^X)BZEEBr}gT~%x z?X}lhdtJV@_TTRO<*xu9#jj2H;5QJE2%<$`$E$|a`ATBisyMmCao3qiTl3{AHQS2TyzP!U70)W=YymN@ z)Y~OGutPv9vyN4ywCxIXr8ln5c&<~*r<8P;L^pZ_!gcA%@(eBAlPXoRd&zT4|@mE<^>)O4;?a{R(fNGI0;~82E<7z4#_$E!f35+pQ$B&XuPzPsXNjfPfVlbgv66bvlR4QgW^=t%Gu}b60?*1@7y1+7f~A@E0!%UWnvO14V;qr zzH+-`1Ni!!xP3v%Wvyb>R)EP!oW|1(fL;jf-^$yjwAK2S1^EGUzER*b+c1nQ&PYt* z85XnRTwy1%#^WY_gy#%AFL4%DLrMEPVR;25dcozzf!@*BsFKY|%z(Nj0?TVFZilsgX?oMIgvBkwD6;4s*=De!mrbO41&@#d)r+x}4 z7bIMjZ*f`eJc%kUs^Dzzhbo4#SXS{bOUyU;XB6W_i63jVD{6OD;-$v%lt637$(Jmz z>M|XfyZe3U?pT_HR7r-mNB3}QI3+OJJKm(y7(!dv-8P?7u`J_zTo2BUv{SMttLLX} z_p~)#q}N^Pa?UDdE!R=|Iy2xE95%+i>93jZ^lj&6-TAqOep|+~a_2ZL>-Mf~6~zCY zoc}oqLB2#9$t9f(U+FT@Kt%XT91lK^JD*2N%<`Ww4o^3aD>23_y5&pEOCVQPbE8#H z`WnV%uIjp+3wla$G|##AMWRMS7>o^Ph6`5NjkA2|JG8{%c2zrx+;{I>9WIR0md_?{IQ@%|OG#dil*&>4>e zR}hK+36Vv#$NN^Xdj(AE)^t z4C7Tw4cBhNb==^N_iFEjrj-9Gro-BEzowM$0Zl3IgLsX!WRyzk0jMZnCmn@vo!7J& z2nhpw4I~YWP$*E(#v9bQ$(x0W*+0qLMF6qP$lB6e?z@d|tsy2b(YJ<#z@m7Q#CHTf zMRHP|_pc%~7$DWThQ|bs1P}J##`l)cqYe*pF;+2t8xu!@TKYDg`V`qUa7f%(#j~rJ zel2izpyg}M40X0Uz_rN+xAJECpL&RxL;{zW^u z5AqIXU`}8m+O|RGbM3ig=Q8$gur?p>FeBl@4a)46(ayKmQ1O9O zH>pdCs;ONOSi?_zxE2=6>)qE(uKxb?@}05*nqLF0ggvB>5(dYxj}LePqlDQQcgK;z z36%Nt-b5N7^R@gvPU7!;Ex+K&I!=pjWW_E%a0hTk9Kw`1g=fVDJSSen^Ws&U74PDt z_z;ug6Xe8iFe82kTLbn3g7FLd0Y4`YB`v*&1-ywi+Ityqk?Nq;t9YAKCvBJT4ykU+ z{}aEUd>Ee)hQB0b5?CI7rQtj%9D4sQ<0y+qXi*ZHH$@chlQQtJ2;u`;31OeOibXat zTR|+>TP7%OVTnAUf&U6x|Aj7%_lNIbqy~KU!URnALXBT%3gM?KU!hg3ij)AN?Ct_~sn| literal 0 HcmV?d00001 diff --git a/modules/MultiVizPlugin/target/classes/algorithms/basic/LinearLayout.class b/modules/MultiVizPlugin/target/classes/algorithms/basic/LinearLayout.class new file mode 100644 index 0000000000000000000000000000000000000000..246a30139be37c6c7a4f30a003d79b62fc386ed4 GIT binary patch literal 2757 zcmbtWTXR!Y6#jOa3it=@tnCg7)O2*l>rjh20|AL3q`)dO zlgc@^o1V%?5@y~`Mxu7sGM%V-CRd=YRI0X_;o5QpnxYHlW3FRoQv=H25{U*Z6$qB3 z$8(dGKwC8Dq#`M6I&DW%jyau3K$7 z%k5>wdke0eiR?A==`nM9Ab>WkG;p89D%{V&(^h7h!jZUr_8{e`C6#4svTVDfql%Tz zDtiH}#u@`_B_6;!fkqv3<=yn`gmornF+q(Tl@_=)5X1&-G|(Z@iLgNZg0@zuwOz|G z-5j&ovPgHdv`+)w=rOQKB7z5*^92KC5dkA@=Etqmbbz2vD2*)=4`Hi-H>) zf`3MbGZMfy?3UPrVJ6x-Suhot%_T=FZn%N}zCq`9dk4rp( zD1l;RnhES$#~&#m!8? zQgn(*9Kb<_M=u06REwn|sl}H|xDFAK1^A;3Er>Was+3MhJfp4_r`76NiRbV<(a&4% z(;PZRI^$~Jlt`5K537wy2}`MY^Y&RwZKNd9u#5RQK8mo3!CTr+us1+`@He6=wCcY6MF8hm`k4xfrqME)>| z&T8Pz>f{6yl_g4ykWQ0#p1se`PFkl~{gVa9;WO8dp4DO6u};~!LcX*P#Bv2EX^q$_ zw~duuZCcz0TE79Q_=_ z;jbaWJu@)EA@2<8!_B@KG={rp&>a2>jaLv1cV9<{%P%SI#T)#tr4K+eS1qWc7Y+2I z86j4+Hu|@c4Q3V2Q(~xi1Kz}2T=6bd5b3d+Dc@BbVeNH|o+-b*dZs-0;cd?49eEYu zJKR|Tahq584b%z)s|{>3FsO_c6Y(w;-s8nWh3V;}nR-C9GZ-VvPxCC==dfO2ta}b! z0#}5elg$D*ux(tO_gu%0elKVBb09%`eO*1X*mV`l)nOMuk6y>>%f1tVcD%wMVqG9r84o5r)1y=axaMXiqm~8cj0&_^J z)~qJSl*ne=%{#err%Ict=@) z?Q9M&d2qf~T)Ta+CwguESA}hj#&&|3f}O!fB-az^2-cyWe;syXBVt4=jxHQ#Uq6Q) zqPhu}De(n1<2!7@O>D(2Y!fxuA(o+6w4hIf*uGaXk@vIqDNY&kTIgY#4Mj^!>5`liXYoy u{D~$_i|%>sEb_xMj}L? literal 0 HcmV?d00001 diff --git a/modules/MultiVizPlugin/target/classes/algorithms/basic/RandomLayout.class b/modules/MultiVizPlugin/target/classes/algorithms/basic/RandomLayout.class new file mode 100644 index 0000000000000000000000000000000000000000..af959abaf4fc2402da8729cad8115a28ecd6119d GIT binary patch literal 2663 zcmbtWTXR!Y6#jOa<~FowwZ)fu?ZJWHSP2HV~8uK?-a) zbD4r;yV==NG-a0TbacYZPZwqr=0c%N*_NESU^%09$u;w7OF)b%1+5Yruu(uN#kQFv zx8(@5C)SK7UB}L6Vv4(6ViPtCgsR-*g=uQqnkYD#XvQjL?P$g^i`l4Iw4>@y3vH3; zM3+FYRB&9azeMX(L2Sh~1J6io$Fqz!YvqcTQ;JU7SI@b2jyzHcSkpC;aJb@BnYYoC zW+{8hEXH~ooGDMAlh}#pnK2zTm2GOk7{o5@Hn2zHMT7;~bjtRQo<01amc`k#A`S#(6wIGSe*rJFCN4o zj!GQEC^KPQDVwS+9o0J28|=~Lj7yxrN#-hJRSJD3XQr)LD^K?a8&&UVl#Nxhtd+-e z1=EcM@jBixkdQc~+}^N;OnpyaT~d6LX0B{0P@R@IgEs|Q>BUhyld(!}1*b>;oeMqd z!&#|MN}ROE}&$sm==$#oGA=b>K*pY6nvS%}G0xH{G&BUCF24=x|+h z)kajuqyigWzg#1+k(j_}c&tvO);JpIUAI_MJ(G;+m~M6(5_aAiFVChd=d7tS(4Huy z&D^Bv*lJ%r^txG_Z)Hc~AG!8TPoU#_Ns3_}}UI&uQ>+emI1p zXL_C(Vqfs&*etwxog5M8Y)I9=xn|veD^EnG%Z|flpc^_HX3??c>_WLz-3OC}vXi#r zwt`h#{qWkWpv-eAd%spqBra7hb%E6;oL8&?3f56=Xu70iu zB6lGo+m>KN`j^lW>Gm$6Ez;pzLPz8dI&Psg(svKtOW1K6fk+?MA1UR7Aj`(Ck(W34KcEo1V1~L z@xlsv1Wxs>AS!SR4@tZta36!?yl-0p!8zdV?O(=`@3C2l^zvie!|`Q|4S3Z-|2>Qk z`4rXdBR!!m{Q6=UllL*Tf{Ow}Mz>KlaYIqs#_&*pd^GZoKzCpT?+c_l{c|n(#ZLd? z&q!am3u_sdX3{rPi-XOb-cEl@em#bo{NiA!JJ8j9a|M?@RN56Hl~+{762n=+6%TH& zI{k^;t07g)CSA-p+DIQ`sz0t z2p^J6|5*{lIbH0Fgu@bfKgDOH9`Fyw=cGcEpT`$0Y=GK-BRH)!Vmb0 zXMWoM9bXf~gn|fFA>$K%e8V%L3*QIdBed&!?|X!UBs`B1Vevf%_WgyMtJF*~zzaqt K@GZX{-1r-)WRQ0N literal 0 HcmV?d00001 diff --git a/modules/MultiVizPlugin/target/classes/algorithms/force/ForceAtlas2Layout.class b/modules/MultiVizPlugin/target/classes/algorithms/force/ForceAtlas2Layout.class new file mode 100644 index 0000000000000000000000000000000000000000..cb53cc8cae0344c3dc17dd0105a3f09683135d92 GIT binary patch literal 14341 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 literal 0 HcmV?d00001 diff --git a/modules/MultiVizPlugin/target/classes/algorithms/force/FruchtermanReingoldLayout.class b/modules/MultiVizPlugin/target/classes/algorithms/force/FruchtermanReingoldLayout.class new file mode 100644 index 0000000000000000000000000000000000000000..0c888c2f4d191fc3d818de420b08312e0d21f1f5 GIT binary patch literal 8454 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 literal 0 HcmV?d00001 diff --git a/modules/MultiVizPlugin/target/classes/helpers/LayoutAlgorithmProperty.class b/modules/MultiVizPlugin/target/classes/helpers/LayoutAlgorithmProperty.class new file mode 100644 index 0000000000000000000000000000000000000000..d6630ee4b3fc0475a8c7a614b608a56b8c45e778 GIT binary patch literal 1476 zcmah}-*3}a6#j1F*iPy~Ysk7np=k?Slm5t-LN}T&5W04n6b72BN*PbL$t7{;#+iMC z=sW)eue|WONwi2vLwnxeus>u^z`1tnLg_R`^8Jx>zVCeBIriUgU%vtH4YqPfA#Fgj zkb%xn*yE3Rc~|gWSbh-reG$lm&9*E3z!~)Wejpk2b+_lr8bf-%xMRR%7>klT-s_Yd z8MwWUi5$b|h8wgzQE2c3e;`d*3?n}TZacX+M==ezCwP!tjWOi5{GcW3(&M2Cn{rOh z6%!X3E^Y;bR#%E(pZ5ws3!?MAb{3yu!ocSiCUJ>jx+^@YJuJuMb+6+GuI%m~OQM=R zH&-o@hzYPLdexPg8O*P_QtAS@KH!HsBs%=jT5N zyuZ6gIMw1WIYPf?;X1xxFgrr-aBm<;;e7Ga=p5!zG*GgzfW?nIkKqVG`mz0|5#rmb zVq3OQ##a;@CTwSxw!@%p_-!iYylT-;gZ*6*Z1Y`@ZtRBN;@%DqTy-8^YO?E+&Y8yl zIA3KjNa;53M6MLi@SGvbj~m92c^sSaq0>VHX?`5ZTfg4p{iq5AA}p;66} z%H#b7l}s6h<~EfBP2E24G!1*)X`1#0=MedlJ$i`Ce?*uSdfJ2t%+hn3hNVEbb6BApD@Mi*+@ur3 zDt!QA)-tV%HB)+t{O`0$K>?|vKy!DJoJo>tXwOK#d^&mQ%w(FuVe&Jg(urh6G2dH! zQ%kREdF{$`TwBa*m9@-dX5lXwN0@#Ft2CJ*oiC7ms<9XE{!xO{QJt3}hzcf%Y>p}{ zlE6j!r-E-I`U1sGAWx^OWG|5oRjA!9tWhadx;=;VTZ|Z3XRPpV)Q0Z}B{rx+tMbAu z9bxVWU!In^9`VEmn~6s?+$MRdtuPTypJ}x6YGwQvx+~fQ_!Iw(2ok= zW(Xacf%naOyzl$weSLp?0_dR~BS0lW*gzFEK_}JOT)V|}qSm(X_u14s zP`fp`@pppC`Nb$gU2y!jXF%(~uJVN-?AsSDXeB1s55;V(-Lo2JR1On6QQ1g2Q}SOi z^r>OfN%GIU8$tYJ3pde2Qw}-W{&BbO>QyZj&JZzDd4!jths2J XKhQylQ|$BApp7QhCad6p7@)NQ{%1v< literal 0 HcmV?d00001 diff --git a/modules/MultiVizPlugin/target/classes/helpers/Point.class b/modules/MultiVizPlugin/target/classes/helpers/Point.class new file mode 100644 index 0000000000000000000000000000000000000000..88bb71623841946c9c1455f33ff584139e875a25 GIT binary patch literal 1398 zcmaJ=?M@Rx6g^YgZdtYz%9o%ZLeaJ&>ldOH!O)~?QkA3xCH@-9gf47%o82j~Z{ky! zXhafz_y9hX@y_lB3RKg~&fMF3&$;)^o!@^>e*sv*OC2%vX^0z0AjvRvz>m0Tb7$Xt zzk49+k|DWjIhI^w=*t(j`;kJw2Hn5_42E<=*e&7t=B8^o6w5x-s;Hnr0~r;;Iyzay z3O>t_$X6-~WE5i>#tls1+6B&9$Csi>RBoHl#;QRzmTPW$1YeV$;LTE&3ZF7?9XA*z zn*30dU8m0F2TL~Svb5ubT=IZhM=#xvu6uGS9RUPcB^z%n=a3V#H~(C z^a%gd6(0^;sr$wvh%&eBnk7Xkg=cDj*di-17;hX$cx9XWzVJ1yGAvwauUFL?Xpm?A zA4(%1wn#IQqUQlxF*WbOiKd!%4O9!V^qnVbM?E6iGsP3I;`}kRV(u8}Z$UzizFEZS zOV3O_ANmbK#{zj~!!+E+9kK`@pkcvD5yb+UWJI$}(ds{~I52R6p>ufkh=DYc1gv0< zFf4*)$fFQJn6xX1MDYi-uXKn()u$MM;jZMwS#q&wa{6-eSkL6USd5t0h)PwN4D`8N z`y{D36(Ed4QBS{$U^~UOwIn-gAux9>&r9@Q*5AZvdD8 literal 0 HcmV?d00001 diff --git a/modules/MultiVizPlugin/target/classes/helpers/VizUtils.class b/modules/MultiVizPlugin/target/classes/helpers/VizUtils.class new file mode 100644 index 0000000000000000000000000000000000000000..c2adbcaeab602f5f2603489a9d6cd965d82e31ad GIT binary patch literal 9252 zcmc&)33wdkd4B)ZF{{o51luw>AZbIB(9)J(^rrVgOOF(D8Tx+z%D8$7>Npje(GfT9^telIiK5X*)F&>zPhlshJ)t73+sS#tNpcTz)}OtOf+J- zLfB8zerqC5J!+_yBUI~D6zj6;ypWnftWZ!bL9FEAa0sig+Q1qUm!PG@b$Mltw4I7u zQHtH!;jwUV#!8RbcjW9u)b3ws-Pg>u;`~b&@cXXGX*+~=tTV9QL5L*gA$CL3Jpcxd6IHGyMd4_8!~Ynt|!juEN0%2tnD_jN7gDcu@kl| zjGEYs8yIKCbie(F*qGV1bF5 zID(_p)4>rFbwvp`PlQ95MZ!SRL<)B(G!_+PIdQqt>y?>gno4zg#ftK7o|nU~bKC%T zd0;mZOB}T)-E0jZjS6wlF%v%s;x8D>+Aj8&muNcdt}~t|aHoO0Ox%qhDgj-dgyzmz znZ1mucK9LL@gpWaBp9tsaM{3zOCrFs(Y8zcU5k5gpNad0vYHs!W9y|KGw~5w3UX;& z0xpqyz{F4BCn+J7qnypIKRlhqTlp3)K-JstJ@N8&Us!f$2tR{|3_NV&5qvaXlQg?g zD?3Ad(pF+J$x6gz*;#$8xuVezXbz91|rtjS4n;u9vmC~&VnY75wF@g$BJ__D&HBK){6o#>Q_)3UXi zjm3&*LYTu@15cay3ckwbG-JnE88SWNu@g739Z)x^86(zlJAI?Hs97eI!WJ)VT?~5T z#DdOR+dn)%m8BGX-NZ9eLqb!M{Tc}ksK7T&d=tM;&8%qDPEpEsuaxrS(AVB_S}5g% z$wVeMYp1odzh&Y%{3fA1l}zulqB9CDUas>uNx0YIJ0`x1=bgYFuw&CRRHxN{G#O4X zrC7iEJ9mcg+jzmi??|2d-I7kfGnvz4MPtWKuTPw1D!LXgio}nG@CW!q1Aip-=8yAz zS)*6POxx^bRUN~_ox_CYpq`)VSP1OBx!DOj?T#)DBgv>0AGgvm8D-qX%Ir*x!E6{Q z4{*Pek0aKE9aq@xZ==TUg(e=aQEu?1NN5dL`fk)L8SJQ@?3gybRPNlTu*Y99ZJiJD z{99UqTUFMX@|t~xI!wh`#YR;ysw(byYSCEMiXLUj)6@q3MPa31PjqB1=vf)Y`hB%< zmG$?m&21FuyHT^GXXBEzjQLW>4Bb-lxk?!6+pG}!xRb5N;+V-fg3vOjtaNt9&SWJ> z3d>6Ybv%^^)!2N_Tj%@CLnKMN)mLc^hi(1a2*;YS*mT0m=F${>+?%Yf@)s>)zKTAD zimii%Z%1r;y5NTaA7$P%_FTN1(Of#s8mcR*!iRiVz7O{Kr$b()e1VryO<|vpO8yAd z`{z5;i&$rVQ>dNrI`SbO5f^W@U-tbUR5WEGvnO?6m^B?fI_95z%2KJ4!xjgMMi0;n zqY&|287J!54LrAX^Wq)uQ!7vrE{D$aESF$)A31eo)Z_unRue7oZ$t_od{c$Pd};K1l}$$ zhkU&*Q^Kt}+BJ^WhB&`h4)0OQ+!)V zYC2%|i&Me2MtNBkv$D3%_pwwwmgN{%d;#M{ollKlxQ87YmY|vr`?y=?Yu!uHl{YgY zZXh#aACs9&@sW5@Ds3N&C36{f!@cjH>-9A0jx+z88JBz2&_F8-$vn3cHX*5Mhh50s zU(VtC6>v#2iGF^XAN3z7H9!ve`lUGNJ5JD!bSHR5aPoMDt6uF+-gZEZ%0HA|CVh+@bw@Ip z&1CsPdDPC%BquX<)#}QSx=LMbsLiI@qWbursyM>O633E9?Vb_sXYR13tSH|O^1WH@ ztoQ19*C{%_?j}dT_3RpPJJU9jOdidp{K~>SY0k#|oSD7kC0s9f(-C>$y9%WU%=U=Q8Ls4X5WQL`LN`K6s>$663}mimhhb;KXvf;C0_UNsCcZ3oQC=$PXhQ8 z{>p7&1^$%3rbB=~!=Ll227iIS zUP%2l{)SA1+26X%a;W6H5@5A3TN1!%_j727bTu?JgioQ_T@v;cTEhmCgC8D(XrYF! zXvU>lRExs|e}}*4eX^sdf1rpUKaKn&g$D3XTn$3Kjb;P?tW|i$&z@Fad)AlO^RM_f zEu?4Ch$eU# zQ4H3NJYRMH#2MUFv{^n00bR7VTdNUq1mIQtyH;ZW|DkQAQ2ZzUi`1?3&iCl_3j8-I zoJbCk{xx2m-Vxr+E|^tz}BzQm%ASDF-SWJ$`8|DAbC#v_eJUa<3@- zZ3;h+cU<8)swoI)CjjUQ{uVqD>CXG`R)zbIlz7EaV3Q~M?F9we@h+_wEVpY_0vYm-qj(Jro^NJkwh*6vL~B2;-sWW&mx(q*i z^udOon;PnFpTna8beFBq;THoq`R=n)ZX7qPWWfP;U?m3m5_l(iu?s`|Gt5swQi3F@ zBYemEh+4$6m4v@k5&`ONwU{n|C#$LZ^J%q?IwD99X3I#i-7QO0nUfjQXO!vX}bgDb3iTQ znv>v8K@fTgxKJ%sjT-(!Uq@pd`bN?_p|3cPdL8-`Z(&%ffD`)V^iq>r;dm*qjA5!J zyK`NARRr;`&EZQ5ebwP=*GDhQnfB4DK4bNxn2Lmre7+JYeZg?hr5u(s2Q7Uy;Tm1| zHiyE-a|m^P3zwXP88%ohpLz^Sn?jLrRb%BDoH>QBO^~RjDdZyO$&;AwcJ>DIdslh( z)_Znt4wfmS#p=*rDhjyDgu?uzSvCbHTrn?&jlQar?=}~4x|`qGSrq8K18Bp|{H%FU z$L;`bK^(W@F5Hg$7_SFl;bBbRael0O3O1uUg;!WyUqy^%`3R$PR7W~Rw;te!}b)T9@TdCMubt&&iL7(BeC>Cyh6pJGS&$k1t5-rpvJ0e)P6OtZbtZj06qP>nE(I) literal 0 HcmV?d00001 diff --git a/modules/MultiVizPlugin/target/classes/multiviz/MLVBuilder$1.class b/modules/MultiVizPlugin/target/classes/multiviz/MLVBuilder$1.class new file mode 100644 index 0000000000000000000000000000000000000000..bea47a05cd13bd1aa37041db039cac21879c591c GIT binary patch literal 1089 zcma)4T~pIQ6g``kri2K!fZzuzTC^=_WSr55I?O1_SPcl&_B~B^+Ql^K|3(0eFgyX(-64$m^IwfnjkNIiWZfpN(C! z^CA*XkNcHPhC(V zt#yi+Wq^tj!;0tkjXoa@1mRD-C^UkRFwA(_ZZa%aGYi%_4Eb%Z#~J2K;qtv`*ya9v ztLspvY%dk+bnde4Yp)cG%;Z(vk z?Qy^-Blt*rhRmiyEioK9eBW}p!|=FjPH@>ss+@|viAf|=NajH!n#fKXKZq zJdZ{6WIGjMxQc5jbt9!J>>_h#jH#S4uj59_d_qwg_?P*1tnpK(>}mx!<7&5PJjoEw psw-bE^u3>1ef2+>?F?ofcVhj!s8Gyf4fj!xGiz9htf0TD zJ_#-K2lPjk-iaZJ8hp7QbI&>VgZcaK*B=0%vE^b0mW`5!GG+;j=i*ZMu}C8STlZY{ zG-39uN|fFsSdC^lhdIJ}yNI=_1>#C(wNT}Sh}E^wDot#-gw?(&U#e@r9fbRZice*> z^}&S$&vbc4SZf4RFuTprMukut*No7h&Al!z7U0>a5|+o%Q7aoOgv~UI{77D$DPHC( zEwrCsD4(S`9F9aN9i*p{Pzh8bJ4L@Mv+trC^Gh{Idm;`+rc6G3Ea@|q^LA55C)knH z9noj@N~0N!&v>LWl|;LQG6RlVggTd>nC`g6*!iwG+ugW?ji(umcaPE{>&Zi9rmu|8 z{@%>NavhoLwlo{^23{*kWOfjXJeN7@SmH0hr{w=oV$a`z?J8$JdtzVSz6ITIFoWl8 zO&R!v7i_&d0M@Y18Q~>fu{Go!_6BEF?Vs!>sb40j)`JcMx#^{0I0ss;2+| literal 0 HcmV?d00001 diff --git a/modules/MultiVizPlugin/target/classes/multiviz/MultiLayerVisualization.class b/modules/MultiVizPlugin/target/classes/multiviz/MultiLayerVisualization.class new file mode 100644 index 0000000000000000000000000000000000000000..b1e0a376f444e95880e54144f118b6fd0783c311 GIT binary patch literal 17629 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 literal 0 HcmV?d00001 diff --git a/modules/MultiVizPlugin/target/classes/multiviz/Readme.class b/modules/MultiVizPlugin/target/classes/multiviz/Readme.class new file mode 100644 index 0000000000000000000000000000000000000000..8dceace74e498f8bea5027b3ee5fcacdb52d90fc GIT binary patch literal 261 zcmZ8b%MQU%5Is|^Qjg*f?6AH6)1rZQXFCkEB`)e`O`H@Buzb%*Dz~a?YGH znaO#+?hgPXv>X^H*)Z#{P$smF;w-#KBztce9A%gj$`h5Sd`c+w`db?nf*Ti6uFmS> zt)$q+l3>o#9h2*;L@tUrkl98A5j!0}4MnsSnbP`an)yMU2yOrG&zRt>(;^GyT4b-@S`e(M78>|RTMg#5}cegY% literal 0 HcmV?d00001 diff --git a/modules/MultiVizPlugin/target/maven-archiver/pom.properties b/modules/MultiVizPlugin/target/maven-archiver/pom.properties new file mode 100644 index 0000000000..5502214135 --- /dev/null +++ b/modules/MultiVizPlugin/target/maven-archiver/pom.properties @@ -0,0 +1,3 @@ +artifactId=multiviz +groupId=amrita +version=1.0.0 diff --git a/modules/MultiVizPlugin/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/modules/MultiVizPlugin/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst new file mode 100644 index 0000000000..676dbcf097 --- /dev/null +++ b/modules/MultiVizPlugin/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -0,0 +1,18 @@ +helpers\CustomComboBoxEditor.class +helpers\Point.class +multiviz\MultiLayerVisualization.class +multiviz\MLVBuilder.class +algorithms\basic\RandomLayout.class +multiviz\Readme.class +META-INF\services\org.gephi.layout.spi.LayoutBuilder +helpers\LayoutDropDowns.class +algorithms\force\FruchtermanReingoldLayout.class +algorithms\basic\GridLayout.class +algorithms\basic\CircleLayout.class +helpers\VizUtils.class +algorithms\force\ForceAtlasLayout.class +algorithms\force\ForceAtlas2Layout.class +algorithms\basic\LinearLayout.class +helpers\AbstractProjectionPropertyEditor.class +helpers\LayoutAlgorithmProperty.class +multiviz\MLVBuilder$1.class diff --git a/modules/MultiVizPlugin/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/modules/MultiVizPlugin/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst new file mode 100644 index 0000000000..deee2f0521 --- /dev/null +++ b/modules/MultiVizPlugin/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -0,0 +1,16 @@ +F:\New folder (2)\gephi-plugins\modules\MultiVizPlugin\src\main\java\multiviz\Readme.java +F:\New folder (2)\gephi-plugins\modules\MultiVizPlugin\src\main\java\algorithms\basic\CircleLayout.java +F:\New folder (2)\gephi-plugins\modules\MultiVizPlugin\src\main\java\algorithms\basic\RandomLayout.java +F:\New folder (2)\gephi-plugins\modules\MultiVizPlugin\src\main\java\algorithms\force\ForceAtlas2Layout.java +F:\New folder (2)\gephi-plugins\modules\MultiVizPlugin\src\main\java\algorithms\basic\LinearLayout.java +F:\New folder (2)\gephi-plugins\modules\MultiVizPlugin\src\main\java\helpers\LayoutAlgorithmProperty.java +F:\New folder (2)\gephi-plugins\modules\MultiVizPlugin\src\main\java\multiviz\MultiLayerVisualization.java +F:\New folder (2)\gephi-plugins\modules\MultiVizPlugin\src\main\java\algorithms\force\FruchtermanReingoldLayout.java +F:\New folder (2)\gephi-plugins\modules\MultiVizPlugin\src\main\java\helpers\VizUtils.java +F:\New folder (2)\gephi-plugins\modules\MultiVizPlugin\src\main\java\helpers\Point.java +F:\New folder (2)\gephi-plugins\modules\MultiVizPlugin\src\main\java\helpers\CustomComboBoxEditor.java +F:\New folder (2)\gephi-plugins\modules\MultiVizPlugin\src\main\java\helpers\LayoutDropDowns.java +F:\New folder (2)\gephi-plugins\modules\MultiVizPlugin\src\main\java\helpers\AbstractProjectionPropertyEditor.java +F:\New folder (2)\gephi-plugins\modules\MultiVizPlugin\src\main\java\algorithms\force\ForceAtlasLayout.java +F:\New folder (2)\gephi-plugins\modules\MultiVizPlugin\src\main\java\algorithms\basic\GridLayout.java +F:\New folder (2)\gephi-plugins\modules\MultiVizPlugin\src\main\java\multiviz\MLVBuilder.java diff --git a/modules/MultiVizPlugin/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst b/modules/MultiVizPlugin/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst new file mode 100644 index 0000000000..e69de29bb2 diff --git a/modules/MultiVizPlugin/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst b/modules/MultiVizPlugin/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst new file mode 100644 index 0000000000..e69de29bb2 diff --git a/modules/MultiVizPlugin/target/multiviz-1.0.0.jar b/modules/MultiVizPlugin/target/multiviz-1.0.0.jar new file mode 100644 index 0000000000000000000000000000000000000000..f79a983e052f5507d6e827522b169d9f6255bec1 GIT binary patch literal 40873 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 literal 0 HcmV?d00001 diff --git a/modules/MultiVizPlugin/target/multiviz-1.0.0.nbm b/modules/MultiVizPlugin/target/multiviz-1.0.0.nbm new file mode 100644 index 0000000000000000000000000000000000000000..1d473c8fb3482e2378b8f383465b4a3469ffabe9 GIT binary patch literal 40296 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 z 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 literal 0 HcmV?d00001 diff --git a/modules/MultiVizPlugin/target/nbm/multiviz-1.0.0.nbm b/modules/MultiVizPlugin/target/nbm/multiviz-1.0.0.nbm new file mode 100644 index 0000000000000000000000000000000000000000..1d473c8fb3482e2378b8f383465b4a3469ffabe9 GIT binary patch literal 40296 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 z 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 literal 0 HcmV?d00001 diff --git a/modules/MultiVizPlugin/target/nbm/netbeans/plugins/config/Modules/amrita-multiviz.xml b/modules/MultiVizPlugin/target/nbm/netbeans/plugins/config/Modules/amrita-multiviz.xml new file mode 100644 index 0000000000..350ccd1b5c --- /dev/null +++ b/modules/MultiVizPlugin/target/nbm/netbeans/plugins/config/Modules/amrita-multiviz.xml @@ -0,0 +1,10 @@ + + + + false + false + true + modules/amrita-multiviz.jar + false + diff --git a/modules/MultiVizPlugin/target/nbm/netbeans/plugins/modules/amrita-multiviz.jar b/modules/MultiVizPlugin/target/nbm/netbeans/plugins/modules/amrita-multiviz.jar new file mode 100644 index 0000000000000000000000000000000000000000..f79a983e052f5507d6e827522b169d9f6255bec1 GIT binary patch literal 40873 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 literal 0 HcmV?d00001 diff --git a/modules/MultiVizPlugin/target/nbm/netbeans/plugins/update_tracking/amrita-multiviz.xml b/modules/MultiVizPlugin/target/nbm/netbeans/plugins/update_tracking/amrita-multiviz.xml new file mode 100644 index 0000000000..e03b387ebb --- /dev/null +++ b/modules/MultiVizPlugin/target/nbm/netbeans/plugins/update_tracking/amrita-multiviz.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/pom.xml b/pom.xml index 2403d9e1f5..6643c7f785 100644 --- a/pom.xml +++ b/pom.xml @@ -12,6 +12,7 @@ + modules/MultiVizPlugin @@ -218,5 +219,4 @@ - - + \ No newline at end of file From ca871850424aea514b419918853b3818a7eabd90 Mon Sep 17 00:00:00 2001 From: JSiv Date: Tue, 25 Oct 2022 19:15:08 +0300 Subject: [PATCH 02/16] Update README.md --- modules/MultiVizPlugin/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/MultiVizPlugin/README.md b/modules/MultiVizPlugin/README.md index f935d66cd5..5921a28cc4 100644 --- a/modules/MultiVizPlugin/README.md +++ b/modules/MultiVizPlugin/README.md @@ -1,4 +1,4 @@ ## MultiVizPlugin -This README supports Markdown, see [syntax](https://help.github.com/articles/markdown-basics/) - +MultiViz: A Gephi Plugin for Scalable Visualization of Multi-Layer Networks +https://arxiv.org/abs/2209.03149 From 597d6e22182cde1f423f6d3420929150d2aa4e84 Mon Sep 17 00:00:00 2001 From: JSiv Date: Tue, 25 Oct 2022 19:30:26 +0300 Subject: [PATCH 03/16] Delete unecessary files #1 --- .../target/classes/META-INF/MANIFEST.MF | 16 ---------------- .../org.gephi.layout.spi.LayoutBuilder | 1 - .../algorithms/basic/CircleLayout.class | Bin 3189 -> 0 bytes .../classes/algorithms/basic/GridLayout.class | Bin 3108 -> 0 bytes .../algorithms/basic/LinearLayout.class | Bin 2757 -> 0 bytes .../algorithms/basic/RandomLayout.class | Bin 2663 -> 0 bytes .../algorithms/force/ForceAtlas2Layout.class | Bin 14341 -> 0 bytes .../algorithms/force/ForceAtlasLayout.class | Bin 7152 -> 0 bytes .../force/FruchtermanReingoldLayout.class | Bin 8454 -> 0 bytes .../AbstractProjectionPropertyEditor.class | Bin 2015 -> 0 bytes .../helpers/CustomComboBoxEditor.class | Bin 1125 -> 0 bytes .../helpers/LayoutAlgorithmProperty.class | Bin 1476 -> 0 bytes .../classes/helpers/LayoutDropDowns.class | Bin 305 -> 0 bytes .../target/classes/helpers/Point.class | Bin 1398 -> 0 bytes .../target/classes/helpers/VizUtils.class | Bin 9252 -> 0 bytes .../classes/multiviz/MLVBuilder$1.class | Bin 1089 -> 0 bytes .../target/classes/multiviz/MLVBuilder.class | Bin 822 -> 0 bytes .../multiviz/MultiLayerVisualization.class | Bin 17629 -> 0 bytes .../target/classes/multiviz/Readme.class | Bin 261 -> 0 bytes .../target/maven-archiver/pom.properties | 3 --- .../compile/default-compile/createdFiles.lst | 18 ------------------ .../compile/default-compile/inputFiles.lst | 16 ---------------- .../default-testCompile/createdFiles.lst | 0 .../default-testCompile/inputFiles.lst | 0 .../MultiVizPlugin/target/multiviz-1.0.0.jar | Bin 40873 -> 0 bytes .../MultiVizPlugin/target/multiviz-1.0.0.nbm | Bin 40296 -> 0 bytes .../target/nbm/multiviz-1.0.0.nbm | Bin 40296 -> 0 bytes .../config/Modules/amrita-multiviz.xml | 10 ---------- .../plugins/modules/amrita-multiviz.jar | Bin 40873 -> 0 bytes .../update_tracking/amrita-multiviz.xml | 6 ------ 30 files changed, 70 deletions(-) delete mode 100644 modules/MultiVizPlugin/target/classes/META-INF/MANIFEST.MF delete mode 100644 modules/MultiVizPlugin/target/classes/META-INF/services/org.gephi.layout.spi.LayoutBuilder delete mode 100644 modules/MultiVizPlugin/target/classes/algorithms/basic/CircleLayout.class delete mode 100644 modules/MultiVizPlugin/target/classes/algorithms/basic/GridLayout.class delete mode 100644 modules/MultiVizPlugin/target/classes/algorithms/basic/LinearLayout.class delete mode 100644 modules/MultiVizPlugin/target/classes/algorithms/basic/RandomLayout.class delete mode 100644 modules/MultiVizPlugin/target/classes/algorithms/force/ForceAtlas2Layout.class delete mode 100644 modules/MultiVizPlugin/target/classes/algorithms/force/ForceAtlasLayout.class delete mode 100644 modules/MultiVizPlugin/target/classes/algorithms/force/FruchtermanReingoldLayout.class delete mode 100644 modules/MultiVizPlugin/target/classes/helpers/AbstractProjectionPropertyEditor.class delete mode 100644 modules/MultiVizPlugin/target/classes/helpers/CustomComboBoxEditor.class delete mode 100644 modules/MultiVizPlugin/target/classes/helpers/LayoutAlgorithmProperty.class delete mode 100644 modules/MultiVizPlugin/target/classes/helpers/LayoutDropDowns.class delete mode 100644 modules/MultiVizPlugin/target/classes/helpers/Point.class delete mode 100644 modules/MultiVizPlugin/target/classes/helpers/VizUtils.class delete mode 100644 modules/MultiVizPlugin/target/classes/multiviz/MLVBuilder$1.class delete mode 100644 modules/MultiVizPlugin/target/classes/multiviz/MLVBuilder.class delete mode 100644 modules/MultiVizPlugin/target/classes/multiviz/MultiLayerVisualization.class delete mode 100644 modules/MultiVizPlugin/target/classes/multiviz/Readme.class delete mode 100644 modules/MultiVizPlugin/target/maven-archiver/pom.properties delete mode 100644 modules/MultiVizPlugin/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst delete mode 100644 modules/MultiVizPlugin/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst delete mode 100644 modules/MultiVizPlugin/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst delete mode 100644 modules/MultiVizPlugin/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst delete mode 100644 modules/MultiVizPlugin/target/multiviz-1.0.0.jar delete mode 100644 modules/MultiVizPlugin/target/multiviz-1.0.0.nbm delete mode 100644 modules/MultiVizPlugin/target/nbm/multiviz-1.0.0.nbm delete mode 100644 modules/MultiVizPlugin/target/nbm/netbeans/plugins/config/Modules/amrita-multiviz.xml delete mode 100644 modules/MultiVizPlugin/target/nbm/netbeans/plugins/modules/amrita-multiviz.jar delete mode 100644 modules/MultiVizPlugin/target/nbm/netbeans/plugins/update_tracking/amrita-multiviz.xml diff --git a/modules/MultiVizPlugin/target/classes/META-INF/MANIFEST.MF b/modules/MultiVizPlugin/target/classes/META-INF/MANIFEST.MF deleted file mode 100644 index 7044d6e6e6..0000000000 --- a/modules/MultiVizPlugin/target/classes/META-INF/MANIFEST.MF +++ /dev/null @@ -1,16 +0,0 @@ -Manifest-Version: 1.0 -OpenIDE-Module-Name: MultiVizPlugin -OpenIDE-Module-Short-Description: multi layer visualization -OpenIDE-Module-Long-Description: visualizes multilayer complex network - s -OpenIDE-Module-Display-Category: Layout -OpenIDE-Module-Specification-Version: 1.0.0 -OpenIDE-Module-Implementation-Version: 1.0.0 -OpenIDE-Module-Build-Version: 202210251537 -OpenIDE-Module: amrita.multiviz -OpenIDE-Module-Public-Packages: - -OpenIDE-Module-Requires: org.openide.modules.ModuleFormat1 -OpenIDE-Module-Module-Dependencies: org.gephi.layout.api > 0.9.3, org. - gephi.graph.api > 0.9.3, org.gephi.layout.plugin > 0.9.3, org.gephi.u - i.utils > 0.9.3 - diff --git a/modules/MultiVizPlugin/target/classes/META-INF/services/org.gephi.layout.spi.LayoutBuilder b/modules/MultiVizPlugin/target/classes/META-INF/services/org.gephi.layout.spi.LayoutBuilder deleted file mode 100644 index a6faa3bb63..0000000000 --- a/modules/MultiVizPlugin/target/classes/META-INF/services/org.gephi.layout.spi.LayoutBuilder +++ /dev/null @@ -1 +0,0 @@ -multiviz.MLVBuilder diff --git a/modules/MultiVizPlugin/target/classes/algorithms/basic/CircleLayout.class b/modules/MultiVizPlugin/target/classes/algorithms/basic/CircleLayout.class deleted file mode 100644 index fb7749bd1560f9781b643d4cd7951495afd0dbc5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3189 zcmbtXTXS3075=s?=}7XnVi`G>2s9)m!B*@jkOVBtbsS<$9260d<0PgHJw85>PAp5} z=qR<*%g~n6DG;Eg7XqcF7wTkq>P($Ry)cx%<)IJ#5uNE{r%#jy_uEHOEQ6ubsb_Nb z+H0@d{?^)SDK|d+-8%ptz|{~u=+NMm@WC(8eO|wyCyRP1pL}%gylFTB{!y!BIb#AH z{R1;W1Q65^lIVmKxKl6Y%eLhd7OTlQy=ocBBbIFx&5XWWu2EMiRZA~&Z`uMqnRW9y z$F@rOv@#f$*n)0>&Zcy>JZ}ozo+;b;WZtY4tYqHSD}|(9v6AX69YPOo(-4*D#a0Gg zFpCw_t|n)!izgkcSf%4?*>=o%*DtsI{SD7Go+gj#)xvSTk{;NEr^1Oz#Bn<>UQ|(2 z`?gOIyhGwnd`6(l6`ZiDj$SetxtI#!F6_{-Q{uC@TOi_IyWKghFPO_YlNd$%+XEph z-HF|}M?=5F01`C6uI(xWEXTBUr%XV%ZqS`-@@ZfYLmKu^Y`0ZITEqPtilmXnP7EWZVMHR0QGwVeC63T6yZ$CaIEXQc zLl`F#=2JCYC9SuarFMq{vntsSN*uuivC5l{o6{3T-7pu;62nhzmfMdP+Ef!|*Z5?y ztUD~DNj$9KsKk^Cd&_!py5|C+b4qSTFV;+z(MKdQIL-?&3W435Mcd}L@qUQdqXOae z3}jd)oyg)biN}#6+Ewc!YlcafQtXq;$Be>aL%>aA3h2`kXH>XiN$sAH_&mO#%$Uw; zF8z}OGm8JD#1~uqGm0@MVYq4+)y|YS*E(kMv$#ibEfv$Kq822ISZn}3&2l(lm-)gR z%Ve5%voJQx@J2ZnVHp(-Pf6Iy@6P|OA`l?5r>uFW;6L=w{rkt+qBLA+!RKb~xX#1z z;EoTbCx&AF@pyw!A%8{UtE$>Ht2${dne+Zb?>7!ZsNw4p-@rEsvr*;^y!{gc6N>#U ziDzAQ)hhXwJM||J%vt%8?$m51Cin5jKiZb%W*ci0QVAa26d<>EjitxZ0u%jHZ7Qvf zw29r#P;>3f4zNnRN8DDqC1aJ$Y;AGQw5RpCBBSoflnuQ&quZ9+H<@0iVDa|bGoRYE z8C^(q&sOggv+Oe)%`I12CcAQuZY;2yHeEck*}eX6y#8lgd~C%w->A3b;?tqq1|JL? zh-ZF@#H1qFiMk9l@(>C449hkTDMU!1rz~>Z9M`tNG=3-^KK?jtzocmmTiX@iZ zZCO-_CwS7R*|gWdk3K54dBG~zsxF=agCEiO)KXz8a^;$Bn3I;uYNUO-?o~YnJ2mXjF z#8|@vUc$@V(U%&Vj8su7W)*+Jjkd$3RJ>l7`Yyi5SYIJ6Z^^5heV?2dJZp62*ANgI z?$U5j!!V6{n+W`X8b73Gq3+qSL~1MF_IrunK+EvccMaR?*d=g$u#P!@Se zLp#F_Gp7XVm}Pp_5Bj`yoZY}_h_c}7nD<~s^o3J?Wi&4^5{L&HA!4th+!%*Pf-!$Q zSVuwqKv2YarCSo1yJV#ND{Fs=`J<>Vr2K0AQaKffVman7r$XVB45z{^+uiZ*rtP;B z)wCUnN9y>pz-xFxQS_mfmWQs=+@(}F7FPCSp@mdWED)2i9wUmc8Q1aj!pp7@h}zO59Lo{^IA$Sr*OqH_(1B7NSzUeXGj=J72|)=mv&Rz93wufJzm{b1+!A%$HS zVFjkS8|5?~!wi30=orUE9A^F>#1%~7Z9IebV!CCPqJn7c>tE~PTxC1|8 z?FOl7;#FKm5A}0I@pVLL-99`e?@uq zdI|{MM34Ju25;hi5}tqKtcL7Obn^cLga5*THU12hd|eG8CBfqk^~ZDI16)~C&EumI Sz#5~YtWu;Wffar|xbh#fIrpsq diff --git a/modules/MultiVizPlugin/target/classes/algorithms/basic/GridLayout.class b/modules/MultiVizPlugin/target/classes/algorithms/basic/GridLayout.class deleted file mode 100644 index f058a02a3f01d6f4b2ea134f4c3b09cfd9621a09..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3108 zcmbtVTXS1i75=s^KJwAF9bc3v4W$=yu@t*%LUAL@xK3)EI+dMJrGmJn&9Qtc9Y>Lz zqoX8FA%!+g+6MOm^kTPkrh&oC@Wc!bHV;gnnc<;-pg*9)1J9ij^X)BZEEBr}gT~%x z?X}lhdtJV@_TTRO<*xu9#jj2H;5QJE2%<$`$E$|a`ATBisyMmCao3qiTl3{AHQS2TyzP!U70)W=YymN@ z)Y~OGutPv9vyN4ywCxIXr8ln5c&<~*r<8P;L^pZ_!gcA%@(eBAlPXoRd&zT4|@mE<^>)O4;?a{R(fNGI0;~82E<7z4#_$E!f35+pQ$B&XuPzPsXNjfPfVlbgv66bvlR4QgW^=t%Gu}b60?*1@7y1+7f~A@E0!%UWnvO14V;qr zzH+-`1Ni!!xP3v%Wvyb>R)EP!oW|1(fL;jf-^$yjwAK2S1^EGUzER*b+c1nQ&PYt* z85XnRTwy1%#^WY_gy#%AFL4%DLrMEPVR;25dcozzf!@*BsFKY|%z(Nj0?TVFZilsgX?oMIgvBkwD6;4s*=De!mrbO41&@#d)r+x}4 z7bIMjZ*f`eJc%kUs^Dzzhbo4#SXS{bOUyU;XB6W_i63jVD{6OD;-$v%lt637$(Jmz z>M|XfyZe3U?pT_HR7r-mNB3}QI3+OJJKm(y7(!dv-8P?7u`J_zTo2BUv{SMttLLX} z_p~)#q}N^Pa?UDdE!R=|Iy2xE95%+i>93jZ^lj&6-TAqOep|+~a_2ZL>-Mf~6~zCY zoc}oqLB2#9$t9f(U+FT@Kt%XT91lK^JD*2N%<`Ww4o^3aD>23_y5&pEOCVQPbE8#H z`WnV%uIjp+3wla$G|##AMWRMS7>o^Ph6`5NjkA2|JG8{%c2zrx+;{I>9WIR0md_?{IQ@%|OG#dil*&>4>e zR}hK+36Vv#$NN^Xdj(AE)^t z4C7Tw4cBhNb==^N_iFEjrj-9Gro-BEzowM$0Zl3IgLsX!WRyzk0jMZnCmn@vo!7J& z2nhpw4I~YWP$*E(#v9bQ$(x0W*+0qLMF6qP$lB6e?z@d|tsy2b(YJ<#z@m7Q#CHTf zMRHP|_pc%~7$DWThQ|bs1P}J##`l)cqYe*pF;+2t8xu!@TKYDg`V`qUa7f%(#j~rJ zel2izpyg}M40X0Uz_rN+xAJECpL&RxL;{zW^u z5AqIXU`}8m+O|RGbM3ig=Q8$gur?p>FeBl@4a)46(ayKmQ1O9O zH>pdCs;ONOSi?_zxE2=6>)qE(uKxb?@}05*nqLF0ggvB>5(dYxj}LePqlDQQcgK;z z36%Nt-b5N7^R@gvPU7!;Ex+K&I!=pjWW_E%a0hTk9Kw`1g=fVDJSSen^Ws&U74PDt z_z;ug6Xe8iFe82kTLbn3g7FLd0Y4`YB`v*&1-ywi+Ityqk?Nq;t9YAKCvBJT4ykU+ z{}aEUd>Ee)hQB0b5?CI7rQtj%9D4sQ<0y+qXi*ZHH$@chlQQtJ2;u`;31OeOibXat zTR|+>TP7%OVTnAUf&U6x|Aj7%_lNIbqy~KU!URnALXBT%3gM?KU!hg3ij)AN?Ct_~sn| diff --git a/modules/MultiVizPlugin/target/classes/algorithms/basic/LinearLayout.class b/modules/MultiVizPlugin/target/classes/algorithms/basic/LinearLayout.class deleted file mode 100644 index 246a30139be37c6c7a4f30a003d79b62fc386ed4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2757 zcmbtWTXR!Y6#jOa3it=@tnCg7)O2*l>rjh20|AL3q`)dO zlgc@^o1V%?5@y~`Mxu7sGM%V-CRd=YRI0X_;o5QpnxYHlW3FRoQv=H25{U*Z6$qB3 z$8(dGKwC8Dq#`M6I&DW%jyau3K$7 z%k5>wdke0eiR?A==`nM9Ab>WkG;p89D%{V&(^h7h!jZUr_8{e`C6#4svTVDfql%Tz zDtiH}#u@`_B_6;!fkqv3<=yn`gmornF+q(Tl@_=)5X1&-G|(Z@iLgNZg0@zuwOz|G z-5j&ovPgHdv`+)w=rOQKB7z5*^92KC5dkA@=Etqmbbz2vD2*)=4`Hi-H>) zf`3MbGZMfy?3UPrVJ6x-Suhot%_T=FZn%N}zCq`9dk4rp( zD1l;RnhES$#~&#m!8? zQgn(*9Kb<_M=u06REwn|sl}H|xDFAK1^A;3Er>Was+3MhJfp4_r`76NiRbV<(a&4% z(;PZRI^$~Jlt`5K537wy2}`MY^Y&RwZKNd9u#5RQK8mo3!CTr+us1+`@He6=wCcY6MF8hm`k4xfrqME)>| z&T8Pz>f{6yl_g4ykWQ0#p1se`PFkl~{gVa9;WO8dp4DO6u};~!LcX*P#Bv2EX^q$_ zw~duuZCcz0TE79Q_=_ z;jbaWJu@)EA@2<8!_B@KG={rp&>a2>jaLv1cV9<{%P%SI#T)#tr4K+eS1qWc7Y+2I z86j4+Hu|@c4Q3V2Q(~xi1Kz}2T=6bd5b3d+Dc@BbVeNH|o+-b*dZs-0;cd?49eEYu zJKR|Tahq584b%z)s|{>3FsO_c6Y(w;-s8nWh3V;}nR-C9GZ-VvPxCC==dfO2ta}b! z0#}5elg$D*ux(tO_gu%0elKVBb09%`eO*1X*mV`l)nOMuk6y>>%f1tVcD%wMVqG9r84o5r)1y=axaMXiqm~8cj0&_^J z)~qJSl*ne=%{#err%Ict=@) z?Q9M&d2qf~T)Ta+CwguESA}hj#&&|3f}O!fB-az^2-cyWe;syXBVt4=jxHQ#Uq6Q) zqPhu}De(n1<2!7@O>D(2Y!fxuA(o+6w4hIf*uGaXk@vIqDNY&kTIgY#4Mj^!>5`liXYoy u{D~$_i|%>sEb_xMj}L? diff --git a/modules/MultiVizPlugin/target/classes/algorithms/basic/RandomLayout.class b/modules/MultiVizPlugin/target/classes/algorithms/basic/RandomLayout.class deleted file mode 100644 index af959abaf4fc2402da8729cad8115a28ecd6119d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2663 zcmbtWTXR!Y6#jOa<~FowwZ)fu?ZJWHSP2HV~8uK?-a) zbD4r;yV==NG-a0TbacYZPZwqr=0c%N*_NESU^%09$u;w7OF)b%1+5Yruu(uN#kQFv zx8(@5C)SK7UB}L6Vv4(6ViPtCgsR-*g=uQqnkYD#XvQjL?P$g^i`l4Iw4>@y3vH3; zM3+FYRB&9azeMX(L2Sh~1J6io$Fqz!YvqcTQ;JU7SI@b2jyzHcSkpC;aJb@BnYYoC zW+{8hEXH~ooGDMAlh}#pnK2zTm2GOk7{o5@Hn2zHMT7;~bjtRQo<01amc`k#A`S#(6wIGSe*rJFCN4o zj!GQEC^KPQDVwS+9o0J28|=~Lj7yxrN#-hJRSJD3XQr)LD^K?a8&&UVl#Nxhtd+-e z1=EcM@jBixkdQc~+}^N;OnpyaT~d6LX0B{0P@R@IgEs|Q>BUhyld(!}1*b>;oeMqd z!&#|MN}ROE}&$sm==$#oGA=b>K*pY6nvS%}G0xH{G&BUCF24=x|+h z)kajuqyigWzg#1+k(j_}c&tvO);JpIUAI_MJ(G;+m~M6(5_aAiFVChd=d7tS(4Huy z&D^Bv*lJ%r^txG_Z)Hc~AG!8TPoU#_Ns3_}}UI&uQ>+emI1p zXL_C(Vqfs&*etwxog5M8Y)I9=xn|veD^EnG%Z|flpc^_HX3??c>_WLz-3OC}vXi#r zwt`h#{qWkWpv-eAd%spqBra7hb%E6;oL8&?3f56=Xu70iu zB6lGo+m>KN`j^lW>Gm$6Ez;pzLPz8dI&Psg(svKtOW1K6fk+?MA1UR7Aj`(Ck(W34KcEo1V1~L z@xlsv1Wxs>AS!SR4@tZta36!?yl-0p!8zdV?O(=`@3C2l^zvie!|`Q|4S3Z-|2>Qk z`4rXdBR!!m{Q6=UllL*Tf{Ow}Mz>KlaYIqs#_&*pd^GZoKzCpT?+c_l{c|n(#ZLd? z&q!am3u_sdX3{rPi-XOb-cEl@em#bo{NiA!JJ8j9a|M?@RN56Hl~+{762n=+6%TH& zI{k^;t07g)CSA-p+DIQ`sz0t z2p^J6|5*{lIbH0Fgu@bfKgDOH9`Fyw=cGcEpT`$0Y=GK-BRH)!Vmb0 zXMWoM9bXf~gn|fFA>$K%e8V%L3*QIdBed&!?|X!UBs`B1Vevf%_WgyMtJF*~zzaqt K@GZX{-1r-)WRQ0N diff --git a/modules/MultiVizPlugin/target/classes/algorithms/force/ForceAtlas2Layout.class b/modules/MultiVizPlugin/target/classes/algorithms/force/ForceAtlas2Layout.class deleted file mode 100644 index cb53cc8cae0344c3dc17dd0105a3f09683135d92..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14341 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 diff --git a/modules/MultiVizPlugin/target/classes/algorithms/force/FruchtermanReingoldLayout.class b/modules/MultiVizPlugin/target/classes/algorithms/force/FruchtermanReingoldLayout.class deleted file mode 100644 index 0c888c2f4d191fc3d818de420b08312e0d21f1f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8454 zcmcIp3wRXQb^h;ac1K!`K*)d)U}n+> zu-mWShj#8gbMLw5{{K1Wp1FMEy$de`*r@IeBY->;hJ_$P3dKYAA-gta#|LWLdxo6e zv_fc;8+X%N6!I#ox(bkw0ux~ig|HMNc5EP#bkl<)soMTTve&7NCdYaQ(@t{4j_-2Z z_&_4o*J4j3#;B+$W=}ZDMmLqViKSxJJQ}wOu<# z9ZpiAq-Dy!&UBLc8)Wn%3yV>zQ0R|tOY~9y(w0PWpmx9+9dv64lJ@9etv%}2$~!%& z%)(MEQwXOL$+Xs=qD|eR?^+Ax^2$n$#@zI_REu-SiG{HO*O^#pp#rOj)Swd^b&{#t zF89GbX*b5nmS}QhzmzLfR(jTs@onu+J2lv9k2X}zB9kT8ShyaQL|cQz+1Jc5Fk+z^ zH46E5EY{RF;BaVh&d?UZtGBn#LTzT8>^UW?++g8G+@xUGNyp}H8%21tgUbw4l{Qn}v3C(5@F-rNWb~H9N;KpmClKQ%sEfYxzwW)bwj3ZB$ z{t*j5iXY?BDGg59s$tt>fr93QdpQHjSu-?(&t+`>_>I}zIY^@o|tfiND%CrmtI z;V1Bu89p^it#+C&VWjR)(kG0{#;V59)>V2Av$%_67Cwnj$pH63rcHW#a|z%6tcAz$ zIOEXn?R7>ubA2uun!;#qVD^v2dnJ9>ZcoHhVb}#K%k*ntN zNmX4XQ22~2{81EYD$4x-03qK zcY414iiKD4H3Bf=Qh`o+Iwk(9gqt6%F8Om9cYlt*F!7fb z{tDkAw^NyT+N!jz-;L=!d+V$*Ii)do!D%{Zxrx7#F!|dnn|zgM6O%7m_&Z4z^ZZoN zp6qkDCnn9#j;5x@`x=|OnmgNfv7d3zE;}|xhDx^WYT9;R>zwiVlmlqe$eqs*kD{rRMuBPMfjft~2F&5WRtz6FaDiyELxhcn+-)99wCp3f`eq4>%|cOd6thQq`s`J?pCzkqQ7EsB=InSz6v)KF zm^;Fcg+BQx<$mN`kv*~OkNwV0&$@2 zhB>rRUUvofuA(=bbVkQwDbLzK8%>*)qxA|Kudv7!+@qVptDS zZ|7x2Cj+gaSkbqq6@T6}6R!k_*3GLuy5_Dxu(35!731u_`TAo8}BRKPcv# zYKu&`%~IE>LiV;v?{-TqpfXc6O0UUMVZIBg9bvUoHJj=VR>0~`g;kef#oCM)OkPnO z&2aO?|34evx()Z_@RG@JeAUXzh(4O`9n{xvD^#&+p9Ab}0&thWvCC3x)b+(` z_ng@3^QcND@X{t9#PAAL#Us; z^wUq?@aZRSAN7;BYT0>jau#pTvi-N%=N*|I$9pmTup3?2gZ=#dcWO9_BK{u0f8am)l-7R{6s21N zt59$N-zOk>x+PmTbW1=9>6XBfuUkSufo=)(Vcin&3w2B27r+n56|2AQ52$$_-llYg zzry$Nrr)|A-}ANo0B>>B4>_s=flJ&}kx7SCCfvNdfQhXp_L%6_0+18W1OA)ac!wq` z&Cf^J5+hINZCXa~i=M+{d@MhXYa)EENB|QJa~k*tvwIsh~qfO z#$5`pU{AgA687%npoQnLk2m4Eai4CO%Ljvl5A~cyPkm6dlo@B>yaKmABt8CBm4(h> zxZaGEh04sbAXhvZP$w@veN^$+^#>L6xsZS2CFVIKrf9!K!?usmb~8fu6OIF<_FjH; z-iHTp5D)Q=@ECgVGw8+R*oV)cpI`X{n(CeWUULz_yLgWnJ%Hs9@I#zaqzN{usU4R{ zoI$;;$Tj@|ewQ)kwM(4#-9+eGOxN&qyp`4QCRY%W79#i#0;>F7%p*rFZ^QW^R}9Dv zvKKA%DuZKzi`D04rFx^x@L_J3md3feK3En!57sBIq1bP|it#70pe*Vj)u zLtb@tY48HE<3+}&1E`VCQ+}s9BE4s_y$krcY`fIBfM4)?C$XsBco8Rs_)`}^=FVX9 z1&!Vtyel}teM|VZ>C80DK#1XHUbSvVg4mBTFz?4bNRrVp_QvrEJcvhm|MwI=h0k-5 zGk6|f!;5$WuTtAr@lE>UcPWuj-p^oZ=l`b!R2~^A$7W?P^n%oLPz4#H2DR-_A+~~? zSFB8xPZ>GL2LDCv5fc0twMR(sU)27Rr$baY7m0*pX4IRM3FqrzzJq+S{SImvi$!l^ z>AP4LV6-wxF3m*C(lB_wa8J>KgF8|xc58c0qy-}I5SGV zQ87fDHXIu&HHJv8*jyU)XOtT8ei|;qBU(tJI8KB))-Tnoo}g8qVzb;6JGluA3!OX7dsimQzmGL^$b6J}cJksj(Im>Srl;vwQ ze0LQjw1iN2zA7-3737ZTkuf64j-foty>v3F*PZP2yn2?XNdU%ov z=_!3&^xEL3;1hkf7c6V&(r09yMZG#YZ3ng!h4nZ> z2ovy{=$N&tmNzF5PK^|FL@<{wxmOQIgJuX4O@MNW4Td3KMO4Sv(@MZ2K^-K&GksctgjaflGK(pxftd z{Vbqc?qa3xZTq&YtLUVGw=g82xz>*Kx0lrRRRh=XHWR#B)^SWGq*Co=+$*ZuXGYH0 z)6uJ}8!?c^C^ZDS$bAe4I za4u(6ZavTa#5?W|L7RAkj_1+sfAH!$!}_?aZ@Y@3pQ-TaJz z`!FM(uQi;Kykn^Yxb~{sJFZk|N%lsFubvP;>|+0kZvoCxXzCpVfe*M^; zVIKnmPY_N2gsx{?`&*X<$hD6vA-urwGlqsS&oQ7GMki9}q4Fb|;U>);KUVY*pPk?2 z%WzhF5t5`7TF6IJRRY)BP$Dg{yb3`wp~Cb7`1VNbv=X~Kb}$#7)DqgIr?@(n&?at0 z1|p*`pzmSq35@hW-7#d#XacmDZPT-);hg z2=JToIxt~^&Vu*96O$O?zsESHaf8)PaXrsFe2>y4kFUYi7T4d6XXRovy@x4Q za?;(qZSF=}?ygW|$nUT@&PqZ@dUOvnM-8R^5kZy+R(yoMAgU#_1NT{mzyn5UoIm4t v6%RS8zMbT(@H>Q_Rznjb*GbETlrW)1DaUD}*k*Z`oMGI-!Fx zdd+b!`x@yxHtu4Bp-R$y9%kY{*@n zmh_1vyL$IJ(H2APaNvtG^E*=u`wY9|AM-8@MZm*$5@eBx^$19$Bb6n-cq@(l#Nt$TEOK|7ua9#drJAUuHsEVs=t6#~x* zX|R>X{yD5~6y*xW0NDJ8T^X@yuBNeX%*LkCBM+1Og!ke&`zyWS601bs4XS~LvdE%I v`>+YC->)g5JSu^Pv>;C;aeIa&$eN~hiuJwOtZ9s=kn1y$iT3oOx@Ug@GRDKe diff --git a/modules/MultiVizPlugin/target/classes/helpers/LayoutAlgorithmProperty.class b/modules/MultiVizPlugin/target/classes/helpers/LayoutAlgorithmProperty.class deleted file mode 100644 index d6630ee4b3fc0475a8c7a614b608a56b8c45e778..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1476 zcmah}-*3}a6#j1F*iPy~Ysk7np=k?Slm5t-LN}T&5W04n6b72BN*PbL$t7{;#+iMC z=sW)eue|WONwi2vLwnxeus>u^z`1tnLg_R`^8Jx>zVCeBIriUgU%vtH4YqPfA#Fgj zkb%xn*yE3Rc~|gWSbh-reG$lm&9*E3z!~)Wejpk2b+_lr8bf-%xMRR%7>klT-s_Yd z8MwWUi5$b|h8wgzQE2c3e;`d*3?n}TZacX+M==ezCwP!tjWOi5{GcW3(&M2Cn{rOh z6%!X3E^Y;bR#%E(pZ5ws3!?MAb{3yu!ocSiCUJ>jx+^@YJuJuMb+6+GuI%m~OQM=R zH&-o@hzYPLdexPg8O*P_QtAS@KH!HsBs%=jT5N zyuZ6gIMw1WIYPf?;X1xxFgrr-aBm<;;e7Ga=p5!zG*GgzfW?nIkKqVG`mz0|5#rmb zVq3OQ##a;@CTwSxw!@%p_-!iYylT-;gZ*6*Z1Y`@ZtRBN;@%DqTy-8^YO?E+&Y8yl zIA3KjNa;53M6MLi@SGvbj~m92c^sSaq0>VHX?`5ZTfg4p{iq5AA}p;66} z%H#b7l}s6h<~EfBP2E24G!1*)X`1#0=MedlJ$i`Ce?*uSdfJ2t%+hn3hNVEbb6BApD@Mi*+@ur3 zDt!QA)-tV%HB)+t{O`0$K>?|vKy!DJoJo>tXwOK#d^&mQ%w(FuVe&Jg(urh6G2dH! zQ%kREdF{$`TwBa*m9@-dX5lXwN0@#Ft2CJ*oiC7ms<9XE{!xO{QJt3}hzcf%Y>p}{ zlE6j!r-E-I`U1sGAWx^OWG|5oRjA!9tWhadx;=;VTZ|Z3XRPpV)Q0Z}B{rx+tMbAu z9bxVWU!In^9`VEmn~6s?+$MRdtuPTypJ}x6YGwQvx+~fQ_!Iw(2ok= zW(Xacf%naOyzl$weSLp?0_dR~BS0lW*gzFEK_}JOT)V|}qSm(X_u14s zP`fp`@pppC`Nb$gU2y!jXF%(~uJVN-?AsSDXeB1s55;V(-Lo2JR1On6QQ1g2Q}SOi z^r>OfN%GIU8$tYJ3pde2Qw}-W{&BbO>QyZj&JZzDd4!jths2J XKhQylQ|$BApp7QhCad6p7@)NQ{%1v< diff --git a/modules/MultiVizPlugin/target/classes/helpers/Point.class b/modules/MultiVizPlugin/target/classes/helpers/Point.class deleted file mode 100644 index 88bb71623841946c9c1455f33ff584139e875a25..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1398 zcmaJ=?M@Rx6g^YgZdtYz%9o%ZLeaJ&>ldOH!O)~?QkA3xCH@-9gf47%o82j~Z{ky! zXhafz_y9hX@y_lB3RKg~&fMF3&$;)^o!@^>e*sv*OC2%vX^0z0AjvRvz>m0Tb7$Xt zzk49+k|DWjIhI^w=*t(j`;kJw2Hn5_42E<=*e&7t=B8^o6w5x-s;Hnr0~r;;Iyzay z3O>t_$X6-~WE5i>#tls1+6B&9$Csi>RBoHl#;QRzmTPW$1YeV$;LTE&3ZF7?9XA*z zn*30dU8m0F2TL~Svb5ubT=IZhM=#xvu6uGS9RUPcB^z%n=a3V#H~(C z^a%gd6(0^;sr$wvh%&eBnk7Xkg=cDj*di-17;hX$cx9XWzVJ1yGAvwauUFL?Xpm?A zA4(%1wn#IQqUQlxF*WbOiKd!%4O9!V^qnVbM?E6iGsP3I;`}kRV(u8}Z$UzizFEZS zOV3O_ANmbK#{zj~!!+E+9kK`@pkcvD5yb+UWJI$}(ds{~I52R6p>ufkh=DYc1gv0< zFf4*)$fFQJn6xX1MDYi-uXKn()u$MM;jZMwS#q&wa{6-eSkL6USd5t0h)PwN4D`8N z`y{D36(Ed4QBS{$U^~UOwIn-gAux9>&r9@Q*5AZvdD8 diff --git a/modules/MultiVizPlugin/target/classes/helpers/VizUtils.class b/modules/MultiVizPlugin/target/classes/helpers/VizUtils.class deleted file mode 100644 index c2adbcaeab602f5f2603489a9d6cd965d82e31ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9252 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 diff --git a/modules/MultiVizPlugin/target/classes/multiviz/MLVBuilder$1.class b/modules/MultiVizPlugin/target/classes/multiviz/MLVBuilder$1.class deleted file mode 100644 index bea47a05cd13bd1aa37041db039cac21879c591c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1089 zcma)4T~pIQ6g``kri2K!fZzuzTC^=_WSr55I?O1_SPcl&_B~B^+Ql^K|3(0eFgyX(-64$m^IwfnjkNIiWZfpN(C! z^CA*XkNcHPhC(V zt#yi+Wq^tj!;0tkjXoa@1mRD-C^UkRFwA(_ZZa%aGYi%_4Eb%Z#~J2K;qtv`*ya9v ztLspvY%dk+bnde4Yp)cG%;Z(vk z?Qy^-Blt*rhRmiyEioK9eBW}p!|=FjPH@>ss+@|viAf|=NajH!n#fKXKZq zJdZ{6WIGjMxQc5jbt9!J>>_h#jH#S4uj59_d_qwg_?P*1tnpK(>}mx!<7&5PJjoEw psw-bE^u3>1ef2+>?F?ofcVhj!s8Gyf4fj!xGiz9htf0TD zJ_#-K2lPjk-iaZJ8hp7QbI&>VgZcaK*B=0%vE^b0mW`5!GG+;j=i*ZMu}C8STlZY{ zG-39uN|fFsSdC^lhdIJ}yNI=_1>#C(wNT}Sh}E^wDot#-gw?(&U#e@r9fbRZice*> z^}&S$&vbc4SZf4RFuTprMukut*No7h&Al!z7U0>a5|+o%Q7aoOgv~UI{77D$DPHC( zEwrCsD4(S`9F9aN9i*p{Pzh8bJ4L@Mv+trC^Gh{Idm;`+rc6G3Ea@|q^LA55C)knH z9noj@N~0N!&v>LWl|;LQG6RlVggTd>nC`g6*!iwG+ugW?ji(umcaPE{>&Zi9rmu|8 z{@%>NavhoLwlo{^23{*kWOfjXJeN7@SmH0hr{w=oV$a`z?J8$JdtzVSz6ITIFoWl8 zO&R!v7i_&d0M@Y18Q~>fu{Go!_6BEF?Vs!>sb40j)`JcMx#^{0I0ss;2+| diff --git a/modules/MultiVizPlugin/target/classes/multiviz/MultiLayerVisualization.class b/modules/MultiVizPlugin/target/classes/multiviz/MultiLayerVisualization.class deleted file mode 100644 index b1e0a376f444e95880e54144f118b6fd0783c311..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17629 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 diff --git a/modules/MultiVizPlugin/target/classes/multiviz/Readme.class b/modules/MultiVizPlugin/target/classes/multiviz/Readme.class deleted file mode 100644 index 8dceace74e498f8bea5027b3ee5fcacdb52d90fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 261 zcmZ8b%MQU%5Is|^Qjg*f?6AH6)1rZQXFCkEB`)e`O`H@Buzb%*Dz~a?YGH znaO#+?hgPXv>X^H*)Z#{P$smF;w-#KBztce9A%gj$`h5Sd`c+w`db?nf*Ti6uFmS> zt)$q+l3>o#9h2*;L@tUrkl98A5j!0}4MnsSnbP`an)yMU2yOrG&zRt>(;^GyT4b-@S`e(M78>|RTMg#5}cegY% diff --git a/modules/MultiVizPlugin/target/maven-archiver/pom.properties b/modules/MultiVizPlugin/target/maven-archiver/pom.properties deleted file mode 100644 index 5502214135..0000000000 --- a/modules/MultiVizPlugin/target/maven-archiver/pom.properties +++ /dev/null @@ -1,3 +0,0 @@ -artifactId=multiviz -groupId=amrita -version=1.0.0 diff --git a/modules/MultiVizPlugin/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/modules/MultiVizPlugin/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst deleted file mode 100644 index 676dbcf097..0000000000 --- a/modules/MultiVizPlugin/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +++ /dev/null @@ -1,18 +0,0 @@ -helpers\CustomComboBoxEditor.class -helpers\Point.class -multiviz\MultiLayerVisualization.class -multiviz\MLVBuilder.class -algorithms\basic\RandomLayout.class -multiviz\Readme.class -META-INF\services\org.gephi.layout.spi.LayoutBuilder -helpers\LayoutDropDowns.class -algorithms\force\FruchtermanReingoldLayout.class -algorithms\basic\GridLayout.class -algorithms\basic\CircleLayout.class -helpers\VizUtils.class -algorithms\force\ForceAtlasLayout.class -algorithms\force\ForceAtlas2Layout.class -algorithms\basic\LinearLayout.class -helpers\AbstractProjectionPropertyEditor.class -helpers\LayoutAlgorithmProperty.class -multiviz\MLVBuilder$1.class diff --git a/modules/MultiVizPlugin/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/modules/MultiVizPlugin/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst deleted file mode 100644 index deee2f0521..0000000000 --- a/modules/MultiVizPlugin/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +++ /dev/null @@ -1,16 +0,0 @@ -F:\New folder (2)\gephi-plugins\modules\MultiVizPlugin\src\main\java\multiviz\Readme.java -F:\New folder (2)\gephi-plugins\modules\MultiVizPlugin\src\main\java\algorithms\basic\CircleLayout.java -F:\New folder (2)\gephi-plugins\modules\MultiVizPlugin\src\main\java\algorithms\basic\RandomLayout.java -F:\New folder (2)\gephi-plugins\modules\MultiVizPlugin\src\main\java\algorithms\force\ForceAtlas2Layout.java -F:\New folder (2)\gephi-plugins\modules\MultiVizPlugin\src\main\java\algorithms\basic\LinearLayout.java -F:\New folder (2)\gephi-plugins\modules\MultiVizPlugin\src\main\java\helpers\LayoutAlgorithmProperty.java -F:\New folder (2)\gephi-plugins\modules\MultiVizPlugin\src\main\java\multiviz\MultiLayerVisualization.java -F:\New folder (2)\gephi-plugins\modules\MultiVizPlugin\src\main\java\algorithms\force\FruchtermanReingoldLayout.java -F:\New folder (2)\gephi-plugins\modules\MultiVizPlugin\src\main\java\helpers\VizUtils.java -F:\New folder (2)\gephi-plugins\modules\MultiVizPlugin\src\main\java\helpers\Point.java -F:\New folder (2)\gephi-plugins\modules\MultiVizPlugin\src\main\java\helpers\CustomComboBoxEditor.java -F:\New folder (2)\gephi-plugins\modules\MultiVizPlugin\src\main\java\helpers\LayoutDropDowns.java -F:\New folder (2)\gephi-plugins\modules\MultiVizPlugin\src\main\java\helpers\AbstractProjectionPropertyEditor.java -F:\New folder (2)\gephi-plugins\modules\MultiVizPlugin\src\main\java\algorithms\force\ForceAtlasLayout.java -F:\New folder (2)\gephi-plugins\modules\MultiVizPlugin\src\main\java\algorithms\basic\GridLayout.java -F:\New folder (2)\gephi-plugins\modules\MultiVizPlugin\src\main\java\multiviz\MLVBuilder.java diff --git a/modules/MultiVizPlugin/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst b/modules/MultiVizPlugin/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/modules/MultiVizPlugin/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst b/modules/MultiVizPlugin/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/modules/MultiVizPlugin/target/multiviz-1.0.0.jar b/modules/MultiVizPlugin/target/multiviz-1.0.0.jar deleted file mode 100644 index f79a983e052f5507d6e827522b169d9f6255bec1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40873 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 diff --git a/modules/MultiVizPlugin/target/multiviz-1.0.0.nbm b/modules/MultiVizPlugin/target/multiviz-1.0.0.nbm deleted file mode 100644 index 1d473c8fb3482e2378b8f383465b4a3469ffabe9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40296 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 z 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 diff --git a/modules/MultiVizPlugin/target/nbm/multiviz-1.0.0.nbm b/modules/MultiVizPlugin/target/nbm/multiviz-1.0.0.nbm deleted file mode 100644 index 1d473c8fb3482e2378b8f383465b4a3469ffabe9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40296 zcmaI7Q;aT56t3B}t=+b5+ctOG-MiiWwQbwBZQHhO+w*5KbLM2`%&BBm>f))?n|Iw* zs@77J0R@8r0)hepDo@f<1Nxr^G!Ph&oS3Q*os_&d!_Nc|kmCP^LIIWihw8BrRO|hR zTl^Pj|Hc16<%Hy=#Klxp>E*;9<)$WOW$5VV;brKkXQpNwl^K^<_KqE=L{J=PC1qzM z)qo;^$>8CiWIfumB9&2PlvSLwsr_+ipWvRNp5U6{UEtAKzami*os`kD9wT8MB2i@g zAS@mn?;U~vhn)YFav&f(Q)eSnLpvvi|6BF{7eo3__5Z+(?d{Ag&Hpzv*8hT*vo~?E zG5vqefcig8ys8JJ-TX%n0|Nok{BL#{+B#Y~8`9aj*f?9dS_0_ZZEd3Cy~;%Ok9+{uQ~6POo~T9pGSK6HaK6?k>_@*!jcto)9#@?*-H1_jLL7a6 zGqUB>;25F+(j%7Bh}mCH9QPma|Np5${-15L{a?C#TFTn(pZs4|bAfX} z$EbFvf2Ibl>>CcFe>TrFdCW#zY&Ye(|C|17N{zNO8sDzH`en0(^L>kGEh;BP|{FR zP?1+u4G_{`B$hD<^ab&ECA#)IA=X=kNH~h0Jw~(baa0sZY=@km*f=%z4m@`2VEo+* zw3PEW;r5*L{6kU=fA9syqMbCrb&u#_L*=ZaSdfL6N**SAFl%SwBAG2rJONg--ec4d zNxUDP#wgv?dFY+L*W{5U6OMLh|HGr3zpE)(jjw@;gb{r~;>1}A`fisBRU>%N*VW_B zT#a3(tH3-YWf@VibFG^eZHRdhH*vE2Q1soSI`b^_&Z!LsvlX^;aoE3Yc{{Ab`=qBXAD2kQszSBO34L&dwc236^60;;lXqv_zx=GP*^wwq zi`DH%r3rG-ky**LB8vfM+E1h!T|K6{x=xD0{<_!`jege6E-42}eC%h-%&IeMVeM$* zI7oq;+L?ijHo1Fj0OD-k+ z?;uXWugi3=$Lp_`+%I}iv|;Qd)KjZ{4b*N={I^0lW{Wd(3sW-FQ!O)k>Gg@`g?_oSF+dx~C{(5J}r^9zw zaqGL%WeeBLZS=ld8Ym{`JohCF_?sJN>Q-_3;-V;Dh*3d0FT1FNk$fQw9@KY zb{WbD?FxM2eS68P0vo8TQmPp?9|5$PvKb-pk&L98n@&c<)k~(}T{&c|-upJo&ZZJhwlX_?q{k2G-OVJ<@zTyGji(pedXB`#Fn zkzqO-jGj~Nj$f^jE~bJ;VR?`iC8jn5sF!NSe;m{aU5m8wvnxmwToOttNd&yrvbtV( zn6vm9bx^JFnx4XYi-mKAOi0%Cv?a$r+xLbGMyr z-&|&d%(MiK{)@17=ji)2iZlmnG*N)eA)x6B!}W0f8z_(&Ckf)n8eb=P#^OLJ*SxMh z?J5}g%!w583lUz0rx{!!&<3(urYV%o`@kM>9}>#F=n-EYA$sUTE}yjxW!|AyPefvT zdWoZ=r{P(TfZe)&i0@QsH+SrFY0%zNAMaq9^$@kCZ(iIbn^^pXv|vi*`;(yAZ_C3= z1AkUmeJ9855MDQDwAZ5SKS9sSmmi3; zOqKfR8b6n1k!v`a3Z;9Oh4h^>2^jGiXG^XxSmQmeQZF#~ekNyZNkT4HF$#4<(`CkO zOx9~*i&;7ddn%YeIz2U6-kayi3Y>CBm1xl)C~iz<=B$YvtaZDKxVY&J^^Bu>29}#p zN0iTXG)OfVI`m^MeJJKGV&BB7R!ldyWdmM);Q!gfh--C-Xyq=Bw02jDdktZRsppHCgCWN97;g5mJiE|zO8siD z)Kg9-z!A7a!u;@u{e!|q)^*waHZ==*%e_ckk@URKK=SKfnJhh2s=tdT2t@xA(ki{5 zS0-}4wt3o3&FF;*D;E~w?Hj#`!MTXOS<=LgCsBLj4k{7mqyWo@x{0o?bQfvb66@h1 zlF5RcA0B<)Kq>Lh422zNgO&snG2|9iyT)#|unv^%bVl(}AB@mqLv$*L9)07vP)KK< zo?FsgAqaYuzPBqh&8ioWga6})%wzoeLW@|PyLdrQVo<4JNb7DO0+YZl5|CU)IcPL6 z{iRTNoLNnod2L|?>WsJy-kY}W1+Wru&$$9tEZ9NB7(S6JN3U2uy~Uv^Z^wQQ-^Qi zh|qUQ=)t*n3X4n4NT8{VO7{V@${p^d8u%G1h%WF)>Vi4bTixDwBdV`6B9}?wQvPiy z;wbxsGn*zN$xQm=qI`xavy9rO6)1p4vERXHrB@mF?@vs(UKQ%?8v>1BxZ%(S48TIf3gR*#i>fjv=Izn#GUX!x)8K}O z#3eh2cVg!~95wzbm8N#657qdEIgzISxYPGXW5?>!T~Ekp8!Q8bx;DF^kDPP<$Ez6K zuyU!jLYh|r_thq3#(K_+VXb%aFTOfe{jmVEv>gG#AouN zivc$|l`S+;S%bSKh)!SwWivkXGLubFF>;Z6$SPoBMcyGUBiKA2Dj+~K_w4M-(k}CB z^4jdDjj`JBkrgX56%^+y$USiXsne2Hd&@GFwlI~9P?K|l|D;*qWvcs-3tz|byKC_m zqt%n{tiH1;(^-YoyiV<=lq}ZAerWG(zy2*1cgtncX66`qMr4z75LP)qCJ2TM$-5b6 zl4?2SldRmNOh2}miMTA7#^J}D4fdNb=~l4&Rn-Vt-T3Sl^_fI;2`f5xh-zaZYIr={ zyEgK1GNtfJ=^Bn~8xYL-vjR?;#EDFS0PNKW{wtV+s z@Jw!9f7&ggW9V;-q-B%26r-tO)|?|IYZOs5(%y48br%VJ=)IOvmD0i%S5aJ*$KLI5 zglfDEp}TXU!oO7N{c}tmY}UB}az(_J84S=P!J;dZWt&`|{d)rD8lAInEOH%021n$D z-$Fi4p10fJ83t1i>}COvXr|U_7*_2Y!3)8K~rx(<=$8rfA;9)-kh9H)%@|Kxg!GoI>?~-%r z*0an!xI^wTj*fT|>O@l0&*3~4P2O&k8T`sfsNcPwIY2a;NLjzZU02PtL1yY2 zGkP+LT#LrTMlx0s3g7H1Plo1IJm@eEI;f-jp}H|i6E~iu8f|XMQXj}sWuH}5Ws?l6 zOZGWSmNkk_O{8anQxIojx|A}ZZsVeTKX3+)QzN8MKd4m&T`}8|Pqa|$Tu9HYSk#=U zJ>6uY0gFy#)$XP4xv$n>YZ;;+bH11!gJP>&|4Q~cY`DYVd0E@x-|W(>NRowo+hdo8 zbs-KLr0PN1B_X!U9_aX*eBT&n(Me0Ax43#$Q%@=J%u;3h8jmrUFqywBY%nvK$i^B} z5`z!E5%y>M>dzlZ;GCecKw(=jkI}37=Zf2}v7i&~uwfC^?*14Ie1;jcS`3Vh6CBNt zN$FLio{&00jBAWd{5LWl*@2O?U}ZIk<>VjouuNV1>2N;5f3F=fiJ zME;cFZtn35>jW=afyEi@*a1VEBn&)qt)6>@smG(0-!dk{vG2f9W_MdT+1YCoc$c&3 ztDpeA0=8``9Ry0t%ndqRCV=gDJdYq5PAT_!gqlG}!T<%~Bvr8e#J;%0JbbnY1_!aG zzoD9i1EpcVPclrLpp3b__Ss!P-%-MoTSxvnJ^+gkl5)xk3I*^@xi7(8(Lu_v4KHpK zx5VzNS&gS8R!+fS`fXu<2zg9l4o5zGlJ+;{E|qowyv!*Z)H(0RjhWJ}EGROS#Kyh= zQgUxYrYp`S5$$z_Y`}q@{)Yv6Ng6xIa{09|%a6GG`DaHiXA zLh;<9XijSuozKk2fP1F}kt^%Sy5fL3#V0`8)#%VEGpiPOVXzK*DGDf0;YW zAvrp~MHz11#ySVOP1X9#j}06!o1BDI+`{r`&HBMGG4#|?K(}zYq4_3|rN>&w0X+0I z@U6-OupvD7d{&?cJxbg z4X98DfAq}+x%`hk{hrakH~rsxFI8tfeYXk9>~}-AbN@+w5j4Cdio4bty!f`+24THgs?h*KI7+?^UX&dPrl*6 z9F}lqY-pZh$)K%;m*)4;5gU@#`*;-_KN7w#Q@PMT&3eE;*K1;vaK#cJB+K`wp4f;N z8L-6ga>MlSF+8yh*(BAty0}~w1lO-)Pvxw?-zxcT7k-rTbyEjIo$@RCynK-YDN6f< zY$_Osj4?k41rA6mz2&s7Gwn8T$f_8Kc>-70m#93dfk+gSMIFgZ&rja#w5)8{NSH+X zg`L;rCT#RD!TTm0V2VfdpuEX(;)OJG5yQ*QT`7qL074LpClIywtIuU54o>LMEnx$u zfAgyg?+z){K73$FNZP7ZqQ_M!aZmYSL6~jTOklQ4os`!9)H2{3Y|x^doV1|aLhSZ& zA0q0`HQeyVvzqb{UWC>1gJ&7kGTr4ZWJ1dv7Wr(|15 z{wfvRuuCEzEtl2jEq~>U{GEOSpyFR((%igt_9e)nZ5fn<{Ue47JPH$dfESSwB>1By zzT1~%@Q+iC(RGO_t;8&O7$}=wNPR#rt@xh8yhifwc0kIxNmB)xs32K9`Jj@+k_T4C z3JWNeD55MaaDvduCOtf%@^?g`xeLu0J8>+==-7m?G%En}SyON(K?VFNqG--vpD|)d z6|H4c)2IrS!8Qv!BSC|9uJLjeI%Sdzf!`->Zb<;MY>m7PpZ z1Wrqt2{VGlKzo>zTRb~xbsXMSp9lb1Y*G?tiayLUy z!x36Iqmaqbu4PlJKxA8vKb>lUTa_q4UW%;qBP1t{1I-DM(Xn#jlIc+jYZYl}QW);? zKSauCYz6;}^lIV!^J6ifFM>ZSfe{ zM?&bO8M`o(N>^<#EEPsl=r_p&J{`hbMcUzeC`s7sC|Qh3;rc9BvYFRKjbxsw5N77iU7cVtpH<84&H__DDS=~;!M#}{5LmGFreC06ntV8j6`=PgU>U#kYLsZLStQh{vXB4ZdK-uv{;6 zU|QM4*xi_h7CmrTO^QDy6BIhMC0XxwxxeQkW#+ugN`y8j9<#gVYPJ`1MMEN^m|_Da z0|ISJva*(_8zXm=3&gQ~UC(yDy-Dg8BpLu9m@_jxU~*WU;%j<^H)AUc0o($O9Z8(y z!as0m9Pc&3(wp@>1d;BUY1icvOJ_I_lEsjYkYvO5Fw#M6NO#)|SKt3g;t%jLqE+>E zsWKC3dT|UheIZ_Zh}^eEy|#=`7ONY3UzqI_fsKA}Es8}=Lsxp@FEz3k(0UfOW(6lvtjK)YAl_8{og(Fn7 zcv@3HJ#V3e$E87PWxC>WdSP^ha&&?bmM?(B?e*DwBje=GMMwa+(X+yQs^H&b{g z=_|)=*_Sd8Y;lPO6epkj;@4qTI1+>6kd%up7LZUNRUv3b(<8h*3`n$+i|mEs$6H}G za7$Z&P{|)s#PTa4jYqWLJZxUVI6Nhy+gEBn*MMc5d;S%V~GGGGx(WRXCG9LA*rBgVC}eAGppmwfH>qQ zQH@Z6>~VBF6m1|+F9j3%QoAg1&zBA67|{)EuW#uj9oo||4|MOvAAy73zQSwY3pH~) zC@@pFicaZ}f+LOiYfp$JK6i0uZA&o%FCUp*tkbt(7MbO_@2u4aY5rs9bHoI-1;~tH z{mrxNX&dzmQ3|JGqKN;6tMLsMQF?xK{YShGca$@yeXNvJ?zECM4_5}4* z&pfG$-YmD$pmON}c%;5^F?pZ_nWI_E|?Rr7ryosLGQX|VE z>^T|4O9viJN3RI^S4CZw#w~H6sxJ=>PND1Op2MW;Z^{e-4h1>v3Vr;&aIlD4@GS|HC}r_|t=l=cSPSqJVX zpKYIwo|V|8iY4(y$bC4$@&)Hxt)jjkf>f zu4xvtu$HJJ|2PUgSTn0x`L+?e!bUnbw}5jVI$8L^$?m=+3FFiW;S+x7FPh1`QEm>> zxg+QCRWePHL+hvj(HAY~V`B@iz{blvbEgw;HK-@Z>3%dLB(4W(yeyo^w&6hg#z9?^ zqKQ#D$6RF_!BgpY)vvQ#T&jQDO%Y{m&Pd}>I&VU$)CE}O$fUbq>JaKL10IntS_6$j zs8Mi~YH^SayyR!$)0ey;1Bu&FSO=3FHLYXVYq^CEO;nK7){9A_UKO{8>{gDEL~0&R(jn{-r#cJ_S5B@noQitFGqTuZm+KB-7!HWzOYux z477k>s1Y)ahIxgh@s)YooGLFkZ|Ec%id)$V$raW)%@4u`tFRXN{_)>9W^9_Q-hub| zkRLqiB=8);Wek!F&1m*0^ltr#<3i`}pvv;1<$<5_nt79KS7K@<_U6~PKb~U}4pRPr zopNxz*nSjUyG4b^ZZu{;(tHQtt=ZpsSu)HWvIE^5E^ONt-+;_ep zVv?_he;T@%T0h|XOKg&|2*5Ca--2FkdM^LEDYN@CeINC|zraU4ZgN!omIIT$7`O?g z`mUuN8>F}E;I0TBBR#P-0~d`+vpD>K{;sC-P6DAwqhz5aH|_QxK$^(mdZdh}VUH$n z+aq4y#F;YeXB=0AxEKO7>%?kHFrslBu9GAm%}9Ej^x`+WQm>(@WjnWDMklwdilHv1)Sq7CcOOrx9aTnxU$kd1liY2;w?cb+T%A7Cp2Q=TiH9;`YU%>#+ zi~P9?V=oCq=PbgII^Y#{Q2hu7egA-FUV_^)kpt)b!+Z3O9hZK@pu)>$QVo)bAP=6g z6c(arNR$#RB_j(r!AXs(DaPHL+79ucxkMp|fy;=#l<1~tdxd(ScXOCU zvacil+rz1)5?BTSTJIJTo@n}4F|1M!i4TTJB0f*hE2K)_1rYjXBP@YiyHC3@(i3JN z01``?2t_PaH^_<7KMk@gbKBfQ9E`;A*N~K}E)*RZoK#j}X?QlC=pa;85a!T$H*`KI zXwKZ7}b;PVqLT{D+T+TnBU3+!3--)pjol>0N7JK9|r!KJOGptpGIxLBCqKj(4v zV$It?uo8iG9`9ZW(8ek#9gby%DQ|Li(Hv}yHrtW&Wvn7|0%rB5v;>53uPS7b~{c4nFH0`w71q2#R9?l*|?_4 zkHdz$EtDO%*7kag;vhQEgTM6{>YsTA1?M!=B%($06gP{_gk-eJkshN9K-94@XO-qP zF!UWmYD}v@vEB{2QQf|A#we$@a7K051w(<7J=ExMcv{I&1Gs*=Uz6Ykg&A{;B)T1R z6=i9&g19!<#J&Nv7ahV2`b3e~ej>B6E?a~&elf%J<%J!pm;yJ`6G!+4$N>r>eoZ1` zT!Cqufz3Cm4x7Mu?lrD*Ckp{wq@Cc}X&2a5 z{oW#Y>~e0?bO^cemU>$kJxt>i)W}e}oiD|$k)?oD@Uz>J`Q@>8lhN9uW)v>+iTCxJ z2m2Y>w6Nm3@*`BS+HJn@TwW6SEPU}o4)n7aBVnW}>1{&NLC0VR`!4iP;q_QO|Bym6F)#Hv3K68I)VOPmu!(h%ji&N_&est z^LWK|&5b8oUj=%5gw5^MSirLc?Mf28diyr=H(jKDdCO*V> zcb#TdxO$HWj`U;egRdv>-Rc-})r`|Ck^qU)PfDN;*gVtQ&`SDKPpDprLlAD2)Ddts zQJ2h=$#d!*a*FEOg{JfcR}M^4teT1Fzt@34Be!fUJ4tk%0ju%R>4s!|o6UAChH-B2 z_^cvlOOWF|&Gmt(3J3V>7Lwnt%|)I|C~$nV{jRFe#?rX$_$W zEe#|?%l*p2%Va7iSZ)JeAG!*99qz!;U+w(mixZ z$c2S6vQnh2j=ry}So&JR~&kQ^q-rrk2cWD^|5&+#?amwEBf~1d8sG zfp41B3H}rjueLazknsRsGXV=(gY+mlmAorja*m!F)Wc3Lz&?i-@f6I!eIiL_u zQdUgw{xv$}8s)O+n6}_~MjWt4+2v*zYySwKzJ~fFvqqr+1D|pE{Fw)w{#Cp{x9FQP z(Xv%t1ya&>(Yrv4#0pA_Q(=43d;ZJB8j{FK?CHAVt5X5dQpq2ak}qDNL#Z&`pofh- z1hkD-$i#S$IP`V;HF?;gtfb;=>M zvsTBnGW=7{h%2xKW)tb1^yPDNWl51Hrq_@rExCz0fit=<(|9l8qsp}1K1bokwW(4Q z;%<)8OpMu3EBl`c=Ia?~TXseauL;t{cijEcUckG=pw>`SV${$l2t*!M58TO>y z>DeM%@V_adyjLD}{9XDIt?N4V(^WJ0@G=V*1GTh88IIx48J&~+1aHkf>w?%zg~jvJ zKrKcwdL&5DQpitN&RkW;Ijdnd`cd_0Lt_^qEKNtv9XJUh!uk^SzZAo}QmCRP=L_Re zA8rL$QPWo4bi6@$zUaIZDrBRU41Pl%UO0Hr$#B53qhv>CBZzZ?!aS@c*xhr-uV~>t z?T5^9-w7d6jUbatbw}eV;WIwS(kQq3eT3^M{&wLqGCU~BtuYd6twaa`Ri9rlh`kj&)HCqn^z9d@%<&x?7~g02 zI=X9&AYhZ`slI)(jSSU#Wcblt-tU29+NuU@a^0l5wj5>ht3JH_>nc6)vvTF&sW}#+ z$K2O9GoH+V^TaAxVTDb9W(c!&&^A2zdA?qOZ=U2IWZRv`H@d1s{AiLK4>^JToy~1S zN2<`T)xI9b(t=M7hDOQ6+#UD*5ch`o?-|L4)@M;VDxGfRJ1AJI-I-na(18*eYqrR} zA&;5D@qwUi`*#V7TB>nzvYRZ6i*AnkilbgRH{8n})l5}u7*xszMNPUHx$<*nX$cQS zxk+gyk;VS&8$H^FO7IEbI{nV|*>hcMb~X#a=brlFR;Xd;xh<`bo=`P$IjJ;7FU%%5 z`-FO&`fjaE=u{CH@heK-7!13=HyY<$XSN1?)weG3$J?IbBbNcthdb)u9YY;wactLT zt%6(<4axAOZS?nxTOfH36vHTE^=b37Ut&}>Hk-M;RVr!h_-wiJZ6b8Z1!N7mbxsX^ znoibp^QOT;-s`hyhd{rAQKgd?b+%=kY1?JgMu#MGO1TUOao1>Ksq%m#+tX+FE11#3 z0GYT6IhC3=r~^uUOfmzlalE@@GNxBK1(N}hnnk%$oK|2lHeMs39~Vyrg)}JJli;LR zjAz@o9r6zuMb|zz^fL-rU5RGO|DFHnUq%C#i!{^oK@KY*%Vm0@`skLjXb3#c-!k5 zk=$@k1wfb|NznEm8BTW(htk*^v~a)PQ=1F5H}V}i0uXLke)b3R^Tmg`F^sxVZ59|Y z92KsnW*Pq72GodN(gHFJk1r>=?1F#F2iAUIP$Q>Fx3#@bl9LMh-h6?eo?FYe0ZNl;pM4)hz}L+fakSr)rDuES6bC%{?wqZJa5dosc+zT9{PQhQ&wH^Dk`9c=`5 zCvr4m+A|cNeYqV{HRLOR)OPXpR`W&k**Fr33UD`lKc&AO9Xk|Zu;-3vb2rkAieQ1L zeLYx-bnE4mxPE?vs9?i&8e{6V_ZG>10lAQ{B7*7FQn+3zr+Y{3{k(NQ%$Sx}Ib5`u?yuIa9yMN8kRI6MNYrnT4Fl z?#N0nili+m*>VD0HR@e|w%J%tp~Ipjh#imY&^PP6m(9-z^($gsggnXh4V$OyndYap zT{{kKytBr&jhOw%^jdPP=e7|W`qpolacSCfatYP#YOIPwa9`LAK7a!{m#0{lVbxMK zq#!Q^OHnx{lr{xjRL(gt;j2Gd-p;+CU}#2HBU9msR!AuysxlQr@}{uMotZ6NF+JDq zkvsMVq*ktgW^KYTFC=z?ip;M+!J!t9x+a|qx{7LQY{aeq3p*v*v{cr}$ClZ`F=6_u zLIu2uqz;`)tBy*)?I=a%b3%_Z*(pyKdty^ zkmGH$Ep{6V*NnJe8LLtwVw;kQv*j_2?`1^XoGVG)dUh;80ZYy0TuN%%VrpE3=wpDw6!^?1u{9i^p(t`|r{{pGM z7*5C?>r3^~?auxFFa+JI<93gocg+K{vkjdRQAZyTtq*7ysQ=q0sE@!X{iIo2D=1DO ziPjB}>FO;lQkI^80xph{chgrE+MwBV59IzC#_B6IH3j+OiR41Ao9My~EK5$+{0v1< z{Rl4$;c*Nrvs&H+=+mfRQzzQv;_Vp3AK_z<83E^%w+u(D44#2QfaIXl;_J&j3Ap@< zfMF9VNv|(8Cr)UL2-0FoFG@KzK4%A)-rSewAK8X3bWKA?cJ9aKaQYPv1 zZL6nY@hwZxf*rl}!Ws-y{?`cO%SKF=%R@A52B9=t2no&-s$sy8HKVQKz!=ak(IWRi zb6WWI*}dp1O-XEt(#Gv{e9h z%_YOK@Y(Ubo-^n%BS+Xm&|>$6oD|!UG1qwCL)TJG)~ASV#Y=t?sXibgH#AM|yi0c} zHobNovatjVvi7@5?9Q4=8F8z6qHU#p1akOLdKS;{N3+$1kJ5GKs~uJ6pCMiXgo}=r z9Fec~sV||j=0&l?(h;F$Czo`(4gtYM@%kYb`9`Wgn8Rd4-X9^gUY+KyAPYey72^i9CR*m-oxKuqMIVY%+N7egHStyfl|rI#+~Gu*+m!aMA7a(w5h#B9UMgjX zuv^JBU1M7~W*I7WoxWGvMQ3eJRwY;N5Eg8wXN+rocUQOIbZP9(GORJ2SdoPZ0%-+v z`1z_38;3>}(a=ZTH0oY3IB`MQS!L%*CUfjCv_sc#E8E}YisamKdEd@zawm8!gcX$@ ztZl~OQ~EF!S`lWI`ql;wIVnsF>80sD(vP!gE6X$?%10#zxpIMN1#Qvp7U=V==?_#A zHxn8iGeaV3b;4ic0DaL)A|blXs|89o(;p~~JZ%n7d+7rs1M;UN7hj7@6DucWmY^~_ z=prs4zsm&jrd1dLk%fgRev=R{m@h50xq5(#F0y%HGb>N=F5TYk1kr!}0p;m5qeY4$ z6$ZR5;T=jS=Loef*8z^EM>^sRWYw3GrhSSChoQ)!n-tFsf*h}uLDz&+7Kh4a!Y2ER zLv!)}i2f)rP$*rAKN;gdVuzJ^UIl#zj8{RE0|j_}$Gf^b_5nu z^-3jhKU#SZ5TD8wZ?Holc>-f6I#kP(MtY6-L#{*mZ~8;?@#1{h(@#7!Uxd+-8?JcG zJct>}4;}6JtgH;x!!Mof`EY(c#(L)tj%Nmv^K(Ep)$R};_nS}syJAs)@9xI~AiI9Y${?RM;q@**qKKPzgdQj^@`+Ne zB$K80BETc`(<@@`%xEP%BPAx5_ry_w=fB>a-d^s?6rNMr^~<~#w;Ct5@%vJW&Dl{@ z2VzR?rC^B*Vo!8J0V@|lFLwNp!)^V%+9T-H_G7O5s}IL%tRrzQ8;(xvNoe*%7;*NR zD01ZNRb`I%qPshO(6QXw)vTb&02fVrX7_xq~FC$?L z`0MQKCeie=bXdJ9O|_pOcJ#AUZr_M{b#*JS-XI6{T(!x4IGyZo(BtuH6&FqsW%lm3pqmdteeHl@M5USg5$ZbFmM` zWXBHy%E3I1X2tFC(dbMuOPJv7>ZVU9B|mTILwGwSMKz69YnVzIX|8zr*jcz)N`Y)x zQbxFImWR2S1Gt>Z(OmiP#a*~`a5;2f9j%yw5w4$@GqNP%H(-Sh;o{lYylZHKeC~x# zLYYq`F?CoME2wfjLU)muwCkFm{5D&c*LBmc0zuJE^oz&wz*U>qQn&_^`AJ(m2Uq=Y zJh~PRO-o|yQh8^h7{y6w&B^m`!{tT?5wz@Ou}e-YyqPhy10eUVojIloj6KL~=7D)U zWVJTE^P!LdmJ=HMKZNbX0bN>6o@p4Px`ewl>mb7c;}+^Figy2!a(H@*d=0g_lxh{t zjcT;u2QpX5CTRrMPA2hLU zw{hu4b5w(Prx={hICQ{t&wi|(CsT9U{>=A1X)dAN93%@S6au(K>HJgw_)rWQWohDn z3|F<%*M2u5tevV%-VT075uJ!f$o@HE_5TFJJrM>KxvEgxG9oZ&W;B0BDR@@l-P94P zdb;CriRhiDCnzN|=Ni{QUY zo+Zrl@U0=R@=hqL#gfhQCL^VqL&bCi)qB5p+^qFh+EJwXx-;xwBONiO7)vjH#B=_k24O($*cf+ysp9ZA!P z1lB9(zz9}`EEpC-aVrOhw-vDz*$yYIKN&bK7j=0@C{kM<=nZ&d&t=r9u%MTd!Y zamI4!UUp!rlEnz!6A8)tY{>_Y|bD9-gw~jl1hX)}t^8L10pgyloeF`EVmH=Df+b^`(7{ ze<_+?oG+b9TxzQ(Z`kE`+2!{h{_NT2G6)nclz!9Vv`jZckE&_d)TGxuRYG1F$!zic zsik6M0l9a|MGggT!(~66nHZO)gI@7=Y@v8%1c+TXvoPVDh5j>!jf18443Tu&(_cWn zULd+X)^n?h+?r3l!m{x#bj-Ps=yiCLK3B<>>?Jl}KizCB8BJA23N6M^0b^?)TiFS1 z&<$s9Yt%)sZ96K?_$gY=(LCsWC;fPZh{{?7^&mcIwdZjEuleU|7Cz1Qx|g+b@Pm{g z-|N}+b;(oOC-4s_1-uTk5LzV?8Nw)qp;IvND8%NPLgt70oC`NGDyp)W)w;I!N*Q~( z6o;m?M7b3T?!2`c9UX&xs0)LgfUTHz*M~uGd-XZmO9lMfy1knR$jwwt33<0c>Ht(f zo;GihFA{)|Ke5;M7vFn)ApU(1>c5}BTpf0Fa6d@Fc6iyv{9RgxmLZsdn7_WM(ij1W z`#|hzQ3{=FQdMn6elGqC7P`ZTZ4wZ=doh;)7s)7rLL3C=$NS!oH`6pe!yWU!PwKzo)L3xZ?QTiV-t(gzy-VK7qx zqv?w#6S@WyG=!)E4z+8x1#xbqMuUHvz!^s9qPr`mM|N!aNbT+jwKQd(Ic}{PScu3F zF{+vNp}T1<6#s7`V;~z&QVP9b%V!@;!<~wb{uwToEdBvyE|fK*njk#3^Kpx8({aWL zafJ{}`fft46jDW<*dP<+E9sVTr7PiaYl!Jn;uxB<01W#K2o~!BoMC9>dke$+s_qS^ z!yugV4C2Mh&SlxP>G~#+W=uCKM;i&O#M-36)d+Q4)9PlQo4CA2Ig4(JYMGI|lOzA_ zZi19DE@BsN9@xKoh9_8LXOJh~tQ!KxWn~0sgjqt-Ht3BbFkD_qjrZ7#{aD?f9yB-# zq3KARz0=puf|dn0iV3Z8AQwRm2Wl!@+;@`&^{{&lg6P(vK+w67lWXa?lggy1DJXO= zUX&1e%Ux_arI0Wog;|Kr)QaHV&HWi)m%0<18#T2;DwEx}=L|Cy4K}Wzt4>?aG{t;# zt>RRyP+$XMXmR1>fje4^<@&fhCUZ3U*72y}=6aQ?1s@vZ9C8_yPw_i|BMM=D#q33u z)w#yq_feh!XyO5qTuF^XRdjJzS9*+3V}#X4^ITSxQ}Gyw6ojL5!EZc&@Snl>Ns834 zs0L0X8yaOpEY;(+@wPyieE%X;c)kb!WZh+#V?=5ta^S9aBqY~P@CU}q{&bme#5}z_ z?pLR$oez&~pA?wm57sUjZyGso4P!Ky`hX8ZLKPB&?)Sr@&7*wO zHBX!pr$ZVxa=CMqmMj1Rv=!c?NgI?oQhclOOW@LAKd!0D zu(UV)#N6sE%rz{flJDHeG}6N#Ov(9#OuA&~OJ&ijrT=9P?i#VGOj=g(Sb5N?1A$xJ z&Z$y-LdzS$Nio%voyV4-bBct47idy`0@HJ%NXobitGI?BANubqN$=KqJolxlqGm;m_Y52P%P04vEp4_QlsuAm1V!`!YJOZ-$bt4z7Op)bWY6p}x!!wo6oZT!+i5x_ zBvo=!I+-oX=S50UbL!RgSd9QXcJKCGV3{=+>Tre7DKb|c^0QYSR>>@$FG;u6G<_|(?VMpzfeXuXiFaqodP{s- zZdNC#qrQ6=?*D_ISD&tE2N~E1#S4YkG-j_kiE`oIZ`f&uA;fLo9#Ua4b(Z>t(?9bm zVJO5w9hi(OLo-}aY)oBUocx<-GCeWOBK)_jaRvz?m2~j^PC|NLv%ad(Cl-4H%+vrs zQR*BYR~3}GM4@DO;~Nh!Tq}lCPSE);2Q74(v%xI1S$+5POa(=;t^W#1ykO6@Y5Zz) z0aXM}+J0=h!i;$a1Lh6$)J@q`79-+q<<@`^VHzLJ{9wB;{ThEZ-H)`4fw6?9ac4SZ+?DbF7=Fz`CGa6 z%IZEq7ri#87tHcnaF!+(|9s~?tJW0cQJ%1;Gy1TMCeR*k_FB80vzIdqvwsIp&+L{o zz6Z(fdg4BMQB_yTwKh(wtI?WtmJseyi|Wp@1ZK^J6&0fLPX;Q4!wYpfM;4c*NB>l8`T+#!JySMo z17z|P-CmLykSB^HYG7tgNEUT_p!qYNp^fK#qGve5v9lqf!i1M7Ahh~UYPQ4p_sc(j z6~ z9oWYJ9_cp;h_TPMA(LCl+WRnWsd#!mbQ8TpjH#p|I4KrXP#C%_hdPR)|HA<5*=?Kj zw}9DUb_EPfn|iSTV}#2;3@vxPDQe+P47RGDh}211MdM;^^HVKjC@wPsse8)-G`1Zn zEPMsUd@0NMN8!9noD)c%SG47Zl}evl)KPl83z3hr zTy=YC0;UI`A@D#;)F3RWlt%&areFunyYp>{?ruD95oUbv-)t#4#f|An=TC zj>7foV*qD0u;N6SD-beKNFIEv3+AiUz&Y%F9{#=M>ZDw>@$aZSNOaH!p1`M{BB@L$ zqINkrTvL!8mA}{*SJnY5lcbWYjH!Ckol~UA(NrF2NUjz=AUN}vm~-)3+a$+{1*5wf zS12tMo*7C;WCZhqu~SxH4*ek!B*T|L^P+^wdo0H~W$Nm*Q0E1x3D*5QJl6xOG^oL* zdAwcR$HOV=Qe=?-zcN|?ao

8BUv3NIUjp=j)a!Ayzv8_>jC@;>Fb}6PoZ#CIDPR z&TyDy(%_UX=E(aOpYaZV?*9NKK-#|(a2{rfLcctqOCjv;8WFgu`pRpv8O6;Oe<(yG zP?aJD!`F5{VrOo3PzD2%*y$7Yh2V+MYec)Qz@y>R{qf%B{Qk4a1Y91CDS6i%a^Y9T z{!8>avl)2qWl)`wo}{a!#PA9A`x4<$>m$&6>rP5VLoMw`^WqZ4?pY#lIMEa0=3-dP zV6ufjTFR`FJ(1ZBZCFRnlS3`$m^bH2`tLkds7i2MRk4)0rIruk+_-64l0>?hlUjz; zTr9dsaGb<-;8K5OpIa@Z@%p7wXO2YC@8at^lBlDcHj{KQSu)5%JmVJ+?x@2;ZwVO; zhlB23WZE#0?lbo@(&6c?w+R(Mk%I=%3nVL$DZ38-bUBqS5by-x#)5eX(-eJZ(SO)^ zyN3iC(YXvfMUs8*`?W9|L zMRaOJUzvGzi)V+&MJd-yF9Oj>1Gff-x=CZ?BWXG91oKuy<)d_;qgR9YjEMMYdm?5c z^g&Z^$eTYuV_^7FR*y3xvyW9Sp6L3(1txc-!o}=iNvyRw4=^FIL{6CNPhd;p?R-r|A(z_49>0DwvKJ@*tTuwiEZ0OHQ#hEV_F9dTLTr*#bc z)4Rxzo?2>hvReW_ox4R|YjQapk}tjI@ywQ=q3|0+gGksa<-XKaA0xxOEnEC8E zcdck6OpJbugK42?BSaMe&(<)K>QVrtaTNP{2R6t}le(CiTgyC_GeRMr9me{Lly3Ft zRN`ZilY2qSoQreaJR=H6@NbkixE_=26KCUWR7QhPN2Q}fhWu0Rk+TTKhjA~Uo0qKnH&J@8^Hi)rI=B?rk% zE=mbzG(bWbHYfyN^ZFIQ$c!caU*`^*Xl|-&Opowu2JYY~+ugyB4Nc-fs~;cdaf*+@1qDWJV?+;B zD`dbxr1%I!S?a3uXwk)sjB|ORxO$C8-!cy?@U4@SPh!Ks$;FoDziLKT zDX^H}s1sB<3T_*h4mDOh)3wM)ib4a_;WZP>)~n>zTF&=8n`FITm^`DP$|x4bUrgIY zJSqI#7i)CZw9nvQBdWg)RqcISS##>p8G9+#MI345AxRGIOH~O7<#3yxLZFf{n~;Z+ z>>XB%Ci!m0g4M!sU~AasqgjWm^x*wE&Nz>~1%*u9lN2siPTESES5-Uq;OU<`?^4U} zS;MZT$tjWtRI@muj)%Jq>ULSgMhKyzm#U056DNdb^Jgl+#ulMVv44t~m>H z+q2gpXQFkgZ8o=Vc%5|)4Pu-E;5O}yIL^^ArdMeauo_3!ZHK4&>jAT?s%cS3 z&seM0`N-~!wZ+j+6LOS8Sd20ym9{P)Wx3E(5L$r7{1`(vXPCXy78JT?3nfUulFC){ ze7uhcJr#EbxwC1>G;UBl<@(VGB~bT;DJsIleAE{#PMdwGYgG+)^-7cv#VcV+HCz_M zF&8$BULhBm6VA} zAG+EabdaM3p27awh!4TaG|q_3#-?<)vG&44@2|~NX6xR~i0w6v?Sv@CXDAO6^4Np# zM?a0^^D5E>1Gb2)Y9b-{Bxk6(KmAilNyJ{IUYyMHn6YYMg^#XC;~F}Za@DW~Xqrav zC4f&>ztCb-W!bb;-HH0eO+}yHL6O9`>}*BL@5%^NIp@iq2kSV&Z}3|vew$rIRD!;l zqSr-AHf^cUU=Bz9ET%oW3Wl1O8=Zm`!CEfU{ess&04M>23k7T1!`Ts8-q4ZsFg5oU zzR46EvqDeGq{Zz7iiS? z`LRRmRm#J+r$)ecw6L<~LWe+H^^p%z{cSYmw`mAZjm%xsqt{(yz)XF=Jo6$WHPS`H zjq__~0K=bGRbHN^_-L|3_9)v_ewj2*_Wrtab~C|5PXlccKpD$xegwnbibo~WXy%n@ z|9L}68a0PCj3#e3$K3^IjRLC){Q6_vhBW>m{g8I{{McY4_I`Dim?jXW!(1;JYMLWi zQ%l)36I5ssx}lUNbLKL_STaNAD}33QI43ep+&bU(dzYL|kIBBNPYMuRNP*qh0@)ph z>?ej^!fjKMyNpj5u2_%pzPs{QSm%aJ59;Vp#j7uo%R_Vt+pgn(h|N+%%(&V$7!n^&t#jNBg%BG{pOjj0=!T8 zyn9``_|o>+vueK(2TkLH$9!#l0tvCuf5>Q6K)uivY25lZyaSz-|CmO>6CuV6dLLqYh~LQ_>#+`CW@+S zq3cCke|vJ~2VnsktDE$nm*Dr#_7G%(Af4DtL4AMPgvA!|J@a$jjF!9W1dq*F@-2JP z0v>jhCC#dS9h|XNTN|tPYaGB|9d}oQLj=u&PY;|}jrRlFcz?Hd!VIrS$GP6eiT=)x zE_`xxADP*RaJI!IyQpjdbD=s#K_ewuAi-nhQI>~rvONHYUau8@OQ?WT=d%$#QyWGB{X|D*iTEOC~n*W^pTB!z5n~boZm9i}WGK(z9RP?C;$G$CP|6Z@ahIfUu?>(0bVPna1 z6Lg^;%0t7E|NLp#lj|}6wtqPrHLEboPK=&2aqo$pQ!N*4ng({G0B)7pT{SOvJue1n z`oS&&V7QD11{G^nNqe5MiWj)~xDQH`UIyp=p|##Yrw`?xRLStCW+I!Ooe2q|C;%A0P>6vtrrYao%I`8hbf@b zz|jB%yl;OKniheciK3RamDC=DCg`N@k`)6i%9(!87gfU>gDaT|tb$wtpLRM&P}L#b z9Rw$E;uCchmv%h6clpGkH;UlilLzM2#(*Xm_mT+UU56F3xsRt2!c&JJTPn<=Yd2)u z3j4G=lHk^8D8TIi6!!LsXvG=8>xlgm@iX58gWKniidIAxuvAb)fE-UtH@4iRg`)7O zg`!d4L<)9jA(e}0A=Nvxl-O%;B?aYh`TZy3;g0-BwK{|#A&^#m15w9TfE@nq75YfY zqk7&TyYIIOM8BpcJ}3`7F5_$&kDwgx@pssUM-)Bv)C?qLMAAt^a}D9E=gclsw_5ga zKH-k)CyhF$f;&cmW=nnDGl*RW9DW|1YFZz*BlZa8X3;GQ!lIXcZ=Xn3<0~@)6=%O9 z9Tv@p?-!!GuBdvId?T7SL$4q7o>ouepk&<-3WRlxL0!)(<@4M=bR4($QyFUHOf65D zph~2B{vC=@QltG`Ego^>-^uua-~*_#uCxvQ$PY(2#DRV)mp#n6m=UfU<5T2*FI26^QHD{uW)Bkq2=i_=M@`x#uc$8i$tq&YEFNp$q3(&@ zuS0aS*7*r6UliCVUj~E6SutLRUx;422wlN*TK;u85zl^KxB}i!n?^qINOoAA!H9Ij zW2~}Lc5AIji2Do3BGM{ZPo^t5<{R|Pa~!(y zhqXt^H|+Bg+y1Yte*FkBl1|gQIH??=c^oRZIX{xWlW@Hom`2W} zmOps-$E3|TDv4@-Lljc^gX&VSd43c7UmNF$hfnA!c%ZbTCLUCUFo;7&{;}0BW1^;U zEynPS`kW&+&b?sn7WboZUB-Bu|J!qg+~2C1XYse14>dlg1;!yEvnLpy)RUsRHnJNC zN1vRF!Rqv7?us2OMaqG!k^ms`o*SxXNfqbfQF_BKtBBErQ0^l;skCYpKyC)wko!AP zKd2q;oH_<;FwV4kp|^BI1O^KGh7G|24y~p-4IQ0oHiHHcxd;tx64EkGzIh~P;pr~y zoi+)IQ=+7M^!}4fE$rkmG|NaQVOu=JEqldiv-I!FY={`u_N}c|LP4&3A_t_y3D+*r z6|ZuZCv1-%w_px?4mRaILcGph+vrI(<-NG~S*uIz#dN{hG~7*^b%puqlKHPHbHx!{ z%YhTADa=QDH%`4G_qmD!eM>5_VZ*d&>BaJ)jA-s_w}^N}r1*^zoXi8<1kfv7!*9M2 zv+nQklAr_o6u;+X4?Ovb$A*^Sk>3vpjJ-a;60{BpH1MjJvf`WO!`IpsO!x22v?+&YS%7$@V8z`ugEe1Z{iPi+h&(Mskl zj));<_d71PN!+q}3k*0tM2FU=WeNnlHANekIxp*~0;HG^vmns5w5rvR=-(o|i$XaF z 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 diff --git a/modules/MultiVizPlugin/target/nbm/netbeans/plugins/config/Modules/amrita-multiviz.xml b/modules/MultiVizPlugin/target/nbm/netbeans/plugins/config/Modules/amrita-multiviz.xml deleted file mode 100644 index 350ccd1b5c..0000000000 --- a/modules/MultiVizPlugin/target/nbm/netbeans/plugins/config/Modules/amrita-multiviz.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - false - false - true - modules/amrita-multiviz.jar - false - diff --git a/modules/MultiVizPlugin/target/nbm/netbeans/plugins/modules/amrita-multiviz.jar b/modules/MultiVizPlugin/target/nbm/netbeans/plugins/modules/amrita-multiviz.jar deleted file mode 100644 index f79a983e052f5507d6e827522b169d9f6255bec1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40873 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 diff --git a/modules/MultiVizPlugin/target/nbm/netbeans/plugins/update_tracking/amrita-multiviz.xml b/modules/MultiVizPlugin/target/nbm/netbeans/plugins/update_tracking/amrita-multiviz.xml deleted file mode 100644 index e03b387ebb..0000000000 --- a/modules/MultiVizPlugin/target/nbm/netbeans/plugins/update_tracking/amrita-multiviz.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - From b9c6fe87a77ca7fb8dd5b4496585ad36d25bdbad Mon Sep 17 00:00:00 2001 From: JSiv Date: Sun, 13 Nov 2022 03:54:26 +0000 Subject: [PATCH 04/16] Delete Unwanted Files --- .../src/main/java/multiviz/Readme.java | 56 ------------------- 1 file changed, 56 deletions(-) delete mode 100644 modules/MultiVizPlugin/src/main/java/multiviz/Readme.java diff --git a/modules/MultiVizPlugin/src/main/java/multiviz/Readme.java b/modules/MultiVizPlugin/src/main/java/multiviz/Readme.java deleted file mode 100644 index 618d500b07..0000000000 --- a/modules/MultiVizPlugin/src/main/java/multiviz/Readme.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license - * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template - */ -package multiviz; - -/** - * - * @author J - */ -public class Readme { - - /** - * not use distance between layers , gravity can keep everything together - * repel communities (no need to perfectly stack on top) - * - */ - /** - * Hooke’s law - * repulsive forces between all nodes - * attractive forces between nodes that are adjacent - * - * forces between the nodes can be computed based on their graph theoretic distances, - * determined by the lengths of shortest paths between them. - * - * Kamada and Kawai uses spring forces proportional to the graph theoretic distances - * - * C60 bucky ball (60 vertices) one node connected to 3 others - * - * Old basic force-directed limited to small graphs and results are poor for graphs with more than a few hundred vertices - * - * fact that the physical model typically has many local minima - * - * all the edge lengths ought to be the same, and the layout should display as much symmetry as possible - * - * “even vertex distribution” - * - * “atomic particles or celestial bodies, exerting attractive and repulsive forces from one another.” - * fa(d) = d^2/k, fr(d) = −k^2/d - * distance d between two vertices - * optimal distance between vertices k - * k = C \sqrt( area / number of vertices ) - * O(|E|) attractive forces and O(|V|^2) repulsive forces - * the temperature could start at an initial value (say one tenth the width of the frame) and decay to 0 in an inverse linear fashion. - * temperature controls the displacement of vertices so that as the layout becomes better, the adjustments become smaller. - * technique called simulated annealing - * - * reduce the quadratic complexity of the repulsive forces, Fruchterman and Reingold suggest using a grid variant of their basic algorithm, where the repulsive forces between distant vertices are ignored. - * For sparse graphs, and with uniform distribution of the vertices, this method allows a O(|V |) time approximation to the repulsive forces calculation - * - * - */ - - - -} From f7051ee14c3b2dd069dca516b5a59bd2f0547b3a Mon Sep 17 00:00:00 2001 From: JSiv Date: Sun, 13 Nov 2022 03:56:15 +0000 Subject: [PATCH 05/16] Update MultiLayerVisualization.java --- .../java/multiviz/MultiLayerVisualization.java | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/modules/MultiVizPlugin/src/main/java/multiviz/MultiLayerVisualization.java b/modules/MultiVizPlugin/src/main/java/multiviz/MultiLayerVisualization.java index 25fcca3dbf..653c1e3434 100644 --- a/modules/MultiVizPlugin/src/main/java/multiviz/MultiLayerVisualization.java +++ b/modules/MultiVizPlugin/src/main/java/multiviz/MultiLayerVisualization.java @@ -1,9 +1,6 @@ package multiviz; -import algorithms.basic.CircleLayout; -import algorithms.basic.GridLayout; -import algorithms.basic.LinearLayout; -import algorithms.basic.RandomLayout; +import algorithms.BasicLayout; import algorithms.force.ForceAtlas2Layout; import algorithms.force.ForceAtlasLayout; import algorithms.force.FruchtermanReingoldLayout; @@ -185,13 +182,10 @@ public void goAlgo() { switch (layoutAlgorithm) { case "Linear Layout": - new LinearLayout(getLayerDistance(), layers, initialLayer, initialNode, sortLayers).start(); - break; case "Grid Layout": - new GridLayout(getLayerDistance(), layers, initialLayer, initialNode, sortLayers).start(); - break; case "Circle Layout": - new CircleLayout(getLayerDistance(), layers, initialLayer, initialNode, sortLayers).start(); + case "Random Layout": + new BasicLayout(getLayerDistance(), layers, initialLayer, initialNode, sortLayers, layoutAlgorithm).start(); break; case "ForceAtlas": //AbstractLayout.ensureSafeLayoutNodePositions(graphModel); @@ -207,9 +201,6 @@ public void goAlgo() { VizUtils.nodesRandom(nodes); new FruchtermanReingoldLayout(getNoOfIterations(), getLayerDistance(), edges, getArea(), getGravity(), getSpeed(), layers, initialLayer, initialNode, sortLayers, splitAsLevel, nodes).start(); break; - case "Random Layout": - new RandomLayout(getLayerDistance(), layers, initialLayer, initialNode, sortLayers).start(); - break; default: endAlgo(); } From 2a1c33b8708b0634979c2dbb13d7859c0ddbbf29 Mon Sep 17 00:00:00 2001 From: JSiv Date: Sun, 13 Nov 2022 03:59:01 +0000 Subject: [PATCH 06/16] Code Cleanup in Basic Layouts --- .../src/main/java/algorithms/BasicLayout.java | 204 ++++++++++++++++++ 1 file changed, 204 insertions(+) create mode 100644 modules/MultiVizPlugin/src/main/java/algorithms/BasicLayout.java diff --git a/modules/MultiVizPlugin/src/main/java/algorithms/BasicLayout.java b/modules/MultiVizPlugin/src/main/java/algorithms/BasicLayout.java new file mode 100644 index 0000000000..1204b056ad --- /dev/null +++ b/modules/MultiVizPlugin/src/main/java/algorithms/BasicLayout.java @@ -0,0 +1,204 @@ +/* + * Algorithm : Circle Layout + * Copyright (c) 2010, Matt Groeninger + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * Algorithm : Grid Layout + * Copyright 2008-2011 Gephi + * Authors : Mathieu Bastian + * Website : http://www.gephi.org + * + * Algorithm : Random Layout + * Copyright 2008-2010 Gephi + * Authors : Helder Suzuki + * + * 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 algorithms; + +import java.util.HashMap; +import java.util.List; +import helpers.VizUtils; +import java.awt.GridLayout; +import java.util.Random; +import org.gephi.graph.api.Node; +import org.gephi.layout.plugin.random.RandomLayout; + +/** + * + * @author J + */ +public class BasicLayout { + + private final HashMap> layers; + private final String initialLayer; + private final Node initialNode; + private final String layoutAlgorithm; + private final int layerDistance; + + public BasicLayout(int layerDistance, HashMap> layers, String initialLayer, Node initialNode, boolean sortLayers, String layoutAlgorithm) { + this.initialLayer = initialLayer; + this.initialNode = initialNode; + if(sortLayers){ + this.layers = VizUtils.sortedLayers(layers); + } else this.layers = layers; + this.layerDistance = layerDistance; + this.layoutAlgorithm = layoutAlgorithm; + } + + public void start() { + String previousLayer = initialLayer; + for (String currentLayer : layers.keySet()) { + + float y = initialNode.y(); + if (!previousLayer.equals(currentLayer)) { + y = VizUtils.getLayerPlacement(layers, previousLayer, layerDistance); + } + + Node biggestNode = VizUtils.getBiggestNode(layers, currentLayer); + + if (null != layoutAlgorithm) switch (layoutAlgorithm) { + case "Random Layout": + float layerSpace = VizUtils.getLayerSize(layers, biggestNode, currentLayer); + for (Node node : layers.get(currentLayer)) { + double dx = initialNode.x() + node.size() + (float) (-layerSpace / 2 + layerSpace * new Random().nextDouble()); + double ly = (y + layerSpace / 2) + (float) (-layerSpace / 2 + layerSpace * new Random().nextDouble()) + node.size(); + node.setX((float) dx); + node.setY((float) ly); + node.setZ(initialNode.y()); + } break; + case "Linear Layout": + double distance = 0; + int index = 0; + for (Node node : layers.get(currentLayer)) { + if(index == 0) { + node.setX(initialNode.x()); + node.setY(y); + } else { + distance += layers.get(currentLayer).get(index-1).size() + (node.size() * 2) + (node.getTextProperties().getWidth() + 20); + double randomY = Math.random() * ((biggestNode.size() + biggestNode.getTextProperties().getSize()) - 1 + 1) + 1; + + node.setX(initialNode.x() + (float)distance); + node.setY(y + (float)randomY); + } + node.setZ(initialNode.z()); + index++; + } break; + case "Grid Layout": + int rows = (int) Math.round(Math.sqrt(layers.get(currentLayer).size())) + 1; + int cols = (int) Math.round(Math.sqrt(layers.get(currentLayer).size())) + 1; + double layerSize = VizUtils.getLayerSize(layers, biggestNode, currentLayer) * 1.2f; + for (int i = 0; i < rows; i++) { + for (int j = 0; j < cols && (i * rows + j) < layers.get(currentLayer).size(); j++) { + + Node node = layers.get(currentLayer).get(i * rows + j); + + double nx = (-layerSize / 2f) + ((float) j / cols) * layerSize; + double ny = (layerSize / 2f) - ((float) i / rows) * layerSize; + + double tx = nx; + double ty = (y + (y + (ny - y))); + + if (i == 0 && j == 0) { + tx = ((initialNode.x() + (nx - initialNode.x())) + (0)); + } else { + tx = ((initialNode.x() + (nx - initialNode.x())) + (10 * j)); + } + node.setX((float) tx); + node.setY((float) ty); + node.setZ(initialNode.z()); + } + } break; + case "Circle Layout": + List nodes = layers.get(currentLayer); + if (nodes.size() == 1) { + nodes.get(0).setX(initialNode.x()); + nodes.get(0).setY(y); + nodes.get(0).setZ(initialNode.z()); + } else { + double circumference = 0; + for (Node node : nodes) { + circumference += (node.size() * 2) + node.getTextProperties().getWidth(); + } + circumference = circumference * 1.2f; + + double diameter = circumference / Math.PI; + double theta = (2 * Math.PI) / circumference; + + double tempTheta = 0; + double nodeSize = 0; + + for (Node node : nodes) { + if (!node.isFixed()) { + nodeSize = node.size() + node.getTextProperties().getWidth() / 2; + double arc = nodeSize * 1.2f * theta; + float dx = (float) (diameter * (Math.cos((tempTheta + arc) + (Math.PI / 2)))); + float dy = (float) (diameter * (Math.sin((tempTheta + arc) + (Math.PI / 2)))); + tempTheta += nodeSize * 2 * theta * 1.2f; + node.setX(initialNode.x() + dx); + node.setY(y + dy); + node.setZ(initialNode.z()); + } + } + } break; + default: + break; + } + + previousLayer = currentLayer; + } + } +} \ No newline at end of file From 695907a963616a5f4484cdc8982ff66b9d94fe26 Mon Sep 17 00:00:00 2001 From: JSiv Date: Sun, 13 Nov 2022 03:59:41 +0000 Subject: [PATCH 07/16] Code Cleanup --- .../java/algorithms/basic/CircleLayout.java | 96 ---------------- .../java/algorithms/basic/GridLayout.java | 103 ------------------ .../java/algorithms/basic/LinearLayout.java | 61 ----------- .../java/algorithms/basic/RandomLayout.java | 86 --------------- 4 files changed, 346 deletions(-) delete mode 100644 modules/MultiVizPlugin/src/main/java/algorithms/basic/CircleLayout.java delete mode 100644 modules/MultiVizPlugin/src/main/java/algorithms/basic/GridLayout.java delete mode 100644 modules/MultiVizPlugin/src/main/java/algorithms/basic/LinearLayout.java delete mode 100644 modules/MultiVizPlugin/src/main/java/algorithms/basic/RandomLayout.java diff --git a/modules/MultiVizPlugin/src/main/java/algorithms/basic/CircleLayout.java b/modules/MultiVizPlugin/src/main/java/algorithms/basic/CircleLayout.java deleted file mode 100644 index b664c72949..0000000000 --- a/modules/MultiVizPlugin/src/main/java/algorithms/basic/CircleLayout.java +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright (c) 2010, Matt Groeninger - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, are - * permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this list of - * conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright notice, this list - * of conditions and the following disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF - * THE POSSIBILITY OF SUCH DAMAGE. - */ - -package algorithms.basic; - -import java.util.HashMap; -import java.util.List; -import helpers.VizUtils; -import org.gephi.graph.api.Node; - -/** - * - * @author J - */ -public class CircleLayout { - - private HashMap> layers; - private String initialLayer; - private Node initialNode; - private int layerDistance; - - public CircleLayout(int layerDistance, HashMap> layers, String initialLayer, Node initialNode, boolean sortLayers) { - this.initialLayer = initialLayer; - this.initialNode = initialNode; - if(sortLayers){ - this.layers = VizUtils.sortedLayers(layers); - } else this.layers = layers; - this.layerDistance = layerDistance; - } - - public void start() { - String previousLayer = initialLayer; - for (String currentLayer : layers.keySet()) { - float y = initialNode.y(); - if (!previousLayer.equals(currentLayer)) { - y = VizUtils.getLayerPlacement(layers, previousLayer, layerDistance); - } - List nodes = layers.get(currentLayer); - if (nodes.size() == 1) { - nodes.get(0).setX(initialNode.x()); - nodes.get(0).setY(y); - nodes.get(0).setZ(initialNode.z()); - } else { - double circumference = 0; - for (Node node : nodes) { - circumference += (node.size() * 2) + node.getTextProperties().getWidth(); - } - circumference = circumference * 1.2f; - - double diameter = circumference / Math.PI; - double theta = (2 * Math.PI) / circumference; - - double tempTheta = 0; - double nodeSize = 0; - - for (Node node : nodes) { - if (!node.isFixed()) { - nodeSize = node.size() + node.getTextProperties().getWidth() / 2; - double arc = nodeSize * 1.2f * theta; - float dx = (float) (diameter * (Math.cos((tempTheta + arc) + (Math.PI / 2)))); - float dy = (float) (diameter * (Math.sin((tempTheta + arc) + (Math.PI / 2)))); - tempTheta += nodeSize * 2 * theta * 1.2f; - node.setX(initialNode.x() + dx); - node.setY(y + dy); - node.setZ(initialNode.z()); - } - } - } - previousLayer = currentLayer; - } - } -} \ No newline at end of file diff --git a/modules/MultiVizPlugin/src/main/java/algorithms/basic/GridLayout.java b/modules/MultiVizPlugin/src/main/java/algorithms/basic/GridLayout.java deleted file mode 100644 index c30ae55d9f..0000000000 --- a/modules/MultiVizPlugin/src/main/java/algorithms/basic/GridLayout.java +++ /dev/null @@ -1,103 +0,0 @@ -/* -Copyright 2008-2011 Gephi -Authors : Mathieu Bastian -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 algorithms.basic; - -import java.util.HashMap; -import java.util.List; -import helpers.VizUtils; -import org.gephi.graph.api.Node; - -/** - * - * @author J - */ -public class GridLayout { - - private int layerDistance; - private HashMap> layers; - private String initialLayer; - private Node initialNode; - private boolean sortLayers; - - public GridLayout(int layerDistance, HashMap> layers, String initialLayer, Node initialNode, boolean sortLayers) { - this.layerDistance = layerDistance; - this.initialLayer = initialLayer; - this.initialNode = initialNode; - this.sortLayers = sortLayers; - if(this.sortLayers) { - this.layers = VizUtils.sortedLayers(layers); - } else this.layers = layers; - } - - public void start(){ - String previousLayer = initialLayer; - for (String currentLayer : layers.keySet()) { - Node biggestNode = VizUtils.getBiggestNode(layers, currentLayer); - float y = initialNode.y(); - - if(!previousLayer.equals(currentLayer)){ - y = VizUtils.getLayerPlacement(layers, previousLayer, layerDistance); - } - - int rows = (int) Math.round(Math.sqrt(layers.get(currentLayer).size())) + 1; - int cols = (int) Math.round(Math.sqrt(layers.get(currentLayer).size())) + 1; - double layerSize = VizUtils.getLayerSize(layers, biggestNode, currentLayer) * 1.2f; - - for (int i = 0; i < rows; i++) { - for (int j = 0; j < cols && (i * rows + j) < layers.get(currentLayer).size(); j++) { - - Node node = layers.get(currentLayer).get(i * rows + j); - - double nx = (-layerSize / 2f) + ((float) j / cols) * layerSize; - double ny = (layerSize / 2f) - ((float) i / rows) * layerSize; - - double tx = nx; - double ty = (y + (y + (ny - y))); - - if (i == 0 && j == 0) { - tx = ((initialNode.x() + (nx - initialNode.x())) + (0)); - } else { - tx = ((initialNode.x() + (nx - initialNode.x())) + (10 * j)); - } - node.setX((float) tx); - node.setY((float) ty); - node.setZ(initialNode.z()); - } - } - previousLayer = currentLayer; - } - } - -} diff --git a/modules/MultiVizPlugin/src/main/java/algorithms/basic/LinearLayout.java b/modules/MultiVizPlugin/src/main/java/algorithms/basic/LinearLayout.java deleted file mode 100644 index 31cf368569..0000000000 --- a/modules/MultiVizPlugin/src/main/java/algorithms/basic/LinearLayout.java +++ /dev/null @@ -1,61 +0,0 @@ - -package algorithms.basic; - -import java.util.HashMap; -import java.util.List; -import helpers.VizUtils; -import org.gephi.graph.api.Node; - -/** - * - * @author J - */ -public class LinearLayout { - - private HashMap> layers; - private String initialLayer; - private Node initialNode; - private boolean sortLayers; - private int layerDistance; - - public LinearLayout(int layerDistance, HashMap> layers, String initialLayer, Node initialNode, boolean sortLayers) { - this.initialLayer = initialLayer ; - this.initialNode = initialNode ; - this.sortLayers = sortLayers; - this.layers = layers ; - if(this.sortLayers){ - this.layers = VizUtils.sortedLayers(layers); - } - } - - public void start() { - String previousLayer = initialLayer; - for (String currentLayer : layers.keySet()) { - Node biggestNode = VizUtils.getBiggestNode(layers, currentLayer); - - float y = initialNode.y(); - - if(!previousLayer.equals(currentLayer)){ - y = VizUtils.getLayerPlacement(layers, previousLayer, layerDistance); - } - - double distance = 0; - int index = 0; - for (Node node : layers.get(currentLayer)) { - if(index == 0) { - node.setX(initialNode.x()); - node.setY(y); - } else { - distance += (node.size() * 2) + (node.getTextProperties().getWidth() + 20); - double randomY = Math.random() * ((biggestNode.size() + biggestNode.getTextProperties().getSize()) - 1 + 1) + 1; - - node.setX(initialNode.x() + (float)distance); - node.setY(y + (float)randomY); - } - node.setZ(initialNode.z()); - index++; - } - previousLayer = currentLayer; - } - } -} \ No newline at end of file diff --git a/modules/MultiVizPlugin/src/main/java/algorithms/basic/RandomLayout.java b/modules/MultiVizPlugin/src/main/java/algorithms/basic/RandomLayout.java deleted file mode 100644 index 41e7ea042c..0000000000 --- a/modules/MultiVizPlugin/src/main/java/algorithms/basic/RandomLayout.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - Copyright 2008-2010 Gephi - Authors : Helder Suzuki - 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 algorithms.basic; - -import java.util.HashMap; -import java.util.List; -import java.util.Random; -import helpers.VizUtils; -import org.gephi.graph.api.Node; - -/** - * - * @author J - */ -public class RandomLayout { - - private int layerDistance; - private HashMap> layers; - private String initialLayer; - private Node initialNode; - private boolean sortLayers; - - public RandomLayout(int layerDistance, HashMap> layers, String initialLayer, Node initialNode, boolean sortLayers) { - this.layerDistance = layerDistance; - this.initialLayer = initialLayer; - this.initialNode = initialNode; - this.sortLayers = sortLayers; - if(this.sortLayers) { - this.layers = VizUtils.sortedLayers(layers); - } else this.layers = layers; - } - - public void start() { - String previousLayer = initialLayer; - for (String currentLayer : layers.keySet()) { - float y = initialNode.y(); - if(!previousLayer.equals(currentLayer)){ - y = VizUtils.getLayerPlacement(layers, previousLayer, layerDistance); - } - Node biggestNode = VizUtils.getBiggestNode(layers, currentLayer); - float layerSize = VizUtils.getLayerSize(layers, biggestNode, currentLayer); - - for (Node node : layers.get(currentLayer)) { - double dx = initialNode.x() + node.size() + (float) (-layerSize / 2 + layerSize * new Random().nextDouble()); - double ly = (y + layerSize / 2) + (float) (-layerSize / 2 + layerSize * new Random().nextDouble()) + node.size(); - node.setX((float) dx); - node.setY((float) ly); - node.setZ(initialNode.y()); - } - previousLayer = currentLayer; - } - } -} From 2e76c1a556e8cf920e6d4f67f426c4be7cba9c89 Mon Sep 17 00:00:00 2001 From: JSiv Date: Sun, 13 Nov 2022 04:01:25 +0000 Subject: [PATCH 08/16] Update AbstractProjectionPropertyEditor.java --- .../AbstractProjectionPropertyEditor.java | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/modules/MultiVizPlugin/src/main/java/helpers/AbstractProjectionPropertyEditor.java b/modules/MultiVizPlugin/src/main/java/helpers/AbstractProjectionPropertyEditor.java index 76bf72e281..012e88ab13 100644 --- a/modules/MultiVizPlugin/src/main/java/helpers/AbstractProjectionPropertyEditor.java +++ b/modules/MultiVizPlugin/src/main/java/helpers/AbstractProjectionPropertyEditor.java @@ -1,6 +1,6 @@ /* Copyright 2008 WebAtlas -Authors : Mathieu Bastian, Mathieu Jacomy, Julian Bilcke +Authors : Mathieu Bastian, Alexis Jacomy, Julian Bilcke Website : http://www.gephi.org This file is part of Gephi. @@ -24,22 +24,23 @@ /** * - * @author Alexis Jacomy + * @author J */ abstract class AbstractProjectionPropertyEditor extends PropertyEditorSupport { protected AbstractProjectionPropertyEditor() { + this.defaultColumns = new String[]{"Node Label", "Edge Type"}; } private String selectedColumn; - private String[] tempoColumns = {"Node Label","Edge Type"}; + private final String[] defaultColumns; @Override public String[] getTags() { if (multiviz.MultiLayerVisualization.selectableColumns.isEmpty()){ - return tempoColumns; + return defaultColumns; } else { - return multiviz.MultiLayerVisualization.selectableColumns.toArray(new String[multiviz.MultiLayerVisualization.selectableColumns.size()]); + return multiviz.MultiLayerVisualization.selectableColumns.toArray(String[]::new); } } @@ -51,9 +52,9 @@ public Object getValue() { @Override public void setValue(Object value) { if(multiviz.MultiLayerVisualization.selectableColumns.isEmpty()){ - for (String dummyColumn : tempoColumns) { - if (dummyColumn.equals((String)value)) { - selectedColumn = dummyColumn; + for (String gColumn : defaultColumns) { + if (gColumn.equals((String)value)) { + selectedColumn = gColumn; break; } } From 06c309870ccf6868730ca0abd7212ce0ddffbdd4 Mon Sep 17 00:00:00 2001 From: JSiv Date: Sun, 13 Nov 2022 04:02:10 +0000 Subject: [PATCH 09/16] Update LayoutAlgorithmProperty.java --- .../src/main/java/helpers/LayoutAlgorithmProperty.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/modules/MultiVizPlugin/src/main/java/helpers/LayoutAlgorithmProperty.java b/modules/MultiVizPlugin/src/main/java/helpers/LayoutAlgorithmProperty.java index d1901a0f93..5e03ad03fd 100644 --- a/modules/MultiVizPlugin/src/main/java/helpers/LayoutAlgorithmProperty.java +++ b/modules/MultiVizPlugin/src/main/java/helpers/LayoutAlgorithmProperty.java @@ -28,10 +28,11 @@ */ public abstract class LayoutAlgorithmProperty extends PropertyEditorSupport{ - private String[] listOfAlgorithms = {"Circle Layout", "Grid Layout", "Linear Layout", "ForceAtlas", "ForceAtlas2", "Fruchterman Reingold"}; + private final String[] listOfAlgorithms; private String selectedAlgorithm = "Linear Layout"; protected LayoutAlgorithmProperty(){ + this.listOfAlgorithms = new String[]{"Circle Layout", "Grid Layout", "Linear Layout", "Random Layout", "ForceAtlas", "ForceAtlas2", "Fruchterman Reingold"}; } @@ -64,4 +65,4 @@ public String getAsText() { public void setAsText(String text) throws IllegalArgumentException { setValue(text); } -} \ No newline at end of file +} From 9fec7a18f64a39d515efb5a2aa3925eda3de11b0 Mon Sep 17 00:00:00 2001 From: JSiv Date: Sun, 8 Jan 2023 18:03:07 +0300 Subject: [PATCH 10/16] Code Cleanup --- .../src/main/java/algorithms/BasicLayout.java | 204 ---------- .../algorithms/force/ForceAtlas2Layout.java | 380 ------------------ .../algorithms/force/ForceAtlasLayout.java | 229 ----------- .../force/FruchtermanReingoldLayout.java | 195 --------- 4 files changed, 1008 deletions(-) delete mode 100644 modules/MultiVizPlugin/src/main/java/algorithms/BasicLayout.java delete mode 100644 modules/MultiVizPlugin/src/main/java/algorithms/force/ForceAtlas2Layout.java delete mode 100644 modules/MultiVizPlugin/src/main/java/algorithms/force/ForceAtlasLayout.java delete mode 100644 modules/MultiVizPlugin/src/main/java/algorithms/force/FruchtermanReingoldLayout.java diff --git a/modules/MultiVizPlugin/src/main/java/algorithms/BasicLayout.java b/modules/MultiVizPlugin/src/main/java/algorithms/BasicLayout.java deleted file mode 100644 index 1204b056ad..0000000000 --- a/modules/MultiVizPlugin/src/main/java/algorithms/BasicLayout.java +++ /dev/null @@ -1,204 +0,0 @@ -/* - * Algorithm : Circle Layout - * Copyright (c) 2010, Matt Groeninger - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, are - * permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this list of - * conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright notice, this list - * of conditions and the following disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF - * THE POSSIBILITY OF SUCH DAMAGE. - */ - -/** - * Algorithm : Grid Layout - * Copyright 2008-2011 Gephi - * Authors : Mathieu Bastian - * Website : http://www.gephi.org - * - * Algorithm : Random Layout - * Copyright 2008-2010 Gephi - * Authors : Helder Suzuki - * - * 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 algorithms; - -import java.util.HashMap; -import java.util.List; -import helpers.VizUtils; -import java.awt.GridLayout; -import java.util.Random; -import org.gephi.graph.api.Node; -import org.gephi.layout.plugin.random.RandomLayout; - -/** - * - * @author J - */ -public class BasicLayout { - - private final HashMap> layers; - private final String initialLayer; - private final Node initialNode; - private final String layoutAlgorithm; - private final int layerDistance; - - public BasicLayout(int layerDistance, HashMap> layers, String initialLayer, Node initialNode, boolean sortLayers, String layoutAlgorithm) { - this.initialLayer = initialLayer; - this.initialNode = initialNode; - if(sortLayers){ - this.layers = VizUtils.sortedLayers(layers); - } else this.layers = layers; - this.layerDistance = layerDistance; - this.layoutAlgorithm = layoutAlgorithm; - } - - public void start() { - String previousLayer = initialLayer; - for (String currentLayer : layers.keySet()) { - - float y = initialNode.y(); - if (!previousLayer.equals(currentLayer)) { - y = VizUtils.getLayerPlacement(layers, previousLayer, layerDistance); - } - - Node biggestNode = VizUtils.getBiggestNode(layers, currentLayer); - - if (null != layoutAlgorithm) switch (layoutAlgorithm) { - case "Random Layout": - float layerSpace = VizUtils.getLayerSize(layers, biggestNode, currentLayer); - for (Node node : layers.get(currentLayer)) { - double dx = initialNode.x() + node.size() + (float) (-layerSpace / 2 + layerSpace * new Random().nextDouble()); - double ly = (y + layerSpace / 2) + (float) (-layerSpace / 2 + layerSpace * new Random().nextDouble()) + node.size(); - node.setX((float) dx); - node.setY((float) ly); - node.setZ(initialNode.y()); - } break; - case "Linear Layout": - double distance = 0; - int index = 0; - for (Node node : layers.get(currentLayer)) { - if(index == 0) { - node.setX(initialNode.x()); - node.setY(y); - } else { - distance += layers.get(currentLayer).get(index-1).size() + (node.size() * 2) + (node.getTextProperties().getWidth() + 20); - double randomY = Math.random() * ((biggestNode.size() + biggestNode.getTextProperties().getSize()) - 1 + 1) + 1; - - node.setX(initialNode.x() + (float)distance); - node.setY(y + (float)randomY); - } - node.setZ(initialNode.z()); - index++; - } break; - case "Grid Layout": - int rows = (int) Math.round(Math.sqrt(layers.get(currentLayer).size())) + 1; - int cols = (int) Math.round(Math.sqrt(layers.get(currentLayer).size())) + 1; - double layerSize = VizUtils.getLayerSize(layers, biggestNode, currentLayer) * 1.2f; - for (int i = 0; i < rows; i++) { - for (int j = 0; j < cols && (i * rows + j) < layers.get(currentLayer).size(); j++) { - - Node node = layers.get(currentLayer).get(i * rows + j); - - double nx = (-layerSize / 2f) + ((float) j / cols) * layerSize; - double ny = (layerSize / 2f) - ((float) i / rows) * layerSize; - - double tx = nx; - double ty = (y + (y + (ny - y))); - - if (i == 0 && j == 0) { - tx = ((initialNode.x() + (nx - initialNode.x())) + (0)); - } else { - tx = ((initialNode.x() + (nx - initialNode.x())) + (10 * j)); - } - node.setX((float) tx); - node.setY((float) ty); - node.setZ(initialNode.z()); - } - } break; - case "Circle Layout": - List nodes = layers.get(currentLayer); - if (nodes.size() == 1) { - nodes.get(0).setX(initialNode.x()); - nodes.get(0).setY(y); - nodes.get(0).setZ(initialNode.z()); - } else { - double circumference = 0; - for (Node node : nodes) { - circumference += (node.size() * 2) + node.getTextProperties().getWidth(); - } - circumference = circumference * 1.2f; - - double diameter = circumference / Math.PI; - double theta = (2 * Math.PI) / circumference; - - double tempTheta = 0; - double nodeSize = 0; - - for (Node node : nodes) { - if (!node.isFixed()) { - nodeSize = node.size() + node.getTextProperties().getWidth() / 2; - double arc = nodeSize * 1.2f * theta; - float dx = (float) (diameter * (Math.cos((tempTheta + arc) + (Math.PI / 2)))); - float dy = (float) (diameter * (Math.sin((tempTheta + arc) + (Math.PI / 2)))); - tempTheta += nodeSize * 2 * theta * 1.2f; - node.setX(initialNode.x() + dx); - node.setY(y + dy); - node.setZ(initialNode.z()); - } - } - } break; - default: - break; - } - - previousLayer = currentLayer; - } - } -} \ No newline at end of file diff --git a/modules/MultiVizPlugin/src/main/java/algorithms/force/ForceAtlas2Layout.java b/modules/MultiVizPlugin/src/main/java/algorithms/force/ForceAtlas2Layout.java deleted file mode 100644 index c2be32b819..0000000000 --- a/modules/MultiVizPlugin/src/main/java/algorithms/force/ForceAtlas2Layout.java +++ /dev/null @@ -1,380 +0,0 @@ -/* - Copyright 2008-2011 Gephi - Authors : Mathieu Jacomy - 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 algorithms.force; - -import helpers.Point; -import java.util.HashMap; -import java.util.List; -import helpers.VizUtils; -import java.util.ArrayList; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.Future; -import multiviz.MLVBuilder; -import org.gephi.graph.api.Edge; -import org.gephi.graph.api.Graph; -import org.gephi.graph.api.GraphModel; -import org.gephi.graph.api.Interval; -import org.gephi.graph.api.Node; -import org.gephi.layout.plugin.forceAtlas2.ForceAtlas2; -import org.gephi.layout.plugin.forceAtlas2.ForceAtlas2Builder; -import org.gephi.layout.plugin.forceAtlas2.ForceAtlas2LayoutData; -import org.gephi.layout.plugin.forceAtlas2.ForceFactory; -import org.gephi.layout.plugin.forceAtlas2.ForceFactory.RepulsionForce; -import org.gephi.layout.plugin.forceAtlas2.NodesThread; -import org.gephi.layout.plugin.forceAtlas2.Region; -import org.gephi.layout.spi.LayoutBuilder; - -/** - * - * @author J - */ -public class ForceAtlas2Layout { - - private final int layerDistance; - private final HashMap> layers; - private final String initialLayer; - private final Node initialNode; - private float speed; - private final double gravity; - private final boolean splitAsLevel; - private final boolean sortLayers; - - private double outboundAttCompensation; - private final double edgeWeightInfluence; - private final double jitterTolerance; - private double scalingRatio; - private double speedEfficiency; - private final boolean isOutboundAttractionDistribution; - private final boolean isAdjustSizes; - private boolean barnesHutOptimize; - private final double barnesHutTheta; - private final boolean linLogMode; - private final boolean normalizeEdgeWeights; - private final boolean strongGravityMode; - private int threadCount; - - private final int iterations; - private final int size; - boolean dynamicWeight; - private final List allNodes; - private final List allEdges; - Graph graph; - Interval timeInterval; - GraphModel graphModel; - - public ForceAtlas2Layout(int layerDistance, HashMap> layers, String initialLayer, Node initialNode, boolean splitAsLevel, boolean sortLayers, int noOfIterations, double area, float speed, double gravity, boolean isDynamicWeight, Interval interval, List nodes, List edges, Graph graph, GraphModel graphModel) { - this.strongGravityMode = false; - this.normalizeEdgeWeights = false; - this.linLogMode = false; - this.barnesHutTheta = 1.2; - this.barnesHutOptimize = false; - this.isAdjustSizes = true; - this.isOutboundAttractionDistribution = false; - this.speedEfficiency = 1.; - this.jitterTolerance = 1d; - this.edgeWeightInfluence = 1.; - this.outboundAttCompensation = 1; - this.layerDistance = layerDistance; - this.initialLayer = initialLayer; - this.initialNode = initialNode; - this.splitAsLevel = splitAsLevel; - this.sortLayers = sortLayers; - if (this.sortLayers) { - this.layers = VizUtils.sortedLayers(layers); - } else { - this.layers = layers; - } - this.speed = speed; - this.gravity = gravity; - this.iterations = noOfIterations; - this.size = nodes.size(); - this.dynamicWeight = isDynamicWeight; - this.graph = graph; - this.allNodes = nodes; - this.allEdges = edges; - this.timeInterval = interval; - this.barnesHutOptimize = size >= 1000; - this.threadCount = Math.min(4, Math.max(1, Runtime.getRuntime().availableProcessors() - 1)); - this.graphModel = graphModel; - } - - public void start() { - threadCount = (Math.max(1, Runtime.getRuntime().availableProcessors() - 1)); - - for (int i = 0; i < iterations; i++) { - if (splitAsLevel) { - if (size >= 100) { - scalingRatio = 2.0; - } else { - scalingRatio = 10.0; - } - runAlgorithm(allNodes, allEdges, null); - } else { - int counter = 0; - for (String layer : layers.keySet()) { - List nodes = layers.get(layer); - List edges = VizUtils.getLayerEdges(allEdges, nodes); - Point ghostLayer = new Point(initialNode.x(), initialNode.y() + layerDistance * counter); - barnesHutOptimize = nodes.size() >= 1000; - if (nodes.size() >= 100) { - scalingRatio = 2.0; - } else { - scalingRatio = 10.0; - } - runAlgorithm(nodes, edges, ghostLayer); -// ForceAtlas2 forceAtlas2Layout = new ForceAtlas2(new ForceAtlas2Builder()); -// forceAtlas2Layout.setAdjustSizes(true); -// forceAtlas2Layout.setGraphModel(graphModel); -// forceAtlas2Layout.setGravity(gravity); -// forceAtlas2Layout.goAlgo(); - counter++;} - } - } - VizUtils.initiateLayerSplitter(layers, initialLayer, initialNode, splitAsLevel, layerDistance); - } - - private void runAlgorithm(List nodes, List edges, Point ghost) { - Region rootRegion = null; - int currentThreadCount; - ExecutorService pool; - - for (Node node : nodes) { - if (node.getLayoutData() == null || !(node.getLayoutData() instanceof ForceAtlas2LayoutData)) { - ForceAtlas2LayoutData nLayout = new ForceAtlas2LayoutData(); - node.setLayoutData(nLayout); - } - org.gephi.layout.plugin.forceAtlas2.ForceAtlas2LayoutData nLayout = node.getLayoutData(); - nLayout.mass = 1 + graph.getDegree(node); - nLayout.old_dx = 0; - nLayout.old_dy = 0; - nLayout.dx = 0; - nLayout.dy = 0; - } - - pool = Executors.newFixedThreadPool(threadCount); - currentThreadCount = threadCount; - - /** - * If Barnes Hut active, initialize root region* - */ - Node[] nodes_arr = nodes.toArray(Node[]::new); - if (barnesHutOptimize) { - rootRegion = new Region(nodes_arr); - rootRegion.buildSubRegions(); - } - - /** - * If outboundAttractionDistribution active, compensate.* - */ - if (isOutboundAttractionDistribution) { - outboundAttCompensation = 0; - for (Node n : nodes) { - ForceAtlas2LayoutData nLayout = n.getLayoutData(); - outboundAttCompensation += nLayout.mass; - } - outboundAttCompensation /= nodes.size(); - } - - /** - * Repulsion (and gravity)Multi-threaded* - */ - RepulsionForce Repulsion = ForceFactory.builder.buildRepulsion(isAdjustSizes, scalingRatio); - int taskCount = 8 * currentThreadCount; - // The threadPool Executor Service will manage the fetching of tasks and threads. - - // We make more tasks than threads because some tasks may need more time to compute. - ArrayList threads = new ArrayList<>(); - - for (int t = taskCount; t > 0; t--) { - int from = (int) Math.floor(nodes.size() * (t - 1) / taskCount); - int to = (int) Math.floor(nodes.size() * t / taskCount); - java.util.concurrent.Future future = pool.submit(new NodesThread(nodes_arr, from, to, barnesHutOptimize, barnesHutTheta, gravity, (strongGravityMode) ? (ForceFactory.builder.getStrongGravity(scalingRatio)) : (Repulsion), scalingRatio, rootRegion, Repulsion)); - threads.add(future); - } - - threads.forEach(future -> { - try { - future.get(); - } catch (InterruptedException | ExecutionException e) { - throw new RuntimeException("Unable to layout " + this.getClass().getSimpleName() + ".", e); - } - }); - - // Attraction - ForceFactory.AttractionForce Attraction = ForceFactory.builder.buildAttraction(linLogMode, isOutboundAttractionDistribution, isAdjustSizes, 1 * ((isOutboundAttractionDistribution) ? (outboundAttCompensation) : (1))); - if (edgeWeightInfluence == 0) { - for (Edge e : edges) { - Attraction.apply(e.getSource(), e.getTarget(), 1); - } - } else if (edgeWeightInfluence == 1) { - if (normalizeEdgeWeights) { - Double w; - Double edgeWeightMin = Double.MAX_VALUE; - Double edgeWeightMax = Double.MIN_VALUE; - for (Edge e : edges) { - w = VizUtils.getEdgeWeight(e, dynamicWeight, timeInterval); - edgeWeightMin = Math.min(w, edgeWeightMin); - edgeWeightMax = Math.max(w, edgeWeightMax); - } - if (edgeWeightMin < edgeWeightMax) { - for (Edge e : edges) { - w = (VizUtils.getEdgeWeight(e, dynamicWeight, timeInterval) - edgeWeightMin) / (edgeWeightMax - edgeWeightMin); - Attraction.apply(e.getSource(), e.getTarget(), w); - } - } else { - for (Edge e : edges) { - Attraction.apply(e.getSource(), e.getTarget(), 1.); - } - } - } else { - for (Edge e : edges) { - Attraction.apply(e.getSource(), e.getTarget(), VizUtils.getEdgeWeight(e, dynamicWeight, timeInterval)); - } - } - } else { - if (normalizeEdgeWeights) { - Double w; - Double edgeWeightMin = Double.MAX_VALUE; - Double edgeWeightMax = Double.MIN_VALUE; - for (Edge e : edges) { - w = VizUtils.getEdgeWeight(e, dynamicWeight, timeInterval); - edgeWeightMin = Math.min(w, edgeWeightMin); - edgeWeightMax = Math.max(w, edgeWeightMax); - } - if (edgeWeightMin < edgeWeightMax) { - for (Edge e : edges) { - w = (VizUtils.getEdgeWeight(e, dynamicWeight, timeInterval) - edgeWeightMin) / (edgeWeightMax - edgeWeightMin); - Attraction.apply(e.getSource(), e.getTarget(), Math.pow(w, edgeWeightInfluence)); - } - } else { - edges.forEach(e -> { - Attraction.apply(e.getSource(), e.getTarget(), 1.); - }); - } - } else { - edges.forEach(e -> { - Attraction.apply(e.getSource(), e.getTarget(), Math.pow(VizUtils.getEdgeWeight(e, dynamicWeight, timeInterval), edgeWeightInfluence)); - }); - } - } - - double totalSwinging = 0d; // How much irregular movement - double totalEffectiveTraction = 0d; // Hom much useful movement - for (Node n : nodes) { - ForceAtlas2LayoutData nLayout = n.getLayoutData(); - if (!n.isFixed()) { - double swinging = Math.sqrt(Math.pow(nLayout.old_dx - nLayout.dx, 2) + Math.pow(nLayout.old_dy - nLayout.dy, 2)); - totalSwinging += nLayout.mass * swinging; // If the node has a burst change of direction, then it's not converging. - totalEffectiveTraction += nLayout.mass * 0.5 * Math.sqrt(Math.pow(nLayout.old_dx + nLayout.dx, 2) + Math.pow(nLayout.old_dy + nLayout.dy, 2)); - } - } - - // We want that swingingMovement < tolerance * convergenceMovement - // Optimize jitter tolerance - // The 'right' jitter tolerance for this network. Bigger networks need more tolerance. Denser networks need less tolerance. Totally empiric. - double estimatedOptimalJitterTolerance = 0.05 * Math.sqrt(nodes.size()); - double minJT = Math.sqrt(estimatedOptimalJitterTolerance); - double maxJT = 10; - double jt = jitterTolerance * Math.max(minJT, Math.min(maxJT, estimatedOptimalJitterTolerance * totalEffectiveTraction / Math.pow(nodes.size(), 2))); - - double minSpeedEfficiency = 0.05; - - // Protection against erratic behavior - if (totalSwinging / totalEffectiveTraction > 2.0) { - if (speedEfficiency > minSpeedEfficiency) { - speedEfficiency *= 0.5; - } - jt = Math.max(jt, jitterTolerance); - } - double targetSpeed = jt * speedEfficiency * totalEffectiveTraction / totalSwinging; - - // Speed efficiency is how the speed really corresponds to the swinging vs. convergence tradeoff - // We adjust it slowly and carefully - if (totalSwinging > jt * totalEffectiveTraction) { - if (speedEfficiency > minSpeedEfficiency) { - speedEfficiency *= 0.7; - } - } else if (speed < 1000) { - speedEfficiency *= 1.3; - } - - // But the speed shoudn't rise too much too quickly, since it would make the convergence drop dramatically. - double maxRise = 0.5; // Max rise: 50% - speed = (float) (speed + Math.min(targetSpeed - speed, maxRise * speed)); - - if (isAdjustSizes) { - // If nodes overlap prevention is active, it's not possible to trust the swinging mesure. - for (Node n : nodes) { - org.gephi.layout.plugin.forceAtlas2.ForceAtlas2LayoutData nLayout = n.getLayoutData(); - if (!n.isFixed()) { - - // Adaptive auto-speed: the speed of each node is lowered - // when the node swings. - double swinging = nLayout.mass * Math.sqrt( - (nLayout.old_dx - nLayout.dx) * (nLayout.old_dx - nLayout.dx) - + (nLayout.old_dy - nLayout.dy) * (nLayout.old_dy - nLayout.dy)); - double factor = 0.1 * speed / (1f + Math.sqrt(speed * swinging)); - - double df = Math.sqrt(Math.pow(nLayout.dx, 2) + Math.pow(nLayout.dy, 2)); - factor = Math.min(factor * df, 10.) / df; - - double x = n.x() + nLayout.dx * factor; - double y = n.y() + nLayout.dy * factor; - - n.setX((float) x); - n.setY((float) y); - } - } - } else { - nodes.forEach(n -> { - org.gephi.layout.plugin.forceAtlas2.ForceAtlas2LayoutData nLayout = n.getLayoutData(); - if (!n.isFixed()) { - // Adaptive auto-speed: the speed of each node is lowered - // when the node swings. - double swinging = nLayout.mass * Math.sqrt((nLayout.old_dx - nLayout.dx) * (nLayout.old_dx - nLayout.dx) + (nLayout.old_dy - nLayout.dy) * (nLayout.old_dy - nLayout.dy)); - double factor = speed / (1f + Math.sqrt(speed * swinging)); - - double x = n.x() + nLayout.dx * factor; - double y = n.y() + nLayout.dy * factor; - - n.setX((float) x); - n.setY((float) y); - } - }); - } - } -} \ No newline at end of file diff --git a/modules/MultiVizPlugin/src/main/java/algorithms/force/ForceAtlasLayout.java b/modules/MultiVizPlugin/src/main/java/algorithms/force/ForceAtlasLayout.java deleted file mode 100644 index 26b2f6e3b9..0000000000 --- a/modules/MultiVizPlugin/src/main/java/algorithms/force/ForceAtlasLayout.java +++ /dev/null @@ -1,229 +0,0 @@ -/* - Copyright 2008-2010 Gephi - Authors : Helder Suzuki - 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 algorithms.force; - -import helpers.Point; -import java.util.HashMap; -import java.util.List; -import helpers.VizUtils; -import org.gephi.graph.api.Edge; -import org.gephi.graph.api.Graph; -import org.gephi.graph.api.Interval; -import org.gephi.graph.api.Node; -import org.gephi.layout.plugin.ForceVectorNodeLayoutData; -import org.gephi.layout.plugin.ForceVectorUtils; - -/** - * - * @author J - */ -public class ForceAtlasLayout { - - private int layerDistance; - private HashMap> layers; - private String initialLayer; - private Node initialNode; - private boolean sortLayers; - private boolean splitAsLevel; - - public double inertia; - private double repulsionStrength; - private double attractionStrength; - private double maxDisplacement; - private boolean freezeBalance; - private double freezeStrength; - private double freezeInertia; - private double gravity; - private double speed; - private double cooling; - private boolean outboundAttractionDistribution; - private boolean isDynamicWeight; - private Interval timeInterval; - private List allNodes; - private List allEdges; - private Graph graph; - private int iterations; - - public ForceAtlasLayout(int layerDistance, HashMap> layers, String initialLayer, Node initialNode, boolean sortLayers, boolean splitAsLevel, double gravity, float speed, boolean isDynamicWeight, Interval interval, List nodes, List edges, Graph graph, int iterationnos) { - this.layerDistance = layerDistance; - this.initialLayer = initialLayer; - this.initialNode = initialNode; - this.sortLayers = sortLayers; - this.splitAsLevel = splitAsLevel; - if (this.sortLayers) { - this.layers = VizUtils.sortedLayers(layers); - } else { - this.layers = layers; - } - this.isDynamicWeight = isDynamicWeight; - this.timeInterval = interval; - this.iterations = iterationnos; - this.gravity = gravity; - this.speed = speed; - - this.inertia = 0.1; - this.repulsionStrength = 200d; - this.attractionStrength = 10d; - this.maxDisplacement = 10d; - - this.freezeBalance = true; - this.freezeStrength = 80d; - - //gravity = 30d; - //speed = 1d; - this.cooling = 1d; - - this.graph = graph; - this.outboundAttractionDistribution = false; - this.allNodes = nodes; - this.allEdges = edges; - } - - public void start() { - try { - for (int i = 0; i < iterations; i++) { - if (splitAsLevel) { - runAlgorithm(allNodes, allEdges, null); - } else { - int counter = 0; - for (String currentLayer : layers.keySet()) { - Point ghostPoint = new Point(initialNode.x(), initialNode.y() + (layerDistance * counter * 2)); - List nodes = layers.get(currentLayer); - List edges = VizUtils.getLayerEdges(layers, allEdges, nodes); - runAlgorithm(nodes, edges, ghostPoint); - counter++; - } - - } - } - } catch (Exception e) { - e.printStackTrace(); - } - VizUtils.initiateLayerSplitter(layers, initialLayer, initialNode, splitAsLevel, layerDistance); - } - - private void runAlgorithm(List nodes, List edges, Point ghostPoint) { - for (Node n : nodes) { - if (n.getLayoutData() == null || !(n.getLayoutData() instanceof ForceVectorNodeLayoutData)) { - n.setLayoutData(new ForceVectorNodeLayoutData()); - } - - ForceVectorNodeLayoutData layoutData = n.getLayoutData(); - layoutData.old_dx = layoutData.dx; - layoutData.old_dy = layoutData.dy; - layoutData.dx *= inertia; - layoutData.dy *= inertia; - } - // repulsion - for (Node n1 : nodes) { - for (Node n2 : nodes) { - if (n1 != n2) { - ForceVectorUtils.fcBiRepulsor_noCollide(n1, n2, repulsionStrength * (1 + graph.getDegree(n1)) * (1 + graph.getDegree(n2))); - } - } - } - // attraction - if (outboundAttractionDistribution) { - for (Edge e : edges) { - Node nf = e.getSource(); - Node nt = e.getTarget(); - double bonus = (nf.isFixed() || nt.isFixed()) ? (100) : (1); - bonus *= VizUtils.getEdgeWeight(e, isDynamicWeight, timeInterval); - ForceVectorUtils.fcBiAttractor_noCollide(nf, nt, - bonus * attractionStrength / (1 + graph.getDegree(nf))); - } - } else { - for (Edge e : edges) { - Node nf = e.getSource(); - Node nt = e.getTarget(); - double bonus = (nf.isFixed() || nt.isFixed()) ? (100) : (1); - bonus *= VizUtils.getEdgeWeight(e, isDynamicWeight, timeInterval); - ForceVectorUtils.fcBiAttractor_noCollide(nf, nt, bonus * attractionStrength); - } - } - - // gravity - for (Node n : nodes) { - float nx = n.x(); - float ny = n.y(); - double d = 0.0001 + Math.sqrt(nx * nx + ny * ny); - double gf = 0.0001 * gravity * d; - ForceVectorNodeLayoutData layoutData = n.getLayoutData(); - layoutData.dx -= gf * nx / d; - layoutData.dy -= gf * ny / d; - } - - // speed - if (freezeBalance) { - for (Node n : nodes) { - ForceVectorNodeLayoutData layoutData = n.getLayoutData(); - layoutData.dx *= speed * 10f; - layoutData.dy *= speed * 10f; - } - } else { - for (Node n : nodes) { - ForceVectorNodeLayoutData layoutData = n.getLayoutData(); - layoutData.dx *= speed; - layoutData.dy *= speed; - } - } - - // apply forces - for (Node n : nodes) { - ForceVectorNodeLayoutData nLayout = n.getLayoutData(); - if (!n.isFixed()) { - double d = 0.0001 + Math.sqrt(nLayout.dx * nLayout.dx + nLayout.dy * nLayout.dy); - float ratio; - if (freezeBalance) { - nLayout.freeze = (float) (freezeInertia * nLayout.freeze - + (1 - freezeInertia) * 0.1 * freezeStrength * (Math.sqrt(Math.sqrt( - (nLayout.old_dx - nLayout.dx) * (nLayout.old_dx - nLayout.dx) - + (nLayout.old_dy - nLayout.dy) * (nLayout.old_dy - nLayout.dy))))); - ratio = (float) Math.min((d / (d * (1f + nLayout.freeze))), maxDisplacement / d); - } else { - ratio = (float) Math.min(1, maxDisplacement / d); - } - nLayout.dx *= ratio / cooling; - nLayout.dy *= ratio / cooling; - float x = n.x() + nLayout.dx; - float y = n.y() + nLayout.dy; - - n.setX(x); - n.setY(y); - } - } - } -} diff --git a/modules/MultiVizPlugin/src/main/java/algorithms/force/FruchtermanReingoldLayout.java b/modules/MultiVizPlugin/src/main/java/algorithms/force/FruchtermanReingoldLayout.java deleted file mode 100644 index 82a0c4e56b..0000000000 --- a/modules/MultiVizPlugin/src/main/java/algorithms/force/FruchtermanReingoldLayout.java +++ /dev/null @@ -1,195 +0,0 @@ -/* - Copyright 2008-2010 Gephi - Authors : Mathieu Jacomy - 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 algorithms.force; - -import helpers.Point; -import java.util.HashMap; -import java.util.List; -import helpers.VizUtils; -import org.gephi.graph.api.Edge; -import org.gephi.graph.api.Node; -import org.gephi.layout.plugin.ForceVectorNodeLayoutData; - -/** - * - * @author J - */ -public class FruchtermanReingoldLayout { - - - private static final float SPEED_DIVISOR = 800; - private static final float AREA_MULTIPLICATOR = 10000; - - private final int layerDistance; - private final HashMap> layers; - private final String initialLayer; - private final Node initialNode; - private final boolean sortLayers; - private final boolean splitAsLevel; - private final int iteration; - private final List allEdges; - private final List allNodes; - private final double gravity; - private final float speed; - private final double area; - - public FruchtermanReingoldLayout(int noOfIterations, int layerDistance, List edges, double area, double gravity, float speed, HashMap> layers, String initialLayer, Node initialNode, boolean sortLayers, boolean splitAsLevel, List nodes) { - this.layerDistance = layerDistance; - this.iteration = noOfIterations; - this.initialLayer = initialLayer; - this.initialNode = initialNode; - this.sortLayers = sortLayers; - this.splitAsLevel = splitAsLevel; - if (this.sortLayers) { - this.layers = VizUtils.sortedLayers(layers); - } else { - this.layers = layers; - } - this.allEdges = edges; - this.allNodes = nodes; - this.area = area; - this.gravity = gravity; - this.speed = speed; - } - - public void start() { - for (int i = 0; i < iteration; i++) { - if(splitAsLevel) runAlgorithm(allNodes, allEdges, null); - else { - int counter = 0; - for (String currentLayer : layers.keySet()) { - Point ghostPoint = new Point(initialNode.x(), initialNode.y() + (layerDistance * counter * 2)); - List nodes = layers.get(currentLayer); - List edges = VizUtils.getLayerEdges(layers, allEdges, nodes); - runAlgorithm(nodes, edges, ghostPoint); - counter++; - } - } - } - VizUtils.initiateLayerSplitter(layers, initialLayer, initialNode, splitAsLevel, layerDistance); - } - - private void runAlgorithm(List nodes, List edges, Point ghostPoint) { - try { - for (Node node : nodes) { - if (node.getLayoutData() == null || !(node.getLayoutData() instanceof ForceVectorNodeLayoutData)) { - node.setLayoutData(new ForceVectorNodeLayoutData()); - } - ForceVectorNodeLayoutData layoutData = node.getLayoutData(); - layoutData.dx = 0; - layoutData.dy = 0; - } - - // Déplacement limite : on peut le calibrer... - float maxDisplace = (float) (Math.sqrt(AREA_MULTIPLICATOR * area) / 10f); - - // La variable k, l'idée principale du layout. - float k = (float) Math.sqrt((AREA_MULTIPLICATOR * area) / (1f + nodes.size())); - - if (ghostPoint != null) { - /** - * use ghost nodes to attract nodes - */ - } - - // On fait toutes les paires de noeuds - nodes.forEach(N1 -> { - nodes.stream().filter(N2 -> (N1 != N2)).forEachOrdered(N2 -> { - // distance en x entre les deux noeuds - float xDist = N1.x() - N2.x(); - float yDist = N1.y() - N2.y(); - // distance tout court - float dist = (float) Math.sqrt(xDist * xDist + yDist * yDist); - if (dist > 0) { - // Force de répulsion - float repulsiveF = k * k / dist; - ForceVectorNodeLayoutData layoutData = N1.getLayoutData(); - // on l'applique... - layoutData.dx += xDist / dist * repulsiveF; - layoutData.dy += yDist / dist * repulsiveF; - } - }); - }); - edges.forEach(E -> { - // Idem, pour tous les noeuds on applique la force d'attraction - Node Nf = E.getSource(); - Node Nt = E.getTarget(); - float xDist = Nf.x() - Nt.x(); - float yDist = Nf.y() - Nt.y(); - float dist = (float) Math.sqrt(xDist * xDist + yDist * yDist); - float attractiveF = dist * dist / k; - if (dist > 0) { - ForceVectorNodeLayoutData sourceLayoutData = Nf.getLayoutData(); - ForceVectorNodeLayoutData targetLayoutData = Nt.getLayoutData(); - sourceLayoutData.dx -= xDist / dist * attractiveF; - sourceLayoutData.dy -= yDist / dist * attractiveF; - targetLayoutData.dx += xDist / dist * attractiveF; - targetLayoutData.dy += yDist / dist * attractiveF; - } - }); - // gravity - nodes.forEach(n -> { - ForceVectorNodeLayoutData layoutData = n.getLayoutData(); - float d = (float) Math.sqrt(n.x() * n.x() + n.y() * n.y()); - float gf = 0.01f * k * (float) gravity * d; - layoutData.dx -= gf * n.x() / d; - layoutData.dy -= gf * n.y() / d; - }); - // speed - nodes.forEach(n -> { - ForceVectorNodeLayoutData layoutData = n.getLayoutData(); - layoutData.dx *= speed / SPEED_DIVISOR; - layoutData.dy *= speed / SPEED_DIVISOR; - - }); - nodes.forEach(n -> { - // Maintenant on applique le déplacement calculé sur les noeuds. - // nb : le déplacement à chaque passe "instantanné" correspond à la force : c'est une sorte d'accélération. - ForceVectorNodeLayoutData layoutData = n.getLayoutData(); - float xDist = layoutData.dx; - float yDist = layoutData.dy; - float dist = (float) Math.sqrt(layoutData.dx * layoutData.dx + layoutData.dy * layoutData.dy); - if (dist > 0 && !n.isFixed()) { - float limitedDist = Math.min(maxDisplace * (speed / SPEED_DIVISOR), dist); - n.setX(n.x() + xDist / dist * limitedDist); - n.setY(n.y() + yDist / dist * limitedDist); - } - }); - } catch (Exception e) { - System.out.println("Frutcherman " + e.getMessage()); - } - } -} From a246ca0db15692adc6205ff4d4ccfd7b0be5f14f Mon Sep 17 00:00:00 2001 From: JSiv Date: Sun, 8 Jan 2023 18:05:07 +0300 Subject: [PATCH 11/16] Update LayoutAlgorithmProperty.java --- .../src/main/java/helpers/LayoutAlgorithmProperty.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/MultiVizPlugin/src/main/java/helpers/LayoutAlgorithmProperty.java b/modules/MultiVizPlugin/src/main/java/helpers/LayoutAlgorithmProperty.java index 5e03ad03fd..5bb573000d 100644 --- a/modules/MultiVizPlugin/src/main/java/helpers/LayoutAlgorithmProperty.java +++ b/modules/MultiVizPlugin/src/main/java/helpers/LayoutAlgorithmProperty.java @@ -32,7 +32,7 @@ public abstract class LayoutAlgorithmProperty extends PropertyEditorSupport{ private String selectedAlgorithm = "Linear Layout"; protected LayoutAlgorithmProperty(){ - this.listOfAlgorithms = new String[]{"Circle Layout", "Grid Layout", "Linear Layout", "Random Layout", "ForceAtlas", "ForceAtlas2", "Fruchterman Reingold"}; + this.listOfAlgorithms = new String[]{"Circle Layout", "Grid Layout", "Linear Layout", "Random Layout", "ForceAtlas2", "Fruchterman Reingold", "Yifan Hu"}; } From 0310b0b5ff9d01b0614e5556f4f5f54b0775801a Mon Sep 17 00:00:00 2001 From: JSiv Date: Sun, 8 Jan 2023 18:06:58 +0300 Subject: [PATCH 12/16] Update VizUtils.java --- .../src/main/java/helpers/VizUtils.java | 88 +------------------ 1 file changed, 4 insertions(+), 84 deletions(-) diff --git a/modules/MultiVizPlugin/src/main/java/helpers/VizUtils.java b/modules/MultiVizPlugin/src/main/java/helpers/VizUtils.java index 8aff8f3c86..5ac8e096c4 100644 --- a/modules/MultiVizPlugin/src/main/java/helpers/VizUtils.java +++ b/modules/MultiVizPlugin/src/main/java/helpers/VizUtils.java @@ -4,16 +4,10 @@ */ package helpers; -import java.util.ArrayList; -import java.util.Collections; import java.util.Comparator; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; +import javax.swing.JOptionPane; import org.gephi.graph.api.Column; import org.gephi.graph.api.Edge; -import org.gephi.graph.api.Interval; import org.gephi.graph.api.Node; import org.gephi.graph.api.Table; @@ -39,30 +33,7 @@ public static String getLabel(Edge edge, Column column) { return edge.getAttribute(column).toString(); } - public static Float getLayerPlacement(HashMap> layers, String layer, int layerDistance) { - Node farthestNode = layers.get(layer).stream().max(Comparator.comparing(node -> node.y())).get(); - return farthestNode.y() + farthestNode.size() + farthestNode.getTextProperties().getSize() + layerDistance; - } - - public static Node getBiggestNode(HashMap> layers, String currentLayer) { - return layers.get(currentLayer).stream().max(Comparator.comparing(node -> node.size())).get(); - } - - public static Float getLayerSize(HashMap> layers, Node biggestNode, String currentLayer) { - return (biggestNode.size() + biggestNode.getTextProperties().getSize()) * layers.get(currentLayer).size(); - } - - public static HashMap> sortedLayers(HashMap> layers) { - List>> list = new ArrayList<>(layers.entrySet()); - Collections.sort(list, (Map.Entry> o1, Map.Entry> o2) -> Integer.compare(o2.getValue().size(), o1.getValue().size())); - HashMap> temp = new LinkedHashMap<>(); - for (Map.Entry> item : list) { - temp.put(item.getKey(), item.getValue()); - } - return temp; - } - - public static void nodesRandom(List nodes) { + public static void nodesRandom(Node[] nodes) { for (Node node : nodes) { float random = (float) ((0.01 + Math.random()) * 1000) - 500; node.setX(random); @@ -70,59 +41,8 @@ public static void nodesRandom(List nodes) { } } - public static List getLayerEdges(HashMap> layers, List allEdges, List nodes) { - List edges = new ArrayList<>(); - for (Edge edge : allEdges) { - if (nodes.contains(edge.getSource()) && nodes.contains(edge.getTarget())) { - if (!edges.contains(edge)) { - edges.add(edge); - } - } - } - return edges; - } - - public static void initiateLayerSplitter(HashMap> layers, String initialLayer, Node initialNode, boolean splitAsLevel, int layerDistance) { - String previousLayer = initialLayer; - for (String currentLayer : layers.keySet()) { - if(splitAsLevel){ - for (Node node : layers.get(currentLayer)) { - float y = node.y(); - if(currentLayer == null ? initialLayer != null : !currentLayer.equals(initialLayer)){ - y = y + getLayerPlacement(layers, previousLayer, layerDistance); - } - node.setY(y); - } - } else { - float y = initialNode.y(); - if(currentLayer == null ? initialLayer != null : !currentLayer.equals(initialLayer)){ - y = getLayerPlacement(layers, previousLayer, layerDistance); - } - for (Node node : layers.get(currentLayer)) { - node.setY(node.y() + y); - } - } - previousLayer = currentLayer; - } + public static void alert(String title, String message){ + JOptionPane.showMessageDialog(null, message, title, JOptionPane.WARNING_MESSAGE); } - public static List getLayerEdges(List allEdges, List nodes) { - List temp_edges = new ArrayList<>(); - allEdges.forEach(e -> { - if (nodes.contains(e.getSource()) && nodes.contains(e.getTarget())) { - if (!temp_edges.contains(e)) { - temp_edges.add(e); - } - } - }); - return temp_edges; - } - - public static Double getEdgeWeight(Edge edge, boolean dynamicWeight, Interval timeInterval) { - if (dynamicWeight) { - return edge.getWeight(timeInterval); - } else { - return edge.getWeight(); - } - } } From e9531ce29ef2de6fcf190f20869639928c54da49 Mon Sep 17 00:00:00 2001 From: JSiv Date: Sun, 8 Jan 2023 18:13:26 +0300 Subject: [PATCH 13/16] Update MultiLayerVisualization.java --- .../multiviz/MultiLayerVisualization.java | 537 ++++++++++++------ 1 file changed, 375 insertions(+), 162 deletions(-) diff --git a/modules/MultiVizPlugin/src/main/java/multiviz/MultiLayerVisualization.java b/modules/MultiVizPlugin/src/main/java/multiviz/MultiLayerVisualization.java index 653c1e3434..bdc72a94e6 100644 --- a/modules/MultiVizPlugin/src/main/java/multiviz/MultiLayerVisualization.java +++ b/modules/MultiVizPlugin/src/main/java/multiviz/MultiLayerVisualization.java @@ -1,59 +1,68 @@ package multiviz; -import algorithms.BasicLayout; -import algorithms.force.ForceAtlas2Layout; -import algorithms.force.ForceAtlasLayout; -import algorithms.force.FruchtermanReingoldLayout; import helpers.CustomComboBoxEditor; import helpers.LayoutDropDowns; +import helpers.VizUtils; import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.List; -import helpers.VizUtils; -import java.util.Collections; -import java.util.HashSet; -import java.util.Set; import java.util.stream.Collectors; -import static java.util.stream.Collectors.toList; import org.gephi.graph.api.Column; -import org.gephi.graph.api.Edge; import org.gephi.graph.api.Graph; import org.gephi.graph.api.GraphModel; -import org.gephi.graph.api.Interval; import org.gephi.graph.api.Node; -import org.gephi.graph.api.Table; import org.gephi.layout.spi.Layout; import org.gephi.layout.spi.LayoutBuilder; import org.gephi.layout.spi.LayoutProperty; +import org.gephi.filters.api.FilterController; +import org.gephi.filters.plugin.partition.PartitionBuilder.NodePartitionFilter; +import org.openide.util.Lookup; +import org.gephi.appearance.api.AppearanceController; +import org.gephi.appearance.api.AppearanceModel; +import org.gephi.filters.plugin.partition.PartitionBuilder.PartitionFilter; +import org.gephi.graph.api.Edge; +import org.gephi.layout.plugin.force.StepDisplacement; +import org.gephi.layout.plugin.force.yifanHu.YifanHuLayout; +import org.gephi.layout.plugin.forceAtlas2.ForceAtlas2; +import org.gephi.layout.plugin.fruchterman.FruchtermanReingold; +import org.gephi.layout.plugin.random.RandomLayout; + /** * - * @author Jaymohan + * @author J */ + public class MultiLayerVisualization implements Layout { - + private final LayoutBuilder builder; private GraphModel graphModel; private boolean executing = false; - + private int layerDistance; private int noOfIterations; - - private String selectedColumn= "Node Label"; + + private String selectedColumn = "Node Label"; private String layoutAlgorithm; - + private boolean horizontalLayout; private boolean is3DLayout; private boolean sortLayers = false; - private int layerArea; + private float layerArea; private double gravity; - private float speed; + private double speed; private boolean splitAsLevel; public static List selectableColumns = new ArrayList<>(); - + + private Column label; Graph graph; - + HashMap classes; + private String algorithmType = "BasicL"; + MultiLayerVisualization(MLVBuilder mBuilder) { this.builder = mBuilder; } @@ -76,146 +85,166 @@ public void setGraphModel(GraphModel graphModel) { } } + public static HashMap sortByValue(HashMap hm) { + return hm.entrySet().stream().sorted((e1, e2) -> Integer.compare(e2.getValue(), e1.getValue())).collect(Collectors.toMap(HashMap.Entry::getKey, HashMap.Entry::getValue, (e1, e2) -> e1, LinkedHashMap::new)); + } + @Override public void goAlgo() { - if (graphModel == null) return; - + + if (graphModel == null) { + return; + } graph = graphModel.getGraphVisible(); - graph.readLock(); - - HashMap> layers = new HashMap<>(); - List nodes = graph.getNodes().toCollection().stream().collect(toList()); - List edges = graph.getEdges().toCollection().stream().collect(toList()); - - Table selectedTable; - Column label; - - // case1 :layer disjoint - // case2 :node aligned - if(selectedColumn.startsWith("Node ")){ - - selectedTable = graph.getModel().getNodeTable(); - - //remove word 'Edge / Node ' from selected layer - label = VizUtils.getLabel(selectedTable, selectedColumn.substring(5)); - + + Node[] nodes = graph.getNodes().toArray(); + Edge[] edges = graph.getEdges().toArray(); + + label = graphModel.getNodeTable().getColumn(0); + + FilterController filterController = Lookup.getDefault().lookup(FilterController.class); + AppearanceModel appearanceModel = Lookup.getDefault().lookup(AppearanceController.class).getModel(); + NodePartitionFilter partitionFilter = null; + + classes = new HashMap<>(); + if (selectedColumn.startsWith("Node ")) { + label = VizUtils.getLabel(graph.getModel().getNodeTable(), selectedColumn.substring(5)); for (Node node : nodes) { - String key = VizUtils.getLabel(node, label); - List values = layers.get(key); - if (values == null) values = new ArrayList<>(); - values.add(node); - layers.put(key, values); + Object key = node.getAttribute(label); + if (classes.containsKey(key)) { + Integer value = classes.get(key); + classes.replace(key, value, 1 + value); + } else { + classes.put(key, 1); + } } - - } else if(selectedColumn.startsWith("Edge ")) { - - selectedTable = graph.getModel().getEdgeTable(); - label = VizUtils.getLabel(selectedTable, selectedColumn.substring(5)); - - /** - * get nodes without any edges/connections* - */ - List edgeSourceNodes = edges.stream().map(v -> v.getTarget()).distinct().collect(Collectors.toList()); - List edgeTargetNodes = edges.stream().map(v -> v.getSource()).distinct().collect(Collectors.toList()); - List outliers = new ArrayList<>(); - - nodes.forEach(node -> { - if (edgeSourceNodes.contains(node) || edgeTargetNodes.contains(node)) { + partitionFilter = new NodePartitionFilter(appearanceModel.getNodePartition(label)); + } else if (selectedColumn.startsWith("Edge ")) { + + Column newColumn = VizUtils.getLabel(graph.getModel().getNodeTable(), "mviz_edge_" + selectedColumn.substring(5)); + label = VizUtils.getLabel(graph.getModel().getEdgeTable(), selectedColumn.substring(5)); + + if (newColumn == null) { + newColumn = graphModel.getNodeTable().addColumn("mviz_edge_" + label.getTitle(), String.class); + } + + List edgeNodes = new ArrayList<>(); + for (Edge edge : edges) { + + Object key = edge.getAttribute(label); + + if (edgeNodes.contains(edge.getSource())) { } else { - outliers.add(node); + edgeNodes.add(edge.getSource()); + edge.getSource().setAttribute(newColumn, String.valueOf(key)); } - }); - - /** - * If same label/nodes exists in multiple layers then node should - * only be allowed to primary layer - */ - Set valueList = new HashSet<>(); - - edges.forEach(edge -> { - String key = VizUtils.getLabel(edge, label); - List value = layers.get(key); - if (value == null) { - value = new ArrayList<>(); + if (edgeNodes.contains(edge.getTarget())) { + } else { + edgeNodes.add(edge.getTarget()); + edge.getTarget().setAttribute(newColumn, String.valueOf(key)); } - if (!value.contains(edge.getSource())) { - - if(!valueList.contains(edge.getSource())){ - value.add(edge.getSource()); - } - valueList.add(edge.getSource()); + } + +// /** +// * If same label/nodes exists in multiple layers then node should +// * only be allowed to primary layer +// */ +// Set valueset = new HashSet<>(); + for (Node node : nodes) { + if (edgeNodes.contains(node)) { + } else { + node.setAttribute(newColumn, "mviz_outlier_nodes"); } - if (!value.contains(edge.getTarget())) { - - if(!valueList.contains(edge.getTarget())){ - value.add(edge.getTarget()); - } - valueList.add(edge.getTarget()); + + Object key = node.getAttribute(newColumn); + if (classes.containsKey(key)) { + Integer value = classes.get(key); + classes.replace(key, value, 1 + value); + } else { + classes.put(key, 1); } - layers.put(key, value); - }); + } + + partitionFilter = new NodePartitionFilter(appearanceModel.getNodePartition(newColumn)); + //JOptionPane.showMessageDialog(null,"Pending Implementation, may not work properly ", "Warning", JOptionPane.WARNING_MESSAGE); + } + + if (partitionFilter != null) { - if (!outliers.isEmpty()) { - layers.put("outliers", outliers); + if (sortLayers) { + classes = sortByValue(classes); } - for (List layer : layers.values()) { - Collections.sort(layer, (Node o1, Node o2) -> { - if (o1.getLabel() != null) { - try { - return (o1.getLabel()).compareTo(o2.getLabel()); - } catch (NumberFormatException e) { - return Integer.compare(o1.getStoreId(), o2.getStoreId()); + VizUtils.nodesRandom(nodes); + + if ("ForceD".equals(getAlgorithmType())) { + if (!isSplitAsLevel()) { + Node farthestNode = null; + for (Object layer : classes.keySet()) { + Pair pair = getSubset(partitionFilter, filterController, layer); + Node[] subset = (Node[]) pair.getNodes(); + if (subset.length > 0) { + Node biggestNode = (Node) pair.getBiggestNode(); + drawForceDirectedLayouts(graphModel); + splitLayer(subset, farthestNode, biggestNode); + farthestNode = Arrays.stream(subset).max(Comparator.comparing(v -> v.y())).get(); } - } else { - return Integer.compare(o1.getStoreId(), o2.getStoreId()); } - }); + graphModel.setVisibleView(null); + } else { + drawForceDirectedLayouts(graphModel); + Node farthestNode = null; + for (Object layer : classes.keySet()) { + Pair pair = getSubset(partitionFilter, filterController, layer); + Node[] subset = (Node[]) pair.getNodes(); + splitLayer(subset, farthestNode, (Node) pair.getBiggestNode()); + farthestNode = Arrays.stream(subset).max(Comparator.comparing(v -> v.y())).get(); + graphModel.setVisibleView(null); + } + } + } else { + Node initialNode = nodes[0]; + Node farthestNode = null; + int iter = 0; + for (Object layer : classes.keySet()) { + Pair pair = getSubset(partitionFilter, filterController, layer); + Node[] subset = (Node[]) pair.getNodes(); + if (subset.length > 0) { + Node biggestNode = (Node) pair.getBiggestNode(); + if (iter == 0) { + initialNode = subset[0]; + } + if ("Linear Layout".equals(getLayoutAlgorithm())) { + linearLayout(subset, initialNode); + } else if ("Grid Layout".equals(getLayoutAlgorithm())) { + gridLayout(subset, biggestNode, initialNode); + } else if ("Circle Layout".equals(getLayoutAlgorithm())) { + circleLayout(subset, initialNode); + } else if ("Random Layout".equals(getLayoutAlgorithm())) { + randomLayout(graphModel, subset, biggestNode); + } + splitLayer(subset, farthestNode, biggestNode); + farthestNode = Arrays.stream(subset).max(Comparator.comparing(v -> v.y())).get(); + } + iter += 1; + } + graphModel.setVisibleView(null); } - } else return; - - String initialLayer = layers.keySet().stream().findFirst().get(); - Node initialNode = layers.get(initialLayer).get(0); - - boolean isDynamicWeight = graphModel.getEdgeTable().getColumn("weight").isDynamic(); - Interval interval = graph.getView().getTimeInterval(); - - switch (layoutAlgorithm) { - case "Linear Layout": - case "Grid Layout": - case "Circle Layout": - case "Random Layout": - new BasicLayout(getLayerDistance(), layers, initialLayer, initialNode, sortLayers, layoutAlgorithm).start(); - break; - case "ForceAtlas": - //AbstractLayout.ensureSafeLayoutNodePositions(graphModel); - VizUtils.nodesRandom(nodes); - new ForceAtlasLayout(getLayerDistance(), layers, initialLayer, initialNode, sortLayers, splitAsLevel, getGravity(), getSpeed(), isDynamicWeight, interval, nodes, edges, graph, getNoOfIterations()).start(); - break; - case "ForceAtlas2": - VizUtils.nodesRandom(nodes); - //AbstractLayout.ensureSafeLayoutNodePositions(graphModel); - new ForceAtlas2Layout(getLayerDistance(), layers, initialLayer, initialNode, splitAsLevel, sortLayers, getNoOfIterations(), getArea(), getSpeed(), getGravity(), isDynamicWeight, interval, nodes, edges, graph, graphModel).start(); - break; - case "Fruchterman Reingold": - VizUtils.nodesRandom(nodes); - new FruchtermanReingoldLayout(getNoOfIterations(), getLayerDistance(), edges, getArea(), getGravity(), getSpeed(), layers, initialLayer, initialNode, sortLayers, splitAsLevel, nodes).start(); - break; - default: - endAlgo(); + } else { } - - if(is3DLayout()){ + + graph.readLock(); + if (is3DLayout()) { for (Node node : nodes) { - double theta = 65 * Math.PI / 180; - //if(isHorizontalLayout()){ + if (!node.isFixed()) { + double theta = 65 * Math.PI / 180; node.setY((float) (node.y() * Math.cos(theta) - node.z() * Math.sin(theta))); - //} - node.setZ((float) (Math.random() * 0.01)); + node.setZ((float) (Math.random() * 0.01)); + } } } - - if(isHorizontalLayout()){ + + if (isHorizontalLayout()) { double theta = 270 * Math.PI / 180; float px = 0; float py = 0; @@ -228,8 +257,7 @@ public void goAlgo() { } } } - - graph.readUnlock(); + graph.readUnlock(); endAlgo(); } @@ -256,12 +284,11 @@ public LayoutProperty[] getProperties() { List properties = new ArrayList<>(); final String BASIC = "Basic Features"; final String FORCED = "Force Directed Features"; - - try{ + try { properties.add(LayoutProperty.createProperty(this, Integer.class, "Iterations", FORCED, "Number of iterations", "getNoOfIterations", "setNoOfIterations")); - properties.add(LayoutProperty.createProperty(this, Integer.class, "Set Area", FORCED, "Set area for a layer", "getArea", "setArea")); + properties.add(LayoutProperty.createProperty(this, Float.class, "Set Area", FORCED, "Set area for a layer", "getArea", "setArea")); properties.add(LayoutProperty.createProperty(this, Boolean.class, "Split by level", FORCED, "If selected, Layout Algorithm will be applied on the whole network before splitting in to layers, If not Algorithm will be applied on each layer.", "isSplitAsLevel", "setSplitAsLevel")); - properties.add(LayoutProperty.createProperty(this, Float.class, "Set Speed", FORCED, "Set Speed", "getSpeed", "setSpeed")); + properties.add(LayoutProperty.createProperty(this, Double.class, "Set Speed", FORCED, "Set Speed", "getSpeed", "setSpeed")); properties.add(LayoutProperty.createProperty(this, Double.class, "Set Gravity", FORCED, "Set gravity to prevent nodes going off the screen in force directed layouts", "getGravity", "setGravity")); properties.add(LayoutProperty.createProperty(this, Boolean.class, "Horizontal Layout", BASIC, "If selected, layers will be placed next to each other, instad of stacking top of one another", "isHorizontalLayout", "setHorizontalLayout")); properties.add(LayoutProperty.createProperty(this, Boolean.class, "Set as 3D", BASIC, "Set nodes in 3 Dimension", "is3DLayout", "set3DLayout")); @@ -269,23 +296,23 @@ public LayoutProperty[] getProperties() { properties.add(LayoutProperty.createProperty(this, Integer.class, "Layer Distance", BASIC, "Distance between two layers", "getLayerDistance", "setLayerDistance")); properties.add(LayoutProperty.createProperty(this, String.class, "Select Layer", BASIC, "Select the feature which is to be considered as a layer", "getSelectedColumn", "setSelectedColumn", CustomComboBoxEditor.class)); properties.add(LayoutProperty.createProperty(this, String.class, "Layout Algorithm", BASIC, "Select the layout algorithm which is to be applied to a layer", "getLayoutAlgorithm", "setLayoutAlgorithm", LayoutDropDowns.class)); - } catch(NoSuchMethodException e) { + } catch (NoSuchMethodException e) { e.printStackTrace(); } - + return properties.toArray(LayoutProperty[]::new); } @Override public void resetPropertiesValues() { - layerDistance = 400; - gravity = 10d; - layerArea = 10000; - noOfIterations = 100; - horizontalLayout = false; - is3DLayout = false; - splitAsLevel = false; - speed = 1f; + layerDistance = 400; + gravity = 10d; + layerArea = 10000f; + noOfIterations = 100; + horizontalLayout = false; + is3DLayout = false; + splitAsLevel = false; + speed = 1.0; } @Override @@ -323,6 +350,11 @@ public String getLayoutAlgorithm() { public void setLayoutAlgorithm(String layoutAlgorithm) { this.layoutAlgorithm = layoutAlgorithm; + if (!"ForceAtlas2".equals(layoutAlgorithm) && !"Fruchterman Reingold".equals(layoutAlgorithm) && !"Yifan Hu".equals(layoutAlgorithm)) { + setAlgorithmType("BasicL"); + } else { + setAlgorithmType("ForceD"); + } } public Boolean isHorizontalLayout() { @@ -341,11 +373,11 @@ public void set3DLayout(Boolean is3DLayout) { this.is3DLayout = is3DLayout; } - public Integer getArea() { + public Float getArea() { return layerArea; } - public void setArea(Integer layerArea) { + public void setArea(Float layerArea) { this.layerArea = layerArea; } @@ -357,11 +389,11 @@ public void setGravity(Double gravity) { this.gravity = gravity; } - public Float getSpeed() { + public Double getSpeed() { return speed; } - public void setSpeed(Float speed) { + public void setSpeed(Double speed) { this.speed = speed; } @@ -372,7 +404,7 @@ public Boolean isSplitAsLevel() { public void setSplitAsLevel(Boolean splitAsLevel) { this.splitAsLevel = splitAsLevel; } - + public Boolean isSorted() { return sortLayers; } @@ -380,4 +412,185 @@ public Boolean isSorted() { public void setSorted(Boolean sortLayers) { this.sortLayers = sortLayers; } + + public String getAlgorithmType() { + return algorithmType; + } + + public void setAlgorithmType(String algorithmType) { + this.algorithmType = algorithmType; + } + + private void linearLayout(Node[] subset, Node initialNode) { + double distancex = 0; + int index = 0; + for (Node node : subset) { + if (index > 0) { + distancex += subset[index - 1].size() + (node.size() * 2) + (node.getTextProperties().getWidth() + 20); + double ry = Math.random() * ((subset[index - 1].size() + subset[index - 1].getTextProperties().getHeight() + node.size() + node.getTextProperties().getSize()) - 1 + 1) + 1; + node.setX(initialNode.x() + (float) distancex); + node.setY(node.y() + (float) ry); + } + index++; + } + } + + private void gridLayout(Node[] subset, Node biggestNode, Node initialNode) { + int rows = (int) Math.round(Math.sqrt(subset.length)) + 1; + int cols = (int) Math.round(Math.sqrt(subset.length)) + 1; + double layerSize = ((biggestNode.size() + biggestNode.getTextProperties().getSize()) * subset.length) * 1.2f; + for (int i = 0; i < rows; i++) { + for (int j = 0; j < cols && (i * rows + j) < subset.length; j++) { + Node node = subset[i * rows + j]; + double nx = (-layerSize / 2f) + ((float) j / cols) * layerSize; + double ny = (layerSize / 2f) - ((float) i / rows) * layerSize; + double tx = nx; + double ty = (initialNode.y() + (initialNode.y() + (ny - initialNode.y()))); + if (i == 0 && j == 0) { + tx = ((initialNode.x() + (nx - initialNode.x())) + (0)); + } else { + tx = ((initialNode.x() + (nx - initialNode.x())) + (10 * j)); + } + node.setX((float) tx); + node.setY((float) ty); + node.setZ(initialNode.z()); + } + } + } + + private void circleLayout(Node[] subset, Node initialNode) { + if (subset.length == 1) { + subset[0].setX(initialNode.x()); + subset[0].setY(initialNode.y()); + subset[0].setZ(initialNode.z()); + } else { + double circumference = 0; + for (Node node : subset) { + circumference += (node.size() * 2) + node.getTextProperties().getWidth(); + } + circumference = circumference * 1.2f; + + double diameter = circumference / Math.PI; + double theta = (2 * Math.PI) / circumference; + + double tempTheta = 0; + double nodeSize = 0; + + for (Node node : subset) { + if (!node.isFixed()) { + nodeSize = node.size() + node.getTextProperties().getWidth() / 2; + double arc = nodeSize * 1.2f * theta; + float dx = (float) (diameter * (Math.cos((tempTheta + arc) + (Math.PI / 2)))); + float dy = (float) (diameter * (Math.sin((tempTheta + arc) + (Math.PI / 2)))); + tempTheta += nodeSize * 2 * theta * 1.2f; + node.setX(initialNode.x() + dx); + node.setY(initialNode.y() + dy); + node.setZ(initialNode.z()); + } + } + } + } + + private void randomLayout(GraphModel graphModel, Node[] subset, Node biggestNode) { + float layerSpace = (biggestNode.size() + biggestNode.getTextProperties().getSize()) * subset.length; + var randomLayout = new RandomLayout(builder, layerSpace); + randomLayout.setGraphModel(graphModel); + randomLayout.initAlgo(); + randomLayout.goAlgo(); + randomLayout.endAlgo(); + } + + private void forceAtlas2(GraphModel graphModel) { + var forceAtlas2 = new ForceAtlas2(null); + forceAtlas2.setGraphModel(graphModel); + forceAtlas2.setJitterTolerance(1.0); + forceAtlas2.setBarnesHutOptimize(true); + forceAtlas2.setBarnesHutTheta(1.2); + forceAtlas2.setOutboundAttractionDistribution(true); + //forceAtlas2.setThreadsCount(1); //1 to 7 + forceAtlas2.setGravity(gravity); + forceAtlas2.setAdjustSizes(true); + forceAtlas2.initAlgo(); + for (int i = 0; i < getNoOfIterations(); i++) { + forceAtlas2.goAlgo(); + } + } + + private void fruchterman(GraphModel graphModel) { + var fruchtermanReingold = new FruchtermanReingold(getBuilder()); + fruchtermanReingold.setGraphModel(graphModel); + fruchtermanReingold.setArea(getArea()); + fruchtermanReingold.setGravity(getGravity()); + fruchtermanReingold.setSpeed(getSpeed()); + fruchtermanReingold.initAlgo(); + for (int i = 0; i < getNoOfIterations(); i++) { + fruchtermanReingold.goAlgo(); + } + } + + private void yifanHuNormal(GraphModel graphModel) { + var yifanHu = new YifanHuLayout(getBuilder(), new StepDisplacement(1f)); + yifanHu.setGraphModel(graphModel); + yifanHu.initAlgo(); + for (int i = 0; i < getNoOfIterations(); i++) { + yifanHu.goAlgo(); + } + } + + private void drawForceDirectedLayouts(GraphModel graphModel) { + if ("ForceAtlas2".equals(getLayoutAlgorithm())) { + forceAtlas2(graphModel); + } else if ("Fruchterman Reingold".equals(getLayoutAlgorithm())) { + fruchterman(graphModel); + } else if ("Yifan Hu".equals(getLayoutAlgorithm())) { + yifanHuNormal(graphModel); + } + } + + class Pair { + + private U mGraphModel; + private V mNodes; + private W mBiggestNode; + + public Pair(U mGraphModel, V mNodes, W mBiggestNode) { + this.mGraphModel = mGraphModel; + this.mNodes = mNodes; + this.mBiggestNode = mBiggestNode; + } + + public W getBiggestNode() { + return mBiggestNode; + } + + public U getGraphModel() { + return mGraphModel; + } + + public V getNodes() { + return mNodes; + } + } + + private Pair getSubset(PartitionFilter partitionFilter, FilterController filterController, Object value) { + partitionFilter.unselectAll(); + partitionFilter.addPart(value); + graphModel.setVisibleView(filterController.filter(filterController.createQuery(partitionFilter))); + Node[] subset = graphModel.getGraphVisible().getNodes().toArray(); + Node biggestNode = null; + if (subset.length > 0) { + biggestNode = Arrays.stream(subset).max(Comparator.comparing(node -> node.size())).orElse(subset[0]); + } + return new Pair(graphModel, subset, biggestNode); + } + + private void splitLayer(Node[] subset, Node farthestNode, Node biggestNode) { + for (Node node : subset) { + float y = node.y(); + if (farthestNode != null) { + y = y + (farthestNode.y() + farthestNode.size() + farthestNode.getTextProperties().getHeight()) + getLayerDistance() + biggestNode.size(); + } + node.setY(y); + } + } } From 06f84f4f48b4c60bf05aafe6cf83360d2ab0ac86 Mon Sep 17 00:00:00 2001 From: JSiv Date: Sun, 8 Jan 2023 18:15:17 +0300 Subject: [PATCH 14/16] Update pom.xml --- modules/MultiVizPlugin/pom.xml | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/modules/MultiVizPlugin/pom.xml b/modules/MultiVizPlugin/pom.xml index ca9d426d3b..a39d51da08 100644 --- a/modules/MultiVizPlugin/pom.xml +++ b/modules/MultiVizPlugin/pom.xml @@ -34,6 +34,26 @@ org.gephi ui-utils + + org.gephi + filters-api + jar + + + org.gephi + appearance-api + jar + + + org.gephi + filters-plugin + jar + + + org.netbeans.api + org-openide-util-lookup + jar + @@ -65,4 +85,4 @@ - \ No newline at end of file + From a7780f38aace4b4096b839b6b8e9167380f7f89c Mon Sep 17 00:00:00 2001 From: JSiv Date: Sun, 8 Jan 2023 18:59:08 +0300 Subject: [PATCH 15/16] Update VizUtils.java --- .../src/main/java/helpers/VizUtils.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/modules/MultiVizPlugin/src/main/java/helpers/VizUtils.java b/modules/MultiVizPlugin/src/main/java/helpers/VizUtils.java index 5ac8e096c4..bd382e706b 100644 --- a/modules/MultiVizPlugin/src/main/java/helpers/VizUtils.java +++ b/modules/MultiVizPlugin/src/main/java/helpers/VizUtils.java @@ -1,10 +1,8 @@ -/* - * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license - * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template - */ package helpers; -import java.util.Comparator; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.stream.Collectors; import javax.swing.JOptionPane; import org.gephi.graph.api.Column; import org.gephi.graph.api.Edge; @@ -17,6 +15,10 @@ */ public class VizUtils { + public static HashMap sortByValue(HashMap hm) { + return hm.entrySet().stream().sorted((e1, e2) -> Integer.compare(e2.getValue(), e1.getValue())).collect(Collectors.toMap(HashMap.Entry::getKey, HashMap.Entry::getValue, (e1, e2) -> e1, LinkedHashMap::new)); + } + public static String getLabel(Node node, Column column) { return node.getAttribute(column).toString(); } From 49555b022bbdb09e93cdcc917fa41da93a6f6317 Mon Sep 17 00:00:00 2001 From: JSiv Date: Sun, 8 Jan 2023 19:00:10 +0300 Subject: [PATCH 16/16] Update MultiLayerVisualization.java --- .../multiviz/MultiLayerVisualization.java | 128 +++++++++--------- 1 file changed, 66 insertions(+), 62 deletions(-) diff --git a/modules/MultiVizPlugin/src/main/java/multiviz/MultiLayerVisualization.java b/modules/MultiVizPlugin/src/main/java/multiviz/MultiLayerVisualization.java index bdc72a94e6..4ebbf64dcf 100644 --- a/modules/MultiVizPlugin/src/main/java/multiviz/MultiLayerVisualization.java +++ b/modules/MultiVizPlugin/src/main/java/multiviz/MultiLayerVisualization.java @@ -85,10 +85,6 @@ public void setGraphModel(GraphModel graphModel) { } } - public static HashMap sortByValue(HashMap hm) { - return hm.entrySet().stream().sorted((e1, e2) -> Integer.compare(e2.getValue(), e1.getValue())).collect(Collectors.toMap(HashMap.Entry::getKey, HashMap.Entry::getValue, (e1, e2) -> e1, LinkedHashMap::new)); - } - @Override public void goAlgo() { @@ -109,81 +105,83 @@ public void goAlgo() { classes = new HashMap<>(); if (selectedColumn.startsWith("Node ")) { label = VizUtils.getLabel(graph.getModel().getNodeTable(), selectedColumn.substring(5)); - for (Node node : nodes) { - Object key = node.getAttribute(label); - if (classes.containsKey(key)) { - Integer value = classes.get(key); - classes.replace(key, value, 1 + value); - } else { - classes.put(key, 1); + if(label != null) { + for (Node node : nodes) { + Object key = node.getAttribute(label); + if (classes.containsKey(key)) { + Integer value = classes.get(key); + classes.replace(key, value, 1 + value); + } else { + classes.put(key, 1); + } } + partitionFilter = new NodePartitionFilter(appearanceModel.getNodePartition(label)); } - partitionFilter = new NodePartitionFilter(appearanceModel.getNodePartition(label)); } else if (selectedColumn.startsWith("Edge ")) { Column newColumn = VizUtils.getLabel(graph.getModel().getNodeTable(), "mviz_edge_" + selectedColumn.substring(5)); label = VizUtils.getLabel(graph.getModel().getEdgeTable(), selectedColumn.substring(5)); - if (newColumn == null) { - newColumn = graphModel.getNodeTable().addColumn("mviz_edge_" + label.getTitle(), String.class); - } + if (label != null) { - List edgeNodes = new ArrayList<>(); - for (Edge edge : edges) { + if (newColumn == null) { + newColumn = graphModel.getNodeTable().addColumn("mviz_edge_" + label.getTitle(), String.class); + } - Object key = edge.getAttribute(label); + List edgeNodes = new ArrayList<>(); + for (Edge edge : edges) { - if (edgeNodes.contains(edge.getSource())) { - } else { - edgeNodes.add(edge.getSource()); - edge.getSource().setAttribute(newColumn, String.valueOf(key)); - } - if (edgeNodes.contains(edge.getTarget())) { - } else { - edgeNodes.add(edge.getTarget()); - edge.getTarget().setAttribute(newColumn, String.valueOf(key)); - } - } + Object key = edge.getAttribute(label); -// /** -// * If same label/nodes exists in multiple layers then node should -// * only be allowed to primary layer -// */ -// Set valueset = new HashSet<>(); - for (Node node : nodes) { - if (edgeNodes.contains(node)) { - } else { - node.setAttribute(newColumn, "mviz_outlier_nodes"); + if (edgeNodes.contains(edge.getSource())) { + } else { + edgeNodes.add(edge.getSource()); + edge.getSource().setAttribute(newColumn, String.valueOf(key)); + } + if (edgeNodes.contains(edge.getTarget())) { + } else { + edgeNodes.add(edge.getTarget()); + edge.getTarget().setAttribute(newColumn, String.valueOf(key)); + } } - Object key = node.getAttribute(newColumn); - if (classes.containsKey(key)) { - Integer value = classes.get(key); - classes.replace(key, value, 1 + value); - } else { - classes.put(key, 1); + /** + * If same label/nodes exists in multiple layers then node should + * only be allowed to primary layer + */ + for (Node node : nodes) { + if (edgeNodes.contains(node)) { + } else { + node.setAttribute(newColumn, "mviz_outlier_nodes"); + } + + Object key = node.getAttribute(newColumn); + if (classes.containsKey(key)) { + Integer value = classes.get(key); + classes.replace(key, value, 1 + value); + } else { + classes.put(key, 1); + } } + partitionFilter = new NodePartitionFilter(appearanceModel.getNodePartition(newColumn)); } - - partitionFilter = new NodePartitionFilter(appearanceModel.getNodePartition(newColumn)); - //JOptionPane.showMessageDialog(null,"Pending Implementation, may not work properly ", "Warning", JOptionPane.WARNING_MESSAGE); } if (partitionFilter != null) { if (sortLayers) { - classes = sortByValue(classes); + classes = VizUtils.sortByValue(classes); } VizUtils.nodesRandom(nodes); - + if ("ForceD".equals(getAlgorithmType())) { if (!isSplitAsLevel()) { Node farthestNode = null; for (Object layer : classes.keySet()) { Pair pair = getSubset(partitionFilter, filterController, layer); Node[] subset = (Node[]) pair.getNodes(); - if (subset.length > 0) { + if (subset != null && subset.length > 0) { Node biggestNode = (Node) pair.getBiggestNode(); drawForceDirectedLayouts(graphModel); splitLayer(subset, farthestNode, biggestNode); @@ -197,9 +195,11 @@ public void goAlgo() { for (Object layer : classes.keySet()) { Pair pair = getSubset(partitionFilter, filterController, layer); Node[] subset = (Node[]) pair.getNodes(); - splitLayer(subset, farthestNode, (Node) pair.getBiggestNode()); - farthestNode = Arrays.stream(subset).max(Comparator.comparing(v -> v.y())).get(); - graphModel.setVisibleView(null); + if(subset != null) { + splitLayer(subset, farthestNode, (Node) pair.getBiggestNode()); + farthestNode = Arrays.stream(subset).max(Comparator.comparing(v -> v.y())).get(); + graphModel.setVisibleView(null); + } } } } else { @@ -209,7 +209,7 @@ public void goAlgo() { for (Object layer : classes.keySet()) { Pair pair = getSubset(partitionFilter, filterController, layer); Node[] subset = (Node[]) pair.getNodes(); - if (subset.length > 0) { + if (subset != null && subset.length > 0) { Node biggestNode = (Node) pair.getBiggestNode(); if (iter == 0) { initialNode = subset[0]; @@ -573,15 +573,19 @@ public V getNodes() { } private Pair getSubset(PartitionFilter partitionFilter, FilterController filterController, Object value) { - partitionFilter.unselectAll(); - partitionFilter.addPart(value); - graphModel.setVisibleView(filterController.filter(filterController.createQuery(partitionFilter))); - Node[] subset = graphModel.getGraphVisible().getNodes().toArray(); - Node biggestNode = null; - if (subset.length > 0) { - biggestNode = Arrays.stream(subset).max(Comparator.comparing(node -> node.size())).orElse(subset[0]); + try { + partitionFilter.unselectAll(); + partitionFilter.addPart(value); + graphModel.setVisibleView(filterController.filter(filterController.createQuery(partitionFilter))); + Node[] subset = graphModel.getGraphVisible().getNodes().toArray(); + Node biggestNode = null; + if (subset.length > 0) { + biggestNode = Arrays.stream(subset).max(Comparator.comparing(node -> node.size())).orElse(subset[0]); + } + return new Pair(graphModel, subset, biggestNode); + } catch(Exception e) { + return new Pair(graphModel, null, null); } - return new Pair(graphModel, subset, biggestNode); } private void splitLayer(Node[] subset, Node farthestNode, Node biggestNode) {