| | |
| | | #include <stdlib.h> |
| | | #include <string.h> |
| | | #include <math.h> |
| | | #include <unistd.h> |
| | | #include <assert.h> |
| | | #include <float.h> |
| | | #include <limits.h> |
| | | |
| | | #ifdef WIN32 |
| | | #include "unistd.h" |
| | | #include "gettimeofday.h" |
| | | #else |
| | | #include <unistd.h> |
| | | #include <sys/time.h> |
| | | #endif |
| | | #include "utils.h" |
| | | |
| | | #pragma warning(disable: 4996) |
| | | |
| | | double what_time_is_it_now() |
| | | { |
| | | struct timeval time; |
| | | if (gettimeofday(&time, NULL)) { |
| | | return 0; |
| | | } |
| | | return (double)time.tv_sec + (double)time.tv_usec * .000001; |
| | | } |
| | | |
| | | int *read_map(char *filename) |
| | | { |
| | | int n = 0; |
| | | int *map = 0; |
| | | char *str; |
| | | FILE *file = fopen(filename, "r"); |
| | | if(!file) file_error(filename); |
| | | while((str=fgetl(file))){ |
| | | ++n; |
| | | map = realloc(map, n*sizeof(int)); |
| | | map[n-1] = atoi(str); |
| | | } |
| | | return map; |
| | | } |
| | | |
| | | void sorta_shuffle(void *arr, size_t n, size_t size, size_t sections) |
| | | { |
| | | size_t i; |
| | |
| | | size_t start = n*i/sections; |
| | | size_t end = n*(i+1)/sections; |
| | | size_t num = end-start; |
| | | shuffle(arr+(start*size), num, size); |
| | | shuffle((char*)arr+(start*size), num, size); |
| | | } |
| | | } |
| | | |
| | |
| | | void *swp = calloc(1, size); |
| | | for(i = 0; i < n-1; ++i){ |
| | | size_t j = i + rand()/(RAND_MAX / (n-i)+1); |
| | | memcpy(swp, arr+(j*size), size); |
| | | memcpy(arr+(j*size), arr+(i*size), size); |
| | | memcpy(arr+(i*size), swp, size); |
| | | memcpy(swp, (char*)arr+(j*size), size); |
| | | memcpy((char*)arr+(j*size), (char*)arr+(i*size), size); |
| | | memcpy((char*)arr+(i*size), swp, size); |
| | | } |
| | | } |
| | | |
| | |
| | | { |
| | | c = next+1; |
| | | } |
| | | if(!next) while ((next = strchr(c, '\\'))) { c = next + 1; } |
| | | c = copy_string(c); |
| | | next = strchr(c, '.'); |
| | | if (next) *next = 0; |
| | |
| | | printf("\n"); |
| | | } |
| | | |
| | | char *find_replace(char *str, char *orig, char *rep) |
| | | void find_replace(char *str, char *orig, char *rep, char *output) |
| | | { |
| | | static char buffer[4096]; |
| | | char buffer[4096] = {0}; |
| | | char *p; |
| | | |
| | | if(!(p = strstr(str, orig))) // Is 'orig' even in 'str'? |
| | | return str; |
| | | sprintf(buffer, "%s", str); |
| | | if(!(p = strstr(buffer, orig))){ // Is 'orig' even in 'str'? |
| | | sprintf(output, "%s", str); |
| | | return; |
| | | } |
| | | |
| | | strncpy(buffer, str, p-str); // Copy characters from 'str' start to 'orig' st$ |
| | | buffer[p-str] = '\0'; |
| | | *p = '\0'; |
| | | |
| | | sprintf(buffer+(p-str), "%s%s", rep, p+strlen(orig)); |
| | | sprintf(output, "%s%s%s", buffer, rep, p+strlen(orig)); |
| | | } |
| | | |
| | | return buffer; |
| | | void replace_image_to_label(char *input_path, char *output_path) { |
| | | find_replace(input_path, "images", "labels", output_path); |
| | | find_replace(output_path, "JPEGImages", "labels", output_path); |
| | | find_replace(output_path, ".jpg", ".txt", output_path); |
| | | find_replace(output_path, ".JPG", ".txt", output_path); |
| | | find_replace(output_path, ".jpeg", ".txt", output_path); |
| | | find_replace(output_path, ".JPEG", ".txt", output_path); |
| | | find_replace(output_path, ".png", ".txt", output_path); |
| | | find_replace(output_path, ".PNG", ".txt", output_path); |
| | | find_replace(output_path, ".bmp", ".txt", output_path); |
| | | find_replace(output_path, ".BMP", ".txt", output_path); |
| | | find_replace(output_path, ".ppm", ".txt", output_path); |
| | | find_replace(output_path, ".PPM", ".txt", output_path); |
| | | } |
| | | |
| | | float sec(clock_t clocks) |
| | |
| | | void error(const char *s) |
| | | { |
| | | perror(s); |
| | | exit(0); |
| | | assert(0); |
| | | exit(EXIT_FAILURE); |
| | | } |
| | | |
| | | void malloc_error() |
| | | { |
| | | fprintf(stderr, "Malloc error\n"); |
| | | exit(-1); |
| | | exit(EXIT_FAILURE); |
| | | } |
| | | |
| | | void file_error(char *s) |
| | | { |
| | | fprintf(stderr, "Couldn't open file: %s\n", s); |
| | | exit(0); |
| | | exit(EXIT_FAILURE); |
| | | } |
| | | |
| | | list *split_str(char *s, char delim) |
| | |
| | | size_t offset = 0; |
| | | for(i = 0; i < len; ++i){ |
| | | char c = s[i]; |
| | | if(c==' '||c=='\t'||c=='\n') ++offset; |
| | | if(c==' '||c=='\t'||c=='\n'||c =='\r') ++offset; |
| | | else s[i-offset] = c; |
| | | } |
| | | s[len-offset] = '\0'; |
| | |
| | | fgets(&line[curr], readsize, fp); |
| | | curr = strlen(line); |
| | | } |
| | | if(line[curr-1] == '\n') line[curr-1] = '\0'; |
| | | if(curr >= 2) |
| | | if(line[curr-2] == 0x0d) line[curr-2] = 0x00; |
| | | |
| | | if(curr >= 1) |
| | | if(line[curr-1] == 0x0a) line[curr-1] = 0x00; |
| | | |
| | | return line; |
| | | } |
| | | |
| | | int read_int(int fd) |
| | | { |
| | | int n = 0; |
| | | int next = read(fd, &n, sizeof(int)); |
| | | if(next <= 0) return -1; |
| | | return n; |
| | | } |
| | | |
| | | void write_int(int fd, int n) |
| | | { |
| | | int next = write(fd, &n, sizeof(int)); |
| | | if(next <= 0) error("read failed"); |
| | | } |
| | | |
| | | int read_all_fail(int fd, char *buffer, size_t bytes) |
| | | { |
| | | size_t n = 0; |
| | | while(n < bytes){ |
| | | int next = read(fd, buffer + n, bytes-n); |
| | | if(next <= 0) return 1; |
| | | n += next; |
| | | } |
| | | return 0; |
| | | } |
| | | |
| | | int write_all_fail(int fd, char *buffer, size_t bytes) |
| | | { |
| | | size_t n = 0; |
| | | while(n < bytes){ |
| | | size_t next = write(fd, buffer + n, bytes-n); |
| | | if(next <= 0) return 1; |
| | | n += next; |
| | | } |
| | | return 0; |
| | | } |
| | | |
| | | void read_all(int fd, char *buffer, size_t bytes) |
| | | { |
| | | size_t n = 0; |
| | |
| | | } |
| | | } |
| | | |
| | | void print_statistics(float *a, int n) |
| | | { |
| | | float m = mean_array(a, n); |
| | | float v = variance_array(a, n); |
| | | printf("MSE: %.6f, Mean: %.6f, Variance: %.6f\n", mse_array(a, n), m, v); |
| | | } |
| | | |
| | | float variance_array(float *a, int n) |
| | | { |
| | | int i; |
| | |
| | | return variance; |
| | | } |
| | | |
| | | int constrain_int(int a, int min, int max) |
| | | { |
| | | if (a < min) return min; |
| | | if (a > max) return max; |
| | | return a; |
| | | } |
| | | |
| | | float constrain(float min, float max, float a) |
| | | { |
| | | if (a < min) return min; |
| | |
| | | return a; |
| | | } |
| | | |
| | | float dist_array(float *a, float *b, int n, int sub) |
| | | { |
| | | int i; |
| | | float sum = 0; |
| | | for(i = 0; i < n; i += sub) sum += pow(a[i]-b[i], 2); |
| | | return sqrt(sum); |
| | | } |
| | | |
| | | float mse_array(float *a, int n) |
| | | { |
| | | int i; |
| | |
| | | } |
| | | } |
| | | |
| | | int sample_array(float *a, int n) |
| | | { |
| | | float sum = sum_array(a, n); |
| | | scale_array(a, n, 1./sum); |
| | | float r = rand_uniform(0, 1); |
| | | int i; |
| | | for(i = 0; i < n; ++i){ |
| | | r = r - a[i]; |
| | | if (r <= 0) return i; |
| | | } |
| | | return n-1; |
| | | } |
| | | |
| | | int max_index(float *a, int n) |
| | | { |
| | | if(n <= 0) return -1; |
| | |
| | | return max_i; |
| | | } |
| | | |
| | | int int_index(int *a, int val, int n) |
| | | { |
| | | int i; |
| | | for (i = 0; i < n; ++i) { |
| | | if (a[i] == val) return i; |
| | | } |
| | | return -1; |
| | | } |
| | | |
| | | int rand_int(int min, int max) |
| | | { |
| | | if (max < min){ |
| | | int s = min; |
| | | min = max; |
| | | max = s; |
| | | } |
| | | int r = (rand()%(max - min + 1)) + min; |
| | | return r; |
| | | } |
| | | |
| | | // From http://en.wikipedia.org/wiki/Box%E2%80%93Muller_transform |
| | | #define TWO_PI 6.2831853071795864769252866 |
| | | float rand_normal() |
| | | { |
| | | static int haveSpare = 0; |
| | |
| | | } |
| | | */ |
| | | |
| | | size_t rand_size_t() |
| | | { |
| | | return ((size_t)(rand()&0xff) << 56) | |
| | | ((size_t)(rand()&0xff) << 48) | |
| | | ((size_t)(rand()&0xff) << 40) | |
| | | ((size_t)(rand()&0xff) << 32) | |
| | | ((size_t)(rand()&0xff) << 24) | |
| | | ((size_t)(rand()&0xff) << 16) | |
| | | ((size_t)(rand()&0xff) << 8) | |
| | | ((size_t)(rand()&0xff) << 0); |
| | | } |
| | | |
| | | float rand_uniform(float min, float max) |
| | | { |
| | | if(max < min){ |
| | | float swap = min; |
| | | min = max; |
| | | max = swap; |
| | | } |
| | | return ((float)rand()/RAND_MAX * (max - min)) + min; |
| | | //return (random_float() * (max - min)) + min; |
| | | } |
| | | |
| | | float rand_scale(float s) |
| | | { |
| | | float scale = rand_uniform_strong(1, s); |
| | | if(random_gen()%2) return scale; |
| | | return 1./scale; |
| | | } |
| | | |
| | | float **one_hot_encode(float *a, int n, int k) |
| | |
| | | return t; |
| | | } |
| | | |
| | | unsigned int random_gen() |
| | | { |
| | | unsigned int rnd = 0; |
| | | #ifdef WIN32 |
| | | rand_s(&rnd); |
| | | #else |
| | | rnd = rand(); |
| | | #endif |
| | | return rnd; |
| | | } |
| | | |
| | | float random_float() |
| | | { |
| | | #ifdef WIN32 |
| | | return ((float)random_gen() / (float)UINT_MAX); |
| | | #else |
| | | return ((float)random_gen() / (float)RAND_MAX); |
| | | #endif |
| | | } |
| | | |
| | | float rand_uniform_strong(float min, float max) |
| | | { |
| | | if (max < min) { |
| | | float swap = min; |
| | | min = max; |
| | | max = swap; |
| | | } |
| | | return (random_float() * (max - min)) + min; |
| | | } |