X-Git-Url: https://fleuret.org/cgi-bin/gitweb/gitweb.cgi?a=blobdiff_plain;f=svrt.c;h=102084b6f8c565ed2f175cfe5548223f7bf12b20;hb=6c83bf23d43bdbf2a8cae2df4654b26d46d53046;hp=1a2449b04ee43638b9bc961478dbbe5db3adfabe;hpb=24368498f3065e8a4be34c5e8e2b68f9d1220f7d;p=pysvrt.git diff --git a/svrt.c b/svrt.c index 1a2449b..102084b 100644 --- a/svrt.c +++ b/svrt.c @@ -27,6 +27,65 @@ #include "svrt_generator.h" +THByteStorage *compress(THByteStorage *x) { + long k, g, n; + + k = 0; n = 0; + while(k < x->size) { + g = 0; + while(k < x->size && x->data[k] == 255 && g < 255) { g++; k++; } + n++; + if(k < x->size && g < 255) { k++; } + } + + if(x->data[k-1] == 0) { + n++; + } + + THByteStorage *result = THByteStorage_newWithSize(n); + + k = 0; n = 0; + while(k < x->size) { + g = 0; + while(k < x->size && x->data[k] == 255 && g < 255) { g++; k++; } + result->data[n++] = g; + if(k < x->size && g < 255) { k++; } + } + if(x->data[k-1] == 0) { + result->data[n++] = 0; + } + + return result; +} + +THByteStorage *uncompress(THByteStorage *x) { + long k, g, n; + + k = 0; + for(n = 0; n < x->size - 1; n++) { + k = k + x->data[n]; + if(x->data[n] < 255) { k++; } + } + k = k + x->data[n]; + + THByteStorage *result = THByteStorage_newWithSize(k); + + k = 0; + for(n = 0; n < x->size - 1; n++) { + for(g = 0; g < x->data[n]; g++) { + result->data[k++] = 255; + } + if(x->data[n] < 255) { + result->data[k++] = 0; + } + } + for(g = 0; g < x->data[n]; g++) { + result->data[k++] = 255; + } + + return result; +} + THByteTensor *generate_vignettes(long n_problem, THLongTensor *labels) { struct VignetteSet vs; long nb_vignettes; @@ -35,6 +94,11 @@ THByteTensor *generate_vignettes(long n_problem, THLongTensor *labels) { long *m, *l; unsigned char *a, *b; + if(THLongTensor_nDimension(labels) != 1) { + printf("Label tensor has to be of dimension 1.\n"); + exit(1); + } + nb_vignettes = THLongTensor_size(labels, 0); m = THLongTensor_storage(labels)->data + THLongTensor_storageOffset(labels); st0 = THLongTensor_stride(labels, 0);