128 #include "allheaders.h" 159 l_float32 val1, val2;
161 PROCNAME(
"numaArithOp");
164 return (
NUMA *)ERROR_PTR(
"na1, na2 not both defined", procName, nad);
167 return (
NUMA *)ERROR_PTR(
"na1, na2 sizes differ", procName, nad);
168 if (nad && nad != na1)
169 return (
NUMA *)ERROR_PTR(
"nad defined but not in-place", procName, nad);
170 if (op != L_ARITH_ADD && op != L_ARITH_SUBTRACT &&
171 op != L_ARITH_MULTIPLY && op != L_ARITH_DIVIDE)
172 return (
NUMA *)ERROR_PTR(
"invalid op", procName, nad);
173 if (op == L_ARITH_DIVIDE) {
174 for (i = 0; i < n; i++) {
177 return (
NUMA *)ERROR_PTR(
"na2 has 0 element", procName, nad);
185 for (i = 0; i < n; i++) {
192 case L_ARITH_SUBTRACT:
195 case L_ARITH_MULTIPLY:
202 fprintf(stderr,
" Unknown arith op: %d\n", op);
238 l_int32 i, n, val1, val2, val;
240 PROCNAME(
"numaLogicalOp");
243 return (
NUMA *)ERROR_PTR(
"na1, na2 not both defined", procName, nad);
246 return (
NUMA *)ERROR_PTR(
"na1, na2 sizes differ", procName, nad);
247 if (nad && nad != na1)
248 return (
NUMA *)ERROR_PTR(
"nad defined; not in-place", procName, nad);
249 if (op != L_UNION && op != L_INTERSECTION &&
250 op != L_SUBTRACTION && op != L_EXCLUSIVE_OR)
251 return (
NUMA *)ERROR_PTR(
"invalid op", procName, nad);
257 for (i = 0; i < n; i++) {
260 val1 = (val1 == 0) ? 0 : 1;
261 val2 = (val2 == 0) ? 0 : 1;
264 val = (val1 || val2) ? 1 : 0;
268 val = (val1 && val2) ? 1 : 0;
272 val = (val1 && !val2) ? 1 : 0;
276 val = (val1 != val2) ? 1 : 0;
280 fprintf(stderr,
" Unknown logical op: %d\n", op);
311 PROCNAME(
"numaInvert");
314 return (
NUMA *)ERROR_PTR(
"nas not defined", procName, nad);
315 if (nad && nad != nas)
316 return (
NUMA *)ERROR_PTR(
"nad defined; not in-place", procName, nad);
321 for (i = 0; i < n; i++) {
357 l_float32 val1, val2;
359 PROCNAME(
"numaSimilar");
362 return ERROR_INT(
"&similar not defined", procName, 1);
365 return ERROR_INT(
"na1 and na2 not both defined", procName, 1);
366 maxdiff = L_ABS(maxdiff);
371 for (i = 0; i < n; i++) {
374 if (L_ABS(val1 - val2) > maxdiff)
return 0;
406 PROCNAME(
"numaAddToNumber");
409 return ERROR_INT(
"na not defined", procName, 1);
411 if (index < 0 || index >= n)
412 return ERROR_INT(
"index not in {0...n - 1}", procName, 1);
414 na->
array[index] += val;
435 l_int32 i, n, iminloc;
436 l_float32 val, minval;
438 PROCNAME(
"numaGetMin");
440 if (!pminval && !piminloc)
441 return ERROR_INT(
"nothing to do", procName, 1);
442 if (pminval) *pminval = 0.0;
443 if (piminloc) *piminloc = 0;
445 return ERROR_INT(
"na not defined", procName, 1);
447 minval = +1000000000.;
450 for (i = 0; i < n; i++) {
458 if (pminval) *pminval = minval;
459 if (piminloc) *piminloc = iminloc;
477 l_int32 i, n, imaxloc;
478 l_float32 val, maxval;
480 PROCNAME(
"numaGetMax");
482 if (!pmaxval && !pimaxloc)
483 return ERROR_INT(
"nothing to do", procName, 1);
484 if (pmaxval) *pmaxval = 0.0;
485 if (pimaxloc) *pimaxloc = 0;
487 return ERROR_INT(
"na not defined", procName, 1);
489 maxval = -1000000000.;
492 for (i = 0; i < n; i++) {
500 if (pmaxval) *pmaxval = maxval;
501 if (pimaxloc) *pimaxloc = imaxloc;
520 PROCNAME(
"numaGetSum");
523 return ERROR_INT(
"na not defined", procName, 1);
525 return ERROR_INT(
"&sum not defined", procName, 1);
529 for (i = 0; i < n; i++) {
559 PROCNAME(
"numaGetPartialSums");
562 return (
NUMA *)ERROR_PTR(
"na not defined", procName, NULL);
567 for (i = 0; i < n; i++) {
591 l_int32 i, n, truelast;
594 PROCNAME(
"numaGetSumOnInterval");
597 return ERROR_INT(
"na not defined", procName, 1);
599 return ERROR_INT(
"&sum not defined", procName, 1);
606 truelast = L_MIN(last, n - 1);
608 for (i = first; i <= truelast; i++) {
639 PROCNAME(
"numaHasOnlyIntegers");
642 return ERROR_INT(
"&allints not defined", procName, 1);
645 return ERROR_INT(
"na not defined", procName, 1);
648 return ERROR_INT(
"na empty", procName, 1);
652 incr = (l_int32)((n + maxsamples - 1) / maxsamples);
653 for (i = 0; i < n; i += incr) {
655 if (val != (l_int32)val) {
680 PROCNAME(
"numaSubsample");
683 return (
NUMA *)ERROR_PTR(
"nas not defined", procName, NULL);
685 return (
NUMA *)ERROR_PTR(
"subfactor < 1", procName, NULL);
689 for (i = 0; i < n; i++) {
690 if (i % subfactor != 0)
continue;
709 l_int32 i, n, prev, cur;
712 PROCNAME(
"numaMakeDelta");
715 return (
NUMA *)ERROR_PTR(
"nas not defined", procName, NULL);
719 for (i = 1; i < n; i++) {
745 PROCNAME(
"numaMakeSequence");
748 return (
NUMA *)ERROR_PTR(
"na not made", procName, NULL);
750 for (i = 0; i < size; i++) {
751 val = startval + i * increment;
790 PROCNAME(
"numaMakeAbsValue");
793 return (
NUMA *)ERROR_PTR(
"nas not defined", procName, NULL);
794 if (nad && nad != nas)
795 return (
NUMA *)ERROR_PTR(
"nad and not in-place", procName, NULL);
800 for (i = 0; i < n; i++) {
802 nad->
array[i] = L_ABS(val);
824 l_float32 startx, delx;
825 l_float32 *fas, *fad;
828 PROCNAME(
"numaAddBorder");
831 return (
NUMA *)ERROR_PTR(
"nas not defined", procName, NULL);
832 if (left < 0) left = 0;
833 if (right < 0) right = 0;
834 if (left == 0 && right == 0)
838 len = n + left + right;
844 for (i = 0; i < n; i++)
845 fad[left + i] = fas[i];
869 PROCNAME(
"numaAddSpecifiedBorder");
872 return (
NUMA *)ERROR_PTR(
"nas not defined", procName, NULL);
873 if (left < 0) left = 0;
874 if (right < 0) right = 0;
875 if (left == 0 && right == 0)
878 return (
NUMA *)ERROR_PTR(
"invalid type", procName, NULL);
881 return (
NUMA *)ERROR_PTR(
"border too large", procName, NULL);
887 for (i = 0; i < left; i++)
889 for (i = n - right; i < n; i++)
890 fa[i] = fa[n - right - 1];
892 for (i = 0; i < left; i++)
893 fa[i] = fa[2 * left - 1 - i];
894 for (i = 0; i < right; i++)
895 fa[n - right + i] = fa[n - right - i - 1];
915 l_float32 startx, delx;
916 l_float32 *fas, *fad;
919 PROCNAME(
"numaRemoveBorder");
922 return (
NUMA *)ERROR_PTR(
"nas not defined", procName, NULL);
923 if (left < 0) left = 0;
924 if (right < 0) right = 0;
925 if (left == 0 && right == 0)
929 if ((len = n - left - right) < 0)
930 return (
NUMA *)ERROR_PTR(
"len < 0 after removal", procName, NULL);
936 for (i = 0; i < len; i++)
937 fad[i] = fas[left + i];
954 l_int32 n, i, val, count, inrun;
956 PROCNAME(
"numaCountNonzeroRuns");
959 return ERROR_INT(
"&count not defined", procName, 1);
962 return ERROR_INT(
"na not defined", procName, 1);
966 for (i = 0; i < n; i++) {
968 if (!inrun && val > 0) {
971 }
else if (inrun && val == 0) {
998 PROCNAME(
"numaGetNonzeroRange");
1000 if (pfirst) *pfirst = 0;
1001 if (plast) *plast = 0;
1002 if (!pfirst || !plast)
1003 return ERROR_INT(
"pfirst and plast not both defined", procName, 1);
1005 return ERROR_INT(
"na not defined", procName, 1);
1008 for (i = 0; i < n; i++) {
1022 for (i = n - 1; i >= 0; i--) {
1045 l_int32 n, i, count;
1048 PROCNAME(
"numaGetCountRelativeToZero");
1051 return ERROR_INT(
"&count not defined", procName, 1);
1054 return ERROR_INT(
"na not defined", procName, 1);
1056 for (i = 0, count = 0; i < n; i++) {
1093 l_int32 n, i, truelast;
1094 l_float32 val, startx, delx;
1097 PROCNAME(
"numaClipToInterval");
1100 return (
NUMA *)ERROR_PTR(
"nas not defined", procName, NULL);
1102 return (
NUMA *)ERROR_PTR(
"range not valid", procName, NULL);
1106 return (
NUMA *)ERROR_PTR(
"no elements in range", procName, NULL);
1107 truelast = L_MIN(last, n - 1);
1108 if ((nad =
numaCreate(truelast - first + 1)) == NULL)
1109 return (
NUMA *)ERROR_PTR(
"nad not made", procName, NULL);
1110 for (i = first; i <= truelast; i++) {
1145 PROCNAME(
"numaMakeThresholdIndicator");
1148 return (
NUMA *)ERROR_PTR(
"nas not defined", procName, NULL);
1151 for (i = 0; i < n; i++) {
1157 if (fval < thresh) ival = 1;
1160 if (fval > thresh) ival = 1;
1163 if (fval <= thresh) ival = 1;
1166 if (fval >= thresh) ival = 1;
1170 return (
NUMA *)ERROR_PTR(
"invalid type", procName, NULL);
1196 l_int32 n, i, j, ileft, iright;
1197 l_float32 left, right, binsize, lfract, rfract, sum, startx, delx;
1201 PROCNAME(
"numaUniformSampling");
1204 return (
NUMA *)ERROR_PTR(
"nas not defined", procName, NULL);
1206 return (
NUMA *)ERROR_PTR(
"nsamp must be > 0", procName, NULL);
1211 binsize = (l_float32)n / (l_float32)nsamp;
1215 for (i = 0; i < nsamp; i++) {
1217 right = left + binsize;
1218 ileft = (l_int32)left;
1219 lfract = 1.0 - left + ileft;
1222 iright = (l_int32)right;
1223 rfract = right - iright;
1224 iright = L_MIN(iright, n - 1);
1225 if (ileft == iright) {
1226 sum += (lfract + rfract - 1.0) * array[ileft];
1228 if (lfract > 0.0001)
1229 sum += lfract * array[ileft];
1230 if (rfract > 0.0001)
1231 sum += rfract * array[iright];
1232 for (j = ileft + 1; j < iright; j++)
1262 l_float32 val1, val2;
1264 PROCNAME(
"numaReverse");
1267 return (
NUMA *)ERROR_PTR(
"nas not defined", procName, NULL);
1268 if (nad && nas != nad)
1269 return (
NUMA *)ERROR_PTR(
"nad defined but != nas", procName, NULL);
1273 for (i = 0; i < n / 2; i++) {
1281 for (i = n - 1; i >= 0; i--) {
1317 l_int32 n, i, inrun;
1318 l_float32 maxval, threshval, fval, startx, delx, x0, x1;
1321 PROCNAME(
"numaLowPassIntervals");
1324 return (
NUMA *)ERROR_PTR(
"nas not defined", procName, NULL);
1325 if (thresh < 0.0 || thresh > 1.0)
1326 return (
NUMA *)ERROR_PTR(
"invalid thresh", procName, NULL);
1336 threshval = thresh * maxval;
1342 for (i = 0; i < n; i++) {
1344 if (fval < threshval && inrun == FALSE) {
1346 x0 = startx + i * delx;
1347 }
else if (fval > threshval && inrun == TRUE) {
1349 x1 = startx + i * delx;
1354 if (inrun == TRUE) {
1355 x1 = startx + (n - 1) * delx;
1394 l_int32 n, i, istart, inband, output, sign;
1395 l_int32 startbelow, below, above, belowlast, abovelast;
1396 l_float32 maxval, threshval1, threshval2, fval, startx, delx, x0, x1;
1399 PROCNAME(
"numaThresholdEdges");
1402 return (
NUMA *)ERROR_PTR(
"nas not defined", procName, NULL);
1403 if (thresh1 < 0.0 || thresh1 > 1.0 || thresh2 < 0.0 || thresh2 > 1.0)
1404 return (
NUMA *)ERROR_PTR(
"invalid thresholds", procName, NULL);
1405 if (thresh2 < thresh1)
1406 return (
NUMA *)ERROR_PTR(
"thresh2 < thresh1", procName, NULL);
1418 threshval1 = thresh1 * maxval;
1419 threshval2 = thresh2 * maxval;
1426 for (i = 0; i < n; i++) {
1429 belowlast = (fval < threshval1) ? TRUE : FALSE;
1430 abovelast = (fval > threshval2) ? TRUE : FALSE;
1431 if (belowlast == TRUE || abovelast == TRUE)
1442 startbelow = belowlast;
1444 x0 = startx + istart * delx;
1445 for (i = istart + 1; i < n; i++) {
1447 below = (fval < threshval1) ? TRUE : FALSE;
1448 above = (fval > threshval2) ? TRUE : FALSE;
1449 if (!inband && belowlast && above) {
1450 x1 = startx + i * delx;
1454 }
else if (!inband && abovelast && below) {
1455 x1 = startx + i * delx;
1459 }
else if (inband && startbelow && above) {
1460 x1 = startx + i * delx;
1465 }
else if (inband && !startbelow && below) {
1467 x1 = startx + i * delx;
1472 }
else if (inband && !startbelow && above) {
1473 x0 = startx + i * delx;
1475 }
else if (inband && startbelow && below) {
1476 x0 = startx + i * delx;
1478 }
else if (!inband && !above && !below) {
1480 startbelow = belowlast;
1481 }
else if (!inband && (above || below)) {
1482 x0 = startx + i * delx;
1491 x0 = startx + i * delx;
1516 PROCNAME(
"numaGetSpanValues");
1519 return ERROR_INT(
"na not defined", procName, 1);
1522 return ERROR_INT(
"n is not odd", procName, 1);
1524 if (nspans < 0 || span >= nspans)
1525 return ERROR_INT(
"invalid span", procName, 1);
1553 PROCNAME(
"numaGetEdgeValues");
1556 return ERROR_INT(
"na not defined", procName, 1);
1559 return ERROR_INT(
"n % 3 is not 1", procName, 1);
1560 nedges = (n - 1) / 3;
1561 if (edge < 0 || edge >= nedges)
1562 return ERROR_INT(
"invalid edge", procName, 1);
1609 l_int32 i, n, i1, i2, i3;
1610 l_float32 x1, x2, x3, fy1, fy2, fy3, d1, d2, d3, del, fi, maxx;
1613 PROCNAME(
"numaInterpolateEqxVal");
1616 return ERROR_INT(
"&yval not defined", procName, 1);
1619 return ERROR_INT(
"nay not defined", procName, 1);
1621 return ERROR_INT(
"deltax not > 0", procName, 1);
1623 return ERROR_INT(
"invalid interp type", procName, 1);
1626 return ERROR_INT(
"not enough points", procName, 1);
1629 L_WARNING(
"only 2 points; using linear interp\n", procName);
1631 maxx = startx + deltax * (n - 1);
1632 if (xval < startx || xval > maxx)
1633 return ERROR_INT(
"xval is out of bounds", procName, 1);
1636 fi = (xval - startx) / deltax;
1645 *pyval = fa[i] + del * (fa[i + 1] - fa[i]);
1650 d1 = d3 = 0.5 / (deltax * deltax);
1661 x1 = startx + i1 * deltax;
1662 x2 = startx + i2 * deltax;
1663 x3 = startx + i3 * deltax;
1667 *pyval = fy1 * (xval - x2) * (xval - x3) +
1668 fy2 * (xval - x1) * (xval - x3) +
1669 fy3 * (xval - x1) * (xval - x2);
1701 l_int32 i, im, nx, ny, i1, i2, i3;
1702 l_float32 delu, dell, fract, d1, d2, d3;
1703 l_float32 minx, maxx;
1704 l_float32 *fax, *fay;
1706 PROCNAME(
"numaInterpolateArbxVal");
1709 return ERROR_INT(
"&yval not defined", procName, 1);
1712 return ERROR_INT(
"nax not defined", procName, 1);
1714 return ERROR_INT(
"nay not defined", procName, 1);
1716 return ERROR_INT(
"invalid interp type", procName, 1);
1720 return ERROR_INT(
"nax and nay not same size arrays", procName, 1);
1722 return ERROR_INT(
"not enough points", procName, 1);
1725 L_WARNING(
"only 2 points; using linear interp\n", procName);
1729 if (xval < minx || xval > maxx)
1730 return ERROR_INT(
"xval is out of bounds", procName, 1);
1738 if (xval == fax[0]) {
1744 for (i = 1; i < nx; i++) {
1745 delu = fax[i] - xval;
1752 dell = xval - fax[im];
1756 fract = dell / (fax[i] - fax[im]);
1759 *pyval = fay[i] + fract * (fay[i + 1] - fay[i]);
1773 d1 = (fax[i1] - fax[i2]) * (fax[i1] - fax[i3]);
1774 d2 = (fax[i2] - fax[i1]) * (fax[i2] - fax[i3]);
1775 d3 = (fax[i3] - fax[i1]) * (fax[i3] - fax[i2]);
1776 *pyval = fay[i1] * (xval - fax[i2]) * (xval - fax[i3]) / d1 +
1777 fay[i2] * (xval - fax[i1]) * (xval - fax[i3]) / d2 +
1778 fay[i3] * (xval - fax[i1]) * (xval - fax[i2]) / d3;
1823 l_float32 x, yval, maxx, delx;
1826 PROCNAME(
"numaInterpolateEqxInterval");
1828 if (pnax) *pnax = NULL;
1830 return ERROR_INT(
"&nay not defined", procName, 1);
1833 return ERROR_INT(
"nasy not defined", procName, 1);
1835 return ERROR_INT(
"deltax not > 0", procName, 1);
1837 return ERROR_INT(
"invalid interp type", procName, 1);
1841 L_WARNING(
"only 2 points; using linear interp\n", procName);
1843 maxx = startx + deltax * (n - 1);
1844 if (x0 < startx || x1 > maxx || x1 <= x0)
1845 return ERROR_INT(
"[x0 ... x1] is not valid", procName, 1);
1847 return ERROR_INT(
"npts < 3", procName, 1);
1848 delx = (x1 - x0) / (l_float32)(npts - 1);
1851 return ERROR_INT(
"nay not made", procName, 1);
1859 for (i = 0; i < npts; i++) {
1909 l_int32 i, im, j, nx, ny, i1, i2, i3, sorted;
1911 l_float32 del, xval, yval, excess, fract, minx, maxx, d1, d2, d3;
1912 l_float32 *fax, *fay;
1913 NUMA *nasx, *nasy, *nadx, *nady;
1915 PROCNAME(
"numaInterpolateArbxInterval");
1917 if (pnadx) *pnadx = NULL;
1919 return ERROR_INT(
"&nady not defined", procName, 1);
1922 return ERROR_INT(
"nay not defined", procName, 1);
1924 return ERROR_INT(
"nax not defined", procName, 1);
1926 return ERROR_INT(
"invalid interp type", procName, 1);
1928 return ERROR_INT(
"x0 > x1", procName, 1);
1932 return ERROR_INT(
"nax and nay not same size arrays", procName, 1);
1934 return ERROR_INT(
"not enough points", procName, 1);
1937 L_WARNING(
"only 2 points; using linear interp\n", procName);
1941 if (x0 < minx || x1 > maxx)
1942 return ERROR_INT(
"xval is out of bounds", procName, 1);
1947 L_WARNING(
"we are sorting nax in increasing order\n", procName);
1958 if ((index = (l_int32 *)LEPT_CALLOC(npts,
sizeof(l_int32))) == NULL) {
1961 return ERROR_INT(
"ind not made", procName, 1);
1963 del = (x1 - x0) / (npts - 1.0);
1964 for (i = 0, j = 0; j < nx && i < npts; i++) {
1965 xval = x0 + i * del;
1966 while (j < nx - 1 && xval > fax[j])
1969 index[i] = L_MIN(j, nx - 1);
1971 index[i] = L_MAX(j - 1, 0);
1981 for (i = 0; i < npts; i++) {
1982 xval = x0 + i * del;
1986 excess = xval - fax[im];
1987 if (excess == 0.0) {
1991 fract = excess / (fax[im + 1] - fax[im]);
1994 yval = fay[im] + fract * (fay[im + 1] - fay[im]);
2009 d1 = (fax[i1] - fax[i2]) * (fax[i1] - fax[i3]);
2010 d2 = (fax[i2] - fax[i1]) * (fax[i2] - fax[i3]);
2011 d3 = (fax[i3] - fax[i1]) * (fax[i3] - fax[i2]);
2012 yval = fay[i1] * (xval - fax[i2]) * (xval - fax[i3]) / d1 +
2013 fay[i2] * (xval - fax[i1]) * (xval - fax[i3]) / d2 +
2014 fay[i3] * (xval - fax[i1]) * (xval - fax[i2]) / d3;
2069 l_float32 x1, x2, x3, y1, y2, y3, c1, c2, c3, a, b, xmax, ymax;
2071 PROCNAME(
"numaFitMax");
2073 if (pmaxval) *pmaxval = 0.0;
2074 if (pmaxloc) *pmaxloc = 0.0;
2076 return ERROR_INT(
"na not defined", procName, 1);
2078 return ERROR_INT(
"&maxval not defined", procName, 1);
2080 return ERROR_INT(
"&maxloc not defined", procName, 1);
2085 return ERROR_INT(
"na and naloc of unequal size", procName, 1);
2090 if (imaxloc == 0 || imaxloc == n - 1) {
2122 if (x1 == x2 || x1 == x3 || x2 == x3) {
2129 c1 = y1 / ((x1 - x2) * (x1 - x3));
2130 c2 = y2 / ((x2 - x1) * (x2 - x3));
2131 c3 = y3 / ((x3 - x1) * (x3 - x2));
2133 b = c1 * (x2 + x3) + c2 * (x1 + x3) + c3 * (x1 + x2);
2135 ymax = c1 * (xmax - x2) * (xmax - x3) +
2136 c2 * (xmax - x1) * (xmax - x3) +
2137 c3 * (xmax - x1) * (xmax - x2);
2175 l_float32 minx, maxx, der, invdel;
2179 PROCNAME(
"numaDifferentiateInterval");
2181 if (pnadx) *pnadx = NULL;
2183 return ERROR_INT(
"&nady not defined", procName, 1);
2186 return ERROR_INT(
"nay not defined", procName, 1);
2188 return ERROR_INT(
"nax not defined", procName, 1);
2190 return ERROR_INT(
"x0 > x1", procName, 1);
2194 return ERROR_INT(
"nax and nay not same size arrays", procName, 1);
2196 return ERROR_INT(
"not enough points", procName, 1);
2199 if (x0 < minx || x1 > maxx)
2200 return ERROR_INT(
"xval is out of bounds", procName, 1);
2202 return ERROR_INT(
"npts < 2", procName, 1);
2206 npts, pnadx, &naiy))
2207 return ERROR_INT(
"interpolation failed", procName, 1);
2211 invdel = 0.5 * ((l_float32)npts - 1.0) / (x1 - x0);
2215 der = 0.5 * invdel * (fay[1] - fay[0]);
2217 for (i = 1; i < npts - 1; i++) {
2218 der = invdel * (fay[i + 1] - fay[i - 1]);
2221 der = 0.5 * invdel * (fay[npts - 1] - fay[npts - 2]);
2257 l_float32 minx, maxx, sum, del;
2261 PROCNAME(
"numaIntegrateInterval");
2264 return ERROR_INT(
"&sum not defined", procName, 1);
2267 return ERROR_INT(
"nay not defined", procName, 1);
2269 return ERROR_INT(
"nax not defined", procName, 1);
2271 return ERROR_INT(
"x0 > x1", procName, 1);
2273 return ERROR_INT(
"npts < 2", procName, 1);
2277 return ERROR_INT(
"nax and nay not same size arrays", procName, 1);
2279 return ERROR_INT(
"not enough points", procName, 1);
2282 if (x0 < minx || x1 > maxx)
2283 return ERROR_INT(
"xval is out of bounds", procName, 1);
2288 return ERROR_INT(
"interpolation failed", procName, 1);
2290 del = (x1 - x0) / ((l_float32)npts - 1.0);
2294 sum = 0.5 * (fay[0] + fay[npts - 1]);
2295 for (i = 1; i < npts - 1; i++)
2363 PROCNAME(
"numaSortGeneral");
2366 return ERROR_INT(
"na not defined", procName, 1);
2368 return ERROR_INT(
"invalid sort order", procName, 1);
2370 return ERROR_INT(
"invalid sort type", procName, 1);
2371 if (!pnasort && !pnaindex && !pnainvert)
2372 return ERROR_INT(
"nothing to do", procName, 1);
2373 if (pnasort) *pnasort = NULL;
2374 if (pnaindex) *pnaindex = NULL;
2375 if (pnainvert) *pnainvert = NULL;
2387 *pnaindex = naindex;
2413 PROCNAME(
"numaSortAutoSelect");
2416 return (
NUMA *)ERROR_PTR(
"nas not defined", procName, NULL);
2418 return (
NUMA *)ERROR_PTR(
"invalid sort order", procName, NULL);
2422 return numaSort(NULL, nas, sortorder);
2426 return (
NUMA *)ERROR_PTR(
"invalid sort type", procName, NULL);
2449 PROCNAME(
"numaSortIndexAutoSelect");
2452 return (
NUMA *)ERROR_PTR(
"nas not defined", procName, NULL);
2454 return (
NUMA *)ERROR_PTR(
"invalid sort order", procName, NULL);
2462 return (
NUMA *)ERROR_PTR(
"invalid sort type", procName, NULL);
2483 l_float32 minval, maxval;
2485 PROCNAME(
"numaChooseSortType");
2488 return ERROR_INT(
"nas not defined", procName, UNDEF);
2494 if (minval < 0.0 || n < 200) {
2495 L_INFO(
"Shell sort chosen\n", procName);
2504 if (n * log((l_float32)n) < 0.003 * maxval) {
2506 L_INFO(
"Shell sort chosen\n", procName);
2509 L_INFO(
"Bin sort chosen\n", procName);
2535 l_int32 i, n, gap, j;
2539 PROCNAME(
"numaSort");
2542 return (
NUMA *)ERROR_PTR(
"nain not defined", procName, NULL);
2544 return (
NUMA *)ERROR_PTR(
"invalid sort order", procName, NULL);
2549 else if (nain != naout)
2550 return (
NUMA *)ERROR_PTR(
"invalid: not in-place", procName, NULL);
2551 array = naout->
array;
2555 for (gap = n/2; gap > 0; gap = gap / 2) {
2556 for (i = gap; i < n; i++) {
2557 for (j = i - gap; j >= 0; j -= gap) {
2559 array[j] > array[j + gap]) ||
2561 array[j] < array[j + gap]))
2564 array[j] = array[j + gap];
2565 array[j + gap] = tmp;
2598 PROCNAME(
"numaBinSort");
2601 return (
NUMA *)ERROR_PTR(
"nas not defined", procName, NULL);
2603 return (
NUMA *)ERROR_PTR(
"invalid sort order", procName, NULL);
2624 l_int32 i, n, gap, j;
2630 PROCNAME(
"numaGetSortIndex");
2633 return (
NUMA *)ERROR_PTR(
"na not defined", procName, NULL);
2635 return (
NUMA *)ERROR_PTR(
"invalid sortorder", procName, NULL);
2639 return (
NUMA *)ERROR_PTR(
"array not made", procName, NULL);
2640 if ((iarray = (l_float32 *)LEPT_CALLOC(n,
sizeof(l_float32))) == NULL) {
2642 return (
NUMA *)ERROR_PTR(
"iarray not made", procName, NULL);
2644 for (i = 0; i < n; i++)
2648 for (gap = n/2; gap > 0; gap = gap / 2) {
2649 for (i = gap; i < n; i++) {
2650 for (j = i - gap; j >= 0; j -= gap) {
2652 array[j] > array[j + gap]) ||
2654 array[j] < array[j + gap]))
2657 array[j] = array[j + gap];
2658 array[j + gap] = tmp;
2660 iarray[j] = iarray[j + gap];
2661 iarray[j + gap] = tmp;
2668 for (i = 0; i < n; i++)
2700 l_int32 i, n, isize, ival, imax;
2702 NUMA *na, *nai, *nad;
2705 PROCNAME(
"numaGetBinSortIndex");
2708 return (
NUMA *)ERROR_PTR(
"nas not defined", procName, NULL);
2710 return (
NUMA *)ERROR_PTR(
"invalid sort order", procName, NULL);
2721 isize = (l_int32)size;
2722 if (isize > 1000000)
2723 L_WARNING(
"large array: %d elements\n", procName, isize);
2726 for (i = 0; i < n; i++) {
2742 for (i = 0; i <= imax; i++) {
2749 for (i = imax; i >= 0; i--) {
2773 l_int32 i, n, index;
2777 PROCNAME(
"numaSortByIndex");
2780 return (
NUMA *)ERROR_PTR(
"nas not defined", procName, NULL);
2782 return (
NUMA *)ERROR_PTR(
"naindex not defined", procName, NULL);
2786 for (i = 0; i < n; i++) {
2817 l_float32 prevval, val;
2819 PROCNAME(
"numaIsSorted");
2822 return ERROR_INT(
"&sorted not defined", procName, 1);
2825 return ERROR_INT(
"nas not defined", procName, 1);
2827 return ERROR_INT(
"invalid sortorder", procName, 1);
2831 for (i = 1; i < n; i++) {
2868 PROCNAME(
"numaSortPair");
2870 if (pnasx) *pnasx = NULL;
2871 if (pnasy) *pnasy = NULL;
2872 if (!pnasx || !pnasy)
2873 return ERROR_INT(
"&nasx and/or &nasy not defined", procName, 1);
2875 return ERROR_INT(
"nax not defined", procName, 1);
2877 return ERROR_INT(
"nay not defined", procName, 1);
2879 return ERROR_INT(
"invalid sortorder", procName, 1);
2882 if (sorted == TRUE) {
2912 l_int32 i, n, val, error;
2916 PROCNAME(
"numaInvertMap");
2919 return (
NUMA *)ERROR_PTR(
"nas not defined", procName, NULL);
2923 test = (l_int32 *)LEPT_CALLOC(n,
sizeof(l_int32));
2925 for (i = 0; i < n; i++) {
2932 if (test[val] == 0) {
2943 return (
NUMA *)ERROR_PTR(
"nas not invertible", procName, NULL);
2972 l_int32 i, index, temp;
2976 PROCNAME(
"numaPseudorandomSequence");
2979 return (
NUMA *)ERROR_PTR(
"size <= 0", procName, NULL);
2981 if ((array = (l_int32 *)LEPT_CALLOC(size,
sizeof(l_int32))) == NULL)
2982 return (
NUMA *)ERROR_PTR(
"array not made", procName, NULL);
2983 for (i = 0; i < size; i++)
2986 for (i = size - 1; i > 0; i--) {
2987 index = (l_int32)((i + 1) * ((l_float64)rand() / (l_float64)RAND_MAX));
2988 index = L_MIN(index, i);
2990 array[i] = array[index];
2991 array[index] = temp;
3011 l_int32 i, index, size;
3013 NUMA *naindex, *nad;
3015 PROCNAME(
"numaRandomPermutation");
3018 return (
NUMA *)ERROR_PTR(
"nas not defined", procName, NULL);
3023 for (i = 0; i < size; i++) {
3074 PROCNAME(
"numaGetRankValue");
3077 return ERROR_INT(
"&val not defined", procName, 1);
3080 return ERROR_INT(
"na not defined", procName, 1);
3081 if (fract < 0.0 || fract > 1.0)
3082 return ERROR_INT(
"fract not in [0.0 ... 1.0]", procName, 1);
3085 return ERROR_INT(
"na empty", procName, 1);
3095 return ERROR_INT(
"nas not made", procName, 1);
3097 index = (l_int32)(fract * (l_float32)(n - 1) + 0.5);
3122 PROCNAME(
"numaGetMedian");
3125 return ERROR_INT(
"&val not defined", procName, 1);
3128 return ERROR_INT(
"na not defined", procName, 1);
3156 PROCNAME(
"numaGetBinnedMedian");
3159 return ERROR_INT(
"&val not defined", procName, 1);
3162 return ERROR_INT(
"na not defined", procName, 1);
3191 l_int32 i, n, maxcount, prevcount;
3192 l_float32 val, maxval, prevval;
3196 PROCNAME(
"numaGetMode");
3198 if (pcount) *pcount = 0;
3200 return ERROR_INT(
"&val not defined", procName, 1);
3203 return ERROR_INT(
"na not defined", procName, 1);
3208 return ERROR_INT(
"nas not made", procName, 1);
3215 maxcount = prevcount;
3218 for (i = 1; i < n; i++) {
3220 if (val == prevval) {
3223 if (prevcount > maxcount) {
3224 maxcount = prevcount;
3233 if (prevcount > maxcount) {
3234 maxcount = prevcount;
3271 l_float32 val, medval;
3274 PROCNAME(
"numaGetMedianVar");
3276 if (pmedval) *pmedval = 0.0;
3278 return ERROR_INT(
"&medvar not defined", procName, 1);
3281 return ERROR_INT(
"na not defined", procName, 1);
3284 if (pmedval) *pmedval = medval;
3287 for (i = 0; i < n; i++) {
3327 PROCNAME(
"numaJoin");
3330 return ERROR_INT(
"nad not defined", procName, 1);
3337 if (iend < 0 || iend >= n)
3340 return ERROR_INT(
"istart > iend; nothing to add", procName, 1);
3342 for (i = istart; i <= iend; i++) {
3376 PROCNAME(
"numaaJoin");
3379 return ERROR_INT(
"naad not defined", procName, 1);
3386 if (iend < 0 || iend >= n)
3389 return ERROR_INT(
"istart > iend; nothing to add", procName, 1);
3391 for (i = istart; i <= iend; i++) {
3422 PROCNAME(
"numaaFlattenToNuma");
3425 return (
NUMA *)ERROR_PTR(
"naa not defined", procName, NULL);
3430 for (i = 0; i < nalloc; i++) {
l_int32 numaCountNonzeroRuns(NUMA *na, l_int32 *pcount)
numaCountNonzeroRuns()
NUMA * numaInvertMap(NUMA *nas)
numaInvertMap()
NUMA * numaBinSort(NUMA *nas, l_int32 sortorder)
numaBinSort()
l_int32 numaGetNonzeroRange(NUMA *na, l_float32 eps, l_int32 *pfirst, l_int32 *plast)
numaGetNonzeroRange()
void * ptraGetPtrToItem(L_PTRA *pa, l_int32 index)
ptraGetPtrToItem()
l_int32 numaAddNumber(NUMA *na, l_float32 val)
numaAddNumber()
NUMA * numaLowPassIntervals(NUMA *nas, l_float32 thresh, l_float32 maxn)
numaLowPassIntervals()
NUMA * numaGetSortIndex(NUMA *na, l_int32 sortorder)
numaGetSortIndex()
NUMA * numaSortAutoSelect(NUMA *nas, l_int32 sortorder)
numaSortAutoSelect()
l_int32 numaGetSumOnInterval(NUMA *na, l_int32 first, l_int32 last, l_float32 *psum)
numaGetSumOnInterval()
l_int32 lept_roundftoi(l_float32 fval)
lept_roundftoi()
NUMA * numaReverse(NUMA *nad, NUMA *nas)
numaReverse()
NUMA ** numaaGetPtrArray(NUMAA *naa)
numaaGetPtrArray()
NUMA * numaSortByIndex(NUMA *nas, NUMA *naindex)
numaSortByIndex()
l_int32 ptraGetMaxIndex(L_PTRA *pa, l_int32 *pmaxindex)
ptraGetMaxIndex()
l_int32 numaHasOnlyIntegers(NUMA *na, l_int32 maxsamples, l_int32 *pallints)
numaHasOnlyIntegers()
NUMA * numaRandomPermutation(NUMA *nas, l_int32 seed)
numaRandomPermutation()
NUMA * numaaFlattenToNuma(NUMAA *naa)
numaaFlattenToNuma()
NUMA * numaGetBinSortIndex(NUMA *nas, l_int32 sortorder)
numaGetBinSortIndex()
l_int32 numaGetMax(NUMA *na, l_float32 *pmaxval, l_int32 *pimaxloc)
numaGetMax()
l_int32 numaIsSorted(NUMA *nas, l_int32 sortorder, l_int32 *psorted)
numaIsSorted()
l_int32 numaFitMax(NUMA *na, l_float32 *pmaxval, NUMA *naloc, l_float32 *pmaxloc)
numaFitMax()
NUMA * numaMakeConstant(l_float32 val, l_int32 size)
numaMakeConstant()
NUMA * numaSort(NUMA *naout, NUMA *nain, l_int32 sortorder)
numaSort()
l_int32 numaGetFValue(NUMA *na, l_int32 index, l_float32 *pval)
numaGetFValue()
l_int32 numaChooseSortType(NUMA *nas)
numaChooseSortType()
l_int32 numaGetCountRelativeToZero(NUMA *na, l_int32 type, l_int32 *pcount)
numaGetCountRelativeToZero()
l_int32 numaJoin(NUMA *nad, NUMA *nas, l_int32 istart, l_int32 iend)
numaJoin()
NUMA * numaCreate(l_int32 n)
numaCreate()
l_int32 numaGetSum(NUMA *na, l_float32 *psum)
numaGetSum()
NUMA * numaThresholdEdges(NUMA *nas, l_float32 thresh1, l_float32 thresh2, l_float32 maxn)
numaThresholdEdges()
void * ptraRemoveLast(L_PTRA *pa)
ptraRemoveLast()
l_int32 numaGetSpanValues(NUMA *na, l_int32 span, l_int32 *pstart, l_int32 *pend)
numaGetSpanValues()
NUMA * numaClipToInterval(NUMA *nas, l_int32 first, l_int32 last)
numaClipToInterval()
l_int32 numaGetParameters(NUMA *na, l_float32 *pstartx, l_float32 *pdelx)
numaGetParameters()
NUMA * numaGetPartialSums(NUMA *na)
numaGetPartialSums()
NUMA * numaSubsample(NUMA *nas, l_int32 subfactor)
numaSubsample()
NUMA * numaRemoveBorder(NUMA *nas, l_int32 left, l_int32 right)
numaRemoveBorder()
l_int32 numaaAddNuma(NUMAA *naa, NUMA *na, l_int32 copyflag)
numaaAddNuma()
l_int32 numaGetBinnedMedian(NUMA *na, l_int32 *pval)
numaGetBinnedMedian()
NUMA * numaUniformSampling(NUMA *nas, l_int32 nsamp)
numaUniformSampling()
NUMA * numaArithOp(NUMA *nad, NUMA *na1, NUMA *na2, l_int32 op)
numaArithOp()
NUMA * numaMakeAbsValue(NUMA *nad, NUMA *nas)
numaMakeAbsValue()
l_int32 numaInterpolateEqxVal(l_float32 startx, l_float32 deltax, NUMA *nay, l_int32 type, l_float32 xval, l_float32 *pyval)
numaInterpolateEqxVal()
NUMA * numaPseudorandomSequence(l_int32 size, l_int32 seed)
numaPseudorandomSequence()
NUMA * numaaGetNuma(NUMAA *naa, l_int32 index, l_int32 accessflag)
numaaGetNuma()
NUMA * numaMakeDelta(NUMA *nas)
numaMakeDelta()
static const l_int32 L_INSERT
L_PTRA * ptraCreate(l_int32 n)
ptraCreate()
l_int32 numaGetCount(NUMA *na)
numaGetCount()
l_int32 numaGetRankValue(NUMA *na, l_float32 fract, NUMA *nasort, l_int32 usebins, l_float32 *pval)
numaGetRankValue()
l_int32 numaInterpolateArbxVal(NUMA *nax, NUMA *nay, l_int32 type, l_float32 xval, l_float32 *pyval)
numaInterpolateArbxVal()
NUMA * numaMakeThresholdIndicator(NUMA *nas, l_float32 thresh, l_int32 type)
numaMakeThresholdIndicator()
l_int32 numaGetEdgeValues(NUMA *na, l_int32 edge, l_int32 *pstart, l_int32 *pend, l_int32 *psign)
numaGetEdgeValues()
NUMA * numaAddSpecifiedBorder(NUMA *nas, l_int32 left, l_int32 right, l_int32 type)
numaAddSpecifiedBorder()
l_int32 numaGetMedianVariation(NUMA *na, l_float32 *pmedval, l_float32 *pmedvar)
numaGetMedianVariation()
l_int32 numaaJoin(NUMAA *naad, NUMAA *naas, l_int32 istart, l_int32 iend)
numaaJoin()
NUMA * numaCreateFromIArray(l_int32 *iarray, l_int32 size)
numaCreateFromIArray()
NUMA * numaMakeSequence(l_float32 startval, l_float32 increment, l_int32 size)
numaMakeSequence()
l_int32 numaSetParameters(NUMA *na, l_float32 startx, l_float32 delx)
numaSetParameters()
NUMA * numaCopy(NUMA *na)
numaCopy()
l_int32 numaAddToNumber(NUMA *na, l_int32 index, l_float32 val)
numaAddToNumber()
NUMA * numaAddBorder(NUMA *nas, l_int32 left, l_int32 right, l_float32 val)
numaAddBorder()
l_int32 numaInterpolateEqxInterval(l_float32 startx, l_float32 deltax, NUMA *nasy, l_int32 type, l_float32 x0, l_float32 x1, l_int32 npts, NUMA **pnax, NUMA **pnay)
numaInterpolateEqxInterval()
void numaDestroy(NUMA **pna)
numaDestroy()
l_int32 ptraInsert(L_PTRA *pa, l_int32 index, void *item, l_int32 shiftflag)
ptraInsert()
void ptraDestroy(L_PTRA **ppa, l_int32 freeflag, l_int32 warnflag)
ptraDestroy()
l_int32 numaReplaceNumber(NUMA *na, l_int32 index, l_float32 val)
numaReplaceNumber()
l_int32 numaGetMin(NUMA *na, l_float32 *pminval, l_int32 *piminloc)
numaGetMin()
l_float32 * numaGetFArray(NUMA *na, l_int32 copyflag)
numaGetFArray()
l_int32 numaSortGeneral(NUMA *na, NUMA **pnasort, NUMA **pnaindex, NUMA **pnainvert, l_int32 sortorder, l_int32 sorttype)
numaSortGeneral()
l_int32 numaIntegrateInterval(NUMA *nax, NUMA *nay, l_float32 x0, l_float32 x1, l_int32 npts, l_float32 *psum)
numaIntegrateInterval()
l_int32 numaaGetCount(NUMAA *naa)
numaaGetCount()
void * ptraRemove(L_PTRA *pa, l_int32 index, l_int32 flag)
ptraRemove()
NUMA * numaLogicalOp(NUMA *nad, NUMA *na1, NUMA *na2, l_int32 op)
numaLogicalOp()
l_int32 numaDifferentiateInterval(NUMA *nax, NUMA *nay, l_float32 x0, l_float32 x1, l_int32 npts, NUMA **pnadx, NUMA **pnady)
numaDifferentiateInterval()
NUMA * numaSortIndexAutoSelect(NUMA *nas, l_int32 sortorder)
numaSortIndexAutoSelect()
l_int32 numaInterpolateArbxInterval(NUMA *nax, NUMA *nay, l_int32 type, l_float32 x0, l_float32 x1, l_int32 npts, NUMA **pnadx, NUMA **pnady)
numaInterpolateArbxInterval()
l_int32 numaSetValue(NUMA *na, l_int32 index, l_float32 val)
numaSetValue()
l_int32 numaGetMode(NUMA *na, l_float32 *pval, l_int32 *pcount)
numaGetMode()
NUMA * numaClone(NUMA *na)
numaClone()
l_int32 numaGetMedian(NUMA *na, l_float32 *pval)
numaGetMedian()
l_int32 numaSimilar(NUMA *na1, NUMA *na2, l_float32 maxdiff, l_int32 *psimilar)
numaSimilar()
l_int32 numaGetIValue(NUMA *na, l_int32 index, l_int32 *pival)
numaGetIValue()
NUMA * numaInvert(NUMA *nad, NUMA *nas)
numaInvert()
l_int32 numaSortPair(NUMA *nax, NUMA *nay, l_int32 sortorder, NUMA **pnasx, NUMA **pnasy)
numaSortPair()