Advertisement
x89codered89x

probability.h

Apr 19th, 2014
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 12.14 KB | None | 0 0
  1. #ifndef PROBABILITY_H
  2. #define PROBABILITY_H
  3.  
  4. //includes
  5. #include <cmath>
  6. #include <string>
  7. #include <sstream>
  8. #include "mystringtools.h"
  9.  
  10. //Using linspace interpolation
  11.  
  12. //matrix indexing:   0 <= m <= M
  13. //                   0 <= n <= N
  14.  
  15. //density or domain indexing:   -mCenter <= m <= M-nCenter
  16. //                              -nCenter <= n <= N-nCenter
  17.  
  18. class Density{
  19.     public:
  20.         Density(int n,int m):  
  21.                                 matrixPtr(NULL),
  22.                                 rowPtr(NULL),   //Sum over all Columns
  23.                                 colPtr(NULL),
  24.                                 expectedNgivenM_ptr(NULL),
  25.                                 expectedNNgivenM_ptr(NULL),
  26.                                 expectedMgivenN_ptr(NULL),
  27.                                 expectedMMgivenN_ptr(NULL),
  28.                                 nCenter(n),
  29.                                 mCenter(m),
  30.                                 totalWeight(1.f), /*inital weight of uniform distribution (equivalent)
  31.                                                 to one sampling point */
  32.                                 M(2*m+1),
  33.                                 N(2*n+1),
  34.                                 expectedN(0),
  35.                                 expectedM(0),
  36.                                 expectedMN(0),
  37.                                 expectedNN(0),
  38.                                 expectedMM(0)
  39.         {
  40.  
  41.             matrixPtr = new float*[M];
  42.             for (m = 0; m < M; m++ ){
  43.                 dynamicallyExtendVector(&matrixPtr[m],N,0,1.f/float(M*N));
  44.             }
  45.  
  46.             dynamicallyExtendVector(&rowPtr,N,0,1.f/float(N));
  47.             dynamicallyExtendVector(&colPtr,M,0,1.f/float(M));
  48.  
  49.             initMoments();
  50.         }
  51.  
  52.         /*
  53.             Domain Indexing
  54.         */
  55.         float prob_x1_x2(float m, float n) const {
  56.             // std::cout << "m: " << m << std::endl;
  57.             // std::cout << "n: " << n << std::endl;
  58.  
  59.             int nCeil = n+1;
  60.             int nFloor = n;
  61.             int mCeil = m+1;
  62.             int mFloor = m;
  63.  
  64.             // std::cout << "nCeil: " << nCeil << std::endl;
  65.             // std::cout << "mCeil: " << mCeil << std::endl;
  66.             // std::cout << "nFloor: " << nFloor << std::endl;
  67.             // std::cout << "mFloor: " << mFloor << std::endl;
  68.  
  69.             // std::cout << "(nCeil-n): " << nCeil-n << std::endl;
  70.             // std::cout << "(n-nFloor): " << n-nFloor << std::endl;
  71.             // std::cout << "(mCeil-m): " << mCeil-m << std::endl;
  72.             // std::cout << "(m-mFloor): " << m-mFloor << std::endl;
  73.            
  74.  
  75.             float prob = matrixPtr[mCeil][nCeil]*(m-mFloor)*(n-nFloor);
  76.             prob +=  matrixPtr[mCeil][nFloor]*(m-mFloor)*(nCeil-n);
  77.             prob +=  matrixPtr[mFloor][nCeil]*(mCeil-m)*(n-nFloor);
  78.             prob +=  matrixPtr[mFloor][nFloor]*(mCeil-m)*(nCeil-n);
  79.  
  80.             return prob/totalWeight;
  81.         }
  82.         float prob_x1(float m) const {
  83.             if (m <= -mCenter-1 || m >= M - mCenter + 1)   
  84.                 return 0;
  85.             else {
  86.                 int mCeil = m+1;
  87.                 int mFloor = m;
  88.                 if (m <= -mCenter)
  89.                     return rowPtr[mFloor+mCenter]*(mCeil-m)/totalWeight;
  90.                 else if (-mCenter < m && m <= M - mCenter){
  91.                     return ( rowPtr[mCeil+mCenter]*(m-mFloor) + rowPtr[mFloor+mCenter]*(mCeil-m) )/totalWeight;
  92.                 } else if (m > M-mCenter )
  93.                     return rowPtr[mCeil+mCenter]*(m-mFloor)/totalWeight;
  94.             }
  95.         }
  96.  
  97.         float prob_x2(float n) const {
  98.             if (n <= -nCenter-1 || n >= N - nCenter + 1)   
  99.                 return 0;
  100.             else {
  101.                 int nCeil = n+1;
  102.                 int nFloor = n;
  103.                 if (n <= -nCenter)
  104.                     return rowPtr[nFloor+nCenter]*(nCeil-n)/totalWeight;
  105.                 else if (-nCenter < n && n <= N - nCenter){
  106.                     return ( rowPtr[nCeil+nCenter]*(n-nFloor) + rowPtr[nFloor+nCenter]*(nCeil-n) )/totalWeight;
  107.                 } else if (n > N-nCenter )
  108.                     return rowPtr[nCeil+nCenter]*(n-nFloor)/totalWeight;
  109.             }
  110.         }
  111.  
  112.         float prob_x1_given_x2(float m, float nGiven) const {
  113.             float x2_prob = prob_x2(nGiven);
  114.  
  115.             if (x2_prob > 0.f)
  116.                 return prob_x1_x2(m,nGiven)/x2_prob;
  117.  
  118.             return 0.f;
  119.         }
  120.  
  121.         float prob_x2_given_x1(float mGiven, float n) const {
  122.             float x1_prob = prob_x1(n);
  123.  
  124.             if (x1_prob > 0.f)
  125.                 return prob_x1_x2(mGiven,n)/x1_prob;
  126.             else
  127.  
  128.             return 0.f;
  129.         }
  130.  
  131.         void addPointToDensity(float m, float n, int weight = 1.f){
  132.             // std::cout << "m: " << m << std::endl;
  133.             // std::cout << "n: " << n << std::endl;
  134.  
  135.             int nCeil = n+1;
  136.             int nFloor = n;
  137.             int mCeil = m+1;
  138.             int mFloor = m;
  139.  
  140.             // std::cout << "nCeil: " << nCeil << std::endl;
  141.             // std::cout << "mCeil: " << mCeil << std::endl;
  142.             // std::cout << "nFloor: " << nFloor << std::endl;
  143.             // std::cout << "mFloor: " << mFloor << std::endl;
  144.  
  145.             // std::cout << "(nCeil-n): " << nCeil-n << std::endl;
  146.             // std::cout << "(n-nFloor): " << n-nFloor << std::endl;
  147.             // std::cout << "(mCeil-m): " << mCeil-m << std::endl;
  148.             // std::cout << "(m-mFloor): " << m-mFloor << std::endl;       
  149.  
  150.             addCellToMatrix(mCeil+mCenter,  nCeil+nCenter,  weight*(m-mFloor)*(n-nFloor));
  151.             addCellToMatrix(mCeil+mCenter,  nFloor+nCenter, weight*(m-mFloor)*(nCeil-n));
  152.             addCellToMatrix(mFloor+mCenter, nCeil+nCenter,  weight*(mCeil-m)*(n-nFloor));
  153.             addCellToMatrix(mFloor+mCenter, nFloor+nCenter, weight*(mCeil-m)*(nCeil-n));
  154.         }
  155.  
  156.         /*
  157.             DOMAIN INDEXING
  158.         */
  159.         void extendDomainToCell(int m, int n) {
  160.             if (n < -nCenter)
  161.                 extendDomainHorizontally(n+nCenter);//negative
  162.             else if (n > N-nCenter)
  163.                 extendDomainHorizontally(n+nCenter-N);//positive
  164.  
  165.             if (m < -mCenter)
  166.                 extendDomainVertically(m+mCenter);//negative
  167.             else if (m > M-mCenter)
  168.                 extendDomainVertically(m+mCenter-M);//positive
  169.         }
  170.  
  171.         /*
  172.             MATRIX INDEXING
  173.         */
  174.         void addCellToMatrix(int m, int n, float weight = 1.f){
  175.             //fix
  176.  
  177.             float nCentralized = n-nCenter;
  178.             float mCentralized = m-mCenter;
  179.             float nCentralizedMoment = nCentralized*weight;
  180.             float mCentralizedMoment = mCentralized*weight;
  181.            
  182.  
  183.             extendDomainToCell(mCentralized, nCentralized);
  184.             //std::cout << "m: " << m << ", n: " << n << ", weight: " << weight << std::endl;
  185.  
  186.             rowPtr[n] += weight;
  187.             colPtr[m] += weight;
  188.             totalWeight += weight;
  189.             matrixPtr[m][n] += weight;
  190.            
  191.             expectedM += mCentralizedMoment;
  192.             expectedN += nCentralizedMoment;
  193.  
  194.             expectedMN += mCentralized*nCentralizedMoment;
  195.             expectedNN += nCentralized*nCentralizedMoment;
  196.             expectedMM += mCentralized*mCentralizedMoment;
  197.  
  198.             //new
  199.             expectedNgivenM_ptr[m] += nCentralizedMoment;
  200.             expectedNNgivenM_ptr[m] += nCentralized*nCentralizedMoment;
  201.  
  202.             expectedMgivenN_ptr[n] += mCentralizedMoment;
  203.             expectedMMgivenN_ptr[n] += mCentralized*mCentralizedMoment;
  204.         }
  205.        
  206.         void extendDomainHorizontally(int horizontalExtension){
  207.             if (horizontalExtension == 0) return;
  208.  
  209.             dynamicallyExtendVector(&rowPtr,horizontalExtension,N,0.f);
  210.             dynamicallyExtendVector(&expectedMgivenN_ptr,horizontalExtension,N,0.f);
  211.             dynamicallyExtendVector(&expectedMMgivenN_ptr,horizontalExtension,N,0.f);
  212.  
  213.             for (int m = 0; m < M; m++){
  214.                 dynamicallyExtendVector(&matrixPtr[m],horizontalExtension,N,0.f);
  215.             }
  216.             nCenter += (horizontalExtension < 0) ? std::abs(horizontalExtension) : 0;
  217.             N += std::abs(horizontalExtension);        
  218.         }
  219.         void extendDomainVertically(int verticalExtension){
  220.             if (verticalExtension == 0) return;
  221.  
  222.             dynamicallyExtendVector(&colPtr,verticalExtension,M,0.f);
  223.             dynamicallyExtendVector(&expectedNgivenM_ptr,verticalExtension,M,0.f);
  224.             dynamicallyExtendVector(&expectedNNgivenM_ptr,verticalExtension,M,0.f);
  225.  
  226.             int newLength = M + std::abs(verticalExtension);
  227.             float ** tempPtr = new float*[newLength];
  228.  
  229.             if (verticalExtension > 0){
  230.                 for (int m = 0; m < M; m++){   
  231.                     tempPtr[m] = matrixPtr[m];
  232.                     matrixPtr[m] = NULL;
  233.                 }
  234.                 for (int m = M; m < newLength; m++){
  235.                     tempPtr[m] = new float[N];
  236.                     dynamicallyExtendVector(&tempPtr[m],newLength,0,0.f);
  237.                 }
  238.             } else {
  239.  
  240.                 mCenter += std::abs(verticalExtension);
  241.                 for ( int m = 0; m < std::abs(verticalExtension); m++ ){
  242.                     dynamicallyExtendVector(&tempPtr[m],newLength,0,0.f);
  243.                 }
  244.                 for ( int m = std::abs(verticalExtension); m < newLength; m++ ){   
  245.                     tempPtr[m] = matrixPtr[m - (int)std::abs(verticalExtension)];
  246.                     matrixPtr[m] = NULL;
  247.                 }
  248.             }
  249.  
  250.             delete [] matrixPtr;
  251.             matrixPtr = tempPtr;
  252.  
  253.             M = newLength;
  254.         }
  255.  
  256.         const char* toString(const char* filler = "\t") const {
  257.             std::stringstream ss("DynamicMatrix instance address: ");
  258.  
  259.             ss << filler << "DynamicMatrix instance address: " << this << std::endl;
  260.             ss << filler << "\trows M:       " << M << std::endl;
  261.             ss << filler << "\trows N:       " << N << std::endl << std::endl;
  262.             ss << filler << "\trows mCenter: " << mCenter << std::endl;
  263.             ss << filler << "\trows nCenter: " << nCenter << std::endl << std::endl;
  264.             ss << filler << "\ttotal weight: " << totalWeight << std::endl;
  265.  
  266.             if (M > 0  && M > 0){
  267.                 ss << "\n\t" << filler << "matrixPtr[...][...]" << std::endl;
  268.  
  269.                 ss << StringTools<std::string>::matrix2string(matrixPtr,M,mCenter,N,nCenter,"\t\t\t");
  270.                
  271.                 ss << StringTools<std::string>::rowVector2string("rowPtr[...]",rowPtr,N,filler);
  272.                 ss << StringTools<std::string>::rowVector2string("expectedMgivenN_ptr[...]",expectedMgivenN_ptr,N,filler);
  273.                 ss << StringTools<std::string>::rowVector2string("expectedMMgivenN_ptr[...]",expectedMMgivenN_ptr,N,filler);
  274.  
  275.                 ss << StringTools<std::string>::columnVector2string("colPtr[...]",colPtr,M,filler);
  276.                 ss << StringTools<std::string>::columnVector2string("expectedNgivenM_ptr[...]",expectedNgivenM_ptr,M,filler);
  277.                 ss << StringTools<std::string>::columnVector2string("expectedNNgivenM_ptr[...]",expectedNNgivenM_ptr,M,filler);
  278.                
  279.             }
  280.  
  281.             ss << "\n";
  282.  
  283.             return ss.str().c_str();
  284.         }
  285.  
  286.         float getExpectedM() const {
  287.             return expectedM;
  288.         }
  289.  
  290.         float getExpectedN() const {
  291.             return expectedN;
  292.         }
  293.  
  294.         float getExpectedMN() const {
  295.             return expectedMN;
  296.         }
  297.         float getExpectedMM() const {
  298.             return expectedMM;
  299.         }
  300.         float getExpectedNN() const {
  301.             return expectedNN;
  302.         }
  303.  
  304.         float* getColPtr() const {
  305.             return colPtr;
  306.         }
  307.  
  308.         float* getRowPtr() const {
  309.             return rowPtr;
  310.         }
  311.  
  312.         float** getMatrixPtr () const {
  313.             return matrixPtr;
  314.         }
  315.  
  316.         float* getExpectedNgivenM_ptr() const {
  317.             return expectedNgivenM_ptr;
  318.         }
  319.  
  320.         float* getExpectedMgivenN_ptr() const {
  321.             return expectedMgivenN_ptr;
  322.         }
  323.  
  324.         float* getExpectedNNgivenM_ptr() const {
  325.             return expectedNNgivenM_ptr;
  326.         }
  327.  
  328.         float* getExpectedMMgivenN_ptr() const {
  329.             return expectedMMgivenN_ptr;
  330.         }
  331.         int getN() const {
  332.             return N;
  333.         }
  334.  
  335.         int getM() const {
  336.             return M;
  337.         }
  338.  
  339.         int getnCenter() const {
  340.             return nCenter;
  341.         }  
  342.  
  343.         int getmCenter() const {
  344.             return mCenter;
  345.         }
  346.         float getTotalWeight() const {
  347.             return totalWeight;
  348.         }  
  349.        
  350.  
  351.     private:
  352.  
  353.         //  -Dynamically allocates a new vector and replaces values
  354.         //      appropriately from the old matrix of shorter length,
  355.         //      and appropriately scales the new subdomain as
  356.         //      an appropriate percent of the probability.
  357.         void dynamicallyExtendVector(   float ** ptr,
  358.                                         int horizontalExtension,
  359.                                         std::size_t oldLength, 
  360.                                         const float initialValue){
  361.  
  362.             if (horizontalExtension == 0) return;
  363.             if (*ptr == NULL)
  364.                 oldLength = 0;
  365.  
  366.             int newLength = std::abs(horizontalExtension) + oldLength;
  367.  
  368.             float * tempPtr = new float[newLength];
  369.  
  370.             if (horizontalExtension > 0){
  371.                 for ( int k = 0; k < oldLength; k++ ){
  372.                     tempPtr[k] = (*ptr)[k];
  373.                 }
  374.                 for ( int k = oldLength; k < newLength; k++ ){
  375.                     tempPtr[k] = initialValue;
  376.                 }
  377.             } else if (horizontalExtension < 0){               
  378.                 for ( int k = 0; k < std::abs(horizontalExtension); k++ ){
  379.                     tempPtr[k] = initialValue;
  380.                 }
  381.                 for ( int k = std::abs(horizontalExtension); k < newLength; k++ ){
  382.                     tempPtr[k] = (*ptr)[k-(int)std::abs(horizontalExtension)];
  383.                 }
  384.             }  
  385.  
  386.             delete [] (*ptr);
  387.             (*ptr) = tempPtr;
  388.         }
  389.  
  390.         void initMoments(){
  391.             dynamicallyExtendVector(&expectedNgivenM_ptr,M,0,0.f);
  392.             dynamicallyExtendVector(&expectedMgivenN_ptr,N,0,0.f);
  393.  
  394.             //Not 0 - must integrate over
  395.             dynamicallyExtendVector(&expectedNNgivenM_ptr,M,0,1.f/float(M));
  396.             dynamicallyExtendVector(&expectedMMgivenN_ptr,N,0,1.f/float(N));
  397.  
  398.             for (int m = 0; m < M; m++){   
  399.                 for (int n = 0; n < N; n++){
  400.                     expectedNNgivenM_ptr[m] *= (n-nCenter)*(n-nCenter);
  401.                     expectedMMgivenN_ptr[n] *= (m-mCenter)*(m-mCenter);
  402.                 }
  403.             }
  404.         }
  405.  
  406.        
  407.         float expectedN;
  408.         float expectedM;
  409.         float expectedMN;
  410.         float expectedNN;
  411.         float expectedMM;
  412.  
  413.         float * colPtr;
  414.         float * rowPtr;
  415.         float ** matrixPtr;
  416.         float * expectedNgivenM_ptr;
  417.         float * expectedNNgivenM_ptr;
  418.         float * expectedMgivenN_ptr;
  419.         float * expectedMMgivenN_ptr;
  420.  
  421.         //domain control
  422.         int N;
  423.         int M;
  424.         int nCenter;
  425.         int mCenter;
  426.         float totalWeight;
  427.        
  428. };
  429.  
  430.     //Extension
  431.     #ifdef MATLAB_WRAPPER_H
  432.         #include "probability_and_matlab_extensions.h"
  433.     #endif
  434.  
  435. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement