Skip to content

Commit

Permalink
Array Squeezing done
Browse files Browse the repository at this point in the history
  • Loading branch information
anderflash committed Oct 4, 2015
1 parent b4706eb commit b616505
Show file tree
Hide file tree
Showing 3 changed files with 72 additions and 1 deletion.
13 changes: 12 additions & 1 deletion include/grafeo/array.h
Original file line number Diff line number Diff line change
Expand Up @@ -486,7 +486,18 @@ Array* array_reduce_max(Array* array, int16_t* axes, uint16_t size);
* @return { description_of_the_return_value }
*/
Array* array_reduce_min(Array* array, int16_t* axes, uint16_t size);

/**
* @brief array_squeeze
* @param array
*/
void array_squeeze(Array* array);
/**
* @brief array_squeeze_axis
* @param num_axis
* @param array
* @param axis
*/
void array_squeeze_axis(Array* array, uint8_t num_axis, uint16_t* axis);
/*-----------------------------------
* ARRAY IO FUNCTIONS
*-----------------------------------*/
Expand Down
25 changes: 25 additions & 0 deletions src/array.c
Original file line number Diff line number Diff line change
Expand Up @@ -546,6 +546,31 @@ array_reduce(Array* array, int16_t* axes, uint16_t size, ArrayOperation operatio
return reduced;
}

void array_squeeze(Array* array){
uint16_t current_pos = 0,i;
for(i = current_pos; i < array->dim; i++){
if(array->size[i] != 1) array->size[current_pos++] = array->size[i];
}
array->dim = current_pos;
array->size = realloc(array->size, current_pos * sizeof(uint32_t));
}

void array_squeeze_axis(Array* array, uint8_t num_axis, uint16_t* axis){
uint16_t current_pos = axis[0], current_axis_pos = 0,i;
for(i = current_pos; i < array->dim; i++){
// Copy whether non single-dimension or not indicated by axis
if(current_axis_pos == num_axis || // Traversed all indicated axis?
array->size[i] != 1 || // Non single-dimension?
axis[current_axis_pos] != i) // Is not an indicated axis?
array->size[current_pos++] = array->size[i];
// If indicated, don't copy, just see next indicated axis
else if(i == axis[current_axis_pos])
current_axis_pos++;
}
array->dim = current_pos;
array->size = realloc(array->size, current_pos * sizeof(uint32_t));
}

Array* array_sum_scalar(Array *array, double value){
Array* new_array = array_new_like(array);
uint64_t i;
Expand Down
35 changes: 35 additions & 0 deletions tests/test_array.c
Original file line number Diff line number Diff line change
Expand Up @@ -826,6 +826,40 @@ static void test_array_conversion(void** state){
}
}

static void test_array_squeeze(void** state){
(void) state;
uint32_t N1=10,N2=20;
// Remove all single-dimensional axis
uint32_t size[4] = {1,N1,N2,1};
Array* array = array_new_with_size(4,size);
array_squeeze(array);
assert_int_equal(array->dim, 2);
assert_int_equal(array->size[0], N1);
assert_int_equal(array->size[1], N2);
array_free(array);

// Remove specific single-dimensional axis
array = array_new_with_size(4,size);
uint16_t axis[1] = {0};
array_squeeze_axis(array, 1, axis);
assert_int_equal(array->dim, 3);
assert_int_equal(array->size[0], N1);
assert_int_equal(array->size[1], N2);
assert_int_equal(array->size[2], 1);
array_free(array);

array = array_new_with_size(4,size);
axis[0] = 3;
array_squeeze_axis(array, 1, axis);
assert_int_equal(array->dim, 3);
assert_int_equal(array->size[0], 1);
assert_int_equal(array->size[1], N1);
assert_int_equal(array->size[2], N2);
array_free(array);


}

int main(int argc, char** argv){
(void)argc;
(void)argv;
Expand All @@ -849,6 +883,7 @@ int main(int argc, char** argv){
cmocka_unit_test(test_array_get_long_double),
cmocka_unit_test(test_array_io_csv),
cmocka_unit_test(test_array_conversion),
cmocka_unit_test(test_array_squeeze),
};
return cmocka_run_group_tests(tests,NULL,NULL);
}

0 comments on commit b616505

Please sign in to comment.