29static double distvec(
double *p0,
double *p1,
double *vec)
34 for (k = 0; k <
Ndim; k++) {
35 vec[k] = p0[k] - p1[k];
36 dist += vec[k] * vec[k];
46 double **rv =
gv_calloc(m,
sizeof(
double*));
47 double *mem =
gv_calloc(m * n,
sizeof(
double));
48 for (i = 0; i < m; i++) {
51 for (j = 0; j < n; j++)
66static double ***
new_3array(
int m,
int n,
int p,
double ival)
70 double ***rv =
gv_calloc(m + 1,
sizeof(
double**));
71 for (i = 0; i < m; i++) {
72 rv[i] =
gv_calloc(n + 1,
sizeof(
double*));
73 for (j = 0; j < n; j++) {
75 for (k = 0; k < p; k++)
89 for (i = 0; rv[i]; i++) {
90 for (j = 0; rv[i][j]; j++)
111 if (*
s ==
'\0')
return 1;
113 if (sscanf(
s,
"%lf", val) < 1 || *val < 0 || (*val == 0 && !
Nop)) {
175 }
else if (deg == 1) {
190 double total_len = 0.0;
216 double total_len = 0.0;
217 double dfltlen = 1.0;
221 fprintf(stderr,
"Scanning graph %s, %d nodes\n",
agnameof(
G),
232 }
else if (deg == 1) {
279 Initial_dist = total_len / (nE > 0 ? nE : 1) * sqrt(nV) + 1;
311 for (k = n; k <
Ndim; k++)
332 static atomic_flag once;
335 fprintf(stderr,
"Setting initial positions\n");
341 agwarningf(
"start=0 not supported with mode=self - ignored\n");
359 fprintf(stderr,
"Setting up spring model: ");
365 for (i = 0; i < nG; i++) {
366 for (j = 0; j < i; j++) {
370 K[i][j] = K[j][i] = f;
375 for (i = 0; i < nG; i++)
376 for (k = 0; k <
Ndim; k++)
380 for (j = 0; j < nG; j++) {
385 for (k = 0; k <
Ndim; k++) {
410 for (i = 0; i < nG - 1; i++) {
412 for (j = i + 1; j < nG; j++) {
414 for (t0 = 0.0, d = 0; d <
Ndim; d++) {
420 - 2.0 *
GD_dist(
G)[i][j] * sqrt(t0));
436 fprintf(stderr,
"\nfinal e = %f",
total_e(
G, nG));
437 fprintf(stderr,
" %d%s iterations %.2f sec\n",
442 agwarningf(
"Max. iterations (%d) reached on graph %s\n",
453 for (k = 0; k <
Ndim; k++)
455 for (j = 0; j < nG; j++) {
460 for (k = 0; k <
Ndim; k++) {
465 const double old =
GD_t(
G)[j][i][k];
472#define Msub(i,j) M[(i)*Ndim+(j)]
482 for (l = 0; l <
Ndim; l++)
483 for (k = 0; k <
Ndim; k++)
485 for (i = 0; i < nG; i++) {
490 for (k = 0; k <
Ndim; k++) {
494 scale = 1 / pow(sq, 1.5);
495 for (k = 0; k <
Ndim; k++) {
496 for (l = 0; l < k; l++)
497 Msub(l, k) += K[n][i] *
D[n][i] * t[k] * t[l] *
scale;
499 K[n][i] * (1.0 -
D[n][i] * (sq - t[k] * t[k]) *
scale);
502 for (k = 1; k <
Ndim; k++)
503 for (l = 0; l < k; l++)
519 for (i = 0; i < nG; i++) {
523 for (m = 0.0, k = 0; k <
Ndim; k++)
535 fprintf(stderr,
"%.3f ", sqrt(max));
537 fprintf(stderr,
"\n");
552 for (i = 0; i <
Ndim; i++)
555 for (i = 0; i <
Ndim; i++) {
563 for (i = 0; i <
Ndim; i++) {
567 fprintf(stderr,
"%s %.3f\n",
agnameof(n), sum);
652 fprintf(stderr,
"Calculating shortest paths: ");
Memory allocation wrappers that exit on failure.
static void * gv_calloc(size_t nmemb, size_t size)
static void del(Dict_t *d, Dtlink_t **set, Agedge_t *e)
static void init(int argc, char *argv[], double *angle, double *accuracy, int *check_edges_with_same_endpoint, int *seed, const char **color_scheme, int *lightness)
static double dist(int dim, double *x, double *y)
static pointf scale(double c, pointf p)
static double len(glCompPoint p)
static int cnt(Dict_t *d, Dtlink_t **set)
int agnedges(Agraph_t *g)
int agnnodes(Agraph_t *g)
Agsym_t * agattr_text(Agraph_t *g, int kind, char *name, const char *value)
creates or looks up text attributes of a graph
char * agget(void *obj, char *name)
char * agxget(void *obj, Agsym_t *sym)
Agedge_t * agfstout(Agraph_t *g, Agnode_t *n)
#define agfindedge(g, t, h)
Agedge_t * agnxtedge(Agraph_t *g, Agedge_t *e, Agnode_t *n)
Agedge_t * agnxtout(Agraph_t *g, Agedge_t *e)
Agedge_t * agfstedge(Agraph_t *g, Agnode_t *n)
void agwarningf(const char *fmt,...)
int agerr(agerrlevel_t level, const char *fmt,...)
#define GD_neato_nlist(g)
Agnode_t * agnxtnode(Agraph_t *g, Agnode_t *n)
Agnode_t * agfstnode(Agraph_t *g)
char * agnameof(void *)
returns a string descriptor for the object.
int agdelete(Agraph_t *g, void *obj)
deletes object. Equivalent to agclose, agdelnode, and agdeledge for obj being a graph,...
textitem scanner parser str
int checkStart(graph_t *G, int nG, int dflt)
NEATOPROCS_API void solve(double *, double *, double *, size_t)
static void heapup(node_t *v)
static void update_arrays(graph_t *G, int nG, int i)
static void make_spring(graph_t *, Agnode_t *, Agnode_t *, double)
void solve_model(graph_t *G, int nG)
void randompos(node_t *np, int nG)
int scan_graph(graph_t *g)
void s1(graph_t *G, node_t *node)
void jitter3d(node_t *np, int nG)
void shortest_path(graph_t *G, int nG)
static node_t * prune(graph_t *G, node_t *np, node_t *next)
static void D2E(graph_t *G, int nG, int n, double *M)
static double setEdgeLen(graph_t *G, node_t *np, Agsym_t *lenx, double dfltlen)
node_t * neato_dequeue(void)
void jitter_d(node_t *np, int nG, int n)
int scan_graph_mode(graph_t *G, int mode)
void free_array(double **rv)
void free_scan_graph(graph_t *g)
void diffeq_model(graph_t *G, int nG)
static void move_node(graph_t *, int, Agnode_t *)
void initial_positions(graph_t *G, int nG)
static Agnode_t * choose_node(graph_t *, int)
static int degreeKind(graph_t *g, node_t *n, node_t **op)
static void heapdown(node_t *v)
static void free_3array(double ***rv)
static double total_e(graph_t *G, int nG)
void neato_enqueue(node_t *v)
static double distvec(double *p0, double *p1, double *vec)
static double *** new_3array(int m, int n, int p, double ival)
static int lenattr(edge_t *e, Agsym_t *index, double *val)
double ** new_array(int m, int n, double ival)