Graphviz 16.0.0~dev.20260810.2334
Loading...
Searching...
No Matches
general.c
Go to the documentation of this file.
1/*************************************************************************
2 * Copyright (c) 2011 AT&T Intellectual Property
3 * All rights reserved. This program and the accompanying materials
4 * are made available under the terms of the Eclipse Public License v2.0
5 * which accompanies this distribution, and is available at
6 * https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html
7 *
8 * Contributors: Details at https://graphviz.org
9 *************************************************************************/
10
11#include "config.h"
12
13#include <math.h>
14#include <stdbool.h>
15#include <stddef.h>
16#include <sparse/general.h>
17#include <errno.h>
18#include <util/alloc.h>
19#include <util/sort.h>
20
21#ifdef DEBUG
22double _statistics[10];
23#endif
24
25double drand(void){
26 return rand()/(double) RAND_MAX;
27}
28
29double *vector_subtract_to(size_t n, double *x, double *y) {
30 /* y = x-y */
31 for (size_t i = 0; i < n; i++) y[i] = x[i] - y[i];
32 return y;
33}
34double vector_product(int n, double *x, double *y){
35 double res = 0;
36 int i;
37 for (i = 0; i < n; i++) res += x[i]*y[i];
38 return res;
39}
40
41double *vector_saxpy(size_t n, double *x, double *y, double beta) {
42 /* y = x+beta*y */
43 for (size_t i = 0; i < n; i++) y[i] = x[i] + beta * y[i];
44 return y;
45}
46
47double *vector_saxpy2(size_t n, double *x, double *y, double beta) {
48 /* x = x+beta*y */
49 for (size_t i = 0; i < n; i++) x[i] += beta * y[i];
50 return x;
51}
52
53void vector_float_take(size_t n, float *v, size_t m, size_t *p, float **u) {
54 /* take m elements v[p[i]]],i=1,...,m and oput in u */
55 if (!*u) *u = gv_calloc(m, sizeof(float));
56
57 for (size_t i = 0; i < m; i++) {
58 assert(p[i] < n);
59 (void)n;
60 (*u)[i] = v[p[i]];
61 }
62
63}
64
71static int comp_ascend(const void *s1, const void *s2, void *values) {
72 const size_t *const ss1 = s1;
73 const size_t *const ss2 = s2;
74 const double *const v = values;
75
76 if (v[*ss1] > v[*ss2]) {
77 return 1;
78 } else if (v[*ss1] < v[*ss2]) {
79 return -1;
80 }
81 return 0;
82}
83
84size_t *vector_ordering(size_t n, double *v) {
85 size_t *const p = gv_calloc(n, sizeof(size_t));
86
87 for (size_t i = 0; i < n; i++) {
88 p[i] = i;
89 }
90
91 gv_sort(p, n, sizeof(p[0]), comp_ascend, v);
92 return p;
93}
94
95double distance_cropped(double *x, int dim, int i, int j){
96 double dist = distance(x, dim, i, j);
97 return fmax(dist, MINDIST);
98}
99
100double distance(double *x, int dim, int i, int j){
101 int k;
102 double dist = 0.;
103 for (k = 0; k < dim; k++) dist += (x[i*dim+k] - x[j*dim + k])*(x[i*dim+k] - x[j*dim + k]);
104 dist = sqrt(dist);
105 return dist;
106}
107
108double point_distance(double *p1, double *p2, int dim){
109 int i;
110 double dist;
111 dist = 0;
112 for (i = 0; i < dim; i++) dist += (p1[i] - p2[i])*(p1[i] - p2[i]);
113 return sqrt(dist);
114}
115
116char *strip_dir(char *s){
117 bool first = true;
118 if (!s) return s;
119 for (size_t i = strlen(s); ; i--) {
120 if (first && s[i] == '.') {/* get rid of .mtx */
121 s[i] = '\0';
122 first = false;
123 }
124 if (s[i] == '/') return &s[i+1];
125 if (i == 0) {
126 break;
127 }
128 }
129 return s;
130}
Memory allocation wrappers that exit on failure.
static void * gv_calloc(size_t nmemb, size_t size)
Definition alloc.h:26
#define MINDIST
Definition circular.c:18
static double dist(int dim, double *x, double *y)
size_t * vector_ordering(size_t n, double *v)
Definition general.c:84
static int comp_ascend(const void *s1, const void *s2, void *values)
Definition general.c:71
double * vector_saxpy(size_t n, double *x, double *y, double beta)
y = x+beta*y
Definition general.c:41
double drand(void)
Definition general.c:25
char * strip_dir(char *s)
Definition general.c:116
double distance(double *x, int dim, int i, int j)
Definition general.c:100
double vector_product(int n, double *x, double *y)
Definition general.c:34
double * vector_subtract_to(size_t n, double *x, double *y)
y = x-y
Definition general.c:29
double * vector_saxpy2(size_t n, double *x, double *y, double beta)
x = x+beta*y
Definition general.c:47
void vector_float_take(size_t n, float *v, size_t m, size_t *p, float **u)
Definition general.c:53
double distance_cropped(double *x, int dim, int i, int j)
Definition general.c:95
double point_distance(double *p1, double *p2, int dim)
Definition general.c:108
static const int dim
NEATOPROCS_API void s1(graph_t *, node_t *)
Definition stuff.c:651
qsort with carried along context
static void gv_sort(void *base, size_t nmemb, size_t size, int(*compar)(const void *, const void *, void *), void *arg)
qsort with an extra state parameter, ala qsort_r
Definition sort.h:24
Definition grammar.c:90