1. 17 Jun, 2008 1 commit
  2. 01 Jun, 2008 1 commit
  3. 30 May, 2008 1 commit
  4. 19 May, 2008 1 commit
  5. 12 May, 2008 1 commit
  6. 09 May, 2008 1 commit
  7. 06 May, 2008 4 commits
  8. 02 May, 2008 2 commits
  9. 01 May, 2008 1 commit
  10. 23 Apr, 2008 1 commit
  11. 15 Apr, 2008 1 commit
  12. 14 Apr, 2008 5 commits
  13. 10 Apr, 2008 1 commit
    • Tiago Peixoto's avatar
      Correlations algorithms refactoring · 360a3395
      Tiago Peixoto authored
      The whole histogram code has been redone, and the code has been
      simplified. The three-point vertex-edge-vertex correlation has been
      scrapped, since it's not frequently used, and would make compilation
      even more expensive.
      
      This also adds some missing files to the generation routine.
      360a3395
  14. 06 Apr, 2008 1 commit
  15. 04 Apr, 2008 1 commit
  16. 27 Mar, 2008 3 commits
    • Tiago Peixoto's avatar
      Add test suites · b7237044
      Tiago Peixoto authored
      This adds the graph_tool.test module, which can be run with
      graph_tool.test.run()
      b7237044
    • Tiago Peixoto's avatar
      Port run_action to the new filtering engine · 275b4c3e
      Tiago Peixoto authored
      Put the run_action function in a separate submodule, and make it work
      properly with the new code.
      275b4c3e
    • Tiago Peixoto's avatar
      Port graph I/O to new filtering engine, enable graph pickling, and fix several issues · 99bf21c8
      Tiago Peixoto authored
      Now graphml files properly contain all the supported value types, which
      are all perfectly preserved when read (floating point data is now saved
      in hexadecimal format). Several other improvements were made, such as
      the ability to read and write to python file-like objects.
      
      It is also now possible to have arbitrary python object properties, and
      store them persistently (which is done internally with the pickling
      interface).
      
      vector<bool> was totally abolished, since its implementation is quite
      broken. See: http://www.gotw.ca/publications/N1211.pdf and
      http://www.gotw.ca/publications/N1185.pdf Now a uint8_t (aka. char) is
      used in graph properties instead of a bool.
      
      Graph types can now be fully pickled (this may not be feasible
      memory-wise if the graph is too large, since the whole XML
      representation is dumped to a string before it is saved on disc).
      99bf21c8
  17. 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
      3cfff0cb
  18. 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)
               |                               |           |           |
               |                               |           |           |
               |-------(reversed_graph)--------|-----------|-----------|
               |                               |           |           |
               \------(UndirectedAdaptor)------------------------------/
      
      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
      usage)
      
      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,
                                               var(result)),
                             vertex_scalar_properties())(vprop);
              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.
      0b66e272
  19. 21 Dec, 2007 2 commits
  20. 17 Dec, 2007 1 commit
    • Tiago Peixoto's avatar
      Fix visibility/RTTI problem with run_action() · 0c1f0df2
      Tiago Peixoto authored
      Some visibility voodoo is necessary to ensure that RTTI work properly
      across DSO boundaries, which is necessary to properly handle dynamic
      property maps and such. Additionally, the action template must have a
      different name each time the action code changes, to avoid additional
      weirdness.
      
      This also adds some other utility functions/typedefs to make writing
      "inline" c++ code easier.
      0c1f0df2
  21. 14 Dec, 2007 2 commits
    • Tiago Peixoto's avatar
      Fix add_edge_property() · 5b45d806
      Tiago Peixoto authored
      add_edge_property() should return a edge property not a vertex_property
      5b45d806
    • Tiago Peixoto's avatar
      Add support for running arbitrary C++ code from python · 866bb994
      Tiago Peixoto authored
      It is now possible to run arbitrary "inline" C++ code from python, using
      scipy.weave, as such:
      
              g = graph_tool.Graph()
              g.load("foo.xml")
              value = 2.0
              g.run_action('cout << num_vertices(g) << " " << value << endl;',
                           ["value"]);
      
      The code gets compiled the first time, and is reused after that. Python
      local and global variables can be passed to C++, as shown above, by
      specifying a list of passed variables as the second argument.
      866bb994
  22. 13 Dec, 2007 1 commit
  23. 06 Dec, 2007 2 commits
    • Tiago Peixoto's avatar
      Fix edit_{vertex|edge|graph}_property() · db440664
      Tiago Peixoto authored
      The graph object passed to the edit function is now a instance of the
      Graph class which wraps GraphInterface, not a GraphInterface instance.
      db440664
    • Tiago Peixoto's avatar
      Implement lazy loading of graphs · de0a0a8e
      Tiago Peixoto authored
      Graphs can now be loaded "lazily" with the lazy_load() function, which
      works just like load(), but doesn't actually load the graph, which is
      delayed until the graph is accessed for the first time, e.g.
      
          import graph_tool
      
          g = graph_tool.Graph()
          g.lazy_load("example.xml")
      
          g.number_of_vertices()  # <- the graph is only loaded here
      de0a0a8e
  24. 03 Dec, 2007 4 commits