1. 02 May, 2012 1 commit
  2. 29 Apr, 2012 3 commits
  3. 14 Sep, 2011 1 commit
  4. 02 Sep, 2011 1 commit
  5. 26 Aug, 2011 1 commit
  6. 24 Aug, 2011 1 commit
    • Tiago Peixoto's avatar
      Several improvements to random_rewire() / random_graph() · 8240714e
      Tiago Peixoto authored
      This introduces several simplifications and corrections to the graph
      rewire algorithm, to guarantee unbiased sampling.
      Now a move is outright rejected if it produces a
      self-loop/parallel-edge, instead of retried. This also adds a
      "non-sweep" mode, where edges are rewired randomly, possibly with
      The edge moves are now simplified to the target of the edges only,
      since swaping sources is redundant.
      The number of iterations can now be explicitly modified, so it is not
      necessary to call the function more than once, and it is emphasized in
      the documentation that only after sufficiently many iterations can the
      graph be guaranteed to be fully mixed.
  7. 10 Feb, 2011 1 commit
  8. 13 Nov, 2010 1 commit
  9. 25 Jul, 2010 1 commit
  10. 07 Mar, 2010 1 commit
  11. 20 Feb, 2010 2 commits
    • Tiago Peixoto's avatar
      Include probabilistic random_rewire() strategy · 64cb52b3
      Tiago Peixoto authored
      This includes also some internal refactoring, and bug fixes.
    • Tiago Peixoto's avatar
      Refactor random_rewire() · b678e65a
      Tiago Peixoto authored
      This extensively modifies the random_rewire() algorithm, so that only
      either the source or the edge of each edge is rewired (not both, as
      previously), and no parallel edges are created during the algorithm (if
      The new version is much faster, and never gets stuck. However, more than
      one run may be necessary in order to obtain a uniform shuffling.
  12. 14 Feb, 2010 1 commit
  13. 08 Feb, 2010 1 commit
    • Tiago Peixoto's avatar
      Fix rewiring bias bug for undirected graphs · d158af8f
      Tiago Peixoto authored
      This fixes a problem, where the underlying edge directionality would
      cause correlations to arise when rewiring undirected graphs. Now each
      edge is correctly considered in both possible orientations, which are
      chosen randomly.
  14. 23 Dec, 2009 1 commit
    • Tiago Peixoto's avatar
      Relax boost version requirements · 154ef865
      Tiago Peixoto authored
      This allows compilation with older versions of boost (>=1.38), which in
      some sistems are the only option. This commit also removes the linking
      of the boost_graph shared library, since none of its symbols are
      actually required.
  15. 22 Dec, 2009 1 commit
  16. 05 Nov, 2009 1 commit
    • Tiago Peixoto's avatar
      Sync with boost 1.40 · 6d1810e1
      Tiago Peixoto authored
      Fix compilation warnings with boost 1.40, remove unnecessary files, fix
      autoconf macros and link with "boost_graph".
      This also raises the minimum boost version to 1.40.
  17. 06 Sep, 2009 1 commit
  18. 13 Aug, 2009 1 commit
    • Tiago Peixoto's avatar
      Reorganize exceptions thrown · f257d426
      Tiago Peixoto authored
      No longer only thrown GraphError upon any error, but instead throw
      specific exceptions which are more meaninful and are mapped to standard
      python exceptions, such as IOError, ValueError and RuntimeError.
  19. 07 Aug, 2009 1 commit
    • Tiago Peixoto's avatar
      Fix bug in random_rewire() with undirected graphs · c72e48d5
      Tiago Peixoto authored
      When using undirected graphs, the implicit direction of each edge was
      not properly handled, and the correlated case would not work. Now, in
      this case, the direction is always checked, and the edge is inverted if
  20. 04 Aug, 2009 1 commit
  21. 02 Jun, 2009 2 commits
  22. 23 May, 2009 1 commit
  23. 10 Mar, 2009 2 commits
    • Tiago Peixoto's avatar
      Fix graph_rewire "can't rewire" bug · 6defdb43
      Tiago Peixoto authored
      This finally fixes in the bug addressed by commit 309ddbbd, where
      parallel edges could be erroneously created. In fact, the bug was more
      serious: The source and target edge lists always pointed to the same
      list (in the uncorrelated case, but could occasionally happen for the
      correlated case also) which got shuffled during iteration. Since the
      shuffling of one list interfered with the shuffling of the other, some
      combinations of source and target edges could simply never be
      considered... This commit forces both lists to always be independent.
    • Tiago Peixoto's avatar
      Implement optional wrapping of graphs to deal with edge index housekeeping · 684efca7
      Tiago Peixoto authored
      Thins changes the graph filtering code slightly to wrap graph types with
      GraphWrap, which automatically updates the edge index list when edges
      are removed and added to the graph.
      This also changes how graphs are passed to algorithms, which is now by
      reference instead of pointer. (hence this touches lots of code, but
      changes are trivial)
  24. 10 Feb, 2009 1 commit
    • Tiago Peixoto's avatar
      Fix spurious parallel edge creation in random_rewire() · 50eec674
      Tiago Peixoto authored
      In some circumstances, the test for parallel edges would fail to detect
      one, if it involved another "new" edge and one of the current ones being
      This commit also removes the requirement that edge indexes be continuous
      in the range [0, num_edges(g)), which is not in general the case.
  25. 06 Feb, 2009 1 commit
    • Tiago Peixoto's avatar
      Disable internal bounds checking in property maps · 0ababf9c
      Tiago Peixoto authored
      This includes a new vector property map type (fast_vector_property_map)
      which has optional disabling of bounds checking, through its associate
      map type (unchecked_fast_vector_property_map). This should improve
      performance on algorithms which depend on tight loops which access
      property maps.
      Bounds checking is only disabled locally just before the algorithms run,
      and proper care is taken for bounds checking _beforehand_. The property
      maps exposed to python still have internal bounds checking.
  26. 23 Oct, 2008 2 commits
  27. 21 Oct, 2008 1 commit
    • Tiago Peixoto's avatar
      Rewiring: bugfix, improvements and restructuring resulting in cleaner and faster code · b1e1bc5e
      Tiago Peixoto authored
      Restructure the rewiring code, introducing further abstraction through
      class inheritance.
      Both uncorrelated and correlated cases draw edges directly.
      This has actually proven faster than drawing vertices for the correlated
      case, since realizing that indexes could be stored instead of edges.
      Doing so avoids changes in the pool of candidate edges, which in turn
      removes the need to rebuild it for each edge to rewire.
      Consequently, it also makes the uncorrelated case a lot quicker.
      In the uncorrelated undirected case, the new code also fixes a serious
      bug: when building the edge pool, only one end of each edge was looked
      at, because the "edges" vector is not equivalent to drawing all
      out_edges from all vertices, as is done now.
  28. 17 Feb, 2008 1 commit
    • Tiago Peixoto's avatar
      Split libgraph_tool into sub-modules and add test cases · 3cfff0cb
      Tiago Peixoto authored
      This commit splits libraph_tool into different libraries:
         - libgraph_tool_core
         - libgraph_tool_clustering (*)
         - libgraph_tool_community (*)
         - libgraph_tool_correlations (*)
         - libgraph_tool_distance (*)
         - libgraph_tool_generation (*)
         - libgraph_tool_layout (*)
         - libgraph_tool_misc (*)
         - libgraph_tool_stats (*)
      It also adds the python sub-module 'test', which provides extensive unit
      testing of the core functionality. The core library is fully functional
      and all test pass successfully.
      (*) -> module needs to be ported to new refactoring, and does not yet build
  29. 10 Feb, 2008 1 commit
    • Tiago Peixoto's avatar
      Refactor metaprogramming engine · 0b66e272
      Tiago Peixoto authored
      This is a huge commit which completely refactors the metaprogramming
      engine which generates and selects (at run time) the graph view type and
      the desired algorithm implementation (template instantiation) that runs
      on it.
      Things are laid out now as following. There exists a main underlying
      graph type (GraphInterface::multigraph_t) and several other template
      classes that mask it some way or another, in a hierarchic fashion:
           multigraph_t -> filtered_graph (edges only, vertices only, both)
               |                               |           |           |
               |                               |           |           |
               |                               |           |           |
      The filtered_graph filters out edges and/or vertices from the graph
      based on some scalar boolean property. The reversed_graph reversed the
      direction of the edges and, finally, the UndirectedAdaptor treats the
      original directed graphs as undirected, transversing the in- and
      out-edges of each vertex indifferently. Thus, the total number of graph
      view types is 12. (The option --disable-graph-filtering can be passed to
      the configure script, which will disable graph filtering altogether and
      bring the total number down to 3, to reduce compile time and memory
      In general, some specific algorithm, implemented as a template function
      object, needs to be instantiated for each of those types. Furthermore,
      the algorithm may also depend on other types, such as specific
      property_maps. Thus, the following scheme is used:
          struct my_algorithm // algorithm to be implemented
              template <class Graph, class PropertyMap>
              void operator()(Graph *g, PropertyMap p, double& result) const
                  // ...
          // in order for the above code to be instantiated at compile time
          // and selected at run time, the run_action template function object
          // is used from a member function of the GraphInterface class:
          double GraphInterface::MyAlgorithm(string prop_name)
              double result;
              boost::any vprop = prop(property, _vertex_index, _properties);
              run_action<>()(*this, bind<void>(my_algorithm(), _1, _2,
              return result;
      The whole code was changed to reflect this scheme, but now things are
      more centralized and less ad-hoc code needed to be
      written. Unfortunately, due to GCC's high memory usage during template
      instantiations, some of the code (namely all the degree correlation
      things) had to be split in multiple compilation units... Maybe this will
      change in the future if GCC gets optimized.
      This commit also touches other parts of code. More specifically, the way
      filtering gets done is very different. Now we only filter on boolean
      properties, and with the above scheme, the desired implementation runs
      with the correct chosen type, and no implicit type conversions should
      ever happen, which would have a bad impact on performance.
  30. 13 Dec, 2007 1 commit
  31. 03 Dec, 2007 3 commits
  32. 28 Nov, 2007 1 commit