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
034import org.graphstream.algorithm.DynamicAlgorithm;
035import org.graphstream.graph.Graph;
036import org.graphstream.graph.Node;
037import org.graphstream.stream.Sink;
038import org.graphstream.stream.SinkAdapter;
039
040public class DegreeMeasure extends ChartMinMaxAverageSeriesMeasure implements
041                DynamicAlgorithm {
042        /**
043         * Graph being used to compute the measure or null.
044         */
045        protected Graph g;
046        private Sink trigger;
047
048        public DegreeMeasure() {
049                super("Degree");
050                trigger = new StepTrigger();
051        }
052
053        /*
054         * (non-Javadoc)
055         * 
056         * @see org.graphstream.algorithm.DynamicAlgorithm#terminate()
057         */
058        public void terminate() {
059                g.removeSink(trigger);
060                g = null;
061        }
062
063        /*
064         * (non-Javadoc)
065         * 
066         * @see org.graphstream.algorithm.Algorithm#compute()
067         */
068        public void compute() {
069                double min, max, avg;
070                
071                min = Double.MAX_VALUE;
072                max = Double.MIN_VALUE;
073                avg = 0;
074
075                for (Node n : g) {
076                        min = Math.min(min, n.getDegree());
077                        max = Math.max(max, n.getDegree());
078                        avg += n.getDegree();
079                }
080
081                avg /= g.getNodeCount();
082                addValue(g.getStep(), min, avg, max);
083        }
084
085        /*
086         * (non-Javadoc)
087         * 
088         * @see
089         * org.graphstream.algorithm.Algorithm#init(org.graphstream.graph.Graph)
090         */
091        public void init(Graph graph) {
092                g = graph;
093                g.addSink(trigger);
094        }
095
096        private class StepTrigger extends SinkAdapter {
097                public void stepBegins(String sourceId, long timeId, double step) {
098                        compute();
099                }
100        }
101}