https://github.com/cran/spatstat
Raw File
Tip revision: 4c0b5d0bfa215ca4a7c76ed9cac3b982da128bba authored by Adrian Baddeley on 11 November 2011, 11:19:29 UTC
version 1.24-2
Tip revision: 4c0b5d0
dist2dpath.c
#include <R.h>

/*
  given matrix of edge lengths
  compute matrix of shortest-path distances
*/

#undef DEBUG

#define MATRIX(X,I,J) (X)[(J) + n * (I)]
#define D(I,J)     MATRIX(d,     I, J)
#define DPATH(I,J) MATRIX(dpath, I, J)
#define ADJ(I,J)   (MATRIX(adj,  I, J) != 0)

#define INFIN -1
#define FINITE(X) ((X) >= 0)


void dist2dpath(nv, d, adj, dpath, niter) 
  int *nv;     /* number of vertices */
  double *d;  /* matrix of edge lengths */
  int *adj;   /* 0/1 edge matrix of graph */
  double *dpath; /* output - shortest path distance matrix */
  int *niter;
{
  int i, j, k, n, iter;
  int changed, changedij;
  double dij, dik, dkj, dikj;

  n = *nv;

  /* initialise */
  for(i = 0; i < n; i++) 
    for(j = 0; j < n; j++) 
      DPATH(i, j) = (i == j) ? 0 : ((ADJ(i,j)) ? D(i, j) : INFIN);

  /* */
  for(iter = 0; iter < n; iter++) {
    changed = 0;
#ifdef DEBUG
    Rprintf("--------- iteration %d ---------------\n", iter);
#endif
    for(i = 1; i < n; i++) {
      for(j = 0; j < i; j++) {
	dij = DPATH(i,j);
#ifdef DEBUG
	Rprintf("i=%d j=%d dij=%lf\n", i, j, dij);
#endif
	changedij = 0;
	for(k = 0; k < n; k++) {
	  dik = DPATH(i,k);
	  dkj = DPATH(k,j);
	  if(FINITE(dik) && FINITE(dkj)) {
	    dikj = dik + dkj;
#ifdef DEBUG
	    Rprintf("considering %d -> %d -> %d, \t dikj=%lf\n", 
		    i, j, k, dikj);
#endif
	    if(!FINITE(dij) || dikj < dij) {
	      changedij = 1;
#ifdef DEBUG
	      Rprintf("updating i=%d j=%d via k=%d from %lf to %lf\n", 
		      i, j, k, dij, dikj);
#endif
	      dij = dikj;
	    }
	  }
	}
	if(changedij != 0) {
#ifdef DEBUG
	  Rprintf("Resetting d(%d,%d) to %lf\n", i, j, dij);
#endif
	  DPATH(i,j) = DPATH(j,i) = dij;
	  changed = 1;
	}
      }
    }
    if(changed == 0) 
      break;
  }
  
  *niter = iter;
}

back to top