166#include <config_auto.h>
171#include "allheaders.h"
175static const l_uint32 MaxFloatArraySize = 100000000;
176static const l_uint32 MaxPtrArraySize = 1000000;
197 if (n <= 0 || n > MaxFloatArraySize)
200 na = (
NUMA *)LEPT_CALLOC(1,
sizeof(
NUMA));
201 if ((na->
array = (l_float32 *)LEPT_CALLOC(n,
sizeof(l_float32))) == NULL) {
203 return (
NUMA *)ERROR_PTR(
"number array not made", __func__, NULL);
238 return (
NUMA *)ERROR_PTR(
"iarray not defined", __func__, NULL);
240 return (
NUMA *)ERROR_PTR(
"size must be > 0", __func__, NULL);
243 for (i = 0; i < size; i++)
274 return (
NUMA *)ERROR_PTR(
"farray not defined", __func__, NULL);
276 return (
NUMA *)ERROR_PTR(
"size must be > 0", __func__, NULL);
278 return (
NUMA *)ERROR_PTR(
"invalid copyflag", __func__, NULL);
286 for (i = 0; i < size; i++)
311l_int32 i, n, nerrors;
316 if (!str || (strlen(str) == 0))
317 return (
NUMA *)ERROR_PTR(
"str not defined or empty", __func__, NULL);
319 sa = sarrayCreate(0);
320 sarraySplitString(sa, str,
",");
321 n = sarrayGetCount(sa);
324 for (i = 0; i < n; i++) {
325 substr = sarrayGetString(sa, i,
L_NOCOPY);
326 if (sscanf(substr,
"%f", &val) != 1) {
327 L_ERROR(
"substr %d not float\n", __func__, i);
337 return (
NUMA *)ERROR_PTR(
"non-floats in string", __func__, NULL);
362 L_WARNING(
"ptr address is NULL\n", __func__);
366 if ((na = *pna) == NULL)
372 LEPT_FREE(na->
array);
393 return (
NUMA *)ERROR_PTR(
"na not defined", __func__, NULL);
396 return (
NUMA *)ERROR_PTR(
"cna not made", __func__, NULL);
400 for (i = 0; i < na->
n; i++)
417 return (
NUMA *)ERROR_PTR(
"na not defined", __func__, NULL);
441 return ERROR_INT(
"na not defined", __func__, 1);
466 return ERROR_INT(
"na not defined", __func__, 1);
471 return ERROR_INT(
"extension failed", __func__, 1);
493size_t oldsize, newsize;
496 return ERROR_INT(
"na not defined", __func__, 1);
497 if (na->
nalloc > MaxFloatArraySize)
498 return ERROR_INT(
"na has too many ptrs", __func__, 1);
499 oldsize = na->
nalloc *
sizeof(l_float32);
500 newsize = 2 * oldsize;
501 if (newsize > 4 * MaxFloatArraySize)
502 return ERROR_INT(
"newsize > 400 MB; too large", __func__, 1);
504 if ((na->
array = (l_float32 *)reallocNew((
void **)&na->
array,
505 oldsize, newsize)) == NULL)
506 return ERROR_INT(
"new ptr array not returned", __func__, 1);
538 return ERROR_INT(
"na not defined", __func__, 1);
540 if (index < 0 || index > n) {
541 L_ERROR(
"index %d not in [0,...,%d]\n", __func__, index, n);
547 return ERROR_INT(
"extension failed", __func__, 1);
549 for (i = n; i > index; i--)
551 na->
array[index] = val;
578 return ERROR_INT(
"na not defined", __func__, 1);
580 if (index < 0 || index >= n) {
581 L_ERROR(
"index %d not in [0,...,%d]\n", __func__, index, n - 1);
585 for (i = index + 1; i < n; i++)
608 return ERROR_INT(
"na not defined", __func__, 1);
610 if (index < 0 || index >= n) {
611 L_ERROR(
"index %d not in [0,...,%d]\n", __func__, index, n - 1);
615 na->
array[index] = val;
633 return ERROR_INT(
"na not defined", __func__, 0);
659 return ERROR_INT(
"na not defined", __func__, 1);
660 if (newcount > na->
nalloc) {
661 if ((na->
array = (l_float32 *)reallocNew((
void **)&na->
array,
662 sizeof(l_float32) * na->
nalloc,
663 sizeof(l_float32) * newcount)) == NULL)
664 return ERROR_INT(
"new ptr array not returned", __func__, 1);
692 return ERROR_INT(
"&val not defined", __func__, 1);
695 return ERROR_INT(
"na not defined", __func__, 1);
697 if (index < 0 || index >= na->
n)
698 return ERROR_INT(
"index not valid", __func__, 1);
700 *pval = na->
array[index];
727 return ERROR_INT(
"&ival not defined", __func__, 1);
730 return ERROR_INT(
"na not defined", __func__, 1);
732 if (index < 0 || index >= na->
n)
733 return ERROR_INT(
"index not valid", __func__, 1);
735 val = na->
array[index];
736 *pival = (l_int32)(val + L_SIGN(val) * 0.5);
755 return ERROR_INT(
"na not defined", __func__, 1);
756 if (index < 0 || index >= na->
n)
757 return ERROR_INT(
"index not valid", __func__, 1);
759 na->
array[index] = val;
778 return ERROR_INT(
"na not defined", __func__, 1);
779 if (index < 0 || index >= na->
n)
780 return ERROR_INT(
"index not valid", __func__, 1);
782 na->
array[index] += diff;
813 return (l_int32 *)ERROR_PTR(
"na not defined", __func__, NULL);
816 return (l_int32 *)ERROR_PTR(
"na is empty", __func__, NULL);
817 if ((array = (l_int32 *)LEPT_CALLOC(n,
sizeof(l_int32))) == NULL)
818 return (l_int32 *)ERROR_PTR(
"array not made", __func__, NULL);
819 for (i = 0; i < n; i++) {
858 return (l_float32 *)ERROR_PTR(
"na not defined", __func__, NULL);
864 return (l_float32 *)ERROR_PTR(
"na is empty", __func__, NULL);
865 if ((array = (l_float32 *)LEPT_CALLOC(n,
sizeof(l_float32))) == NULL)
866 return (l_float32 *)ERROR_PTR(
"array not made", __func__, NULL);
867 for (i = 0; i < n; i++)
868 array[i] = na->
array[i];
888 if (!pdelx && !pstartx)
889 return ERROR_INT(
"no return val requested", __func__, 1);
890 if (pstartx) *pstartx = 0.0;
891 if (pdelx) *pdelx = 1.0;
893 return ERROR_INT(
"na not defined", __func__, 1);
895 if (pstartx) *pstartx = na->
startx;
896 if (pdelx) *pdelx = na->
delx;
917 return ERROR_INT(
"na not defined", __func__, 1);
936l_float32 start, binsize;
939 return ERROR_INT(
"nas and nad not both defined", __func__, 1);
975char fmt[32], strbuf[64];
981 return (
SARRAY *)ERROR_PTR(
"na not defined", __func__, NULL);
983 return (
SARRAY *)ERROR_PTR(
"invalid type", __func__, NULL);
987 snprintf(fmt,
sizeof(fmt),
"%%0%dd", size1);
989 snprintf(fmt,
sizeof(fmt),
"%%%dd", size1);
991 snprintf(fmt,
sizeof(fmt),
"%%%d.%df", size1, size2);
995 if ((sa = sarrayCreate(n)) == NULL)
996 return (
SARRAY *)ERROR_PTR(
"sa not made", __func__, NULL);
998 for (i = 0; i < n; i++) {
1001 snprintf(strbuf,
sizeof(strbuf), fmt, ival);
1004 snprintf(strbuf,
sizeof(strbuf), fmt, fval);
1006 sarrayAddString(sa, strbuf,
L_COPY);
1029 return (
NUMA *)ERROR_PTR(
"filename not defined", __func__, NULL);
1031 if ((fp = fopenReadStream(filename)) == NULL)
1032 return (
NUMA *)ERROR_PTR_1(
"stream not opened",
1033 filename, __func__, NULL);
1037 return (
NUMA *)ERROR_PTR_1(
"na not read",
1038 filename, __func__, NULL);
1052l_int32 i, n, index, ret, version;
1053l_float32 val, startx, delx;
1057 return (
NUMA *)ERROR_PTR(
"stream not defined", __func__, NULL);
1059 ret = fscanf(fp,
"\nNuma Version %d\n", &version);
1061 return (
NUMA *)ERROR_PTR(
"not a numa file", __func__, NULL);
1063 return (
NUMA *)ERROR_PTR(
"invalid numa version", __func__, NULL);
1064 if (fscanf(fp,
"Number of numbers = %d\n", &n) != 1)
1065 return (
NUMA *)ERROR_PTR(
"invalid number of numbers", __func__, NULL);
1067 if (n > MaxFloatArraySize) {
1068 L_ERROR(
"n = %d > %d\n", __func__, n, MaxFloatArraySize);
1072 return (
NUMA *)ERROR_PTR(
"na not made", __func__, NULL);
1074 for (i = 0; i < n; i++) {
1075 if (fscanf(fp,
" [%d] = %f\n", &index, &val) != 2) {
1077 return (
NUMA *)ERROR_PTR(
"bad input data", __func__, NULL);
1083 if (fscanf(fp,
"startx = %f, delx = %f\n", &startx, &delx) == 2)
1105 return (
NUMA *)ERROR_PTR(
"data not defined", __func__, NULL);
1106 if ((fp = fopenReadFromMemory(data, size)) == NULL)
1107 return (
NUMA *)ERROR_PTR(
"stream not opened", __func__, NULL);
1111 if (!na) L_ERROR(
"numa not read\n", __func__);
1139 L_INFO(
"write to named temp file %s is disabled\n", __func__, filename);
1160 return ERROR_INT(
"filename not defined", __func__, 1);
1162 return ERROR_INT(
"na not defined", __func__, 1);
1164 if ((fp = fopenWriteStream(filename,
"w")) == NULL)
1165 return ERROR_INT_1(
"stream not opened", filename, __func__, 1);
1169 return ERROR_INT_1(
"na not written to stream", filename, __func__, 1);
1186l_float32 startx, delx;
1189 return ERROR_INT(
"na not defined", __func__, 1);
1195 fprintf(fp,
"Number of numbers = %d\n", n);
1196 for (i = 0; i < n; i++)
1197 fprintf(fp,
" [%d] = %f\n", i, na->
array[i]);
1202 if (startx != 0.0 || delx != 1.0)
1203 fprintf(fp,
"startx = %f, delx = %f\n", startx, delx);
1219l_float32 startx, delx;
1222 return ERROR_INT(
"na not defined", __func__, 1);
1226 lept_stderr(
"Number of numbers = %d\n", n);
1227 for (i = 0; i < n; i++)
1228 lept_stderr(
" [%d] = %f\n", i, na->
array[i]);
1233 if (startx != 0.0 || delx != 1.0)
1234 lept_stderr(
"startx = %f, delx = %f\n", startx, delx);
1261 if (pdata) *pdata = NULL;
1262 if (psize) *psize = 0;
1264 return ERROR_INT(
"&data not defined", __func__, 1);
1266 return ERROR_INT(
"&size not defined", __func__, 1);
1268 return ERROR_INT(
"na not defined", __func__, 1);
1271 if ((fp = open_memstream((
char **)pdata, psize)) == NULL)
1272 return ERROR_INT(
"stream not opened", __func__, 1);
1276 if (*psize > 0) *psize = *psize - 1;
1278 L_INFO(
"no fmemopen API --> work-around: write to temp file\n", __func__);
1280 if ((fp = fopenWriteWinTempfile()) == NULL)
1281 return ERROR_INT(
"tmpfile stream not opened", __func__, 1);
1283 if ((fp = tmpfile()) == NULL)
1284 return ERROR_INT(
"tmpfile stream not opened", __func__, 1);
1288 *pdata = l_binaryReadStream(fp, psize);
1310 if (n <= 0 || n > MaxPtrArraySize)
1313 naa = (
NUMAA *)LEPT_CALLOC(1,
sizeof(
NUMAA));
1314 if ((naa->
numa = (
NUMA **)LEPT_CALLOC(n,
sizeof(
NUMA *))) == NULL) {
1316 return (
NUMAA *)ERROR_PTR(
"numa ptr array not made", __func__, NULL);
1350 for (i = 0; i < nptr; i++) {
1379 return ERROR_INT(
"naa not defined", __func__, 1);
1382 for (i = n - 1; i >= 0; i--) {
1411 L_WARNING(
"ptr address is NULL!\n", __func__);
1415 if ((naa = *pnaa) == NULL)
1418 for (i = 0; i < naa->
n; i++)
1420 LEPT_FREE(naa->
numa);
1447 return ERROR_INT(
"naa not defined", __func__, 1);
1449 return ERROR_INT(
"na not defined", __func__, 1);
1453 }
else if (copyflag ==
L_COPY) {
1455 return ERROR_INT(
"nac not made", __func__, 1);
1456 }
else if (copyflag ==
L_CLONE) {
1459 return ERROR_INT(
"invalid copyflag", __func__, 1);
1467 return ERROR_INT(
"extension failed", __func__, 1);
1490size_t oldsize, newsize;
1493 return ERROR_INT(
"naa not defined", __func__, 1);
1494 if (naa->
nalloc > MaxPtrArraySize)
1495 return ERROR_INT(
"naa has too many ptrs", __func__, 1);
1497 newsize = 2 * oldsize;
1498 if (newsize > 8 * MaxPtrArraySize)
1499 return ERROR_INT(
"newsize > 8 MB; too large", __func__, 1);
1501 if ((naa->
numa = (
NUMA **)reallocNew((
void **)&naa->
numa,
1502 oldsize, newsize)) == NULL)
1503 return ERROR_INT(
"new ptr array not returned", __func__, 1);
1523 return ERROR_INT(
"naa not defined", __func__, 0);
1540 return ERROR_INT(
"naa not defined", __func__, 0);
1541 if (index < 0 || index >= naa->
n)
1542 return ERROR_INT(
"invalid index into naa", __func__, 0);
1561 return ERROR_INT(
"naa not defined", __func__, 0);
1564 for (sum = 0, i = 0; i < n; i++) {
1605 return (
NUMA **)ERROR_PTR(
"naa not defined", __func__, NULL);
1626 return (
NUMA *)ERROR_PTR(
"naa not defined", __func__, NULL);
1627 if (index < 0 || index >= naa->
n)
1628 return (
NUMA *)ERROR_PTR(
"index not valid", __func__, NULL);
1630 if (accessflag ==
L_COPY)
1632 else if (accessflag ==
L_CLONE)
1635 return (
NUMA *)ERROR_PTR(
"invalid accessflag", __func__, NULL);
1662 return ERROR_INT(
"naa not defined", __func__, 1);
1664 return ERROR_INT(
"na not defined", __func__, 1);
1666 if (index < 0 || index >= n)
1667 return ERROR_INT(
"index not valid", __func__, 1);
1670 naa->
numa[index] = na;
1695 if (!pfval && !pival)
1696 return ERROR_INT(
"no return val requested", __func__, 1);
1697 if (pfval) *pfval = 0.0;
1698 if (pival) *pival = 0;
1700 return ERROR_INT(
"naa not defined", __func__, 1);
1702 if (i < 0 || i >= n)
1703 return ERROR_INT(
"invalid index into naa", __func__, 1);
1705 if (j < 0 || j >= na->
n)
1706 return ERROR_INT(
"invalid index into na", __func__, 1);
1707 if (pfval) *pfval = na->
array[j];
1708 if (pival) *pival = (l_int32)(na->
array[j]);
1735 return ERROR_INT(
"naa not defined", __func__, 1);
1737 if (index < 0 || index >= n)
1738 return ERROR_INT(
"invalid index in naa", __func__, 1);
1763 return (
NUMAA *)ERROR_PTR(
"filename not defined", __func__, NULL);
1765 if ((fp = fopenReadStream(filename)) == NULL)
1766 return (
NUMAA *)ERROR_PTR_1(
"stream not opened",
1767 filename, __func__, NULL);
1771 return (
NUMAA *)ERROR_PTR_1(
"naa not read",
1772 filename, __func__, NULL);
1786l_int32 i, n, index, ret, version;
1791 return (
NUMAA *)ERROR_PTR(
"stream not defined", __func__, NULL);
1793 ret = fscanf(fp,
"\nNumaa Version %d\n", &version);
1795 return (
NUMAA *)ERROR_PTR(
"not a numa file", __func__, NULL);
1797 return (
NUMAA *)ERROR_PTR(
"invalid numaa version", __func__, NULL);
1798 if (fscanf(fp,
"Number of numa = %d\n\n", &n) != 1)
1799 return (
NUMAA *)ERROR_PTR(
"invalid number of numa", __func__, NULL);
1801 if (n > MaxPtrArraySize) {
1802 L_ERROR(
"n = %d > %d\n", __func__, n, MaxPtrArraySize);
1806 return (
NUMAA *)ERROR_PTR(
"naa not made", __func__, NULL);
1808 for (i = 0; i < n; i++) {
1809 if (fscanf(fp,
"Numa[%d]:", &index) != 1) {
1811 return (
NUMAA *)ERROR_PTR(
"invalid numa header", __func__, NULL);
1815 return (
NUMAA *)ERROR_PTR(
"na not made", __func__, NULL);
1839 return (
NUMAA *)ERROR_PTR(
"data not defined", __func__, NULL);
1840 if ((fp = fopenReadFromMemory(data, size)) == NULL)
1841 return (
NUMAA *)ERROR_PTR(
"stream not opened", __func__, NULL);
1845 if (!naa) L_ERROR(
"naa not read\n", __func__);
1865 return ERROR_INT(
"filename not defined", __func__, 1);
1867 return ERROR_INT(
"naa not defined", __func__, 1);
1869 if ((fp = fopenWriteStream(filename,
"w")) == NULL)
1870 return ERROR_INT_1(
"stream not opened", filename, __func__, 1);
1874 return ERROR_INT_1(
"naa not written to stream", filename, __func__, 1);
1894 return ERROR_INT(
"stream not defined", __func__, 1);
1896 return ERROR_INT(
"naa not defined", __func__, 1);
1900 fprintf(fp,
"Number of numa = %d\n\n", n);
1901 for (i = 0; i < n; i++) {
1903 return ERROR_INT(
"na not found", __func__, 1);
1904 fprintf(fp,
"Numa[%d]:", i);
1934 if (pdata) *pdata = NULL;
1935 if (psize) *psize = 0;
1937 return ERROR_INT(
"&data not defined", __func__, 1);
1939 return ERROR_INT(
"&size not defined", __func__, 1);
1941 return ERROR_INT(
"naa not defined", __func__, 1);
1944 if ((fp = open_memstream((
char **)pdata, psize)) == NULL)
1945 return ERROR_INT(
"stream not opened", __func__, 1);
1949 if (*psize > 0) *psize = *psize - 1;
1951 L_INFO(
"no fmemopen API --> work-around: write to temp file\n", __func__);
1953 if ((fp = fopenWriteWinTempfile()) == NULL)
1954 return ERROR_INT(
"tmpfile stream not opened", __func__, 1);
1956 if ((fp = tmpfile()) == NULL)
1957 return ERROR_INT(
"tmpfile stream not opened", __func__, 1);
1961 *pdata = l_binaryReadStream(fp, psize);
#define NUMA_VERSION_NUMBER
l_ok numaaWriteMem(l_uint8 **pdata, size_t *psize, NUMAA *naa)
numaaWriteMem()
l_ok numaAddNumber(NUMA *na, l_float32 val)
numaAddNumber()
l_int32 numaaGetNumberCount(NUMAA *naa)
numaaGetNumberCount()
NUMA * numaCopy(NUMA *na)
numaCopy()
l_ok numaReplaceNumber(NUMA *na, l_int32 index, l_float32 val)
numaReplaceNumber()
l_ok numaGetFValue(NUMA *na, l_int32 index, l_float32 *pval)
numaGetFValue()
SARRAY * numaConvertToSarray(NUMA *na, l_int32 size1, l_int32 size2, l_int32 addzeros, l_int32 type)
numaConvertToSarray()
l_ok numaWriteStderr(NUMA *na)
numaWriteStderr()
NUMA * numaaGetNuma(NUMAA *naa, l_int32 index, l_int32 accessflag)
numaaGetNuma()
l_ok numaWrite(const char *filename, NUMA *na)
numaWrite()
l_int32 numaaGetCount(NUMAA *naa)
numaaGetCount()
l_int32 * numaGetIArray(NUMA *na)
numaGetIArray()
l_ok numaaAddNumber(NUMAA *naa, l_int32 index, l_float32 val)
numaaAddNumber()
l_ok numaInsertNumber(NUMA *na, l_int32 index, l_float32 val)
numaInsertNumber()
l_ok numaaWriteStream(FILE *fp, NUMAA *naa)
numaaWriteStream()
l_int32 numaaGetNumaCount(NUMAA *naa, l_int32 index)
numaaGetNumaCount()
l_ok numaSetCount(NUMA *na, l_int32 newcount)
numaSetCount()
l_ok numaaGetValue(NUMAA *naa, l_int32 i, l_int32 j, l_float32 *pfval, l_int32 *pival)
numaaGetValue()
void numaDestroy(NUMA **pna)
numaDestroy()
NUMA ** numaaGetPtrArray(NUMAA *naa)
numaaGetPtrArray()
l_ok numaaTruncate(NUMAA *naa)
numaaTruncate()
NUMAA * numaaCreateFull(l_int32 nptr, l_int32 n)
numaaCreateFull()
l_ok numaSetValue(NUMA *na, l_int32 index, l_float32 val)
numaSetValue()
l_float32 * numaGetFArray(NUMA *na, l_int32 copyflag)
numaGetFArray()
l_ok numaEmpty(NUMA *na)
numaEmpty()
NUMA * numaReadMem(const l_uint8 *data, size_t size)
numaReadMem()
l_int32 numaGetCount(NUMA *na)
numaGetCount()
l_ok numaGetIValue(NUMA *na, l_int32 index, l_int32 *pival)
numaGetIValue()
NUMA * numaCreate(l_int32 n)
numaCreate()
l_ok numaRemoveNumber(NUMA *na, l_int32 index)
numaRemoveNumber()
l_ok numaaAddNuma(NUMAA *naa, NUMA *na, l_int32 copyflag)
numaaAddNuma()
l_ok numaaWrite(const char *filename, NUMAA *naa)
numaaWrite()
NUMA * numaCreateFromString(const char *str)
numaCreateFromString()
l_ok numaWriteDebug(const char *filename, NUMA *na)
numaWriteDebug()
static const l_int32 InitialArraySize
l_ok numaShiftValue(NUMA *na, l_int32 index, l_float32 diff)
numaShiftValue()
static l_int32 numaExtendArray(NUMA *na)
numaExtendArray()
l_ok numaWriteMem(l_uint8 **pdata, size_t *psize, NUMA *na)
numaWriteMem()
NUMA * numaReadStream(FILE *fp)
numaReadStream()
NUMAA * numaaRead(const char *filename)
numaaRead()
l_ok numaGetParameters(NUMA *na, l_float32 *pstartx, l_float32 *pdelx)
numaGetParameters()
NUMA * numaCreateFromIArray(l_int32 *iarray, l_int32 size)
numaCreateFromIArray()
NUMA * numaClone(NUMA *na)
numaClone()
NUMA * numaCreateFromFArray(l_float32 *farray, l_int32 size, l_int32 copyflag)
numaCreateFromFArray()
NUMA * numaRead(const char *filename)
numaRead()
NUMAA * numaaCreate(l_int32 n)
numaaCreate()
void numaaDestroy(NUMAA **pnaa)
numaaDestroy()
NUMAA * numaaReadStream(FILE *fp)
numaaReadStream()
NUMAA * numaaReadMem(const l_uint8 *data, size_t size)
numaaReadMem()
l_ok numaCopyParameters(NUMA *nad, NUMA *nas)
numaCopyParameters()
l_ok numaSetParameters(NUMA *na, l_float32 startx, l_float32 delx)
numaSetParameters()
l_ok numaaReplaceNuma(NUMAA *naa, l_int32 index, NUMA *na)
numaaReplaceNuma()
l_ok numaWriteStream(FILE *fp, NUMA *na)
numaWriteStream()
static l_int32 numaaExtendArray(NUMAA *naa)
numaaExtendArray()