From 7e5cdca44256527075ff4cf294d90efd566a5c4f Mon Sep 17 00:00:00 2001 From: raggledodo <35833068+raggledodo@users.noreply.github.com> Date: Thu, 31 Jan 2019 19:54:17 -0800 Subject: [PATCH] Cppkg update, renames, and age generalization (#26) * renames, cleanups, and updates * update cppkg version * make age opmap more general * separate type conversion from opera * update docs --- Makefile | 11 +- ade/{mtens.hpp => funcarg.hpp} | 48 +- ade/functor.hpp | 18 + ade/ifunctor.hpp | 4 +- ade/src/funcarg.cpp | 49 ++ ade/src/mtens.cpp | 49 -- ade/test/{test_mtens.cpp => test_funcarg.cpp} | 12 +- ade/test/test_tensor.cpp | 10 +- age/BUILD.bazel | 2 +- age/generator/internal.py | 11 +- age/templates/api_tmpl.py | 2 +- age/templates/codes_tmpl.py | 25 +- age/templates/data_tmpl.py | 39 ++ age/templates/grader_tmpl.py | 13 +- age/templates/opera_tmpl.py | 53 +- age/templates/template.py | 5 + age/test/ptest.py | 91 ++-- age/test/test_opmap.cpp | 16 + bwd/grader.hpp | 2 +- bwd/src/grader.cpp | 8 +- bwd/test/test_grader.cpp | 10 +- dbg/ade.hpp | 2 +- docs/ade_8hpp.html | 8 +- docs/ade_8hpp__incl.map | 8 +- docs/ade_8hpp__incl.md5 | 2 +- docs/ade_8hpp__incl.png | Bin 56130 -> 55346 bytes docs/annotated.html | 16 +- docs/classes.html | 29 +- docs/coord_8hpp.html | 6 +- docs/coord_8hpp__dep__incl.map | 6 +- docs/coord_8hpp__dep__incl.md5 | 2 +- docs/coord_8hpp__dep__incl.png | Bin 32506 -> 32376 bytes .../dir_97757236e3c067dca99452dec566d982.html | 4 +- .../dir_e27d2b201b2b67ab280cb2f6929c41a1.html | 4 +- docs/files.html | 16 +- docs/funcarg_8cpp.html | 93 ++++ docs/funcarg_8cpp__incl.map | 7 + docs/funcarg_8cpp__incl.md5 | 1 + docs/funcarg_8cpp__incl.png | Bin 0 -> 37439 bytes docs/funcarg_8hpp.html | 142 ++++++ docs/funcarg_8hpp__dep__incl.map | 9 + docs/funcarg_8hpp__dep__incl.md5 | 1 + docs/funcarg_8hpp__dep__incl.png | Bin 0 -> 26327 bytes docs/funcarg_8hpp__incl.map | 6 + docs/funcarg_8hpp__incl.md5 | 1 + docs/funcarg_8hpp__incl.png | Bin 0 -> 33525 bytes docs/funcarg_8hpp_source.html | 112 +++++ docs/functions.html | 31 +- docs/functions_func.html | 27 +- docs/functions_vars.html | 8 +- docs/functor_8hpp.html | 2 +- docs/functor_8hpp__incl.map | 2 +- docs/functor_8hpp__incl.md5 | 2 +- docs/functor_8hpp__incl.png | Bin 40177 -> 40346 bytes docs/functor_8hpp_source.html | 21 +- docs/grader_8cpp.html | 14 +- docs/grader_8cpp__incl.map | 12 +- docs/grader_8cpp__incl.md5 | 2 +- docs/grader_8cpp__incl.png | Bin 65905 -> 65000 bytes docs/grader_8hpp.html | 12 +- docs/grader_8hpp__incl.map | 10 +- docs/grader_8hpp__incl.md5 | 2 +- docs/grader_8hpp__incl.png | Bin 61905 -> 60949 bytes docs/grader_8hpp_source.html | 8 +- docs/hierarchy.html | 24 +- docs/ifunctor_8hpp.html | 10 +- docs/ifunctor_8hpp__incl.map | 2 +- docs/ifunctor_8hpp__incl.md5 | 2 +- docs/ifunctor_8hpp__incl.png | Bin 36780 -> 36949 bytes docs/ifunctor_8hpp_source.html | 6 +- docs/inherit_graph_0.map | 3 +- docs/inherit_graph_0.md5 | 2 +- docs/inherit_graph_0.png | Bin 3768 -> 1914 bytes docs/inherit_graph_1.map | 6 +- docs/inherit_graph_1.md5 | 2 +- docs/inherit_graph_1.png | Bin 7989 -> 3768 bytes docs/inherit_graph_2.map | 8 +- docs/inherit_graph_2.md5 | 2 +- docs/inherit_graph_2.png | Bin 10203 -> 7989 bytes docs/inherit_graph_3.map | 5 +- docs/inherit_graph_3.md5 | 2 +- docs/inherit_graph_3.png | Bin 2527 -> 10203 bytes docs/inherits.html | 16 +- docs/itensor_8hpp.html | 6 +- docs/itensor_8hpp__dep__incl.map | 6 +- docs/itensor_8hpp__dep__incl.md5 | 2 +- docs/itensor_8hpp__dep__incl.png | Bin 34192 -> 34409 bytes docs/matops_8hpp.html | 10 +- docs/matops_8hpp__dep__incl.map | 10 +- docs/matops_8hpp__dep__incl.md5 | 2 +- docs/matops_8hpp__dep__incl.png | Bin 39119 -> 39080 bytes docs/namespaceade.html | 96 ++-- docs/namespaceage.html | 4 +- docs/namespacemembers.html | 14 +- docs/namespacemembers_func.html | 12 +- docs/namespacemembers_type.html | 2 +- docs/search/all_0.js | 2 +- docs/search/all_2.js | 4 +- docs/search/all_4.js | 2 +- docs/search/all_5.js | 7 +- docs/search/all_6.js | 8 +- docs/search/all_7.js | 2 +- docs/search/all_9.js | 9 +- docs/search/all_b.js | 2 +- docs/search/all_c.js | 2 +- docs/search/all_d.js | 4 +- docs/search/all_e.js | 4 +- docs/search/all_f.js | 2 +- docs/search/classes_1.js | 1 + docs/search/classes_4.js | 2 +- docs/search/classes_5.js | 2 +- docs/search/classes_6.js | 2 +- docs/search/files_2.js | 2 + docs/search/files_5.js | 4 +- docs/search/functions_2.js | 2 +- docs/search/functions_4.js | 2 +- docs/search/functions_5.js | 5 +- docs/search/functions_6.js | 8 +- docs/search/functions_7.js | 2 +- docs/search/functions_8.js | 3 +- docs/search/functions_a.js | 2 +- docs/search/functions_b.js | 2 +- docs/search/functions_c.js | 4 +- docs/search/functions_d.js | 2 +- docs/search/searchdata.js | 2 +- docs/search/typedefs_0.js | 2 +- docs/search/variables_1.js | 2 +- docs/search/variables_6.js | 2 +- docs/search/variables_b.js | 2 +- docs/search/variables_c.js | 2 +- docs/shape_8hpp.html | 16 +- docs/shape_8hpp__dep__incl.map | 16 +- docs/shape_8hpp__dep__incl.md5 | 2 +- docs/shape_8hpp__dep__incl.png | Bin 52607 -> 52492 bytes docs/structade_1_1_func_arg-members.html | 94 ++++ docs/structade_1_1_func_arg.html | 457 ++++++++++++++++++ docs/structade_1_1_functor-members.html | 6 + docs/structade_1_1_functor.html | 188 ++++++- docs/structade_1_1i_functor.html | 4 +- docs/structage_1_1i_rule_set-members.html | 2 +- docs/structage_1_1i_rule_set.html | 10 +- docs/traveler_8hpp.html | 2 +- docs/traveler_8hpp__incl.map | 2 +- docs/traveler_8hpp__incl.md5 | 2 +- docs/traveler_8hpp__incl.png | Bin 46291 -> 46339 bytes docs/traveler_8hpp_source.html | 4 +- scripts/merge_cov.sh | 69 --- tenncor.bzl | 2 +- testutil/common.hpp | 3 +- 149 files changed, 1729 insertions(+), 615 deletions(-) rename ade/{mtens.hpp => funcarg.hpp} (69%) create mode 100644 ade/src/funcarg.cpp delete mode 100644 ade/src/mtens.cpp rename ade/test/{test_mtens.cpp => test_funcarg.cpp} (83%) create mode 100644 age/templates/data_tmpl.py create mode 100644 docs/funcarg_8cpp.html create mode 100644 docs/funcarg_8cpp__incl.map create mode 100644 docs/funcarg_8cpp__incl.md5 create mode 100644 docs/funcarg_8cpp__incl.png create mode 100644 docs/funcarg_8hpp.html create mode 100644 docs/funcarg_8hpp__dep__incl.map create mode 100644 docs/funcarg_8hpp__dep__incl.md5 create mode 100644 docs/funcarg_8hpp__dep__incl.png create mode 100644 docs/funcarg_8hpp__incl.map create mode 100644 docs/funcarg_8hpp__incl.md5 create mode 100644 docs/funcarg_8hpp__incl.png create mode 100644 docs/funcarg_8hpp_source.html create mode 100644 docs/structade_1_1_func_arg-members.html create mode 100644 docs/structade_1_1_func_arg.html delete mode 100755 scripts/merge_cov.sh diff --git a/Makefile b/Makefile index 4d7794da4..b4fad30ae 100644 --- a/Makefile +++ b/Makefile @@ -8,7 +8,7 @@ BWD_TEST := //bwd:test COVERAGE_IGNORE := 'external/*' '**/test/*' 'testutil/*' '**/genfiles/*' 'dbg/*' -COVERAGE_PIPE := ./scripts/merge_cov.sh $(COVERAGE_INFO_FILE) +COVERAGE_PIPE := ./bazel-bin/external/com_github_mingkaic_cppkg/merge_cov $(COVERAGE_INFO_FILE) TMP_LOGFILE := /tmp/tenncor-test.log @@ -22,7 +22,10 @@ cover_bwd: $(COVER) $(BWD_TEST) -lcov: coverage +merge_cov: + bazel build @com_github_mingkaic_cppkg//:merge_cov + +lcov: merge_cov coverage rm -f $(TMP_LOGFILE) cat bazel-testlogs/ade/test/test.log >> $(TMP_LOGFILE) cat bazel-testlogs/bwd/test/test.log >> $(TMP_LOGFILE) @@ -31,12 +34,12 @@ lcov: coverage rm -f $(TMP_LOGFILE) lcov --list $(COVERAGE_INFO_FILE) -lcov_ade: cover_ade +lcov_ade: merge_cov cover_ade cat bazel-testlogs/ade/test/test.log | $(COVERAGE_PIPE) lcov --remove $(COVERAGE_INFO_FILE) $(COVERAGE_IGNORE) -o $(COVERAGE_INFO_FILE) lcov --list $(COVERAGE_INFO_FILE) -lcov_bwd: cover_bwd +lcov_bwd: merge_cov over_bwd rm -f $(TMP_LOGFILE) cat bazel-testlogs/bwd/test/test.log | $(COVERAGE_PIPE) lcov --remove $(COVERAGE_INFO_FILE) $(COVERAGE_IGNORE) 'ade/*' -o $(COVERAGE_INFO_FILE) diff --git a/ade/mtens.hpp b/ade/funcarg.hpp similarity index 69% rename from ade/mtens.hpp rename to ade/funcarg.hpp index 42ed95453..273f88755 100644 --- a/ade/mtens.hpp +++ b/ade/funcarg.hpp @@ -1,17 +1,25 @@ +/// +/// funcarg.hpp +/// ade +/// +/// Purpose: +/// Define functor argument wrapper to carryover shape and coordinate mappers +/// + #include "ade/itensor.hpp" #include "ade/coord.hpp" -#ifndef ADE_MTENS_HPP -#define ADE_MTENS_HPP +#ifndef ADE_FUNCARG_HPP +#define ADE_FUNCARG_HPP namespace ade { /// Coordinate mapper and tensor pair -struct MappedTensor final +struct FuncArg final { - /// Construct MappedTensor auto deducing coorder_ and map_io_ flag - MappedTensor (TensptrT tensor, CoordptrT shaper) : + /// Construct FuncArg auto deducing coorder_ and map_io_ flag + FuncArg (TensptrT tensor, CoordptrT shaper) : tensor_(tensor), shaper_(shaper) { if (tensor_ == nullptr) @@ -29,8 +37,8 @@ struct MappedTensor final } } - /// Construct MappedTensor with specific coorder_ and map_io_ flag - MappedTensor (TensptrT tensor, CoordptrT shaper, + /// Construct FuncArg with specific coorder_ and map_io_ flag + FuncArg (TensptrT tensor, CoordptrT shaper, bool map_io, CoordptrT coorder) : tensor_(tensor), shaper_(shaper), map_io_(map_io), coorder_(coorder) @@ -102,36 +110,36 @@ struct MappedTensor final CoordptrT coorder_; }; -/// Return MappedTensor that identity maps input tensor -MappedTensor identity_map (TensptrT tensor); +/// Return FuncArg that identity maps input tensor +FuncArg identity_map (TensptrT tensor); -/// Return MappedTensor that reduces input tensor at +/// Return FuncArg that reduces input tensor at /// rank then snip the dimension at rank /// E.g.: tensor w/ shape [2, 3, 4], rank = 1 gets mapped to [2, 4] -MappedTensor reduce_1d_map (TensptrT tensor, uint8_t rank); +FuncArg reduce_1d_map (TensptrT tensor, uint8_t rank); -/// Return MappedTensor that reduces input tensor by +/// Return FuncArg that reduces input tensor by /// units in reduction vector after specified rank /// E.g.: tensor w/ shape [2, 3, 4], rank = 0, red = [2, 3] /// gets mapped to [1, 1, 4] -MappedTensor reduce_map (TensptrT tensor, +FuncArg reduce_map (TensptrT tensor, uint8_t rank, std::vector red); -/// Return MappedTensor that extends input tensor by +/// Return FuncArg that extends input tensor by /// rank and extension vector /// E.g.: tensor w/ shape [2, 1, 1], rank = 1, red = [3, 4] /// gets mapped to [2, 3, 4] -MappedTensor extend_map (TensptrT tensor, +FuncArg extend_map (TensptrT tensor, uint8_t rank, std::vector ext); -/// Return MappedTensor that permutes input tensor by order +/// Return FuncArg that permutes input tensor by order /// E.g.: tensor w/ shape [2, 3, 4], order = [1, 2, 0] /// gets mapped to [3, 4, 2] -MappedTensor permute_map (TensptrT tensor, std::vector order); +FuncArg permute_map (TensptrT tensor, std::vector order); -/// Return MappedTensor that flips input tensor along dimension -MappedTensor flip_map (TensptrT tensor, uint8_t dim); +/// Return FuncArg that flips input tensor along dimension +FuncArg flip_map (TensptrT tensor, uint8_t dim); } -#endif // ADE_MTENS_HPP +#endif // ADE_FUNCARG_HPP diff --git a/ade/functor.hpp b/ade/functor.hpp index f21101d2b..939238dfc 100644 --- a/ade/functor.hpp +++ b/ade/functor.hpp @@ -40,6 +40,20 @@ struct Functor final : public iFunctor return new Functor(opcode, shape, args); } + static Functor* get (const Functor& other) + { + return new Functor(other); + } + + static Functor* get (Functor&& other) + { + return new Functor(std::move(other)); + } + + Functor& operator = (const Functor& other) = delete; + + Functor& operator = (Functor&& other) = delete; + /// Implementation of iTensor const Shape& shape (void) const override { @@ -68,6 +82,10 @@ struct Functor final : public iFunctor Functor (Opcode opcode, Shape shape, ArgsT args) : opcode_(opcode), shape_(shape), args_(args) {} + Functor (const Functor& other) = default; + + Functor (Functor&& other) = default; + /// Operation encoding Opcode opcode_; diff --git a/ade/ifunctor.hpp b/ade/ifunctor.hpp index 5873dbaa9..99bb733f7 100644 --- a/ade/ifunctor.hpp +++ b/ade/ifunctor.hpp @@ -6,7 +6,7 @@ /// Define functor nodes of an equation graph /// -#include "ade/mtens.hpp" +#include "ade/funcarg.hpp" #ifndef ADE_IFUNCTOR_HPP #define ADE_IFUNCTOR_HPP @@ -15,7 +15,7 @@ namespace ade { /// Type of functor arguments -using ArgsT = std::vector; +using ArgsT = std::vector; /// Encoding of operation struct Opcode final diff --git a/ade/src/funcarg.cpp b/ade/src/funcarg.cpp new file mode 100644 index 000000000..bce312854 --- /dev/null +++ b/ade/src/funcarg.cpp @@ -0,0 +1,49 @@ +#include "ade/funcarg.hpp" + +#ifdef ADE_FUNCARG_HPP + +namespace ade +{ + +FuncArg identity_map (TensptrT tensor) +{ + return FuncArg(tensor, identity); +} + +FuncArg reduce_1d_map (TensptrT tensor, uint8_t rank) +{ + Shape shape = tensor->shape(); + std::vector indices(rank_cap); + auto bt = indices.begin(); + auto it = bt + rank; + std::iota(bt, it, 0); + std::iota(it, indices.end(), rank + 1); + indices[rank_cap - 1] = rank; + return FuncArg(tensor, CoordptrT( + reduce(rank, {shape.at(rank)})-> + connect(*permute(indices)))); +} + +FuncArg reduce_map (TensptrT tensor, uint8_t rank, std::vector red) +{ + return FuncArg(tensor, reduce(rank, red)); +} + +FuncArg extend_map (TensptrT tensor, uint8_t rank, std::vector ext) +{ + return FuncArg(tensor, extend(rank, ext)); +} + +FuncArg permute_map (TensptrT tensor, std::vector order) +{ + return FuncArg(tensor, permute(order)); +} + +FuncArg flip_map (TensptrT tensor, uint8_t dim) +{ + return FuncArg(tensor, flip(dim)); +} + +} + +#endif diff --git a/ade/src/mtens.cpp b/ade/src/mtens.cpp deleted file mode 100644 index 794f82168..000000000 --- a/ade/src/mtens.cpp +++ /dev/null @@ -1,49 +0,0 @@ -#include "ade/mtens.hpp" - -#ifdef ADE_MTENS_HPP - -namespace ade -{ - -MappedTensor identity_map (TensptrT tensor) -{ - return MappedTensor(tensor, identity); -} - -MappedTensor reduce_1d_map (TensptrT tensor, uint8_t rank) -{ - Shape shape = tensor->shape(); - std::vector indices(rank_cap); - auto bt = indices.begin(); - auto it = bt + rank; - std::iota(bt, it, 0); - std::iota(it, indices.end(), rank + 1); - indices[rank_cap - 1] = rank; - return MappedTensor(tensor, CoordptrT( - reduce(rank, {shape.at(rank)})-> - connect(*permute(indices)))); -} - -MappedTensor reduce_map (TensptrT tensor, uint8_t rank, std::vector red) -{ - return MappedTensor(tensor, reduce(rank, red)); -} - -MappedTensor extend_map (TensptrT tensor, uint8_t rank, std::vector ext) -{ - return MappedTensor(tensor, extend(rank, ext)); -} - -MappedTensor permute_map (TensptrT tensor, std::vector order) -{ - return MappedTensor(tensor, permute(order)); -} - -MappedTensor flip_map (TensptrT tensor, uint8_t dim) -{ - return MappedTensor(tensor, flip(dim)); -} - -} - -#endif diff --git a/ade/test/test_mtens.cpp b/ade/test/test_funcarg.cpp similarity index 83% rename from ade/test/test_mtens.cpp rename to ade/test/test_funcarg.cpp index 90d850c65..6f133bdc0 100644 --- a/ade/test/test_mtens.cpp +++ b/ade/test/test_funcarg.cpp @@ -1,5 +1,5 @@ -#ifndef DISABLE_MTENS_TEST +#ifndef DISABLE_FUNCARG_TEST #include "gtest/gtest.h" @@ -8,10 +8,10 @@ #include "ade/test/common.hpp" -#include "ade/mtens.hpp" +#include "ade/funcarg.hpp" -struct MTENS : public ::testing::Test +struct FUNCARG : public ::testing::Test { virtual void TearDown (void) { @@ -21,7 +21,7 @@ struct MTENS : public ::testing::Test }; -TEST_F(MTENS, Reduce1d) +TEST_F(FUNCARG, Reduce1d) { size_t rank = 5; ade::CoordT fwd_out; @@ -32,7 +32,7 @@ TEST_F(MTENS, Reduce1d) ade::Shape shape({223, 35, 7, 25, 19, 214, 72, 7}); ade::TensptrT tens = std::make_shared(shape); - ade::MappedTensor redtens = ade::reduce_1d_map(tens, rank); + ade::FuncArg redtens = ade::reduce_1d_map(tens, rank); ade::Shape rshaped = redtens.shape(); std::vector expect_shape = {223, 35, 7, 25, @@ -53,4 +53,4 @@ TEST_F(MTENS, Reduce1d) } -#endif // DISABLE_MTENS_TEST +#endif // DISABLE_FUNCARG_TEST diff --git a/ade/test/test_tensor.cpp b/ade/test/test_tensor.cpp index dcba6be8a..d314e3b39 100644 --- a/ade/test/test_tensor.cpp +++ b/ade/test/test_tensor.cpp @@ -8,7 +8,7 @@ #include "ade/test/common.hpp" -#include "ade/mtens.hpp" +#include "ade/funcarg.hpp" struct TENSOR : public ::testing::Test @@ -21,18 +21,18 @@ struct TENSOR : public ::testing::Test }; -TEST_F(TENSOR, MappedTensor) +TEST_F(TENSOR, FuncArg) { std::vector slist = {2, 81}; size_t dim = 1; ade::TensptrT tens(new MockTensor(ade::Shape(slist))); - ade::MappedTensor mt = ade::flip_map(tens, dim); + ade::FuncArg mt = ade::flip_map(tens, dim); ade::Shape shape = mt.shape(); EXPECT_ARREQ(slist, shape); - ade::MappedTensor mt2(tens, ade::CoordptrT(new ade::CoordMap( + ade::FuncArg mt2(tens, ade::CoordptrT(new ade::CoordMap( [](ade::MatrixT m) { for (size_t i = 0; i < ade::mat_dim; ++i) @@ -48,7 +48,7 @@ TEST_F(TENSOR, MappedTensor) EXPECT_FATAL(ade::identity_map(nullptr), "cannot map a null tensor"); - EXPECT_FATAL(ade::MappedTensor(nullptr, ade::reduce(3, {4}), + EXPECT_FATAL(ade::FuncArg(nullptr, ade::reduce(3, {4}), false, ade::extend(3, {4})), "cannot map a null tensor"); } diff --git a/age/BUILD.bazel b/age/BUILD.bazel index 78dcf62d0..08df4066d 100644 --- a/age/BUILD.bazel +++ b/age/BUILD.bazel @@ -66,10 +66,10 @@ genrule( "generated/capi.cpp", "generated/codes.hpp", "generated/codes.cpp", + "generated/data.hpp", "generated/grader.hpp", "generated/grader.cpp", "generated/opmap.hpp", - "generated/opmap.cpp", ], tools = ["//age:cagen"], cmd = "$(location //age:cagen) " + diff --git a/age/generator/internal.py b/age/generator/internal.py index 5944bb57b..c433d903e 100644 --- a/age/generator/internal.py +++ b/age/generator/internal.py @@ -4,6 +4,7 @@ import age.templates.api_tmpl as api import age.templates.codes_tmpl as codes +import age.templates.data_tmpl as data import age.templates.grader_tmpl as grader import age.templates.opera_tmpl as opera @@ -12,7 +13,6 @@ def process(directory, relpath, fields): api_hdr_path = os.path.join(relpath, api.header.fpath) codes_hdr_path = os.path.join(relpath, codes.header.fpath) grader_hdr_path = os.path.join(relpath, grader.header.fpath) - opera_hdr_path = os.path.join(relpath, opera.header.fpath) # manitory headers api.header.includes = [ @@ -32,6 +32,10 @@ def process(directory, relpath, fields): '"' + codes_hdr_path + '"', ] + data.header.includes = [ + '"' + codes_hdr_path + '"', + ] + grader.header.includes = [ '"bwd/grader.hpp"', '"' + codes_hdr_path + '"', @@ -46,19 +50,16 @@ def process(directory, relpath, fields): '"ade/functor.hpp"', '"' + codes_hdr_path + '"', ] - opera.source.includes = [ - '"' + opera_hdr_path + '"' - ] directory = { 'api_hpp': api.header, 'api_src': api.source, 'codes_hpp': codes.header, 'codes_src': codes.source, + 'data_hpp': data.header, 'grader_hpp': grader.header, 'grader_src': grader.source, 'opera_hpp': opera.header, - 'opera_src': opera.source, } for akey in directory: diff --git a/age/templates/api_tmpl.py b/age/templates/api_tmpl.py index 6dc283675..2c79d47d2 100644 --- a/age/templates/api_tmpl.py +++ b/age/templates/api_tmpl.py @@ -1,6 +1,6 @@ ''' Representation of API files ''' -import template +import age.templates.template as template FILENAME = 'api' diff --git a/age/templates/codes_tmpl.py b/age/templates/codes_tmpl.py index 062d3e7e3..61b5c0b6b 100644 --- a/age/templates/codes_tmpl.py +++ b/age/templates/codes_tmpl.py @@ -1,14 +1,9 @@ ''' Representation of OPCODE and DTYPE definition files ''' -import template +import age.templates.template as template FILENAME = 'codes' -def sortkey(dic): - arr = dic.keys() - arr.sort() - return arr - # EXPORT header = template.AGE_FILE(FILENAME, template.HEADER_EXT, '''#ifndef _GENERATED_CODES_HPP @@ -53,14 +48,14 @@ def sortkey(dic): ''') header.opcodes = ('opcodes', lambda opcodes: '\n'.join([' {code},'.format(\ - code = code) for code in sortkey(opcodes)])) + code = code) for code in template.sortkey(opcodes)])) header.dtypes = ('dtypes', lambda dtypes: '\n'.join([' {dtype},'.format(\ - dtype = dtype) for dtype in sortkey(dtypes)])) + dtype = dtype) for dtype in template.sortkey(dtypes)])) header.get_type_decls = ('dtypes', lambda dtypes: '\n\n'.join(['''template <> _GENERATED_DTYPE get_type<{real_type}> (void);'''.format(\ - real_type = dtypes[dtype]) for dtype in sortkey(dtypes)])) + real_type = dtypes[dtype]) for dtype in template.sortkey(dtypes)])) # EXPORT source = template.AGE_FILE(FILENAME, template.SOURCE_EXT, @@ -155,22 +150,22 @@ def sortkey(dic): ''') source.code2names = ('opcodes', lambda opcodes: '\n'.join([' {{ {code}, "{code}" }},'.format(\ - code = code) for code in sortkey(opcodes)])) + code = code) for code in template.sortkey(opcodes)])) source.name2codes = ('opcodes', lambda opcodes: '\n'.join([' {{ "{code}", {code} }},'.format(\ - code = code) for code in sortkey(opcodes)])) + code = code) for code in template.sortkey(opcodes)])) source.type2names = ('dtypes', lambda dtypes: '\n'.join([' {{ {dtype}, "{dtype}" }},'.format(\ - dtype = dtype) for dtype in sortkey(dtypes)])) + dtype = dtype) for dtype in template.sortkey(dtypes)])) source.name2types = ('dtypes', lambda dtypes: '\n'.join([' {{ "{dtype}", {dtype} }},'.format(\ - dtype = dtype) for dtype in sortkey(dtypes)])) + dtype = dtype) for dtype in template.sortkey(dtypes)])) source.type_sizes = ('dtypes', lambda dtypes: '\n'.join([' case {dtype}: return sizeof({real_type});'.format(\ - dtype = dtype, real_type = dtypes[dtype]) for dtype in sortkey(dtypes)])) + dtype = dtype, real_type = dtypes[dtype]) for dtype in template.sortkey(dtypes)])) source.get_types = ('dtypes', lambda dtypes: '\n\n'.join(['''template <> _GENERATED_DTYPE get_type<{real_type}> (void) {{ return {dtype}; -}}'''.format(dtype = dtype, real_type = dtypes[dtype]) for dtype in sortkey(dtypes)])) +}}'''.format(dtype = dtype, real_type = dtypes[dtype]) for dtype in template.sortkey(dtypes)])) diff --git a/age/templates/data_tmpl.py b/age/templates/data_tmpl.py new file mode 100644 index 000000000..7aecdede5 --- /dev/null +++ b/age/templates/data_tmpl.py @@ -0,0 +1,39 @@ +''' Representation of data conversion files ''' + +import age.templates.template as template + +FILENAME = 'data' + +# EXPORT +header = template.AGE_FILE(FILENAME, template.HEADER_EXT, +'''#ifndef _GENERATED_DATA_HPP +#define _GENERATED_DATA_HPP + +namespace age +{{ + +// uses std containers for type conversion +template +void type_convert (std::vector& out, void* input, + age::_GENERATED_DTYPE intype, size_t nelems) +{{ + switch (intype) + {{ +{typed_conversions} + default: + logs::fatalf("invalid input type %s", + age::name_type(intype).c_str()); + }} +}} + +}} + +#endif // _GENERATED_DATA_HPP +''') + +header.typed_conversions = ('dtypes', lambda dtypes: '\n'.join([ + ''' case {dtype}: + out = std::vector(({real_type}*) input, + ({real_type}*) input + nelems); break;'''.format(\ + dtype=dtype, real_type=dtypes[dtype]) for dtype in template.sortkey(dtypes) +])) diff --git a/age/templates/grader_tmpl.py b/age/templates/grader_tmpl.py index 1c97fd3d0..6f6630f76 100644 --- a/age/templates/grader_tmpl.py +++ b/age/templates/grader_tmpl.py @@ -1,14 +1,9 @@ ''' Representation of gradient mapping files ''' -import template +import age.templates.template as template FILENAME = 'grader' -def sortkey(dic): - arr = dic.keys() - arr.sort() - return arr - # EXPORT header = template.AGE_FILE(FILENAME, template.HEADER_EXT, '''#ifndef _GENERATED_GRADER_HPP @@ -36,7 +31,7 @@ def sortkey(dic): }} ade::TensptrT chain_rule (ade::iFunctor* fwd, - ade::MappedTensor bwd, ade::TensT args, size_t idx) override; + ade::FuncArg bwd, ade::TensT args, size_t idx) override; }}; }} @@ -56,7 +51,7 @@ def sortkey(dic): {{ ade::TensptrT RuleSet::chain_rule (ade::iFunctor* fwd, - ade::MappedTensor bwd, ade::TensT args, size_t idx) + ade::FuncArg bwd, ade::TensT args, size_t idx) {{ switch (fwd->get_opcode().code_) {{ @@ -72,4 +67,4 @@ def sortkey(dic): source.gradops = ('opcodes', lambda opcodes: '\n'.join([ ' case {code}: return {retval};'.format(\ - code = code, retval = opcodes[code]['derivative']) for code in sortkey(opcodes)])) + code = code, retval = opcodes[code]['derivative']) for code in template.sortkey(opcodes)])) diff --git a/age/templates/opera_tmpl.py b/age/templates/opera_tmpl.py index cb65a121e..aec4933de 100644 --- a/age/templates/opera_tmpl.py +++ b/age/templates/opera_tmpl.py @@ -1,14 +1,9 @@ ''' Representation of operation mapping files ''' -import template +import age.templates.template as template FILENAME = 'opmap' -def sortkey(dic): - arr = dic.keys() - arr.sort() - return arr - # EXPORT header = template.AGE_FILE(FILENAME, template.HEADER_EXT, '''#ifndef _GENERATED_OPERA_HPP @@ -28,8 +23,16 @@ def sortkey(dic): }} }} -void op_exec (_GENERATED_OPCODE opcode, _GENERATED_DTYPE dtype, - {data_out} out, ade::Shape shape, {data_in} in); +// GENERIC_MACRO must accept a real type as an argument. +// e.g.: +// #define GENERIC_MACRO(REAL_TYPE) run(args...); +// ... +// TYPE_LOOKUP(GENERIC_MACRO, type_code) +#define TYPE_LOOKUP(GENERIC_MACRO, DTYPE)\\ +switch (DTYPE) {{\\ +{generic_macros}\\ + default: logs::fatal("executing bad type");\\ +}} }} @@ -42,34 +45,8 @@ def sortkey(dic): header.ops = ('opcodes', lambda opcodes: '\n'.join([''' case {code}: {retval}; break;'''.format(\ - code = code, retval = opcodes[code]['operation']) for code in sortkey(opcodes)])) - -# EXPORT -source = template.AGE_FILE(FILENAME, template.SOURCE_EXT, -'''#ifdef _GENERATED_OPERA_HPP - -namespace age -{{ - -void op_exec (_GENERATED_OPCODE opcode, _GENERATED_DTYPE dtype, - {data_out} out, ade::Shape shape, {data_in} in) -{{ - switch (dtype) - {{ -{types} - default: logs::fatal("executing bad type"); - }} -}} - -}} - -#endif -''') - -source.data_in = ('data.data_in', lambda data_in: data_in) - -source.data_out = ('data.data_out', lambda data_out: data_out) + code = code, retval = opcodes[code]['operation']) for code in template.sortkey(opcodes)])) -source.types = ('dtypes', lambda dtypes: '\n'.join([''' case {dtype}: - typed_exec<{real_type}>(opcode, out, shape, in); break;'''.format(\ - dtype = dtype, real_type = dtypes[dtype]) for dtype in sortkey(dtypes)])) +header.generic_macros = ('dtypes', lambda dtypes: '\\\n'.join([ + ' case {dtype}: GENERIC_MACRO({real_type}) break;'.format(\ + dtype = dtype, real_type = dtypes[dtype]) for dtype in template.sortkey(dtypes)])) diff --git a/age/templates/template.py b/age/templates/template.py index b0c2ab646..b1bd7a160 100644 --- a/age/templates/template.py +++ b/age/templates/template.py @@ -39,3 +39,8 @@ def process(self, values): fmt[key] = func(lookup[akeys[-1]]) self._repstr = self.template.format(**fmt) return self + +def sortkey(dic): + arr = list(dic.keys()) + arr.sort() + return arr diff --git a/age/test/ptest.py b/age/test/ptest.py index 787d103eb..e941f52d1 100644 --- a/age/test/ptest.py +++ b/age/test/ptest.py @@ -3,6 +3,7 @@ import age.templates.api_tmpl as api import age.templates.codes_tmpl as codes +import age.templates.data_tmpl as data import age.templates.grader_tmpl as grader import age.templates.opera_tmpl as opera @@ -331,6 +332,42 @@ #endif """ +data_header = """#ifndef _GENERATED_DATA_HPP +#define _GENERATED_DATA_HPP + +namespace age +{ + +// uses std containers for type conversion +template +void type_convert (std::vector& out, void* input, + age::_GENERATED_DTYPE intype, size_t nelems) +{ + switch (intype) + { + case CAR: + out = std::vector((char*) input, + (char*) input + nelems); break; + case KAPOW: + out = std::vector((complex_t*) input, + (complex_t*) input + nelems); break; + case VROOM: + out = std::vector((double*) input, + (double*) input + nelems); break; + case VRUM: + out = std::vector((float*) input, + (float*) input + nelems); break; + default: + logs::fatalf("invalid input type %s", + age::name_type(intype).c_str()); + } +} + +} + +#endif // _GENERATED_DATA_HPP +""" + grader_header = """#ifndef _GENERATED_GRADER_HPP #define _GENERATED_GRADER_HPP @@ -356,7 +393,7 @@ } ade::TensptrT chain_rule (ade::iFunctor* fwd, - ade::MappedTensor bwd, ade::TensT args, size_t idx) override; + ade::FuncArg bwd, ade::TensT args, size_t idx) override; }; } @@ -370,7 +407,7 @@ { ade::TensptrT RuleSet::chain_rule (ade::iFunctor* fwd, - ade::MappedTensor bwd, ade::TensT args, size_t idx) + ade::FuncArg bwd, ade::TensT args, size_t idx) { switch (fwd->get_opcode().code_) { @@ -411,39 +448,23 @@ } } -void op_exec (_GENERATED_OPCODE opcode, _GENERATED_DTYPE dtype, - Out_Type out, ade::Shape shape, In_Type in); - -} - -#endif // _GENERATED_OPERA_HPP -""" - -opera_source = """#ifdef _GENERATED_OPERA_HPP - -namespace age -{ - -void op_exec (_GENERATED_OPCODE opcode, _GENERATED_DTYPE dtype, - Out_Type out, ade::Shape shape, In_Type in) -{ - switch (dtype) - { - case CAR: - typed_exec(opcode, out, shape, in); break; - case KAPOW: - typed_exec(opcode, out, shape, in); break; - case VROOM: - typed_exec(opcode, out, shape, in); break; - case VRUM: - typed_exec(opcode, out, shape, in); break; - default: logs::fatal("executing bad type"); - } +// GENERIC_MACRO must accept a real type as an argument. +// e.g.: +// #define GENERIC_MACRO(REAL_TYPE) run(args...); +// ... +// TYPE_LOOKUP(GENERIC_MACRO, type_code) +#define TYPE_LOOKUP(GENERIC_MACRO, DTYPE)\\ +switch (DTYPE) {\\ + case CAR: GENERIC_MACRO(char) break;\\ + case KAPOW: GENERIC_MACRO(complex_t) break;\\ + case VROOM: GENERIC_MACRO(double) break;\\ + case VRUM: GENERIC_MACRO(float) break;\\ + default: logs::fatal("executing bad type");\\ } } -#endif +#endif // _GENERATED_OPERA_HPP """ def multiline_check(s1, s2): @@ -472,6 +493,11 @@ def test_codes(self): self.assertEqual(codes_header, header) self.assertEqual(codes_source, source) + def test_data(self): + header = str(data.header.process(fields)) + multiline_check(data_header, header) + self.assertEqual(data_header, header) + def test_grader(self): header = str(grader.header.process(fields)) source = str(grader.source.process(fields)) @@ -482,11 +508,8 @@ def test_grader(self): def test_opera(self): header = str(opera.header.process(fields)) - source = str(opera.source.process(fields)) multiline_check(opera_header, header) - multiline_check(opera_source, source) self.assertEqual(opera_header, header) - self.assertEqual(opera_source, source) if __name__ == "__main__": unittest.main() diff --git a/age/test/test_opmap.cpp b/age/test/test_opmap.cpp index 0c1fda17f..ec25aeca4 100644 --- a/age/test/test_opmap.cpp +++ b/age/test/test_opmap.cpp @@ -7,6 +7,22 @@ #include "age/generated/opmap.hpp" +namespace age +{ + +#define TYPE_EXEC_CALL(REAL_TYPE)typed_exec(opcode, out, shape, in); + +void op_exec (_GENERATED_OPCODE opcode, _GENERATED_DTYPE dtype, + SweetPotato& out, ade::Shape shape, Pomegranate& in) +{ + TYPE_LOOKUP(TYPE_EXEC_CALL, dtype); +} + +#undef TYPE_EXEC_CALL + +} + + TEST(AGE, OpmapEminem) { SweetPotato potato; diff --git a/bwd/grader.hpp b/bwd/grader.hpp index 9573f1c3a..54e0ea391 100644 --- a/bwd/grader.hpp +++ b/bwd/grader.hpp @@ -32,7 +32,7 @@ struct iRuleSet /// Generally, /// d(fwd)/d(x) = rule(fwd,args,idx) * reduction_consolidation(bwd) virtual ade::TensptrT chain_rule (ade::iFunctor* fwd, - ade::MappedTensor bwd, ade::TensT args, size_t idx) = 0; + ade::FuncArg bwd, ade::TensT args, size_t idx) = 0; }; /// Traveler to obtain derivative of accepted node with respect to target diff --git a/bwd/src/grader.cpp b/bwd/src/grader.cpp index 64e7c08e0..7864cc9ed 100644 --- a/bwd/src/grader.cpp +++ b/bwd/src/grader.cpp @@ -61,13 +61,13 @@ void Grader::visit (ade::iFunctor* func) for (size_t i : ordered) { ade::TensT args; - ade::MappedTensor& child = children[i]; + ade::FuncArg& child = children[i]; ade::CoordptrT revshaper(child.get_shaper()->reverse()); bool revmapper = !child.map_io(); ade::CoordptrT revcoorder = child.get_coorder(); for (size_t j = 0; j < nchildren; ++j) { - ade::MappedTensor& kid = children[j]; + ade::FuncArg& kid = children[j]; ade::TensptrT tens = kid.get_tensor(); if (j == i) { @@ -77,14 +77,14 @@ void Grader::visit (ade::iFunctor* func) { // reverse children[j] to child's shape/coord space args.push_back(ade::TensptrT(ade::Functor::get(sum, { - ade::MappedTensor( + ade::FuncArg( ade::TensptrT(ade::Functor::get(sum, {kid})), revshaper, revmapper, revcoorder) }))); } } - ade::MappedTensor lhs(bwd, revshaper, revmapper, revcoorder); + ade::FuncArg lhs(bwd, revshaper, revmapper, revcoorder); grads[child.get_tensor().get()].push_back(rules_->chain_rule(parent, lhs, args, i)); } diff --git a/bwd/test/test_grader.cpp b/bwd/test/test_grader.cpp index 25e38593d..b0f717659 100644 --- a/bwd/test/test_grader.cpp +++ b/bwd/test/test_grader.cpp @@ -65,7 +65,7 @@ struct MockRuleSet final : public age::iRuleSet } ade::TensptrT chain_rule (ade::iFunctor* fwd, - ade::MappedTensor bwd, ade::TensT args, size_t idx) override + ade::FuncArg bwd, ade::TensT args, size_t idx) override { ade::Opcode outcode; ade::Opcode fwd_opcode = fwd->get_opcode(); @@ -1055,8 +1055,8 @@ TEST(GRADER, DiffShaperCoorder) ade::CoordptrT rightshaper = ade::permute({0, 3, 1, 2}); ade::CoordptrT leftmapper = ade::permute({1, 3, 0, 2}); ade::CoordptrT rightmapper = ade::permute({1, 2, 0, 3}); - ade::MappedTensor left(leaf, leftshaper, false, leftmapper); - ade::MappedTensor right(leaf1, rightshaper, true, rightmapper); + ade::FuncArg left(leaf, leftshaper, false, leftmapper); + ade::FuncArg right(leaf1, rightshaper, true, rightmapper); ade::TensptrT fwd( ade::Functor::get(mock_rules->sum_opcode(), {left, right})); @@ -1272,8 +1272,8 @@ TEST(GRADER, NoMapAliasing) ade::TensptrT leaf(new MockTensor(ade::Shape(slist))); ade::TensptrT leaf1(new MockTensor(ade::Shape(slist1))); - ade::MappedTensor left = reduce_map(leaf, 3, {4}); - ade::MappedTensor right = ade::identity_map(leaf1); + ade::FuncArg left = reduce_map(leaf, 3, {4}); + ade::FuncArg right = ade::identity_map(leaf1); ade::TensptrT fwd( ade::Functor::get(mock_rules->prod_opcode(), {left, right})); ade::TensptrT fwd2( diff --git a/dbg/ade.hpp b/dbg/ade.hpp index 892dfdbe8..4bc6b4711 100644 --- a/dbg/ade.hpp +++ b/dbg/ade.hpp @@ -28,7 +28,7 @@ struct PrettyEquation final auto& children = f->get_children(); std::vector tens(children.size()); std::transform(children.begin(), children.end(), tens.begin(), - [](const ade::MappedTensor& child) + [](const ade::FuncArg& child) { return child.get_tensor().get(); }); diff --git a/docs/ade_8hpp.html b/docs/ade_8hpp.html index d05adda51..5ffb52167 100644 --- a/docs/ade_8hpp.html +++ b/docs/ade_8hpp.html @@ -80,11 +80,11 @@
- + - - - + + + diff --git a/docs/ade_8hpp__incl.map b/docs/ade_8hpp__incl.map index 6d06dc4b3..1d4dd194c 100644 --- a/docs/ade_8hpp__incl.map +++ b/docs/ade_8hpp__incl.map @@ -1,9 +1,9 @@ - + - - - + + + diff --git a/docs/ade_8hpp__incl.md5 b/docs/ade_8hpp__incl.md5 index 455e0091c..61dbafb95 100644 --- a/docs/ade_8hpp__incl.md5 +++ b/docs/ade_8hpp__incl.md5 @@ -1 +1 @@ -2f70073a3f4df4341f69b62ac125551c \ No newline at end of file +d5bc39bcbf4a4a033a860ed227597b15 \ No newline at end of file diff --git a/docs/ade_8hpp__incl.png b/docs/ade_8hpp__incl.png index e67462cfdd30c8edbf88a345d65bb0f8a1cb350d..a90e88bbd4f324f68b87dfd2421f92d6f721456b 100644 GIT binary patch literal 55346 zcmX`T1yEJ}+cgXbQc5ErE#2K6(j26_OG3K)kRsh6-Q68>=x(ID8>Ab)&HcRpZ{{%0 zIQwjVdtbfQx(NLSlKhDD83_ss>Z7!jxDpf;3>EN0f$$#qACzQ`S>PXNMg1maCu{utuIoq@Q~p4f^k=2#Vof2a>R zNPgi};-ZO*e;_H^4)>$RBj2m*V0_N3yg4&;Nlr=U7huyD7(aD#-DxaoRZvgoO)x9Q z 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

v7L9qOg~{#nP1>_Qs|cr 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 literal 56130 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[detail level 12]

- - - - - - - - + + + + + + + + diff --git a/docs/classes.html b/docs/classes.html index ea518de36..26c32779b 100644 --- a/docs/classes.html +++ b/docs/classes.html @@ -65,27 +65,26 @@
Class Index
-
c | f | g | i | m | o | p | s
+
c | f | g | i | o | p | s
 Nade
 CCoordMap
 CFunctorFunctor of the graph mapping to operators specified by opcode argument
 CGraphStatTraveler that maps each tensor to its subtree's maximum depth
 CiCoordMapInterface for transforming coordinates and reversing the coordinate
 CiFunctorInterface of iOperation-defined operation node
 CiLeafLeaf of the graph commonly representing the variable in an equation
 CiTensorInterface of traversible and differentiable nodes with shape information
 CiTravelerInterface to travel through graph, treating iLeaf and iFunctor differently
 CMappedTensorCoordinate mapper and tensor pair
 CFuncArgCoordinate mapper and tensor pair
 CFunctorFunctor of the graph mapping to operators specified by opcode argument
 CGraphStatTraveler that maps each tensor to its subtree's maximum depth
 CiCoordMapInterface for transforming coordinates and reversing the coordinate
 CiFunctorInterface of iOperation-defined operation node
 CiLeafLeaf of the graph commonly representing the variable in an equation
 CiTensorInterface of traversible and differentiable nodes with shape information
 CiTravelerInterface to travel through graph, treating iLeaf and iFunctor differently
 COpcodeEncoding of operation
 CPathFinder
 CShape
- - + + + - - - - + + + +
  c  
-
  g  
-
iFunctor (ade)   
  o  
-
  s  
-
iLeaf (ade)   
CoordMap (ade)   Grader (age)   iRuleSet (age)   Opcode (ade)   Shape (ade)   
Functor (ade)   iFunctor (ade)   
  p  
+
  g  
+
iLeaf (ade)   
CoordMap (ade)   iRuleSet (age)   PathFinder (ade)   
  f  
-
GraphStat (ade)   iTensor (ade)   
  p  
+
Grader (age)   iTensor (ade)   
  s  
  i  
-
iTraveler (ade)   
Functor (ade)   
  m  
-
PathFinder (ade)   
iCoordMap (ade)   
MappedTensor (ade)   
GraphStat (ade)   iTraveler (ade)   
FuncArg (ade)   
  i  
+
  o  
+
Shape (ade)   
iCoordMap (ade)   Opcode (ade)   
-
c | f | g | i | m | o | p | s
+
c | f | g | i | o | p | s