refactor out sort functions

This commit is contained in:
antonl 2026-03-24 12:13:05 +01:00
parent d670d018b7
commit 8b1dedbed6
5 changed files with 88 additions and 68 deletions

View File

@ -2,3 +2,4 @@
#include "base_memory.c" #include "base_memory.c"
#include "base_strings.c" #include "base_strings.c"
#include "base_thread_context.c" #include "base_thread_context.c"
#include "base_sort.c"

View File

@ -7,5 +7,6 @@
#include "base_memory.h" #include "base_memory.h"
#include "base_strings.h" #include "base_strings.h"
#include "base_thread_context.h" #include "base_thread_context.h"
#include "base_sort.h"
#endif //BASE_H #endif //BASE_H

60
src/base/base_sort.c Normal file
View File

@ -0,0 +1,60 @@
U64 qsort_partition_F64(SortPair_F64 *array, U64 size, U64 low, U64 high) {
F64 pivot = array[high].value;
U64 i = low - 1;
SortPair_F64 temp = {0};
for (U64 j = low; j < high; j++) {
if (array[j].value <= pivot) {
i += 1;
temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
U64 final_pivot_pos = i + 1;
temp = array[final_pivot_pos];
array[final_pivot_pos] = array[high];
array[high] = temp;
return final_pivot_pos;
}
function void qsort_F64(SortPair_F64 *array, U64 size, U64 low, U64 high) {
if (low < high) {
U64 pivot_index = qsort_partition_F64(array, size, low, high);
qsort_F64(array, size, low, pivot_index - 1);
qsort_F64(array, size, pivot_index + 1, high);
}
}
function void sort_and_get_indices_F64(F64 *array, U64 *indices, U64 size) {
SortPair_F64 *pairs = malloc(size * sizeof(SortPair_F64));
for (U64 i = 0; i < size; i++) {
pairs[i].value = array[i];
pairs[i].original_index = i;
}
qsort_F64(pairs, size, 0, size - 1);
for (U32 i = 0; i < size; i++) {
array[i] = pairs[i].value;
indices[i] = pairs[i].original_index;
}
free(pairs);
}
function void sort_by_indices_F64(F64 *array, U64 *indices, U64 size) {
F64 *temp = malloc(size * sizeof(F64));
for (U64 i = 0; i < size; i++) {
U64 original_index = indices[i];
temp[i] = array[original_index];
}
for (U64 i = 0; i < size; i++) {
array[i] = temp[i];
}
free(temp);
}

15
src/base/base_sort.h Normal file
View File

@ -0,0 +1,15 @@
#ifndef BASE_SORT_H
#define BASE_SORT_H
typedef struct SortPair_F64 SortPair_F64;
struct SortPair_F64 {
F64 value;
U64 original_index;
};
function U64 qsort_partition_F64(SortPair_F64 *array, U64 size, U64 low, U64 high);
function void qsort_F64(SortPair_F64 *array, U64 size, U64 low, U64 high);
function void sort_and_get_indices_F64(F64 *array, U64 *indices, U64 size);
function void sort_by_indices_F64(F64 *array, U64 *indices, U64 size);
#endif //BASE_SORT_H

View File

@ -1,4 +1,4 @@
// --- //----
// Header includes // Header includes
#include "base/base_inc.h" #include "base/base_inc.h"
#include "os/os_inc.h" #include "os/os_inc.h"
@ -7,7 +7,7 @@
#include "hf/file_io.h" #include "hf/file_io.h"
#include "hf/hf_base.h" #include "hf/hf_base.h"
// --- //----
// .C includes // .C includes
#include "base/base_inc.c" #include "base/base_inc.c"
#include "os/os_entry_point.c" #include "os/os_entry_point.c"
@ -20,6 +20,9 @@
// TODO make this a separate module that can be compiled instead // TODO make this a separate module that can be compiled instead
// #include "hf/tests.c" // #include "hf/tests.c"
//////
//~
typedef struct Eigensolution_F64 Eigensolution_F64; typedef struct Eigensolution_F64 Eigensolution_F64;
struct Eigensolution_F64 { struct Eigensolution_F64 {
F64 *eigenvalues_re; F64 *eigenvalues_re;
@ -42,77 +45,14 @@ struct Atom {
Orbital *orbitals; Orbital *orbitals;
}; };
typedef struct SortPair_F64 SortPair_F64;
struct SortPair_F64 {
F64 value;
U64 original_index;
};
global Arena *g_base_arena = 0; global Arena *g_base_arena = 0;
global Arena *g_filename_arena = 0; global Arena *g_filename_arena = 0;
#define NUM_ANGULAR_MOMENTA 3 #define NUM_ANGULAR_MOMENTA 3
global F64 angular_momenta[NUM_ANGULAR_MOMENTA] = {0.0, 1.0, 2.0}; global F64 angular_momenta[NUM_ANGULAR_MOMENTA] = {0.0, 1.0, 2.0};
global F64 *temp_wavefunction_F64; global F64 *temp_wavefunction_F64;
U64 qsort_partition_F64(SortPair_F64 *array, U64 size, U64 low, U64 high) { //////
F64 pivot = array[high].value; //~
U64 i = low - 1;
SortPair_F64 temp = {0};
for (U64 j = low; j < high; j++) {
if (array[j].value <= pivot) {
i += 1;
temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
U64 final_pivot_pos = i + 1;
temp = array[final_pivot_pos];
array[final_pivot_pos] = array[high];
array[high] = temp;
return final_pivot_pos;
}
function void qsort_F64(SortPair_F64 *array, U64 size, U64 low, U64 high) {
if (low < high) {
U64 pivot_index = qsort_partition_F64(array, size, low, high);
qsort_F64(array, size, low, pivot_index - 1);
qsort_F64(array, size, pivot_index + 1, high);
}
}
function void sort_and_get_indices_F64(F64 *array, U64 *indices, U64 size) {
SortPair_F64 *pairs = malloc(size * sizeof(SortPair_F64));
for (U64 i = 0; i < size; i++) {
pairs[i].value = array[i];
pairs[i].original_index = i;
}
qsort_F64(pairs, size, 0, size - 1);
for (U32 i = 0; i < size; i++) {
array[i] = pairs[i].value;
indices[i] = pairs[i].original_index;
}
free(pairs);
}
function void sort_by_indices_F64(F64 *array, U64 *indices, U64 size) {
F64 *temp = malloc(size * sizeof(F64));
for (U64 i = 0; i < size; i++) {
U64 original_index = indices[i];
temp[i] = array[original_index];
}
for (U64 i = 0; i < size; i++) {
array[i] = temp[i];
}
free(temp);
}
/* Auxiliary routine: printing a matrix */ /* Auxiliary routine: printing a matrix */
function void print_eigenvalues(char *desc, int n, F64 *wr, F64 *wi) { function void print_eigenvalues(char *desc, int n, F64 *wr, F64 *wi) {
@ -267,6 +207,9 @@ function void compute_wf_norm_F64(F64 *coeffs, U64 coeff_size, U64 n, U64 l) {
scratch_release(scratch); scratch_release(scratch);
} }
/////////////////
//~
// Main entry point
function void EntryPoint(void) { function void EntryPoint(void) {
OS_InitReceipt os_receipt = OS_init(); OS_InitReceipt os_receipt = OS_init();