00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00031 
00032 
00033 
00034 #if !defined _CLUS_DISCRETEPERMUTATIONTRANSFORMATION_H
00035 #define _CLUS_DISCRETEPERMUTATIONTRANSFORMATION_H
00036 
00037 #include "vec.h"
00038 #include "cmat.h"
00039 #include <iostream>
00040 
00041 using namespace TNT;
00042 using namespace std;
00043 
00044 namespace CLUS
00045 {
00046 
00047 
00048 class Permutation
00049 {
00050     Vector<int> permutation;
00051 public:
00052     Permutation(): permutation()
00053     {}
00054 
00055     Permutation(int size): permutation(size)
00056     {
00057         for (int i=0; i<size; i++)
00058             permutation[i]=i;
00059     }
00060 
00061     Permutation(Vector<int>& auxPermutation):
00062             permutation(auxPermutation)
00063     {}
00064 
00065     void RandomizePermutation(int size)
00066     {
00067         permutation.newsize(size);
00068 
00069         int curr;
00070         for (int i =0; i< size; i++)
00071         {
00072             curr  = random()%size;
00073             bool unused = false; 
00074 
00075             while (!unused) 
00076             {
00077                 bool used=false;
00078                 curr  = random()%size;
00079                 for(int j =0; j<i; j++)
00080                 {
00081                     if (permutation[j] == curr)
00082                         used = true;
00083                 }
00084                 if (!used)
00085                     unused = true;
00086                 used= false;
00087             }
00088             
00089             permutation[i] = curr;
00090         }
00091 
00092     }
00093 
00094     int ApplyInversePermutation(int d)
00095     {
00096         
00097         for (int i=0; i< permutation.size(); i++)
00098         {
00099             if (permutation[i]==d)
00100                 return i;
00101             
00102         }
00103         for (int i=0; i<permutation.size(); i++)
00104             
00105             assert(false); 
00106     }
00107 
00108     void ResetSize(int size)
00109     {
00110         permutation.newsize(size);
00111         for (int i=0; i<size; i++)
00112             permutation[i]=i;
00113     }
00114 
00115     int ApplyPermutation(int data)
00116     {
00117         
00118         return permutation[data];
00119     }
00120 
00121     void saveToStream(ostream& out)
00122     {
00123         for (int i=0; i<permutation.size(); i++)
00124         {
00125             out << i << " -> " << permutation[i] << endl;
00126         }
00127     }
00128 };
00129 
00130 class DiscretePermutationTransformation
00131 {
00132 
00133     Vector<bool> mask;
00134 
00135 
00136     Matrix<Permutation> shifts;
00137 
00138 
00139     Matrix<double>& cdataset;
00140 
00141 
00142     Matrix<int>& ddataset;
00143     
00144     const Vector<int>& dDomainSize;
00145     
00146     int numDataSets;
00147 
00148 public:
00149     DiscretePermutationTransformation(int NoAttributes, int NoDatasets,
00150                                       Matrix<double>& cDataset, Matrix<int>& dDataset,
00151                                       const Vector<int>& DDomainSize):
00152             mask(NoAttributes), shifts(NoAttributes,NoDatasets), cdataset(cDataset),
00153             ddataset(dDataset),dDomainSize(DDomainSize), numDataSets(NoDatasets)
00154     {
00155         mask=false;
00156 
00157         for (int i=0; i<NoAttributes; i++)
00158             for (int j=0; j<numDataSets; j++)
00159             {
00160                 
00161                 (shifts[i][j]).ResetSize(DDomainSize[i]);
00162             }
00163     }
00164 
00165     void SetShiftsAttribute(int attrib, Vector<Permutation>& shiftsAtt)
00166     {
00167         assert(shiftsAtt.dim()==shifts.num_cols());
00168 
00169         for (int i=0; i<shifts.num_cols(); i++)
00170             shifts[attrib][i]=shiftsAtt[i];
00171         mask[attrib]=true;
00172         
00173         
00174         for (int i=0; i<ddataset.num_rows(); i++)
00175         {
00176             int datasetIndex=(int)cdataset[i][cdataset.num_cols()-1];
00177             
00178             
00179             if (datasetIndex>0)
00180                 ddataset[i][attrib]=shifts[attrib][datasetIndex].ApplyPermutation(ddataset[i][attrib]);
00181         }
00182     }
00183 
00184     Permutation GetShift(int attrib, int datasetIndex)
00185     {
00186         return shifts[attrib][datasetIndex];
00187     }
00188 
00189     void ApplyShiftToTuple(int* dataPoint, int datasetIndex)
00190     {
00191         int noAttribs=mask.dim();
00192         for (int i=0; i<noAttribs; i++)
00193             dataPoint[i]=shifts[i][datasetIndex].ApplyPermutation(dataPoint[i]);
00194     }
00195 
00196     bool HasAttributeShifts(int attrib)
00197     {
00198         return mask[attrib];
00199     }
00200 
00201     void saveToStream(ostream& out, int attribute, int dataset)
00202     {
00203         shifts[attribute][dataset].saveToStream(out);
00204     }
00205 };
00206 
00207 }
00208 
00209 #endif // _CLUS_DISCRETEPERMUTATIONTRANSFORMATION_H