Algorithm-MarkovChain-GHash
view release on metacpan or search on metacpan
_c_destroy (obj)
SV *obj
CODE:
{
IM* im = (IM*) SvIV(phash_value(SvRV(obj), "_cstuff"));
g_hash_table_foreach(im->dictionary, free_key, NULL);
g_hash_table_foreach(im->chains, free_chain, NULL);
g_hash_table_destroy(im->dictionary);
g_hash_table_destroy(im->chains);
g_free(im);
}
void
increment_seen(obj, stub, original_next)
SV* obj;
char *stub;
char *original_next;
CODE:
{
IM* im = (IM*) SvIV(phash_value(SvRV(obj), "_cstuff"));
chain_t* stubs = g_hash_table_lookup(im->chains, stub);
int count;
char* next = g_hash_table_lookup(im->dictionary, original_next);
/* printf("increment_seen: '%s' '%s'\n", stub, original_next); */
if (!next) {
next = g_strdup(original_next);
g_hash_table_insert(im->dictionary, next, next);
}
if (!stubs) {
char* sep = SvPV_nolen(phash_value(SvRV(obj), "seperator"));
char* s;
int len = 1;
for (s = stub; s = strstr(s, sep); s += strlen(sep)) len++;
if (len > im->longest) {
im->longest = len;
}
stubs = g_malloc(sizeof(chain_t));
stubs->states = g_hash_table_new(g_str_hash, g_str_equal);
stubs->count = 0;
g_hash_table_insert(im->chains, g_strdup(stub), stubs);
}
stubs->count++;
count = (int) g_hash_table_lookup(stubs->states, next);
count++;
g_hash_table_insert(stubs->states, next, (void *) count);
}
void
get_options (obj, stub)
SV *obj;
char *stub;
PPCODE:
{
IM* im = (IM*) SvIV(phash_value(SvRV(obj), "_cstuff"));
chain_t* stubs = g_hash_table_lookup(im->chains, stub);
char **keys = NULL;
int nkeys, i;
if ( (!stubs) || (!(nkeys = g_hash_table_size(stubs->states))) ) {
return;
}
keys = g_malloc(nkeys * sizeof(char *));
keys[0] = (char*) nkeys;
g_hash_table_foreach(stubs->states, get_keys, keys);
for (i = 0; i < nkeys; i++) {
int count = (int) g_hash_table_lookup(stubs->states, keys[i]);
XPUSHs(sv_2mortal(newSVpv(keys[i], 0)));
XPUSHs(sv_2mortal(newSVnv(count / stubs->count)));
}
g_free(keys);
}
int
longest_sequence (obj)
SV* obj;
CODE:
IM* im = (IM*) SvIV(phash_value(SvRV(obj), "_cstuff"));
RETVAL = im->longest;
OUTPUT:
RETVAL
int
sequence_known (obj, stub)
SV* obj;
char *stub;
CODE:
IM* im = (IM*) SvIV(phash_value(SvRV(obj), "_cstuff"));
RETVAL = (int) g_hash_table_lookup(im->chains, stub);
OUTPUT:
RETVAL
char*
random_sequence (obj)
SV *obj;
CODE:
IM* im = (IM*) SvIV(phash_value(SvRV(obj), "_cstuff"));
int nkeys = g_hash_table_size(im->chains);
char **keys = g_malloc(nkeys * sizeof(char *));
keys[0] = (char*) nkeys;
g_hash_table_foreach(im->chains, get_keys, keys);
nkeys = (1.0 * nkeys * rand()) / (1.0*RAND_MAX);
RETVAL = keys[nkeys];
g_free(keys);
OUTPUT:
( run in 0.939 second using v1.01-cache-2.11-cpan-71847e10f99 )