Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | File List | Namespace Members | Class Members | File Members

ProbSparseMatrix.cc

Go to the documentation of this file.
00001 // -*- C++ -*- 00002 00003 // PLearn (A C++ Machine Learning Library) 00004 // Copyright (C) 1999-2002 Christian Jauvin 00005 // 00006 00007 // Redistribution and use in source and binary forms, with or without 00008 // modification, are permitted provided that the following conditions are met: 00009 // 00010 // 1. Redistributions of source code must retain the above copyright 00011 // notice, this list of conditions and the following disclaimer. 00012 // 00013 // 2. Redistributions in binary form must reproduce the above copyright 00014 // notice, this list of conditions and the following disclaimer in the 00015 // documentation and/or other materials provided with the distribution. 00016 // 00017 // 3. The name of the authors may not be used to endorse or promote 00018 // products derived from this software without specific prior written 00019 // permission. 00020 // 00021 // THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR 00022 // IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 00023 // OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN 00024 // NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 00025 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED 00026 // TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 00027 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 00028 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 00029 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 00030 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 00031 // 00032 // This file is part of the PLearn library. For more information on the PLearn 00033 // library, go to the PLearn Web site at www.plearn.org 00034 00037 #include "ProbSparseMatrix.h" 00038 00039 namespace PLearn { 00040 00041 ProbSparseMatrix::ProbSparseMatrix(int n_rows, int n_cols, string name, int mode, bool double_access) : DoubleAccessSparseMatrix<real>(n_rows, n_cols, name, mode, double_access) 00042 { 00043 } 00044 00045 void ProbSparseMatrix::incr(int i, int j, real inc, bool warning) 00046 { 00047 if (inc <= 0.0 && warning) 00048 PLWARNING("incrementing value by: %g", inc); 00049 DoubleAccessSparseMatrix<real>::incr(i, j, inc); 00050 } 00051 00052 void ProbSparseMatrix::set(int i, int j, real value, bool warning) 00053 { 00054 if (value <= 0.0 && warning) 00055 PLWARNING("setting value: %g", value); 00056 DoubleAccessSparseMatrix<real>::set(i, j, value); 00057 } 00058 00059 bool ProbSparseMatrix::checkCondProbIntegrity() 00060 { 00061 real sum = 0.0; 00062 if (mode == ROW_WISE) 00063 { 00064 for (int i = 0; i < height; i++) 00065 { 00066 map<int, real>& row_i = rows[i]; 00067 sum = 0.0; 00068 for (map<int, real>::iterator it = row_i.begin(); it != row_i.end(); ++it) 00069 sum += it->second; 00070 if (fabs(sum - 1.0) > 1e-4 && (sum > 0.0)) 00071 return false; 00072 } 00073 return true; 00074 } else 00075 { 00076 for (int j = 0; j < width; j++) 00077 { 00078 map<int, real>& col_j = cols[j]; 00079 sum = 0.0; 00080 for (map<int, real>::iterator it = col_j.begin(); it != col_j.end(); ++it) 00081 sum += it->second; 00082 if (fabs(sum - 1.0) > 1e-4 && (sum > 0.0)) 00083 return false; 00084 } 00085 return true; 00086 } 00087 } 00088 00089 bool ProbSparseMatrix::checkJointProbIntegrity() 00090 { 00091 return (fabs(sumOfElements() - 1.0) > 1e-4); 00092 } 00093 00094 void ProbSparseMatrix::normalizeCond(ProbSparseMatrix& nXY, bool clear_nXY) 00095 { 00096 if (mode == ROW_WISE && (nXY.getMode() == ROW_WISE || nXY.isDoubleAccessible())) 00097 { 00098 clear(); 00099 int nXY_height = nXY.getHeight(); 00100 for (int i = 0; i < nXY_height; i++) 00101 { 00102 real sum_row_i = nXY.sumRow(i); 00103 map<int, real>& row_i = nXY.getRow(i); 00104 for (map<int, real>::iterator it = row_i.begin(); it != row_i.end(); ++it) 00105 { 00106 int j = it->first; 00107 real nij = it->second; 00108 real pij = nij / sum_row_i; 00109 if (pij > 0.0) 00110 set(i, j, pij); 00111 } 00112 } 00113 if (clear_nXY) 00114 nXY.clear(); 00115 } else if (mode == COLUMN_WISE && (nXY.getMode() == COLUMN_WISE || nXY.isDoubleAccessible())) 00116 { 00117 clear(); 00118 int nXY_width = nXY.getWidth(); 00119 for (int j = 0; j < nXY_width; j++) 00120 { 00121 real sum_col_j = nXY.sumCol(j); 00122 map<int, real>& col_j = nXY.getCol(j); 00123 for (map<int, real>::iterator it = col_j.begin(); it != col_j.end(); ++it) 00124 { 00125 int i = it->first; 00126 real nij = it->second; 00127 real pij = nij / sum_col_j; 00128 if (pij > 0.0) 00129 set(i, j, pij); 00130 } 00131 } 00132 if (clear_nXY) 00133 nXY.clear(); 00134 } else 00135 { 00136 PLERROR("pXY and nXY accessibility modes must match"); 00137 } 00138 } 00139 00140 void ProbSparseMatrix::normalizeCond() 00141 { 00142 if (mode == ROW_WISE) 00143 { 00144 for (int i = 0; i < height; i++) 00145 { 00146 real sum_row_i = sumRow(i); 00147 map<int, real>& row_i = rows[i]; 00148 for (map<int, real>::iterator it = row_i.begin(); it != row_i.end(); ++it) 00149 { 00150 int j = it->first; 00151 real nij = it->second; 00152 real pij = nij / sum_row_i; 00153 if (pij > 0.0) 00154 set(i, j, pij); 00155 } 00156 } 00157 } else 00158 { 00159 for (int j = 0; j < width; j++) 00160 { 00161 real sum_col_j = sumCol(j); 00162 map<int, real>& col_j = cols[j]; 00163 for (map<int, real>::iterator it = col_j.begin(); it != col_j.end(); ++it) 00164 { 00165 int i = it->first; 00166 real nij = it->second; 00167 real pij = nij / sum_col_j; 00168 if (pij > 0.0) 00169 set(i, j, pij); 00170 } 00171 } 00172 } 00173 } 00174 00175 void ProbSparseMatrix::normalizeJoint(ProbSparseMatrix& nXY, bool clear_nXY) 00176 { 00177 clear(); 00178 real sum_nXY = nXY.sumOfElements(); 00179 if (nXY.getMode() == ROW_WISE) 00180 { 00181 int nXY_height = nXY.getHeight(); 00182 for (int i = 0; i < nXY_height; i++) 00183 { 00184 map<int, real>& row_i = nXY.getRow(i); 00185 for (map<int, real>::iterator it = row_i.begin(); it != row_i.end(); ++it) 00186 { 00187 int j = it->first; 00188 real nij = it->second; 00189 real pij = nij / sum_nXY; 00190 if (pij > 0.0) 00191 set(i, j, pij); 00192 } 00193 } 00194 } else if (nXY.getMode() == COLUMN_WISE) 00195 { 00196 int nXY_width = nXY.getWidth(); 00197 for (int j = 0; j < nXY_width; j++) 00198 { 00199 map<int, real>& col_j = nXY.getCol(j); 00200 for (map<int, real>::iterator it = col_j.begin(); it != col_j.end(); ++it) 00201 { 00202 int i = it->first; 00203 real nij = it->second; 00204 real pij = nij / sum_nXY; 00205 if (pij > 0.0) 00206 set(i, j, pij); 00207 } 00208 } 00209 } 00210 if (clear_nXY) 00211 nXY.clear(); 00212 } 00213 00214 void ProbSparseMatrix::normalizeJoint() 00215 { 00216 if (mode == ROW_WISE) 00217 { 00218 for (int i = 0; i < height; i++) 00219 { 00220 map<int, real>& row_i = rows[i]; 00221 for (map<int, real>::iterator it = row_i.begin(); it != row_i.end(); ++it) 00222 { 00223 int j = it->first; 00224 real nij = it->second; 00225 real pij = nij / sumOfElements(); 00226 if (pij > 0.0) 00227 set(i, j, pij); 00228 } 00229 } 00230 } else 00231 { 00232 for (int j = 0; j < width; j++) 00233 { 00234 map<int, real>& col_j = cols[j]; 00235 for (map<int, real>::iterator it = col_j.begin(); it != col_j.end(); ++it) 00236 { 00237 int i = it->first; 00238 real nij = it->second; 00239 real pij = nij / sumOfElements(); 00240 if (pij > 0.0) 00241 set(i, j, pij); 00242 } 00243 } 00244 } 00245 } 00246 00247 }

Generated on Tue Aug 17 16:02:52 2004 for PLearn by doxygen 1.3.7