Changeset 41470
- Timestamp:
- Jan 12, 2021, 4:16:47 PM (6 years ago)
- Location:
- trunk/Ohana/src/opihi
- Files:
-
- 4 edited
-
cmd.data/fit1d.c (modified) (2 diffs)
-
cmd.data/fit1d_irls.c (modified) (8 diffs)
-
cmd.data/test/fit1d_irls.sh (modified) (1 diff)
-
test/tests.sh (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Ohana/src/opihi/cmd.data/fit1d.c
r31160 r41470 5 5 double **c, **b, *s, X, Y, dY, dY2; 6 6 double ClipNSigma, mean, sigma, maxsigma; 7 int i, j, nterm, mterm, order,Npt, Nmask;7 int i, j, Npt, Nmask; 8 8 int N, Weight, Quiet, ClipNiter; 9 9 Vector *xvec, *yvec, *dyvec; … … 66 66 67 67 /* 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; 71 71 72 72 ALLOCATE (yfit, opihi_flt, xvec[0].Nelements); -
trunk/Ohana/src/opihi/cmd.data/fit1d_irls.c
r39640 r41470 10 10 double weight_cauchy (double x); 11 11 double VectorFractionInterpolate (double *values, float fraction, int Npts); 12 13 // using file-globals to carry values into 'fit_least_squares' 14 double *priorValue = NULL; 15 double *priorStdev = NULL; 12 16 13 17 int fit1d_irls (int argc, char **argv) { … … 73 77 UseMean = FALSE; 74 78 } 79 int UsePriors = FALSE; 80 if ((N = get_argument (argc, argv, "-use-priors"))) { 81 remove_argument (N, &argc, argv); 82 UsePriors = TRUE; 83 } 75 84 76 85 if ((argc != 4) || !dyvec) { 77 86 // 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"); 79 98 return (FALSE); 80 99 } … … 100 119 order = atof (argv[3]); 101 120 nterm = order + 1; 102 mterm = 2* nterm;121 mterm = 2*order + 1; 103 122 104 123 ALLOCATE_PTR (yoff, opihi_flt, xvec[0].Nelements); … … 119 138 } 120 139 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 121 156 // define initial weights as 1.0 122 157 for (i = 0; i < xvec[0].Nelements; i++) { … … 137 172 } 138 173 174 // save this solution 175 for (i = 0; i < nterm; i++) { 176 b_old[i][0] = b[i][0]; 177 } 178 139 179 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 141 181 for (i = 0; i < nterm; i++) { 142 182 b[i][0] = b_old[i][0]; 143 183 } 144 184 break; 145 }146 147 // save this solution148 for (i = 0; i < nterm; i++) {149 b_old[i][0] = b[i][0];150 185 } 151 186 … … 172 207 return TRUE; */ 173 208 209 // save the solution. we re-use b[][] below in the bootstrap resampling 174 210 for (i = 0; i < nterm; i++) { 175 211 b_old[i][0] = b[i][0]; 176 212 } 177 178 213 179 214 // calculate the weight thresholds to mask the bad points: … … 307 342 free (dysample); 308 343 344 if (priorValue) { 345 free (priorValue); priorValue = NULL; 346 free (priorStdev); priorStdev = NULL; 347 } 348 309 349 return (TRUE); 310 350 … … 356 396 for (j = 0; j < nterm; j++) { 357 397 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 } 358 404 } 359 405 } -
trunk/Ohana/src/opihi/cmd.data/test/fit1d_irls.sh
r39926 r41470 346 346 end 347 347 end 348 349 macro 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 368 end 369 370 macro 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 432 end 433 434 macro 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 512 end 513 514 macro 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 561 end 562 563 macro 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 622 end 623 624 macro 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 639 end -
trunk/Ohana/src/opihi/test/tests.sh
r9360 r41470 89 89 else 90 90 $Npass ++ 91 if ($VERBOSE > 2) 92 echo " $tests:$Tk : success" 93 end 91 94 end 92 95 $Ntest ++
Note:
See TracChangeset
for help on using the changeset viewer.
