@@ -231,7 +231,7 @@ size_t add_abs_to_conc_2(size_t abs_ind, size_t num, size_t a1, size_t a2){
231
231
// int conc = concretize_2(abs_ind, a1, a2);
232
232
// return(two_abs(conc+num, a1, a2));
233
233
// }
234
- int conc = concretize_2 (abs_ind , a1 , a2 );
234
+ size_t conc = concretize_2 (abs_ind , a1 , a2 );
235
235
return two_abs (conc + num , a1 , a2 );
236
236
237
237
}
@@ -256,21 +256,96 @@ size_t sub_conc_from_abs_2(size_t abs_ind, size_t num, size_t a1, size_t a2){
256
256
// int conc = concretize_2(abs_ind, a1, a2);
257
257
// return(two_abs(conc-num, a1, a2));
258
258
// }
259
- int conc = concretize_2 (abs_ind , a1 , a2 );
259
+ size_t conc = concretize_2 (abs_ind , a1 , a2 );
260
260
assert (conc >= num );
261
261
return two_abs (conc - num , a1 , a2 );
262
262
}
263
263
264
- // Three indices: *c*c*c. Not used currently.
265
- int three_abs (int index , int a1 , int a2 , int a3 ) {
264
+ // helper function
265
+ // translate an index from *c*c*c* to the real one depending on value of a1, a2, a3
266
+ // e.g. when a1=0, a1+1==a2, *c*c*c* becomes cc*c*
267
+ // index 4 in *c*c*c* will be translated into 2 by this function
268
+ size_t raw_to_real_3 (size_t raw_index , size_t a1 , size_t a2 , size_t a3 )
269
+ {
270
+ return raw_index - (raw_index >= 1 && a1 == 0 ) -
271
+ (raw_index >= 3 && a1 + 1 == a2 ) - (raw_index >= 5 && a2 + 1 == a3 );
272
+ }
273
+
274
+ // helper function, the reversed version of raw_to_real
275
+ // *c*c*c*
276
+ // c1: 1-(a1==0)
277
+ // c2: 3-(a1==0)-(a1+1==a2)
278
+ // c3: 5-(a1==0)-(a1+1==a2)-(a2+1==a3)
279
+ size_t real_to_raw_3 (size_t real_index , size_t a1 , size_t a2 , size_t a3 )
280
+ {
281
+ if (real_index < 1 - (a1 == 0 ))
282
+ return 0 ;
283
+ else if (real_index == 1 - (a1 == 0 ))
284
+ return 1 ;
285
+ else if (real_index < 3 - (a1 == 0 )- (a1 + 1 == a2 ))
286
+ return 2 ;
287
+ else if (real_index == 3 - (a1 == 0 )- (a1 + 1 == a2 ))
288
+ return 3 ;
289
+ else if (real_index < 5 - (a1 == 0 )- (a1 + 1 == a2 )- (a2 + 1 == a3 ))
290
+ return 4 ;
291
+ else if (real_index == 5 - (a1 == 0 )- (a1 + 1 == a2 )- (a2 + 1 == a3 ))
292
+ return 5 ;
293
+ else
294
+ return 6 ;
295
+ }
296
+
297
+ // Three indices: *c*c*c*
298
+ // *1: exist if a1>0
299
+ // *2: exist if a1+1!=a2
300
+ // *3: exist if a2+1!=a3
301
+ size_t three_abs (size_t index , size_t a1 , size_t a2 , size_t a3 ) {
302
+ size_t raw_index = 0 ;
303
+ if (index < a1 ) raw_index = 0 ;
304
+ else if (index == a1 ) raw_index = 1 ;
305
+ else if (index > a1 && index < a2 ) raw_index = 2 ;
306
+ else if (index == a2 ) raw_index = 3 ;
307
+ else if (index > a2 && index < a3 ) raw_index = 4 ;
308
+ else if (index == a3 ) raw_index = 5 ;
309
+ else raw_index = 6 ;
310
+ return raw_to_real_3 (raw_index , a1 , a2 , a3 );
311
+ }
312
+
313
+ // Three indices: *c*c*c*
314
+ // Return the concrete index corresponding to abs_ind
315
+ size_t concretize_3 (size_t abs_ind , size_t a1 , size_t a2 , size_t a3 )
316
+ {
317
+ size_t raw_index = real_to_raw_3 (abs_ind , a1 , a2 , a3 );
318
+ if (raw_index == 0 )
319
+ return nndt_under (a1 );
320
+ else if (raw_index == 1 )
321
+ return a1 ;
322
+ else if (raw_index == 2 )
323
+ return nndt_between (a1 , a2 );
324
+ else if (raw_index == 3 )
325
+ return a2 ;
326
+ else if (raw_index == 4 )
327
+ return nndt_between (a2 , a3 );
328
+ else if (raw_index == 5 )
329
+ return a3 ;
330
+ else
331
+ return nndt_above (a3 );
332
+ }
266
333
267
- if (index < a1 ) return 0 ;
268
- else if (index == a1 ) return 1 ;
269
- else if (index > a1 && index < a2 ) return 2 ;
270
- else if (index == a2 ) return 3 ;
271
- else if (index > a2 && index < a3 ) return 4 ;
272
- else if (index == a3 ) return 5 ;
273
- else return 6 ;
334
+ int is_precise_3 (size_t abs_ind , size_t a1 , size_t a2 , size_t a3 ){
335
+ size_t raw_ind = real_to_raw_3 (abs_ind , a1 , a2 , a3 );
336
+ return (raw_ind == 1 ) || (raw_ind == 3 ) || (raw_ind == 5 );
337
+ }
338
+
339
+ // Add a number to an abs_ind
340
+ size_t add_abs_to_conc_3 (size_t abs_ind , size_t num , size_t a1 , size_t a2 , size_t a3 ){
341
+ size_t conc = concretize_3 (abs_ind , a1 , a2 , a3 );
342
+ return three_abs (conc + num , a1 , a2 , a3 );
343
+ }
344
+
345
+ size_t sub_conc_from_abs_3 (size_t abs_ind , size_t num , size_t a1 , size_t a2 , size_t a3 ){
346
+ size_t conc = concretize_3 (abs_ind , a1 , a2 , a3 );
347
+ assert (conc >= num );
348
+ return three_abs (conc - num , a1 , a2 , a3 );
274
349
}
275
350
276
351
//Get the abstraction of an index for shape *cc*cc*.
0 commit comments