| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137 | // (C) Copyright 2007 Andrew Sutton//// Use, modification and distribution are subject to the// Boost Software License, Version 1.0 (See accompanying file// LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)#ifndef BOOST_GRAPH_DETAIL_GEODESIC_HPP#define BOOST_GRAPH_DETAIL_GEODESIC_HPP#include <functional>#include <boost/config.hpp>#include <boost/graph/graph_concepts.hpp>#include <boost/graph/numeric_values.hpp>#include <boost/concept/assert.hpp>// TODO: Should this really be in detail?namespace boost{// This is a very good discussion on centrality measures. While I can't// say that this has been the motivating factor for the design and// implementation of ths centrality framework, it does provide a single// point of reference for defining things like degree and closeness// centrality. Plus, the bibliography seems fairly complete.////     @article{citeulike:1144245,//         author = {Borgatti, Stephen  P. and Everett, Martin  G.},//         citeulike-article-id = {1144245},//         doi = {10.1016/j.socnet.2005.11.005},//         journal = {Social Networks},//         month = {October},//         number = {4},//         pages = {466--484},//         priority = {0},//         title = {A Graph-theoretic perspective on centrality},//         url = {https://doi.org/10.1016/j.socnet.2005.11.005},//             volume = {28},//             year = {2006}//         }//     }namespace detail{    // Note that this assumes T == property_traits<DistanceMap>::value_type    // and that the args and return of combine are also T.    template < typename Graph, typename DistanceMap, typename Combinator,        typename Distance >    inline Distance combine_distances(        const Graph& g, DistanceMap dist, Combinator combine, Distance init)    {        BOOST_CONCEPT_ASSERT((VertexListGraphConcept< Graph >));        typedef typename graph_traits< Graph >::vertex_descriptor Vertex;        typedef typename graph_traits< Graph >::vertex_iterator VertexIterator;        BOOST_CONCEPT_ASSERT(            (ReadablePropertyMapConcept< DistanceMap, Vertex >));        BOOST_CONCEPT_ASSERT((NumericValueConcept< Distance >));        typedef numeric_values< Distance > DistanceNumbers;        BOOST_CONCEPT_ASSERT((AdaptableBinaryFunction< Combinator, Distance,            Distance, Distance >));        // If there's ever an infinite distance, then we simply return        // infinity. Note that this /will/ include the a non-zero        // distance-to-self in the combined values. However, this is usually        // zero, so it shouldn't be too problematic.        Distance ret = init;        VertexIterator i, end;        for (boost::tie(i, end) = vertices(g); i != end; ++i)        {            Vertex v = *i;            if (get(dist, v) != DistanceNumbers::infinity())            {                ret = combine(ret, get(dist, v));            }            else            {                ret = DistanceNumbers::infinity();                break;            }        }        return ret;    }    // Similar to std::plus<T>, but maximizes parameters    // rather than adding them.    template < typename T > struct maximize    {        typedef T result_type;        typedef T first_argument_type;        typedef T second_argument_type;        T operator()(T x, T y) const        {            BOOST_USING_STD_MAX();            return max BOOST_PREVENT_MACRO_SUBSTITUTION(x, y);        }    };    // Another helper, like maximize() to help abstract functional    // concepts. This is trivially instantiated for builtin numeric    // types, but should be specialized for those types that have    // discrete notions of reciprocals.    template < typename T > struct reciprocal    {        typedef T result_type;        typedef T argument_type;        T operator()(T t) { return T(1) / t; }    };} /* namespace detail */// This type defines the basic facilities used for computing values// based on the geodesic distances between vertices. Examples include// closeness centrality and mean geodesic distance.template < typename Graph, typename DistanceType, typename ResultType >struct geodesic_measure{    typedef DistanceType distance_type;    typedef ResultType result_type;    typedef typename graph_traits< Graph >::vertices_size_type size_type;    typedef numeric_values< distance_type > distance_values;    typedef numeric_values< result_type > result_values;    static inline distance_type infinite_distance()    {        return distance_values::infinity();    }    static inline result_type infinite_result()    {        return result_values::infinity();    }    static inline result_type zero_result() { return result_values::zero(); }};} /* namespace boost */#endif
 |