test_Arguments.cpp 4.5 KB
Newer Older
Y
Yu Yang 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14
/* Copyright (c) 2016 PaddlePaddle Authors. All Rights Reserve.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License. */

Y
Yu Yang 已提交
15
#include <functional>
Y
Yu Yang 已提交
16
#include "capi.h"
Y
Yu Yang 已提交
17 18 19
#include "gtest/gtest.h"
#include "paddle/utils/ThreadLocal.h"

Y
Yu Yang 已提交
20
static std::vector<paddle_real> randomBuffer(size_t bufSize) {
Y
Yu Yang 已提交
21
  auto& eng = paddle::ThreadLocalRandomEngine::get();
Y
Yu Yang 已提交
22 23
  std::uniform_real_distribution<paddle_real> dist(-1.0, 1.0);
  std::vector<paddle_real> retv;
Y
Yu Yang 已提交
24 25 26 27 28 29 30 31
  retv.reserve(bufSize);
  for (size_t i = 0; i < bufSize; ++i) {
    retv.push_back(dist(eng));
  }
  return retv;
}

TEST(CAPIArguments, create) {
Y
Yu Yang 已提交
32
  //! TODO(yuyang18): Test GPU Code.
Y
Stash  
Yu Yang 已提交
33
  paddle_arguments args = paddle_arguments_create_none();
Y
Yu Yang 已提交
34
  uint64_t size;
Y
Stash  
Yu Yang 已提交
35
  ASSERT_EQ(kPD_NO_ERROR, paddle_arguments_size(args, &size));
Y
Yu Yang 已提交
36
  ASSERT_EQ(0UL, size);
Y
Stash  
Yu Yang 已提交
37
  ASSERT_EQ(kPD_NO_ERROR, paddle_arguments_destroy(args));
Y
Yu Yang 已提交
38 39 40
}

TEST(CAPIArguments, value) {
Y
Stash  
Yu Yang 已提交
41 42
  paddle_arguments args = paddle_arguments_create_none();
  ASSERT_EQ(kPD_NO_ERROR, paddle_arguments_resize(args, 1));
Y
Yu Yang 已提交
43

Y
Yu Yang 已提交
44
  paddle_matrix mat = paddle_matrix_create(128, 64, false);
Y
Yu Yang 已提交
45
  for (size_t i = 0; i < 128; ++i) {
Y
Yu Yang 已提交
46
    std::vector<paddle_real> sampleBuf = randomBuffer(64);
Y
Yu Yang 已提交
47
    paddle_matrix_set_row(mat, i, sampleBuf.data());
Y
Yu Yang 已提交
48
  }
Y
Stash  
Yu Yang 已提交
49
  ASSERT_EQ(kPD_NO_ERROR, paddle_arguments_set_value(args, 0, mat));
Y
Yu Yang 已提交
50

Y
Yu Yang 已提交
51
  paddle_matrix val = paddle_matrix_create_none();
Y
Yu Yang 已提交
52

Y
Stash  
Yu Yang 已提交
53
  ASSERT_EQ(kPD_NO_ERROR, paddle_arguments_value(args, 0, val));
Y
Yu Yang 已提交
54 55

  for (size_t i = 0; i < 128; ++i) {
Y
Yu Yang 已提交
56 57
    paddle_real* row1;
    paddle_real* row2;
Y
Yu Yang 已提交
58

Y
Yu Yang 已提交
59 60
    ASSERT_EQ(kPD_NO_ERROR, paddle_matrix_get_row(mat, i, &row1));
    ASSERT_EQ(kPD_NO_ERROR, paddle_matrix_get_row(val, i, &row2));
Y
Yu Yang 已提交
61 62
    ASSERT_EQ(row1, row2);
  }
Y
Yu Yang 已提交
63

Y
Yu Yang 已提交
64 65 66 67
  paddle_ivector ivec = paddle_ivector_create_none();
  ASSERT_EQ(kPD_NO_ERROR, paddle_ivector_destroy(ivec));
  ASSERT_EQ(kPD_NO_ERROR, paddle_matrix_destroy(val));
  ASSERT_EQ(kPD_NO_ERROR, paddle_matrix_destroy(mat));
Y
Stash  
Yu Yang 已提交
68
  ASSERT_EQ(kPD_NO_ERROR, paddle_arguments_destroy(args));
Y
Yu Yang 已提交
69
}
L
livc 已提交
70 71

TEST(CAPIArguments, ids) {
Y
Stash  
Yu Yang 已提交
72 73
  paddle_arguments args = paddle_arguments_create_none();
  ASSERT_EQ(kPD_NO_ERROR, paddle_arguments_resize(args, 1));
L
livc 已提交
74

Y
Yu Yang 已提交
75
  paddle_ivector ivec;
L
livc 已提交
76
  int array[3] = {1, 2, 3};
Y
Yu Yang 已提交
77
  ivec = paddle_ivector_create(array, 3, true, false);
Y
Stash  
Yu Yang 已提交
78
  ASSERT_EQ(kPD_NO_ERROR, paddle_arguments_set_ids(args, 0, ivec));
L
livc 已提交
79

Y
Yu Yang 已提交
80
  paddle_ivector val = paddle_ivector_create_none();
Y
Stash  
Yu Yang 已提交
81
  ASSERT_EQ(kPD_NO_ERROR, paddle_arguments_ids(args, 0, val));
Y
Yu Yang 已提交
82 83
  ASSERT_EQ(kPD_NO_ERROR, paddle_ivector_destroy(ivec));
  ASSERT_EQ(kPD_NO_ERROR, paddle_ivector_destroy(val));
Y
Stash  
Yu Yang 已提交
84
  ASSERT_EQ(kPD_NO_ERROR, paddle_arguments_destroy(args));
L
livc 已提交
85 86
}

Y
Yu Yang 已提交
87 88
template <typename T1, typename T2>
void testSequenceHelper(T1 setter, T2 getter) {
Y
Stash  
Yu Yang 已提交
89 90
  paddle_arguments args = paddle_arguments_create_none();
  ASSERT_EQ(kPD_NO_ERROR, paddle_arguments_resize(args, 1));
L
livc 已提交
91

Y
Yu Yang 已提交
92
  paddle_ivector ivec;
L
livc 已提交
93
  int array[3] = {1, 2, 3};
Y
Yu Yang 已提交
94
  ivec = paddle_ivector_create(array, 3, true, false);
Y
Yu Yang 已提交
95
  ASSERT_EQ(kPD_NO_ERROR, setter(args, 0, ivec));
L
livc 已提交
96

Y
Yu Yang 已提交
97
  paddle_ivector val = paddle_ivector_create_none();
Y
Yu Yang 已提交
98 99
  ASSERT_EQ(kPD_NO_ERROR, getter(args, 0, val));
  uint64_t size;
Y
Yu Yang 已提交
100
  ASSERT_EQ(kPD_NO_ERROR, paddle_ivector_get_size(val, &size));
Y
Yu Yang 已提交
101 102

  int* rawBuf;
Y
Yu Yang 已提交
103
  ASSERT_EQ(kPD_NO_ERROR, paddle_ivector_get(val, &rawBuf));
Y
Yu Yang 已提交
104 105 106 107
  for (size_t i = 0; i < size; ++i) {
    ASSERT_EQ(array[i], rawBuf[i]);
  }

Y
Yu Yang 已提交
108 109
  ASSERT_EQ(kPD_NO_ERROR, paddle_ivector_destroy(ivec));
  ASSERT_EQ(kPD_NO_ERROR, paddle_ivector_destroy(val));
Y
Stash  
Yu Yang 已提交
110
  ASSERT_EQ(kPD_NO_ERROR, paddle_arguments_destroy(args));
L
livc 已提交
111
}
Y
Yu Yang 已提交
112 113

TEST(CAPIArguments, Sequence) {
Y
Yu Yang 已提交
114 115 116 117 118 119 120 121 122 123 124 125 126 127 128
  auto testSequence = [](uint32_t nestedLevel) {
    testSequenceHelper(std::bind(paddle_arguments_set_sequence_start_pos,
                                 std::placeholders::_1,
                                 std::placeholders::_2,
                                 nestedLevel,
                                 std::placeholders::_3),
                       std::bind(paddle_arguments_sequence_start_pos,
                                 std::placeholders::_1,
                                 std::placeholders::_2,
                                 nestedLevel,
                                 std::placeholders::_3));
  };
  for (uint32_t i = 0; i < 2; ++i) {  // test seq and sub-seq.
    testSequence(i);
  }
Y
Yu Yang 已提交
129
}