1 /* This code is part of the tng compression routines.
3 * Written by Daniel Spangberg
4 * Copyright (c) 2010, 2013, The GROMACS development team.
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the Revised BSD License.
11 /* This code is heavily influenced by
12 http://hpcv100.rc.rug.nl/xdrf.html
13 Based on coordinate compression (c) by Frans van Hoesel.
14 and GROMACS xtc files (http://www.gromacs.org)
15 (c) Copyright (c) Erik Lindahl, David van der Spoel
22 #include "../../include/compression/coder.h"
23 #include "../../include/compression/widemuldiv.h"
24 #include "../../include/compression/warnmalloc.h"
26 /* Generated by gen_magic.py */
29 static unsigned int magic[MAX_MAGIC]={
34 101U, 128U, 161U, 203U,
35 256U, 322U, 406U, 512U,
36 645U, 812U, 1024U, 1290U,
37 1625U, 2048U, 2580U, 3250U,
38 4096U, 5160U, 6501U, 8192U,
39 10321U, 13003U, 16384U, 20642U,
40 26007U, 32768U, 41285U, 52015U,
41 65536U, 82570U, 104031U, 131072U,
42 165140U, 208063U, 262144U, 330280U,
43 416127U, 524288U, 660561U, 832255U,
44 1048576U, 1321122U, 1664510U, 2097152U,
45 2642245U, 3329021U, 4194304U, 5284491U,
46 6658042U, 8388608U, 10568983U, 13316085U,
47 16777216U, 21137967U, 26632170U, 33554432U,
48 42275935U, 53264340U, 67108864U, 84551870U,
49 106528681U, 134217728U, 169103740U, 213057362U,
50 268435456U, 338207481U, 426114725U, 536870912U,
51 676414963U, 852229450U, 1073741824U, 1352829926U,
52 1704458900U, 2147483648U, 2705659852U, 3408917801U,
55 static unsigned int magic_bits[MAX_MAGIC][8]={
56 { 3, 6, 9, 12, 15, 18, 21, 24, },
57 { 5, 10, 15, 20, 24, 29, 34, 39, },
58 { 6, 12, 18, 24, 30, 36, 42, 48, },
59 { 7, 14, 21, 28, 35, 42, 49, 56, },
60 { 8, 16, 24, 32, 39, 47, 55, 63, },
61 { 9, 18, 27, 36, 45, 54, 63, 72, },
62 { 10, 20, 30, 40, 50, 60, 70, 80, },
63 { 11, 22, 33, 44, 54, 65, 76, 87, },
64 { 12, 24, 36, 48, 60, 72, 84, 97, },
65 { 13, 26, 39, 52, 65, 78, 91, 104, },
66 { 14, 28, 42, 56, 70, 84, 98, 112, },
67 { 15, 30, 45, 60, 75, 90, 105, 120, },
68 { 16, 32, 48, 64, 80, 96, 112, 128, },
69 { 17, 34, 51, 68, 85, 102, 119, 136, },
70 { 18, 36, 54, 72, 90, 108, 127, 144, },
71 { 19, 38, 57, 76, 95, 114, 133, 152, },
72 { 20, 40, 60, 80, 100, 120, 140, 160, },
73 { 21, 42, 63, 84, 105, 127, 147, 168, },
74 { 22, 44, 66, 88, 110, 132, 154, 176, },
75 { 23, 46, 69, 92, 115, 138, 161, 184, },
76 { 24, 48, 72, 97, 120, 144, 168, 192, },
77 { 25, 50, 75, 100, 125, 150, 175, 200, },
78 { 26, 52, 78, 104, 130, 156, 182, 208, },
79 { 27, 54, 81, 108, 135, 162, 190, 216, },
80 { 28, 56, 84, 112, 140, 168, 196, 224, },
81 { 29, 58, 87, 116, 145, 174, 203, 232, },
82 { 30, 60, 90, 120, 150, 180, 210, 240, },
83 { 31, 62, 93, 124, 155, 186, 217, 248, },
84 { 32, 64, 96, 128, 160, 192, 224, 256, },
85 { 33, 66, 99, 132, 165, 198, 231, 264, },
86 { 34, 68, 102, 136, 170, 204, 238, 272, },
87 { 35, 70, 105, 140, 175, 210, 245, 280, },
88 { 36, 72, 108, 144, 180, 216, 252, 288, },
89 { 37, 74, 111, 148, 185, 222, 259, 296, },
90 { 38, 76, 114, 152, 190, 228, 266, 304, },
91 { 39, 78, 117, 157, 195, 234, 273, 312, },
92 { 40, 80, 120, 160, 200, 240, 280, 320, },
93 { 41, 82, 123, 164, 205, 246, 287, 328, },
94 { 42, 84, 127, 168, 210, 252, 294, 336, },
95 { 43, 86, 129, 172, 215, 258, 301, 344, },
96 { 44, 88, 132, 176, 220, 264, 308, 352, },
97 { 45, 90, 135, 180, 225, 270, 315, 360, },
98 { 46, 92, 138, 184, 230, 276, 322, 368, },
99 { 47, 94, 141, 188, 235, 282, 329, 376, },
100 { 48, 97, 144, 192, 240, 288, 336, 384, },
101 { 49, 98, 147, 196, 245, 294, 343, 392, },
102 { 50, 100, 150, 200, 250, 300, 350, 400, },
103 { 52, 102, 153, 204, 255, 306, 357, 408, },
104 { 52, 104, 156, 208, 260, 312, 364, 416, },
105 { 53, 106, 159, 212, 265, 318, 371, 424, },
106 { 54, 108, 162, 216, 270, 324, 378, 432, },
107 { 55, 110, 165, 220, 275, 330, 385, 440, },
108 { 56, 112, 168, 224, 280, 336, 392, 448, },
109 { 57, 114, 172, 228, 285, 342, 399, 456, },
110 { 58, 116, 174, 232, 290, 348, 406, 464, },
111 { 59, 118, 177, 236, 295, 354, 413, 472, },
112 { 60, 120, 180, 240, 300, 360, 420, 480, },
113 { 61, 122, 183, 244, 305, 366, 427, 488, },
114 { 62, 124, 186, 248, 310, 372, 434, 496, },
115 { 63, 127, 190, 252, 315, 378, 442, 505, },
116 { 64, 128, 192, 256, 320, 384, 448, 512, },
117 { 65, 130, 195, 260, 325, 390, 455, 520, },
118 { 66, 132, 198, 264, 330, 396, 462, 528, },
119 { 67, 134, 201, 268, 335, 402, 469, 536, },
120 { 68, 136, 204, 272, 340, 408, 476, 544, },
121 { 69, 138, 207, 276, 345, 414, 483, 552, },
122 { 70, 140, 210, 280, 350, 420, 490, 560, },
123 { 71, 142, 213, 284, 355, 426, 497, 568, },
124 { 72, 144, 216, 288, 360, 432, 505, 576, },
125 { 73, 146, 219, 292, 365, 438, 511, 584, },
126 { 74, 148, 222, 296, 370, 444, 518, 592, },
127 { 75, 150, 225, 300, 375, 451, 525, 600, },
128 { 76, 152, 228, 304, 380, 456, 532, 608, },
129 { 77, 154, 231, 308, 385, 462, 539, 616, },
130 { 78, 157, 234, 312, 390, 469, 546, 625, },
131 { 79, 158, 237, 316, 395, 474, 553, 632, },
132 { 80, 160, 240, 320, 400, 480, 560, 640, },
133 { 81, 162, 243, 324, 406, 486, 568, 648, },
134 { 82, 164, 246, 328, 410, 492, 574, 656, },
135 { 83, 166, 249, 332, 415, 498, 581, 664, },
136 { 84, 168, 252, 336, 420, 505, 588, 672, },
137 { 85, 170, 255, 340, 425, 510, 595, 680, },
138 { 86, 172, 258, 344, 430, 516, 602, 688, },
139 { 87, 174, 261, 348, 435, 522, 609, 696, },
140 { 88, 176, 264, 352, 440, 528, 616, 704, },
141 { 89, 178, 267, 356, 445, 534, 623, 712, },
142 { 90, 180, 270, 360, 451, 540, 631, 720, },
143 { 91, 182, 273, 364, 455, 546, 637, 728, },
144 { 92, 184, 276, 368, 460, 552, 644, 736, },
145 { 94, 187, 279, 373, 466, 558, 651, 745, },
146 { 94, 188, 282, 376, 470, 564, 658, 752, },
147 { 95, 190, 285, 380, 475, 570, 665, 760, },
151 static const double iflipgaincheck=0.89089871814033927; /* 1./(2**(1./6)) */
154 /* Difference in indices used for determining whether to store as large or small */
155 #define QUITE_LARGE 3
162 int Ptngc_magic(unsigned int i)
167 int Ptngc_find_magic_index(unsigned int maxval)
170 while (magic[i]<=maxval)
175 static unsigned int positive_int(int item)
185 static int unpositive_int(int val)
194 /* Sequence instructions */
195 #define INSTR_DEFAULT 0
196 #define INSTR_BASE_RUNLENGTH 1
197 #define INSTR_ONLY_LARGE 2
198 #define INSTR_ONLY_SMALL 3
199 #define INSTR_LARGE_BASE_CHANGE 4
201 #define INSTR_LARGE_RLE 6
206 static char *instrnames[MAXINSTR]={
217 /* Bit patterns in the compressed code stream: */
219 static const int seq_instr[MAXINSTR][2]=
221 { 1,1 }, /* 1 : one large atom + runlength encoded small integers. Use same settings as before. */
222 { 0,2 }, /* 00 : set base and runlength in next four bits (x). base (increase/keep/decrease)=x%3-1. runlength=1+x/3.
223 The special value 1111 in the four bits means runlength=6 and base change=0 */
224 { 4,4 }, /* 0100 : next only a large atom comes. */
225 { 5,4 }, /* 0101 : next only runlength encoded small integers. Use same settings as before. */
226 { 6,4 }, /* 0110 : Large change in base. Change is encoded in the
227 following 2 bits. change direction (sign) is the first
228 bit. The next bit +1 is the actual change. This
229 allows the change of up to +/- 2 indices. */
230 { 14,5 }, /* 01110 : flip whether integers should be modified to compress water better */
231 { 15,5 }, /* 01111 : Large rle. The next 4 bits encode how many
232 large atoms are in the following sequence: 3-18. (2 is
233 more efficiently coded with two large instructions. */
236 static void write_instruction(struct coder *coder,int instr,unsigned char **output_ptr)
238 Ptngc_writebits(coder,seq_instr[instr][0],seq_instr[instr][1],output_ptr);
240 fprintf(stderr,"INSTR: %s (%d bits)\n",instrnames[instr],seq_instr[instr][1]);
244 static unsigned int readbits(unsigned char **ptr, int *bitptr, int nbits)
247 unsigned int extract_mask=0x80U>>*bitptr;
248 unsigned char thisval=**ptr;
250 fprintf(stderr,"Read nbits=%d val=",nbits);
255 val|=((extract_mask & thisval)!=0);
268 fprintf(stderr,"%x\n",val);
273 static void readmanybits(unsigned char **ptr, int *bitptr, int nbits, unsigned char *buffer)
277 *buffer++=readbits(ptr,bitptr,8);
280 fprintf(stderr,"Read value %02x\n",buffer[-1]);
285 *buffer++=readbits(ptr,bitptr,nbits);
287 fprintf(stderr,"Read value %02x\n",buffer[-1]);
292 static int read_instruction(unsigned char **ptr, int *bitptr)
295 unsigned int bits=readbits(ptr,bitptr,1);
300 bits=readbits(ptr,bitptr,1);
302 instr=INSTR_BASE_RUNLENGTH;
305 bits=readbits(ptr,bitptr,2);
307 instr=INSTR_ONLY_LARGE;
309 instr=INSTR_ONLY_SMALL;
311 instr=INSTR_LARGE_BASE_CHANGE;
314 bits=readbits(ptr,bitptr,1);
318 instr=INSTR_LARGE_RLE;
325 /* Modifies three integer values for better compression of water */
326 static void swap_ints(int *in, int *out)
333 static void swap_is_better(int *input, int *minint, int *sum_normal, int *sum_swapped)
342 normal[0]=input[i]-minint[i];
343 normal[1]=input[3+i]-input[i]; /* minint[i]-minint[i] cancels out */
344 normal[2]=input[6+i]-input[3+i]; /* minint[i]-minint[i] cancels out */
345 swap_ints(normal,swapped);
348 if (positive_int(normal[j])>(unsigned int)normal_max)
349 normal_max=positive_int(normal[j]);
350 if (positive_int(swapped[j])>(unsigned int)swapped_max)
351 swapped_max=positive_int(swapped[j]);
358 *sum_normal=normal_max;
359 *sum_swapped=swapped_max;
362 static void swapdecide(struct coder *coder, int *input,int *swapatoms, int *large_index, int *minint, unsigned char **output_ptr)
367 swap_is_better(input,minint,&normal,&swapped);
368 /* We have to determine if it is worth to change the behaviour.
369 If diff is positive it means that it is worth something to
370 swap. But it costs 4 bits to do the change. If we assume that
371 we gain 0.17 bit by the swap per value, and the runlength>2
372 for four molecules in a row, we gain something. So check if we
373 gain at least 0.17 bits to even attempt the swap.
376 fprintf(stderr,"Trying Flip: %g %g\n",(double)swapped/normal, (double)normal/swapped);
378 if (((swapped<normal) && (fabs((double)swapped/normal)<iflipgaincheck)) ||
379 ((normal<swapped) && (fabs((double)normal/swapped)<iflipgaincheck)))
401 fprintf(stderr,"Flip. Swapatoms is now %d\n",*swapatoms);
403 write_instruction(coder,INSTR_FLIP,output_ptr);
407 /* Compute number of bits required to store values using three different bases in the index array */
408 static int compute_magic_bits(int *index)
410 unsigned int largeint[4];
411 unsigned int largeint_tmp[4];
419 /* We must do the multiplication of the largeint with the integer base */
420 Ptngc_largeint_mul(magic[index[i]],largeint,largeint_tmp,4);
422 largeint[j]=largeint_tmp[j];
424 Ptngc_largeint_add(magic[index[i]]-1,largeint,4);
428 printf("Largeint is %u %u %u\n",largeint[0],largeint[1],largeint[2]);
433 if (largeint[i]&(1U<<j))
438 /* Convert a sequence of (hopefully) small positive integers
439 using the base pointed to by index (x base, y base and z base can be different).
440 The largest number of integers supported is 18 (29 to handle/detect overflow) */
441 static void trajcoder_base_compress(int *input, int n, int *index, unsigned char *result)
443 unsigned int largeint[19];
444 unsigned int largeint_tmp[19];
453 /* We must do the multiplication of the largeint with the integer base */
454 Ptngc_largeint_mul(magic[index[i%3]],largeint,largeint_tmp,19);
456 largeint[j]=largeint_tmp[j];
458 Ptngc_largeint_add(input[i],largeint,19);
462 fprintf(stderr,"TRAJNG: BUG! Overflow in compression detected.\n");
468 fprintf(stderr,"Largeint[%d]=0x%x\n",i,largeint[i]);
471 /* Convert the largeint to a sequence of bytes. */
477 result[i*4+j]=(largeint[i]>>shift) & 0xFFU;
483 /* The opposite of base_compress. */
484 static void trajcoder_base_decompress(unsigned char *input, int n, int *index, int *output)
486 unsigned int largeint[19];
487 unsigned int largeint_tmp[19];
489 /* Convert the sequence of bytes to a largeint. */
496 largeint[i]|=((unsigned int)input[i*4+j])<<shift;
504 fprintf(stderr,"Largeint[%d]=0x%x\n",i,largeint[i]);
507 for (i=n-1; i>=0; i--)
509 unsigned int remainder=Ptngc_largeint_div(magic[index[i%3]],largeint,largeint_tmp,19);
512 fprintf(stderr,"Remainder: %u\n",remainder);
517 largeint[j]=largeint_tmp[j];
519 memcpy(largeint,largeint_tmp,19*sizeof *largeint);
524 /* It is "large" if we have to increase the small index quite a
525 bit. Not so much to be rejected by the not very large check
527 static int is_quite_large(int *input, int small_index, int max_large_index)
531 if (small_index+QUITE_LARGE>=max_large_index)
536 if (positive_int(input[i])>magic[small_index+QUITE_LARGE])
550 static void write_three_large(struct coder *coder, int *encode_ints, int *large_index, int nbits, unsigned char *compress_buffer, unsigned char **output_ptr)
552 trajcoder_base_compress(encode_ints,3,large_index,compress_buffer);
553 Ptngc_writemanybits(coder,compress_buffer,nbits,output_ptr);
555 fprintf(stderr,"nbits=%d (%g)\n",nbits,nbits/3.);
558 fprintf(stderr,"Large: %d %d %d\n",encode_ints[0],encode_ints[1],encode_ints[2]);
562 static void insert_batch(int *input_ptr, int ntriplets_left, int *prevcoord,int *minint, int *encode_ints, int startenc, int *nenc)
564 int nencode=startenc*3;
565 int tmp_prevcoord[3];
567 tmp_prevcoord[0]=prevcoord[0];
568 tmp_prevcoord[1]=prevcoord[1];
569 tmp_prevcoord[2]=prevcoord[2];
574 for (i=0; i<startenc; i++)
576 tmp_prevcoord[0]+=encode_ints[i*3];
577 tmp_prevcoord[1]+=encode_ints[i*3+1];
578 tmp_prevcoord[2]+=encode_ints[i*3+2];
580 fprintf(stderr,"%6d: %6d %6d %6d\t\t%6d %6d %6d\t\t%6d %6d %6d\n",i*3,
581 tmp_prevcoord[0],tmp_prevcoord[1],tmp_prevcoord[2],
585 positive_int(encode_ints[i*3]),
586 positive_int(encode_ints[i*3+1]),
587 positive_int(encode_ints[i*3+2]));
593 fprintf(stderr,"New batch\n");
595 while ((nencode<21) && (nencode<ntriplets_left*3))
597 encode_ints[nencode]=input_ptr[nencode]-minint[0]-tmp_prevcoord[0];
598 encode_ints[nencode+1]=input_ptr[nencode+1]-minint[1]-tmp_prevcoord[1];
599 encode_ints[nencode+2]=input_ptr[nencode+2]-minint[2]-tmp_prevcoord[2];
601 fprintf(stderr,"%6d: %6d %6d %6d\t\t%6d %6d %6d\t\t%6d %6d %6d\n",nencode,
602 input_ptr[nencode]-minint[0],
603 input_ptr[nencode+1]-minint[1],
604 input_ptr[nencode+2]-minint[2],
605 encode_ints[nencode],
606 encode_ints[nencode+1],
607 encode_ints[nencode+2],
608 positive_int(encode_ints[nencode]),
609 positive_int(encode_ints[nencode+1]),
610 positive_int(encode_ints[nencode+2]));
612 tmp_prevcoord[0]=input_ptr[nencode]-minint[0];
613 tmp_prevcoord[1]=input_ptr[nencode+1]-minint[1];
614 tmp_prevcoord[2]=input_ptr[nencode+2]-minint[2];
620 static void flush_large(struct coder *coder, int *has_large, int *has_large_ints, int n,
621 int *large_index, int large_nbits, unsigned char *compress_buffer,
622 unsigned char **output_ptr)
629 write_instruction(coder,INSTR_ONLY_LARGE,output_ptr);
630 write_three_large(coder,has_large_ints+i*3,large_index,large_nbits,compress_buffer,output_ptr);
636 printf("CODING RLE: %d\n",n);
638 write_instruction(coder,INSTR_LARGE_RLE,output_ptr);
639 Ptngc_writebits(coder,n-3,4,output_ptr); /* Number of large atoms in this sequence: 3 to 18 */
641 write_three_large(coder,has_large_ints+i*3,large_index,large_nbits,compress_buffer,output_ptr);
643 if (((*has_large)-n)!=0)
646 for (i=0; i<(*has_large)-n; i++)
648 has_large_ints[i*3+j]=has_large_ints[(i+n)*3+j];
650 *has_large=(*has_large)-n; /* Number of remaining large atoms in buffer */
653 static void buffer_large(struct coder *coder, int *has_large, int *has_large_ints, int *new_large_ints,
654 int *large_index, int large_nbits, unsigned char *compress_buffer,
655 unsigned char **output_ptr)
657 /* If it is full we must write them all. */
659 flush_large(coder,has_large,has_large_ints, *has_large,
660 large_index,large_nbits,compress_buffer,output_ptr); /* Flush them all. */
661 has_large_ints[(*has_large)*3]=new_large_ints[0];
662 has_large_ints[(*has_large)*3+1]=new_large_ints[1];
663 has_large_ints[(*has_large)*3+2]=new_large_ints[2];
664 *has_large=(*has_large)+1;
668 unsigned char *Ptngc_pack_array_xtc2(struct coder *coder,int *input, int *length)
670 unsigned char *output=NULL;
671 unsigned char *output_ptr=NULL;
675 int ntriplets=*length/3;
683 int minint[3],maxint[3];
685 int has_large_ints[54]; /* Large cache. Up to 18 large atoms. */
687 int runlength=0; /* Initial runlength. "Stupidly" set to zero for
688 simplicity and explicity */
689 int swapatoms=0; /* Initial guess is that we should not swap the
690 first two atoms in each large+small
692 int didswap; /* Whether swapping was actually done. */
693 int *input_ptr=input;
694 int encode_ints[21]; /* Up to 3 large + 18 small ints can be encoded at once */
696 unsigned char compress_buffer[18*4]; /* Holds compressed result for 3 large ints or up to 18 small ints. */
697 int ntriplets_left=ntriplets;
703 /* Allocate enough memory for output */
704 output=warnmalloc(8* *length*sizeof *output);
707 maxint[0]=minint[0]=input[0];
708 maxint[1]=minint[1]=input[1];
709 maxint[2]=minint[2]=input[2];
711 for (i=1; i<ntriplets; i++)
714 if (input[i*3+j]>maxint[j])
715 maxint[j]=input[i*3+j];
716 if (input[i*3+j]<minint[j])
717 minint[j]=input[i*3+j];
720 large_index[0]=Ptngc_find_magic_index(maxint[0]-minint[0]+1);
721 large_index[1]=Ptngc_find_magic_index(maxint[1]-minint[1]+1);
722 large_index[2]=Ptngc_find_magic_index(maxint[2]-minint[2]+1);
723 large_nbits=compute_magic_bits(large_index);
724 max_large_index=large_index[0];
725 if (large_index[1]>max_large_index)
726 max_large_index=large_index[1];
727 if (large_index[2]>max_large_index)
728 max_large_index=large_index[2];
732 fprintf(stderr,"minint[%d]=%d. maxint[%d]=%d large_index[%d]=%d value=%d\n",j,minint[j],j,maxint[j],
733 j,large_index[j],magic[large_index[j]]);
734 fprintf(stderr,"large_nbits=%d\n",large_nbits);
738 /* Guess initial small index */
739 small_index=max_large_index/2;
741 /* Find the largest value that is not large. Not large is half index of
743 max_small=magic[small_index];
745 for (i=0; i<*length; i++)
748 int s=positive_int(item);
753 /* This value is not critical, since if I guess wrong, the code will
754 just insert instructions to increase this value. */
755 small_index=Ptngc_find_magic_index(intmax);
757 fprintf(stderr,"initial_small intmax=%d. small_index=%d value=%d\n",intmax,small_index,magic[small_index]);
760 /* Store min integers */
761 coder->pack_temporary_bits=32;
762 coder->pack_temporary=positive_int(minint[0]);
763 Ptngc_out8bits(coder,&output_ptr);
764 coder->pack_temporary_bits=32;
765 coder->pack_temporary=positive_int(minint[1]);
766 Ptngc_out8bits(coder,&output_ptr);
767 coder->pack_temporary_bits=32;
768 coder->pack_temporary=positive_int(minint[2]);
769 Ptngc_out8bits(coder,&output_ptr);
770 /* Store max indices */
771 coder->pack_temporary_bits=8;
772 coder->pack_temporary=large_index[0];
773 Ptngc_out8bits(coder,&output_ptr);
774 coder->pack_temporary_bits=8;
775 coder->pack_temporary=large_index[1];
776 Ptngc_out8bits(coder,&output_ptr);
777 coder->pack_temporary_bits=8;
778 coder->pack_temporary=large_index[2];
779 Ptngc_out8bits(coder,&output_ptr);
780 /* Store initial small index */
781 coder->pack_temporary_bits=8;
782 coder->pack_temporary=small_index;
783 Ptngc_out8bits(coder,&output_ptr);
787 for (i=0; i<ntriplets_left; i++)
788 fprintf(stderr,"VALUE:%d %6d %6d %6d\n",
796 /* Initial prevcoord is the minimum integers. */
797 prevcoord[0]=minint[0];
798 prevcoord[1]=minint[1];
799 prevcoord[2]=minint[2];
801 while (ntriplets_left)
803 if (ntriplets_left<0)
805 fprintf(stderr,"TRAJNG: BUG! ntriplets_left<0!\n");
808 /* If only less than three atoms left we just write them all as large integers. Here no swapping is done! */
809 if (ntriplets_left<3)
811 for (ienc=0; ienc<ntriplets_left; ienc++)
814 for (jenc=0; jenc<3; jenc++)
815 encode_ints[jenc]=input_ptr[ienc*3+jenc]-minint[jenc];
816 buffer_large(coder,&has_large,has_large_ints,encode_ints,large_index,large_nbits,compress_buffer,&output_ptr);
820 flush_large(coder,&has_large,has_large_ints,has_large,large_index,large_nbits,compress_buffer,&output_ptr);
825 int largest_required_base;
826 int largest_runlength_base;
827 int largest_required_index;
828 int largest_runlength_index;
832 int iter_small_index;
835 /* Insert the next batch of integers to be encoded into the buffer */
837 fprintf(stderr,"Initial batch\n");
839 insert_batch(input_ptr,ntriplets_left,prevcoord,minint,encode_ints,0,&nencode);
841 /* First we must decide if the next value is large (does not reasonably fit in current small encoding)
842 Also, if we have not written any values yet, we must begin by writing a large atom. */
843 if ((input_ptr==input) || (is_quite_large(encode_ints,small_index,max_large_index)) || (refused))
845 /* If any of the next two atoms are large we should probably write them as large and not swap them */
847 if ((is_quite_large(encode_ints+3,small_index,max_large_index)) || (is_quite_large(encode_ints+6,small_index,max_large_index)))
851 /* Next we must decide if we should swap the first
854 swapdecide(coder,input_ptr,&swapatoms,large_index,minint,&output_ptr);
858 /* If we should do the integer swapping manipulation we should do it now */
865 in[0]=input_ptr[i]-minint[i];
866 in[1]=input_ptr[3+i]-input_ptr[i]; /* minint[i]-minint[i] cancels out */
867 in[2]=input_ptr[6+i]-input_ptr[3+i]; /* minint[i]-minint[i] cancels out */
869 encode_ints[i]=out[0];
870 encode_ints[3+i]=out[1];
871 encode_ints[6+i]=out[2];
873 /* We have swapped atoms, so the minimum run-length is 2 */
875 fprintf(stderr,"Swap atoms results in:\n");
877 fprintf(stderr,"%d: %6d %6d %6d\t\t%6d %6d %6d\n",i*3,
881 positive_int(encode_ints[i*3]),
882 positive_int(encode_ints[i*3+1]),
883 positive_int(encode_ints[i*3+2]));
889 if ((swapatoms) && (didswap))
891 for (ienc=0; ienc<3; ienc++)
892 prevcoord[ienc]=encode_ints[ienc];
896 for (ienc=0; ienc<3; ienc++)
897 prevcoord[ienc]=input_ptr[ienc]-minint[ienc];
899 /* Cache large value for later possible combination with
900 a sequence of small integers. */
901 buffer_large(coder,&has_large,has_large_ints,prevcoord,large_index,large_nbits,compress_buffer,&output_ptr);
903 fprintf(stderr,"Prevcoord after packing of large: %d %d %d\n",
904 prevcoord[0],prevcoord[1],prevcoord[2]);
907 /* We have written a large integer so we have one less atoms to worry about */
913 /* Insert the next batch of integers to be encoded into the buffer */
915 fprintf(stderr,"Update batch due to large int.\n");
917 if ((swapatoms) && (didswap))
919 /* Keep swapped values. */
921 for (ienc=0; ienc<3; ienc++)
922 encode_ints[i*3+ienc]=encode_ints[(i+1)*3+ienc];
924 insert_batch(input_ptr,ntriplets_left,prevcoord,minint,encode_ints,min_runlength,&nencode);
926 /* Here we should only have differences for the atom coordinates. */
927 /* Convert the ints to positive ints */
928 for (ienc=0; ienc<nencode; ienc++)
930 int pint=positive_int(encode_ints[ienc]);
931 encode_ints[ienc]=pint;
933 /* Now we must decide what base and runlength to do. If we have swapped atoms it will be at least 2.
934 If even the next atom is large, we will not do anything. */
935 largest_required_base=0;
936 /* Determine required base */
937 for (ienc=0; ienc<min_runlength*3; ienc++)
938 if (encode_ints[ienc]>largest_required_base)
939 largest_required_base=encode_ints[ienc];
940 /* Also compute what the largest base is for the current runlength setting! */
941 largest_runlength_base=0;
942 for (ienc=0; (ienc<runlength*3) && (ienc<nencode); ienc++)
943 if (encode_ints[ienc]>largest_runlength_base)
944 largest_runlength_base=encode_ints[ienc];
946 largest_required_index=Ptngc_find_magic_index(largest_required_base);
947 largest_runlength_index=Ptngc_find_magic_index(largest_runlength_base);
949 if (largest_required_index<largest_runlength_index)
951 new_runlength=min_runlength;
952 new_small_index=largest_required_index;
956 new_runlength=runlength;
957 new_small_index=largest_runlength_index;
960 /* Only allow increase of runlength wrt min_runlength */
961 if (new_runlength<min_runlength)
962 new_runlength=min_runlength;
964 /* If the current runlength is longer than the number of
965 triplets left stop it from being so. */
966 if (new_runlength>ntriplets_left)
967 new_runlength=ntriplets_left;
969 /* We must at least try to get some small integers going. */
970 if (new_runlength==0)
973 new_small_index=small_index;
976 iter_runlength=new_runlength;
977 iter_small_index=new_small_index;
979 /* Iterate to find optimal encoding and runlength */
981 fprintf(stderr,"Entering iterative loop.\n");
986 new_runlength=iter_runlength;
987 new_small_index=iter_small_index;
990 fprintf(stderr,"Test new_small_index=%d Base=%d\n",new_small_index,magic[new_small_index]);
992 /* What is the largest runlength
993 we can do with the currently
994 selected encoding? Also the max supported runlength is 6 triplets! */
995 for (ienc=0; ienc<nencode && ienc<18; ienc++)
997 int test_index=Ptngc_find_magic_index(encode_ints[ienc]);
998 if (test_index>new_small_index)
1001 if (ienc/3>new_runlength)
1003 iter_runlength=ienc/3;
1005 fprintf(stderr,"I found a new possible runlength: %d\n",iter_runlength);
1009 /* How large encoding do we have to use? */
1010 largest_runlength_base=0;
1011 for (ienc=0; ienc<iter_runlength*3; ienc++)
1012 if (encode_ints[ienc]>largest_runlength_base)
1013 largest_runlength_base=encode_ints[ienc];
1014 largest_runlength_index=Ptngc_find_magic_index(largest_runlength_base);
1015 if (largest_runlength_index!=new_small_index)
1017 iter_small_index=largest_runlength_index;
1019 fprintf(stderr,"I found a new possible small index: %d Base=%d\n",iter_small_index,magic[iter_small_index]);
1022 } while ((new_runlength!=iter_runlength) ||
1023 (new_small_index!=iter_small_index));
1026 fprintf(stderr,"Exit iterative loop.\n");
1030 /* Verify that we got something good. We may have caught a
1031 substantially larger atom. If so we should just bail
1032 out and let the loop get on another lap. We may have a
1033 minimum runlength though and then we have to fulfill
1034 the request to write out these atoms! */
1036 if (new_runlength<3)
1037 rle_index_dep=IS_LARGE;
1038 else if (new_runlength<6)
1039 rle_index_dep=QUITE_LARGE;
1041 || ((new_small_index<small_index+IS_LARGE) && (new_small_index+rle_index_dep<max_large_index))
1043 || (new_small_index+IS_LARGE<max_large_index)
1048 if ((new_runlength!=runlength) || (new_small_index!=small_index))
1050 int change=new_small_index-small_index;
1052 if (new_small_index<=0)
1058 for (ixx=0; ixx<new_runlength; ixx++)
1063 double isum=0.; /* ints can be almost 32 bit so multiplication will overflow. So do doubles. */
1064 for (ixyz=0; ixyz<3; ixyz++)
1066 /* encode_ints is already positive (and multiplied by 2 versus the original, just as magic ints) */
1067 double id=encode_ints[ixx*3+ixyz];
1072 fprintf(stderr,"Tested decrease %d of index: %g>=%g?\n",change,isum,(double)magic[small_index+change]*(double)magic[small_index+change]);
1074 if (isum>(double)magic[small_index+change]*(double)magic[small_index+change])
1077 fprintf(stderr,"Rejected decrease %d of index due to length of vector: %g>=%g\n",change,isum,(double)magic[small_index+change]*(double)magic[small_index+change]);
1082 } while ((change<0) && (rejected));
1088 /* If the only thing to do is to change the base by
1089 only one -1 it is probably not worth it. */
1090 if (!((change==-1) && (runlength==new_runlength)))
1092 /* If we have a very short runlength we do not
1093 want to do large base changes. It costs 6
1094 extra bits to do -2. We gain 2/3
1095 bits per value to decrease the index by -2,
1096 ie 2 bits, so to any changes down we must
1097 have a runlength of 3 or more to do it for
1098 one molecule! If we have several molecules we
1099 will gain of course, so not be so strict. */
1100 if ((change==-2) && (new_runlength<3))
1102 if (runlength==new_runlength)
1107 fprintf(stderr,"Rejected change by -2 due to too short runlenght. Change set to %d\n",change);
1111 /* First adjust base using large base change instruction (if necessary) */
1112 while ((change>1) || (change<-1) || ((new_runlength==6) && (change)))
1114 unsigned int code=0U;
1115 int this_change=change;
1120 change-=this_change;
1122 fprintf(stderr,"Large base change: %d.\n",this_change);
1124 small_index+=this_change;
1128 this_change=-this_change;
1130 code|=(unsigned int)(this_change-1);
1131 write_instruction(coder,INSTR_LARGE_BASE_CHANGE,&output_ptr);
1132 Ptngc_writebits(coder,code,2,&output_ptr);
1134 /* If there is still base change or runlength changes to do, we do them now. */
1135 if ((new_runlength!=runlength) || (change))
1137 unsigned int ichange=(unsigned int)(change+1);
1138 unsigned int code=0U;
1139 unsigned int irun=(unsigned int)((new_runlength-1)*3);
1140 if (new_runlength==6)
1141 ichange=0; /* Means no change. The change has been taken care of explicitly by a large
1142 base change instruction above. */
1145 fprintf(stderr,"Small base change: %d Runlength change: %d\n",change,new_runlength);
1147 small_index+=change;
1148 write_instruction(coder,INSTR_BASE_RUNLENGTH,&output_ptr);
1149 Ptngc_writebits(coder,code,4,&output_ptr);
1150 runlength=new_runlength;
1155 fprintf(stderr,"Rejected base change due to only change==-1\n");
1158 fprintf(stderr,"Current small index: %d Base=%d\n",small_index,magic[small_index]);
1161 /* If we have a large previous integer we can combine it with a sequence of small ints. */
1164 /* If swapatoms is set to 1 but we did actually not
1165 do any swapping, we must first write out the
1166 large atom and then the small. If swapatoms is 1
1167 and we did swapping we can use the efficient
1169 if ((swapatoms) && (!didswap))
1172 fprintf(stderr,"Swapatoms was set to 1 but we did not do swapping!\n");
1173 fprintf(stderr,"Only one large integer.\n");
1175 /* Flush all large atoms. */
1176 flush_large(coder,&has_large,has_large_ints,has_large,large_index,large_nbits,compress_buffer,&output_ptr);
1178 fprintf(stderr,"Sequence of only small integers.\n");
1180 write_instruction(coder,INSTR_ONLY_SMALL,&output_ptr);
1186 fprintf(stderr,"Sequence of one large and small integers (good compression).\n");
1188 /* Flush all large atoms but one! */
1190 flush_large(coder,&has_large,has_large_ints,has_large-1,large_index,large_nbits,compress_buffer,&output_ptr);
1191 write_instruction(coder,INSTR_DEFAULT,&output_ptr);
1192 write_three_large(coder,has_large_ints,large_index,large_nbits,compress_buffer,&output_ptr);
1199 fprintf(stderr,"Sequence of only small integers.\n");
1201 write_instruction(coder,INSTR_ONLY_SMALL,&output_ptr);
1203 /* Base compress small integers using the current parameters. */
1204 nbits=magic_bits[small_index][runlength-1];
1205 /* The same base is used for the small changes. */
1206 small_idx[0]=small_index;
1207 small_idx[1]=small_index;
1208 small_idx[2]=small_index;
1209 trajcoder_base_compress(encode_ints,runlength*3,small_idx,compress_buffer);
1211 fprintf(stderr,"nbits=%d (%g)\n",nbits,nbits/(runlength*3.));
1213 nvalues_sum+=runlength*3;
1214 fprintf(stderr,"Runlength encoded small integers. runlength=%d\n",runlength);
1216 /* write out base compressed small integers */
1217 Ptngc_writemanybits(coder,compress_buffer,nbits,&output_ptr);
1219 for (ienc=0; ienc<runlength; ienc++)
1220 fprintf(stderr,"Small: %d %d %d\n",
1221 encode_ints[ienc*3],
1222 encode_ints[ienc*3+1],
1223 encode_ints[ienc*3+2]);
1225 /* Update prevcoord. */
1226 for (ienc=0; ienc<runlength; ienc++)
1229 fprintf(stderr,"Prevcoord in packing: %d %d %d\n",
1230 prevcoord[0],prevcoord[1],prevcoord[2]);
1232 prevcoord[0]+=unpositive_int(encode_ints[ienc*3]);
1233 prevcoord[1]+=unpositive_int(encode_ints[ienc*3+1]);
1234 prevcoord[2]+=unpositive_int(encode_ints[ienc*3+2]);
1237 fprintf(stderr,"Prevcoord in packing: %d %d %d\n",
1238 prevcoord[0],prevcoord[1],prevcoord[2]);
1241 input_ptr+=3*runlength;
1242 ntriplets_left-=runlength;
1247 fprintf(stderr,"Refused value: %d old is %d max is %d\n",new_small_index,small_index,max_large_index);
1254 fprintf(stderr,"Number of triplets left is %d\n",ntriplets_left);
1257 /* If we have large previous integers we must flush them now. */
1259 flush_large(coder,&has_large,has_large_ints,has_large,large_index,large_nbits,compress_buffer,&output_ptr);
1260 Ptngc_pack_flush(coder,&output_ptr);
1261 output_length=(int)(output_ptr-output);
1263 fprintf(stderr,"Done block: nbits=%d nvalues=%d (%g)\n",nbits_sum,nvalues_sum,(double)nbits_sum/nvalues_sum);
1265 *length=output_length;
1270 int Ptngc_unpack_array_xtc2(struct coder *coder,unsigned char *packed,int *output, int length)
1272 unsigned char *ptr=packed;
1278 int ntriplets_left=length/3;
1282 unsigned char compress_buffer[18*4]; /* Holds compressed result for 3 large ints or up to 18 small ints. */
1283 int encode_ints[21]; /* Up to 3 large + 18 small ints can be encoded at once */
1286 /* Read min integers. */
1287 minint[0]=unpositive_int(readbits(&ptr,&bitptr,32));
1288 minint[1]=unpositive_int(readbits(&ptr,&bitptr,32));
1289 minint[2]=unpositive_int(readbits(&ptr,&bitptr,32));
1290 /* Read large indices */
1291 large_index[0]=readbits(&ptr,&bitptr,8);
1292 large_index[1]=readbits(&ptr,&bitptr,8);
1293 large_index[2]=readbits(&ptr,&bitptr,8);
1294 /* Read small index */
1295 small_index=readbits(&ptr,&bitptr,8);
1297 large_nbits=compute_magic_bits(large_index);
1300 fprintf(stderr,"Minimum integers: %d %d %d\n",minint[0],minint[1],minint[2]);
1301 fprintf(stderr,"Large indices: %d %d %d\n",large_index[0],large_index[1],large_index[2]);
1302 fprintf(stderr,"Small index: %d\n",small_index);
1303 fprintf(stderr,"large_nbits=%d\n",large_nbits);
1306 /* Initial prevcoord is the minimum integers. */
1307 prevcoord[0]=minint[0];
1308 prevcoord[1]=minint[1];
1309 prevcoord[2]=minint[2];
1311 while (ntriplets_left)
1313 int instr=read_instruction(&ptr,&bitptr);
1315 if ((instr>=0) && (instr<MAXINSTR))
1316 fprintf(stderr,"Decoded instruction %s\n",instrnames[instr]);
1318 if ((instr==INSTR_DEFAULT) /* large+small */
1319 || (instr==INSTR_ONLY_LARGE) /* only large */
1320 || (instr==INSTR_ONLY_SMALL)) /* only small */
1322 int large_ints[3]={0,0,0};
1323 if (instr!=INSTR_ONLY_SMALL)
1325 /* Clear the compress buffer. */
1327 for (i=0; i<18*4; i++)
1328 compress_buffer[i]=0;
1329 /* Get the large value. */
1330 readmanybits(&ptr,&bitptr,large_nbits,compress_buffer);
1331 trajcoder_base_decompress(compress_buffer,3,large_index,encode_ints);
1332 large_ints[0]=encode_ints[0];
1333 large_ints[1]=encode_ints[1];
1334 large_ints[2]=encode_ints[2];
1336 fprintf(stderr,"large ints: %d %d %d\n",large_ints[0],large_ints[1],large_ints[2]);
1339 if (instr!=INSTR_ONLY_LARGE)
1343 /* The same base is used for the small changes. */
1344 small_idx[0]=small_index;
1345 small_idx[1]=small_index;
1346 small_idx[2]=small_index;
1347 /* Clear the compress buffer. */
1348 for (i=0; i<18*4; i++)
1349 compress_buffer[i]=0;
1350 /* Get the small values. */
1351 readmanybits(&ptr,&bitptr,magic_bits[small_index][runlength-1],compress_buffer);
1352 trajcoder_base_decompress(compress_buffer,3*runlength,small_idx,encode_ints);
1354 for (i=0; i<runlength; i++)
1355 fprintf(stderr,"small ints: %d %d %d\n",encode_ints[i*3+0],encode_ints[i*3+1],encode_ints[i*3+2]);
1358 if (instr==INSTR_DEFAULT)
1360 /* Check for swapped atoms */
1363 /* Unswap the atoms. */
1368 in[0]=large_ints[i];
1369 in[1]=unpositive_int(encode_ints[i]);
1370 in[2]=unpositive_int(encode_ints[3+i]);
1372 large_ints[i]=out[0];
1373 encode_ints[i]=positive_int(out[1]);
1374 encode_ints[3+i]=positive_int(out[2]);
1378 /* Output result. */
1379 if (instr!=INSTR_ONLY_SMALL)
1381 /* Output large value */
1382 *output++=large_ints[0]+minint[0];
1383 *output++=large_ints[1]+minint[1];
1384 *output++=large_ints[2]+minint[2];
1385 prevcoord[0]=large_ints[0];
1386 prevcoord[1]=large_ints[1];
1387 prevcoord[2]=large_ints[2];
1389 fprintf(stderr,"Prevcoord after unpacking of large: %d %d %d\n",
1390 prevcoord[0],prevcoord[1],prevcoord[2]);
1391 fprintf(stderr,"VALUE:%d %6d %6d %6d\n",
1392 length/3-ntriplets_left,
1393 prevcoord[0]+minint[0],
1394 prevcoord[1]+minint[1],
1395 prevcoord[2]+minint[2]);
1399 if (instr!=INSTR_ONLY_LARGE)
1401 /* Output small values */
1404 fprintf(stderr,"Prevcoord before unpacking of small: %d %d %d\n",
1405 prevcoord[0],prevcoord[1],prevcoord[2]);
1407 for (i=0; i<runlength; i++)
1410 v[0]=unpositive_int(encode_ints[i*3]);
1411 v[1]=unpositive_int(encode_ints[i*3+1]);
1412 v[2]=unpositive_int(encode_ints[i*3+2]);
1417 fprintf(stderr,"Prevcoord after unpacking of small: %d %d %d\n",
1418 prevcoord[0],prevcoord[1],prevcoord[2]);
1419 fprintf(stderr,"Unpacked small values: %6d %6d %6d\t\t%6d %6d %6d\n",v[0],v[1],v[2],prevcoord[0],prevcoord[1],prevcoord[2]);
1420 fprintf(stderr,"VALUE:%d %6d %6d %6d\n",
1421 length/3-(ntriplets_left-i),
1422 prevcoord[0]+minint[0],
1423 prevcoord[1]+minint[1],
1424 prevcoord[2]+minint[2]);
1426 *output++=prevcoord[0]+minint[0];
1427 *output++=prevcoord[1]+minint[1];
1428 *output++=prevcoord[2]+minint[2];
1430 ntriplets_left-=runlength;
1433 else if (instr==INSTR_LARGE_RLE)
1437 /* How many large atoms in this sequence? */
1438 int n=(int)readbits(&ptr,&bitptr,4)+3; /* 3-18 large atoms */
1441 /* Clear the compress buffer. */
1442 for (j=0; j<18*4; j++)
1443 compress_buffer[j]=0;
1444 /* Get the large value. */
1445 readmanybits(&ptr,&bitptr,large_nbits,compress_buffer);
1446 trajcoder_base_decompress(compress_buffer,3,large_index,encode_ints);
1447 large_ints[0]=encode_ints[0];
1448 large_ints[1]=encode_ints[1];
1449 large_ints[2]=encode_ints[2];
1450 /* Output large value */
1451 *output++=large_ints[0]+minint[0];
1452 *output++=large_ints[1]+minint[1];
1453 *output++=large_ints[2]+minint[2];
1454 prevcoord[0]=large_ints[0];
1455 prevcoord[1]=large_ints[1];
1456 prevcoord[2]=large_ints[2];
1460 else if (instr==INSTR_BASE_RUNLENGTH)
1462 unsigned int code=readbits(&ptr,&bitptr,4);
1475 small_index+=change;
1477 else if (instr==INSTR_FLIP)
1479 swapatoms=1-swapatoms;
1481 else if (instr==INSTR_LARGE_BASE_CHANGE)
1483 unsigned int ichange=readbits(&ptr,&bitptr,2);
1484 int change=(int)(ichange&0x1U)+1;
1487 small_index+=change;
1491 fprintf(stderr,"TRAJNG: BUG! Encoded unknown instruction.\n");
1495 fprintf(stderr,"Number of triplets left is %d\n",ntriplets_left);