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++)
109 if (*
s ==
'\0')
return 1;
111 if (sscanf(
s,
"%lf", val) < 1 || *val < 0 || (*val == 0 && !
Nop)) {
169 }
else if (deg == 1) {
184 double total_len = 0.0;
209 double total_len = 0.0;
210 double dfltlen = 1.0;
214 fprintf(stderr,
"Scanning graph %s, %d nodes\n",
agnameof(
G),
225 }
else if (deg == 1) {
272 Initial_dist = total_len / (nE > 0 ? nE : 1) * sqrt(nV) + 1;
304 for (k = n; k <
Ndim; k++)
325 static atomic_flag once;
328 fprintf(stderr,
"Setting initial positions\n");
334 agwarningf(
"start=0 not supported with mode=self - ignored\n");
352 fprintf(stderr,
"Setting up spring model: ");
358 for (i = 0; i < nG; i++) {
359 for (j = 0; j < i; j++) {
363 K[i][j] = K[j][i] = f;
368 for (i = 0; i < nG; i++)
369 for (k = 0; k <
Ndim; k++)
373 for (j = 0; j < nG; j++) {
378 for (k = 0; k <
Ndim; k++) {
401 for (i = 0; i < nG - 1; i++) {
403 for (j = i + 1; j < nG; j++) {
405 for (t0 = 0.0, d = 0; d <
Ndim; d++) {
411 - 2.0 *
GD_dist(
G)[i][j] * sqrt(t0));
427 fprintf(stderr,
"\nfinal e = %f",
total_e(
G, nG));
428 fprintf(stderr,
" %d%s iterations %.2f sec\n",
433 agwarningf(
"Max. iterations (%d) reached on graph %s\n",
444 for (k = 0; k <
Ndim; k++)
446 for (j = 0; j < nG; j++) {
451 for (k = 0; k <
Ndim; k++) {
456 const double old =
GD_t(
G)[j][i][k];
463#define Msub(i,j) M[(i)*Ndim+(j)]
473 for (l = 0; l <
Ndim; l++)
474 for (k = 0; k <
Ndim; k++)
476 for (i = 0; i < nG; i++) {
481 for (k = 0; k <
Ndim; k++) {
485 scale = 1 / pow(sq, 1.5);
486 for (k = 0; k <
Ndim; k++) {
487 for (l = 0; l < k; l++)
488 Msub(l, k) += K[n][i] *
D[n][i] * t[k] * t[l] *
scale;
490 K[n][i] * (1.0 -
D[n][i] * (sq - t[k] * t[k]) *
scale);
493 for (k = 1; k <
Ndim; k++)
494 for (l = 0; l < k; l++)
510 for (i = 0; i < nG; i++) {
514 for (m = 0.0, k = 0; k <
Ndim; k++)
526 fprintf(stderr,
"%.3f ", sqrt(max));
528 fprintf(stderr,
"\n");
543 for (i = 0; i <
Ndim; i++)
546 for (i = 0; i <
Ndim; i++) {
554 for (i = 0; i <
Ndim; i++) {
558 fprintf(stderr,
"%s %.3f\n",
agnameof(n), sum);
643 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)