darknet  v3
utils.c
Go to the documentation of this file.
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <math.h>
5 #include <assert.h>
6 #include <unistd.h>
7 #include <float.h>
8 #include <limits.h>
9 #include <time.h>
10 #include <sys/time.h>
11 
12 #include "utils.h"
13 
14 
15 /*
16 // old timing. is it better? who knows!!
17 double get_wall_time()
18 {
19  struct timeval time;
20  if (gettimeofday(&time,NULL)){
21  return 0;
22  }
23  return (double)time.tv_sec + (double)time.tv_usec * .000001;
24 }
25 */
26 
28 {
29  struct timeval time;
30  if (gettimeofday(&time,NULL)){
31  return 0;
32  }
33  return (double)time.tv_sec + (double)time.tv_usec * .000001;
34 }
35 
36 int *read_intlist(char *gpu_list, int *ngpus, int d)
37 {
38  int *gpus = 0;
39  if(gpu_list){
40  int len = strlen(gpu_list);
41  *ngpus = 1;
42  int i;
43  for(i = 0; i < len; ++i){
44  if (gpu_list[i] == ',') ++*ngpus;
45  }
46  gpus = calloc(*ngpus, sizeof(int));
47  for(i = 0; i < *ngpus; ++i){
48  gpus[i] = atoi(gpu_list);
49  gpu_list = strchr(gpu_list, ',')+1;
50  }
51  } else {
52  gpus = calloc(1, sizeof(float));
53  *gpus = d;
54  *ngpus = 1;
55  }
56  return gpus;
57 }
58 
59 int *read_map(char *filename)
60 {
61  int n = 0;
62  int *map = 0;
63  char *str;
64  FILE *file = fopen(filename, "r");
65  if(!file) file_error(filename);
66  while((str=fgetl(file))){
67  ++n;
68  map = realloc(map, n*sizeof(int));
69  map[n-1] = atoi(str);
70  }
71  return map;
72 }
73 
74 void sorta_shuffle(void *arr, size_t n, size_t size, size_t sections)
75 {
76  size_t i;
77  for(i = 0; i < sections; ++i){
78  size_t start = n*i/sections;
79  size_t end = n*(i+1)/sections;
80  size_t num = end-start;
81  shuffle(arr+(start*size), num, size);
82  }
83 }
84 
85 void shuffle(void *arr, size_t n, size_t size)
86 {
87  size_t i;
88  void *swp = calloc(1, size);
89  for(i = 0; i < n-1; ++i){
90  size_t j = i + rand()/(RAND_MAX / (n-i)+1);
91  memcpy(swp, arr+(j*size), size);
92  memcpy(arr+(j*size), arr+(i*size), size);
93  memcpy(arr+(i*size), swp, size);
94  }
95 }
96 
97 int *random_index_order(int min, int max)
98 {
99  int *inds = calloc(max-min, sizeof(int));
100  int i;
101  for(i = min; i < max; ++i){
102  inds[i] = i;
103  }
104  for(i = min; i < max-1; ++i){
105  int swap = inds[i];
106  int index = i + rand()%(max-i);
107  inds[i] = inds[index];
108  inds[index] = swap;
109  }
110  return inds;
111 }
112 
113 void del_arg(int argc, char **argv, int index)
114 {
115  int i;
116  for(i = index; i < argc-1; ++i) argv[i] = argv[i+1];
117  argv[i] = 0;
118 }
119 
120 int find_arg(int argc, char* argv[], char *arg)
121 {
122  int i;
123  for(i = 0; i < argc; ++i) {
124  if(!argv[i]) continue;
125  if(0==strcmp(argv[i], arg)) {
126  del_arg(argc, argv, i);
127  return 1;
128  }
129  }
130  return 0;
131 }
132 
133 int find_int_arg(int argc, char **argv, char *arg, int def)
134 {
135  int i;
136  for(i = 0; i < argc-1; ++i){
137  if(!argv[i]) continue;
138  if(0==strcmp(argv[i], arg)){
139  def = atoi(argv[i+1]);
140  del_arg(argc, argv, i);
141  del_arg(argc, argv, i);
142  break;
143  }
144  }
145  return def;
146 }
147 
148 float find_float_arg(int argc, char **argv, char *arg, float def)
149 {
150  int i;
151  for(i = 0; i < argc-1; ++i){
152  if(!argv[i]) continue;
153  if(0==strcmp(argv[i], arg)){
154  def = atof(argv[i+1]);
155  del_arg(argc, argv, i);
156  del_arg(argc, argv, i);
157  break;
158  }
159  }
160  return def;
161 }
162 
163 char *find_char_arg(int argc, char **argv, char *arg, char *def)
164 {
165  int i;
166  for(i = 0; i < argc-1; ++i){
167  if(!argv[i]) continue;
168  if(0==strcmp(argv[i], arg)){
169  def = argv[i+1];
170  del_arg(argc, argv, i);
171  del_arg(argc, argv, i);
172  break;
173  }
174  }
175  return def;
176 }
177 
178 
179 char *basecfg(char *cfgfile)
180 {
181  char *c = cfgfile;
182  char *next;
183  while((next = strchr(c, '/')))
184  {
185  c = next+1;
186  }
187  c = copy_string(c);
188  next = strchr(c, '.');
189  if (next) *next = 0;
190  return c;
191 }
192 
193 int alphanum_to_int(char c)
194 {
195  return (c < 58) ? c - 48 : c-87;
196 }
197 char int_to_alphanum(int i)
198 {
199  if (i == 36) return '.';
200  return (i < 10) ? i + 48 : i + 87;
201 }
202 
203 void pm(int M, int N, float *A)
204 {
205  int i,j;
206  for(i =0 ; i < M; ++i){
207  printf("%d ", i+1);
208  for(j = 0; j < N; ++j){
209  printf("%2.4f, ", A[i*N+j]);
210  }
211  printf("\n");
212  }
213  printf("\n");
214 }
215 
216 void find_replace(char *str, char *orig, char *rep, char *output)
217 {
218  char buffer[4096] = {0};
219  char *p;
220 
221  sprintf(buffer, "%s", str);
222  if(!(p = strstr(buffer, orig))){ // Is 'orig' even in 'str'?
223  sprintf(output, "%s", str);
224  return;
225  }
226 
227  *p = '\0';
228 
229  sprintf(output, "%s%s%s", buffer, rep, p+strlen(orig));
230 }
231 
232 float sec(clock_t clocks)
233 {
234  return (float)clocks/CLOCKS_PER_SEC;
235 }
236 
237 void top_k(float *a, int n, int k, int *index)
238 {
239  int i,j;
240  for(j = 0; j < k; ++j) index[j] = -1;
241  for(i = 0; i < n; ++i){
242  int curr = i;
243  for(j = 0; j < k; ++j){
244  if((index[j] < 0) || a[curr] > a[index[j]]){
245  int swap = curr;
246  curr = index[j];
247  index[j] = swap;
248  }
249  }
250  }
251 }
252 
253 void error(const char *s)
254 {
255  perror(s);
256  assert(0);
257  exit(-1);
258 }
259 
260 unsigned char *read_file(char *filename)
261 {
262  FILE *fp = fopen(filename, "rb");
263  size_t size;
264 
265  fseek(fp, 0, SEEK_END);
266  size = ftell(fp);
267  fseek(fp, 0, SEEK_SET);
268 
269  unsigned char *text = calloc(size+1, sizeof(char));
270  fread(text, 1, size, fp);
271  fclose(fp);
272  return text;
273 }
274 
276 {
277  fprintf(stderr, "Malloc error\n");
278  exit(-1);
279 }
280 
281 void file_error(char *s)
282 {
283  fprintf(stderr, "Couldn't open file: %s\n", s);
284  exit(0);
285 }
286 
287 list *split_str(char *s, char delim)
288 {
289  size_t i;
290  size_t len = strlen(s);
291  list *l = make_list();
292  list_insert(l, s);
293  for(i = 0; i < len; ++i){
294  if(s[i] == delim){
295  s[i] = '\0';
296  list_insert(l, &(s[i+1]));
297  }
298  }
299  return l;
300 }
301 
302 void strip(char *s)
303 {
304  size_t i;
305  size_t len = strlen(s);
306  size_t offset = 0;
307  for(i = 0; i < len; ++i){
308  char c = s[i];
309  if(c==' '||c=='\t'||c=='\n') ++offset;
310  else s[i-offset] = c;
311  }
312  s[len-offset] = '\0';
313 }
314 
315 void strip_char(char *s, char bad)
316 {
317  size_t i;
318  size_t len = strlen(s);
319  size_t offset = 0;
320  for(i = 0; i < len; ++i){
321  char c = s[i];
322  if(c==bad) ++offset;
323  else s[i-offset] = c;
324  }
325  s[len-offset] = '\0';
326 }
327 
328 void free_ptrs(void **ptrs, int n)
329 {
330  int i;
331  for(i = 0; i < n; ++i) free(ptrs[i]);
332  free(ptrs);
333 }
334 
335 char *fgetl(FILE *fp)
336 {
337  if(feof(fp)) return 0;
338  size_t size = 512;
339  char *line = malloc(size*sizeof(char));
340  if(!fgets(line, size, fp)){
341  free(line);
342  return 0;
343  }
344 
345  size_t curr = strlen(line);
346 
347  while((line[curr-1] != '\n') && !feof(fp)){
348  if(curr == size-1){
349  size *= 2;
350  line = realloc(line, size*sizeof(char));
351  if(!line) {
352  printf("%ld\n", size);
353  malloc_error();
354  }
355  }
356  size_t readsize = size-curr;
357  if(readsize > INT_MAX) readsize = INT_MAX-1;
358  fgets(&line[curr], readsize, fp);
359  curr = strlen(line);
360  }
361  if(line[curr-1] == '\n') line[curr-1] = '\0';
362 
363  return line;
364 }
365 
366 int read_int(int fd)
367 {
368  int n = 0;
369  int next = read(fd, &n, sizeof(int));
370  if(next <= 0) return -1;
371  return n;
372 }
373 
374 void write_int(int fd, int n)
375 {
376  int next = write(fd, &n, sizeof(int));
377  if(next <= 0) error("read failed");
378 }
379 
380 int read_all_fail(int fd, char *buffer, size_t bytes)
381 {
382  size_t n = 0;
383  while(n < bytes){
384  int next = read(fd, buffer + n, bytes-n);
385  if(next <= 0) return 1;
386  n += next;
387  }
388  return 0;
389 }
390 
391 int write_all_fail(int fd, char *buffer, size_t bytes)
392 {
393  size_t n = 0;
394  while(n < bytes){
395  size_t next = write(fd, buffer + n, bytes-n);
396  if(next <= 0) return 1;
397  n += next;
398  }
399  return 0;
400 }
401 
402 void read_all(int fd, char *buffer, size_t bytes)
403 {
404  size_t n = 0;
405  while(n < bytes){
406  int next = read(fd, buffer + n, bytes-n);
407  if(next <= 0) error("read failed");
408  n += next;
409  }
410 }
411 
412 void write_all(int fd, char *buffer, size_t bytes)
413 {
414  size_t n = 0;
415  while(n < bytes){
416  size_t next = write(fd, buffer + n, bytes-n);
417  if(next <= 0) error("write failed");
418  n += next;
419  }
420 }
421 
422 
423 char *copy_string(char *s)
424 {
425  char *copy = malloc(strlen(s)+1);
426  strncpy(copy, s, strlen(s)+1);
427  return copy;
428 }
429 
430 list *parse_csv_line(char *line)
431 {
432  list *l = make_list();
433  char *c, *p;
434  int in = 0;
435  for(c = line, p = line; *c != '\0'; ++c){
436  if(*c == '"') in = !in;
437  else if(*c == ',' && !in){
438  *c = '\0';
439  list_insert(l, copy_string(p));
440  p = c+1;
441  }
442  }
443  list_insert(l, copy_string(p));
444  return l;
445 }
446 
447 int count_fields(char *line)
448 {
449  int count = 0;
450  int done = 0;
451  char *c;
452  for(c = line; !done; ++c){
453  done = (*c == '\0');
454  if(*c == ',' || done) ++count;
455  }
456  return count;
457 }
458 
459 float *parse_fields(char *line, int n)
460 {
461  float *field = calloc(n, sizeof(float));
462  char *c, *p, *end;
463  int count = 0;
464  int done = 0;
465  for(c = line, p = line; !done; ++c){
466  done = (*c == '\0');
467  if(*c == ',' || done){
468  *c = '\0';
469  field[count] = strtod(p, &end);
470  if(p == c) field[count] = nan("");
471  if(end != c && (end != c-1 || *end != '\r')) field[count] = nan(""); //DOS file formats!
472  p = c+1;
473  ++count;
474  }
475  }
476  return field;
477 }
478 
479 float sum_array(float *a, int n)
480 {
481  int i;
482  float sum = 0;
483  for(i = 0; i < n; ++i) sum += a[i];
484  return sum;
485 }
486 
487 float mean_array(float *a, int n)
488 {
489  return sum_array(a,n)/n;
490 }
491 
492 void mean_arrays(float **a, int n, int els, float *avg)
493 {
494  int i;
495  int j;
496  memset(avg, 0, els*sizeof(float));
497  for(j = 0; j < n; ++j){
498  for(i = 0; i < els; ++i){
499  avg[i] += a[j][i];
500  }
501  }
502  for(i = 0; i < els; ++i){
503  avg[i] /= n;
504  }
505 }
506 
507 void print_statistics(float *a, int n)
508 {
509  float m = mean_array(a, n);
510  float v = variance_array(a, n);
511  printf("MSE: %.6f, Mean: %.6f, Variance: %.6f\n", mse_array(a, n), m, v);
512 }
513 
514 float variance_array(float *a, int n)
515 {
516  int i;
517  float sum = 0;
518  float mean = mean_array(a, n);
519  for(i = 0; i < n; ++i) sum += (a[i] - mean)*(a[i]-mean);
520  float variance = sum/n;
521  return variance;
522 }
523 
524 int constrain_int(int a, int min, int max)
525 {
526  if (a < min) return min;
527  if (a > max) return max;
528  return a;
529 }
530 
531 float constrain(float min, float max, float a)
532 {
533  if (a < min) return min;
534  if (a > max) return max;
535  return a;
536 }
537 
538 float dist_array(float *a, float *b, int n, int sub)
539 {
540  int i;
541  float sum = 0;
542  for(i = 0; i < n; i += sub) sum += pow(a[i]-b[i], 2);
543  return sqrt(sum);
544 }
545 
546 float mse_array(float *a, int n)
547 {
548  int i;
549  float sum = 0;
550  for(i = 0; i < n; ++i) sum += a[i]*a[i];
551  return sqrt(sum/n);
552 }
553 
554 void normalize_array(float *a, int n)
555 {
556  int i;
557  float mu = mean_array(a,n);
558  float sigma = sqrt(variance_array(a,n));
559  for(i = 0; i < n; ++i){
560  a[i] = (a[i] - mu)/sigma;
561  }
562  mu = mean_array(a,n);
563  sigma = sqrt(variance_array(a,n));
564 }
565 
566 void translate_array(float *a, int n, float s)
567 {
568  int i;
569  for(i = 0; i < n; ++i){
570  a[i] += s;
571  }
572 }
573 
574 float mag_array(float *a, int n)
575 {
576  int i;
577  float sum = 0;
578  for(i = 0; i < n; ++i){
579  sum += a[i]*a[i];
580  }
581  return sqrt(sum);
582 }
583 
584 void scale_array(float *a, int n, float s)
585 {
586  int i;
587  for(i = 0; i < n; ++i){
588  a[i] *= s;
589  }
590 }
591 
592 int sample_array(float *a, int n)
593 {
594  float sum = sum_array(a, n);
595  scale_array(a, n, 1./sum);
596  float r = rand_uniform(0, 1);
597  int i;
598  for(i = 0; i < n; ++i){
599  r = r - a[i];
600  if (r <= 0) return i;
601  }
602  return n-1;
603 }
604 
605 int max_int_index(int *a, int n)
606 {
607  if(n <= 0) return -1;
608  int i, max_i = 0;
609  int max = a[0];
610  for(i = 1; i < n; ++i){
611  if(a[i] > max){
612  max = a[i];
613  max_i = i;
614  }
615  }
616  return max_i;
617 }
618 
619 int max_index(float *a, int n)
620 {
621  if(n <= 0) return -1;
622  int i, max_i = 0;
623  float max = a[0];
624  for(i = 1; i < n; ++i){
625  if(a[i] > max){
626  max = a[i];
627  max_i = i;
628  }
629  }
630  return max_i;
631 }
632 
633 int int_index(int *a, int val, int n)
634 {
635  int i;
636  for(i = 0; i < n; ++i){
637  if(a[i] == val) return i;
638  }
639  return -1;
640 }
641 
642 int rand_int(int min, int max)
643 {
644  if (max < min){
645  int s = min;
646  min = max;
647  max = s;
648  }
649  int r = (rand()%(max - min + 1)) + min;
650  return r;
651 }
652 
653 // From http://en.wikipedia.org/wiki/Box%E2%80%93Muller_transform
654 float rand_normal()
655 {
656  static int haveSpare = 0;
657  static double rand1, rand2;
658 
659  if(haveSpare)
660  {
661  haveSpare = 0;
662  return sqrt(rand1) * sin(rand2);
663  }
664 
665  haveSpare = 1;
666 
667  rand1 = rand() / ((double) RAND_MAX);
668  if(rand1 < 1e-100) rand1 = 1e-100;
669  rand1 = -2 * log(rand1);
670  rand2 = (rand() / ((double) RAND_MAX)) * TWO_PI;
671 
672  return sqrt(rand1) * cos(rand2);
673 }
674 
675 /*
676  float rand_normal()
677  {
678  int n = 12;
679  int i;
680  float sum= 0;
681  for(i = 0; i < n; ++i) sum += (float)rand()/RAND_MAX;
682  return sum-n/2.;
683  }
684  */
685 
686 size_t rand_size_t()
687 {
688  return ((size_t)(rand()&0xff) << 56) |
689  ((size_t)(rand()&0xff) << 48) |
690  ((size_t)(rand()&0xff) << 40) |
691  ((size_t)(rand()&0xff) << 32) |
692  ((size_t)(rand()&0xff) << 24) |
693  ((size_t)(rand()&0xff) << 16) |
694  ((size_t)(rand()&0xff) << 8) |
695  ((size_t)(rand()&0xff) << 0);
696 }
697 
698 float rand_uniform(float min, float max)
699 {
700  if(max < min){
701  float swap = min;
702  min = max;
703  max = swap;
704  }
705  return ((float)rand()/RAND_MAX * (max - min)) + min;
706 }
707 
708 float rand_scale(float s)
709 {
710  float scale = rand_uniform(1, s);
711  if(rand()%2) return scale;
712  return 1./scale;
713 }
714 
715 float **one_hot_encode(float *a, int n, int k)
716 {
717  int i;
718  float **t = calloc(n, sizeof(float*));
719  for(i = 0; i < n; ++i){
720  t[i] = calloc(k, sizeof(float));
721  int index = (int)a[i];
722  t[i][index] = 1;
723  }
724  return t;
725 }
726 
int * random_index_order(int min, int max)
Definition: utils.c:97
void write_int(int fd, int n)
Definition: utils.c:374
void list_insert(list *l, void *val)
Definition: list.c:40
float * parse_fields(char *line, int n)
Definition: utils.c:459
char * fgetl(FILE *fp)
Definition: utils.c:335
float constrain(float min, float max, float a)
Definition: utils.c:531
size_t rand_size_t()
Definition: utils.c:686
float rand_scale(float s)
Definition: utils.c:708
void write_all(int fd, char *buffer, size_t bytes)
Definition: utils.c:412
float ** one_hot_encode(float *a, int n, int k)
Definition: utils.c:715
char int_to_alphanum(int i)
Definition: utils.c:197
int int_index(int *a, int val, int n)
Definition: utils.c:633
#define TWO_PI
Definition: utils.h:15
void error(const char *s)
Definition: utils.c:253
int find_int_arg(int argc, char **argv, char *arg, int def)
Definition: utils.c:133
void malloc_error()
Definition: utils.c:275
void find_replace(char *str, char *orig, char *rep, char *output)
Definition: utils.c:216
int read_int(int fd)
Definition: utils.c:366
char * basecfg(char *cfgfile)
Definition: utils.c:179
list * parse_csv_line(char *line)
Definition: utils.c:430
void top_k(float *a, int n, int k, int *index)
Definition: utils.c:237
void file_error(char *s)
Definition: utils.c:281
void print_statistics(float *a, int n)
Definition: utils.c:507
float mean_array(float *a, int n)
Definition: utils.c:487
void mean_arrays(float **a, int n, int els, float *avg)
Definition: utils.c:492
int constrain_int(int a, int min, int max)
Definition: utils.c:524
int alphanum_to_int(char c)
Definition: utils.c:193
float rand_uniform(float min, float max)
Definition: utils.c:698
int sample_array(float *a, int n)
Definition: utils.c:592
int max_int_index(int *a, int n)
Definition: utils.c:605
void sorta_shuffle(void *arr, size_t n, size_t size, size_t sections)
Definition: utils.c:74
float sum_array(float *a, int n)
Definition: utils.c:479
void free_ptrs(void **ptrs, int n)
Definition: utils.c:328
float sec(clock_t clocks)
Definition: utils.c:232
char * find_char_arg(int argc, char **argv, char *arg, char *def)
Definition: utils.c:163
int max_index(float *a, int n)
Definition: utils.c:619
float find_float_arg(int argc, char **argv, char *arg, float def)
Definition: utils.c:148
float dist_array(float *a, float *b, int n, int sub)
Definition: utils.c:538
void shuffle(void *arr, size_t n, size_t size)
Definition: utils.c:85
void translate_array(float *a, int n, float s)
Definition: utils.c:566
void read_all(int fd, char *buffer, size_t bytes)
Definition: utils.c:402
int * read_intlist(char *gpu_list, int *ngpus, int d)
Definition: utils.c:36
void del_arg(int argc, char **argv, int index)
Definition: utils.c:113
Definition: darknet.h:602
void strip_char(char *s, char bad)
Definition: utils.c:315
int read_all_fail(int fd, char *buffer, size_t bytes)
Definition: utils.c:380
void strip(char *s)
Definition: utils.c:302
float rand_normal()
Definition: utils.c:654
void normalize_array(float *a, int n)
Definition: utils.c:554
list * make_list()
Definition: list.c:5
float mse_array(float *a, int n)
Definition: utils.c:546
int find_arg(int argc, char *argv[], char *arg)
Definition: utils.c:120
unsigned char * read_file(char *filename)
Definition: utils.c:260
float mag_array(float *a, int n)
Definition: utils.c:574
int count_fields(char *line)
Definition: utils.c:447
double what_time_is_it_now()
Definition: utils.c:27
list * split_str(char *s, char delim)
Definition: utils.c:287
int write_all_fail(int fd, char *buffer, size_t bytes)
Definition: utils.c:391
int rand_int(int min, int max)
Definition: utils.c:642
void scale_array(float *a, int n, float s)
Definition: utils.c:584
int * read_map(char *filename)
Definition: utils.c:59
float variance_array(float *a, int n)
Definition: utils.c:514
void pm(int M, int N, float *A)
Definition: utils.c:203
char * copy_string(char *s)
Definition: utils.c:423