Optimized Belief Propagation (CPU and GPU)
SharedBpProcessingFuncts.h
Go to the documentation of this file.
1 /*
2 Copyright (C) 2024 Scott Grauer-Gray
3 
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
8 
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
13 
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 */
18 
28 #ifndef SHARED_BP_PROCESSING_FUNCTS_H_
29 #define SHARED_BP_PROCESSING_FUNCTS_H_
30 
33 #include "RunImp/UtilityFuncts.h"
38 #include "SharedBpUtilFuncts.h"
39 
40 namespace beliefprop {
41 
51 template<RunData_t T, unsigned int DISP_VALS>
52 ARCHITECTURE_ADDITION inline void DtStereo(T f[DISP_VALS])
53 {
54  T prev;
55  for (unsigned int current_disparity = 1; current_disparity < DISP_VALS; current_disparity++)
56  {
57  prev = f[current_disparity-1] + (T)1.0;
58  if (prev < f[current_disparity])
59  f[current_disparity] = prev;
60  }
61 
62  for (int current_disparity = (int)DISP_VALS - 2; current_disparity >= 0; current_disparity--)
63  {
64  prev = f[current_disparity + 1] + (T)1.0;
65  if (prev < f[current_disparity])
66  f[current_disparity] = prev;
67  }
68 }
69 
70 template<RunData_t T>
71 ARCHITECTURE_ADDITION inline void DtStereo(T* f, unsigned int bp_settings_disp_vals)
72 {
73  T prev;
74  for (unsigned int current_disparity = 1; current_disparity < bp_settings_disp_vals; current_disparity++)
75  {
76  prev = f[current_disparity-1] + (T)1.0;
77  if (prev < f[current_disparity])
78  f[current_disparity] = prev;
79  }
80 
81  for (int current_disparity = (int)bp_settings_disp_vals - 2; current_disparity >= 0; current_disparity--)
82  {
83  prev = f[current_disparity + 1] + (T)1.0;
84  if (prev < f[current_disparity])
85  f[current_disparity] = prev;
86  }
87 }
88 
89 template<RunData_t T>
90 ARCHITECTURE_ADDITION inline void DtStereo(T* f, unsigned int bp_settings_disp_vals,
91  unsigned int x_val, unsigned int y_val, const beliefprop::BpLevelProperties& current_bp_level)
92 {
93  unsigned int fArrayIndexDisp0 = RetrieveIndexInDataAndMessage(x_val, y_val,
94  current_bp_level.padded_width_checkerboard_level_,
95  current_bp_level.height_level_, 0,
96  bp_settings_disp_vals);
97  unsigned int currFArrayIndexLast = fArrayIndexDisp0;
98  unsigned int currFArrayIndex = fArrayIndexDisp0;
99  T prev;
100 
101  for (unsigned int current_disparity = 1; current_disparity < bp_settings_disp_vals; current_disparity++)
102  {
104  currFArrayIndex += current_bp_level.padded_width_checkerboard_level_;
105  }
106  else {
107  currFArrayIndex++;
108  }
109 
110  prev = f[currFArrayIndexLast] + (T)1.0;
111  if (prev < f[currFArrayIndex])
112  f[currFArrayIndex] = prev;
113  currFArrayIndexLast = currFArrayIndex;
114  }
115 
116  for (int current_disparity = (int)bp_settings_disp_vals - 2; current_disparity >= 0; current_disparity--)
117  {
119  currFArrayIndex -= current_bp_level.padded_width_checkerboard_level_;
120  }
121  else {
122  currFArrayIndex--;
123  }
124 
125  prev = f[currFArrayIndexLast] + (T)1.0;
126  if (prev < f[currFArrayIndex])
127  f[currFArrayIndex] = prev;
128  currFArrayIndexLast = currFArrayIndex;
129  }
130 }
131 
132 template<RunData_t T, RunData_t U, unsigned int DISP_VALS>
134  unsigned int x_val, unsigned int y_val,
135  const beliefprop::BpLevelProperties& current_bp_level,
136  const U messages_neighbor_1[DISP_VALS], const U messages_neighbor_2[DISP_VALS],
137  const U messages_neighbor_3[DISP_VALS], const U data_costs[DISP_VALS],
138  T* dst_message_array, U disc_k_bp, bool data_aligned)
139 {
140  // aggregate and find min
141  U minimum{(U)beliefprop::kHighValBpKernel};
142  U dst[DISP_VALS];
143 
144  for (unsigned int current_disparity = 0; current_disparity < DISP_VALS; current_disparity++)
145  {
146  dst[current_disparity] = messages_neighbor_1[current_disparity] + messages_neighbor_2[current_disparity] +
147  messages_neighbor_3[current_disparity] + data_costs[current_disparity];
148  if (dst[current_disparity] < minimum)
149  minimum = dst[current_disparity];
150  }
151 
152  //retrieve the minimum value at each disparity in O(n) time using Felzenszwalb's method
153  //(see "Efficient Belief Propagation for Early Vision")
154  DtStereo<U, DISP_VALS>(dst);
155 
156  // truncate
157  minimum += disc_k_bp;
158 
159  // normalize
160  U val_to_normalize{(U)0.0};
161 
162  for (unsigned int current_disparity = 0; current_disparity < DISP_VALS; current_disparity++) {
163  if (minimum < dst[current_disparity]) {
164  dst[current_disparity] = minimum;
165  }
166 
167  val_to_normalize += dst[current_disparity];
168  }
169 
170  val_to_normalize /= ((U)DISP_VALS);
171 
172  int dest_message_array_index = RetrieveIndexInDataAndMessage(x_val, y_val,
173  current_bp_level.padded_width_checkerboard_level_,
174  current_bp_level.height_level_, 0,
175  DISP_VALS);
176 
177  for (unsigned int current_disparity = 0; current_disparity < DISP_VALS; current_disparity++) {
178  dst[current_disparity] -= val_to_normalize;
179  dst_message_array[dest_message_array_index] =
180  util_functs::ConvertValToDifferentDataTypeIfNeeded<U, T>(dst[current_disparity]);
182  dest_message_array_index += current_bp_level.padded_width_checkerboard_level_;
183  }
184  else {
185  dest_message_array_index++;
186  }
187  }
188 }
189 
190 template<RunData_t T, RunData_t U>
192  unsigned int x_val, unsigned int y_val,
193  const beliefprop::BpLevelProperties& current_bp_level,
194  const U* messages_neighbor_1, const U* messages_neighbor_2,
195  const U* messages_neighbor_3, const U* data_costs,
196  T* dst_message_array, U disc_k_bp, bool data_aligned,
197  unsigned int bp_settings_disp_vals)
198 {
199  // aggregate and find min
200  U minimum{(U)beliefprop::kHighValBpKernel};
201  U* dst = new U[bp_settings_disp_vals];
202 
203  for (unsigned int current_disparity = 0; current_disparity < bp_settings_disp_vals; current_disparity++)
204  {
205  dst[current_disparity] = messages_neighbor_1[current_disparity] + messages_neighbor_2[current_disparity] +
206  messages_neighbor_3[current_disparity] + data_costs[current_disparity];
207  if (dst[current_disparity] < minimum)
208  minimum = dst[current_disparity];
209  }
210 
211  //retrieve the minimum value at each disparity in O(n) time using Felzenszwalb's method
212  //(see "Efficient Belief Propagation for Early Vision")
213  DtStereo<U>(dst, bp_settings_disp_vals);
214 
215  // truncate
216  minimum += disc_k_bp;
217 
218  // normalize
219  U val_to_normalize{(U)0.0};
220 
221  for (unsigned int current_disparity = 0; current_disparity < bp_settings_disp_vals; current_disparity++) {
222  if (minimum < dst[current_disparity]) {
223  dst[current_disparity] = minimum;
224  }
225 
226  val_to_normalize += dst[current_disparity];
227  }
228 
229  val_to_normalize /= ((U)bp_settings_disp_vals);
230 
231  int dest_message_array_index = RetrieveIndexInDataAndMessage(x_val, y_val,
232  current_bp_level.padded_width_checkerboard_level_,
233  current_bp_level.height_level_, 0,
234  bp_settings_disp_vals);
235 
236  for (unsigned int current_disparity = 0; current_disparity < bp_settings_disp_vals; current_disparity++) {
237  dst[current_disparity] -= val_to_normalize;
238  dst_message_array[dest_message_array_index] =
239  util_functs::ConvertValToDifferentDataTypeIfNeeded<U, T>(dst[current_disparity]);
241  dest_message_array_index += current_bp_level.padded_width_checkerboard_level_;
242  }
243  else {
244  dest_message_array_index++;
245  }
246  }
247 
248  delete [] dst;
249 }
250 
251 template<RunData_t T, RunData_t U, beliefprop::MessageComp M>
253  unsigned int x_val, unsigned int y_val,
254  const beliefprop::BpLevelProperties& current_bp_level,
255  const T* prev_u_message_array, const T* prev_d_message_array,
256  const T* prev_l_message_array, const T* prev_r_message_array,
257  const T* data_message_array, T* dst_message_array,
258  U disc_k_bp, bool data_aligned, unsigned int bp_settings_disp_vals,
259  U* dst_processing, unsigned int checkerboard_adjustment,
260  unsigned int offset_data, unsigned int current_disparity,
261  unsigned int proc_array_idx)
262 {
263  const U dataVal = util_functs::ConvertValToDifferentDataTypeIfNeeded<T, U>(data_message_array[
264  RetrieveIndexInDataAndMessage(x_val, y_val,
265  current_bp_level.padded_width_checkerboard_level_, current_bp_level.height_level_,
266  current_disparity, bp_settings_disp_vals, offset_data)]);
267 
268  if constexpr (M == beliefprop::MessageComp::kUMessage) {
269  const U prevUVal = util_functs::ConvertValToDifferentDataTypeIfNeeded<T, U>(prev_u_message_array[
270  RetrieveIndexInDataAndMessage(x_val, (y_val+1),
271  current_bp_level.padded_width_checkerboard_level_, current_bp_level.height_level_,
272  current_disparity, bp_settings_disp_vals)]);
273  const U prevLVal = util_functs::ConvertValToDifferentDataTypeIfNeeded<T, U>(prev_l_message_array[
274  RetrieveIndexInDataAndMessage((x_val + checkerboard_adjustment), y_val,
275  current_bp_level.padded_width_checkerboard_level_, current_bp_level.height_level_,
276  current_disparity, bp_settings_disp_vals)]);
277  const U prevRVal = util_functs::ConvertValToDifferentDataTypeIfNeeded<T, U>(prev_r_message_array[
278  RetrieveIndexInDataAndMessage(((x_val + checkerboard_adjustment) - 1), y_val,
279  current_bp_level.padded_width_checkerboard_level_, current_bp_level.height_level_,
280  current_disparity, bp_settings_disp_vals)]);
281 
282  dst_processing[proc_array_idx] = prevUVal + prevLVal + prevRVal + dataVal;
283  }
284  else if constexpr (M == beliefprop::MessageComp::kDMessage) {
285  const U prevDVal = util_functs::ConvertValToDifferentDataTypeIfNeeded<T, U>(prev_d_message_array[
286  RetrieveIndexInDataAndMessage(x_val, (y_val-1),
287  current_bp_level.padded_width_checkerboard_level_, current_bp_level.height_level_,
288  current_disparity, bp_settings_disp_vals)]);
289  const U prevLVal = util_functs::ConvertValToDifferentDataTypeIfNeeded<T, U>(prev_l_message_array[
290  RetrieveIndexInDataAndMessage((x_val + checkerboard_adjustment), y_val,
291  current_bp_level.padded_width_checkerboard_level_, current_bp_level.height_level_,
292  current_disparity, bp_settings_disp_vals)]);
293  const U prevRVal = util_functs::ConvertValToDifferentDataTypeIfNeeded<T, U>(prev_r_message_array[
294  RetrieveIndexInDataAndMessage(((x_val + checkerboard_adjustment) - 1), y_val,
295  current_bp_level.padded_width_checkerboard_level_, current_bp_level.height_level_,
296  current_disparity, bp_settings_disp_vals)]);
297 
298  dst_processing[proc_array_idx] = prevDVal + prevLVal + prevRVal + dataVal;
299  }
300  else if constexpr (M == beliefprop::MessageComp::kLMessage) {
301  const U prevUVal = util_functs::ConvertValToDifferentDataTypeIfNeeded<T, U>(prev_u_message_array[
302  RetrieveIndexInDataAndMessage(x_val, (y_val+1),
303  current_bp_level.padded_width_checkerboard_level_, current_bp_level.height_level_,
304  current_disparity, bp_settings_disp_vals)]);
305  const U prevDVal = util_functs::ConvertValToDifferentDataTypeIfNeeded<T, U>(prev_d_message_array[
306  RetrieveIndexInDataAndMessage(x_val, (y_val-1),
307  current_bp_level.padded_width_checkerboard_level_, current_bp_level.height_level_,
308  current_disparity, bp_settings_disp_vals)]);
309  const U prevLVal = util_functs::ConvertValToDifferentDataTypeIfNeeded<T, U>(prev_l_message_array[
310  RetrieveIndexInDataAndMessage((x_val + checkerboard_adjustment), y_val,
311  current_bp_level.padded_width_checkerboard_level_, current_bp_level.height_level_,
312  current_disparity, bp_settings_disp_vals)]);
313 
314  dst_processing[proc_array_idx] = prevUVal + prevDVal + prevLVal + dataVal;
315  }
316  else if constexpr (M == beliefprop::MessageComp::kRMessage) {
317  const U prevUVal = util_functs::ConvertValToDifferentDataTypeIfNeeded<T, U>(prev_u_message_array[
318  RetrieveIndexInDataAndMessage(x_val, (y_val+1),
319  current_bp_level.padded_width_checkerboard_level_, current_bp_level.height_level_,
320  current_disparity, bp_settings_disp_vals)]);
321  const U prevDVal = util_functs::ConvertValToDifferentDataTypeIfNeeded<T, U>(prev_d_message_array[
322  RetrieveIndexInDataAndMessage(x_val, (y_val-1),
323  current_bp_level.padded_width_checkerboard_level_, current_bp_level.height_level_,
324  current_disparity, bp_settings_disp_vals)]);
325  const U prevRVal = util_functs::ConvertValToDifferentDataTypeIfNeeded<T, U>(prev_r_message_array[
326  RetrieveIndexInDataAndMessage(((x_val + checkerboard_adjustment) - 1), y_val,
327  current_bp_level.padded_width_checkerboard_level_, current_bp_level.height_level_,
328  current_disparity, bp_settings_disp_vals)]);
329 
330  dst_processing[proc_array_idx] = prevUVal + prevDVal + prevRVal + dataVal;
331  }
332 }
333 
334 template<RunData_t T, RunData_t U, beliefprop::MessageComp M>
335 ARCHITECTURE_ADDITION inline void MsgStereo(unsigned int x_val, unsigned int y_val,
336  const beliefprop::BpLevelProperties& current_bp_level,
337  const T* prev_u_message_array, const T* prev_d_message_array,
338  const T* prev_l_message_array, const T* prev_r_message_array,
339  const T* data_message_array, T* dst_message_array,
340  U disc_k_bp, bool data_aligned, unsigned int bp_settings_disp_vals,
341  U* dst_processing, unsigned int checkerboard_adjustment,
342  unsigned int offset_data)
343 {
344  // aggregate and find min
345  U minimum{(U)beliefprop::kHighValBpKernel};
346  unsigned int proc_array_idx_disp_0 = RetrieveIndexInDataAndMessage(x_val, y_val,
347  current_bp_level.padded_width_checkerboard_level_,
348  current_bp_level.height_level_, 0,
349  bp_settings_disp_vals);
350  unsigned int proc_array_idx{proc_array_idx_disp_0};
351 
352  for (unsigned int current_disparity = 0; current_disparity < bp_settings_disp_vals; current_disparity++)
353  {
354  //set initial dst processing array value corresponding to disparity for M message type
355  SetInitDstProcessing<T, U, M>(x_val, y_val, current_bp_level, prev_u_message_array, prev_d_message_array,
356  prev_l_message_array, prev_r_message_array, data_message_array, dst_message_array,
357  disc_k_bp, data_aligned, bp_settings_disp_vals, dst_processing, checkerboard_adjustment,
358  offset_data, current_disparity, proc_array_idx);
359 
360  if (dst_processing[proc_array_idx] < minimum)
361  minimum = dst_processing[proc_array_idx];
362 
364  proc_array_idx += current_bp_level.padded_width_checkerboard_level_;
365  }
366  else {
367  proc_array_idx++;
368  }
369  }
370 
371  //retrieve the minimum value at each disparity in O(n) time using Felzenszwalb's method
372  //(see "Efficient Belief Propagation for Early Vision")
373  DtStereo<U>(dst_processing, bp_settings_disp_vals, x_val, y_val, current_bp_level);
374 
375  // truncate
376  minimum += disc_k_bp;
377 
378  // normalize
379  U val_to_normalize{(U)0.0};
380 
381  proc_array_idx = proc_array_idx_disp_0;
382  for (unsigned int current_disparity = 0; current_disparity < bp_settings_disp_vals; current_disparity++) {
383  if (minimum < dst_processing[proc_array_idx]) {
384  dst_processing[proc_array_idx] = minimum;
385  }
386 
387  val_to_normalize += dst_processing[proc_array_idx];
388 
390  proc_array_idx += current_bp_level.padded_width_checkerboard_level_;
391  }
392  else {
393  proc_array_idx++;
394  }
395  }
396 
397  val_to_normalize /= ((U)bp_settings_disp_vals);
398 
399  //dst processing index and message array index are the same for each disparity value in this processing
400  proc_array_idx = proc_array_idx_disp_0;
401 
402  for (unsigned int current_disparity = 0; current_disparity < bp_settings_disp_vals; current_disparity++) {
403  dst_processing[proc_array_idx] -= val_to_normalize;
404  dst_message_array[proc_array_idx] =
405  util_functs::ConvertValToDifferentDataTypeIfNeeded<U, T>(dst_processing[proc_array_idx]);
407  proc_array_idx += current_bp_level.padded_width_checkerboard_level_;
408  }
409  else {
410  proc_array_idx++;
411  }
412  }
413 }
414 
432 template<RunData_t T, unsigned int DISP_VALS>
434  unsigned int x_val, unsigned int y_val,
435  const beliefprop::BpLevelProperties& current_bp_level,
436  const float* image_1_pixels_device, const float* image_2_pixels_device,
437  T* data_cost_stereo_checkerboard_0,
438  T* data_cost_stereo_checkerboard_1,
439  float lambda_bp, float data_k_bp, unsigned int bp_settings_disp_vals)
440 {
441  if constexpr (DISP_VALS > 0) {
442  unsigned int index_val;
443  const unsigned int x_checkerboard = x_val / 2;
444 
446  x_checkerboard, y_val, current_bp_level.width_checkerboard_level_, current_bp_level.height_level_)) {
447  //make sure that it is possible to check every disparity value
448  //need to cast DISP_VALS from unsigned int to int
449  //for conditional to work as expected
450  if (((int)x_val - ((int)DISP_VALS - 1)) >= 0) {
451  for (unsigned int current_disparity = 0; current_disparity < DISP_VALS; current_disparity++) {
452  float current_pixel_image_1{0}, current_pixel_image_2{0};
453 
454  if (beliefprop::WithinImageBounds(x_val, y_val, current_bp_level.width_level_, current_bp_level.height_level_)) {
455  current_pixel_image_1 = image_1_pixels_device[y_val * current_bp_level.width_level_ + x_val];
456  current_pixel_image_2 = image_2_pixels_device[y_val * current_bp_level.width_level_ + (x_val - current_disparity)];
457  }
458 
459  index_val = RetrieveIndexInDataAndMessage(x_checkerboard, y_val,
460  current_bp_level.padded_width_checkerboard_level_,
461  current_bp_level.height_level_, current_disparity,
462  DISP_VALS);
463 
464  //data cost is equal to dataWeight value for weighting times the absolute difference
465  //in corresponding pixel intensity values capped at dataCostCap
466  if (((x_val + y_val) % 2) == 0) {
467  data_cost_stereo_checkerboard_0[index_val] = util_functs::ConvertValToDifferentDataTypeIfNeeded<float, T>(
468  (float)(lambda_bp * util_functs::GetMin<float>((fabs(current_pixel_image_1 - current_pixel_image_2)), data_k_bp)));
469  }
470  else {
471  data_cost_stereo_checkerboard_1[index_val] = util_functs::ConvertValToDifferentDataTypeIfNeeded<float, T>(
472  (float)(lambda_bp * util_functs::GetMin<float>((fabs(current_pixel_image_1 - current_pixel_image_2)), data_k_bp)));
473  }
474  }
475  } else {
476  for (unsigned int current_disparity = 0; current_disparity < DISP_VALS; current_disparity++) {
477  index_val = RetrieveIndexInDataAndMessage(x_checkerboard, y_val,
478  current_bp_level.padded_width_checkerboard_level_, current_bp_level.height_level_,
479  current_disparity, DISP_VALS);
480 
481  //set data cost to zero if not possible to determine cost at disparity for pixel
482  if (((x_val + y_val) % 2) == 0) {
483  data_cost_stereo_checkerboard_0[index_val] = util_functs::ZeroVal<T>();
484  }
485  else {
486  data_cost_stereo_checkerboard_1[index_val] = util_functs::ZeroVal<T>();
487  }
488  }
489  }
490  }
491  }
492  else {
493  unsigned int index_val;
494  const unsigned int x_checkerboard = x_val / 2;
495 
497  x_checkerboard, y_val, current_bp_level.width_checkerboard_level_, current_bp_level.height_level_)) {
498  //make sure that it is possible to check every disparity value
499  //need to cast bp_settings_disp_vals from unsigned int to int
500  //for conditional to work as expected
501  if (((int)x_val - ((int)bp_settings_disp_vals - 1)) >= 0) {
502  for (unsigned int current_disparity = 0; current_disparity < bp_settings_disp_vals; current_disparity++) {
503  float current_pixel_image_1{0}, current_pixel_image_2{0};
504 
505  if (beliefprop::WithinImageBounds(x_val, y_val, current_bp_level.width_level_, current_bp_level.height_level_)) {
506  current_pixel_image_1 = image_1_pixels_device[y_val * current_bp_level.width_level_ + x_val];
507  current_pixel_image_2 = image_2_pixels_device[y_val * current_bp_level.width_level_ + (x_val - current_disparity)];
508  }
509 
510  index_val = RetrieveIndexInDataAndMessage(x_checkerboard, y_val,
511  current_bp_level.padded_width_checkerboard_level_,
512  current_bp_level.height_level_, current_disparity,
513  bp_settings_disp_vals);
514 
515  //data cost is equal to dataWeight value for weighting times the absolute difference
516  //in corresponding pixel intensity values capped at dataCostCap
517  if (((x_val + y_val) % 2) == 0) {
518  data_cost_stereo_checkerboard_0[index_val] = util_functs::ConvertValToDifferentDataTypeIfNeeded<float, T>(
519  (float)(lambda_bp * util_functs::GetMin<float>((fabs(current_pixel_image_1 - current_pixel_image_2)), data_k_bp)));
520  }
521  else {
522  data_cost_stereo_checkerboard_1[index_val] = util_functs::ConvertValToDifferentDataTypeIfNeeded<float, T>(
523  (float)(lambda_bp * util_functs::GetMin<float>((fabs(current_pixel_image_1 - current_pixel_image_2)), data_k_bp)));
524  }
525  }
526  } else {
527  for (unsigned int current_disparity = 0; current_disparity < bp_settings_disp_vals; current_disparity++) {
528  index_val = RetrieveIndexInDataAndMessage(x_checkerboard, y_val,
529  current_bp_level.padded_width_checkerboard_level_, current_bp_level.height_level_,
530  current_disparity, bp_settings_disp_vals);
531 
532  //set data cost to zero if not possible to determine cost at disparity for pixel
533  if (((x_val + y_val) % 2) == 0) {
534  data_cost_stereo_checkerboard_0[index_val] = util_functs::ZeroVal<T>();
535  }
536  else {
537  data_cost_stereo_checkerboard_1[index_val] = util_functs::ZeroVal<T>();
538  }
539  }
540  }
541  }
542  }
543 }
544 
563 template<RunData_t T, RunData_t U, unsigned int DISP_VALS>
565  unsigned int x_val, unsigned int y_val,
566  beliefprop::CheckerboardPart checkerboard_part,
567  const beliefprop::BpLevelProperties& current_bp_level,
568  const beliefprop::BpLevelProperties& prev_bp_level,
569  const T* data_cost_checkerboard_0, const T* data_cost_checkerboard_1,
570  T* data_cost_current_level, unsigned int offset_num,
571  unsigned int bp_settings_disp_vals)
572 {
573  //add 1 or 0 to the x-value depending on checkerboard part and row
574  //beliefprop::CheckerboardPart::kCheckerboardPart0 with slot at (0, 0) has adjustment of 0 in row 0,
575  //beliefprop::CheckerboardPart::kCheckerboardPart1 with slot at (0, 1) has adjustment of 1 in row 0
576  const unsigned int checkerboard_part_adjustment =
577  (checkerboard_part == beliefprop::CheckerboardPart::kCheckerboardPart0) ? (y_val % 2) : ((y_val + 1) % 2);
578 
579  //the corresponding x-values at the "lower" level depends on which checkerboard the pixel is in
580  const unsigned int x_val_prev = x_val*2 + checkerboard_part_adjustment;
581 
583  x_val_prev, (y_val * 2 + 1), prev_bp_level.width_checkerboard_level_, prev_bp_level.height_level_))
584  {
585  if constexpr (DISP_VALS > 0) {
586  for (unsigned int current_disparity = 0; current_disparity < DISP_VALS; current_disparity++) {
587  const U data_cost =
588  util_functs::ConvertValToDifferentDataTypeIfNeeded<T, U>(data_cost_checkerboard_0[RetrieveIndexInDataAndMessage(
589  x_val_prev, y_val*2, prev_bp_level.padded_width_checkerboard_level_, prev_bp_level.height_level_,
590  current_disparity, DISP_VALS, offset_num)]) +
591  util_functs::ConvertValToDifferentDataTypeIfNeeded<T, U>(data_cost_checkerboard_1[RetrieveIndexInDataAndMessage(
592  x_val_prev, y_val*2, prev_bp_level.padded_width_checkerboard_level_, prev_bp_level.height_level_,
593  current_disparity, DISP_VALS, offset_num)]) +
594  util_functs::ConvertValToDifferentDataTypeIfNeeded<T, U>(data_cost_checkerboard_1[RetrieveIndexInDataAndMessage(
595  x_val_prev, y_val*2 + 1, prev_bp_level.padded_width_checkerboard_level_, prev_bp_level.height_level_,
596  current_disparity, DISP_VALS, offset_num)]) +
597  util_functs::ConvertValToDifferentDataTypeIfNeeded<T, U>(data_cost_checkerboard_0[RetrieveIndexInDataAndMessage(
598  x_val_prev, y_val*2 + 1, prev_bp_level.padded_width_checkerboard_level_, prev_bp_level.height_level_,
599  current_disparity, DISP_VALS, offset_num)]);
600 
601  data_cost_current_level[RetrieveIndexInDataAndMessage(x_val, y_val,
602  current_bp_level.padded_width_checkerboard_level_,
603  current_bp_level.height_level_, current_disparity,
604  DISP_VALS)] =
605  util_functs::ConvertValToDifferentDataTypeIfNeeded<U, T>(data_cost);
606  }
607  }
608  else {
609  for (unsigned int current_disparity = 0; current_disparity < bp_settings_disp_vals; current_disparity++) {
610  const U data_cost =
611  util_functs::ConvertValToDifferentDataTypeIfNeeded<T, U>(data_cost_checkerboard_0[RetrieveIndexInDataAndMessage(
612  x_val_prev, y_val*2, prev_bp_level.padded_width_checkerboard_level_, prev_bp_level.height_level_,
613  current_disparity, bp_settings_disp_vals, offset_num)]) +
614  util_functs::ConvertValToDifferentDataTypeIfNeeded<T, U>(data_cost_checkerboard_1[RetrieveIndexInDataAndMessage(
615  x_val_prev, y_val*2, prev_bp_level.padded_width_checkerboard_level_, prev_bp_level.height_level_,
616  current_disparity, bp_settings_disp_vals, offset_num)]) +
617  util_functs::ConvertValToDifferentDataTypeIfNeeded<T, U>(data_cost_checkerboard_1[RetrieveIndexInDataAndMessage(
618  x_val_prev, y_val*2 + 1, prev_bp_level.padded_width_checkerboard_level_, prev_bp_level.height_level_,
619  current_disparity, bp_settings_disp_vals, offset_num)]) +
620  util_functs::ConvertValToDifferentDataTypeIfNeeded<T, U>(data_cost_checkerboard_0[RetrieveIndexInDataAndMessage(
621  x_val_prev, y_val*2 + 1, prev_bp_level.padded_width_checkerboard_level_, prev_bp_level.height_level_,
622  current_disparity, bp_settings_disp_vals, offset_num)]);
623 
624  data_cost_current_level[RetrieveIndexInDataAndMessage(x_val, y_val,
625  current_bp_level.padded_width_checkerboard_level_,
626  current_bp_level.height_level_, current_disparity,
627  bp_settings_disp_vals)] =
628  util_functs::ConvertValToDifferentDataTypeIfNeeded<U, T>(data_cost);
629  }
630  }
631  }
632 }
633 
652 template<RunData_t T, unsigned int DISP_VALS>
654  unsigned int x_val_in_checkerboard, unsigned int y_val,
655  const beliefprop::BpLevelProperties& current_bp_level,
656  T* message_u_checkerboard_0, T* message_d_checkerboard_0,
657  T* message_l_checkerboard_0, T* message_r_checkerboard_0,
658  T* message_u_checkerboard_1, T* message_d_checkerboard_1,
659  T* message_l_checkerboard_1, T* message_r_checkerboard_1,
660  unsigned int bp_settings_disp_vals)
661 {
662  //initialize message values in both checkerboards
663 
664  if constexpr (DISP_VALS > 0) {
665  //set the message value at each pixel for each disparity to 0
666  for (unsigned int current_disparity = 0; current_disparity < DISP_VALS; current_disparity++) {
667  message_u_checkerboard_0[RetrieveIndexInDataAndMessage(x_val_in_checkerboard, y_val,
668  current_bp_level.padded_width_checkerboard_level_, current_bp_level.height_level_,
669  current_disparity, DISP_VALS)] =
670  util_functs::ZeroVal<T>();
671  message_d_checkerboard_0[RetrieveIndexInDataAndMessage(x_val_in_checkerboard, y_val,
672  current_bp_level.padded_width_checkerboard_level_, current_bp_level.height_level_,
673  current_disparity, DISP_VALS)] =
674  util_functs::ZeroVal<T>();
675  message_l_checkerboard_0[RetrieveIndexInDataAndMessage(x_val_in_checkerboard, y_val,
676  current_bp_level.padded_width_checkerboard_level_, current_bp_level.height_level_,
677  current_disparity, DISP_VALS)] =
678  util_functs::ZeroVal<T>();
679  message_r_checkerboard_0[RetrieveIndexInDataAndMessage(x_val_in_checkerboard, y_val,
680  current_bp_level.padded_width_checkerboard_level_, current_bp_level.height_level_,
681  current_disparity, DISP_VALS)] =
682  util_functs::ZeroVal<T>();
683  }
684 
685  //retrieve the previous message value at each movement at each pixel
686  for (unsigned int current_disparity = 0; current_disparity < DISP_VALS; current_disparity++) {
687  message_u_checkerboard_1[RetrieveIndexInDataAndMessage(x_val_in_checkerboard, y_val,
688  current_bp_level.padded_width_checkerboard_level_, current_bp_level.height_level_,
689  current_disparity, DISP_VALS)] =
690  util_functs::ZeroVal<T>();
691  message_d_checkerboard_1[RetrieveIndexInDataAndMessage(x_val_in_checkerboard, y_val,
692  current_bp_level.padded_width_checkerboard_level_, current_bp_level.height_level_,
693  current_disparity, DISP_VALS)] =
694  util_functs::ZeroVal<T>();
695  message_l_checkerboard_1[RetrieveIndexInDataAndMessage(x_val_in_checkerboard, y_val,
696  current_bp_level.padded_width_checkerboard_level_, current_bp_level.height_level_,
697  current_disparity, DISP_VALS)] =
698  util_functs::ZeroVal<T>();
699  message_r_checkerboard_1[RetrieveIndexInDataAndMessage(x_val_in_checkerboard, y_val,
700  current_bp_level.padded_width_checkerboard_level_, current_bp_level.height_level_,
701  current_disparity, DISP_VALS)] =
702  util_functs::ZeroVal<T>();
703  }
704  }
705  else {
706  //set the message value at each pixel for each disparity to 0
707  for (unsigned int current_disparity = 0; current_disparity < bp_settings_disp_vals; current_disparity++) {
708  message_u_checkerboard_0[RetrieveIndexInDataAndMessage(x_val_in_checkerboard, y_val,
709  current_bp_level.padded_width_checkerboard_level_, current_bp_level.height_level_,
710  current_disparity, bp_settings_disp_vals)] =
711  util_functs::ZeroVal<T>();
712  message_d_checkerboard_0[RetrieveIndexInDataAndMessage(x_val_in_checkerboard, y_val,
713  current_bp_level.padded_width_checkerboard_level_, current_bp_level.height_level_,
714  current_disparity, bp_settings_disp_vals)] =
715  util_functs::ZeroVal<T>();
716  message_l_checkerboard_0[RetrieveIndexInDataAndMessage(x_val_in_checkerboard, y_val,
717  current_bp_level.padded_width_checkerboard_level_, current_bp_level.height_level_,
718  current_disparity, bp_settings_disp_vals)] =
719  util_functs::ZeroVal<T>();
720  message_r_checkerboard_0[RetrieveIndexInDataAndMessage(x_val_in_checkerboard, y_val,
721  current_bp_level.padded_width_checkerboard_level_, current_bp_level.height_level_,
722  current_disparity, bp_settings_disp_vals)] =
723  util_functs::ZeroVal<T>();
724  }
725 
726  //retrieve the previous message value at each movement at each pixel
727  for (unsigned int current_disparity = 0; current_disparity < bp_settings_disp_vals; current_disparity++) {
728  message_u_checkerboard_1[RetrieveIndexInDataAndMessage(x_val_in_checkerboard, y_val,
729  current_bp_level.padded_width_checkerboard_level_, current_bp_level.height_level_,
730  current_disparity, bp_settings_disp_vals)] =
731  util_functs::ZeroVal<T>();
732  message_d_checkerboard_1[RetrieveIndexInDataAndMessage(x_val_in_checkerboard, y_val,
733  current_bp_level.padded_width_checkerboard_level_, current_bp_level.height_level_,
734  current_disparity, bp_settings_disp_vals)] =
735  util_functs::ZeroVal<T>();
736  message_l_checkerboard_1[RetrieveIndexInDataAndMessage(x_val_in_checkerboard, y_val,
737  current_bp_level.padded_width_checkerboard_level_, current_bp_level.height_level_,
738  current_disparity, bp_settings_disp_vals)] =
739  util_functs::ZeroVal<T>();
740  message_r_checkerboard_1[RetrieveIndexInDataAndMessage(x_val_in_checkerboard, y_val,
741  current_bp_level.padded_width_checkerboard_level_, current_bp_level.height_level_,
742  current_disparity, bp_settings_disp_vals)] =
743  util_functs::ZeroVal<T>();
744  }
745  }
746 }
747 
771 template<RunData_t T, RunData_t U, unsigned int DISP_VALS>
773  unsigned int x_val, unsigned int y_val,
774  const beliefprop::BpLevelProperties& current_bp_level,
775  const U prev_u_message[DISP_VALS], const U prev_d_message[DISP_VALS],
776  const U prev_l_message[DISP_VALS], const U prev_r_message[DISP_VALS],
777  const U data_message[DISP_VALS],
778  T* current_u_message, T* current_d_message,
779  T* current_l_message, T* current_r_message,
780  const U disc_k_bp, bool data_aligned)
781 {
782  MsgStereo<T, U, DISP_VALS>(x_val, y_val, current_bp_level,
783  prev_u_message, prev_l_message, prev_r_message, data_message,
784  current_u_message, disc_k_bp, data_aligned);
785 
786  MsgStereo<T, U, DISP_VALS>(x_val, y_val, current_bp_level,
787  prev_d_message, prev_l_message, prev_r_message, data_message,
788  current_d_message, disc_k_bp, data_aligned);
789 
790  MsgStereo<T, U, DISP_VALS>(x_val, y_val, current_bp_level,
791  prev_u_message, prev_d_message, prev_r_message, data_message,
792  current_r_message, disc_k_bp, data_aligned);
793 
794  MsgStereo<T, U, DISP_VALS>(x_val, y_val, current_bp_level,
795  prev_u_message, prev_d_message, prev_l_message, data_message,
796  current_l_message, disc_k_bp, data_aligned);
797 }
798 
799 template<RunData_t T, RunData_t U>
801  unsigned int x_val, unsigned int y_val,
802  const beliefprop::BpLevelProperties& current_bp_level,
803  const U* prev_u_message, const U* prev_d_message,
804  const U* prev_l_message, const U* prev_r_message,
805  const U* data_message,
806  T* current_u_message, T* current_d_message,
807  T* current_l_message, T* current_r_message,
808  const U disc_k_bp, bool data_aligned, unsigned int bp_settings_disp_vals)
809 {
810  MsgStereo<T, U>(x_val, y_val, current_bp_level,
811  prev_u_message, prev_l_message, prev_r_message, data_message,
812  current_u_message, disc_k_bp, data_aligned, bp_settings_disp_vals);
813 
814  MsgStereo<T, U>(x_val, y_val, current_bp_level,
815  prev_d_message, prev_l_message, prev_r_message, data_message,
816  current_d_message, disc_k_bp, data_aligned, bp_settings_disp_vals);
817 
818  MsgStereo<T, U>(x_val, y_val, current_bp_level,
819  prev_u_message, prev_d_message, prev_r_message, data_message,
820  current_r_message, disc_k_bp, data_aligned, bp_settings_disp_vals);
821 
822  MsgStereo<T, U>(x_val, y_val, current_bp_level,
823  prev_u_message, prev_d_message, prev_l_message, data_message,
824  current_l_message, disc_k_bp, data_aligned, bp_settings_disp_vals);
825 }
826 
827 template<RunData_t T, RunData_t U>
829  unsigned int x_val, unsigned int y_val,
830  const beliefprop::BpLevelProperties& current_bp_level,
831  const T* prev_u_message_array, const T* prev_d_message_array,
832  const T* prev_l_message_array, const T* prev_r_message_array,
833  const T* data_message_array,
834  T* current_u_message, T* current_d_message,
835  T* current_l_message, T* current_r_message,
836  const U disc_k_bp, bool data_aligned, unsigned int bp_settings_disp_vals,
837  U* dst_processing, unsigned int checkerboard_adjustment,
838  unsigned int offset_data)
839 {
840  MsgStereo<T, U, beliefprop::MessageComp::kUMessage>(x_val, y_val, current_bp_level,
841  prev_u_message_array, prev_d_message_array, prev_l_message_array, prev_r_message_array, data_message_array,
842  current_u_message, disc_k_bp, data_aligned, bp_settings_disp_vals,
843  dst_processing, checkerboard_adjustment, offset_data);
844 
845  MsgStereo<T, U, beliefprop::MessageComp::kDMessage>(x_val, y_val, current_bp_level,
846  prev_u_message_array, prev_d_message_array, prev_l_message_array, prev_r_message_array, data_message_array,
847  current_d_message, disc_k_bp, data_aligned, bp_settings_disp_vals,
848  dst_processing, checkerboard_adjustment, offset_data);
849 
850  MsgStereo<T, U, beliefprop::MessageComp::kLMessage>(x_val, y_val, current_bp_level,
851  prev_u_message_array, prev_d_message_array, prev_l_message_array, prev_r_message_array, data_message_array,
852  current_l_message, disc_k_bp, data_aligned, bp_settings_disp_vals,
853  dst_processing, checkerboard_adjustment, offset_data);
854 
855  MsgStereo<T, U, beliefprop::MessageComp::kRMessage>(x_val, y_val, current_bp_level,
856  prev_u_message_array, prev_d_message_array, prev_l_message_array, prev_r_message_array, data_message_array,
857  current_r_message, disc_k_bp, data_aligned, bp_settings_disp_vals,
858  dst_processing, checkerboard_adjustment, offset_data);
859 }
860 
889 template<RunData_t T, RunData_t U, unsigned int DISP_VALS>
891  unsigned int x_val, unsigned int y_val,
892  beliefprop::CheckerboardPart checkerboard_to_update,
893  const beliefprop::BpLevelProperties& current_bp_level,
894  const T* data_cost_checkerboard_0, const T* data_cost_checkerboard_1,
895  T* message_u_checkerboard_0, T* message_d_checkerboard_0,
896  T* message_l_checkerboard_0, T* message_r_checkerboard_0,
897  T* message_u_checkerboard_1, T* message_d_checkerboard_1,
898  T* message_l_checkerboard_1, T* message_r_checkerboard_1,
899  float disc_k_bp, unsigned int offset_data, bool data_aligned,
900  unsigned int bp_settings_disp_vals)
901 {
902  //checkerboard_adjustment used for indexing into current checkerboard to update
903  const unsigned int checkerboard_adjustment =
904  (checkerboard_to_update == beliefprop::CheckerboardPart::kCheckerboardPart0) ? ((y_val)%2) : ((y_val+1)%2);
905 
906  //may want to look into (x_val < (width_level_checkerboard_part - 1) since it may affect the edges
907  //make sure that the current point is not an edge/corner that doesn't have four neighbors that can pass values to it
908  if ((x_val >= (1u - checkerboard_adjustment)) &&
909  (x_val < (current_bp_level.width_checkerboard_level_ - checkerboard_adjustment)) &&
910  (y_val > 0) && (y_val < (current_bp_level.height_level_ - 1u)))
911  {
912  if constexpr (DISP_VALS > 0) {
913  U data_message[DISP_VALS], prev_u_message[DISP_VALS], prev_d_message[DISP_VALS],
914  prev_l_message[DISP_VALS], prev_r_message[DISP_VALS];
915 
916  for (unsigned int current_disparity = 0; current_disparity < DISP_VALS; current_disparity++) {
917  if (checkerboard_to_update == beliefprop::CheckerboardPart::kCheckerboardPart0) {
918  data_message[current_disparity] = util_functs::ConvertValToDifferentDataTypeIfNeeded<T, U>(
919  data_cost_checkerboard_0[RetrieveIndexInDataAndMessage(x_val, y_val,
920  current_bp_level.padded_width_checkerboard_level_, current_bp_level.height_level_,
921  current_disparity, DISP_VALS, offset_data)]);
922  prev_u_message[current_disparity] = util_functs::ConvertValToDifferentDataTypeIfNeeded<T, U>(
923  message_u_checkerboard_1[RetrieveIndexInDataAndMessage(x_val, (y_val+1),
924  current_bp_level.padded_width_checkerboard_level_, current_bp_level.height_level_,
925  current_disparity, DISP_VALS)]);
926  prev_d_message[current_disparity] = util_functs::ConvertValToDifferentDataTypeIfNeeded<T, U>(
927  message_d_checkerboard_1[RetrieveIndexInDataAndMessage(x_val, (y_val-1),
928  current_bp_level.padded_width_checkerboard_level_, current_bp_level.height_level_,
929  current_disparity, DISP_VALS)]);
930  prev_l_message[current_disparity] = util_functs::ConvertValToDifferentDataTypeIfNeeded<T, U>(
931  message_l_checkerboard_1[RetrieveIndexInDataAndMessage((x_val + checkerboard_adjustment), y_val,
932  current_bp_level.padded_width_checkerboard_level_, current_bp_level.height_level_,
933  current_disparity, DISP_VALS)]);
934  prev_r_message[current_disparity] = util_functs::ConvertValToDifferentDataTypeIfNeeded<T, U>(
935  message_r_checkerboard_1[RetrieveIndexInDataAndMessage(((x_val + checkerboard_adjustment) - 1), y_val,
936  current_bp_level.padded_width_checkerboard_level_, current_bp_level.height_level_,
937  current_disparity, DISP_VALS)]);
938  }
939  else { //checkerboard_to_update == beliefprop::CheckerboardPart::kCheckerboardPart1
940  data_message[current_disparity] = util_functs::ConvertValToDifferentDataTypeIfNeeded<T, U>(
941  data_cost_checkerboard_1[RetrieveIndexInDataAndMessage(x_val, y_val,
942  current_bp_level.padded_width_checkerboard_level_, current_bp_level.height_level_,
943  current_disparity, DISP_VALS, offset_data)]);
944  prev_u_message[current_disparity] = util_functs::ConvertValToDifferentDataTypeIfNeeded<T, U>(
945  message_u_checkerboard_0[RetrieveIndexInDataAndMessage(x_val, (y_val+1),
946  current_bp_level.padded_width_checkerboard_level_, current_bp_level.height_level_,
947  current_disparity, DISP_VALS)]);
948  prev_d_message[current_disparity] = util_functs::ConvertValToDifferentDataTypeIfNeeded<T, U>(
949  message_d_checkerboard_0[RetrieveIndexInDataAndMessage(x_val, (y_val-1),
950  current_bp_level.padded_width_checkerboard_level_, current_bp_level.height_level_,
951  current_disparity, DISP_VALS)]);
952  prev_l_message[current_disparity] = util_functs::ConvertValToDifferentDataTypeIfNeeded<T, U>(
953  message_l_checkerboard_0[RetrieveIndexInDataAndMessage((x_val + checkerboard_adjustment), y_val,
954  current_bp_level.padded_width_checkerboard_level_, current_bp_level.height_level_,
955  current_disparity, DISP_VALS)]);
956  prev_r_message[current_disparity] = util_functs::ConvertValToDifferentDataTypeIfNeeded<T, U>(
957  message_r_checkerboard_0[RetrieveIndexInDataAndMessage(((x_val + checkerboard_adjustment) - 1), y_val,
958  current_bp_level.padded_width_checkerboard_level_, current_bp_level.height_level_,
959  current_disparity, DISP_VALS)]);
960  }
961  }
962 
963  //uses the previous message values and data cost to calculate the current message values and store the results
964  if (checkerboard_to_update == beliefprop::CheckerboardPart::kCheckerboardPart0) {
965  RunBPIterationUpdateMsgVals<T, U, DISP_VALS>(x_val, y_val, current_bp_level,
966  prev_u_message, prev_d_message, prev_l_message, prev_r_message, data_message,
967  message_u_checkerboard_0, message_d_checkerboard_0,
968  message_l_checkerboard_0, message_r_checkerboard_0,
969  (U)disc_k_bp, data_aligned);
970  }
971  else { //checkerboard_to_update == beliefprop::CheckerboardPart::kCheckerboardPart1
972  RunBPIterationUpdateMsgVals<T, U, DISP_VALS>(x_val, y_val, current_bp_level,
973  prev_u_message, prev_d_message, prev_l_message, prev_r_message, data_message,
974  message_u_checkerboard_1, message_d_checkerboard_1,
975  message_l_checkerboard_1, message_r_checkerboard_1,
976  (U)disc_k_bp, data_aligned);
977  }
978  }
979  else {
980  U* data_message = new U[bp_settings_disp_vals];
981  U* prev_u_message = new U[bp_settings_disp_vals];
982  U* prev_d_message = new U[bp_settings_disp_vals];
983  U* prev_l_message = new U[bp_settings_disp_vals];
984  U* prev_r_message = new U[bp_settings_disp_vals];
985 
986  for (unsigned int current_disparity = 0; current_disparity < bp_settings_disp_vals; current_disparity++) {
987  if (checkerboard_to_update == beliefprop::CheckerboardPart::kCheckerboardPart0) {
988  data_message[current_disparity] = util_functs::ConvertValToDifferentDataTypeIfNeeded<T, U>(
989  data_cost_checkerboard_0[RetrieveIndexInDataAndMessage(x_val, y_val,
990  current_bp_level.padded_width_checkerboard_level_, current_bp_level.height_level_,
991  current_disparity, bp_settings_disp_vals, offset_data)]);
992  prev_u_message[current_disparity] = util_functs::ConvertValToDifferentDataTypeIfNeeded<T, U>(
993  message_u_checkerboard_1[RetrieveIndexInDataAndMessage(x_val, (y_val+1),
994  current_bp_level.padded_width_checkerboard_level_, current_bp_level.height_level_,
995  current_disparity, bp_settings_disp_vals)]);
996  prev_d_message[current_disparity] = util_functs::ConvertValToDifferentDataTypeIfNeeded<T, U>(
997  message_d_checkerboard_1[RetrieveIndexInDataAndMessage(x_val, (y_val-1),
998  current_bp_level.padded_width_checkerboard_level_, current_bp_level.height_level_,
999  current_disparity, bp_settings_disp_vals)]);
1000  prev_l_message[current_disparity] = util_functs::ConvertValToDifferentDataTypeIfNeeded<T, U>(
1001  message_l_checkerboard_1[RetrieveIndexInDataAndMessage((x_val + checkerboard_adjustment), y_val,
1002  current_bp_level.padded_width_checkerboard_level_, current_bp_level.height_level_,
1003  current_disparity, bp_settings_disp_vals)]);
1004  prev_r_message[current_disparity] = util_functs::ConvertValToDifferentDataTypeIfNeeded<T, U>(
1005  message_r_checkerboard_1[RetrieveIndexInDataAndMessage(((x_val + checkerboard_adjustment) - 1), y_val,
1006  current_bp_level.padded_width_checkerboard_level_, current_bp_level.height_level_,
1007  current_disparity, bp_settings_disp_vals)]);
1008  }
1009  else { //checkerboard_to_update == beliefprop::CheckerboardPart::kCheckerboardPart1
1010  data_message[current_disparity] = util_functs::ConvertValToDifferentDataTypeIfNeeded<T, U>(
1011  data_cost_checkerboard_1[RetrieveIndexInDataAndMessage(x_val, y_val,
1012  current_bp_level.padded_width_checkerboard_level_, current_bp_level.height_level_,
1013  current_disparity, bp_settings_disp_vals, offset_data)]);
1014  prev_u_message[current_disparity] = util_functs::ConvertValToDifferentDataTypeIfNeeded<T, U>(
1015  message_u_checkerboard_0[RetrieveIndexInDataAndMessage(x_val, (y_val+1),
1016  current_bp_level.padded_width_checkerboard_level_, current_bp_level.height_level_,
1017  current_disparity, bp_settings_disp_vals)]);
1018  prev_d_message[current_disparity] = util_functs::ConvertValToDifferentDataTypeIfNeeded<T, U>(
1019  message_d_checkerboard_0[RetrieveIndexInDataAndMessage(x_val, (y_val-1),
1020  current_bp_level.padded_width_checkerboard_level_, current_bp_level.height_level_,
1021  current_disparity, bp_settings_disp_vals)]);
1022  prev_l_message[current_disparity] = util_functs::ConvertValToDifferentDataTypeIfNeeded<T, U>(
1023  message_l_checkerboard_0[RetrieveIndexInDataAndMessage((x_val + checkerboard_adjustment), y_val,
1024  current_bp_level.padded_width_checkerboard_level_, current_bp_level.height_level_,
1025  current_disparity, bp_settings_disp_vals)]);
1026  prev_r_message[current_disparity] = util_functs::ConvertValToDifferentDataTypeIfNeeded<T, U>(
1027  message_r_checkerboard_0[RetrieveIndexInDataAndMessage(((x_val + checkerboard_adjustment) - 1), y_val,
1028  current_bp_level.padded_width_checkerboard_level_, current_bp_level.height_level_,
1029  current_disparity, bp_settings_disp_vals)]);
1030  }
1031  }
1032 
1033  //uses the previous message values and data cost to calculate the current message values and store the results
1034  if (checkerboard_to_update == beliefprop::CheckerboardPart::kCheckerboardPart0) {
1035  RunBPIterationUpdateMsgVals<T, U>(x_val, y_val, current_bp_level,
1036  prev_u_message, prev_d_message, prev_l_message, prev_r_message, data_message,
1037  message_u_checkerboard_0, message_d_checkerboard_0,
1038  message_l_checkerboard_0, message_r_checkerboard_0,
1039  (U)disc_k_bp, data_aligned, bp_settings_disp_vals);
1040  }
1041  else { //checkerboard_to_update == beliefprop::CheckerboardPart::kCheckerboardPart1
1042  RunBPIterationUpdateMsgVals<T, U>(x_val, y_val, current_bp_level,
1043  prev_u_message, prev_d_message, prev_l_message, prev_r_message, data_message,
1044  message_u_checkerboard_1, message_d_checkerboard_1,
1045  message_l_checkerboard_1, message_r_checkerboard_1,
1046  (U)disc_k_bp, data_aligned, bp_settings_disp_vals);
1047  }
1048 
1049  delete [] data_message;
1050  delete [] prev_u_message;
1051  delete [] prev_d_message;
1052  delete [] prev_l_message;
1053  delete [] prev_r_message;
1054  }
1055  }
1056 }
1057 
1058 template<RunData_t T, RunData_t U, unsigned int DISP_VALS>
1060  unsigned int x_val, unsigned int y_val,
1061  beliefprop::CheckerboardPart checkerboard_to_update,
1062  const beliefprop::BpLevelProperties& current_bp_level,
1063  const T* data_cost_checkerboard_0, const T* data_cost_checkerboard_1,
1064  T* message_u_checkerboard_0, T* message_d_checkerboard_0,
1065  T* message_l_checkerboard_0, T* message_r_checkerboard_0,
1066  T* message_u_checkerboard_1, T* message_d_checkerboard_1,
1067  T* message_l_checkerboard_1, T* message_r_checkerboard_1,
1068  float disc_k_bp, unsigned int offset_data, bool data_aligned,
1069  unsigned int bp_settings_disp_vals, void* dst_processing)
1070 {
1071  //checkerboard_adjustment used for indexing into current checkerboard to update
1072  const unsigned int checkerboard_adjustment =
1073  (checkerboard_to_update == beliefprop::CheckerboardPart::kCheckerboardPart0) ? ((y_val)%2) : ((y_val+1)%2);
1074 
1075  //may want to look into (x_val < (width_level_checkerboard_part - 1) since it may affect the edges
1076  //make sure that the current point is not an edge/corner that doesn't have four neighbors that can pass values to it
1077  if ((x_val >= (1u - checkerboard_adjustment)) &&
1078  (x_val < (current_bp_level.width_checkerboard_level_ - checkerboard_adjustment)) &&
1079  (y_val > 0) && (y_val < (current_bp_level.height_level_ - 1u)))
1080  {
1081  //uses the previous message values and data cost to calculate the current message values and store the results
1082  if (checkerboard_to_update == beliefprop::CheckerboardPart::kCheckerboardPart0) {
1083  RunBPIterationUpdateMsgVals<T, U>(x_val, y_val, current_bp_level,
1084  message_u_checkerboard_1, message_d_checkerboard_1,
1085  message_l_checkerboard_1, message_r_checkerboard_1,
1086  data_cost_checkerboard_0,
1087  message_u_checkerboard_0, message_d_checkerboard_0,
1088  message_l_checkerboard_0, message_r_checkerboard_0,
1089  (U)disc_k_bp, data_aligned, bp_settings_disp_vals, (U*)dst_processing,
1090  checkerboard_adjustment, offset_data);
1091  }
1092  else { //checkerboard_to_update == beliefprop::CheckerboardPart::kCheckerboardPart1
1093  RunBPIterationUpdateMsgVals<T, U>(x_val, y_val, current_bp_level,
1094  message_u_checkerboard_0, message_d_checkerboard_0,
1095  message_l_checkerboard_0, message_r_checkerboard_0,
1096  data_cost_checkerboard_1,
1097  message_u_checkerboard_1, message_d_checkerboard_1,
1098  message_l_checkerboard_1, message_r_checkerboard_1,
1099  (U)disc_k_bp, data_aligned, bp_settings_disp_vals, (U*)dst_processing,
1100  checkerboard_adjustment, offset_data);
1101  }
1102  }
1103 }
1104 
1134 template<RunData_t T, unsigned int DISP_VALS>
1136  unsigned int x_val, unsigned int y_val,
1137  beliefprop::CheckerboardPart checkerboard_part,
1138  const beliefprop::BpLevelProperties& current_bp_level,
1139  const beliefprop::BpLevelProperties& next_bp_level,
1140  const T* message_u_prev_checkerboard_0, const T* message_d_prev_checkerboard_0,
1141  const T* message_l_prev_checkerboard_0, const T* message_r_prev_checkerboard_0,
1142  const T* message_u_prev_checkerboard_1, const T* message_d_prev_checkerboard_1,
1143  const T* message_l_prev_checkerboard_1, const T* message_r_prev_checkerboard_1,
1144  T* message_u_checkerboard_0, T* message_d_checkerboard_0,
1145  T* message_l_checkerboard_0, T* message_r_checkerboard_0,
1146  T* message_u_checkerboard_1, T* message_d_checkerboard_1,
1147  T* message_l_checkerboard_1, T* message_r_checkerboard_1,
1148  unsigned int bp_settings_disp_vals)
1149 {
1150  //only need to copy checkerboard 1 around "edge" since updating checkerboard 1 in first belief propagation iteration
1151  //(and checkerboard 0 message values are used in the iteration to update message values in checkerboard 1)
1152  const bool copyCheckerboard1 = (((x_val == 0) || (y_val == 0)) ||
1153  (((x_val >= (current_bp_level.width_checkerboard_level_ - 2)) ||
1154  (y_val >= (current_bp_level.height_level_ - 2)))));
1155 
1156  unsigned int index_copy_to, index_copy_from;
1157  T prev_val_u, prev_val_d, prev_val_l, prev_val_r;
1158  const unsigned int checkerboard_part_adjustment =
1159  (checkerboard_part == beliefprop::CheckerboardPart::kCheckerboardPart0) ? (y_val % 2) : ((y_val + 1) % 2);
1160 
1161  if constexpr (DISP_VALS > 0) {
1162  for (unsigned int current_disparity = 0; current_disparity < DISP_VALS; current_disparity++) {
1163  index_copy_from = RetrieveIndexInDataAndMessage(x_val, y_val,
1164  current_bp_level.padded_width_checkerboard_level_, current_bp_level.height_level_,
1165  current_disparity, DISP_VALS);
1166 
1167  if (checkerboard_part == beliefprop::CheckerboardPart::kCheckerboardPart0) {
1168  prev_val_u = message_u_prev_checkerboard_0[index_copy_from];
1169  prev_val_d = message_d_prev_checkerboard_0[index_copy_from];
1170  prev_val_l = message_l_prev_checkerboard_0[index_copy_from];
1171  prev_val_r = message_r_prev_checkerboard_0[index_copy_from];
1172  } else /*(checkerboard_part == beliefprop::CheckerboardPart::kCheckerboardPart1)*/ {
1173  prev_val_u = message_u_prev_checkerboard_1[index_copy_from];
1174  prev_val_d = message_d_prev_checkerboard_1[index_copy_from];
1175  prev_val_l = message_l_prev_checkerboard_1[index_copy_from];
1176  prev_val_r = message_r_prev_checkerboard_1[index_copy_from];
1177  }
1178 
1180  x_val*2 + checkerboard_part_adjustment, y_val*2,
1181  next_bp_level.width_checkerboard_level_,
1182  next_bp_level.height_level_))
1183  {
1184  index_copy_to = RetrieveIndexInDataAndMessage(x_val*2 + checkerboard_part_adjustment, y_val*2,
1185  next_bp_level.padded_width_checkerboard_level_, next_bp_level.height_level_,
1186  current_disparity, DISP_VALS);
1187 
1188  message_u_checkerboard_0[index_copy_to] = prev_val_u;
1189  message_d_checkerboard_0[index_copy_to] = prev_val_d;
1190  message_l_checkerboard_0[index_copy_to] = prev_val_l;
1191  message_r_checkerboard_0[index_copy_to] = prev_val_r;
1192 
1193  if (copyCheckerboard1) {
1194  message_u_checkerboard_1[index_copy_to] = prev_val_u;
1195  message_d_checkerboard_1[index_copy_to] = prev_val_d;
1196  message_l_checkerboard_1[index_copy_to] = prev_val_l;
1197  message_r_checkerboard_1[index_copy_to] = prev_val_r;
1198  }
1199  }
1200 
1202  x_val*2 + checkerboard_part_adjustment, y_val*2 + 1,
1203  next_bp_level.width_checkerboard_level_, next_bp_level.height_level_))
1204  {
1205  index_copy_to = RetrieveIndexInDataAndMessage(x_val*2 + checkerboard_part_adjustment, y_val*2 + 1,
1206  next_bp_level.padded_width_checkerboard_level_, next_bp_level.height_level_,
1207  current_disparity, DISP_VALS);
1208 
1209  message_u_checkerboard_0[index_copy_to] = prev_val_u;
1210  message_d_checkerboard_0[index_copy_to] = prev_val_d;
1211  message_l_checkerboard_0[index_copy_to] = prev_val_l;
1212  message_r_checkerboard_0[index_copy_to] = prev_val_r;
1213 
1214  if (copyCheckerboard1) {
1215  message_u_checkerboard_1[index_copy_to] = prev_val_u;
1216  message_d_checkerboard_1[index_copy_to] = prev_val_d;
1217  message_l_checkerboard_1[index_copy_to] = prev_val_l;
1218  message_r_checkerboard_1[index_copy_to] = prev_val_r;
1219  }
1220  }
1221  }
1222  }
1223  else {
1224  for (unsigned int current_disparity = 0; current_disparity < bp_settings_disp_vals; current_disparity++) {
1225  index_copy_from = RetrieveIndexInDataAndMessage(x_val, y_val,
1226  current_bp_level.padded_width_checkerboard_level_, current_bp_level.height_level_,
1227  current_disparity, bp_settings_disp_vals);
1228 
1229  if (checkerboard_part == beliefprop::CheckerboardPart::kCheckerboardPart0) {
1230  prev_val_u = message_u_prev_checkerboard_0[index_copy_from];
1231  prev_val_d = message_d_prev_checkerboard_0[index_copy_from];
1232  prev_val_l = message_l_prev_checkerboard_0[index_copy_from];
1233  prev_val_r = message_r_prev_checkerboard_0[index_copy_from];
1234  } else /*(checkerboard_part == beliefprop::CheckerboardPart::kCheckerboardPart1)*/ {
1235  prev_val_u = message_u_prev_checkerboard_1[index_copy_from];
1236  prev_val_d = message_d_prev_checkerboard_1[index_copy_from];
1237  prev_val_l = message_l_prev_checkerboard_1[index_copy_from];
1238  prev_val_r = message_r_prev_checkerboard_1[index_copy_from];
1239  }
1240 
1242  x_val*2 + checkerboard_part_adjustment, y_val*2,
1243  next_bp_level.width_checkerboard_level_, next_bp_level.height_level_))
1244  {
1245  index_copy_to = RetrieveIndexInDataAndMessage(x_val*2 + checkerboard_part_adjustment, y_val*2,
1246  next_bp_level.padded_width_checkerboard_level_, next_bp_level.height_level_,
1247  current_disparity, bp_settings_disp_vals);
1248 
1249  message_u_checkerboard_0[index_copy_to] = prev_val_u;
1250  message_d_checkerboard_0[index_copy_to] = prev_val_d;
1251  message_l_checkerboard_0[index_copy_to] = prev_val_l;
1252  message_r_checkerboard_0[index_copy_to] = prev_val_r;
1253 
1254  if (copyCheckerboard1) {
1255  message_u_checkerboard_1[index_copy_to] = prev_val_u;
1256  message_d_checkerboard_1[index_copy_to] = prev_val_d;
1257  message_l_checkerboard_1[index_copy_to] = prev_val_l;
1258  message_r_checkerboard_1[index_copy_to] = prev_val_r;
1259  }
1260  }
1261 
1263  x_val*2 + checkerboard_part_adjustment, y_val*2 + 1,
1264  next_bp_level.width_checkerboard_level_, next_bp_level.height_level_))
1265  {
1266  index_copy_to = RetrieveIndexInDataAndMessage(x_val*2 + checkerboard_part_adjustment, y_val*2 + 1,
1267  next_bp_level.padded_width_checkerboard_level_, next_bp_level.height_level_,
1268  current_disparity, bp_settings_disp_vals);
1269 
1270  message_u_checkerboard_0[index_copy_to] = prev_val_u;
1271  message_d_checkerboard_0[index_copy_to] = prev_val_d;
1272  message_l_checkerboard_0[index_copy_to] = prev_val_l;
1273  message_r_checkerboard_0[index_copy_to] = prev_val_r;
1274 
1275  if (copyCheckerboard1) {
1276  message_u_checkerboard_1[index_copy_to] = prev_val_u;
1277  message_d_checkerboard_1[index_copy_to] = prev_val_d;
1278  message_l_checkerboard_1[index_copy_to] = prev_val_l;
1279  message_r_checkerboard_1[index_copy_to] = prev_val_r;
1280  }
1281  }
1282  }
1283  }
1284 }
1285 
1286 template<RunData_t T, RunData_t U, unsigned int DISP_VALS>
1288  unsigned int x_val, unsigned int y_val,
1289  const beliefprop::BpLevelProperties& current_bp_level,
1290  const T* data_cost_checkerboard_0, const T* data_cost_checkerboard_1,
1291  const T* message_u_checkerboard_0, const T* message_d_checkerboard_0,
1292  const T* message_l_checkerboard_0, const T* message_r_checkerboard_0,
1293  const T* message_u_checkerboard_1, const T* message_d_checkerboard_1,
1294  const T* message_l_checkerboard_1, const T* message_r_checkerboard_1,
1295  float* disparity_between_images_device, unsigned int bp_settings_disp_vals)
1296 {
1297  const unsigned int x_val_checkerboard = x_val;
1298 
1299  //first processing from first part of checkerboard
1300 
1301  //adjustment based on checkerboard; need to add 1 to x for odd-numbered rows
1302  //for final index mapping into disparity images for checkerboard 1
1303  unsigned int checkerboard_part_adjustment = (y_val % 2);
1304 
1306  x_val_checkerboard*2 + checkerboard_part_adjustment, y_val,
1307  current_bp_level.width_level_, current_bp_level.height_level_))
1308  {
1309  if ((x_val_checkerboard >= (1 - checkerboard_part_adjustment)) &&
1310  (x_val_checkerboard < (current_bp_level.width_checkerboard_level_ - checkerboard_part_adjustment)) &&
1311  (y_val > 0u) && (y_val < (current_bp_level.height_level_ - 1u)))
1312  {
1313  // keep track of "best" disparity for current pixel
1314  unsigned int bestDisparity{0u};
1315  U best_val{(U)beliefprop::kHighValBpKernel};
1316  if constexpr (DISP_VALS > 0) {
1317  for (unsigned int current_disparity = 0; current_disparity < DISP_VALS; current_disparity++) {
1318  const U val =
1319  util_functs::ConvertValToDifferentDataTypeIfNeeded<T, U>(message_u_checkerboard_1[
1321  x_val_checkerboard, (y_val + 1u),
1322  current_bp_level.padded_width_checkerboard_level_,
1323  current_bp_level.height_level_,
1324  current_disparity,
1325  DISP_VALS)]) +
1326  util_functs::ConvertValToDifferentDataTypeIfNeeded<T, U>(message_d_checkerboard_1[
1328  x_val_checkerboard, (y_val - 1u),
1329  current_bp_level.padded_width_checkerboard_level_,
1330  current_bp_level.height_level_,
1331  current_disparity,
1332  DISP_VALS)]) +
1333  util_functs::ConvertValToDifferentDataTypeIfNeeded<T, U>(message_l_checkerboard_1[
1335  (x_val_checkerboard + checkerboard_part_adjustment), y_val,
1336  current_bp_level.padded_width_checkerboard_level_,
1337  current_bp_level.height_level_,
1338  current_disparity,
1339  DISP_VALS)]) +
1340  util_functs::ConvertValToDifferentDataTypeIfNeeded<T, U>(message_r_checkerboard_1[
1342  (x_val_checkerboard + checkerboard_part_adjustment) - 1u, y_val,
1343  current_bp_level.padded_width_checkerboard_level_,
1344  current_bp_level.height_level_,
1345  current_disparity,
1346  DISP_VALS)]) +
1347  util_functs::ConvertValToDifferentDataTypeIfNeeded<T, U>(data_cost_checkerboard_0[
1349  x_val_checkerboard, y_val,
1350  current_bp_level.padded_width_checkerboard_level_,
1351  current_bp_level.height_level_,
1352  current_disparity,
1353  DISP_VALS)]);
1354  if (val < best_val) {
1355  best_val = val;
1356  bestDisparity = current_disparity;
1357  }
1358  }
1359  }
1360  else {
1361  for (unsigned int current_disparity = 0; current_disparity < bp_settings_disp_vals; current_disparity++) {
1362  const U val =
1363  util_functs::ConvertValToDifferentDataTypeIfNeeded<T, U>(message_u_checkerboard_1[
1365  x_val_checkerboard, (y_val + 1u),
1366  current_bp_level.padded_width_checkerboard_level_,
1367  current_bp_level.height_level_,
1368  current_disparity,
1369  bp_settings_disp_vals)]) +
1370  util_functs::ConvertValToDifferentDataTypeIfNeeded<T, U>(message_d_checkerboard_1[
1372  x_val_checkerboard, (y_val - 1u),
1373  current_bp_level.padded_width_checkerboard_level_,
1374  current_bp_level.height_level_,
1375  current_disparity,
1376  bp_settings_disp_vals)]) +
1377  util_functs::ConvertValToDifferentDataTypeIfNeeded<T, U>(message_l_checkerboard_1[
1379  (x_val_checkerboard + checkerboard_part_adjustment), y_val,
1380  current_bp_level.padded_width_checkerboard_level_,
1381  current_bp_level.height_level_,
1382  current_disparity,
1383  bp_settings_disp_vals)]) +
1384  util_functs::ConvertValToDifferentDataTypeIfNeeded<T, U>(message_r_checkerboard_1[
1386  (x_val_checkerboard + checkerboard_part_adjustment) - 1u, y_val,
1387  current_bp_level.padded_width_checkerboard_level_,
1388  current_bp_level.height_level_,
1389  current_disparity,
1390  bp_settings_disp_vals)]) +
1391  util_functs::ConvertValToDifferentDataTypeIfNeeded<T, U>(data_cost_checkerboard_0[
1393  x_val_checkerboard, y_val,
1394  current_bp_level.padded_width_checkerboard_level_,
1395  current_bp_level.height_level_,
1396  current_disparity,
1397  bp_settings_disp_vals)]);
1398  if (val < best_val) {
1399  best_val = val;
1400  bestDisparity = current_disparity;
1401  }
1402  }
1403  }
1404 
1405  disparity_between_images_device[y_val*current_bp_level.width_level_ +
1406  (x_val_checkerboard * 2 + checkerboard_part_adjustment)] = bestDisparity;
1407  } else {
1408  disparity_between_images_device[y_val* current_bp_level.width_level_ +
1409  (x_val_checkerboard * 2 + checkerboard_part_adjustment)] = 0;
1410  }
1411  }
1412 
1413  //process from part 2 of checkerboard
1414  //adjustment based on checkerboard; need to add 1 to x for even-numbered rows for final index mapping into disparity images for checkerboard 2
1415  checkerboard_part_adjustment = ((y_val + 1u) % 2);
1416 
1418  x_val_checkerboard*2 + checkerboard_part_adjustment, y_val,
1419  current_bp_level.width_level_, current_bp_level.height_level_))
1420  {
1421  if ((x_val_checkerboard >= (1 - checkerboard_part_adjustment)) &&
1422  (x_val_checkerboard < (current_bp_level.width_checkerboard_level_ - checkerboard_part_adjustment)) &&
1423  (y_val > 0) && (y_val < (current_bp_level.height_level_ - 1)))
1424  {
1425  // keep track of "best" disparity for current pixel
1426  unsigned int bestDisparity{0u};
1427  U best_val{(U)beliefprop::kHighValBpKernel};
1428  if constexpr (DISP_VALS > 0) {
1429  for (unsigned int current_disparity = 0; current_disparity < DISP_VALS; current_disparity++) {
1430  const U val =
1431  util_functs::ConvertValToDifferentDataTypeIfNeeded<T, U>(message_u_checkerboard_0[
1433  x_val_checkerboard, (y_val + 1u),
1434  current_bp_level.padded_width_checkerboard_level_,
1435  current_bp_level.height_level_,
1436  current_disparity,
1437  DISP_VALS)]) +
1438  util_functs::ConvertValToDifferentDataTypeIfNeeded<T, U>(message_d_checkerboard_0[
1440  x_val_checkerboard, (y_val - 1u),
1441  current_bp_level.padded_width_checkerboard_level_,
1442  current_bp_level.height_level_,
1443  current_disparity,
1444  DISP_VALS)]) +
1445  util_functs::ConvertValToDifferentDataTypeIfNeeded<T, U>(message_l_checkerboard_0[
1447  (x_val_checkerboard + checkerboard_part_adjustment), y_val,
1448  current_bp_level.padded_width_checkerboard_level_,
1449  current_bp_level.height_level_,
1450  current_disparity,
1451  DISP_VALS)]) +
1452  util_functs::ConvertValToDifferentDataTypeIfNeeded<T, U>(message_r_checkerboard_0[
1454  (x_val_checkerboard + checkerboard_part_adjustment) - 1u, y_val,
1455  current_bp_level.padded_width_checkerboard_level_,
1456  current_bp_level.height_level_,
1457  current_disparity,
1458  DISP_VALS)]) +
1459  util_functs::ConvertValToDifferentDataTypeIfNeeded<T, U>(data_cost_checkerboard_1[
1461  x_val_checkerboard, y_val,
1462  current_bp_level.padded_width_checkerboard_level_,
1463  current_bp_level.height_level_,
1464  current_disparity,
1465  DISP_VALS)]);
1466  if (val < best_val) {
1467  best_val = val;
1468  bestDisparity = current_disparity;
1469  }
1470  }
1471  }
1472  else {
1473  for (unsigned int current_disparity = 0; current_disparity < bp_settings_disp_vals; current_disparity++) {
1474  const U val =
1475  util_functs::ConvertValToDifferentDataTypeIfNeeded<T, U>(message_u_checkerboard_0[
1477  x_val_checkerboard, (y_val + 1u),
1478  current_bp_level.padded_width_checkerboard_level_,
1479  current_bp_level.height_level_,
1480  current_disparity,
1481  bp_settings_disp_vals)]) +
1482  util_functs::ConvertValToDifferentDataTypeIfNeeded<T, U>(message_d_checkerboard_0[
1484  x_val_checkerboard, (y_val - 1u),
1485  current_bp_level.padded_width_checkerboard_level_,
1486  current_bp_level.height_level_,
1487  current_disparity,
1488  bp_settings_disp_vals)]) +
1489  util_functs::ConvertValToDifferentDataTypeIfNeeded<T, U>(message_l_checkerboard_0[
1491  (x_val_checkerboard + checkerboard_part_adjustment), y_val,
1492  current_bp_level.padded_width_checkerboard_level_,
1493  current_bp_level.height_level_,
1494  current_disparity,
1495  bp_settings_disp_vals)]) +
1496  util_functs::ConvertValToDifferentDataTypeIfNeeded<T, U>(message_r_checkerboard_0[
1498  (x_val_checkerboard + checkerboard_part_adjustment) - 1u, y_val,
1499  current_bp_level.padded_width_checkerboard_level_,
1500  current_bp_level.height_level_,
1501  current_disparity,
1502  bp_settings_disp_vals)]) +
1503  util_functs::ConvertValToDifferentDataTypeIfNeeded<T, U>(data_cost_checkerboard_1[
1505  x_val_checkerboard, y_val,
1506  current_bp_level.padded_width_checkerboard_level_,
1507  current_bp_level.height_level_,
1508  current_disparity,
1509  bp_settings_disp_vals)]);
1510  if (val < best_val) {
1511  best_val = val;
1512  bestDisparity = current_disparity;
1513  }
1514  }
1515  }
1516 
1517  disparity_between_images_device[y_val * current_bp_level.width_level_ +
1518  (x_val_checkerboard*2 + checkerboard_part_adjustment)] = bestDisparity;
1519  } else {
1520  disparity_between_images_device[y_val * current_bp_level.width_level_ +
1521  (x_val_checkerboard*2 + checkerboard_part_adjustment)] = 0;
1522  }
1523  }
1524 }
1525 
1526 template<RunData_t T, unsigned int DISP_VALS>
1528  unsigned int x_val, unsigned int y_val,
1529  const beliefprop::BpLevelProperties& current_bp_level,
1530  const T* data_cost_checkerboard_0, const T* data_cost_checkerboard_1,
1531  const T* message_u_checkerboard_0, const T* message_d_checkerboard_0,
1532  const T* message_l_checkerboard_0, const T* message_r_checkerboard_0,
1533  const T* message_u_checkerboard_1, const T* message_d_checkerboard_1,
1534  const T* message_l_checkerboard_1, const T* message_r_checkerboard_1,
1535  unsigned int bp_settings_disp_vals = 0)
1536 {
1537  if (((x_val + y_val) % 2) == 0) {
1538  printf("x_val: %d\n", x_val);
1539  printf("y_val: %d\n", y_val);
1540  for (unsigned int current_disparity = 0; current_disparity < DISP_VALS; current_disparity++) {
1541  printf("DISP: %d\n", current_disparity);
1542  printf("messageUPrevStereoCheckerboard: %f \n",
1543  (float)message_u_checkerboard_0[RetrieveIndexInDataAndMessage(
1544  x_val / 2, y_val, current_bp_level.padded_width_checkerboard_level_, current_bp_level.height_level_,
1545  current_disparity, DISP_VALS)]);
1546  printf("messageDPrevStereoCheckerboard: %f \n",
1547  (float)message_d_checkerboard_0[RetrieveIndexInDataAndMessage(
1548  x_val / 2, y_val, current_bp_level.padded_width_checkerboard_level_, current_bp_level.height_level_,
1549  current_disparity, DISP_VALS)]);
1550  printf("messageLPrevStereoCheckerboard: %f \n",
1551  (float)message_l_checkerboard_0[RetrieveIndexInDataAndMessage(
1552  x_val / 2, y_val, current_bp_level.padded_width_checkerboard_level_, current_bp_level.height_level_,
1553  current_disparity, DISP_VALS)]);
1554  printf("messageRPrevStereoCheckerboard: %f \n",
1555  (float)message_r_checkerboard_0[RetrieveIndexInDataAndMessage(
1556  x_val / 2, y_val, current_bp_level.padded_width_checkerboard_level_, current_bp_level.height_level_,
1557  current_disparity, DISP_VALS)]);
1558  printf("dataCostStereoCheckerboard: %f \n",
1559  (float)data_cost_checkerboard_0[RetrieveIndexInDataAndMessage(
1560  x_val / 2, y_val, current_bp_level.padded_width_checkerboard_level_, current_bp_level.height_level_,
1561  current_disparity, DISP_VALS)]);
1562  }
1563  } else {
1564  printf("x_val: %d\n", x_val);
1565  printf("y_val: %d\n", y_val);
1566  for (unsigned int current_disparity = 0; current_disparity < DISP_VALS; current_disparity++) {
1567  printf("DISP: %d\n", current_disparity);
1568  printf("messageUPrevStereoCheckerboard: %f \n",
1569  (float)message_u_checkerboard_1[RetrieveIndexInDataAndMessage(
1570  x_val / 2, y_val, current_bp_level.padded_width_checkerboard_level_, current_bp_level.height_level_,
1571  current_disparity, DISP_VALS)]);
1572  printf("messageDPrevStereoCheckerboard: %f \n",
1573  (float)message_d_checkerboard_1[RetrieveIndexInDataAndMessage(
1574  x_val / 2, y_val, current_bp_level.padded_width_checkerboard_level_, current_bp_level.height_level_,
1575  current_disparity, DISP_VALS)]);
1576  printf("messageLPrevStereoCheckerboard: %f \n",
1577  (float)message_l_checkerboard_1[RetrieveIndexInDataAndMessage(
1578  x_val / 2, y_val, current_bp_level.padded_width_checkerboard_level_, current_bp_level.height_level_,
1579  current_disparity, DISP_VALS)]);
1580  printf("messageRPrevStereoCheckerboard: %f \n",
1581  (float)message_r_checkerboard_1[RetrieveIndexInDataAndMessage(
1582  x_val / 2, y_val, current_bp_level.padded_width_checkerboard_level_, current_bp_level.height_level_,
1583  current_disparity, DISP_VALS)]);
1584  printf("dataCostStereoCheckerboard: %f \n",
1585  (float)data_cost_checkerboard_1[RetrieveIndexInDataAndMessage(
1586  x_val / 2, y_val, current_bp_level.padded_width_checkerboard_level_, current_bp_level.height_level_,
1587  current_disparity, DISP_VALS)]);
1588  }
1589  }
1590 }
1591 
1592 template<RunData_t T, unsigned int DISP_VALS>
1594  unsigned int x_val, unsigned int y_val,
1595  const beliefprop::BpLevelProperties& current_bp_level,
1596  const T* data_cost_checkerboard_0, const T* data_cost_checkerboard_1,
1597  const T* message_u_checkerboard_0, const T* message_d_checkerboard_0,
1598  const T* message_l_checkerboard_0, const T* message_r_checkerboard_0,
1599  const T* message_u_checkerboard_1, const T* message_d_checkerboard_1,
1600  const T* message_l_checkerboard_1, const T* message_r_checkerboard_1,
1601  unsigned int bp_settings_disp_vals = 0)
1602 {
1603  const unsigned int checkerboard_adjustment = (((x_val + y_val) % 2) == 0) ? ((y_val)%2) : ((y_val+1)%2);
1604  if (((x_val + y_val) % 2) == 0) {
1605  printf("x_val: %d\n", x_val);
1606  printf("y_val: %d\n", y_val);
1607  for (unsigned int current_disparity = 0; current_disparity < DISP_VALS; current_disparity++) {
1608  printf("DISP: %d\n", current_disparity);
1609  printf("messageUPrevStereoCheckerboard: %f \n",
1610  (float)message_u_checkerboard_1[RetrieveIndexInDataAndMessage(
1611  x_val / 2, y_val + 1, current_bp_level.padded_width_checkerboard_level_, current_bp_level.height_level_,
1612  current_disparity, DISP_VALS)]);
1613  printf("messageDPrevStereoCheckerboard: %f \n",
1614  (float)message_d_checkerboard_1[RetrieveIndexInDataAndMessage(
1615  x_val / 2, y_val - 1, current_bp_level.padded_width_checkerboard_level_, current_bp_level.height_level_,
1616  current_disparity, DISP_VALS)]);
1617  printf("messageLPrevStereoCheckerboard: %f \n",
1618  (float)message_l_checkerboard_1[RetrieveIndexInDataAndMessage(
1619  x_val / 2 + checkerboard_adjustment, y_val, current_bp_level.padded_width_checkerboard_level_, current_bp_level.height_level_,
1620  current_disparity, DISP_VALS)]);
1621  printf("messageRPrevStereoCheckerboard: %f \n",
1622  (float)message_r_checkerboard_1[RetrieveIndexInDataAndMessage(
1623  (x_val / 2 - 1) + checkerboard_adjustment, y_val, current_bp_level.padded_width_checkerboard_level_, current_bp_level.height_level_,
1624  current_disparity, DISP_VALS)]);
1625  printf("dataCostStereoCheckerboard: %f \n",
1626  (float)data_cost_checkerboard_0[RetrieveIndexInDataAndMessage(
1627  x_val / 2, y_val, current_bp_level.padded_width_checkerboard_level_, current_bp_level.height_level_,
1628  current_disparity, DISP_VALS)]);
1629  }
1630  } else {
1631  printf("x_val: %d\n", x_val);
1632  printf("y_val: %d\n", y_val);
1633  for (unsigned int current_disparity = 0; current_disparity < DISP_VALS; current_disparity++) {
1634  printf("DISP: %d\n", current_disparity);
1635  printf("messageUPrevStereoCheckerboard: %f \n",
1636  (float)message_u_checkerboard_0[RetrieveIndexInDataAndMessage(
1637  x_val / 2, y_val + 1, current_bp_level.padded_width_checkerboard_level_, current_bp_level.height_level_,
1638  current_disparity, DISP_VALS)]);
1639  printf("messageDPrevStereoCheckerboard: %f \n",
1640  (float)message_d_checkerboard_0[RetrieveIndexInDataAndMessage(
1641  x_val / 2, y_val - 1, current_bp_level.padded_width_checkerboard_level_, current_bp_level.height_level_,
1642  current_disparity, DISP_VALS)]);
1643  printf("messageLPrevStereoCheckerboard: %f \n",
1644  (float)message_l_checkerboard_0[RetrieveIndexInDataAndMessage(
1645  x_val / 2 + checkerboard_adjustment, y_val, current_bp_level.padded_width_checkerboard_level_, current_bp_level.height_level_,
1646  current_disparity, DISP_VALS)]);
1647  printf("messageRPrevStereoCheckerboard: %f \n",
1648  (float)message_r_checkerboard_0[RetrieveIndexInDataAndMessage(
1649  (x_val / 2 - 1) + checkerboard_adjustment, y_val, current_bp_level.padded_width_checkerboard_level_, current_bp_level.height_level_,
1650  current_disparity, DISP_VALS)]);
1651  printf("dataCostStereoCheckerboard: %f \n",
1652  (float)data_cost_checkerboard_1[RetrieveIndexInDataAndMessage(
1653  x_val / 2, y_val, current_bp_level.padded_width_checkerboard_level_, current_bp_level.height_level_,
1654  current_disparity, DISP_VALS)]);
1655  }
1656  }
1657 }
1658 
1659 }
1660 
1661 #endif /* SHARED_BP_PROCESSING_FUNCTS_H_ */
File with namespace for enums, constants, structures, and functions specific to belief propagation pr...
Header file that contains information about the stereo sets used for evaluation of the bp implementat...
Declares class to store and retrieve properties of a bp processing level.
File with namespace for enums, constants, structures, and functions specific to belief propagation pr...
Declares and defines structure that stores settings for current implementation run as well as functio...
Define constraints for data type in processing.
Utility functions for belief propagation processing that are used in both optimized CPU and CUDA impl...
Contains namespace with utility functions for implementation.
#define ARCHITECTURE_ADDITION
Definition: UtilityFuncts.h:37
Namespace for enums, constants, structures, and functions specific to belief propagation processing.
ARCHITECTURE_ADDITION void RunBPIterationUpdateMsgVals(unsigned int x_val, unsigned int y_val, const beliefprop::BpLevelProperties &current_bp_level, const U prev_u_message[DISP_VALS], const U prev_d_message[DISP_VALS], const U prev_l_message[DISP_VALS], const U prev_r_message[DISP_VALS], const U data_message[DISP_VALS], T *current_u_message, T *current_d_message, T *current_l_message, T *current_r_message, const U disc_k_bp, bool data_aligned)
Kernel function to run the current iteration of belief propagation where the input messages and data ...
constexpr bool kOptimizedIndexingSetting
Definition: BpRunUtils.h:114
ARCHITECTURE_ADDITION void RetrieveOutputDisparityPixel(unsigned int x_val, unsigned int y_val, const beliefprop::BpLevelProperties &current_bp_level, const T *data_cost_checkerboard_0, const T *data_cost_checkerboard_1, const T *message_u_checkerboard_0, const T *message_d_checkerboard_0, const T *message_l_checkerboard_0, const T *message_r_checkerboard_0, const T *message_u_checkerboard_1, const T *message_d_checkerboard_1, const T *message_l_checkerboard_1, const T *message_r_checkerboard_1, float *disparity_between_images_device, unsigned int bp_settings_disp_vals)
ARCHITECTURE_ADDITION void SetInitDstProcessing(unsigned int x_val, unsigned int y_val, const beliefprop::BpLevelProperties &current_bp_level, const T *prev_u_message_array, const T *prev_d_message_array, const T *prev_l_message_array, const T *prev_r_message_array, const T *data_message_array, T *dst_message_array, U disc_k_bp, bool data_aligned, unsigned int bp_settings_disp_vals, U *dst_processing, unsigned int checkerboard_adjustment, unsigned int offset_data, unsigned int current_disparity, unsigned int proc_array_idx)
ARCHITECTURE_ADDITION void PrintDataAndMessageValsAtPointKernel(unsigned int x_val, unsigned int y_val, const beliefprop::BpLevelProperties &current_bp_level, const T *data_cost_checkerboard_0, const T *data_cost_checkerboard_1, const T *message_u_checkerboard_0, const T *message_d_checkerboard_0, const T *message_l_checkerboard_0, const T *message_r_checkerboard_0, const T *message_u_checkerboard_1, const T *message_d_checkerboard_1, const T *message_l_checkerboard_1, const T *message_r_checkerboard_1, unsigned int bp_settings_disp_vals=0)
ARCHITECTURE_ADDITION void RunBPIterationUsingCheckerboardUpdatesKernel(unsigned int x_val, unsigned int y_val, beliefprop::CheckerboardPart checkerboard_to_update, const beliefprop::BpLevelProperties &current_bp_level, const T *data_cost_checkerboard_0, const T *data_cost_checkerboard_1, T *message_u_checkerboard_0, T *message_d_checkerboard_0, T *message_l_checkerboard_0, T *message_r_checkerboard_0, T *message_u_checkerboard_1, T *message_d_checkerboard_1, T *message_l_checkerboard_1, T *message_r_checkerboard_1, float disc_k_bp, unsigned int offset_data, bool data_aligned, unsigned int bp_settings_disp_vals)
Kernel function to run the current iteration of belief propagation in parallel using the checkerboard...
ARCHITECTURE_ADDITION void InitializeMessageValsToDefaultKernelPixel(unsigned int x_val_in_checkerboard, unsigned int y_val, const beliefprop::BpLevelProperties &current_bp_level, T *message_u_checkerboard_0, T *message_d_checkerboard_0, T *message_l_checkerboard_0, T *message_r_checkerboard_0, T *message_u_checkerboard_1, T *message_d_checkerboard_1, T *message_l_checkerboard_1, T *message_r_checkerboard_1, unsigned int bp_settings_disp_vals)
Initialize the message values at each pixel of the current level to the default value.
ARCHITECTURE_ADDITION void MsgStereo(unsigned int x_val, unsigned int y_val, const beliefprop::BpLevelProperties &current_bp_level, const U messages_neighbor_1[DISP_VALS], const U messages_neighbor_2[DISP_VALS], const U messages_neighbor_3[DISP_VALS], const U data_costs[DISP_VALS], T *dst_message_array, U disc_k_bp, bool data_aligned)
ARCHITECTURE_ADDITION void PrintDataAndMessageValsToPointKernel(unsigned int x_val, unsigned int y_val, const beliefprop::BpLevelProperties &current_bp_level, const T *data_cost_checkerboard_0, const T *data_cost_checkerboard_1, const T *message_u_checkerboard_0, const T *message_d_checkerboard_0, const T *message_l_checkerboard_0, const T *message_r_checkerboard_0, const T *message_u_checkerboard_1, const T *message_d_checkerboard_1, const T *message_l_checkerboard_1, const T *message_r_checkerboard_1, unsigned int bp_settings_disp_vals=0)
CheckerboardPart
Define the two checkerboard "parts" that the image is divided into.
ARCHITECTURE_ADDITION void InitializeCurrentLevelDataPixel(unsigned int x_val, unsigned int y_val, beliefprop::CheckerboardPart checkerboard_part, const beliefprop::BpLevelProperties &current_bp_level, const beliefprop::BpLevelProperties &prev_bp_level, const T *data_cost_checkerboard_0, const T *data_cost_checkerboard_1, T *data_cost_current_level, unsigned int offset_num, unsigned int bp_settings_disp_vals)
Initialize the data costs at the "next" level up in the pyramid given that the data at the lower has ...
ARCHITECTURE_ADDITION bool WithinImageBounds(unsigned int x_val, unsigned int y_val, unsigned int width, unsigned int height)
Checks if the current point is within the image bounds Assumed that input x/y vals are above zero sin...
ARCHITECTURE_ADDITION unsigned int RetrieveIndexInDataAndMessage(unsigned int x_val, unsigned int y_val, unsigned int width, unsigned int height, unsigned int current_disparity, unsigned int total_num_disp_vals, unsigned int offset_data=0u)
Retrieve the current 1-D index value of the given point at the given disparity in the data cost and m...
ARCHITECTURE_ADDITION void InitializeBottomLevelDataPixel(unsigned int x_val, unsigned int y_val, const beliefprop::BpLevelProperties &current_bp_level, const float *image_1_pixels_device, const float *image_2_pixels_device, T *data_cost_stereo_checkerboard_0, T *data_cost_stereo_checkerboard_1, float lambda_bp, float data_k_bp, unsigned int bp_settings_disp_vals)
Initialize the "data cost" for each possible disparity between the two full-sized input images ("bott...
ARCHITECTURE_ADDITION void DtStereo(T f[DISP_VALS])
function retrieve the minimum value at each 1-d disparity value in O(n) time using Felzenszwalb's met...
constexpr float kHighValBpKernel
High value as used in kernel currently hard-coded to be below maximum short value of 32767.
Definition: BpRunUtils.h:51
ARCHITECTURE_ADDITION void CopyMsgDataToNextLevelPixel(unsigned int x_val, unsigned int y_val, beliefprop::CheckerboardPart checkerboard_part, const beliefprop::BpLevelProperties &current_bp_level, const beliefprop::BpLevelProperties &next_bp_level, const T *message_u_prev_checkerboard_0, const T *message_d_prev_checkerboard_0, const T *message_l_prev_checkerboard_0, const T *message_r_prev_checkerboard_0, const T *message_u_prev_checkerboard_1, const T *message_d_prev_checkerboard_1, const T *message_l_prev_checkerboard_1, const T *message_r_prev_checkerboard_1, T *message_u_checkerboard_0, T *message_d_checkerboard_0, T *message_l_checkerboard_0, T *message_r_checkerboard_0, T *message_u_checkerboard_1, T *message_d_checkerboard_1, T *message_l_checkerboard_1, T *message_r_checkerboard_1, unsigned int bp_settings_disp_vals)
Kernel to copy the computed BP message values at the current level to the corresponding locations at ...
POD struct to store bp level data. Struct can be passed to global CUDAs kernel so needs to take restr...
Definition: BpLevel.h:42
unsigned int height_level_
Definition: BpLevel.h:44
unsigned int width_checkerboard_level_
Definition: BpLevel.h:46
unsigned int width_level_
Definition: BpLevel.h:43
unsigned int padded_width_checkerboard_level_
Definition: BpLevel.h:47