From cfe5041689cdda15db3019ef527d59f51cdeae12 Mon Sep 17 00:00:00 2001
From: TiKeil <keil.menden@web.de>
Date: Thu, 12 Jul 2018 14:24:40 +0200
Subject: [PATCH] [python] split bindings

---
 python/dune/xt/CMakeLists.txt        |   3 +
 python/dune/xt/bindings.cc           | 101 +-----------------
 python/dune/xt/functions/__init__.py |  11 +-
 python/dune/xt/interfaces.cc         | 148 +++++++++++++++++++++++++++
 python/setup.cfg                     |   2 +-
 5 files changed, 164 insertions(+), 101 deletions(-)
 create mode 100644 python/dune/xt/interfaces.cc

diff --git a/python/dune/xt/CMakeLists.txt b/python/dune/xt/CMakeLists.txt
index 08b4c3c8e..62badeb62 100644
--- a/python/dune/xt/CMakeLists.txt
+++ b/python/dune/xt/CMakeLists.txt
@@ -7,5 +7,8 @@
 #   Rene Milk (2018)
 # ~~~
 
+dune_pybindxi_add_module(_interfaces EXCLUDE_FROM_ALL interfaces.cc)
 dune_pybindxi_add_module(_functions EXCLUDE_FROM_ALL bindings.cc)
+
+add_dune_alberta_flags(GRIDDIM 2 _interfaces)
 add_dune_alberta_flags(GRIDDIM 2 _functions)
diff --git a/python/dune/xt/bindings.cc b/python/dune/xt/bindings.cc
index 57472e2f1..a3ffc1e97 100644
--- a/python/dune/xt/bindings.cc
+++ b/python/dune/xt/bindings.cc
@@ -22,7 +22,6 @@
 #include <python/dune/xt/common/exceptions.bindings.hh>
 #include <python/dune/xt/grid/grids.bindings.hh>
 
-#include <python/dune/xt/functions/interfaces.hh>
 #include <python/dune/xt/functions/constant.hh>
 #include <python/dune/xt/functions/checkerboard.hh>
 #include <python/dune/xt/functions/ESV2007.bindings.hh>
@@ -37,82 +36,17 @@ void addbind_for_Grid(pybind11::module& m)
 {
   using namespace Dune::XT::Functions;
   const auto grid_id = Dune::XT::Grid::bindings::grid_name<G>::value();
-  const auto diff = internal::Combination::difference;
-  const auto sum = internal::Combination::sum;
-  const auto prod = internal::Combination::product;
   const auto g_dim = G::dimension;
 
-  auto i_1_1 = bind_GridFunctionInterface<G, 1, 1>(m, grid_id);
-  auto i_2_1 = bind_GridFunctionInterface<G, 2, 1>(m, grid_id);
-  auto i_3_1 = bind_GridFunctionInterface<G, 3, 1>(m, grid_id);
-  auto i_4_1 = bind_GridFunctionInterface<G, 4, 1>(m, grid_id);
-  auto i_1_3 = bind_GridFunctionInterface<G, 1, 3>(m, grid_id);
-  auto i_3_3 = bind_GridFunctionInterface<G, 3, 3>(m, grid_id);
-
-  //! this generates multiple binds for the same type
-  //! auto i_d_d = bind_GridFunctionInterface<G, g_dim, g_dim>(m, grid_id);
-  auto i_d_d = bind_GridFunctionInterface<G, 2, 2>(m, grid_id);
-
-  bind_combined_GridFunction<G, g_dim, diff, 1, 1, 1, 1>(m, grid_id);
-  addbind_GridFunctionInterface_combined_op<G, g_dim, diff, 1, 1, 1, 1>(i_1_1);
-
-  bind_combined_GridFunction<G, g_dim, diff, 2, 1, 2, 1>(m, grid_id);
-  addbind_GridFunctionInterface_combined_op<G, g_dim, diff, 2, 1, 2, 1>(i_2_1);
-
-  bind_combined_GridFunction<G, g_dim, diff, 3, 1, 3, 1>(m, grid_id);
-  addbind_GridFunctionInterface_combined_op<G, g_dim, diff, 3, 1, 3, 1>(i_3_1);
-
-  bind_combined_GridFunction<G, g_dim, diff, 4, 1, 4, 1>(m, grid_id);
-  addbind_GridFunctionInterface_combined_op<G, g_dim, diff, 4, 1, 4, 1>(i_4_1);
-
-  bind_combined_GridFunction<G, g_dim, diff, 2, 2, 2, 2>(m, grid_id);
-  addbind_GridFunctionInterface_combined_op<G, g_dim, diff, g_dim, g_dim, g_dim, g_dim>(i_d_d);
-
-
-  bind_combined_GridFunction<G, g_dim, sum, 1, 1, 1, 1>(m, grid_id);
-  addbind_GridFunctionInterface_combined_op<G, g_dim, sum, 1, 1, 1, 1>(i_1_1);
-
-  bind_combined_GridFunction<G, g_dim, sum, 2, 1, 2, 1>(m, grid_id);
-  addbind_GridFunctionInterface_combined_op<G, g_dim, sum, 2, 1, 2, 1>(i_2_1);
-
-  bind_combined_GridFunction<G, g_dim, sum, 3, 1, 3, 1>(m, grid_id);
-  addbind_GridFunctionInterface_combined_op<G, g_dim, sum, 3, 1, 3, 1>(i_3_1);
-
-  bind_combined_GridFunction<G, g_dim, sum, 4, 1, 4, 1>(m, grid_id);
-  addbind_GridFunctionInterface_combined_op<G, g_dim, sum, 4, 1, 4, 1>(i_4_1);
-
-  bind_combined_GridFunction<G, g_dim, sum, 2, 2, 2, 2>(m, grid_id);
-  addbind_GridFunctionInterface_combined_op<G, g_dim, sum, g_dim, g_dim, g_dim, g_dim>(i_d_d);
-
-
-  bind_combined_GridFunction<G, g_dim, prod, 1, 1, 1, 1>(m, grid_id);
-  addbind_GridFunctionInterface_combined_op<G, g_dim, prod, 1, 1, 1, 1>(i_1_1);
-
-  bind_combined_GridFunction<G, g_dim, prod, 1, 1, 2, 1>(m, grid_id);
-  addbind_GridFunctionInterface_combined_op<G, g_dim, prod, 1, 1, 2, 1>(i_1_1);
-
-  bind_combined_GridFunction<G, g_dim, prod, 1, 1, 3, 1>(m, grid_id);
-  addbind_GridFunctionInterface_combined_op<G, g_dim, prod, 1, 1, 3, 1>(i_1_1);
-
-  bind_combined_GridFunction<G, g_dim, prod, 1, 1, 4, 1>(m, grid_id);
-  addbind_GridFunctionInterface_combined_op<G, g_dim, prod, 1, 1, 4, 1>(i_1_1);
-
-  bind_combined_GridFunction<G, g_dim, prod, 1, 1, 2, 2>(m, grid_id);
-  addbind_GridFunctionInterface_combined_op<G, g_dim, prod, 1, 1, 2, 2>(i_1_1);
-
-
   bind_CheckerboardFunction<G, g_dim, 1, 1>(m, grid_id);
   bind_CheckerboardFunction<G, g_dim, 2, 1>(m, grid_id);
   bind_CheckerboardFunction<G, g_dim, 3, 1>(m, grid_id);
   bind_CheckerboardFunction<G, g_dim, 4, 1>(m, grid_id);
   bind_CheckerboardFunction<G, g_dim, 1, 3>(m, grid_id);
   bind_CheckerboardFunction<G, g_dim, 3, 3>(m, grid_id);
-  //  bind_CheckerboardFunction<G, g_dim, 1, 2>(m, grid_id);
-  //  bind_CheckerboardFunction<G, g_dim, 1, 3>(m, grid_id);
 
   //  bindings::ESV2007::CutoffFunction<G>::bind(m);
 
-
   bind_Spe10Model1Function<G, g_dim, 1, 1>(m, grid_id);
 
   bind_IndicatorFunction<G, g_dim, 1, 1>(m, grid_id);
@@ -124,45 +58,15 @@ void addbind_for_Grid(pybind11::module& m)
 } // ... addbind_for_Grid(...)
 
 
-PYBIND11_PLUGIN(_functions)
+PYBIND11_MODULE(_functions, m)
 {
   namespace py = pybind11;
   using namespace pybind11::literals;
   using namespace Dune::XT::Functions;
 
-  py::module m("_functions", "dune-xt-functions");
-
-  Dune::XT::Common::bindings::addbind_exceptions(m);
-
   py::module::import("dune.xt.common");
   py::module::import("dune.xt.grid");
-
-  bind_FunctionInterface<1, 1, 1>(m);
-  bind_FunctionInterface<1, 2, 1>(m);
-  bind_FunctionInterface<1, 3, 1>(m);
-  bind_FunctionInterface<1, 4, 1>(m);
-  bind_FunctionInterface<1, 2, 2>(m);
-  bind_FunctionInterface<1, 1, 2>(m);
-  bind_FunctionInterface<1, 1, 3>(m);
-  bind_FunctionInterface<1, 3, 3>(m);
-
-  bind_FunctionInterface<2, 1, 1>(m);
-  bind_FunctionInterface<2, 2, 1>(m);
-  bind_FunctionInterface<2, 3, 1>(m);
-  bind_FunctionInterface<2, 4, 1>(m);
-  bind_FunctionInterface<2, 2, 2>(m);
-  bind_FunctionInterface<2, 1, 2>(m);
-  bind_FunctionInterface<2, 1, 3>(m);
-  bind_FunctionInterface<2, 3, 3>(m);
-
-  bind_FunctionInterface<3, 1, 1>(m);
-  bind_FunctionInterface<3, 2, 1>(m);
-  bind_FunctionInterface<3, 3, 1>(m);
-  bind_FunctionInterface<3, 4, 1>(m);
-  bind_FunctionInterface<3, 2, 2>(m);
-  bind_FunctionInterface<3, 1, 2>(m);
-  bind_FunctionInterface<3, 1, 3>(m);
-  bind_FunctionInterface<3, 3, 3>(m);
+  py::module::import("dune.xt.interfaces");
 
   bind_ConstantFunction<1, 1, 1>(m);
   bind_ConstantFunction<1, 2, 1>(m);
@@ -222,5 +126,4 @@ PYBIND11_PLUGIN(_functions)
   //#endif
 
   Dune::XT::Common::bindings::add_initialization(m, "dune.xt.functions");
-  return m.ptr();
 }
diff --git a/python/dune/xt/functions/__init__.py b/python/dune/xt/functions/__init__.py
index 19fcbc843..ee607e34e 100644
--- a/python/dune/xt/functions/__init__.py
+++ b/python/dune/xt/functions/__init__.py
@@ -12,4 +12,13 @@
 # ~~~
 
 import dune.xt
-from dune.xt._functions import *
\ No newline at end of file
+
+try:
+    from dune.xt._interfaces import *
+    from dune.xt._functions import *
+except ImportError as e:
+    import os
+    import logging
+    if os.environ.get('DXT_PYTHON_DEBUG', False):
+        raise e
+    logging.error('dune-xt-functions bindings not available')
diff --git a/python/dune/xt/interfaces.cc b/python/dune/xt/interfaces.cc
new file mode 100644
index 000000000..fe2dce485
--- /dev/null
+++ b/python/dune/xt/interfaces.cc
@@ -0,0 +1,148 @@
+// This file is part of the dune-xt-functions project:
+//   https://github.com/dune-community/dune-xt-functions
+// Copyright 2009-2018 dune-xt-functions developers and contributors. All rights reserved.
+// License: Dual licensed as BSD 2-Clause License (http://opensource.org/licenses/BSD-2-Clause)
+//      or  GPL-2.0+ (http://opensource.org/licenses/gpl-license)
+//          with "runtime exception" (http://www.dune-project.org/license.html)
+// Authors:
+//   Felix Schindler (2016 - 2017)
+//   Rene Milk       (2018)
+
+#include "config.h"
+
+#include <string>
+#include <vector>
+
+#include <dune/common/parallel/mpihelper.hh>
+
+#include <dune/pybindxi/pybind11.h>
+#include <dune/pybindxi/stl.h>
+
+#include <python/dune/xt/common/bindings.hh>
+#include <python/dune/xt/common/exceptions.bindings.hh>
+#include <python/dune/xt/grid/grids.bindings.hh>
+
+#include <python/dune/xt/functions/interfaces.hh>
+
+#include <python/dune/xt/common/exceptions.bindings.hh>
+
+template <class G>
+void add_bind_for_Grid_interface(pybind11::module& m)
+{
+  using namespace Dune::XT::Functions;
+  const auto grid_id = Dune::XT::Grid::bindings::grid_name<G>::value();
+  const auto diff = internal::Combination::difference;
+  const auto sum = internal::Combination::sum;
+  const auto prod = internal::Combination::product;
+  const auto g_dim = G::dimension;
+
+  auto i_1_1 = bind_GridFunctionInterface<G, 1, 1>(m, grid_id);
+  auto i_2_1 = bind_GridFunctionInterface<G, 2, 1>(m, grid_id);
+  auto i_3_1 = bind_GridFunctionInterface<G, 3, 1>(m, grid_id);
+  auto i_4_1 = bind_GridFunctionInterface<G, 4, 1>(m, grid_id);
+  auto i_1_3 = bind_GridFunctionInterface<G, 1, 3>(m, grid_id);
+  auto i_3_3 = bind_GridFunctionInterface<G, 3, 3>(m, grid_id);
+
+  //! this generates multiple binds for the same type
+  //! auto i_d_d = bind_GridFunctionInterface<G, g_dim, g_dim>(m, grid_id);
+  auto i_d_d = bind_GridFunctionInterface<G, 2, 2>(m, grid_id);
+
+  bind_combined_GridFunction<G, g_dim, diff, 1, 1, 1, 1>(m, grid_id);
+  addbind_GridFunctionInterface_combined_op<G, g_dim, diff, 1, 1, 1, 1>(i_1_1);
+
+  bind_combined_GridFunction<G, g_dim, diff, 2, 1, 2, 1>(m, grid_id);
+  addbind_GridFunctionInterface_combined_op<G, g_dim, diff, 2, 1, 2, 1>(i_2_1);
+
+  bind_combined_GridFunction<G, g_dim, diff, 3, 1, 3, 1>(m, grid_id);
+  addbind_GridFunctionInterface_combined_op<G, g_dim, diff, 3, 1, 3, 1>(i_3_1);
+
+  bind_combined_GridFunction<G, g_dim, diff, 4, 1, 4, 1>(m, grid_id);
+  addbind_GridFunctionInterface_combined_op<G, g_dim, diff, 4, 1, 4, 1>(i_4_1);
+
+  bind_combined_GridFunction<G, g_dim, diff, 2, 2, 2, 2>(m, grid_id);
+  addbind_GridFunctionInterface_combined_op<G, g_dim, diff, g_dim, g_dim, g_dim, g_dim>(i_d_d);
+
+
+  bind_combined_GridFunction<G, g_dim, sum, 1, 1, 1, 1>(m, grid_id);
+  addbind_GridFunctionInterface_combined_op<G, g_dim, sum, 1, 1, 1, 1>(i_1_1);
+
+  bind_combined_GridFunction<G, g_dim, sum, 2, 1, 2, 1>(m, grid_id);
+  addbind_GridFunctionInterface_combined_op<G, g_dim, sum, 2, 1, 2, 1>(i_2_1);
+
+  bind_combined_GridFunction<G, g_dim, sum, 3, 1, 3, 1>(m, grid_id);
+  addbind_GridFunctionInterface_combined_op<G, g_dim, sum, 3, 1, 3, 1>(i_3_1);
+
+  bind_combined_GridFunction<G, g_dim, sum, 4, 1, 4, 1>(m, grid_id);
+  addbind_GridFunctionInterface_combined_op<G, g_dim, sum, 4, 1, 4, 1>(i_4_1);
+
+  bind_combined_GridFunction<G, g_dim, sum, 2, 2, 2, 2>(m, grid_id);
+  addbind_GridFunctionInterface_combined_op<G, g_dim, sum, g_dim, g_dim, g_dim, g_dim>(i_d_d);
+
+
+  bind_combined_GridFunction<G, g_dim, prod, 1, 1, 1, 1>(m, grid_id);
+  addbind_GridFunctionInterface_combined_op<G, g_dim, prod, 1, 1, 1, 1>(i_1_1);
+
+  bind_combined_GridFunction<G, g_dim, prod, 1, 1, 2, 1>(m, grid_id);
+  addbind_GridFunctionInterface_combined_op<G, g_dim, prod, 1, 1, 2, 1>(i_1_1);
+
+  bind_combined_GridFunction<G, g_dim, prod, 1, 1, 3, 1>(m, grid_id);
+  addbind_GridFunctionInterface_combined_op<G, g_dim, prod, 1, 1, 3, 1>(i_1_1);
+
+  bind_combined_GridFunction<G, g_dim, prod, 1, 1, 4, 1>(m, grid_id);
+  addbind_GridFunctionInterface_combined_op<G, g_dim, prod, 1, 1, 4, 1>(i_1_1);
+
+  bind_combined_GridFunction<G, g_dim, prod, 1, 1, 2, 2>(m, grid_id);
+  addbind_GridFunctionInterface_combined_op<G, g_dim, prod, 1, 1, 2, 2>(i_1_1);
+} // ... addbind_for_Grid(...)
+
+
+PYBIND11_MODULE(_interfaces, m)
+{
+  namespace py = pybind11;
+  using namespace pybind11::literals;
+  using namespace Dune::XT::Functions;
+
+  py::module::import("dune.xt.common");
+  py::module::import("dune.xt.grid");
+
+  bind_FunctionInterface<1, 1, 1>(m);
+  bind_FunctionInterface<1, 2, 1>(m);
+  bind_FunctionInterface<1, 3, 1>(m);
+  bind_FunctionInterface<1, 4, 1>(m);
+  bind_FunctionInterface<1, 2, 2>(m);
+  bind_FunctionInterface<1, 1, 2>(m);
+  bind_FunctionInterface<1, 1, 3>(m);
+  bind_FunctionInterface<1, 3, 3>(m);
+
+  bind_FunctionInterface<2, 1, 1>(m);
+  bind_FunctionInterface<2, 2, 1>(m);
+  bind_FunctionInterface<2, 3, 1>(m);
+  bind_FunctionInterface<2, 4, 1>(m);
+  bind_FunctionInterface<2, 2, 2>(m);
+  bind_FunctionInterface<2, 1, 2>(m);
+  bind_FunctionInterface<2, 1, 3>(m);
+  bind_FunctionInterface<2, 3, 3>(m);
+
+  bind_FunctionInterface<3, 1, 1>(m);
+  bind_FunctionInterface<3, 2, 1>(m);
+  bind_FunctionInterface<3, 3, 1>(m);
+  bind_FunctionInterface<3, 4, 1>(m);
+  bind_FunctionInterface<3, 2, 2>(m);
+  bind_FunctionInterface<3, 1, 2>(m);
+  bind_FunctionInterface<3, 1, 3>(m);
+  bind_FunctionInterface<3, 3, 3>(m);
+
+  add_bind_for_Grid_interface<Dune::YaspGrid<1, Dune::EquidistantOffsetCoordinates<double, 1>>>(m);
+  add_bind_for_Grid_interface<Dune::YaspGrid<2, Dune::EquidistantOffsetCoordinates<double, 2>>>(m);
+#if HAVE_DUNE_ALUGRID
+  add_bind_for_Grid_interface<Dune::ALUGrid<2, 2, Dune::simplex, Dune::conforming>>(m);
+#endif
+#if HAVE_UG
+  add_bind_for_Grid_interface<Dune::UGGrid<2>>(m);
+#endif
+  //#if HAVE_ALBERTA
+  //  addbind_for_Grid<Dune::AlbertaGrid<2, 2>>(m, "2d_simplex_albertagrid");
+  //#endif
+
+  Dune::XT::Common::bindings::add_initialization(m, "dune.xt.functions");
+}
diff --git a/python/setup.cfg b/python/setup.cfg
index 1dd0ffda4..d1b3bbae1 100644
--- a/python/setup.cfg
+++ b/python/setup.cfg
@@ -34,7 +34,7 @@ python_files = test/*.py
 python_class = Test
 pep8maxlinelength = 120
 pep8ignore = E221,E226,E241,E242
-addopts= --cov dune/ -p no:warnings
+addopts= --cov dune/ -p no:warnings -s
 
 [metadata]
 # this is mandatory to lave license end up in .whl
-- 
GitLab