diff options
| author | Joshua Bakita <jbakita@cs.unc.edu> | 2020-10-17 14:43:46 -0400 |
|---|---|---|
| committer | Joshua Bakita <jbakita@cs.unc.edu> | 2020-10-17 14:43:46 -0400 |
| commit | a3886552003d031acb9039e920b7c9ddce946ad6 (patch) | |
| tree | c3b6a400a9ba31e744e6218365d63bdfbbc45a83 /dis/Neighborhood/utili.h | |
| parent | 917499f6257ac51c05e8302af877d56a22f28cb5 (diff) | |
DIS fixes used for (rejected) RTSS'20 submission
- All: Output times to stderr and nothing to stdout
- Field, Update, Pointer: change definition of a job to match other
stressmark execution times more closely
- Matrix: move all allocations into main()
- Update: Use volatile to prevent computations from being optimized out
- Transitive: Use volatile to prevent computations from being optimized out
- Neighborhood: Use working version of drawLineSegment from original DIS
sample code
Diffstat (limited to 'dis/Neighborhood/utili.h')
| -rw-r--r-- | dis/Neighborhood/utili.h | 161 |
1 files changed, 53 insertions, 108 deletions
diff --git a/dis/Neighborhood/utili.h b/dis/Neighborhood/utili.h index 2a8e2a0..5b54d9b 100644 --- a/dis/Neighborhood/utili.h +++ b/dis/Neighborhood/utili.h | |||
| @@ -56,81 +56,23 @@ typedef struct { | |||
| 56 | 56 | ||
| 57 | typedef short int Pixel; /* short int;*/ | 57 | typedef short int Pixel; /* short int;*/ |
| 58 | 58 | ||
| 59 | typedef struct { | ||
| 60 | int numColumns; /* number of columns in image */ | ||
| 61 | int numRows; /* number of rows in image */ | ||
| 62 | Pixel maxImageValue; /* max legal image value */ | ||
| 63 | Pixel *data; /* data pointer */ | ||
| 64 | } Image; | ||
| 59 | 65 | ||
| 60 | void drawLineSegment(Pixel *image, | 66 | // For correct implementation of drawLineSegment |
| 61 | Coord startPoint, | 67 | #include "initializeImage.c" |
| 62 | Coord endPoint, | ||
| 63 | int startValue, | ||
| 64 | int endValue, | ||
| 65 | int thickness, | ||
| 66 | int dimension) | ||
| 67 | { | ||
| 68 | int changeColumn, changeRow; | ||
| 69 | int delta; | ||
| 70 | int column, row; | ||
| 71 | float value, valueDelta; | ||
| 72 | int t; | ||
| 73 | |||
| 74 | changeColumn = endPoint.column - startPoint.column; | ||
| 75 | changeRow = endPoint.row - startPoint.row; | ||
| 76 | |||
| 77 | assert((changeRow != 0) || (changeColumn != 0)); | ||
| 78 | |||
| 79 | column = startPoint.column; | ||
| 80 | row = startPoint.row; | ||
| 81 | value = startValue; | ||
| 82 | |||
| 83 | if (ABS(changeColumn) > ABS(changeRow)){ | ||
| 84 | valueDelta = ((float) endValue - startValue)/ | ||
| 85 | ((float) ABS(changeColumn)); | ||
| 86 | delta = 2*ABS(row) - ABS(column); | ||
| 87 | for (column = startPoint.column; | ||
| 88 | column == endPoint.column+sign(changeColumn); | ||
| 89 | column += sign(changeColumn)){ | ||
| 90 | for (t = MAX(0, row-thickness/2); | ||
| 91 | t < MIN(dimension, row+thickness - thickness/2); | ||
| 92 | t++) | ||
| 93 | image[t*dimension + column] = (int)value; | ||
| 94 | value += valueDelta; | ||
| 95 | if (delta >= 0){ | ||
| 96 | row += sign(changeRow); | ||
| 97 | delta -= 2*ABS(changeColumn); | ||
| 98 | } | ||
| 99 | column += sign(changeColumn); | ||
| 100 | delta += 2*ABS(changeRow); | ||
| 101 | } | ||
| 102 | } | ||
| 103 | else { | ||
| 104 | valueDelta = ((float) endValue - startValue)/ | ||
| 105 | ((float) ABS(changeRow)); | ||
| 106 | delta = 2* ABS(column) - ABS(row); | ||
| 107 | for (row = startPoint.row; | ||
| 108 | row == endPoint.row + sign(changeRow); | ||
| 109 | row += sign(changeRow)){ | ||
| 110 | for (t = MAX(0, column-thickness/2); | ||
| 111 | t < MIN(dimension, row + thickness - thickness/2); | ||
| 112 | t++) | ||
| 113 | image[row*dimension + t] = (int)value; | ||
| 114 | if (delta >= 0){ | ||
| 115 | column += sign(changeColumn); | ||
| 116 | delta -= 2*ABS(changeRow); | ||
| 117 | } | ||
| 118 | row += sign(changeRow); | ||
| 119 | delta += 2*ABS(changeColumn); | ||
| 120 | } | ||
| 121 | } | ||
| 122 | return; | ||
| 123 | } | ||
| 124 | |||
| 125 | |||
| 126 | 68 | ||
| 127 | Pixel *createImage (int dimension, | 69 | Pixel *createImage (Pixel *image, |
| 70 | int dimension, | ||
| 128 | Pixel maxPixel, | 71 | Pixel maxPixel, |
| 129 | int numberLines, | 72 | int numberLines, |
| 130 | int minThickness, | 73 | int minThickness, |
| 131 | int maxThickness) | 74 | int maxThickness) |
| 132 | { | 75 | { |
| 133 | Pixel *image; | ||
| 134 | int i; | 76 | int i; |
| 135 | 77 | ||
| 136 | Coord startPoint; | 78 | Coord startPoint; |
| @@ -138,9 +80,12 @@ Pixel *createImage (int dimension, | |||
| 138 | int thickness; | 80 | int thickness; |
| 139 | int startValue; | 81 | int startValue; |
| 140 | int endValue; | 82 | int endValue; |
| 83 | Image img; | ||
| 84 | img.numColumns = dimension; | ||
| 85 | img.numRows = dimension; | ||
| 86 | img.maxImageValue = maxPixel; | ||
| 87 | img.data = image; | ||
| 141 | 88 | ||
| 142 | image = (Pixel *)malloc(sizeof(Pixel) * dimension * dimension); | ||
| 143 | assert (image != NULL); | ||
| 144 | for (i=0; i<dimension*dimension; i++){ | 89 | for (i=0; i<dimension*dimension; i++){ |
| 145 | image[i] = 0; | 90 | image[i] = 0; |
| 146 | } | 91 | } |
| @@ -154,6 +99,7 @@ Pixel *createImage (int dimension, | |||
| 154 | startPoint.column = (int) temp % dimension; | 99 | startPoint.column = (int) temp % dimension; |
| 155 | prev = temp; | 100 | prev = temp; |
| 156 | 101 | ||
| 102 | // Make sure that the end is different than the start | ||
| 157 | while((temp = randomUInt(0, dimension*dimension -1)) == prev); | 103 | while((temp = randomUInt(0, dimension*dimension -1)) == prev); |
| 158 | 104 | ||
| 159 | endPoint.row = (int) temp/dimension; | 105 | endPoint.row = (int) temp/dimension; |
| @@ -163,11 +109,11 @@ Pixel *createImage (int dimension, | |||
| 163 | startValue = randomUInt(MIN_PIXEL, maxPixel); | 109 | startValue = randomUInt(MIN_PIXEL, maxPixel); |
| 164 | endValue = randomUInt(MIN_PIXEL, maxPixel); | 110 | endValue = randomUInt(MIN_PIXEL, maxPixel); |
| 165 | 111 | ||
| 166 | drawLineSegment(image, startPoint, endPoint, | 112 | drawLineSegment(&startPoint, &endPoint, |
| 167 | startValue, endValue, thickness, dimension); | 113 | startValue, endValue, thickness, &img); |
| 168 | } | 114 | } |
| 169 | return(image); | 115 | return(image); |
| 170 | } | 116 | } |
| 171 | 117 | ||
| 172 | 118 | ||
| 173 | void calcEntropyEnergy( | 119 | void calcEntropyEnergy( |
| @@ -214,10 +160,10 @@ void calcEntropyEnergy( | |||
| 214 | columnHigh = dimension; | 160 | columnHigh = dimension; |
| 215 | } | 161 | } |
| 216 | else | 162 | else |
| 217 | { | 163 | { |
| 218 | columnLow = 0; | 164 | columnLow = 0; |
| 219 | columnHigh = dimension - dx; | 165 | columnHigh = dimension - dx; |
| 220 | } | 166 | } |
| 221 | 167 | ||
| 222 | totalNumPixels = 0; | 168 | totalNumPixels = 0; |
| 223 | value0RowOffset = rowLow * dimension; | 169 | value0RowOffset = rowLow * dimension; |
| @@ -225,27 +171,27 @@ void calcEntropyEnergy( | |||
| 225 | 171 | ||
| 226 | for (rowIndex = rowLow; rowIndex<rowHigh; rowIndex++){ | 172 | for (rowIndex = rowLow; rowIndex<rowHigh; rowIndex++){ |
| 227 | for (columnIndex= columnLow; columnIndex<columnHigh; | 173 | for (columnIndex= columnLow; columnIndex<columnHigh; |
| 228 | columnIndex++){ | 174 | columnIndex++){ |
| 229 | int value0; | 175 | int value0; |
| 230 | int value1; | 176 | int value1; |
| 231 | int binIndex; | 177 | int binIndex; |
| 232 | 178 | ||
| 233 | rowForPixelAtDistance = rowIndex + dy; | 179 | rowForPixelAtDistance = rowIndex + dy; |
| 234 | columnForPixelAtDistance = columnIndex + dx; | 180 | columnForPixelAtDistance = columnIndex + dx; |
| 235 | 181 | ||
| 236 | value0 = *(image + value0RowOffset + columnIndex); | 182 | value0 = *(image + value0RowOffset + columnIndex); |
| 237 | value1 = *(image + value1RowOffset + | 183 | value1 = *(image + value1RowOffset + |
| 238 | columnForPixelAtDistance); | 184 | columnForPixelAtDistance); |
| 239 | 185 | ||
| 240 | binIndex = value0 + value1 - 2*MIN_PIXEL; | 186 | binIndex = value0 + value1 - 2*MIN_PIXEL; |
| 241 | assert((binIndex >= 0) && (binIndex < numBins)); | 187 | assert((binIndex >= 0) && (binIndex < numBins)); |
| 242 | sumHist[binIndex] += 1; | 188 | sumHist[binIndex] += 1; |
| 243 | binIndex = value0 - value1 + maxPixel - MIN_PIXEL; | 189 | binIndex = value0 - value1 + maxPixel - MIN_PIXEL; |
| 244 | 190 | ||
| 245 | assert((binIndex >= 0) && (binIndex < numBins)); | 191 | assert((binIndex >= 0) && (binIndex < numBins)); |
| 246 | 192 | ||
| 247 | diffHist[binIndex] += 1; | 193 | diffHist[binIndex] += 1; |
| 248 | totalNumPixels += 1; | 194 | totalNumPixels += 1; |
| 249 | |||
