diff options
Diffstat (limited to 'worker.c')
-rw-r--r-- | worker.c | 89 |
1 files changed, 82 insertions, 7 deletions
@@ -1,16 +1,91 @@ #include "./lib/worker.h" +#include "lib/common.h" +#include "math.h" -void func(const char* task, size_t task_size, char** resp, size_t* resp_size) { - printf("HERE %*s\n", (int) task_size, task); +const long double RUNGE_SIMPSON_CONST = 1.0L / 15; - task = task; +typedef long double (*func_value_t)(long double); + +typedef struct func_t { + func_value_t value; + func_value_t derivative; + int id; +} func_t; + +long double func_value(long double x) { + return x * x * x * x * x * x - 15 * x * x * x * x * x + 134567 * x * x * x - 3486 * x * x + 100; +} + +long double func_der(long double x) { return 6 * x * x * x * x * x - 75 * x * x * x * x + 403701 * x * x - 6972 * x; } + +long double func_value_x(long double x) { return x; } +long double func_der_x(long double x) { + x = x; + return 1; +} + +func_t func = {func_value, func_der, 1}; +// func_t func = {func_value_x, func_der_x, 1}; + +long double calculate_integral(func_t f, long double a, long double b, long double eps) { + int n = 2; + long double delta = (b - a) / n, x = 0; + + // integral value = (sum_by_1 + 2 * sum_by_2 + 4 * sum_by_4) * delta / 3 + long double sum_by_1 = 0, sum_by_2 = 0, sum_by_4 = 0; + + sum_by_1 += f.value(a); + sum_by_1 += f.value(b); + + x = a + delta; + for (int i = 1; i < n; i += 2) { + sum_by_4 += f.value(x); + x += 2 * delta; + } + + x = a + 2 * delta; + for (int i = 2; i < n; i += 2) { + sum_by_2 += f.value(x); + x += 2 * delta; + } + + long double prev_sum = (sum_by_1 + 2 * sum_by_2 + 4 * sum_by_4) * delta / 3; + long double sum = prev_sum; + + do { + prev_sum = sum; + sum_by_2 += sum_by_4; + sum_by_4 = 0; + + n *= 2; + delta = (b - a) / n; + + x = a + delta; + for (int i = 1; i < n; i += 2) { + sum_by_4 += f.value(x); + x += 2 * delta; + } + + sum = (sum_by_1 + 2 * sum_by_2 + 4 * sum_by_4) * delta / 3; + } while ((fabsl(prev_sum - sum) - eps / RUNGE_SIMPSON_CONST) > 0); + + return sum; +} + +void worker_func(const char* task, size_t task_size, char** resp, size_t* resp_size) { + long double* args = (long double*) task; task_size = task_size; - *resp = malloc(10); - *resp_size = 10; - sleep(1); + + long double res = calculate_integral(func, args[0], args[1], args[2]); + printf("task %Lf %Lf -> %Lf\n", args[0], args[1], res); + + *resp = calloc(1, sizeof(long double)); + *((long double*) *resp) = res; + *resp_size = sizeof(long double); } int32_t main() { - worker_init("127.0.0.1", "33554", 2, func); + worker_init("127.0.0.1", "33554", 2, worker_func); + configure_timeout(10); worker_exec(); } |