From 12b21e1d27f43deaa748419919b40b80cedd0ddd Mon Sep 17 00:00:00 2001 From: Tim Dwyer Date: Wed, 12 Jul 2006 00:55:58 +0000 Subject: Previously graph layout was done using the Kamada-Kawai layout algorithm implemented in Boost. I am replacing this with a custom implementation of a constrained stress-majorization algorithm. The stress-majorization algorithm is more robust and has better convergence characteristics than Kamada-Kawai, and also simple constraints can be placed on node position (for example, to enforce downward-pointing edges, non-overlap constraints, or cluster constraints). Another big advantage is that we no longer need Boost. I've tested the basic functionality, but I have yet to properly handle disconnected graphs or to properly scale the resulting layout. This commit also includes significant refactoring... the quadratic program solver - libvpsc (Variable Placement with Separation Constraints) has been moved to src/libvpsc and the actual graph layout algorithm is in libcola. (bzr r1394) --- src/libcola/shortest_paths.cpp | 100 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 src/libcola/shortest_paths.cpp (limited to 'src/libcola/shortest_paths.cpp') diff --git a/src/libcola/shortest_paths.cpp b/src/libcola/shortest_paths.cpp new file mode 100644 index 000000000..4f4183b07 --- /dev/null +++ b/src/libcola/shortest_paths.cpp @@ -0,0 +1,100 @@ +// vim: set cindent +// vim: ts=4 sw=4 et tw=0 wm=0 +#include "shortest_paths.h" +#include +#include +#include +#include +using namespace std; +namespace shortest_paths { +// O(n^3) time. Slow, but fool proof. Use for testing. +void floyd_warshall( + unsigned n, + double** D, + vector& es, + double* eweights) +{ + for(unsigned i=0;i& es, double* eweights) { + for(unsigned i=0;i Q(&compareNodes); + for(unsigned i=0;iid]=u->d; + for(unsigned i=0;ineighbours.size();i++) { + Node *v=u->neighbours[i]; + double w=u->nweights[i]; + if(v->d>u->d+w) { + v->p=u; + v->d=u->d+w; + Q.decreaseKey(v->qnode,v); + } + } + } +} +void dijkstra( + unsigned s, + unsigned n, + double* d, + vector& es, + double* eweights) +{ + assert(s& es, + double* eweights) +{ + Node vs[n]; + dijkstra_init(vs,es,eweights); + for(unsigned k=0;k