home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD2.mdf / c / library / dos / grafik / vifs / normprob.c < prev    next >
Encoding:
C/C++ Source or Header  |  1989-08-20  |  1.8 KB  |  85 lines

  1. /*
  2.  *    normprob.c  --  recompute ifs probabilities
  3.  *
  4.  *    4 june 1989  Olle Olsson
  5.  */
  6.  
  7. #include <stdlib.h>
  8. #include "ifs.h"
  9.  
  10. void normprob( tp0, size )
  11. transform *tp0;            /* the transformations */
  12. int size;            /* number of transformations */
  13. {
  14. int i;                /* tmp */
  15. transform *tp;            /* tmp */
  16. double psum;            /* sum */
  17.  
  18. /* make the probability sum == 1  (disregarding groups) */
  19.  
  20. /* add */
  21. for (tp = tp0, i = size, psum = 0; i > 0; ++tp, --i)
  22.     {
  23.     /* quietly adjust too small or negative values */
  24.      if (tp -> prob < MINPROB)
  25.         tp -> prob = MINPROB;
  26.  
  27.     psum += tp -> prob;
  28.     }
  29.  
  30. /* adjust */
  31. for (tp = tp0, i = size; i > 0; ++tp, --i)
  32.     tp -> prob /= psum;
  33. }
  34.  
  35. double grprob( tp0, size, group )
  36. transform *tp0;            /* the transformations */
  37. int size;            /* number of transformations */
  38. int group;            /* the group */
  39. {
  40. double gpr;            /* the sum */
  41. register transform *tp;        /* tmp */
  42.  
  43. /* get group prob. */
  44. for (gpr = 0, tp = tp0; size > 0; --size, ++tp)
  45.     if (tp -> group == group)
  46.         gpr += tp -> prob;
  47.  
  48. return (gpr);
  49. }
  50.  
  51. void normgprob( tp0, size, group, gprob )
  52. transform *tp0;            /* the transformations */
  53. int size;            /* number of transformations */
  54. int group;            /* the group */
  55. double gprob;            /* required probability */
  56. {
  57. int i;                /* tmp */
  58. transform *tp;            /* tmp */
  59. double psum;            /* sum */
  60. double afact;            /* adjustment factor */
  61.  
  62. /* "normalize" group: make the group probabiliy sum eqal to gprob */
  63.  
  64. /* add */
  65. for (tp = tp0, i = size, psum = 0; i > 0; ++tp, --i)
  66.     if (tp -> group == group)
  67.         {
  68.         /* quietly adjust too small or negative values */
  69.          if (tp -> prob < MINPROB)
  70.             tp -> prob = MINPROB;
  71.  
  72.         psum += tp -> prob;
  73.         }
  74.  
  75. /* adjust */
  76. afact = gprob / psum;
  77.  
  78. for (tp = tp0, i = size; i > 0; ++tp, --i)
  79.     if (tp -> group == group)
  80.         tp -> prob *= afact;
  81. }
  82.  
  83.  
  84.  
  85.