From ecadf1e9a20812971b830f6cc2e5de2653f6b8a9 Mon Sep 17 00:00:00 2001
From: retoor <retoor@molodetz.nl>
Date: Fri, 28 Mar 2025 21:38:50 +0100
Subject: [PATCH] Progress.

---
 Makefile  |  13 +++++++++++--
 malloc.c  |   1 +
 malloc.h  |  33 +++++++++++++++++++++++++++++++++
 r.h       |  15 ++++++++++++++-
 rpylib.so | Bin 80928 -> 80928 bytes
 5 files changed, 59 insertions(+), 3 deletions(-)
 create mode 100644 malloc.c
 create mode 100644 malloc.h

diff --git a/Makefile b/Makefile
index 15fdd1e..15a7c3c 100644
--- a/Makefile
+++ b/Makefile
@@ -1,4 +1,4 @@
-all: build build_free build_rpylib run_free
+all: build build_rd build_free build_rpylib run_rd
 
 # Variables for compiler and flags
 CC = gcc
@@ -13,6 +13,12 @@ build_free:
 	$(CC) -DOLLAMA main.c $(CFLAGS) -o rf
 	publish rf
 
+build_rd:
+	$(CC) -DRD main.c $(CFLAGS) -o rd
+	publish rd
+
+
+
 build_rpylib:
 	$(CC) -shared -o rpylib.so -fPIC rpylib.c -lpython3.12 `python3-config --includes` -I/usr/include/CL -ljson-c -lcurl -lsqlite3
 	publish rpylib.so
@@ -21,4 +27,7 @@ run:
 	./r --verbose
 
 run_free:
-	./rf --verbose
+	./rf --verbose 
+
+run_rd:
+	./rd --verbose 
diff --git a/malloc.c b/malloc.c
new file mode 100644
index 0000000..b391183
--- /dev/null
+++ b/malloc.c
@@ -0,0 +1 @@
+#include "malloc.h"
diff --git a/malloc.h b/malloc.h
new file mode 100644
index 0000000..20fef36
--- /dev/null
+++ b/malloc.h
@@ -0,0 +1,33 @@
+#ifndef R_MALLOC
+#define R_MALLOC
+#include <malloc.h>
+
+long long int r_malloc_alloc_count = 0;
+long long int r_malloc_alloc_total = 0;
+
+void *r_malloc(size_t size) {
+  r_malloc_alloc_count++;
+  r_malloc_alloc_total++;
+
+  return malloc(size);
+}
+
+void r_free(void *ptr) {
+  r_malloc_alloc_count--;
+
+  free(ptr);
+}
+
+void r_malloc_stats() {
+  fprintf(stderr, "r_malloc_alloc_count: %lld\n", r_malloc_alloc_count);
+  fprintf(stderr, "r_malloc_alloc_total: %lld\n", r_malloc_alloc_total);
+  fprintf(stderr, "r_malloc_freed_total: %lld\n",
+          r_malloc_alloc_total - r_malloc_alloc_count);
+}
+
+#define malloc(x) r_malloc(x)
+#define free(x) r_free(x)
+
+#include <stdio.h>
+
+#endif
diff --git a/r.h b/r.h
index 477bc79..0c2d7cc 100644
--- a/r.h
+++ b/r.h
@@ -7,13 +7,26 @@
 #include <string.h>
 bool is_verbose = false;
 
+#ifndef RD
 #ifndef OLLAMA
 char *models_api_url = "https://api.openai.com/v1/models";
 // char *completions_api_url = "https://ollama.molodetz.nl/v1/chat/completions";
 char *completions_api_url = "https://api.openai.com/v1/chat/completions";
 char *advanced_model = "gpt-4o-mini";
 char *fast_model = "gpt-3.5-turbo";
-#else
+#endif 
+#endif
+
+#ifdef RD
+
+char *models_api_url = "https://api.openai.com/v1/models";
+char *completions_api_url = "https://api.deepinfra.com/v1/openai/chat/completions";
+//char *advanced_model = "meta-llama/Meta-Llama-3.1-8B-Instruct";
+char *advanced_model = "google/gemini-1.5-flash";
+char *fast_model = "Qwen/Qwen2.5-Coder-32B-Instruct";
+
+#endif
+#ifdef OLLAMA
 char *models_api_url = "https://ollama.molodetz.nl/v1/models";
 char *completions_api_url = "https://ollama.molodetz.nl/v1/chat/completions";
 char *advanced_model = "qwen2.5:3b";
diff --git a/rpylib.so b/rpylib.so
index 0bb3a3aa9aa8865391c0ccbe26d7f7c63e3b0a26..3478a9de3d6f5ab38b8be6bc2a183079e9be999d 100755
GIT binary patch
delta 11581
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
J*pc0p{|C~n;&lK3

delta 12535
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
Ls<=Z3c3by<aIhzz