IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 5808


Ignore:
Timestamp:
Dec 18, 2005, 8:52:55 AM (21 years ago)
Author:
magnier
Message:

added masked orders and coeff errors

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/eam_rel9_b1/psLib/src/math/psMinimize.c

    r5801 r5808  
    1010 *  @author EAM, IfA
    1111 *
    12  *  @version $Revision: 1.147.4.1.2.1 $ $Name: not supported by cvs2svn $
    13  *  @date $Date: 2005-12-17 20:26:29 $
     12 *  @version $Revision: 1.147.4.1.2.2 $ $Name: not supported by cvs2svn $
     13 *  @date $Date: 2005-12-18 18:52:55 $
    1414 *
    1515 *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
     
    17751775    // XXX EAM : use temp pointers eg vB = B->data.F64 to save redirects
    17761776    // XXX EAM : this function is only valid for data vectors of F64
     1777
    17771778    for (int k = 0; k < f->n; k++) {
    17781779        if ((mask != NULL) && (mask->data.U8[k] && maskValue)) {
     
    17921793        }
    17931794        for (int i = 0; i < nTerm; i++) {
     1795            if (myPoly->mask[i])
     1796                continue;
    17941797            B->data.F64[i] += f->data.F64[k] * xSums->data.F64[i] * wt;
    17951798        }
    17961799
    17971800        // we could skip half of the array and assign at the end
    1798         // we must handle masked orders
     1801        // skip the masked orders, they get assigned (0 or 1) below
    17991802        for (int i = 0; i < nTerm; i++) {
     1803            if (myPoly->mask[i])
     1804                continue;
    18001805            for (int j = 0; j < nTerm; j++) {
     1806                if (myPoly->mask[j])
     1807                    continue;
    18011808                A->data.F64[i][j] += xSums->data.F64[i + j] * wt;
    18021809            }
    18031810        }
    18041811    }
     1812
     1813    // set masked elements in A,B appropriately
     1814    for (int i = 0; i < nTerm; i++) {
     1815        if (!myPoly->mask[i])
     1816            continue;
     1817        B->data.F64[i] = 0;
     1818        for (int j = 0; j < nTerm; j++) {
     1819            A->data.F64[i][j] = (i == j) ? 1 : 0;
     1820        }
     1821    }
     1822
    18051823
    18061824    // GaussJordan version
     
    18131831        for (int k = 0; k < nTerm; k++) {
    18141832            myPoly->coeff[k] = B->data.F64[k];
     1833            myPoly->coeffErr[k] = sqrt(A->data.F64[k][k]);
    18151834        }
    18161835    } else {
     
    18251844        for (int k = 0; k < nTerm; k++) {
    18261845            myPoly->coeff[k] = coeffs->data.F64[k];
     1846            // XXX EAM : LUD does not provide inverse(A)
     1847            // myPoly->coeffErr[k] = sqrt(A->data.F64[k][k]);
    18271848        }
    18281849        psFree(ALUD);
     
    21372158        for (int n = 0; n < nXterm; n++) {
    21382159            for (int m = 0; m < nYterm; m++) {
     2160                if (myPoly->mask[n][m])
     2161                    continue;
    21392162                B->data.F64[n+m*nXterm] += f->data.F64[k] * Sums->data.F64[n][m] * wt;
    21402163            }
     
    21432166        for (int i = 0; i < nXterm; i++) {
    21442167            for (int j = 0; j < nYterm; j++) {
     2168                if (myPoly->mask[i][j])
     2169                    continue;
    21452170                for (int n = 0; n < nXterm; n++) {
    21462171                    for (int m = 0; m < nYterm; m++) {
     2172                        if (myPoly->mask[n][m])
     2173                            continue;
    21472174                        A->data.F64[i+j*nXterm][n+m*nXterm] += Sums->data.F64[i+n][j+m] * wt;
    21482175                    }
     2176                }
     2177            }
     2178        }
     2179    }
     2180
     2181    for (int i = 0; i < nXterm; i++) {
     2182        for (int j = 0; j < nYterm; j++) {
     2183            if (!myPoly->mask[i][j])
     2184                continue;
     2185            ix = i+j*nXterm;
     2186            B->data.F64[ix] = 0;
     2187            for (int n = 0; n < nXterm; n++) {
     2188                for (int m = 0; m < nYterm; m++) {
     2189                    iy = n+m*nXterm;
     2190                    A->data.F64[ix][iy] = (ix == iy) ? 1 : 0;
    21492191                }
    21502192            }
     
    21592201        for (int m = 0; m < nYterm; m++) {
    21602202            myPoly->coeff[n][m] = B->data.F64[n+m*nXterm];
     2203            myPoly->coeffErr[n][m] = sqrt(A->data.F64[n+m*nXterm][n+m*nXterm]);
    21612204        }
    21622205    }
     
    26192662            for (int iy = 0; iy < nYterm; iy++) {
    26202663                for (int iz = 0; iz < nZterm; iz++) {
     2664                    if (myPoly->mask[ix][iy][iz])
     2665                        continue;
    26212666                    B->data.F64[ix+iy*nXterm+iz*nXterm*nYterm] += f->data.F64[k] * Sums[ix][iy][iz] * wt;
    26222667                }
     
    26272672            for (int iy = 0; iy < nYterm; iy++) {
    26282673                for (int iz = 0; iz < nZterm; iz++) {
     2674                    if (myPoly->mask[ix][iy][iz])
     2675                        continue;
    26292676                    for (int jx = 0; jx < nXterm; jx++) {
    26302677                        for (int jy = 0; jy < nYterm; jy++) {
    26312678                            for (int jz = 0; jz < nZterm; jz++) {
     2679                                if (myPoly->mask[jx][jy][jz])
     2680                                    continue;
    26322681                                A->data.F64[ix+iy*nXterm+iz*nXterm*nYterm][ix+iy*nXterm+iz*nXterm*nYterm] += Sums[ix+jx][iy+jy][iz+jz] * wt;
    26332682                            }
     
    26392688    }
    26402689
     2690    for (int ix = 0; ix < nXterm; ix++) {
     2691        for (int iy = 0; iy < nYterm; iy++) {
     2692            for (int iz = 0; iz < nZterm; iz++) {
     2693                if (!myPoly->mask[ix][iy][iz])
     2694                    continue;
     2695                nx = ix+iy*nXterm+iz*nXterm*nYterm;
     2696                B->data.F64[nx] = 0;
     2697                for (int jx = 0; jx < nXterm; jx++) {
     2698                    for (int jy = 0; jy < nYterm; jy++) {
     2699                        for (int jz = 0; jz < nZterm; jz++) {
     2700                            ny = jx+jy*nXterm+jz*nXterm*nYterm;
     2701                            A->data.F64[nx][ny] = (nx == ny) ? 1 : 0;
     2702                        }
     2703                    }
     2704                }
     2705            }
     2706        }
     2707    }
     2708
    26412709    // does the solution in place
    26422710    psGaussJordan (A, B);
     
    26472715            for (int iz = 0; iz < nZterm; iz++) {
    26482716                myPoly->coeff[ix][iy][iz] = B->data.F64[ix+iy*nXterm+iz*nXterm*nYterm];
     2717                myPoly->coeffErr[ix][iy][iz] = sqrt(B->data.F64[ix+iy*nXterm+iz*nXterm*nYterm][ix+iy*nXterm+iz*nXterm*nYterm]);
    26492718            }
    26502719        }
     
    30403109                for (int iz = 0; iz < nZterm; iz++) {
    30413110                    for (int it = 0; it < nTterm; it++) {
     3111                        if (myPoly->mask[ix][iy][iz][it])
     3112                            continue;
    30423113                        B->data.F64[ix+iy*nXterm+iz*nXterm*nYterm+it*nXterm*nYterm*nZterm] += f->data.F64[k] * Sums[ix][iy][iz][it] * wt;
    30433114                    }
     
    30503121                for (int iz = 0; iz < nZterm; iz++) {
    30513122                    for (int it = 0; it < nTterm; it++) {
     3123                        if (myPoly->mask[ix][iy][iz][it])
     3124                            continue;
    30523125                        for (int jx = 0; jx < nXterm; jx++) {
    30533126                            for (int jy = 0; jy < nYterm; jy++) {
    30543127                                for (int jz = 0; jz < nZterm; jz++) {
    30553128                                    for (int jt = 0; jt < nTterm; jt++) {
    3056                                         A->data.F64[ix+iy*nXterm+iz*nXterm*nYterm+it*nXterm*nYterm*nZterm][ix+iy*nXterm+iz*nXterm*nYterm+it*nXterm*nYterm*nZterm]
     3129                                        if (myPoly->mask[jx][jy][jz][jt])
     3130                                            continue;
     3131                                        A->data.F64[ix+iy*nXterm+iz*nXterm*nYterm+it*nXterm*nYterm*nZterm][jx+jy*nXterm+jz*nXterm*nYterm+jt*nXterm*nYterm*nZterm]
    30573132                                        += Sums[ix+jx][iy+jy][iz+jz][it+jt] * wt;
    30583133                                    }
     3134                                }
     3135                            }
     3136                        }
     3137                    }
     3138                }
     3139            }
     3140        }
     3141    }
     3142
     3143    for (int ix = 0; ix < nXterm; ix++) {
     3144        for (int iy = 0; iy < nYterm; iy++) {
     3145            for (int iz = 0; iz < nZterm; iz++) {
     3146                for (int it = 0; it < nTterm; it++) {
     3147                    if (!myPoly->mask[ix][iy][iz][it])
     3148                        continue;
     3149                    nx = ix+iy*nXterm+iz*nXterm*nYterm+it*nXterm*nYterm*nZterm;
     3150                    B->data.F64[nx] = 0;
     3151                    for (int jx = 0; jx < nXterm; jx++) {
     3152                        for (int jy = 0; jy < nYterm; jy++) {
     3153                            for (int jz = 0; jz < nZterm; jz++) {
     3154                                for (int jt = 0; jt < nTterm; jt++) {
     3155                                    ny = jx+jy*nXterm+jz*nXterm*nYterm+jt*nXterm*nYterm*nZterm;
     3156                                    A->data.F64[nx][ny] = (nx == ny) ? 1 : 0;
    30593157                                }
    30603158                            }
Note: See TracChangeset for help on using the changeset viewer.