You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
85 lines
2.1 KiB
85 lines
2.1 KiB
1 year ago
|
#include <test_common.h>
|
||
|
#include <igl/unique_rows.h>
|
||
|
#include <igl/matrix_to_list.h>
|
||
|
|
||
|
TEST_CASE("unique: matrix", "[igl]")
|
||
|
{
|
||
|
Eigen::VectorXi A(12);
|
||
|
A = (Eigen::VectorXd::Random(A.size(),1).array().abs()*9).cast<int>();
|
||
|
Eigen::VectorXi C,IA,IC;
|
||
|
igl::unique_rows(A,C,IA,IC);
|
||
|
std::vector<bool> inA(A.maxCoeff()+1,false);
|
||
|
for(int i = 0;i<A.size();i++)
|
||
|
{
|
||
|
inA[A(i)] = true;
|
||
|
REQUIRE (C(IC(i)) == A(i));
|
||
|
}
|
||
|
std::vector<bool> inC(inA.size(),false);
|
||
|
// Expect a column vector
|
||
|
REQUIRE (C.cols() == 1);
|
||
|
for(int i = 0;i<C.size();i++)
|
||
|
{
|
||
|
// Should be the first time finding this
|
||
|
REQUIRE (!inC[C(i)]);
|
||
|
// Mark as found
|
||
|
inC[C(i)] = true;
|
||
|
// Should be something also found in A
|
||
|
REQUIRE (inA[C(i)]);
|
||
|
REQUIRE (A(IA(i)) == C(i));
|
||
|
}
|
||
|
for(int i = 0;i<inC.size();i++)
|
||
|
{
|
||
|
REQUIRE (inA[i] == inC[i]);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
TEST_CASE("unique_rows: matrix", "[igl]")
|
||
|
{
|
||
|
Eigen::MatrixXi A(50,4);
|
||
|
A = (Eigen::MatrixXi::Random(A.rows(),A.cols()).array().abs()*9).cast<int>();
|
||
|
Eigen::MatrixXi C;
|
||
|
Eigen::VectorXi IA,IC;
|
||
|
igl::unique_rows(A,C,IA,IC);
|
||
|
REQUIRE (C.cols() == A.cols());
|
||
|
REQUIRE (IC.size() == A.rows());
|
||
|
REQUIRE (IA.size() == C.rows());
|
||
|
std::map<std::vector<int>,bool> inA;
|
||
|
for(int i = 0;i<A.rows();i++)
|
||
|
{
|
||
|
Eigen::RowVectorXi Ai = A.row(i);
|
||
|
std::vector<int> vAi;
|
||
|
igl::matrix_to_list(Ai,vAi);
|
||
|
inA[vAi] = true;
|
||
|
for(int j = 0;j<A.cols();j++)
|
||
|
{
|
||
|
REQUIRE (C(IC(i),j) == A(i,j));
|
||
|
}
|
||
|
}
|
||
|
std::map<std::vector<int>,bool> inC;
|
||
|
for(int i = 0;i<C.rows();i++)
|
||
|
{
|
||
|
Eigen::RowVectorXi Ci = C.row(i);
|
||
|
std::vector<int> vCi;
|
||
|
igl::matrix_to_list(Ci,vCi);
|
||
|
// Should be the first time finding this
|
||
|
REQUIRE (!inC[vCi]);
|
||
|
// Mark as found
|
||
|
inC[vCi] = true;
|
||
|
// Should be something also found in A
|
||
|
REQUIRE (inA[vCi]);
|
||
|
for(int j = 0;j<A.cols();j++)
|
||
|
{
|
||
|
REQUIRE (A(IA(i),j) == C(i,j));
|
||
|
}
|
||
|
}
|
||
|
REQUIRE (inA.size() == inC.size());
|
||
|
for(const auto pair : inA)
|
||
|
{
|
||
|
REQUIRE (inA[pair.first] == inC[pair.first]);
|
||
|
}
|
||
|
for(const auto pair : inC)
|
||
|
{
|
||
|
REQUIRE (inA[pair.first] == inC[pair.first]);
|
||
|
}
|
||
|
}
|