项目文件夹

文件
Quan (Andy) Gan a9dabcc769 [Feature] Random Walk for 0.5 (#1209)
* trying to refactor IndexSelect

* partial implementation

* add index select and assign for floats as well

* move to random choice source

* more updates

* fixes

* fixes

* more fixes

* adding python impl

* fixes

* unit test

* lint

* lint x2

* lint x3

* update metapath2vec

* debugging performance

* still debugging for performance

* tuning

* switching to succvec

* redo

* revert non-uniform sampler to use vector

* still not fast

* why does this crash with OpenMP???

* because there was a data race!!!

* add documentations and remove assign op

* lint

* lint x2

* lol what have i done

* lint x3

* fix and disable gpu testing

* bugfix

* generic random walk

* reorg the random walk source code

* Update randomwalks.h

* Update randomwalks_cpu.cc

* rename file

* move internal function to anonymous ns

* reorg & docstrings

* constant restart probability

* docstring fix

* more commit

* random walk with restart, tested

* some fixes

* switch to using NDArray for choice

* massive fix & docstring

* lint x?

* lint x??

* fix

* export symbols

* skip gpu test

* addresses comments

* replaces another VecToIdArray

* add randomwalks.h to include

* replace void * with template
2020-01-31 19:52:08 +08:00

175 行
4.6 KiB
C++

#include <gtest/gtest.h>
#include <dgl/array.h>
#include "./common.h"
using namespace dgl;
using namespace dgl::runtime;
TEST(ArrayTest, TestCreate) {
IdArray a = aten::NewIdArray(100, CTX, 32);
ASSERT_EQ(a->dtype.bits, 32);
ASSERT_EQ(a->shape[0], 100);
a = aten::NewIdArray(0);
ASSERT_EQ(a->shape[0], 0);
std::vector<int64_t> vec = {2, 94, 232, 30};
a = aten::VecToIdArray(vec, 32);
ASSERT_EQ(Len(a), vec.size());
ASSERT_EQ(a->dtype.bits, 32);
for (int i = 0; i < Len(a); ++i) {
ASSERT_EQ(Ptr<int32_t>(a)[i], vec[i]);
}
a = aten::VecToIdArray(std::vector<int32_t>());
ASSERT_EQ(Len(a), 0);
};
TEST(ArrayTest, TestRange) {
IdArray a = aten::Range(10, 10, 64, CTX);
ASSERT_EQ(Len(a), 0);
a = aten::Range(10, 20, 32, CTX);
ASSERT_EQ(Len(a), 10);
ASSERT_EQ(a->dtype.bits, 32);
for (int i = 0; i < 10; ++i)
ASSERT_EQ(Ptr<int32_t>(a)[i], i + 10);
};
TEST(ArrayTest, TestFull) {
IdArray a = aten::Full(-100, 0, 32, CTX);
ASSERT_EQ(Len(a), 0);
a = aten::Full(-100, 13, 64, CTX);
ASSERT_EQ(Len(a), 13);
ASSERT_EQ(a->dtype.bits, 64);
for (int i = 0; i < 13; ++i)
ASSERT_EQ(Ptr<int64_t>(a)[i], -100);
};
TEST(ArrayTest, TestClone) {
IdArray a = aten::NewIdArray(0);
IdArray b = aten::Clone(a);
ASSERT_EQ(Len(b), 0);
a = aten::Range(0, 10, 32, CTX);
b = aten::Clone(a);
for (int i = 0; i < 10; ++i) {
ASSERT_EQ(PI32(b)[i], i);
}
PI32(b)[0] = -1;
for (int i = 0; i < 10; ++i) {
ASSERT_EQ(PI32(a)[i], i);
}
};
TEST(ArrayTest, TestAsNumBits) {
IdArray a = aten::Range(0, 10, 32, CTX);
a = aten::AsNumBits(a, 64);
ASSERT_EQ(a->dtype.bits, 64);
for (int i = 0; i < 10; ++i)
ASSERT_EQ(PI64(a)[i], i);
};
template <typename IDX>
void _TestArith() {
const int N = 100;
IdArray a = aten::Full(-10, N, sizeof(IDX)*8, CTX);
IdArray b = aten::Full(7, N, sizeof(IDX)*8, CTX);
IdArray c = aten::Add(a, b);
for (int i = 0; i < N; ++i)
ASSERT_EQ(Ptr<IDX>(c)[i], -3);
c = aten::Sub(a, b);
for (int i = 0; i < N; ++i)
ASSERT_EQ(Ptr<IDX>(c)[i], -17);
c = aten::Mul(a, b);
for (int i = 0; i < N; ++i)
ASSERT_EQ(Ptr<IDX>(c)[i], -70);
c = aten::Div(a, b);
for (int i = 0; i < N; ++i)
ASSERT_EQ(Ptr<IDX>(c)[i], -1);
const int val = -3;
c = aten::Add(a, val);
for (int i = 0; i < N; ++i)
ASSERT_EQ(Ptr<IDX>(c)[i], -13);
c = aten::Sub(a, val);
for (int i = 0; i < N; ++i)
ASSERT_EQ(Ptr<IDX>(c)[i], -7);
c = aten::Mul(a, val);
for (int i = 0; i < N; ++i)
ASSERT_EQ(Ptr<IDX>(c)[i], 30);
c = aten::Div(a, val);
for (int i = 0; i < N; ++i)
ASSERT_EQ(Ptr<IDX>(c)[i], 3);
c = aten::Add(val, b);
for (int i = 0; i < N; ++i)
ASSERT_EQ(Ptr<IDX>(c)[i], 4);
c = aten::Sub(val, b);
for (int i = 0; i < N; ++i)
ASSERT_EQ(Ptr<IDX>(c)[i], -10);
c = aten::Mul(val, b);
for (int i = 0; i < N; ++i)
ASSERT_EQ(Ptr<IDX>(c)[i], -21);
c = aten::Div(val, b);
for (int i = 0; i < N; ++i)
ASSERT_EQ(Ptr<IDX>(c)[i], 0);
a = aten::Range(0, N, sizeof(IDX)*8, CTX);
c = aten::LT(a, 50);
for (int i = 0; i < N; ++i)
ASSERT_EQ(Ptr<IDX>(c)[i], (int)(i < 50));
}
TEST(ArrayTest, TestArith) {
_TestArith<int32_t>();
_TestArith<int64_t>();
};
template <typename IDX>
void _TestHStack() {
IdArray a = aten::Range(0, 100, sizeof(IDX)*8, CTX);
IdArray b = aten::Range(100, 200, sizeof(IDX)*8, CTX);
IdArray c = aten::HStack(a, b);
ASSERT_EQ(c->ndim, 1);
ASSERT_EQ(c->shape[0], 200);
for (int i = 0; i < 200; ++i)
ASSERT_EQ(Ptr<IDX>(c)[i], i);
}
TEST(ArrayTest, TestHStack) {
_TestHStack<int32_t>();
_TestHStack<int64_t>();
}
template <typename IDX>
void _TestIndexSelect() {
IdArray a = aten::Range(0, 100, sizeof(IDX)*8, CTX);
ASSERT_EQ(aten::IndexSelect<int>(a, 50), 50);
IdArray b = aten::VecToIdArray(std::vector<IDX>({0, 20, 10}), sizeof(IDX)*8, CTX);
IdArray c = aten::IndexSelect(a, b);
ASSERT_TRUE(ArrayEQ<IDX>(b, c));
}
TEST(ArrayTest, TestIndexSelect) {
_TestIndexSelect<int32_t>();
_TestIndexSelect<int64_t>();
}
template <typename IDX>
void _TestRelabel_() {
IdArray a = aten::VecToIdArray(std::vector<IDX>({0, 20, 10}), sizeof(IDX)*8, CTX);
IdArray b = aten::VecToIdArray(std::vector<IDX>({20, 5, 6}), sizeof(IDX)*8, CTX);
IdArray c = aten::Relabel_({a, b});
IdArray ta = aten::VecToIdArray(std::vector<IDX>({0, 1, 2}), sizeof(IDX)*8, CTX);
IdArray tb = aten::VecToIdArray(std::vector<IDX>({1, 3, 4}), sizeof(IDX)*8, CTX);
IdArray tc = aten::VecToIdArray(std::vector<IDX>({0, 20, 10, 5, 6}), sizeof(IDX)*8, CTX);
ASSERT_TRUE(ArrayEQ<IDX>(a, ta));
ASSERT_TRUE(ArrayEQ<IDX>(b, tb));
ASSERT_TRUE(ArrayEQ<IDX>(c, tc));
}
TEST(ArrayTest, TestRelabel_) {
_TestRelabel_<int32_t>();
_TestRelabel_<int64_t>();
}