From d62fae0c04fb695c7237d6ef24c1db616cd5ead4 Mon Sep 17 00:00:00 2001 From: JJSierraM <134967638+JJSierraM@users.noreply.github.com> Date: Mon, 29 May 2023 23:17:07 +0200 Subject: [PATCH] Added C-optimized version of the code --- C-optimized/README.md | 10 + C-optimized/makefile | 52 ++ C-optimized/samples.c | 268 +++++++ C-optimized/samples.exe | Bin 0 -> 166622 bytes C-optimized/samples.txt | 1495 +++++++++++++++++++++++++++++++++++++++ 5 files changed, 1825 insertions(+) create mode 100644 C-optimized/README.md create mode 100644 C-optimized/makefile create mode 100644 C-optimized/samples.c create mode 100644 C-optimized/samples.exe create mode 100644 C-optimized/samples.txt diff --git a/C-optimized/README.md b/C-optimized/README.md new file mode 100644 index 00000000..0847fb41 --- /dev/null +++ b/C-optimized/README.md @@ -0,0 +1,10 @@ +# C-Optimized +An optimized version of the original C implementation.
+The main changes are an optimization of the mixture function (it passes the functions instead of the whole arrays, reducing in great measure the memory usage and the computation time) and the implementation of multi-threading with OpenMP.
+ +The mean time of execution is 6 ms. With the following distribution: +[![Time histogram](https://imgur.com/a/AzjP7P8)] +Take into account that the multi-threading introduces a bit of dispersion in the execution time due to the creation and destruction of threads. +Also, the time data has been collected by executing the interior of the main() function 1000 times in a for loop, not executing the program itself 1000 times.
+ +The hardware used has been an AMD 5800x3D and 16GB of DDR4-3200 MHz. \ No newline at end of file diff --git a/C-optimized/makefile b/C-optimized/makefile new file mode 100644 index 00000000..9a3b62c7 --- /dev/null +++ b/C-optimized/makefile @@ -0,0 +1,52 @@ +# Interface: +# make +# make build +# make format +# make run + +# Compiler +CC=gcc +# CC=tcc # <= faster compilation + +# Main file +SRC=samples.c +OUTPUT=samples + +## Dependencies +# Has no dependencies + +## Flags +DEBUG= #'-g' +STANDARD=-std=c99 +WARNINGS=-Wall +OPTIMIZED=-O3 #-O3 actually gives better performance than -Ofast, at least for this version +OPENMP=-fopenmp + +## Formatter +STYLE_BLUEPRINT=webkit +FORMATTER=clang-format -i -style=$(STYLE_BLUEPRINT) + +## make build +build: $(SRC) + $(CC) $(OPTIMIZED) $(DEBUG) $(OPENMP) $(SRC) -o $(OUTPUT) + +#fast: Has been removed, compilation of "build" is very fast and it outputs optimized code by default + +format: $(SRC) + $(FORMATTER) $(SRC) + +run: $(SRC) $(OUTPUT) +# echo "Increasing stack size limit, because we are dealing with 1M samples" +# # ulimit: increase stack size limit +# # -Ss: the soft limit. If you set the hard limit, you then can't raise it +# # 256000: around 250Mbs, if I'm reading it correctly. +# # Then run the program +# ulimit -Ss 256000 && ./$(OUTPUT) + + + +# Old: +# Link libraries, for good measure +# LD_LIBRARY_PATH=/usr/local/lib +# export LD_LIBRARY_PATH + diff --git a/C-optimized/samples.c b/C-optimized/samples.c new file mode 100644 index 00000000..9b2be9c4 --- /dev/null +++ b/C-optimized/samples.c @@ -0,0 +1,268 @@ +#include +#include +#include +#include +#include + +const float PI = 3.14159265358979323846; + +#define N 1000000 + +//Array helpers + +void array_print(float* array, int length) { + for (int i = 0; i < length; i++) + { + printf("item[%d] = %f\n", i, array[i]); + } + printf("\n"); +} + +void array_fill(float* array, int length, float item) { + int i; + #pragma omp private (i) + { + #pragma omp for + for (i = 0; i < length; i++) + { + array[i] = item; + } + } +} + +float array_sum(float* array, int length) { + float output = 0.0; + for (int i = 0; i < length; i++) + { + output += array[i]; + } + return output; +} + +void array_cumsum(float* array_to_sum, float* array_cumsummed, int length) { + array_cumsummed[0] = array_to_sum[0]; + for (int i = 1; i < length; i++) + { + array_cumsummed[i] = array_cumsummed[i-1] + array_to_sum[i]; + } +} + +float rand_float(float to) { + return ((float)rand()/(float)RAND_MAX) * to; +} + +float ur_normal() { + float u1 = rand_float(1.0); + float u2 = rand_float(1.0); + float z = sqrtf(-2.0 * log(u1)) * sin(2 * PI * u2); + return z; +} + +inline float random_uniform(float from, float to) { + return ((float)rand()/(float)RAND_MAX)*(to-from)+from; +} + +inline float random_normal(float mean, float sigma) { + return (mean + sigma * ur_normal()); +} + +inline float random_lognormal(float logmean, float logsigma) { + return expf(random_normal(logmean, logsigma)); +} + +inline float random_to(float low, float high) { + const float NORMAL95CONFIDENCE = 1.6448536269514722; + float loglow = logf(low); + float loghigh = logf(high); + float logmean = (loglow + loghigh) / 2; + float logsigma = (loghigh - loglow) / (2.0 * NORMAL95CONFIDENCE); + return random_lognormal(logmean, logsigma); +} + +void array_random_to(float* array, int length, float low, float high) { + int i; + #pragma omp private(i) + { + #pragma omp for + for (i = 0; i < length; i++) + { + array[i] = random_to(low, high); + } + } +} + +int split_array_get_my_length(int index, int total_length, int n_threads) { + return (total_length%n_threads > index ? total_length/n_threads+1 : total_length/n_threads); +} + +//Old version, don't use it!! Optimized version is called mixture_f. This one is just for display +void mixture(float* dists[], float* weights, int n_dists, float* results) { + float sum_weights = array_sum(weights, n_dists); + float* normalized_weights = malloc(n_dists * sizeof(float)); + for (int i = 0; i < n_dists; i++) {normalized_weights[i] = weights[i] / sum_weights;} + + float* cummulative_weights = malloc(n_dists * sizeof(float)); + array_cumsum(normalized_weights, cummulative_weights, n_dists); + + //create var holders + float p1, p2; + int index_found, index_counter, sample_index, i; + + #pragma omp parallel private (i, p1, p2, index_found, index_counter, sample_index) + { + #pragma omp for + for (i = 0; i < N; i++) + { + p1 = random_uniform(0, 1); + p2 = random_uniform(0, 1); + + index_found = 0; + index_counter = 0; + + while ((index_found == 0) && (index_counter < n_dists)) + { + if (p1 < cummulative_weights[index_counter]) + { + index_found = 1; + } else + { + index_counter++; + } + } + if (index_found != 0) + { + sample_index = (int) (p2 * N); + results[i] = dists[index_counter][sample_index]; + } + else printf("This shouldn't be able to happen.\n"); + } + } + free(normalized_weights); + free(cummulative_weights); +} + +void mixture_f(float (*samplers[])(void), float* weights, int n_dists, float** results, int n_threads) { + float sum_weights = array_sum(weights, n_dists); + float* normalized_weights = malloc(n_dists * sizeof(float)); + for (int i = 0; i < n_dists; i++) {normalized_weights[i] = weights[i] / sum_weights;} + + float* cummulative_weights = malloc(n_dists * sizeof(float)); + array_cumsum(normalized_weights, cummulative_weights, n_dists); + + //create var holders + float p1; + int sample_index, i, own_length; + + #pragma omp parallel private (i, p1, sample_index, own_length) + { + #pragma omp for + for (i = 0; i < n_threads; i++) + { + own_length = split_array_get_my_length(i, N, n_threads); + for (int j = 0; j < own_length; j++) + { + p1 = random_uniform(0, 1); + for (int k = 0; k < n_dists; k++) + { + if (p1 < cummulative_weights[k]) + { + results[i][j] = samplers[k](); + break; + } + } + } + } + } + free(normalized_weights); + free(cummulative_weights); +} + +float sample_0() { + return 0; +} + +float sample_1() { + return 1; +} + +float sample_few() { + return random_to(1, 3); +} + +float sample_many() { + return random_to(2, 10); +} + +void split_array_allocate(float** meta_array, int length, int divide_into) { + int own_length; + + for (int i = 0; i < divide_into; i++) + { + own_length = split_array_get_my_length(i, length, divide_into); + meta_array[i] = malloc(own_length*sizeof(float)); + } + +} + +void split_array_free(float** meta_array, int divided_into) { + for (int i = 0; i < divided_into; i++) + { + free(meta_array[i]); + } + free(meta_array); +} + +float split_array_sum(float** meta_array, int length, int divided_into) { + int i; + float output; + float* partial_sum = malloc(divided_into*sizeof(float)); + + #pragma omp private(i) shared(partial_sum) + for (int i = 0; i < divided_into; i++) + { + float own_partial_sum = 0; + int own_length = split_array_get_my_length(i, length, divided_into); + for (int j = 0; j < own_length; j++) + { + own_partial_sum += meta_array[i][j]; + } + partial_sum[i] = own_partial_sum; + } + for (int i = 0; i < divided_into; i++) + { + output += partial_sum[i]; + } + return output; +} + +int main() { + clock_t start, end; + start = clock(); + //initialize randomness + srand(time(NULL)); + //Toy example + // Declare variables in play + float p_a, p_b, p_c; + int n_threads = omp_get_max_threads(); + float** dist_mixture = malloc(n_threads*sizeof(float*)); + split_array_allocate(dist_mixture, N, n_threads); + + // Initialize variables + p_a = 0.8; + p_b = 0.5; + p_c = p_a * p_b; + + // Generate mixture + int n_dists = 4; + float weights[] = { 1 - p_c, p_c / 2, p_c / 4, p_c / 4 }; + float (*samplers[])(void) = {sample_0, sample_1, sample_few, sample_many}; + + mixture_f(samplers, weights, n_dists, dist_mixture, n_threads); + // printf("Sum(dist_mixture, N)/N = %f\n", split_array_sum(dist_mixture, N, n_threads) / N); + + end = clock(); + split_array_free(dist_mixture, n_threads); + + printf("Total time (ms): %f\n", ((double) (end-start)) / CLOCKS_PER_SEC * 1000); + return 0; +} \ No newline at end of file diff --git a/C-optimized/samples.exe b/C-optimized/samples.exe new file mode 100644 index 0000000000000000000000000000000000000000..d42d4483257d73793bd7696ecd49085ccb308b21 GIT binary patch literal 166622 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 a6UB{tVa+)tw(EdHw+^t^(gMi{1^)*IBUS1E literal 0 HcmV?d00001 diff --git a/C-optimized/samples.txt b/C-optimized/samples.txt new file mode 100644 index 00000000..f982a63a --- /dev/null +++ b/C-optimized/samples.txt @@ -0,0 +1,1495 @@ +9.000000 +5.000000 +11.000000 +4.000000 +6.000000 +7.000000 +9.000000 +9.000000 +5.000000 +13.000000 +6.000000 +8.000000 +14.000000 +8.000000 +9.000000 +8.000000 +14.000000 +14.000000 +7.000000 +12.000000 +14.000000 +6.000000 +12.000000 +8.000000 +8.000000 +9.000000 +8.000000 +8.000000 +10.000000 +8.000000 +9.000000 +11.000000 +10.000000 +8.000000 +8.000000 +8.000000 +6.000000 +8.000000 +8.000000 +8.000000 +8.000000 +14.000000 +9.000000 +7.000000 +8.000000 +11.000000 +12.000000 +9.000000 +11.000000 +7.000000 +13.000000 +7.000000 +7.000000 +8.000000 +8.000000 +21.000000 +8.000000 +7.000000 +8.000000 +9.000000 +7.000000 +12.000000 +14.000000 +11.000000 +7.000000 +8.000000 +13.000000 +9.000000 +12.000000 +8.000000 +8.000000 +13.000000 +10.000000 +9.000000 +9.000000 +13.000000 +7.000000 +8.000000 +9.000000 +8.000000 +8.000000 +8.000000 +8.000000 +6.000000 +8.000000 +8.000000 +9.000000 +8.000000 +8.000000 +8.000000 +7.000000 +7.000000 +8.000000 +8.000000 +6.000000 +7.000000 +5.000000 +5.000000 +6.000000 +5.000000 +5.000000 +6.000000 +5.000000 +5.000000 +7.000000 +5.000000 +7.000000 +7.000000 +7.000000 +6.000000 +6.000000 +4.000000 +7.000000 +5.000000 +5.000000 +6.000000 +5.000000 +5.000000 +6.000000 +6.000000 +5.000000 +6.000000 +5.000000 +5.000000 +6.000000 +5.000000 +5.000000 +6.000000 +5.000000 +5.000000 +6.000000 +5.000000 +5.000000 +5.000000 +5.000000 +5.000000 +5.000000 +6.000000 +8.000000 +6.000000 +5.000000 +5.000000 +5.000000 +5.000000 +5.000000 +5.000000 +6.000000 +5.000000 +5.000000 +6.000000 +5.000000 +5.000000 +6.000000 +5.000000 +5.000000 +6.000000 +5.000000 +5.000000 +6.000000 +5.000000 +5.000000 +6.000000 +5.000000 +5.000000 +6.000000 +5.000000 +5.000000 +5.000000 +5.000000 +5.000000 +5.000000 +5.000000 +5.000000 +5.000000 +6.000000 +5.000000 +5.000000 +5.000000 +5.000000 +5.000000 +5.000000 +6.000000 +5.000000 +5.000000 +5.000000 +4.000000 +5.000000 +6.000000 +8.000000 +5.000000 +8.000000 +6.000000 +6.000000 +5.000000 +5.000000 +5.000000 +5.000000 +5.000000 +5.000000 +6.000000 +5.000000 +5.000000 +6.000000 +5.000000 +8.000000 +9.000000 +6.000000 +6.000000 +6.000000 +7.000000 +8.000000 +8.000000 +7.000000 +8.000000 +8.000000 +9.000000 +8.000000 +9.000000 +9.000000 +8.000000 +8.000000 +7.000000 +8.000000 +8.000000 +7.000000 +8.000000 +6.000000 +5.000000 +7.000000 +8.000000 +8.000000 +7.000000 +6.000000 +6.000000 +8.000000 +8.000000 +8.000000 +8.000000 +8.000000 +8.000000 +8.000000 +8.000000 +8.000000 +8.000000 +8.000000 +8.000000 +8.000000 +9.000000 +9.000000 +8.000000 +8.000000 +9.000000 +7.000000 +8.000000 +5.000000 +7.000000 +8.000000 +8.000000 +7.000000 +4.000000 +4.000000 +7.000000 +5.000000 +5.000000 +6.000000 +8.000000 +6.000000 +5.000000 +5.000000 +7.000000 +8.000000 +9.000000 +8.000000 +8.000000 +5.000000 +5.000000 +7.000000 +5.000000 +5.000000 +6.000000 +5.000000 +5.000000 +6.000000 +5.000000 +6.000000 +6.000000 +5.000000 +5.000000 +5.000000 +5.000000 +5.000000 +6.000000 +5.000000 +5.000000 +8.000000 +8.000000 +7.000000 +5.000000 +7.000000 +5.000000 +8.000000 +6.000000 +6.000000 +5.000000 +6.000000 +5.000000 +5.000000 +6.000000 +5.000000 +5.000000 +5.000000 +5.000000 +5.000000 +5.000000 +6.000000 +5.000000 +5.000000 +5.000000 +5.000000 +5.000000 +6.000000 +5.000000 +5.000000 +5.000000 +5.000000 +5.000000 +5.000000 +5.000000 +5.000000 +5.000000 +5.000000 +6.000000 +5.000000 +5.000000 +5.000000 +5.000000 +6.000000 +5.000000 +5.000000 +6.000000 +5.000000 +5.000000 +5.000000 +6.000000 +5.000000 +5.000000 +6.000000 +5.000000 +5.000000 +6.000000 +5.000000 +5.000000 +5.000000 +5.000000 +5.000000 +5.000000 +4.000000 +4.000000 +6.000000 +5.000000 +5.000000 +6.000000 +5.000000 +4.000000 +5.000000 +9.000000 +5.000000 +5.000000 +5.000000 +5.000000 +6.000000 +5.000000 +5.000000 +6.000000 +6.000000 +7.000000 +7.000000 +5.000000 +5.000000 +5.000000 +4.000000 +6.000000 +5.000000 +5.000000 +6.000000 +5.000000 +5.000000 +5.000000 +5.000000 +5.000000 +9.000000 +8.000000 +6.000000 +6.000000 +5.000000 +5.000000 +6.000000 +5.000000 +6.000000 +6.000000 +5.000000 +5.000000 +6.000000 +5.000000 +5.000000 +6.000000 +5.000000 +5.000000 +5.000000 +5.000000 +5.000000 +5.000000 +7.000000 +5.000000 +6.000000 +5.000000 +5.000000 +5.000000 +5.000000 +5.000000 +5.000000 +6.000000 +5.000000 +6.000000 +5.000000 +5.000000 +5.000000 +6.000000 +5.000000 +5.000000 +5.000000 +5.000000 +5.000000 +5.000000 +5.000000 +5.000000 +5.000000 +5.000000 +6.000000 +5.000000 +5.000000 +5.000000 +5.000000 +6.000000 +5.000000 +5.000000 +5.000000 +6.000000 +5.000000 +5.000000 +5.000000 +5.000000 +5.000000 +5.000000 +5.000000 +5.000000 +5.000000 +6.000000 +5.000000 +5.000000 +5.000000 +5.000000 +6.000000 +5.000000 +4.000000 +5.000000 +8.000000 +6.000000 +8.000000 +8.000000 +8.000000 +8.000000 +7.000000 +7.000000 +7.000000 +8.000000 +8.000000 +8.000000 +9.000000 +8.000000 +9.000000 +8.000000 +8.000000 +7.000000 +7.000000 +7.000000 +8.000000 +8.000000 +8.000000 +7.000000 +7.000000 +6.000000 +5.000000 +5.000000 +5.000000 +13.000000 +10.000000 +7.000000 +4.000000 +7.000000 +5.000000 +4.000000 +7.000000 +4.000000 +4.000000 +8.000000 +4.000000 +5.000000 +7.000000 +5.000000 +4.000000 +6.000000 +5.000000 +4.000000 +6.000000 +4.000000 +4.000000 +4.000000 +7.000000 +7.000000 +8.000000 +7.000000 +4.000000 +7.000000 +5.000000 +7.000000 +5.000000 +4.000000 +4.000000 +6.000000 +6.000000 +9.000000 +4.000000 +5.000000 +7.000000 +4.000000 +5.000000 +7.000000 +5.000000 +7.000000 +8.000000 +8.000000 +8.000000 +7.000000 +7.000000 +5.000000 +7.000000 +7.000000 +7.000000 +7.000000 +7.000000 +7.000000 +7.000000 +7.000000 +8.000000 +7.000000 +7.000000 +4.000000 +6.000000 +7.000000 +7.000000 +7.000000 +8.000000 +8.000000 +7.000000 +6.000000 +6.000000 +4.000000 +6.000000 +6.000000 +5.000000 +4.000000 +4.000000 +7.000000 +4.000000 +5.000000 +6.000000 +5.000000 +4.000000 +7.000000 +7.000000 +4.000000 +7.000000 +4.000000 +4.000000 +7.000000 +4.000000 +5.000000 +7.000000 +4.000000 +4.000000 +7.000000 +4.000000 +4.000000 +4.000000 +6.000000 +5.000000 +5.000000 +9.000000 +4.000000 +8.000000 +4.000000 +4.000000 +8.000000 +5.000000 +5.000000 +7.000000 +4.000000 +4.000000 +7.000000 +4.000000 +4.000000 +5.000000 +6.000000 +4.000000 +5.000000 +7.000000 +4.000000 +4.000000 +5.000000 +7.000000 +4.000000 +4.000000 +8.000000 +4.000000 +4.000000 +7.000000 +4.000000 +5.000000 +6.000000 +4.000000 +4.000000 +4.000000 +6.000000 +4.000000 +5.000000 +6.000000 +5.000000 +4.000000 +7.000000 +4.000000 +5.000000 +6.000000 +5.000000 +4.000000 +4.000000 +7.000000 +4.000000 +4.000000 +8.000000 +5.000000 +5.000000 +6.000000 +5.000000 +4.000000 +7.000000 +4.000000 +4.000000 +4.000000 +7.000000 +4.000000 +8.000000 +5.000000 +4.000000 +4.000000 +6.000000 +5.000000 +6.000000 +7.000000 +4.000000 +4.000000 +7.000000 +4.000000 +4.000000 +7.000000 +4.000000 +4.000000 +8.000000 +7.000000 +5.000000 +6.000000 +6.000000 +8.000000 +5.000000 +7.000000 +5.000000 +5.000000 +4.000000 +6.000000 +5.000000 +4.000000 +7.000000 +5.000000 +4.000000 +4.000000 +7.000000 +4.000000 +4.000000 +7.000000 +4.000000 +4.000000 +8.000000 +4.000000 +4.000000 +5.000000 +7.000000 +7.000000 +8.000000 +5.000000 +4.000000 +7.000000 +5.000000 +5.000000 +8.000000 +4.000000 +4.000000 +7.000000 +5.000000 +4.000000 +7.000000 +4.000000 +5.000000 +4.000000 +6.000000 +4.000000 +5.000000 +8.000000 +7.000000 +8.000000 +8.000000 +7.000000 +8.000000 +8.000000 +7.000000 +7.000000 +7.000000 +7.000000 +7.000000 +8.000000 +8.000000 +7.000000 +8.000000 +6.000000 +5.000000 +4.000000 +6.000000 +4.000000 +4.000000 +7.000000 +5.000000 +4.000000 +7.000000 +4.000000 +4.000000 +7.000000 +7.000000 +4.000000 +7.000000 +5.000000 +4.000000 +7.000000 +4.000000 +5.000000 +8.000000 +7.000000 +8.000000 +4.000000 +6.000000 +4.000000 +7.000000 +4.000000 +4.000000 +7.000000 +5.000000 +5.000000 +6.000000 +6.000000 +8.000000 +4.000000 +4.000000 +8.000000 +4.000000 +4.000000 +8.000000 +4.000000 +4.000000 +8.000000 +4.000000 +4.000000 +7.000000 +8.000000 +4.000000 +7.000000 +4.000000 +4.000000 +5.000000 +6.000000 +5.000000 +4.000000 +7.000000 +7.000000 +5.000000 +6.000000 +5.000000 +4.000000 +7.000000 +4.000000 +4.000000 +7.000000 +4.000000 +8.000000 +8.000000 +7.000000 +7.000000 +7.000000 +7.000000 +8.000000 +7.000000 +6.000000 +4.000000 +5.000000 +7.000000 +4.000000 +5.000000 +7.000000 +5.000000 +5.000000 +6.000000 +4.000000 +5.000000 +8.000000 +4.000000 +9.000000 +4.000000 +4.000000 +7.000000 +5.000000 +4.000000 +7.000000 +6.000000 +4.000000 +7.000000 +4.000000 +4.000000 +4.000000 +7.000000 +4.000000 +4.000000 +5.000000 +6.000000 +4.000000 +4.000000 +7.000000 +4.000000 +4.000000 +8.000000 +6.000000 +4.000000 +7.000000 +4.000000 +5.000000 +7.000000 +4.000000 +4.000000 +7.000000 +4.000000 +5.000000 +4.000000 +7.000000 +4.000000 +4.000000 +7.000000 +4.000000 +5.000000 +7.000000 +4.000000 +4.000000 +5.000000 +6.000000 +4.000000 +4.000000 +6.000000 +5.000000 +5.000000 +7.000000 +7.000000 +5.000000 +6.000000 +4.000000 +4.000000 +6.000000 +5.000000 +6.000000 +8.000000 +7.000000 +7.000000 +5.000000 +4.000000 +7.000000 +4.000000 +4.000000 +8.000000 +4.000000 +5.000000 +8.000000 +4.000000 +4.000000 +5.000000 +6.000000 +4.000000 +5.000000 +6.000000 +5.000000 +4.000000 +7.000000 +7.000000 +7.000000 +7.000000 +7.000000 +7.000000 +7.000000 +7.000000 +7.000000 +8.000000 +8.000000 +8.000000 +6.000000 +8.000000 +5.000000 +8.000000 +7.000000 +7.000000 +8.000000 +8.000000 +6.000000 +8.000000 +8.000000 +6.000000 +4.000000 +4.000000 +8.000000 +7.000000 +8.000000 +5.000000 +4.000000 +8.000000 +4.000000 +4.000000 +8.000000 +5.000000 +4.000000 +9.000000 +4.000000 +4.000000 +8.000000 +5.000000 +5.000000 +9.000000 +5.000000 +4.000000 +8.000000 +4.000000 +5.000000 +7.000000 +5.000000 +4.000000 +8.000000 +4.000000 +4.000000 +7.000000 +4.000000 +4.000000 +11.000000 +4.000000 +8.000000 +5.000000 +4.000000 +9.000000 +4.000000 +4.000000 +10.000000 +6.000000 +11.000000 +4.000000 +9.000000 +4.000000 +10.000000 +4.000000 +4.000000 +11.000000 +4.000000 +5.000000 +8.000000 +4.000000 +4.000000 +9.000000 +6.000000 +4.000000 +8.000000 +5.000000 +4.000000 +8.000000 +4.000000 +4.000000 +8.000000 +5.000000 +4.000000 +8.000000 +4.000000 +5.000000 +8.000000 +4.000000 +4.000000 +8.000000 +5.000000 +4.000000 +8.000000 +4.000000 +4.000000 +8.000000 +4.000000 +4.000000 +7.000000 +7.000000 +8.000000 +5.000000 +4.000000 +8.000000 +4.000000 +4.000000 +7.000000 +4.000000 +4.000000 +7.000000 +4.000000 +4.000000 +4.000000 +8.000000 +4.000000 +5.000000 +6.000000 +4.000000 +4.000000 +7.000000 +4.000000 +5.000000 +8.000000 +4.000000 +4.000000 +8.000000 +4.000000 +4.000000 +8.000000 +7.000000 +7.000000 +4.000000 +5.000000 +8.000000 +4.000000 +9.000000 +4.000000 +4.000000 +9.000000 +4.000000 +4.000000 +8.000000 +4.000000 +4.000000 +10.000000 +8.000000 +8.000000 +5.000000 +5.000000 +8.000000 +4.000000 +5.000000 +7.000000 +4.000000 +6.000000 +8.000000 +7.000000 +8.000000 +7.000000 +7.000000 +7.000000 +10.000000 +7.000000 +8.000000 +7.000000 +10.000000 +7.000000 +9.000000 +7.000000 +6.000000 +6.000000 +4.000000 +4.000000 +6.000000 +5.000000 +4.000000 +6.000000 +5.000000 +4.000000 +4.000000 +7.000000 +4.000000 +5.000000 +6.000000 +5.000000 +5.000000 +7.000000 +4.000000 +5.000000 +6.000000 +4.000000 +4.000000 +4.000000 +6.000000 +4.000000 +5.000000 +6.000000 +4.000000 +4.000000 +4.000000 +6.000000 +10.000000 +6.000000 +5.000000 +6.000000 +6.000000 +4.000000 +6.000000 +6.000000 +5.000000 +6.000000 +6.000000 +4.000000 +4.000000 +7.000000 +4.000000 +4.000000 +4.000000 +7.000000 +4.000000 +4.000000 +7.000000 +4.000000 +4.000000 +7.000000 +4.000000 +4.000000 +4.000000 +6.000000 +4.000000 +4.000000 +6.000000 +5.000000 +4.000000 +5.000000 +6.000000 +4.000000 +4.000000 +7.000000 +4.000000 +4.000000 +7.000000 +4.000000 +4.000000 +4.000000 +6.000000 +4.000000 +5.000000 +6.000000 +4.000000 +5.000000 +5.000000 +6.000000 +7.000000 +8.000000 +8.000000 +7.000000 +8.000000 +7.000000 +7.000000 +7.000000 +7.000000 +9.000000 +7.000000 +4.000000 +4.000000 +6.000000 +5.000000 +4.000000 +4.000000 +6.000000 +4.000000 +4.000000 +6.000000 +4.000000 +4.000000 +4.000000 +6.000000 +5.000000 +4.000000 +7.000000 +7.000000 +8.000000 +4.000000 +4.000000 +7.000000 +5.000000 +4.000000 +6.000000 +6.000000 +4.000000 +6.000000 +6.000000 +4.000000 +4.000000 +7.000000 +4.000000 +4.000000 +6.000000 +4.000000 +4.000000 +4.000000 +6.000000 +4.000000 +5.000000 +6.000000 +5.000000 +5.000000 +7.000000 +5.000000 +5.000000 +7.000000 +4.000000 +4.000000 +4.000000 +6.000000 +4.000000 +4.000000 +7.000000 +6.000000 +5.000000 +6.000000 +5.000000 +4.000000 +6.000000 +4.000000 +4.000000 +5.000000 +6.000000 +6.000000 +4.000000 +6.000000 +4.000000 +4.000000 +7.000000 +4.000000 +4.000000 +4.000000 +6.000000 +8.000000 +8.000000 +5.000000 +4.000000 +6.000000 +4.000000 +4.000000 +4.000000 +7.000000 +4.000000 +4.000000 +6.000000 +5.000000 +6.000000 +6.000000 +4.000000 +4.000000 +4.000000 +5.000000 +5.000000 +7.000000 +8.000000 +7.000000 +7.000000 +7.000000 +8.000000 +7.000000 +8.000000 +7.000000 +9.000000 +8.000000 +6.000000 +8.000000 +8.000000 +8.000000 +8.000000 +7.000000 +7.000000 +7.000000 +6.000000 +8.000000 +7.000000 +7.000000 +8.000000 +4.000000 +7.000000 +8.000000 +7.000000 +7.000000 +7.000000 +8.000000 +7.000000 +8.000000 +7.000000 +7.000000 +7.000000 +7.000000 +7.000000 +5.000000 +7.000000 +5.000000 +5.000000 +4.000000 +4.000000 +4.000000 +5.000000 +4.000000 +8.000000 +8.000000 +8.000000 +7.000000 +6.000000 +4.000000 +7.000000 +6.000000 +4.000000 +6.000000 +6.000000 +4.000000 +7.000000 +6.000000 +6.000000 +4.000000 +6.000000 +5.000000 +4.000000 +6.000000 +5.000000 +4.000000 +4.000000 +6.000000 +5.000000 +4.000000 +6.000000 +6.000000 +7.000000 +6.000000 +5.000000 +6.000000 +6.000000 +4.000000 +6.000000 +6.000000 +4.000000 +6.000000 +5.000000 +5.000000 +4.000000 +7.000000 +4.000000 +4.000000 +4.000000 +6.000000 +4.000000 +4.000000 +6.000000 +5.000000 +4.000000 +4.000000 +6.000000 +4.000000 +4.000000 +6.000000 +5.000000 +4.000000 +4.000000 +6.000000 +4.000000 +4.000000 +7.000000 +4.000000 +5.000000 +4.000000 +6.000000 +4.000000 +5.000000 +7.000000 +5.000000 +6.000000 +6.000000 +4.000000 +4.000000 +7.000000 +7.000000 +4.000000 +6.000000 +4.000000 +7.000000 +7.000000 +4.000000 +4.000000 +6.000000 +5.000000 +4.000000 +4.000000 +6.000000 +4.000000 +5.000000 +6.000000 +4.000000 +6.000000 +6.000000 +4.000000 +4.000000 +4.000000 +6.000000 +4.000000 +5.000000 +6.000000 +4.000000 +7.000000 +6.000000 +4.000000 +5.000000 +4.000000 +8.000000 +6.000000 +6.000000 +4.000000 +7.000000 +6.000000 +5.000000 +6.000000 +5.000000 +4.000000 +6.000000 +6.000000 +4.000000 +4.000000 +4.000000 +8.000000 +7.000000 +7.000000 +5.000000 +4.000000 +4.000000 +7.000000 +4.000000 +4.000000 +6.000000 +5.000000 +5.000000 +6.000000 +4.000000 +4.000000 +4.000000 +6.000000 +4.000000 +4.000000 +7.000000 +4.000000 +5.000000 +7.000000 +5.000000 +4.000000 +4.000000 +6.000000 +4.000000 +8.000000 +5.000000 +4.000000 +4.000000 +6.000000 +4.000000 +4.000000 +4.000000 +6.000000 +4.000000 +4.000000 +6.000000 +4.000000 +4.000000