Commit 8605638d authored by jkvis's avatar jkvis

Debugging implicit suffix tree

parent 267f0c4e
...@@ -380,106 +380,3 @@ int GESA_calculate_lcp(GESA_char_t const* const string, ...@@ -380,106 +380,3 @@ int GESA_calculate_lcp(GESA_char_t const* const string,
return 0; return 0;
} // GESA_calculate_lcp } // GESA_calculate_lcp
#define GESA_STACK_SIZE 2048
typedef struct
{
GESA_index_t data[GESA_STACK_SIZE];
size_t size;
} GESA_STACK;
static void GESA_STACK_init(GESA_STACK* const stack)
{
stack->size = 0;
} // GESA_STACK_init
static GESA_index_t GESA_STACK_top(GESA_STACK const* const stack)
{
if (stack->size == 0)
{
fprintf(stderr, "Error: GESA_STACK_top()\n");
return -1;
} // if
return stack->data[stack->size - 1];
} // GESA_STACK_top
static void GESA_STACK_push(GESA_STACK* const stack, GESA_index_t data)
{
if (stack->size >= GESA_STACK_SIZE)
{
fprintf(stderr, "Error: GESA_STACK_push()\n");
return;
} // if
stack->data[stack->size] = data;
stack->size += 1;
} // GESA_STACK_push
static void GESA_STACK_pop(GESA_STACK* const stack)
{
if (stack->size == 0)
{
fprintf(stderr, "Error: GESA_STACK_pop()\n");
return;
} // if
stack->size -= 1;
} // GESA_STACK_pop
#undef GESA_STACK_SIZE
void GESA_calculate_childtab(GESA const* const gesa,
GESA_index_t* const childtab)
{
GESA_STACK stack;
GESA_STACK_init(&stack);
GESA_index_t last_index = -1;
GESA_STACK_push(&stack, 0);
for (size_t i = 1; i < gesa->total; ++i)
{
while (gesa->lcp[i] < gesa->lcp[GESA_STACK_top(&stack)])
{
last_index = GESA_STACK_top(&stack);
GESA_STACK_pop(&stack);
if (gesa->lcp[i] <= gesa->lcp[GESA_STACK_top(&stack)] &&
gesa->lcp[GESA_STACK_top(&stack)] != gesa->lcp[last_index])
{
childtab[GESA_STACK_top(&stack)] = last_index;
} // if
} // while
if (last_index != -1)
{
childtab[i - 1] = last_index;
last_index = -1;
} // if
GESA_STACK_push(&stack, i);
} // for
GESA_STACK_init(&stack);
GESA_STACK_push(&stack, 0);
for (size_t i = 1; i < gesa->total; ++i)
{
while (gesa->lcp[i] < gesa->lcp[GESA_STACK_top(&stack)])
{
GESA_STACK_pop(&stack);
} // while
if (gesa->lcp[i] == gesa->lcp[GESA_STACK_top(&stack)])
{
childtab[GESA_STACK_top(&stack)] = i;
GESA_STACK_pop(&stack);
} // if
GESA_STACK_push(&stack, i);
} // for
} // GESA_calculate_childtab
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "../include/gesa.h"
#include "utils.h"
int main(int argc, char* argv[])
{
print_test_prolog(argc, argv);
GESA gesa;
//char const* const string = "accttacgacgaccttcca~";
char const* const string = "acaaacatat~";
size_t const length = strlen(string) + 1;
printf("%ld\n", length);
assert(GESA_create(&gesa, (GESA_char_t*) string, length) == 0);
GESA_print(&gesa, stdout);
GESA_index_t* childtab = malloc(length * sizeof(*childtab));
assert(childtab != 0);
GESA_calculate_childtab(&gesa, childtab);
for (size_t i = 0; i < length - 1; ++i)
{
printf("%5ld %5d\n", i, childtab[i]);
} // for
free(childtab);
GESA_destroy(&gesa, GESA_KEEP_STRINGS);
print_test_epilog(EXIT_SUCCESS);
return EXIT_SUCCESS;
} // main
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "../include/gesa.h"
#include "utils.h"
#define GESA_STACK_SIZE 2048
typedef struct
{
GESA_index_t data[GESA_STACK_SIZE];
size_t size;
} GESA_STACK;
static void GESA_STACK_init(GESA_STACK* const stack)
{
stack->size = 0;
} // GESA_STACK_init
static GESA_index_t GESA_STACK_top(GESA_STACK const* const stack)
{
//printf(" top: %d\n", stack->data[stack->size - 1]);
if (stack->size == 0)
{
fprintf(stderr, "Error: GESA_STACK_top()\n");
return -1;
} // if
return stack->data[stack->size - 1];
} // GESA_STACK_top
static void GESA_STACK_push(GESA_STACK* const stack, GESA_index_t data)
{
printf(" push: %d\n", data);
if (stack->size >= GESA_STACK_SIZE)
{
fprintf(stderr, "Error: GESA_STACK_push()\n");
return;
} // if
stack->data[stack->size] = data;
stack->size += 1;
} // GESA_STACK_push
static void GESA_STACK_pop(GESA_STACK* const stack)
{
printf(" pop\n");
if (stack->size == 0)
{
fprintf(stderr, "Error: GESA_STACK_pop()\n");
return;
} // if
stack->size -= 1;
} // GESA_STACK_pop
#undef GESA_STACK_SIZE
void GESA_calculate_childtab(GESA const* const gesa,
GESA_index_t* const childtab)
{
GESA_STACK stack;
GESA_STACK_init(&stack);
GESA_index_t last_index = -1;
GESA_STACK_push(&stack, 0);
for (size_t i = 1; i < gesa->total; ++i)
{
while (gesa->lcp[i] < gesa->lcp[GESA_STACK_top(&stack)])
{
last_index = GESA_STACK_top(&stack);
GESA_STACK_pop(&stack);
if (gesa->lcp[i] <= gesa->lcp[GESA_STACK_top(&stack)] &&
gesa->lcp[GESA_STACK_top(&stack)] != gesa->lcp[last_index])
{
childtab[GESA_STACK_top(&stack)] = last_index;
} // if
} // while
if (last_index != -1)
{
childtab[i - 1] = last_index;
last_index = -1;
} // if
GESA_STACK_push(&stack, i);
} // for
GESA_STACK_init(&stack);
GESA_STACK_push(&stack, 0);
for (size_t i = 1; i < gesa->total; ++i)
{
while (gesa->lcp[i] < gesa->lcp[GESA_STACK_top(&stack)])
{
GESA_STACK_pop(&stack);
} // while
if (gesa->lcp[i] == gesa->lcp[GESA_STACK_top(&stack)])
{
childtab[GESA_STACK_top(&stack)] = i;
GESA_STACK_pop(&stack);
} // if
GESA_STACK_push(&stack, i);
} // for
} // GESA_calculate_childtab
int main(int argc, char* argv[])
{
print_test_prolog(argc, argv);
GESA gesa;
char const* const string = "accttacgacgaccttcca~";
//char const* const string = "acaaacatat~";
size_t const length = strlen(string) + 1;
assert(GESA_create(&gesa, (GESA_char_t*) string, length) == 0);
GESA_print(&gesa, stdout);
GESA_index_t* childtab = malloc(length * sizeof(*childtab));
assert(childtab != 0);
GESA_calculate_childtab(&gesa, childtab);
for (size_t i = 0; i < length - 1; ++i)
{
printf("%5ld %5d\n", i, childtab[i]);
} // for
free(childtab);
GESA_destroy(&gesa, GESA_KEEP_STRINGS);
print_test_epilog(EXIT_SUCCESS);
return EXIT_SUCCESS;
} // main
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment