IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 41470 for trunk


Ignore:
Timestamp:
Jan 12, 2021, 4:16:47 PM (6 years ago)
Author:
eugene
Message:

update fit1d_irls to include priors on the parameters

Location:
trunk/Ohana/src/opihi
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/Ohana/src/opihi/cmd.data/fit1d.c

    r31160 r41470  
    55  double **c, **b, *s, X, Y, dY, dY2;
    66  double ClipNSigma, mean, sigma, maxsigma;
    7   int i, j, nterm, mterm, order, Npt, Nmask;
     7  int i, j, Npt, Nmask;
    88  int N, Weight, Quiet, ClipNiter;
    99  Vector *xvec, *yvec, *dyvec;
     
    6666
    6767  /* nterm is number of polynomial terms, starting at x^0 */
    68   order = atof (argv[3]);
    69   nterm = order + 1;
    70   mterm = 2*nterm;
     68  int order = atof (argv[3]);
     69  int nterm = order + 1;
     70  int mterm = 2*order + 1;
    7171
    7272  ALLOCATE (yfit, opihi_flt, xvec[0].Nelements);
  • trunk/Ohana/src/opihi/cmd.data/fit1d_irls.c

    r39640 r41470  
    1010double weight_cauchy (double x);
    1111double VectorFractionInterpolate (double *values, float fraction, int Npts);
     12
     13// using file-globals to carry values into 'fit_least_squares'
     14double *priorValue = NULL;
     15double *priorStdev = NULL;
    1216
    1317int fit1d_irls (int argc, char **argv) {
     
    7377    UseMean = FALSE;
    7478  }
     79  int UsePriors = FALSE;
     80  if ((N = get_argument (argc, argv, "-use-priors"))) {
     81    remove_argument (N, &argc, argv);
     82    UsePriors = TRUE;
     83  }
    7584
    7685  if ((argc != 4) || !dyvec) {
    7786    // require a y error value
    78     gprint (GP_ERR, "USAGE: fit1d x y order -dy wt [-quiet/-q] [-wt wtOut] [-yfit yfit] [-mask maskOut]\n");
     87    gprint (GP_ERR, "USAGE: fit1d_irls x y order [-dy wt] [-quiet/-q] [-wt wtOut] [-yfit yfit] [-mask maskOut] [-Nboot N] [-max-iterations N] [-weight-threshold f] [-use-median] [-use-priors]\n");
     88    gprint (GP_ERR, "  [-dy wt]        : optional error vector (use value of 1 by default)\n");
     89    gprint (GP_ERR, "  [-quiet/-q]     : reduce verbosity\n");
     90    gprint (GP_ERR, "  [-wt wtOut]     : save the weights in supplied vector\n");
     91    gprint (GP_ERR, "  [-yfit yfit]    : save the fitted values in supplied vector\n");
     92    gprint (GP_ERR, "  [-mask maskOut] : save the masked / unmasked state (weight below threshold\n");
     93    gprint (GP_ERR, "  [-Nboot N]      : number of bootstrap samples\n");
     94    gprint (GP_ERR, "  [-max-iterations N] : max number of iterations\n");
     95    gprint (GP_ERR, "  [-weight-threshold f] : limit for masked values\n");
     96    gprint (GP_ERR, "  [-use-median]   : use median (as opposed to mean) to calculate weight threshold\n");
     97    gprint (GP_ERR, "  [-use-priors]   : include priors for parameters (specified as prior value $P0v and stdev $dP0, $P1v, $dP1, etc).  Unspecified or NAN values are ignored.\n");
    7998    return (FALSE);
    8099  }
     
    100119  order = atof (argv[3]);
    101120  nterm = order + 1;
    102   mterm = 2*nterm;
     121  mterm = 2*order + 1;
    103122
    104123  ALLOCATE_PTR (yoff, opihi_flt, xvec[0].Nelements);
     
    119138  }
    120139
     140  if (UsePriors) {
     141    ALLOCATE (priorValue, double, nterm);
     142    ALLOCATE (priorStdev, double, nterm);
     143    for (i = 0; i < nterm; i++) {
     144      int isFound;
     145      double tmpValue;
     146      snprintf (name, 64, "P%dv", i);
     147      tmpValue = get_double_variable (name, &isFound);
     148      priorValue[i] = isFound ? tmpValue : NAN;
     149      snprintf (name, 64, "dP%d", i);
     150      tmpValue = get_double_variable (name, &isFound);
     151      priorStdev[i] = isFound ? tmpValue : NAN;
     152      if (!isFound) priorValue[i] = NAN; // need both Pnv and dPn
     153    }
     154  }
     155
    121156  // define initial weights as 1.0
    122157  for (i = 0; i < xvec[0].Nelements; i++) {
     
    137172    }
    138173
     174    // save this solution
     175    for (i = 0; i < nterm; i++) {
     176      b_old[i][0] = b[i][0];
     177    }
     178
    139179    if (!fit_least_squares (s, b, c, nterm, mterm, xvec[0].elements.Flt, yvec[0].elements.Flt, dyvec[0].elements.Flt, wt, NULL, xvec[0].Nelements)) {
    140       // restore
     180      // restore the saved solution
    141181      for (i = 0; i < nterm; i++) {
    142182        b[i][0] = b_old[i][0];
    143183      }
    144184      break;
    145     }
    146 
    147     // save this solution
    148     for (i = 0; i < nterm; i++) {
    149       b_old[i][0] = b[i][0];
    150185    }
    151186
     
    172207  return TRUE; */
    173208
     209  // save the solution. we re-use b[][] below in the bootstrap resampling
    174210  for (i = 0; i < nterm; i++) {
    175211    b_old[i][0] = b[i][0];
    176212  }
    177 
    178213
    179214  // calculate the weight thresholds to mask the bad points:
     
    307342  free (dysample);
    308343
     344  if (priorValue) {
     345    free (priorValue); priorValue = NULL;
     346    free (priorStdev); priorStdev = NULL;
     347  }
     348
    309349  return (TRUE);
    310350
     
    356396    for (j = 0; j < nterm; j++) {
    357397      c[i][j] = s[i + j];
     398      if (priorValue && (i == j)) {
     399        if (!isnan(priorValue[i])) {
     400          c[i][i] += 1.0 / SQ(priorStdev[i]);
     401          b[i][0] += priorValue[i] / SQ(priorStdev[i]);
     402        }
     403      }
    358404    }
    359405  }
  • trunk/Ohana/src/opihi/cmd.data/test/fit1d_irls.sh

    r39926 r41470  
    346346 end
    347347end
     348
     349macro try.priors
     350 create x 0 100
     351 set y = 5.2 + 2.3*x
     352 set ytru = 5.2 + 2.3*x
     353 gaussdev dyoff ytru[] 0.0 5.0
     354 set dy = 5.0 + zero(ytru)
     355 set yobs = ytru + dyoff
     356 yobs[1] = 210
     357 $P0v = 5.0
     358 $dP0 = 0.5
     359
     360 fit1d_irls x yobs 1 -dy dy -yfit yfit -max-iterations 0 -use-priors
     361# fit1d_irls x yobs 1 -dy dy -yfit yfit -max-iterations 5
     362# fit1d_irls  x yobs 1 -dy dy -yfit yfit -max-iterations 0
     363
     364 lim x yobs; clear; box;
     365 plot -c blue -x line -lw 2 x ytru
     366 plot x yobs -pt cir -op 0.5
     367 plot -c red -x line -lw 2 x yfit -op 0.5
     368end
     369 
     370macro run.priors
     371 create x 0 100
     372 set y = 5.2 + 2.3*x
     373 set ytru = 5.2 + 2.3*x
     374 gaussdev dyoff ytru[] 0.0 5.0
     375 set dy = 5.0 + zero(ytru)
     376 set yobs = ytru + dyoff
     377
     378 $P0v = NAN
     379 $P1v = NAN
     380
     381 $n = 0
     382
     383 if ($n == 0)
     384   $P0v = 4.5
     385   $dP0 = 1.0
     386 end
     387 if ($n == 1)
     388   $P1v = 2.3
     389   $dP1 = 0.5
     390 end
     391
     392 set yobsS = yobs
     393
     394 delete -q C0norm C0irls C0prio C0irpi
     395 delete -q N0norm N0irls N0prio N0irpi
     396 for i 0 5000
     397
     398   set yobs = yobsS
     399   for j 0 10
     400     $Npt = int(yobs[]*rnd(0))
     401     yobs[$Npt] = 1000*rnd(0) - 500
     402   end
     403   fit1d_irls -q x yobs 1 -dy dy -yfit yfit -mask ymsk -max-iterations 0
     404   concat $C$n C0norm; vstat -q ymsk; concat $TOTAL N0norm
     405   fit1d_irls -q x yobs 1 -dy dy -yfit yfit -mask ymsk -max-iterations 0 -use-priors
     406   concat $C$n C0prio; vstat -q ymsk; concat $TOTAL N0prio
     407   fit1d_irls -q x yobs 1 -dy dy -yfit yfit -mask ymsk -max-iterations 5
     408   concat $C$n C0irls; vstat -q ymsk; concat $TOTAL N0irls
     409   fit1d_irls -q x yobs 1 -dy dy -yfit yfit -mask ymsk -max-iterations 5 -use-priors
     410   concat $C$n C0irpi; vstat -q ymsk; concat $TOTAL N0irpi
     411 end
     412
     413  histogram C0norm nCnorm -30 30 0.25 -range dC
     414  histogram C0prio nCprio -30 30 0.25 -range dC
     415  histogram C0irls nCirls -30 30 0.25 -range dC
     416  histogram C0irpi nCirpi -30 30 0.25 -range dC
     417
     418  lim dC nCirls; clear; box;
     419
     420  plot dC nCnorm -x hist -op 0.6 -lw 3 -c black  ; vstat C0norm
     421  plot dC nCprio -x hist -op 0.6 -lw 3 -c blue   ; vstat C0prio
     422  plot dC nCirls -x hist -op 0.6 -lw 3 -c red    ; vstat C0irls
     423  plot dC nCirpi -x hist -op 0.6 -lw 3 -c blue60 ; vstat C0irpi
     424
     425  if ($n == 0)
     426    line -c red -lt dot $P0v 0 to $P0v 1000
     427    line -c blue -lt dot 5.2 0 to 5.2 1000
     428  else
     429    line -c red -lt dot $P1v 0 to $P1v 1000
     430    line -c blue -lt dot 2.3 0 to 2.3 1000
     431  end
     432end
     433 
     434macro run.2dpriors.fixmeas
     435 $C0tru = +3
     436 $C1tru = -4
     437 $Sigma =  5
     438
     439 create x -25 25
     440 set ytru = $C0tru + $C1tru*x
     441 gaussdev yoff ytru[] 0.0 $Sigma
     442
     443 set dy = $Sigma + zero(ytru)
     444 set yobs = ytru + yoff
     445
     446 $P0v = NAN
     447 $P1v = NAN
     448
     449 $P0v = $C0tru + 0.5
     450 $dP0 = 1.0
     451
     452 $P1v = $C1tru + 0.2
     453 $dP1 = 0.5
     454
     455 set yobsSave = yobs
     456
     457 delete -q N0norm N0irls N0prio N0irpi
     458 delete -q C0norm C0irls C0prio C0irpi
     459 delete -q C1norm C1irls C1prio C1irpi
     460
     461 for i 0 5000
     462
     463   set yobs = yobsSave
     464
     465   # inject outliers
     466   for j 0 10
     467     $Npt = int(yobs[]*rnd(0))
     468     yobs[$Npt] = 1000*rnd(0) - 500
     469   end
     470
     471   fit1d_irls -q x yobs 1 -dy dy -yfit yfit -mask ymsk -max-iterations 0
     472   concat $C0 C0norm; concat $C1 C1norm; vstat -q ymsk; concat $TOTAL N0norm
     473
     474   fit1d_irls -q x yobs 1 -dy dy -yfit yfit -mask ymsk -max-iterations 0 -use-priors
     475   concat $C0 C0prio; concat $C1 C1prio; vstat -q ymsk; concat $TOTAL N0prio
     476
     477   fit1d_irls -q x yobs 1 -dy dy -yfit yfit -mask ymsk -max-iterations 5
     478   concat $C0 C0irls; concat $C1 C1irls; vstat -q ymsk; concat $TOTAL N0irls
     479
     480   fit1d_irls -q x yobs 1 -dy dy -yfit yfit -mask ymsk -max-iterations 5 -use-priors
     481   concat $C0 C0irpi; concat $C1 C1irpi; vstat -q ymsk; concat $TOTAL N0irpi
     482 end
     483
     484 histogram C0norm nC0norm -30 30 0.25 -range dC
     485 histogram C0prio nC0prio -30 30 0.25 -range dC
     486 histogram C0irls nC0irls -30 30 0.25 -range dC
     487 histogram C0irpi nC0irpi -30 30 0.25 -range dC
     488
     489 histogram C1norm nC1norm -30 30 0.25 -range dC
     490 histogram C1prio nC1prio -30 30 0.25 -range dC
     491 histogram C1irls nC1irls -30 30 0.25 -range dC
     492 histogram C1irpi nC1irpi -30 30 0.25 -range dC
     493
     494 dev -n 0
     495 lim dC nC0irpi; clear; box;
     496 line -c red  -lw 2 -lt dot $P0v   0 to $P0v   1000
     497 line -c blue -lw 2 -lt dot $C0tru 0 to $C0tru 1000
     498 plot dC nC0norm -x hist -op 0.6 -lw 3 -c black  ; vstat C0norm
     499 plot dC nC0prio -x hist -op 0.6 -lw 3 -c blue   ; vstat C0prio
     500 plot dC nC0irls -x hist -op 0.6 -lw 3 -c red    ; vstat C0irls
     501 plot dC nC0irpi -x hist -op 0.6 -lw 3 -c blue60 ; vstat C0irpi
     502
     503 dev -n 1
     504 lim dC nC1irpi; clear; box;
     505 line -c red  -lw 2 -lt dot $P1v   0 to $P1v   1000
     506 line -c blue -lw 2 -lt dot $C1tru 0 to $C1tru 1000
     507 plot dC nC1norm -x hist -op 0.6 -lw 3 -c black  ; vstat C1norm
     508 plot dC nC1prio -x hist -op 0.6 -lw 3 -c blue   ; vstat C1prio
     509 plot dC nC1irls -x hist -op 0.6 -lw 3 -c red    ; vstat C1irls
     510 plot dC nC1irpi -x hist -op 0.6 -lw 3 -c blue60 ; vstat C1irpi
     511
     512end
     513 
     514macro run.2dpriors
     515 $C0tru = +3
     516 $C1tru = -4
     517 $Sigma =  5
     518
     519 create x -25 25
     520 set ytru = $C0tru + $C1tru*x
     521
     522 set dy = $Sigma + zero(ytru)
     523
     524 $P0v = NAN
     525 $P1v = NAN
     526
     527 $P0v = $C0tru + 0.5
     528 $dP0 = 1.0
     529
     530 $P1v = $C1tru + 0.2
     531 $dP1 = 0.5
     532
     533
     534 delete -q N0norm N0irls N0prio N0irpi
     535 delete -q C0norm C0irls C0prio C0irpi
     536 delete -q C1norm C1irls C1prio C1irpi
     537
     538 for i 0 5000
     539
     540   gaussdev yoff ytru[] 0.0 $Sigma
     541   set yobs = ytru + yoff
     542
     543   # inject outliers
     544   for j 0 10
     545     $Npt = int(yobs[]*rnd(0))
     546     yobs[$Npt] = 1000*rnd(0) - 500
     547   end
     548
     549   fit1d_irls -q x yobs 1 -dy dy -yfit yfit -mask ymsk -max-iterations 0
     550   concat $C0 C0norm; concat $C1 C1norm; vstat -q ymsk; concat $TOTAL N0norm
     551
     552   fit1d_irls -q x yobs 1 -dy dy -yfit yfit -mask ymsk -max-iterations 0 -use-priors
     553   concat $C0 C0prio; concat $C1 C1prio; vstat -q ymsk; concat $TOTAL N0prio
     554
     555   fit1d_irls -q x yobs 1 -dy dy -yfit yfit -mask ymsk -max-iterations 5
     556   concat $C0 C0irls; concat $C1 C1irls; vstat -q ymsk; concat $TOTAL N0irls
     557
     558   fit1d_irls -q x yobs 1 -dy dy -yfit yfit -mask ymsk -max-iterations 5 -use-priors
     559   concat $C0 C0irpi; concat $C1 C1irpi; vstat -q ymsk; concat $TOTAL N0irpi
     560 end
     561end
     562
     563macro plot.2dpriors
     564
     565 if (1)
     566   histogram C0norm nC0norm -30 30 0.25 -range dC
     567   histogram C0prio nC0prio -30 30 0.25 -range dC
     568   histogram C0irls nC0irls -30 30 0.25 -range dC
     569   histogram C0irpi nC0irpi -30 30 0.25 -range dC
     570   
     571   histogram C1norm nC1norm -30 30 0.25 -range dC
     572   histogram C1prio nC1prio -30 30 0.25 -range dC
     573   histogram C1irls nC1irls -30 30 0.25 -range dC
     574   histogram C1irpi nC1irpi -30 30 0.25 -range dC
     575   
     576   dev -n 0
     577   lim dC nC0irpi; clear; box;
     578   line -c red  -lw 2 -lt dot $P0v   0 to $P0v   1000
     579   line -c blue -lw 2 -lt dot $C0tru 0 to $C0tru 1000
     580   plot dC nC0norm -x hist -op 0.6 -lw 3 -c black  ; vstat C0norm
     581   plot dC nC0prio -x hist -op 0.6 -lw 3 -c blue         ; vstat C0prio
     582   plot dC nC0irls -x hist -op 0.6 -lw 3 -c red    ; vstat C0irls
     583   plot dC nC0irpi -x hist -op 0.6 -lw 3 -c blue60 ; vstat C0irpi
     584   
     585   dev -n 1
     586   lim dC nC1irpi; clear; box;
     587   line -c red  -lw 2 -lt dot $P1v   0 to $P1v   1000
     588   line -c blue -lw 2 -lt dot $C1tru 0 to $C1tru 1000
     589   plot dC nC1norm -x hist -op 0.6 -lw 3 -c black  ; vstat C1norm
     590   plot dC nC1prio -x hist -op 0.6 -lw 3 -c blue         ; vstat C1prio
     591   plot dC nC1irls -x hist -op 0.6 -lw 3 -c red    ; vstat C1irls
     592   plot dC nC1irpi -x hist -op 0.6 -lw 3 -c blue60 ; vstat C1irpi
     593 end
     594
     595 dev -n 2
     596 $C0range = 50; $C1range = 5
     597 resize 1800 1800
     598 clear -s
     599 section a0 0.0 0.0 0.5 0.5
     600 section a1 0.5 0.0 0.5 0.5
     601 section a2 0.0 0.5 0.5 0.5
     602 section a3 0.5 0.5 0.5 0.5
     603
     604 section a0; subplot.2dprior C0norm C1norm
     605 section a1; subplot.2dprior C0prio C1prio
     606 section a2; subplot.2dprior C0irls C1irls
     607 section a3; subplot.2dprior C0irpi C1irpi
     608
     609 dev -n 3
     610 $C0range = 8; $C1range = 2
     611 resize 1800 1800
     612 clear -s
     613 section a0 0.0 0.0 0.5 0.5
     614 section a1 0.5 0.0 0.5 0.5
     615 section a2 0.0 0.5 0.5 0.5
     616 section a3 0.5 0.5 0.5 0.5
     617
     618 section a0; subplot.2dprior C0norm C1norm
     619 section a1; subplot.2dprior C0prio C1prio
     620 section a2; subplot.2dprior C0irls C1irls
     621 section a3; subplot.2dprior C0irpi C1irpi
     622end
     623
     624macro subplot.2dprior
     625 if ($0 != 3)
     626   echo "USAGE: subplot.2dprior (vec) (vec)"
     627   break
     628 end
     629   
     630 lim {$C0tru - $C0range} {$C0tru + $C0range} {$C1tru - $C1range} {$C1tru + $C1range}
     631 box; label -x C0 -y C1
     632
     633 plot -op 0.1 -pt cir -sz 1 -c blue $1 $2
     634
     635 line -c blue -lw 2 -lt dot $C0tru -1000 to $C0tru 1000
     636 line -c red  -lw 2 -lt dot $P0v   -1000 to $P0v   1000
     637 line -c blue -lw 2 -lt dot -1000 $C1tru to 1000 $C1tru
     638 line -c red  -lw 2 -lt dot -1000   $P1v to 1000 $P1v
     639end
  • trunk/Ohana/src/opihi/test/tests.sh

    r9360 r41470  
    8989    else
    9090      $Npass ++
     91      if ($VERBOSE > 2)
     92        echo " $tests:$Tk : success"
     93      end
    9194    end
    9295    $Ntest ++
Note: See TracChangeset for help on using the changeset viewer.