46 NodeData(
const GM& gm,
const std::vector<typename GM::IndexType>& factorIDs);
52 const std::vector<typename GM::IndexType> factorIDs_;
58 EdgeData(
const GM& gm,
const typename GM::IndexType factorID);
64 const typename GM::IndexType factorID_;
100 static int GetSizeInBytes(GlobalSize Kglobal, LocalSize Ki, LocalSize Kj, EdgeData data);
101 static int GetBufSizeInBytes(
int vectorMaxSizeInBytes);
102 void Initialize(GlobalSize Kglobal, LocalSize Ki, LocalSize Kj, EdgeData data, Vector* Di, Vector* Dj);
103 Vector* GetMessagePtr();
104 void Swap(GlobalSize Kglobal, LocalSize Ki, LocalSize Kj);
131 REAL UpdateMessage(GlobalSize Kglobal, LocalSize Ksource, LocalSize Kdest, Vector* source, REAL gamma,
int dir,
void* buf);
136 void AddColumn(GlobalSize Kglobal, LocalSize Ksource, LocalSize Kdest, Label ksource, Vector* dest,
int dir);
141 typename GM::IndexType factorID_;
187 return K.m_K*
sizeof(
REAL);
193 for (
int k=0; k<K.m_K; k++) {
195 for(
typename std::vector<typename GM::IndexType>::const_iterator iter = data.factorIDs_.begin(); iter != data.factorIDs_.end(); iter++) {
196 m_data[k] += data.gm_[*iter](&k);
204 for(
typename std::vector<typename GM::IndexType>::const_iterator iter = data.factorIDs_.begin(); iter != data.factorIDs_.end(); iter++) {
205 for (
int k=0; k<K.m_K; k++)
207 m_data[k] += data.gm_[*iter](&k);
215 memset(m_data, 0, K.m_K*
sizeof(
REAL));
221 memcpy(m_data, V->m_data, K.m_K*
sizeof(
REAL));
227 for (
int k=0; k<K.m_K; k++)
229 m_data[k] += V->m_data[k];
236 assert(k>=0 && k<K.m_K);
243 REAL vMin = m_data[0];
245 for (
int k=1; k<K.m_K; k++)
247 if (vMin > m_data[k])
260 REAL vMin = m_data[0];
261 for (
int k=1; k<K.m_K; k++)
263 if (vMin > m_data[k])
268 for (
int k=0; k<K.m_K; k++)
285 assert(k>=0 && k<K.m_K);
292 assert(k>=0 && k<K.m_K);
301 int messageSizeInBytes = ((Ki.m_K > Kj.m_K) ? Ki.m_K : Kj.m_K)*
sizeof(
REAL);
302 return sizeof(Edge) + messageSizeInBytes;
315 factorID_ = data.factorID_;
318 m_message = (Vector*)((
char*)
this +
sizeof(Edge));
319 memset(m_message->m_data, 0, ((Ki.m_K > Kj.m_K) ? Ki.m_K : Kj.m_K)*
sizeof(
REAL));
337 Vector* buf = (Vector*) _buf;
342 for (ksource=0; ksource<Ksource.m_K; ksource++)
344 buf->m_data[ksource] = gamma*source->m_data[ksource] - m_message->m_data[ksource];
349 for (kdest=0; kdest<Kdest.m_K; kdest++)
351 typename GM::IndexType index[] = {0,
static_cast<typename GM::IndexType
>(kdest)};
352 vMin = buf->m_data[0] + (*gm_)[factorID_](index);
353 for (ksource=1; ksource<Ksource.m_K; ksource++)
357 if (vMin > buf->m_data[ksource] + (*gm_)[factorID_](index))
359 vMin = buf->m_data[ksource] + (*gm_)[factorID_](index);
362 m_message->m_data[kdest] = vMin;
367 for (kdest=0; kdest<Kdest.m_K; kdest++)
369 typename GM::IndexType index[] = {
static_cast<typename GM::IndexType
>(kdest), 0};
370 vMin = buf->m_data[0] + (*gm_)[factorID_](index);
371 for (ksource=1; ksource<Ksource.m_K; ksource++)
374 if (vMin > buf->m_data[ksource] + (*gm_)[factorID_](index))
376 vMin = buf->m_data[ksource] + (*gm_)[factorID_](index);
379 m_message->m_data[kdest] = vMin;
383 vMin = m_message->m_data[0];
384 for (kdest=1; kdest<Kdest.m_K; kdest++)
386 if (vMin > m_message->m_data[kdest])
388 vMin = m_message->m_data[kdest];
392 for (kdest=0; kdest<Kdest.m_K; kdest++)
394 m_message->m_data[kdest] -= vMin;
403 assert(ksource>=0 && ksource<Ksource.m_K);
411 typename GM::IndexType index[] = {
static_cast<typename GM::IndexType
>(ksource), 0};
412 for (k=0; k<Kdest.m_K; k++)
415 dest->m_data[k] += (*gm_)[factorID_](index);
420 typename GM::IndexType index[] = {0,
static_cast<typename GM::IndexType
>(ksource)};
421 for (k=0; k<Kdest.m_K; k++)
424 dest->m_data[k] += (*gm_)[factorID_](index);
EdgeData(const GM &gm, const typename GM::IndexType factorID)
NodeData(const GM &gm, const std::vector< typename GM::IndexType > &factorIDs)