ref: fc1b813cf4527bc7f5c3eb237f5162f421b9677b
parent: c64df196242d1bc7a9095ef2407079d510171bf5
author: eli <eli@singularity>
date: Sun Sep 21 03:47:58 EDT 2025
better bsearch, matches bad manual page ☺
--- a/llama2.c
+++ b/llama2.c
@@ -805,26 +805,31 @@
print("%s", piece);}
-TokenIndex *bsearch_call(TokenIndex *tok, TokenIndex *list, int n, int s, int (*comp)(const void *a, const void *b), int A, int B) {+void *bsearch(void *key, void *base, int num, int size, int (*comp)(void *a, void *b)) {+ int A = 0;
+ int B = num;
int middle = A + ((B - A) / 2);
- int result = comp(tok, &list[middle]);
+ int result;
- if (result == 0)
- return &list[middle];
-
if (A == B || A == middle)
return nil;
- if (result > 0)
- return bsearch_call(tok, list, n, s, comp, middle, B);
+ do {+ result = comp(key, (void*)((uchar*)base + (middle * size)));
- return bsearch_call(tok, list, n, s, comp, A, middle);
-}
+ if (result > 0)
+ A = middle;
+ else if (result < 0)
+ B = middle;
+ else
+ return (void*)((uchar*)base + (middle * size));
-void *bsearch(TokenIndex *tok, TokenIndex *list, int n, int s, int (*comp)(const void *a, const void *b)) {- return bsearch_call(tok, list, n, s, comp, 0, n);
-}
+ middle = A + ((B - A) / 2);
+ } while(A != B && A != middle);
+
+ return nil;
+}
int str_lookup(char *str, TokenIndex *sorted_vocab, int vocab_size) {// efficiently find the perfect match for str in vocab, return its index or -1 if not found
--
⑨