summaryrefslogtreecommitdiffstats
path: root/worker.c
diff options
context:
space:
mode:
Diffstat (limited to 'worker.c')
-rw-r--r--worker.c89
1 files changed, 82 insertions, 7 deletions
diff --git a/worker.c b/worker.c
index c6698d9..08be9bd 100644
--- a/worker.c
+++ b/worker.c
@@ -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();
}