Algorithm-HyperLogLog

 view release on metacpan or  search on metacpan

typemap  view on Meta::CPAN

HLL	T_PTROBJ_HLL
uint32_t	T_UV

################################################################
INPUT

T_PTROBJ_HLL
	$var = GET_HLLPTR($arg); 

OUTPUT

T_PTROBJ_HLL
	sv_setref_pv($arg, klass, (void*)$var);

xs/hyperloglog.xs  view on Meta::CPAN


PROTOTYPES: DISABLE

# Constructor
HLL
new(const char *klass, uint32_t k)
CODE:
{
    RETVAL = initialize_hll(aTHX_ k);
}
OUTPUT:
    RETVAL

# Constructor(From dumped data)
HLL
_new_from_dump(const char *klass, uint32_t k, AV* data)
PREINIT:
uint32_t i;
uint32_t len = 0;
CODE:
{
    RETVAL = initialize_hll(aTHX_ k);
    len = av_len(data);
    for(i = 0;i <= len;++i){
        RETVAL->registers[i] = (uint8_t)SvUV(*av_fetch(data, i, 0));
    }
}
OUTPUT:
    RETVAL

# dump registers
AV*
_dump_register(HLL self)
CODE:
{
    RETVAL = (AV*)sv_2mortal((SV*)newAV());
    uint32_t i;
    for(i = 0;i < self->m; i++){
        av_push(RETVAL, newSVuv(self->registers[i]));
    }
}
OUTPUT:
    RETVAL

# Return number of registers.
uint32_t
register_size(HLL self)
CODE:
    RETVAL = self->m;
OUTPUT:
    RETVAL

# Add element to the estimator
void
add(HLL self, ...)
PREINIT:
    uint32_t hash;
    uint32_t index;
    uint8_t rank;
    I32 arg_index;

xs/hyperloglog.xs  view on Meta::CPAN

        }
        if( zeros != 0 ) {
            estimate = m * log((double)m/zeros);
        }
    } else if (estimate > (1.0/30.0) * two_32) {
        estimate = neg_two_32 * log(1.0 - ( estimate/two_32 ) );
    }

    RETVAL = estimate;
}
OUTPUT:
    RETVAL


# Merge two HLLs
double
merge(HLL self, HLL other)
CODE:
{
    uint32_t m = self->m;
    uint32_t i = 0;

xs/hyperloglog.xs  view on Meta::CPAN

        croak("hll size mismatch: %d != %d\n", m, other->m);
    }

    for (i = 0; i < m; i++) {
        if (self->registers[i] < other->registers[i]) {
            self->registers[i] = other->registers[i];
        }
    }
    XSRETURN_UNDEF;
}
OUTPUT:
    RETVAL

# Destructor
void
DESTROY(HLL self)
CODE:
{
    Safefree(self->registers);
    Safefree (self);
}



( run in 0.532 second using v1.01-cache-2.11-cpan-4e96b696675 )