mirror of
https://github.com/marian-nmt/marian.git
synced 2024-11-04 14:04:24 +03:00
more coolness
This commit is contained in:
parent
d19f1f610f
commit
e5fcec663c
@ -1,3 +1,5 @@
|
|||||||
# MAD
|
# Marian*
|
||||||
|
|
||||||
Massively (Parallel) Automatic Differentiation
|
Parallel Automatic Differentiation Library
|
||||||
|
|
||||||
|
* = in honour of Marian Rejewski, a Polish mathematician and cryptologist.
|
||||||
|
14
src/mad.h
14
src/mad.h
@ -40,7 +40,7 @@ class Vimpl : public Chainable {
|
|||||||
virtual void set_zero_adjoint() { adj_ = 0; }
|
virtual void set_zero_adjoint() { adj_ = 0; }
|
||||||
|
|
||||||
const Tensor& val() const { return val_; };
|
const Tensor& val() const { return val_; };
|
||||||
Tensor& adj() { return adj_; };
|
Tensor& grad() { return adj_; };
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
const Tensor val_;
|
const Tensor val_;
|
||||||
@ -72,15 +72,15 @@ class Var {
|
|||||||
return vimpl_->val();
|
return vimpl_->val();
|
||||||
}
|
}
|
||||||
|
|
||||||
Tensor& adj() {
|
Tensor& grad() {
|
||||||
return vimpl_->adj();
|
return vimpl_->grad();
|
||||||
}
|
}
|
||||||
|
|
||||||
VimplPtr vimpl() const {
|
VimplPtr vimpl() const {
|
||||||
return vimpl_;
|
return vimpl_;
|
||||||
}
|
}
|
||||||
|
|
||||||
void grad() {
|
void calc_gradients() {
|
||||||
mad::grad(vimpl_);
|
mad::grad(vimpl_);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -99,7 +99,7 @@ struct LogVimpl : public OpVimpl {
|
|||||||
LogVimpl(VimplPtr a) : OpVimpl(std::log(a->val()), a) { }
|
LogVimpl(VimplPtr a) : OpVimpl(std::log(a->val()), a) { }
|
||||||
|
|
||||||
void chain() {
|
void chain() {
|
||||||
a_->adj() += adj_ / a_->val();
|
a_->grad() += adj_ / a_->val();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -122,8 +122,8 @@ struct PlusVimplVV : public OpVimplVV {
|
|||||||
PlusVimplVV(VimplPtr a, VimplPtr b) : OpVimplVV(a->val() + b->val(), a, b) { }
|
PlusVimplVV(VimplPtr a, VimplPtr b) : OpVimplVV(a->val() + b->val(), a, b) { }
|
||||||
|
|
||||||
void chain() {
|
void chain() {
|
||||||
a_->adj() += adj_;
|
a_->grad() += adj_;
|
||||||
b_->adj() += adj_;
|
b_->grad() += adj_;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
33
src/test.cpp
33
src/test.cpp
@ -3,32 +3,41 @@
|
|||||||
|
|
||||||
#include "mad.h"
|
#include "mad.h"
|
||||||
|
|
||||||
int main(int argc, char** argv) {
|
mad::Var layer(size_t max) {
|
||||||
|
|
||||||
using namespace mad;
|
using namespace mad;
|
||||||
{
|
|
||||||
srand(time(NULL));
|
|
||||||
size_t max = rand() % 20 + 1;
|
|
||||||
|
|
||||||
Var x0 = 1, x1 = 2, x2 = 3;
|
Var x0 = 1, x1 = 2, x2 = 3;
|
||||||
std::vector<Var> x = { x0, x1, x2 };
|
|
||||||
|
|
||||||
Var y = 0.0;
|
Var y = 0.0;
|
||||||
for(int i = 0; i < max; i++) {
|
for(int i = 0; i < max; i++) {
|
||||||
Var xi = i;
|
Var xi = i;
|
||||||
y = y + x0 + log(x2) + x1;
|
y = y + x0 + log(x2) + x1;
|
||||||
for(int j = 0; j < i; ++i) {
|
for(int j = 0; j < i; ++j) {
|
||||||
y = y + xi;
|
y = y + xi;
|
||||||
x.push_back(xi);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return y;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char** argv) {
|
||||||
|
srand(time(NULL));
|
||||||
|
|
||||||
|
using namespace mad;
|
||||||
|
|
||||||
|
Var y1 = layer(10);
|
||||||
|
Var y2 = layer(5);
|
||||||
|
|
||||||
|
Var y = y1 + log(y2);
|
||||||
|
|
||||||
set_zero_all_adjoints();
|
set_zero_all_adjoints();
|
||||||
y.grad();
|
y.calc_gradients();
|
||||||
|
|
||||||
|
std::cerr << "y1 = " << y1.val() << std::endl;
|
||||||
|
std::cerr << "y2 = " << y2.val() << std::endl;
|
||||||
std::cerr << "y = " << y.val() << std::endl;
|
std::cerr << "y = " << y.val() << std::endl;
|
||||||
for(int i = 0; i < x.size(); ++i)
|
|
||||||
std::cerr << "dy/dx_" << i << " = " << x[i].adj() << std::endl;
|
std::cerr << "dy/dy1 = " << y1.grad() << std::endl;
|
||||||
}
|
std::cerr << "dy/dy2 = " << y2.grad() << std::endl;
|
||||||
|
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user