25 #include <ColPack/ColPackHeaders.h>
27 using namespace Eigen;
28 using namespace ColPack;
33 CProbingSampler::CProbingSampler() : CTraceSampler()
38 CProbingSampler::CProbingSampler(
39 CSparseMatrixOperator<float64_t>* matrix_operator, int64_t power,
40 EOrderingVariant ordering, EColoringVariant coloring)
41 : CTraceSampler(matrix_operator->get_dimension())
46 m_matrix_operator=matrix_operator;
48 std::string str_ordering;
52 str_ordering=
"NATURAL";
55 str_ordering=
"LARGEST_FIRST";
57 case DYNAMIC_LARGEST_FIRST:
58 str_ordering=
"DYNAMIC_LARGEST_FIRST";
60 case DISTANCE_TWO_LARGEST_FIRST:
61 str_ordering=
"DISTANCE_TWO_LARGEST_FIRST";
64 str_ordering=
"SMALLEST_LAST";
66 case DISTANCE_TWO_SMALLEST_LAST:
67 str_ordering=
"DISTANCE_TWO_SMALLEST_LAST";
69 case INCIDENCE_DEGREE:
70 str_ordering=
"INCIDENCE_DEGREE";
72 case DISTANCE_TWO_INCIDENCE_DEGREE:
73 str_ordering=
"DISTANCE_TWO_INCIDENCE_DEGREE";
76 str_ordering=
"RANDOM";
80 std::string str_coloring;
84 str_coloring=
"DISTANCE_ONE";
87 str_coloring=
"ACYCLIC";
89 case ACYCLIC_FOR_INDIRECT_RECOVERY:
90 str_coloring=
"ACYCLIC_FOR_INDIRECT_RECOVERY";
96 str_coloring=
"RESTRICTED_STAR";
99 str_coloring=
"DISTANCE_TWO";
103 m_ordering=SGString<char>(
index_t(str_ordering.size()));
104 m_coloring=SGString<char>(
index_t(str_coloring.size()));
105 memcpy(m_ordering.string, str_ordering.data(), str_ordering.size());
106 memcpy(m_coloring.string, str_coloring.data(), str_coloring.size());
108 SG_REF(m_matrix_operator);
111 void CProbingSampler::init()
113 m_matrix_operator=NULL;
116 SG_ADD(&m_coloring_vector,
"coloring_vector",
"the coloring vector generated"
119 SG_ADD(&m_power,
"matrix_power",
"power of the sparse-matrix for coloring",
122 SG_ADD(&m_ordering,
"ordering_variant",
"ordering variant for coloring",
125 SG_ADD(&m_coloring,
"coloring_variant",
"coloring variant for coloring",
128 SG_ADD((CSGObject**)&m_matrix_operator,
"matrix_operator",
132 CProbingSampler::~CProbingSampler()
137 SGVector<int32_t> CProbingSampler::get_coloring_vector()
const
139 return m_coloring_vector;
142 void CProbingSampler::precompute()
146 SparsityStructure* sp_str=m_matrix_operator->get_sparsity_structure(m_power);
148 GraphColoringInterface* Color
149 =
new GraphColoringInterface(SRC_MEM_ADOLC, sp_str->m_ptr, sp_str->m_num_rows);
151 std::string ordering(m_ordering.string, m_ordering.slen);
152 std::string coloring(m_coloring.string, m_coloring.slen);
153 Color->Coloring(ordering, coloring);
155 std::vector<int32_t> vi_VertexColors;
156 Color->GetVertexColors(vi_VertexColors);
158 REQUIRE(vi_VertexColors.size()==
static_cast<uint32_t
>(m_dimension),
159 "dimension mismatch, %d vs %d!\n", vi_VertexColors.size(), m_dimension);
161 m_coloring_vector=SGVector<int32_t>(vi_VertexColors.size());
163 for (std::vector<int32_t>::iterator it=vi_VertexColors.begin();
164 it!=vi_VertexColors.end(); it++)
167 m_coloring_vector[i]=*it;
170 Map<VectorXi> colors(m_coloring_vector.vector, m_coloring_vector.vlen);
171 m_num_samples=colors.maxCoeff()+1;
172 SG_DEBUG(
"Using %d samples (aka colours) for probing trace sampler\n",
181 SGVector<float64_t> CProbingSampler::sample(
index_t idx)
const
183 REQUIRE(idx<m_num_samples,
"Given index (%d) must be smaller than "
184 "number of samples to draw (%d)\n", idx, m_num_samples);
186 SGVector<float64_t> s(m_dimension);
189 for (
index_t i=0; i<m_dimension; ++i)
191 if (m_coloring_vector[i]==idx)
203 #endif // HAVE_EIGEN3
204 #endif // HAVE_COLPACK