26static double distvec(
double *p0,
double *p1,
double *vec)
31 for (k = 0; k <
Ndim; k++) {
32 vec[k] = p0[k] - p1[k];
33 dist += vec[k] * vec[k];
43 double **rv =
gv_calloc(m,
sizeof(
double*));
44 double *mem =
gv_calloc(m * n,
sizeof(
double));
45 for (i = 0; i < m; i++) {
48 for (j = 0; j < n; j++)
63static double ***
new_3array(
int m,
int n,
int p,
double ival)
67 double ***rv =
gv_calloc(m + 1,
sizeof(
double**));
68 for (i = 0; i < m; i++) {
69 rv[i] =
gv_calloc(n + 1,
sizeof(
double*));
70 for (j = 0; j < n; j++) {
72 for (k = 0; k < p; k++)
86 for (i = 0; rv[i]; i++) {
87 for (j = 0; rv[i][j]; j++)
106 if (*
s ==
'\0')
return 1;
108 if (sscanf(
s,
"%lf", val) < 1 || *val < 0 || (*val == 0 && !
Nop)) {
166 }
else if (deg == 1) {
181 double total_len = 0.0;
206 double total_len = 0.0;
207 double dfltlen = 1.0;
211 fprintf(stderr,
"Scanning graph %s, %d nodes\n",
agnameof(
G),
222 }
else if (deg == 1) {
269 Initial_dist = total_len / (nE > 0 ? nE : 1) * sqrt(nV) + 1;
301 for (k = n; k <
Ndim; k++)
322 static atomic_flag once;
325 fprintf(stderr,
"Setting initial positions\n");
331 agwarningf(
"start=0 not supported with mode=self - ignored\n");
349 fprintf(stderr,
"Setting up spring model: ");
355 for (i = 0; i < nG; i++) {
356 for (j = 0; j < i; j++) {
360 K[i][j] = K[j][i] = f;
365 for (i = 0; i < nG; i++)
366 for (k = 0; k <
Ndim; k++)
370 for (j = 0; j < nG; j++) {
375 for (k = 0; k <
Ndim; k++) {
398 for (i = 0; i < nG - 1; i++) {
400 for (j = i + 1; j < nG; j++) {
402 for (t0 = 0.0, d = 0; d <
Ndim; d++) {
408 - 2.0 *
GD_dist(
G)[i][j] * sqrt(t0));
424 fprintf(stderr,
"\nfinal e = %f",
total_e(
G, nG));
425 fprintf(stderr,
" %d%s iterations %.2f sec\n",
430 agwarningf(
"Max. iterations (%d) reached on graph %s\n",
441 for (k = 0; k <
Ndim; k++)
443 for (j = 0; j < nG; j++) {
448 for (k = 0; k <
Ndim; k++) {
453 const double old =
GD_t(
G)[j][i][k];
460#define Msub(i,j) M[(i)*Ndim+(j)]
470 for (l = 0; l <
Ndim; l++)
471 for (k = 0; k <
Ndim; k++)
473 for (i = 0; i < nG; i++) {
478 for (k = 0; k <
Ndim; k++) {
482 scale = 1 / pow(sq, 1.5);
483 for (k = 0; k <
Ndim; k++) {
484 for (l = 0; l < k; l++)
485 Msub(l, k) += K[n][i] *
D[n][i] * t[k] * t[l] *
scale;
487 K[n][i] * (1.0 -
D[n][i] * (sq - t[k] * t[k]) *
scale);
490 for (k = 1; k <
Ndim; k++)
491 for (l = 0; l < k; l++)
507 for (i = 0; i < nG; i++) {
511 for (m = 0.0, k = 0; k <
Ndim; k++)
523 fprintf(stderr,
"%.3f ", sqrt(max));
525 fprintf(stderr,
"\n");
540 for (i = 0; i <
Ndim; i++)
543 for (i = 0; i <
Ndim; i++) {
551 for (i = 0; i <
Ndim; i++) {
555 fprintf(stderr,
"%s %.3f\n",
agnameof(n), sum);
640 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 WUR 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)
return 2 × energy of system
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)