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 20 21 22 23 24 25 26 27 28 29 30 31
#include "gtest/gtest.h"
#include "paddle/utils/ThreadLocal.h"

static std::vector<pd_real> randomBuffer(size_t bufSize) {
  auto& eng = paddle::ThreadLocalRandomEngine::get();
  std::uniform_real_distribution<pd_real> dist(-1.0, 1.0);
  std::vector<pd_real> retv;
  retv.reserve(bufSize);
  for (size_t i = 0; i < bufSize; ++i) {
    retv.push_back(dist(eng));
  }
  return retv;
}

TEST(CAPIArguments, create) {
Y
Stash  
Yu Yang 已提交
32
  paddle_arguments args = paddle_arguments_create_none();
Y
Yu Yang 已提交
33
  uint64_t size;
Y
Stash  
Yu Yang 已提交
34
  ASSERT_EQ(kPD_NO_ERROR, paddle_arguments_size(args, &size));
Y
Yu Yang 已提交
35
  ASSERT_EQ(0UL, size);
Y
Stash  
Yu Yang 已提交
36
  ASSERT_EQ(kPD_NO_ERROR, paddle_arguments_destroy(args));
Y
Yu Yang 已提交
37 38 39
}

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

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

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

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

  for (size_t i = 0; i < 128; ++i) {
    pd_real* row1;
    pd_real* row2;

Y
Yu Yang 已提交
58 59
    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 已提交
60 61
    ASSERT_EQ(row1, row2);
  }
Y
Yu Yang 已提交
62

Y
Yu Yang 已提交
63 64 65 66
  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 已提交
67
  ASSERT_EQ(kPD_NO_ERROR, paddle_arguments_destroy(args));
Y
Yu Yang 已提交
68
}
L
livc 已提交
69 70

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

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

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

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

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

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

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

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

TEST(CAPIArguments, Sequence) {
Y
Yu Yang 已提交
113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
  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 已提交
128
}