001/*
002 * Copyright 2006 - 2013
003 *     Stefan Balev     <stefan.balev@graphstream-project.org>
004 *     Julien Baudry    <julien.baudry@graphstream-project.org>
005 *     Antoine Dutot    <antoine.dutot@graphstream-project.org>
006 *     Yoann Pigné      <yoann.pigne@graphstream-project.org>
007 *     Guilhelm Savin   <guilhelm.savin@graphstream-project.org>
008 * 
009 * This file is part of GraphStream <http://graphstream-project.org>.
010 * 
011 * GraphStream is a library whose purpose is to handle static or dynamic
012 * graph, create them from scratch, file or any source and display them.
013 * 
014 * This program is free software distributed under the terms of two licenses, the
015 * CeCILL-C license that fits European law, and the GNU Lesser General Public
016 * License. You can  use, modify and/ or redistribute the software under the terms
017 * of the CeCILL-C license as circulated by CEA, CNRS and INRIA at the following
018 * URL <http://www.cecill.info> or under the terms of the GNU LGPL as published by
019 * the Free Software Foundation, either version 3 of the License, or (at your
020 * option) any later version.
021 * 
022 * This program is distributed in the hope that it will be useful, but WITHOUT ANY
023 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
024 * PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more details.
025 * 
026 * You should have received a copy of the GNU Lesser General Public License
027 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
028 * 
029 * The fact that you are presently reading this means that you have had
030 * knowledge of the CeCILL-C and LGPL licenses and that you accept their terms.
031 */
032package org.graphstream.algorithm.measure;
033
034public class DegreeCentrality extends AbstractCentrality {
035        public static enum Mode {
036                INOUT, IN, OUT
037        }
038
039        public static final String DEFAULT_ATTRIBUTE_KEY = "degree";
040
041        /**
042         * Defines which degree should be used. It only get a sense with directed
043         * graph.
044         */
045        protected Mode mode;
046
047        public DegreeCentrality() {
048                this(DEFAULT_ATTRIBUTE_KEY, NormalizationMode.NONE);
049        }
050
051        /**
052         * Constructor allowing configuration of centrality attribute and
053         * normalization flag. Mode will be {@link Mode#INOUT}.
054         * 
055         * @param attribute
056         *            name of the attribute where centrality values will be stored
057         * @param normalize
058         *            defines the normalization mode
059         */
060        public DegreeCentrality(String attribute, NormalizationMode normalize) {
061                this(attribute, normalize, Mode.INOUT);
062        }
063
064        /**
065         * Same as {@link #DegreeCentrality(String, boolean)} but allows to
066         * configure the mode.
067         * 
068         * @param attribute
069         *            name of the attribute where centrality values will be stored
070         * @param normalize
071         *            defines the normalization mode
072         * @param mode
073         *            set which degree should be used (in degree, out degree or
074         *            both)
075         */
076        public DegreeCentrality(String attribute, NormalizationMode normalize,
077                        Mode mode) {
078                super(attribute, normalize);
079                this.mode = mode;
080        }
081
082        /*
083         * (non-Javadoc)
084         * 
085         * @see
086         * org.graphstream.algorithm.measure.AbstractCentrality#computeCentrality()
087         */
088        protected void computeCentrality() {
089                int count = graph.getNodeCount();
090
091                switch (mode) {
092                case INOUT:
093                        for (int idx = 0; idx < count; idx++)
094                                data[idx] = graph.getNode(idx).getDegree();
095                        break;
096                case IN:
097                        for (int idx = 0; idx < count; idx++)
098                                data[idx] = graph.getNode(idx).getInDegree();
099                        break;
100                case OUT:
101                        for (int idx = 0; idx < count; idx++)
102                                data[idx] = graph.getNode(idx).getOutDegree();
103                        break;
104                }
105        }
106
107}