| 
    PLearn 0.1 
   | 
 
#include <ProbSparseMatrix.h>


Public Member Functions | |
| ProbSparseMatrix (int n_rows=0, int n_cols=0, string name="pXY", int mode=ROW_WISE, bool double_access=false) | |
| void | incr (int i, int j, real inc=1.0, bool warning=true) | 
| void | set (int i, int j, real value, bool warning=true) | 
| bool | checkCondProbIntegrity () | 
| bool | checkJointProbIntegrity () | 
| void | normalizeCond (ProbSparseMatrix &nXY, bool clear_nXY=false) | 
| void | normalizeJoint (ProbSparseMatrix &nXY, bool clear_nXY=false) | 
Normalize the matrix nXY as a joint probability matrix  .   | |
| void | normalizeCond () | 
| void | normalizeJoint () | 
| string | getClassName () const | 
| void | iterativeProportionalFittingStep (ProbSparseMatrix &p, Vec &lineMarginal, Vec &colMarginal) | 
| real | euclidianDistance (ProbSparseMatrix &p) | 
| euclidian distance between two sparse matrices (of same dimensions)   | |
| void | add (ProbSparseMatrix &p, ProbSparseMatrix &q) | 
Definition at line 45 of file ProbSparseMatrix.h.
| PLearn::ProbSparseMatrix::ProbSparseMatrix | ( | int | n_rows = 0,  | 
        
| int | n_cols = 0,  | 
        ||
| string | name = "pXY",  | 
        ||
| int | mode = ROW_WISE,  | 
        ||
| bool | double_access = false  | 
        ||
| ) | 
Definition at line 41 of file ProbSparseMatrix.cc.
: DoubleAccessSparseMatrix<real>(n_rows, n_cols, name, mode, double_access) { }
| void PLearn::ProbSparseMatrix::add | ( | ProbSparseMatrix & | p, | 
| ProbSparseMatrix & | q | ||
| ) | 
Definition at line 374 of file ProbSparseMatrix.cc.
References PLearn::DoubleAccessSparseMatrix< T >::exists(), PLearn::DoubleAccessSparseMatrix< T >::get(), PLearn::DoubleAccessSparseMatrix< T >::getCol(), PLearn::DoubleAccessSparseMatrix< T >::getHeight(), PLearn::DoubleAccessSparseMatrix< T >::getRow(), PLearn::DoubleAccessSparseMatrix< T >::getWidth(), i, j, PLearn::DoubleAccessSparseMatrix< real >::mode, PLERROR, and ROW_WISE.
{
    real val;
    if(p.getHeight()!=q.getHeight() || p.getWidth() != q.getWidth()) PLERROR("euclidianDistance: matrix dimensions do not match ");
    if (mode == ROW_WISE){
        // go thru the first matrix
        for (int i = 0; i < p.getHeight(); i++){
            map<int, real>& row_i = p.getRow(i);
            for (map<int, real>::iterator it = row_i.begin(); it != row_i.end(); ++it){
                val = it->second+q.get(i,it->first);
                set(i,it->first,val);
            }
        }
        // go thru the second one
        for (int i = 0; i < q.getHeight(); i++){
            map<int, real>& row_i = q.getRow(i);
            for (map<int, real>::iterator it = row_i.begin(); it != row_i.end(); ++it){
                // if the value exists in the first matrix, it has already been seen
                if(!p.exists(i,it->first)){
                    // no value in the first matrix
                    set(i,it->first,it->second);
                }
            }
        }
    }else{
        // go thru the first matrix
        for (int j = 0; j < p.getWidth(); j++){
            map<int, real>& col_j = p.getCol(j);
            for (map<int, real>::iterator it = col_j.begin(); it != col_j.end(); ++it){
                val = it->second+q.get(it->first,j);
                set(it->first,j,val);
            }
        }
        // go thru the second one
        for (int j = 0; j < q.getWidth(); j++){
            map<int, real>& col_j = q.getCol(j);
            for (map<int, real>::iterator it = col_j.begin(); it != col_j.end(); ++it){
                // if the value exists in the first matrix, it has already been seen
                if(!p.exists(it->first,j)){
                    // no value in the first matrix
                    set(it->first,j,it->second);
                }
            }
        }
    }
}

| bool PLearn::ProbSparseMatrix::checkCondProbIntegrity | ( | ) | 
Reimplemented in PLearn::SmoothedProbSparseMatrix, and PLearn::ComplementedProbSparseMatrix.
Definition at line 59 of file ProbSparseMatrix.cc.
References PLearn::DoubleAccessSparseMatrix< real >::cols, PLearn::DoubleAccessSparseMatrix< real >::height, i, if(), j, PLearn::DoubleAccessSparseMatrix< real >::mode, ROW_WISE, PLearn::DoubleAccessSparseMatrix< real >::rows, PLearn::sum(), and PLearn::DoubleAccessSparseMatrix< real >::width.
Referenced by PLearn::GraphicalBiText::check_consitency().
{
    real sum = 0.0;
    if (mode == ROW_WISE)
    {
        for (int i = 0; i < height; i++)
        {
            map<int, real>& row_i = rows[i];
            sum = 0.0;
            for (map<int, real>::iterator it = row_i.begin(); it != row_i.end(); ++it)
                sum += it->second;
            if (fabs(sum - 1.0) > 1e-4 && (sum > 0.0))
                return false;
        }
        return true;
    } else
    {
        for (int j = 0; j < width; j++)
        {
            map<int, real>& col_j = cols[j];
            sum = 0.0;
            for (map<int, real>::iterator it = col_j.begin(); it != col_j.end(); ++it)
                sum += it->second;
            if (fabs(sum - 1.0) > 1e-4 && (sum > 0.0))
                return false;
        }
        return true;
    }
}


| bool PLearn::ProbSparseMatrix::checkJointProbIntegrity | ( | ) | 
Definition at line 89 of file ProbSparseMatrix.cc.
References PLearn::DoubleAccessSparseMatrix< real >::sumOfElements().
{
    return (fabs(sumOfElements() - 1.0) > 1e-4);
}

| real PLearn::ProbSparseMatrix::euclidianDistance | ( | ProbSparseMatrix & | p | ) | 
euclidian distance between two sparse matrices (of same dimensions)
Definition at line 250 of file ProbSparseMatrix.cc.
References PLearn::DoubleAccessSparseMatrix< real >::cols, PLearn::diff(), PLearn::distance(), PLearn::DoubleAccessSparseMatrix< real >::exists(), PLearn::DoubleAccessSparseMatrix< T >::get(), PLearn::DoubleAccessSparseMatrix< T >::getCol(), PLearn::DoubleAccessSparseMatrix< T >::getHeight(), PLearn::DoubleAccessSparseMatrix< T >::getRow(), PLearn::DoubleAccessSparseMatrix< T >::getWidth(), PLearn::DoubleAccessSparseMatrix< real >::height, i, j, PLearn::DoubleAccessSparseMatrix< real >::mode, PLERROR, ROW_WISE, PLearn::DoubleAccessSparseMatrix< real >::rows, PLearn::sqrt(), and PLearn::DoubleAccessSparseMatrix< real >::width.
{
    real  distance=0;
    real diff;
    if(p.getHeight()!=height || p.getWidth() != width) PLERROR("euclidianDistance: matrix dimensions do not match ");
    if (mode == ROW_WISE){
        // go thru the first matrix
        for (int i = 0; i < height; i++){
            map<int, real>& row_i = rows[i];
            for (map<int, real>::iterator it = row_i.begin(); it != row_i.end(); ++it){
                diff = it->second-p.get(i, it->first);
                distance +=sqrt(diff*diff);
            }
        }
        // go thru the second one
        for (int i = 0; i < p.getHeight(); i++){
            map<int, real>& row_i = p.getRow(i);
            for (map<int, real>::iterator it = row_i.begin(); it != row_i.end(); ++it){
                // if the value exists in the first matrix, it has already been included in the distance
                if(exists(i,it->first))continue;
                // no value in the first matrix
                diff = p.get(i,it->first);
                distance +=sqrt(diff*diff);
            }
        }
    }else{
        // go thru the first matrix
        for (int j = 0; j < width; j++){
            map<int, real>& col_j = cols[j];
            for (map<int, real>::iterator it = col_j.begin(); it != col_j.end(); ++it){
                diff = it->second-p.get(it->first,j);
                distance +=sqrt(diff*diff);
            }
        }
        // go thru the second one
        for (int j = 0; j < width; j++){
            map<int, real>& col_j = p.getCol(j);
            for (map<int, real>::iterator it = col_j.begin(); it != col_j.end(); ++it){
                // if the value exists in the first matrix, it has already been included in the distance
                if(exists(it->first,j))continue;
                // no value in the first matrix
                diff = p.get(it->first,j);
                distance +=sqrt(diff*diff);
            }
        }
    }
    return(distance);
}

| string PLearn::ProbSparseMatrix::getClassName | ( | ) |  const [inline, virtual] | 
        
Reimplemented from PLearn::DoubleAccessSparseMatrix< real >.
Reimplemented in PLearn::SmoothedProbSparseMatrix.
Definition at line 68 of file ProbSparseMatrix.h.
{ return "ProbSparseMatrix"; }
Definition at line 45 of file ProbSparseMatrix.cc.
References PLWARNING.
Referenced by PLearn::GraphicalBiText::compute_BN_likelihood(), PLearn::GraphicalBiText::compute_likelihood(), PLearn::GraphicalBiText::init(), PLearn::GraphicalBiText::init_WSD(), and PLearn::GraphicalBiText::update_WSD_model().
{
    if (inc <= 0.0 && warning)
        PLWARNING("incrementing value by: %g", inc);
    DoubleAccessSparseMatrix<real>::incr(i, j, inc);
}

| void PLearn::ProbSparseMatrix::iterativeProportionalFittingStep | ( | ProbSparseMatrix & | p, | 
| Vec & | lineMarginal, | ||
| Vec & | colMarginal | ||
| ) | 
Definition at line 301 of file ProbSparseMatrix.cc.
References PLearn::DoubleAccessSparseMatrix< real >::cols, PLearn::endl(), PLearn::DoubleAccessSparseMatrix< T >::getCol(), PLearn::DoubleAccessSparseMatrix< T >::getHeight(), PLearn::DoubleAccessSparseMatrix< T >::getRow(), PLearn::DoubleAccessSparseMatrix< T >::getWidth(), PLearn::DoubleAccessSparseMatrix< real >::height, i, j, PLearn::DoubleAccessSparseMatrix< real >::mode, PLearn::DoubleAccessSparseMatrix< T >::mode, PLERROR, PLWARNING, ROW_WISE, PLearn::DoubleAccessSparseMatrix< real >::rows, PLearn::TVec< T >::size(), PLearn::DoubleAccessSparseMatrix< T >::sumCol(), PLearn::DoubleAccessSparseMatrix< T >::sumRow(), and PLearn::DoubleAccessSparseMatrix< real >::width.
{
    real newVal;
    real sum_row_i;
    real sum_col_j;
  
    if(p.getHeight()!=lineMarginal.size() || p.getWidth() != colMarginal.size()) PLERROR("iterativeProportionalFittingStep: matrix dimension does not match marginal vectors dimensions");
    if(p.getHeight()!=height || p.getWidth() != width) PLERROR("iterativeProportionalFittingStep: new matrix dimension does not match old matrix dimensions");
    if(p.mode!=mode) PLERROR("iterativeProportionalFittingStep: Matrices access mode must match");
    if (mode == ROW_WISE){
        Vec sum_col(width);
        // First pass
        for (int i = 0; i < height; i++){
            map<int, real>& row_i = p.getRow(i);
            sum_row_i = p.sumRow(i);
            for (map<int, real>::iterator it = row_i.begin(); it != row_i.end(); ++it){
                if(sum_row_i==0)PLERROR("iterativeProportionalFittingStep: line %d is empty",i);
                newVal= it->second*lineMarginal[i]/sum_row_i;
                // store sum of column for next step
                sum_col[it->first]+=newVal;
                set(i,it->first,newVal);
            }
        }
        // Second Pass
        for (int i = 0; i < height; i++){
            // we use the values set in the matrix at the previous stage
            map<int, real>& row_i = rows[i];
            for (map<int, real>::iterator it = row_i.begin(); it != row_i.end(); ++it){
                if(sum_col[it->first]==0)PLERROR("iterativeProportionalFittingStep: column %d is empty",i);
                newVal= it->second*colMarginal[it->first]/sum_col[it->first];
                set(i,it->first,newVal);
            }
        }
   
    }else{
        Vec sum_row(height);
        for (int j = 0; j < width; j++){
            map<int, real>& col_j = p.getCol(j);
            sum_col_j = p.sumCol(j);
            if( col_j.begin()!= col_j.end())cout << " " << colMarginal[j]/sum_col_j<< ":";
            for (map<int, real>::iterator it = col_j.begin(); it != col_j.end(); ++it){
                if(sum_col_j==0){
                    PLWARNING("iterativeProportionalFittingStep: column %d is empty",j);
                    continue;
                }
                newVal= it->second*colMarginal[j]/sum_col_j;
                cout << " " <<it->second<<"="<<newVal;
                sum_row[it->first]+=newVal;
                set(it->first,j,newVal);
            }
            if( col_j.begin()!= col_j.end())cout << endl;
        }
        cout << endl;
        // Second Pass
        for (int j = 0; j < width; j++){
            // we use the values set in the matrix at the previous stage
            map<int, real>& col_j = cols[j];
            //      cout << " " << lineMarginal[it->first]/sum_row[it->first]<< ":";
            for (map<int, real>::iterator it = col_j.begin(); it != col_j.end(); ++it){
                if(sum_row[it->first]==0){
                    PLWARNING("iterativeProportionalFittingStep: line %d is empty",it->first);
                    continue;
                }
                newVal= it->second*lineMarginal[it->first]/sum_row[it->first];
                cout << " " <<it->second<<"="<<newVal;
                set(it->first,j,newVal);
            }
            cout << endl;
        }
    }
}

| void PLearn::ProbSparseMatrix::normalizeCond | ( | ProbSparseMatrix & | nXY, | 
| bool | clear_nXY = false  | 
        ||
| ) | 
Definition at line 94 of file ProbSparseMatrix.cc.
References PLearn::DoubleAccessSparseMatrix< T >::clear(), PLearn::DoubleAccessSparseMatrix< real >::clear(), COLUMN_WISE, PLearn::DoubleAccessSparseMatrix< T >::getCol(), PLearn::DoubleAccessSparseMatrix< T >::getHeight(), PLearn::DoubleAccessSparseMatrix< T >::getMode(), PLearn::DoubleAccessSparseMatrix< T >::getRow(), PLearn::DoubleAccessSparseMatrix< T >::getWidth(), i, PLearn::DoubleAccessSparseMatrix< T >::isDoubleAccessible(), j, PLearn::DoubleAccessSparseMatrix< real >::mode, PLERROR, ROW_WISE, PLearn::DoubleAccessSparseMatrix< T >::sumCol(), and PLearn::DoubleAccessSparseMatrix< T >::sumRow().
Referenced by PLearn::GraphicalBiText::compute_likelihood(), and PLearn::GraphicalBiText::init().
{
    if (mode == ROW_WISE && (nXY.getMode() == ROW_WISE || nXY.isDoubleAccessible()))
    {
        clear();
        int nXY_height = nXY.getHeight();
        for (int i = 0; i < nXY_height; i++)
        {
            real sum_row_i = nXY.sumRow(i);
            map<int, real>& row_i = nXY.getRow(i);
            for (map<int, real>::iterator it = row_i.begin(); it != row_i.end(); ++it)
            {
                int j = it->first;
                real nij = it->second;
                real pij = nij / sum_row_i;
                if (pij > 0.0)
                    set(i, j, pij);
            }
        }
        if (clear_nXY)
            nXY.clear();
    } else if (mode == COLUMN_WISE && (nXY.getMode() == COLUMN_WISE || nXY.isDoubleAccessible()))
    {
        clear();
        int nXY_width = nXY.getWidth();
        for (int j = 0; j < nXY_width; j++)
        {
            real sum_col_j = nXY.sumCol(j);
            map<int, real>& col_j = nXY.getCol(j);
            for (map<int, real>::iterator it = col_j.begin(); it != col_j.end(); ++it)
            {
                int i = it->first;
                real nij = it->second;
                real pij = nij / sum_col_j;
                if (pij > 0.0)
                    set(i, j, pij);
            }
        }
        if (clear_nXY)
            nXY.clear();
    } else
    {
        PLERROR("pXY and nXY accessibility modes must match");
    }
}


| void PLearn::ProbSparseMatrix::normalizeCond | ( | ) | 
Definition at line 140 of file ProbSparseMatrix.cc.
References PLearn::DoubleAccessSparseMatrix< real >::cols, PLearn::DoubleAccessSparseMatrix< real >::height, i, j, PLearn::DoubleAccessSparseMatrix< real >::mode, ROW_WISE, PLearn::DoubleAccessSparseMatrix< real >::rows, PLearn::DoubleAccessSparseMatrix< real >::sumCol(), PLearn::DoubleAccessSparseMatrix< real >::sumRow(), and PLearn::DoubleAccessSparseMatrix< real >::width.
{
    if (mode == ROW_WISE)
    {
        for (int i = 0; i < height; i++)
        {
            real sum_row_i = sumRow(i);
            map<int, real>& row_i = rows[i];
            for (map<int, real>::iterator it = row_i.begin(); it != row_i.end(); ++it)
            {
                int j = it->first;
                real nij = it->second;
                real pij = nij / sum_row_i;
                if (pij > 0.0)
                    set(i, j, pij);
            }
        }
    } else
    {
        for (int j = 0; j < width; j++)
        {
            real sum_col_j = sumCol(j);
            map<int, real>& col_j = cols[j];
            for (map<int, real>::iterator it = col_j.begin(); it != col_j.end(); ++it)
            {
                int i = it->first;
                real nij = it->second;
                real pij = nij / sum_col_j;
                if (pij > 0.0)
                    set(i, j, pij);
            }
        }
    }
}

| void PLearn::ProbSparseMatrix::normalizeJoint | ( | ProbSparseMatrix & | nXY, | 
| bool | clear_nXY = false  | 
        ||
| ) | 
Normalize the matrix nXY as a joint probability matrix 
. 
Definition at line 177 of file ProbSparseMatrix.cc.
References PLearn::DoubleAccessSparseMatrix< T >::clear(), PLearn::DoubleAccessSparseMatrix< real >::clear(), COLUMN_WISE, PLearn::DoubleAccessSparseMatrix< T >::getCol(), PLearn::DoubleAccessSparseMatrix< T >::getHeight(), PLearn::DoubleAccessSparseMatrix< T >::getMode(), PLearn::DoubleAccessSparseMatrix< T >::getRow(), PLearn::DoubleAccessSparseMatrix< T >::getWidth(), i, j, ROW_WISE, and PLearn::DoubleAccessSparseMatrix< T >::sumOfElements().
Referenced by PLearn::GraphicalBiText::init().
{
    clear();
    real sum_nXY = nXY.sumOfElements();
    if (nXY.getMode() == ROW_WISE)
    {
        int nXY_height = nXY.getHeight();
        for (int i = 0; i < nXY_height; i++)
        {
            map<int, real>& row_i = nXY.getRow(i);
            for (map<int, real>::iterator it = row_i.begin(); it != row_i.end(); ++it)
            {
                int j = it->first;
                real nij = it->second;
                real pij = nij / sum_nXY;
                if (pij > 0.0)
                    set(i, j, pij);
            }
        }
    } else if (nXY.getMode() == COLUMN_WISE)
    {
        int nXY_width = nXY.getWidth();
        for (int j = 0; j < nXY_width; j++)
        {
            map<int, real>& col_j = nXY.getCol(j);
            for (map<int, real>::iterator it = col_j.begin(); it != col_j.end(); ++it)
            {
                int i = it->first;
                real nij = it->second;
                real pij = nij / sum_nXY;
                if (pij > 0.0)
                    set(i, j, pij);
            }
        }
    }
    if (clear_nXY)
        nXY.clear();
}


| void PLearn::ProbSparseMatrix::normalizeJoint | ( | ) | 
Definition at line 216 of file ProbSparseMatrix.cc.
References PLearn::DoubleAccessSparseMatrix< real >::cols, PLearn::DoubleAccessSparseMatrix< real >::height, i, j, PLearn::DoubleAccessSparseMatrix< real >::mode, ROW_WISE, PLearn::DoubleAccessSparseMatrix< real >::rows, PLearn::DoubleAccessSparseMatrix< real >::sumOfElements(), and PLearn::DoubleAccessSparseMatrix< real >::width.
{
    if (mode == ROW_WISE)
    {
        for (int i = 0; i < height; i++)
        {
            map<int, real>& row_i = rows[i];
            for (map<int, real>::iterator it = row_i.begin(); it != row_i.end(); ++it)
            {
                int j = it->first;
                real nij = it->second;
                real pij = nij / sumOfElements();
                if (pij > 0.0)
                    set(i, j, pij);
            }
        }
    } else
    {
        for (int j = 0; j < width; j++)
        {
            map<int, real>& col_j = cols[j];
            for (map<int, real>::iterator it = col_j.begin(); it != col_j.end(); ++it)
            {
                int i = it->first;
                real nij = it->second;
                real pij = nij / sumOfElements();
                if (pij > 0.0)
                    set(i, j, pij);
            }
        }
    }
}

Definition at line 52 of file ProbSparseMatrix.cc.
References PLWARNING.
Referenced by PLearn::GraphicalBiText::compute_likelihood(), PLearn::GraphicalBiText::init(), and PLearn::GraphicalBiText::update_WSD_model().
{
    if (value <= 0.0 && warning)
        PLWARNING("setting value: %g", value);
    DoubleAccessSparseMatrix<real>::set(i, j, value);
}

 1.7.4