/*************************************************************************** * Copyright (c) Johan Mabille, Sylvain Corlay and Wolf Vollprecht * * Copyright (c) QuantStack * * * * Distributed under the terms of the BSD 3-Clause License. * * * * The full license is in the file LICENSE, distributed with this software. * ****************************************************************************/ #ifndef XTENSOR_MIME_HPP #define XTENSOR_MIME_HPP #include #include #include #include #include #include "xio.hpp" namespace xt { template void compute_0d_table(std::stringstream& out, P& /*printer*/, const T& expr) { out << ""; out << ""; out << "
";
        out << expr();
        out << "
"; } template void compute_1d_row(std::stringstream& out, P& printer, const std::size_t& row_idx) { out << "
";
        printer.print_next(out);
        out << "
"; } template void compute_1d_table(std::stringstream& out, P& printer, const T& expr, const std::size_t& edgeitems) { const auto& dim = expr.shape()[0]; out << ""; if (edgeitems == 0 || 2 * edgeitems >= dim) { for (std::size_t row_idx = 0; row_idx < dim; ++row_idx) { compute_1d_row(out, printer, row_idx); } } else { for (std::size_t row_idx = 0; row_idx < edgeitems; ++row_idx) { compute_1d_row(out, printer, row_idx); } out << ""; for (std::size_t row_idx = dim - edgeitems; row_idx < dim; ++row_idx) { compute_1d_row(out, printer, row_idx); } } out << "
\u22ee
"; } template void compute_2d_element( std::stringstream& out, P& printer, const std::string& idx_str, const std::size_t& row_idx, const std::size_t& column_idx ) { out << "
";
        printer.print_next(out);
        out << "
"; } template void compute_2d_row( std::stringstream& out, P& printer, const T& expr, const std::size_t& edgeitems, const std::string& idx_str, const std::size_t& row_idx ) { const auto& dim = expr.shape()[expr.dimension() - 1]; out << ""; if (edgeitems == 0 || 2 * edgeitems >= dim) { for (std::size_t column_idx = 0; column_idx < dim; ++column_idx) { compute_2d_element(out, printer, idx_str, row_idx, column_idx); } } else { for (std::size_t column_idx = 0; column_idx < edgeitems; ++column_idx) { compute_2d_element(out, printer, idx_str, row_idx, column_idx); } out << "
\u22ef
"; for (std::size_t column_idx = dim - edgeitems; column_idx < dim; ++column_idx) { compute_2d_element(out, printer, idx_str, row_idx, column_idx); } } out << ""; } template void compute_2d_table( std::stringstream& out, P& printer, const T& expr, const std::size_t& edgeitems, const std::vector& idx ) { const auto& dim = expr.shape()[expr.dimension() - 2]; const auto& last_dim = expr.shape()[expr.dimension() - 1]; std::string idx_str; std::for_each( idx.cbegin(), idx.cend(), [&idx_str](const auto& i) { idx_str += std::to_string(i) + ", "; } ); std::size_t nb_ellipsis = 2 * edgeitems + 1; if (last_dim <= 2 * edgeitems + 1) { nb_ellipsis = last_dim; } out << ""; if (edgeitems == 0 || 2 * edgeitems >= dim) { for (std::size_t row_idx = 0; row_idx < dim; ++row_idx) { compute_2d_row(out, printer, expr, edgeitems, idx_str, row_idx); } } else { for (std::size_t row_idx = 0; row_idx < edgeitems; ++row_idx) { compute_2d_row(out, printer, expr, edgeitems, idx_str, row_idx); } out << ""; for (std::size_t column_idx = 0; column_idx < nb_ellipsis; ++column_idx) { if (column_idx == edgeitems && nb_ellipsis != last_dim) { out << ""; } else { out << ""; } } out << ""; for (std::size_t row_idx = dim - edgeitems; row_idx < dim; ++row_idx) { compute_2d_row(out, printer, expr, edgeitems, idx_str, row_idx); } } out << "
\u22f1
\u22ee
"; } template void compute_nd_row( std::stringstream& out, P& printer, const T& expr, const std::size_t& edgeitems, const std::vector& idx ) { out << ""; compute_nd_table_impl(out, printer, expr, edgeitems, idx); out << ""; } template void compute_nd_table_impl( std::stringstream& out, P& printer, const T& expr, const std::size_t& edgeitems, const std::vector& idx ) { const auto& displayed_dimension = idx.size(); const auto& expr_dim = expr.dimension(); const auto& dim = expr.shape()[displayed_dimension]; if (expr_dim - displayed_dimension == 2) { return compute_2d_table(out, printer, expr, edgeitems, idx); } std::vector idx2 = idx; idx2.resize(displayed_dimension + 1); out << ""; if (edgeitems == 0 || 2 * edgeitems >= dim) { for (std::size_t i = 0; i < dim; ++i) { idx2[displayed_dimension] = i; compute_nd_row(out, printer, expr, edgeitems, idx2); } } else { for (std::size_t i = 0; i < edgeitems; ++i) { idx2[displayed_dimension] = i; compute_nd_row(out, printer, expr, edgeitems, idx2); } out << ""; for (std::size_t i = dim - edgeitems; i < dim; ++i) { idx2[displayed_dimension] = i; compute_nd_row(out, printer, expr, edgeitems, idx2); } } out << "
\u22ef
"; } template void compute_nd_table(std::stringstream& out, P& printer, const T& expr, const std::size_t& edgeitems) { if (expr.dimension() == 0) { compute_0d_table(out, printer, expr); } else if (expr.dimension() == 1) { compute_1d_table(out, printer, expr, edgeitems); } else { std::vector empty_vector; compute_nd_table_impl(out, printer, expr, edgeitems, empty_vector); } } template nlohmann::json mime_bundle_repr_impl(const E& expr) { std::stringstream out; std::size_t edgeitems = 0; std::size_t size = compute_size(expr.shape()); if (size > static_cast(print_options::print_options().threshold)) { edgeitems = static_cast(print_options::print_options().edge_items); } if (print_options::print_options().precision != -1) { out.precision(print_options::print_options().precision); } detail::printer printer(out.precision()); xstrided_slice_vector slice_vector; detail::recurser_run(printer, expr, slice_vector, edgeitems); printer.init(); compute_nd_table(out, printer, expr, edgeitems); auto bundle = nlohmann::json::object(); bundle["text/html"] = out.str(); return bundle; } template class xfunctor_view; template nlohmann::json mime_bundle_repr(const xfunctor_view& expr) { return mime_bundle_repr_impl(expr); } template class xfunction; template nlohmann::json mime_bundle_repr(const xfunction& expr) { return mime_bundle_repr_impl(expr); } template class xarray_container; template nlohmann::json mime_bundle_repr(const xarray_container& expr) { return mime_bundle_repr_impl(expr); } template class xtensor_container; template nlohmann::json mime_bundle_repr(const xtensor_container& expr) { return mime_bundle_repr_impl(expr); } template class xfixed_container; template nlohmann::json mime_bundle_repr(const xfixed_container& expr) { return mime_bundle_repr_impl(expr); } template class xreducer; template nlohmann::json mime_bundle_repr(const xreducer& expr) { return mime_bundle_repr_impl(expr); } template class xoptional_assembly; template nlohmann::json mime_bundle_repr(const xoptional_assembly& expr) { return mime_bundle_repr_impl(expr); } template class xoptional_assembly_adaptor; template nlohmann::json mime_bundle_repr(const xoptional_assembly_adaptor& expr) { return mime_bundle_repr_impl(expr); } template class xscalar; template nlohmann::json mime_bundle_repr(const xscalar& expr) { return mime_bundle_repr_impl(expr); } template class xbroadcast; template nlohmann::json mime_bundle_repr(const xbroadcast& expr) { return mime_bundle_repr_impl(expr); } template class xgenerator; template nlohmann::json mime_bundle_repr(const xgenerator& expr) { return mime_bundle_repr_impl(expr); } template class xview; template nlohmann::json mime_bundle_repr(const xview& expr) { return mime_bundle_repr_impl(expr); } template class xstrided_view; template nlohmann::json mime_bundle_repr(const xstrided_view& expr) { return mime_bundle_repr_impl(expr); } template class xmasked_view; template nlohmann::json mime_bundle_repr(const xmasked_view& expr) { return mime_bundle_repr_impl(expr); } template class xmasked_value; template nlohmann::json mime_bundle_repr(const xmasked_value& v) { auto bundle = nlohmann::json::object(); std::stringstream tmp; tmp << v; bundle["text/plain"] = tmp.str(); return bundle; } } #endif