@@ -608,3 +608,97 @@ TEST(IntegerRelationTest, convertVarKindToLocal) {
608608 EXPECT_EQ (space.getId (VarKind::Symbol, 0 ), Identifier (&identifiers[3 ]));
609609 EXPECT_EQ (space.getId (VarKind::Symbol, 1 ), Identifier (&identifiers[4 ]));
610610}
611+
612+ TEST (IntegerRelationTest, rangeProduct) {
613+ IntegerRelation r1 = parseRelationFromSet (
614+ " (i, j, k) : (2*i + 3*k == 0, i >= 0, j >= 0, k >= 0)" , 2 );
615+ IntegerRelation r2 = parseRelationFromSet (
616+ " (i, j, l) : (4*i + 6*j + 9*l == 0, i >= 0, j >= 0, l >= 0)" , 2 );
617+
618+ IntegerRelation rangeProd = r1.rangeProduct (r2);
619+ IntegerRelation expected =
620+ parseRelationFromSet (" (i, j, k, l) : (2*i + 3*k == 0, 4*i + 6*j + 9*l == "
621+ " 0, i >= 0, j >= 0, k >= 0, l >= 0)" ,
622+ 2 );
623+
624+ EXPECT_TRUE (expected.isEqual (rangeProd));
625+ }
626+
627+ TEST (IntegerRelationTest, rangeProductMultdimRange) {
628+ IntegerRelation r1 =
629+ parseRelationFromSet (" (i, k) : (2*i + 3*k == 0, i >= 0, k >= 0)" , 1 );
630+ IntegerRelation r2 = parseRelationFromSet (
631+ " (i, l, m) : (4*i + 6*m + 9*l == 0, i >= 0, l >= 0, m >= 0)" , 1 );
632+
633+ IntegerRelation rangeProd = r1.rangeProduct (r2);
634+ IntegerRelation expected =
635+ parseRelationFromSet (" (i, k, l, m) : (2*i + 3*k == 0, 4*i + 6*m + 9*l == "
636+ " 0, i >= 0, k >= 0, l >= 0, m >= 0)" ,
637+ 1 );
638+
639+ EXPECT_TRUE (expected.isEqual (rangeProd));
640+ }
641+
642+ TEST (IntegerRelationTest, rangeProductMultdimRangeSwapped) {
643+ IntegerRelation r1 = parseRelationFromSet (
644+ " (i, l, m) : (4*i + 6*m + 9*l == 0, i >= 0, l >= 0, m >= 0)" , 1 );
645+ IntegerRelation r2 =
646+ parseRelationFromSet (" (i, k) : (2*i + 3*k == 0, i >= 0, k >= 0)" , 1 );
647+
648+ IntegerRelation rangeProd = r1.rangeProduct (r2);
649+ IntegerRelation expected =
650+ parseRelationFromSet (" (i, l, m, k) : (2*i + 3*k == 0, 4*i + 6*m + 9*l == "
651+ " 0, i >= 0, k >= 0, l >= 0, m >= 0)" ,
652+ 1 );
653+
654+ EXPECT_TRUE (expected.isEqual (rangeProd));
655+ }
656+
657+ TEST (IntegerRelationTest, rangeProductEmptyDomain) {
658+ IntegerRelation r1 =
659+ parseRelationFromSet (" (i, j) : (4*i + 9*j == 0, i >= 0, j >= 0)" , 0 );
660+ IntegerRelation r2 =
661+ parseRelationFromSet (" (k, l) : (2*k + 3*l == 0, k >= 0, l >= 0)" , 0 );
662+ IntegerRelation rangeProd = r1.rangeProduct (r2);
663+ IntegerRelation expected =
664+ parseRelationFromSet (" (i, j, k, l) : (2*k + 3*l == 0, 4*i + 9*j == "
665+ " 0, i >= 0, j >= 0, k >= 0, l >= 0)" ,
666+ 0 );
667+ EXPECT_TRUE (expected.isEqual (rangeProd));
668+ }
669+
670+ TEST (IntegerRelationTest, rangeProductEmptyRange) {
671+ IntegerRelation r1 =
672+ parseRelationFromSet (" (i, j) : (4*i + 9*j == 0, i >= 0, j >= 0)" , 2 );
673+ IntegerRelation r2 =
674+ parseRelationFromSet (" (i, j) : (2*i + 3*j == 0, i >= 0, j >= 0)" , 2 );
675+ IntegerRelation rangeProd = r1.rangeProduct (r2);
676+ IntegerRelation expected =
677+ parseRelationFromSet (" (i, j) : (2*i + 3*j == 0, 4*i + 9*j == "
678+ " 0, i >= 0, j >= 0)" ,
679+ 2 );
680+ EXPECT_TRUE (expected.isEqual (rangeProd));
681+ }
682+
683+ TEST (IntegerRelationTest, rangeProductEmptyDomainAndRange) {
684+ IntegerRelation r1 = parseRelationFromSet (" () : ()" , 0 );
685+ IntegerRelation r2 = parseRelationFromSet (" () : ()" , 0 );
686+ IntegerRelation rangeProd = r1.rangeProduct (r2);
687+ IntegerRelation expected = parseRelationFromSet (" () : ()" , 0 );
688+ EXPECT_TRUE (expected.isEqual (rangeProd));
689+ }
690+
691+ TEST (IntegerRelationTest, rangeProductSymbols) {
692+ IntegerRelation r1 = parseRelationFromSet (
693+ " (i, j)[s] : (2*i + 3*j + s == 0, i >= 0, j >= 0)" , 1 );
694+ IntegerRelation r2 = parseRelationFromSet (
695+ " (i, l)[s] : (3*i + 4*l + s == 0, i >= 0, l >= 0)" , 1 );
696+
697+ IntegerRelation rangeProd = r1.rangeProduct (r2);
698+ IntegerRelation expected = parseRelationFromSet (
699+ " (i, j, l)[s] : (2*i + 3*j + s == 0, 3*i + 4*l + s == "
700+ " 0, i >= 0, j >= 0, l >= 0)" ,
701+ 1 );
702+
703+ EXPECT_TRUE (expected.isEqual (rangeProd));
704+ }
0 commit comments