NAME
Image::Leptonica::Func::dnabasic
VERSION
version 0.04
dnabasic.c
dnabasic.c
Dna creation, destruction, copy, clone, etc.
L_DNA *l_dnaCreate()
L_DNA *l_dnaCreateFromIArray()
L_DNA *l_dnaCreateFromDArray()
L_DNA *l_dnaMakeSequence()
void *l_dnaDestroy()
L_DNA *l_dnaCopy()
L_DNA *l_dnaClone()
l_int32 l_dnaEmpty()
Dna: add/remove number and extend array
l_int32 l_dnaAddNumber()
static l_int32 l_dnaExtendArray()
l_int32 l_dnaInsertNumber()
l_int32 l_dnaRemoveNumber()
l_int32 l_dnaReplaceNumber()
Dna accessors
l_int32 l_dnaGetCount()
l_int32 l_dnaSetCount()
l_int32 l_dnaGetIValue()
l_int32 l_dnaGetDValue()
l_int32 l_dnaSetValue()
l_int32 l_dnaShiftValue()
l_int32 *l_dnaGetIArray()
l_float64 *l_dnaGetDArray()
l_int32 l_dnaGetRefcount()
l_int32 l_dnaChangeRefcount()
l_int32 l_dnaGetParameters()
l_int32 l_dnaSetParameters()
l_int32 l_dnaCopyParameters()
Serialize Dna for I/O
L_DNA *l_dnaRead()
L_DNA *l_dnaReadStream()
l_int32 l_dnaWrite()
l_int32 l_dnaWriteStream()
Dnaa creation, destruction
L_DNAA *l_dnaaCreate()
void *l_dnaaDestroy()
Add Dna to Dnaa
l_int32 l_dnaaAddDna()
l_int32 l_dnaaExtendArray()
Dnaa accessors
l_int32 l_dnaaGetCount()
l_int32 l_dnaaGetDnaCount()
l_int32 l_dnaaGetNumberCount()
L_DNA *l_dnaaGetDna()
L_DNA *l_dnaaReplaceDna()
l_int32 l_dnaaGetValue()
l_int32 l_dnaaAddNumber()
Serialize Dnaa for I/O
L_DNAA *l_dnaaRead()
L_DNAA *l_dnaaReadStream()
l_int32 l_dnaaWrite()
l_int32 l_dnaaWriteStream()
Other Dna functions
L_DNA *l_dnaMakeDelta()
NUMA *l_dnaConvertToNuma()
L_DNA *numaConvertToDna()
l_int32 *l_dnaJoin()
(1) The Dna is a struct holding an array of doubles. It can also
be used to store l_int32 values, up to the full precision
of int32. Use it whenever integers larger than a few million
need to be stored.
(2) Always use the accessors in this file, never the fields directly.
(3) Storing and retrieving numbers:
* to append a new number to the array, use l_dnaAddNumber(). If
the number is an int, it will will automatically be converted
to l_float64 and stored.
* to reset a value stored in the array, use l_dnaSetValue().
* to increment or decrement a value stored in the array,
use l_dnaShiftValue().
* to obtain a value from the array, use either l_dnaGetIValue()
or l_dnaGetDValue(), depending on whether you are retrieving
an integer or a float. This avoids doing an explicit cast,
such as
(a) return a l_float64 and cast it to an l_int32
(b) cast the return directly to (l_float64 *) to
satisfy the function prototype, as in
l_dnaGetDValue(da, index, (l_float64 *)&ival); [ugly!]
(4) int <--> double conversions:
Conversions go automatically from l_int32 --> l_float64,
without loss of precision. You must cast (l_int32)
to go from l_float64 --> l_int32 because you're truncating
to the integer value.
(5) As with other arrays in leptonica, the l_dna has both an allocated
size and a count of the stored numbers. When you add a number, it
goes on the end of the array, and causes a realloc if the array
is already filled. However, in situations where you want to
add numbers randomly into an array, such as when you build a
histogram, you must set the count of stored numbers in advance.
This is done with l_dnaSetCount(). If you set a count larger
than the allocated array, it does a realloc to the size requested.
(6) In situations where the data in a l_dna correspond to a function
y(x), the values can be either at equal spacings in x or at
arbitrary spacings. For the former, we can represent all x values
by two parameters: startx (corresponding to y[0]) and delx
for the change in x for adjacent values y[i] and y[i+1].
startx and delx are initialized to 0.0 and 1.0, rsp.
For arbitrary spacings, we use a second l_dna, and the two
l_dnas are typically denoted dnay and dnax.
FUNCTIONS
l_dnaAddNumber
l_int32 l_dnaAddNumber ( L_DNA *da, l_float64 val )
l_dnaAddNumber()
Input: da
val (float or int to be added; stored as a float)
Return: 0 if OK, 1 on error
l_dnaChangeRefcount
l_int32 l_dnaChangeRefcount ( L_DNA *da, l_int32 delta )
l_dnaChangeRefcount()
Input: da
delta (change to be applied)
Return: 0 if OK, 1 on error
l_dnaClone
L_DNA * l_dnaClone ( L_DNA *da )
l_dnaClone()
Input: da
Return: ptr to same l_dna, or null on error
l_dnaConvertToNuma
NUMA * l_dnaConvertToNuma ( L_DNA *da )
l_dnaConvertToNuma()
Input: da
Return: na, or null on error
l_dnaCopy
L_DNA * l_dnaCopy ( L_DNA *da )
l_dnaCopy()
Input: da
Return: copy of l_dna, or null on error
l_dnaCopyParameters
l_int32 l_dnaCopyParameters ( L_DNA *dad, L_DNA *das )
l_dnaCopyParameters()
Input: dad (destination DNuma)
das (source DNuma)
Return: 0 if OK, 1 on error
l_dnaCreate
L_DNA * l_dnaCreate ( l_int32 n )
l_dnaCreate()
Input: size of number array to be alloc'd (0 for default)
Return: da, or null on error
l_dnaCreateFromDArray
L_DNA * l_dnaCreateFromDArray ( l_float64 *darray, l_int32 size, l_int32 copyflag )
l_dnaCreateFromDArray()
Input: da (float)
size (of the array)
copyflag (L_INSERT or L_COPY)
Return: da, or null on error
Notes:
(1) With L_INSERT, ownership of the input array is transferred
to the returned l_dna, and all @size elements are considered
to be valid.
l_dnaCreateFromIArray
L_DNA * l_dnaCreateFromIArray ( l_int32 *iarray, l_int32 size )
l_dnaCreateFromIArray()
Input: iarray (integer)
size (of the array)
Return: da, or null on error
Notes:
(1) We can't insert this int array into the l_dna, because a l_dna
takes a double array. So this just copies the data from the
input array into the l_dna. The input array continues to be
owned by the caller.
l_dnaDestroy
void l_dnaDestroy ( L_DNA **pda )
l_dnaDestroy()
Input: &da (<to be nulled if it exists>)
Return: void
Notes:
(1) Decrements the ref count and, if 0, destroys the l_dna.
(2) Always nulls the input ptr.
l_dnaEmpty
l_int32 l_dnaEmpty ( L_DNA *da )
l_dnaEmpty()
Input: da
Return: 0 if OK; 1 on error
Notes:
(1) This does not change the allocation of the array.
It just clears the number of stored numbers, so that
the array appears to be empty.
l_dnaGetCount
l_int32 l_dnaGetCount ( L_DNA *da )
l_dnaGetCount()
Input: da
Return: count, or 0 if no numbers or on error
l_dnaGetDArray
l_float64 * l_dnaGetDArray ( L_DNA *da, l_int32 copyflag )
l_dnaGetDArray()
Input: da
copyflag (L_NOCOPY or L_COPY)
Return: either the bare internal array or a copy of it,
or null on error
Notes:
(1) If copyflag == L_COPY, it makes a copy which the caller
is responsible for freeing. Otherwise, it operates
directly on the bare array of the l_dna.
(2) Very important: for L_NOCOPY, any writes to the array
will be in the l_dna. Do not write beyond the size of
the count field, because it will not be accessable
from the l_dna! If necessary, be sure to set the count
field to a larger number (such as the alloc size)
BEFORE calling this function. Creating with l_dnaMakeConstant()
is another way to insure full initialization.
l_dnaGetDValue
l_int32 l_dnaGetDValue ( L_DNA *da, l_int32 index, l_float64 *pval )
l_dnaGetDValue()
Input: da
index (into l_dna)
&val (<return> double value; 0.0 on error)
Return: 0 if OK; 1 on error
Notes:
(1) Caller may need to check the function return value to
decide if a 0.0 in the returned ival is valid.
l_dnaGetIArray
l_int32 * l_dnaGetIArray ( L_DNA *da )
l_dnaGetIArray()
Input: da
Return: a copy of the bare internal array, integerized
by rounding, or null on error
Notes:
(1) A copy of the array is made, because we need to
generate an integer array from the bare double array.
The caller is responsible for freeing the array.
(2) The array size is determined by the number of stored numbers,
not by the size of the allocated array in the l_dna.
(3) This function is provided to simplify calculations
using the bare internal array, rather than continually
calling accessors on the l_dna. It is typically used
on an array of size 256.
l_dnaGetIValue
l_int32 l_dnaGetIValue ( L_DNA *da, l_int32 index, l_int32 *pival )
l_dnaGetIValue()
Input: da
index (into l_dna)
&ival (<return> integer value; 0 on error)
Return: 0 if OK; 1 on error
Notes:
(1) Caller may need to check the function return value to
decide if a 0 in the returned ival is valid.
l_dnaGetParameters
l_int32 l_dnaGetParameters ( L_DNA *da, l_float64 *pstartx, l_float64 *pdelx )
l_dnaGetParameters()
Input: da
&startx (<optional return> startx)
&delx (<optional return> delx)
Return: 0 if OK, 1 on error
l_dnaGetRefcount
l_int32 l_dnaGetRefcount ( L_DNA *da )
l_dnaGetRefcount()
Input: da
Return: refcount, or UNDEF on error
l_dnaInsertNumber
l_int32 l_dnaInsertNumber ( L_DNA *da, l_int32 index, l_float64 val )
l_dnaInsertNumber()
Input: da
index (location in da to insert new value)
val (float64 or integer to be added)
Return: 0 if OK, 1 on error
Notes:
(1) This shifts da[i] --> da[i + 1] for all i >= index,
and then inserts val as da[index].
(2) It should not be used repeatedly on large arrays,
because the function is O(n).
l_dnaJoin
l_int32 l_dnaJoin ( L_DNA *dad, L_DNA *das, l_int32 istart, l_int32 iend )
l_dnaJoin()
Input: dad (dest dma; add to this one)
das (<optional> source dna; add from this one)
istart (starting index in das)
iend (ending index in das; use -1 to cat all)
Return: 0 if OK, 1 on error
Notes:
(1) istart < 0 is taken to mean 'read from the start' (istart = 0)
(2) iend < 0 means 'read to the end'
(3) if das == NULL, this is a no-op
l_dnaMakeDelta
L_DNA * l_dnaMakeDelta ( L_DNA *das )
l_dnaMakeDelta()
Input: das (input l_dna)
Return: dad (of difference values val[i+1] - val[i]),
or null on error
l_dnaMakeSequence
L_DNA * l_dnaMakeSequence ( l_float64 startval, l_float64 increment, l_int32 size )
l_dnaMakeSequence()
Input: startval
increment
size (of sequence)
Return: l_dna of sequence of evenly spaced values, or null on error
l_dnaRead
L_DNA * l_dnaRead ( const char *filename )
l_dnaRead()
Input: filename
Return: da, or null on error
l_dnaReadStream
L_DNA * l_dnaReadStream ( FILE *fp )
l_dnaReadStream()
Input: stream
Return: da, or null on error
l_dnaRemoveNumber
l_int32 l_dnaRemoveNumber ( L_DNA *da, l_int32 index )
l_dnaRemoveNumber()
Input: da
index (element to be removed)
Return: 0 if OK, 1 on error
Notes:
(1) This shifts da[i] --> da[i - 1] for all i > index.
(2) It should not be used repeatedly on large arrays,
because the function is O(n).
l_dnaReplaceNumber
l_int32 l_dnaReplaceNumber ( L_DNA *da, l_int32 index, l_float64 val )
l_dnaReplaceNumber()
Input: da
index (element to be replaced)
val (new value to replace old one)
Return: 0 if OK, 1 on error
l_dnaSetCount
l_int32 l_dnaSetCount ( L_DNA *da, l_int32 newcount )
l_dnaSetCount()
Input: da
newcount
Return: 0 if OK, 1 on error
Notes:
(1) If newcount <= da->nalloc, this resets da->n.
Using newcount = 0 is equivalent to l_dnaEmpty().
(2) If newcount > da->nalloc, this causes a realloc
to a size da->nalloc = newcount.
(3) All the previously unused values in da are set to 0.0.
l_dnaSetParameters
l_int32 l_dnaSetParameters ( L_DNA *da, l_float64 startx, l_float64 delx )
l_dnaSetParameters()
Input: da
startx (x value corresponding to da[0])
delx (difference in x values for the situation where the
elements of da correspond to the evaulation of a
function at equal intervals of size @delx)
Return: 0 if OK, 1 on error
l_dnaSetValue
l_int32 l_dnaSetValue ( L_DNA *da, l_int32 index, l_float64 val )
l_dnaSetValue()
Input: da
index (to element to be set)
val (to set element)
Return: 0 if OK; 1 on error
l_dnaShiftValue
l_int32 l_dnaShiftValue ( L_DNA *da, l_int32 index, l_float64 diff )
l_dnaShiftValue()
Input: da
index (to element to change relative to the current value)
diff (increment if diff > 0 or decrement if diff < 0)
Return: 0 if OK; 1 on error
l_dnaWrite
l_int32 l_dnaWrite ( const char *filename, L_DNA *da )
l_dnaWrite()
Input: filename, da
Return: 0 if OK, 1 on error
l_dnaWriteStream
l_int32 l_dnaWriteStream ( FILE *fp, L_DNA *da )
l_dnaWriteStream()
Input: stream, da
Return: 0 if OK, 1 on error
l_dnaaAddDna
l_int32 l_dnaaAddDna ( L_DNAA *daa, L_DNA *da, l_int32 copyflag )
l_dnaaAddDna()
Input: daa
da (to be added)
copyflag (L_INSERT, L_COPY, L_CLONE)
Return: 0 if OK, 1 on error
l_dnaaAddNumber
l_int32 l_dnaaAddNumber ( L_DNAA *daa, l_int32 index, l_float64 val )
l_dnaaAddNumber()
Input: daa
index (of l_dna within l_dnaa)
val (number to be added; stored as a double)
Return: 0 if OK, 1 on error
Notes:
(1) Adds to an existing l_dna only.
l_dnaaCreate
L_DNAA * l_dnaaCreate ( l_int32 n )
l_dnaaCreate()
Input: size of l_dna ptr array to be alloc'd (0 for default)
Return: daa, or null on error
l_dnaaDestroy
void l_dnaaDestroy ( L_DNAA **pdaa )
l_dnaaDestroy()
Input: &dnaa <to be nulled if it exists>
Return: void
l_dnaaGetCount
l_int32 l_dnaaGetCount ( L_DNAA *daa )
l_dnaaGetCount()
Input: daa
Return: count (number of l_dna), or 0 if no l_dna or on error
l_dnaaGetDna
L_DNA * l_dnaaGetDna ( L_DNAA *daa, l_int32 index, l_int32 accessflag )
l_dnaaGetDna()
Input: daa
index (to the index-th l_dna)
accessflag (L_COPY or L_CLONE)
Return: l_dna, or null on error
l_dnaaGetDnaCount
l_int32 l_dnaaGetDnaCount ( L_DNAA *daa, l_int32 index )
l_dnaaGetDnaCount()
Input: daa
index (of l_dna in daa)
Return: count of numbers in the referenced l_dna, or 0 on error.
l_dnaaGetNumberCount
l_int32 l_dnaaGetNumberCount ( L_DNAA *daa )
l_dnaaGetNumberCount()
Input: daa
Return: count (total number of numbers in the l_dnaa),
or 0 if no numbers or on error
l_dnaaGetValue
l_int32 l_dnaaGetValue ( L_DNAA *daa, l_int32 i, l_int32 j, l_float64 *pval )
l_dnaaGetValue()
Input: daa
i (index of l_dna within l_dnaa)
j (index into l_dna)
val (<return> double value)
Return: 0 if OK, 1 on error
l_dnaaRead
L_DNAA * l_dnaaRead ( const char *filename )
l_dnaaRead()
Input: filename
Return: daa, or null on error
l_dnaaReadStream
L_DNAA * l_dnaaReadStream ( FILE *fp )
l_dnaaReadStream()
Input: stream
Return: daa, or null on error
l_dnaaReplaceDna
l_int32 l_dnaaReplaceDna ( L_DNAA *daa, l_int32 index, L_DNA *da )
l_dnaaReplaceDna()
Input: daa
index (to the index-th l_dna)
l_dna (insert and replace any existing one)
Return: 0 if OK, 1 on error
Notes:
(1) Any existing l_dna is destroyed, and the input one
is inserted in its place.
(2) If the index is invalid, return 1 (error)
l_dnaaWrite
l_int32 l_dnaaWrite ( const char *filename, L_DNAA *daa )
l_dnaaWrite()
Input: filename, daa
Return: 0 if OK, 1 on error
l_dnaaWriteStream
l_int32 l_dnaaWriteStream ( FILE *fp, L_DNAA *daa )
l_dnaaWriteStream()
Input: stream, daa
Return: 0 if OK, 1 on error
numaConvertToDna
L_DNA * numaConvertToDna ( NUMA *na )
numaConvertToDna
Input: na
Return: da, or null on error
AUTHOR
Zakariyya Mughal <zmughal@cpan.org>
COPYRIGHT AND LICENSE
This software is copyright (c) 2014 by Zakariyya Mughal.
This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.