Identity.cpp 2.3 KB
Newer Older
xiaotong committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
/* NiuTrans.Tensor - an open-source tensor library
 * Copyright (C) 2017, Natural Language Processing Lab, Northestern University. 
 * All rights reserved.
 *
 * 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.
 */

/*
* $Created by: XIAO Tong (email: xiaotong@mail.neu.edu.cn) 2018-04-27
*/

#include "Identity.h"
23
#include "../XName.h"
xiaotong committed
24
#include "../XUtility.h"
25
#include "../core/movement/CopyValues.h"
xiaotong committed
26 27 28 29 30 31

namespace nts{ // namespace nts(NiuTrans.Tensor)

/* 
identity function y = x 
>> x - input tensor
32
>> y - output tensor
xiaotong committed
33
*/
34
void _Identity(const XTensor * x, XTensor * y)
xiaotong committed
35
{
36 37
    CheckNTErrors(XTensor::IsSameShaped(x, y), 
                 "The input tensor and output tensor must have the same shape!")
38
    _CopyValues(x, y);
xiaotong committed
39 40 41
}

/* 
xiaotong committed
42
identity function y = x (return an XTensor structure) 
43 44 45
make a new tensor to keep the result and return it

>> x - input tensor
46
<< return - output tensor
47 48 49 50
*/
XTensor Identity(const XTensor &x)
{
    XTensor y(&x);
51
    y.SetTMPFlag();
52 53 54 55 56 57 58 59 60

    /* call _Identity function */
    _Identity(&x, &y);

    /* tensor connection */
    XLink::MakeLink(&x, NULL, &y, FUNC_IDENTITY);

    return y;
}
61

62
void Identity(const XTensor &x, XTensor &y)
63 64 65 66 67 68 69 70
{
    if (!y.isInit || !y.IsSameShaped(&y, &x)) {
        InitTensor(&y, &x);
    }

    /* call _Identity function */
    _Identity(&x, &y);

71
    if (y.enableGrad) {
72 73 74 75 76
        /* tensor connection */
        XLink::MakeLink(&x, NULL, &y, FUNC_IDENTITY);
    }
}

77
/* 
xiaotong committed
78 79 80 81
backward computation for identity function y = x 

dE/dx = dE/dy * dy/dx = dE/dy

82 83
>> y - output of the identity function
>> x - input of the identity function
xiaotong committed
84 85 86
>> dedy - dE/dy
>> dedx - dE/dx
*/
87 88
void _IdentityBackward(const XTensor * y, const XTensor * x,
                       const XTensor * dedy, XTensor * dedx)
xiaotong committed
89
{
90 91
    if(dedy->data != dedx->data)
        _CopyValues(dedy, dedx);
xiaotong committed
92 93 94
}

} // namespace nts(NiuTrans.Tensor)