@@ -153,24 +153,18 @@ enum class Action : uint32_t {
153
153
};
154
154
155
155
// / This enum defines all the sparse representations supportable by
156
- // / the SparseTensor dialect. We use a lightweight encoding to encode
157
- // / both the "format" per se (dense, compressed, singleton) as well as
158
- // / the "properties" (ordered, unique). The encoding is chosen for
159
- // / performance of the runtime library, and thus may change in future
160
- // / versions; consequently, client code should use the predicate functions
161
- // / defined below, rather than relying on knowledge about the particular
162
- // / binary encoding.
156
+ // / the SparseTensor dialect. We use a lightweight encoding to encode
157
+ // / both the "format" per se (dense, compressed, singleton, loose_compressed,
158
+ // / two-out-of-four) as well as the "properties" (ordered, unique). The
159
+ // / encoding is chosen for performance of the runtime library, and thus may
160
+ // / change in future versions; consequently, client code should use the
161
+ // / predicate functions defined below, rather than relying on knowledge
162
+ // / about the particular binary encoding.
163
163
// /
164
164
// / The `Undef` "format" is a special value used internally for cases
165
165
// / where we need to store an undefined or indeterminate `DimLevelType`.
166
166
// / It should not be used externally, since it does not indicate an
167
167
// / actual/representable format.
168
- // /
169
- // TODO: We should generalize TwoOutOfFour to N out of M and use property to
170
- // encode the value of N and M.
171
- // TODO: Update DimLevelType to use lower 8 bits for storage formats and the
172
- // higher 4 bits to store level properties. Consider LooseCompressed and
173
- // TwoOutOfFour as properties instead of formats.
174
168
enum class DimLevelType : uint8_t {
175
169
Undef = 0 , // 0b00000_00
176
170
Dense = 4 , // 0b00001_00
@@ -257,44 +251,47 @@ constexpr bool isUndefDLT(DimLevelType dlt) {
257
251
return dlt == DimLevelType::Undef;
258
252
}
259
253
260
- // / Check if the `DimLevelType` is dense.
254
+ // / Check if the `DimLevelType` is dense (regardless of properties) .
261
255
constexpr bool isDenseDLT (DimLevelType dlt) {
262
- return dlt == DimLevelType::Dense;
263
- }
264
-
265
- // / Check if the `DimLevelType` is 2:4
266
- constexpr bool isTwoOutOfFourDLT (DimLevelType dlt) {
267
- return dlt == DimLevelType::TwoOutOfFour;
256
+ return (static_cast <uint8_t >(dlt) & ~3 ) ==
257
+ static_cast <uint8_t >(DimLevelType::Dense);
268
258
}
269
259
270
- // We use the idiom `(dlt & ~3) == format` in order to only return true
271
- // for valid DLTs. Whereas the `dlt & format` idiom is a bit faster but
272
- // can return false-positives on invalid DLTs.
273
-
274
260
// / Check if the `DimLevelType` is compressed (regardless of properties).
275
261
constexpr bool isCompressedDLT (DimLevelType dlt) {
276
262
return (static_cast <uint8_t >(dlt) & ~3 ) ==
277
263
static_cast <uint8_t >(DimLevelType::Compressed);
278
264
}
279
265
280
- // / Check if the `DimLevelType` is loose compressed (regardless of properties).
281
- constexpr bool isLooseCompressedDLT (DimLevelType dlt) {
282
- return (static_cast <uint8_t >(dlt) & ~3 ) ==
283
- static_cast <uint8_t >(DimLevelType::LooseCompressed);
284
- }
285
-
286
266
// / Check if the `DimLevelType` is singleton (regardless of properties).
287
267
constexpr bool isSingletonDLT (DimLevelType dlt) {
288
268
return (static_cast <uint8_t >(dlt) & ~3 ) ==
289
269
static_cast <uint8_t >(DimLevelType::Singleton);
290
270
}
291
271
272
+ // / Check if the `DimLevelType` is loose compressed (regardless of properties).
273
+ constexpr bool isLooseCompressedDLT (DimLevelType dlt) {
274
+ return (static_cast <uint8_t >(dlt) & ~3 ) ==
275
+ static_cast <uint8_t >(DimLevelType::LooseCompressed);
276
+ }
277
+
292
278
// / Check if the `DimLevelType` is 2OutOf4 (regardless of properties).
293
279
constexpr bool is2OutOf4DLT (DimLevelType dlt) {
294
280
return (static_cast <uint8_t >(dlt) & ~3 ) ==
295
281
static_cast <uint8_t >(DimLevelType::TwoOutOfFour);
296
282
}
297
283
284
+ // / Check if the `DimLevelType` needs positions array.
285
+ constexpr bool isDLTWithPos (DimLevelType dlt) {
286
+ return isCompressedDLT (dlt) || isLooseCompressedDLT (dlt);
287
+ }
288
+
289
+ // / Check if the `DimLevelType` needs coordinates array.
290
+ constexpr bool isDLTWithCrd (DimLevelType dlt) {
291
+ return isCompressedDLT (dlt) || isSingletonDLT (dlt) ||
292
+ isLooseCompressedDLT (dlt) || is2OutOf4DLT (dlt);
293
+ }
294
+
298
295
// / Check if the `DimLevelType` is ordered (regardless of storage format).
299
296
constexpr bool isOrderedDLT (DimLevelType dlt) {
300
297
return !(static_cast <uint8_t >(dlt) & 2 );
@@ -325,7 +322,10 @@ buildLevelType(LevelFormat lf, bool ordered, bool unique) {
325
322
return isValidDLT (dlt) ? std::optional (dlt) : std::nullopt;
326
323
}
327
324
328
- // / Ensure the above conversion works as intended.
325
+ //
326
+ // Ensure the above methods work as indended.
327
+ //
328
+
329
329
static_assert (
330
330
(getLevelFormat(DimLevelType::Undef) == std::nullopt &&
331
331
*getLevelFormat (DimLevelType::Dense) == LevelFormat::Dense &&
@@ -336,19 +336,23 @@ static_assert(
336
336
*getLevelFormat(DimLevelType::Singleton) == LevelFormat::Singleton &&
337
337
*getLevelFormat(DimLevelType::SingletonNu) == LevelFormat::Singleton &&
338
338
*getLevelFormat(DimLevelType::SingletonNo) == LevelFormat::Singleton &&
339
- *getLevelFormat(DimLevelType::SingletonNuNo) == LevelFormat::Singleton),
339
+ *getLevelFormat(DimLevelType::SingletonNuNo) == LevelFormat::Singleton &&
340
+ *getLevelFormat(DimLevelType::LooseCompressed) ==
341
+ LevelFormat::LooseCompressed &&
342
+ *getLevelFormat(DimLevelType::LooseCompressedNu) ==
343
+ LevelFormat::LooseCompressed &&
344
+ *getLevelFormat(DimLevelType::LooseCompressedNo) ==
345
+ LevelFormat::LooseCompressed &&
346
+ *getLevelFormat(DimLevelType::LooseCompressedNuNo) ==
347
+ LevelFormat::LooseCompressed &&
348
+ *getLevelFormat(DimLevelType::TwoOutOfFour) == LevelFormat::TwoOutOfFour),
340
349
"getLevelFormat conversion is broken");
341
350
342
351
static_assert (
343
352
(buildLevelType(LevelFormat::Dense, false , true ) == std::nullopt &&
344
353
buildLevelType (LevelFormat::Dense, true , false ) == std::nullopt &&
345
354
buildLevelType (LevelFormat::Dense, false , false ) == std::nullopt &&
346
355
*buildLevelType (LevelFormat::Dense, true , true ) == DimLevelType::Dense &&
347
- buildLevelType(LevelFormat::TwoOutOfFour, false , true ) == std::nullopt &&
348
- buildLevelType(LevelFormat::TwoOutOfFour, true , false ) == std::nullopt &&
349
- buildLevelType(LevelFormat::TwoOutOfFour, false , false ) == std::nullopt &&
350
- *buildLevelType(LevelFormat::TwoOutOfFour, true , true ) ==
351
- DimLevelType::TwoOutOfFour &&
352
356
*buildLevelType(LevelFormat::Compressed, true , true ) ==
353
357
DimLevelType::Compressed &&
354
358
*buildLevelType(LevelFormat::Compressed, true , false ) ==
@@ -364,10 +368,22 @@ static_assert(
364
368
*buildLevelType(LevelFormat::Singleton, false , true ) ==
365
369
DimLevelType::SingletonNo &&
366
370
*buildLevelType(LevelFormat::Singleton, false , false ) ==
367
- DimLevelType::SingletonNuNo),
371
+ DimLevelType::SingletonNuNo &&
372
+ *buildLevelType(LevelFormat::LooseCompressed, true , true ) ==
373
+ DimLevelType::LooseCompressed &&
374
+ *buildLevelType(LevelFormat::LooseCompressed, true , false ) ==
375
+ DimLevelType::LooseCompressedNu &&
376
+ *buildLevelType(LevelFormat::LooseCompressed, false , true ) ==
377
+ DimLevelType::LooseCompressedNo &&
378
+ *buildLevelType(LevelFormat::LooseCompressed, false , false ) ==
379
+ DimLevelType::LooseCompressedNuNo &&
380
+ buildLevelType(LevelFormat::TwoOutOfFour, false , true ) == std::nullopt &&
381
+ buildLevelType(LevelFormat::TwoOutOfFour, true , false ) == std::nullopt &&
382
+ buildLevelType(LevelFormat::TwoOutOfFour, false , false ) == std::nullopt &&
383
+ *buildLevelType(LevelFormat::TwoOutOfFour, true , true ) ==
384
+ DimLevelType::TwoOutOfFour),
368
385
"buildLevelType conversion is broken");
369
386
370
- // Ensure the above predicates work as intended.
371
387
static_assert ((isValidDLT(DimLevelType::Undef) &&
372
388
isValidDLT (DimLevelType::Dense) &&
373
389
isValidDLT (DimLevelType::Compressed) &&
@@ -385,6 +401,22 @@ static_assert((isValidDLT(DimLevelType::Undef) &&
385
401
isValidDLT (DimLevelType::TwoOutOfFour)),
386
402
" isValidDLT definition is broken" );
387
403
404
+ static_assert ((isDenseDLT(DimLevelType::Dense) &&
405
+ !isDenseDLT(DimLevelType::Compressed) &&
406
+ !isDenseDLT(DimLevelType::CompressedNu) &&
407
+ !isDenseDLT(DimLevelType::CompressedNo) &&
408
+ !isDenseDLT(DimLevelType::CompressedNuNo) &&
409
+ !isDenseDLT(DimLevelType::Singleton) &&
410
+ !isDenseDLT(DimLevelType::SingletonNu) &&
411
+ !isDenseDLT(DimLevelType::SingletonNo) &&
412
+ !isDenseDLT(DimLevelType::SingletonNuNo) &&
413
+ !isDenseDLT(DimLevelType::LooseCompressed) &&
414
+ !isDenseDLT(DimLevelType::LooseCompressedNu) &&
415
+ !isDenseDLT(DimLevelType::LooseCompressedNo) &&
416
+ !isDenseDLT(DimLevelType::LooseCompressedNuNo) &&
417
+ !isDenseDLT(DimLevelType::TwoOutOfFour)),
418
+ " isDenseDLT definition is broken" );
419
+
388
420
static_assert ((!isCompressedDLT(DimLevelType::Dense) &&
389
421
isCompressedDLT (DimLevelType::Compressed) &&
390
422
isCompressedDLT (DimLevelType::CompressedNu) &&
@@ -393,20 +425,14 @@ static_assert((!isCompressedDLT(DimLevelType::Dense) &&
393
425
!isCompressedDLT(DimLevelType::Singleton) &&
394
426
!isCompressedDLT(DimLevelType::SingletonNu) &&
395
427
!isCompressedDLT(DimLevelType::SingletonNo) &&
396
- !isCompressedDLT(DimLevelType::SingletonNuNo)),
428
+ !isCompressedDLT(DimLevelType::SingletonNuNo) &&
429
+ !isCompressedDLT(DimLevelType::LooseCompressed) &&
430
+ !isCompressedDLT(DimLevelType::LooseCompressedNu) &&
431
+ !isCompressedDLT(DimLevelType::LooseCompressedNo) &&
432
+ !isCompressedDLT(DimLevelType::LooseCompressedNuNo) &&
433
+ !isCompressedDLT(DimLevelType::TwoOutOfFour)),
397
434
" isCompressedDLT definition is broken" );
398
435
399
- static_assert ((!isLooseCompressedDLT(DimLevelType::Dense) &&
400
- isLooseCompressedDLT (DimLevelType::LooseCompressed) &&
401
- isLooseCompressedDLT (DimLevelType::LooseCompressedNu) &&
402
- isLooseCompressedDLT (DimLevelType::LooseCompressedNo) &&
403
- isLooseCompressedDLT (DimLevelType::LooseCompressedNuNo) &&
404
- !isLooseCompressedDLT(DimLevelType::Singleton) &&
405
- !isLooseCompressedDLT(DimLevelType::SingletonNu) &&
406
- !isLooseCompressedDLT(DimLevelType::SingletonNo) &&
407
- !isLooseCompressedDLT(DimLevelType::SingletonNuNo)),
408
- " isLooseCompressedDLT definition is broken" );
409
-
410
436
static_assert ((!isSingletonDLT(DimLevelType::Dense) &&
411
437
!isSingletonDLT(DimLevelType::Compressed) &&
412
438
!isSingletonDLT(DimLevelType::CompressedNu) &&
@@ -415,11 +441,47 @@ static_assert((!isSingletonDLT(DimLevelType::Dense) &&
415
441
isSingletonDLT (DimLevelType::Singleton) &&
416
442
isSingletonDLT (DimLevelType::SingletonNu) &&
417
443
isSingletonDLT (DimLevelType::SingletonNo) &&
418
- isSingletonDLT (DimLevelType::SingletonNuNo)),
444
+ isSingletonDLT (DimLevelType::SingletonNuNo) &&
445
+ !isSingletonDLT(DimLevelType::LooseCompressed) &&
446
+ !isSingletonDLT(DimLevelType::LooseCompressedNu) &&
447
+ !isSingletonDLT(DimLevelType::LooseCompressedNo) &&
448
+ !isSingletonDLT(DimLevelType::LooseCompressedNuNo) &&
449
+ !isSingletonDLT(DimLevelType::TwoOutOfFour)),
419
450
" isSingletonDLT definition is broken" );
420
451
452
+ static_assert ((!isLooseCompressedDLT(DimLevelType::Dense) &&
453
+ !isLooseCompressedDLT(DimLevelType::Compressed) &&
454
+ !isLooseCompressedDLT(DimLevelType::CompressedNu) &&
455
+ !isLooseCompressedDLT(DimLevelType::CompressedNo) &&
456
+ !isLooseCompressedDLT(DimLevelType::CompressedNuNo) &&
457
+ !isLooseCompressedDLT(DimLevelType::Singleton) &&
458
+ !isLooseCompressedDLT(DimLevelType::SingletonNu) &&
459
+ !isLooseCompressedDLT(DimLevelType::SingletonNo) &&
460
+ !isLooseCompressedDLT(DimLevelType::SingletonNuNo) &&
461
+ isLooseCompressedDLT (DimLevelType::LooseCompressed) &&
462
+ isLooseCompressedDLT (DimLevelType::LooseCompressedNu) &&
463
+ isLooseCompressedDLT (DimLevelType::LooseCompressedNo) &&
464
+ isLooseCompressedDLT (DimLevelType::LooseCompressedNuNo) &&
465
+ !isLooseCompressedDLT(DimLevelType::TwoOutOfFour)),
466
+ " isLooseCompressedDLT definition is broken" );
467
+
468
+ static_assert ((!is2OutOf4DLT(DimLevelType::Dense) &&
469
+ !is2OutOf4DLT(DimLevelType::Compressed) &&
470
+ !is2OutOf4DLT(DimLevelType::CompressedNu) &&
471
+ !is2OutOf4DLT(DimLevelType::CompressedNo) &&
472
+ !is2OutOf4DLT(DimLevelType::CompressedNuNo) &&
473
+ !is2OutOf4DLT(DimLevelType::Singleton) &&
474
+ !is2OutOf4DLT(DimLevelType::SingletonNu) &&
475
+ !is2OutOf4DLT(DimLevelType::SingletonNo) &&
476
+ !is2OutOf4DLT(DimLevelType::SingletonNuNo) &&
477
+ !is2OutOf4DLT(DimLevelType::LooseCompressed) &&
478
+ !is2OutOf4DLT(DimLevelType::LooseCompressedNu) &&
479
+ !is2OutOf4DLT(DimLevelType::LooseCompressedNo) &&
480
+ !is2OutOf4DLT(DimLevelType::LooseCompressedNuNo) &&
481
+ is2OutOf4DLT (DimLevelType::TwoOutOfFour)),
482
+ " is2OutOf4DLT definition is broken" );
483
+
421
484
static_assert ((isOrderedDLT(DimLevelType::Dense) &&
422
- isOrderedDLT (DimLevelType::TwoOutOfFour) &&
423
485
isOrderedDLT (DimLevelType::Compressed) &&
424
486
isOrderedDLT (DimLevelType::CompressedNu) &&
425
487
!isOrderedDLT(DimLevelType::CompressedNo) &&
@@ -431,11 +493,11 @@ static_assert((isOrderedDLT(DimLevelType::Dense) &&
431
493
isOrderedDLT (DimLevelType::LooseCompressed) &&
432
494
isOrderedDLT (DimLevelType::LooseCompressedNu) &&
433
495
!isOrderedDLT(DimLevelType::LooseCompressedNo) &&
434
- !isOrderedDLT(DimLevelType::LooseCompressedNuNo)),
496
+ !isOrderedDLT(DimLevelType::LooseCompressedNuNo) &&
497
+ isOrderedDLT (DimLevelType::TwoOutOfFour)),
435
498
" isOrderedDLT definition is broken" );
436
499
437
500
static_assert ((isUniqueDLT(DimLevelType::Dense) &&
438
- isUniqueDLT (DimLevelType::TwoOutOfFour) &&
439
501
isUniqueDLT (DimLevelType::Compressed) &&
440
502
!isUniqueDLT(DimLevelType::CompressedNu) &&
441
503
isUniqueDLT (DimLevelType::CompressedNo) &&
@@ -447,7 +509,8 @@ static_assert((isUniqueDLT(DimLevelType::Dense) &&
447
509
isUniqueDLT (DimLevelType::LooseCompressed) &&
448
510
!isUniqueDLT(DimLevelType::LooseCompressedNu) &&
449
511
isUniqueDLT (DimLevelType::LooseCompressedNo) &&
450
- !isUniqueDLT(DimLevelType::LooseCompressedNuNo)),
512
+ !isUniqueDLT(DimLevelType::LooseCompressedNuNo) &&
513
+ isUniqueDLT (DimLevelType::TwoOutOfFour)),
451
514
" isUniqueDLT definition is broken" );
452
515
453
516
// / Bit manipulations for affine encoding.
0 commit comments