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 #ifndef MATRIXREFINEMENT1_H_
00034 #define MATRIXREFINEMENT1_H_
00035
00036 #include <permlib/predicate/pointwise_stabilizer_predicate.h>
00037 #include <permlib/search/partition/refinement.h>
00038
00039 namespace permlib {
00040 namespace partition {
00041
00043
00047 template<class PERM,class MATRIX>
00048 class MatrixRefinement1 : public Refinement<PERM> {
00049 public:
00051 explicit MatrixRefinement1(ulong n, const MATRIX& matrix);
00052
00053 virtual uint apply(Partition& pi) const;
00054
00055 virtual bool init(Partition& pi);
00056
00057 private:
00058 const MATRIX& m_matrix;
00059 std::vector<std::list<ulong> > m_diagonalPartition;
00060 };
00061
00062 template<class PERM,class MATRIX>
00063 MatrixRefinement1<PERM,MATRIX>::MatrixRefinement1(ulong n, const MATRIX& matrix)
00064 : Refinement<PERM>(n, Default), m_matrix(matrix)
00065 {
00066 }
00067
00068 template<class PERM,class MATRIX>
00069 uint MatrixRefinement1<PERM,MATRIX>::apply(Partition& pi) const {
00070 BOOST_ASSERT( this->initialized() );
00071
00072 uint ret = 0;
00073 std::list<int>::const_iterator cellPairIt = Refinement<PERM>::m_cellPairs.begin();
00074 while (cellPairIt != Refinement<PERM>::m_cellPairs.end()) {
00075 ulong cell = *cellPairIt;
00076 ++cellPairIt;
00077 while (cellPairIt != Refinement<PERM>::m_cellPairs.end() && *cellPairIt != -1) {
00078 ulong diagIndex = *cellPairIt;
00079 if (pi.intersect(m_diagonalPartition[diagIndex].begin(), m_diagonalPartition[diagIndex].end(), cell))
00080 ++ret;
00081 ++cellPairIt;
00082 }
00083 ++cellPairIt;
00084 }
00085 return ret;
00086 }
00087
00088
00089 template<class PERM,class MATRIX>
00090 bool MatrixRefinement1<PERM,MATRIX>::init(Partition& pi) {
00091 m_diagonalPartition.resize(m_matrix.k());
00092 for (ulong i = 0; i < m_matrix.dimension(); ++i) {
00093 m_diagonalPartition[m_matrix.at(i,i)].push_back(i);
00094 }
00095
00096 bool foundIntersection = false;
00097 for (uint c = 0; c < pi.cells(); ++c) {
00098 Refinement<PERM>::m_cellPairs.push_back(c);
00099 for (ulong i = 0; i < m_diagonalPartition.size(); ++i) {
00100 if (pi.intersect(m_diagonalPartition[i].begin(), m_diagonalPartition[i].end(), c)) {
00101 Refinement<PERM>::m_cellPairs.push_back(i);
00102 foundIntersection = true;
00103 }
00104 }
00105 Refinement<PERM>::m_cellPairs.push_back(-1);
00106 }
00107 if (foundIntersection) {
00108 typename Refinement<PERM>::RefinementPtr ref(new MatrixRefinement1<PERM,MATRIX>(*this));
00109 Refinement<PERM>::m_backtrackRefinements.push_back(ref);
00110 return true;
00111 }
00112 return false;
00113 }
00114
00115
00116 }
00117 }
00118
00119 #endif // -- MATRIXREFINEMENT1_H_