From 75c823c04b3bd55e4a16db56e07b86c979f13cdb Mon Sep 17 00:00:00 2001 From: ZheyuYe Date: Mon, 10 Aug 2020 16:31:24 +0800 Subject: [PATCH] Squashed commit of the following: commit d0e17e561f128c1866ed2065519bdffd95407b27 Author: Ke Han <38852697+hanke580@users.noreply.github.com> Date: Mon Aug 10 12:48:56 2020 +0800 [Numpy] FFI: sort, argsort, vstack etc (#17857) * * sort FFI * * argsort FFI * * vstack, row_stack FFI * * greater FFI * * inner FFI * multinomial FFI * rand FFI * randn FFI * * Fix input out of index and rscalar of greater * * Fix ndarray situation * * Fix sanity * fix lint * fix bugs * * Remove duplicate operator (greater) * * Fix Tuple downcast Error (Only Integer) * Fix segmentation fault(pointer) Co-authored-by: Sheng Zha commit 5c504752711afbc80704117d9fd8052a14a3afcf Author: Liu, Hao Date: Mon Aug 10 08:15:22 2020 +0800 fix pooling_convention warning when convert model to onnx (#18529) * fix pooling_convention warning * fix pooling_convention warning * fix lint Co-authored-by: JackieWu commit d52d9c6f802291713db3330d19bb801a7b9854d5 Author: Sheng Zha Date: Sun Aug 9 13:33:03 2020 -0700 Revert "Add SOVERSION when build shared libmxnet.so library (#17815)" (#18882) This reverts commit d101c3c2d81c2e7e813243e163bfc5aa7a0b3aa3. commit 706c369fd0b7eb302d81bf2c7862baaea7eeed30 Author: Ziyue Huang Date: Sun Aug 9 07:55:16 2020 +0800 fix trainer when the model involves share_parameters (#18880) * fix trainer when using shared_param * add unittest commit cf908fd48384b8b0d3f2ecea1495a007b9aedfdb Author: Xingjian Shi Date: Fri Aug 7 19:55:36 2020 -0700 [Numpy][Bugfix] Add hybridization test to loss layers (#18876) * Test for hybridization * fix typo * fix * fix test * update * Update loss.py * fix bug of sum commit d5fdcbf3bae3ea85cb89394147db4b1da0105fb4 Author: Haibin Lin Date: Fri Aug 7 18:11:16 2020 -0700 drop list support for gluon trainer (#18877) Co-authored-by: Ubuntu commit dde635f8c7666e205816da8ca4e519d0d213523f Author: Leonard Lausen Date: Fri Aug 7 21:16:24 2020 +0000 Re-enable the linker version scripts for binary distribution (#18872) * Symbol visibility * Fix commit 1694d2f037457f304fd94ad98b78e373fa1053ac Author: Sheng Zha Date: Fri Aug 7 11:21:22 2020 -0700 [CI] remove data.mxnet.io usage for CI stability (#18871) * remove duplicate mnist functions * remove data.mxnet.io usage in tests * add waitall commit 708a9002d9388eeb6f00b89cdaa4dbc4861ce65f Author: Serge Panev Date: Fri Aug 7 10:46:22 2020 -0700 Fix a bug in MXNet-TensorRT (#18870) Signed-off-by: Serge Panev commit d101c3c2d81c2e7e813243e163bfc5aa7a0b3aa3 Author: Gustavo Alvarez <462213+sl1pkn07@users.noreply.github.com> Date: Fri Aug 7 04:34:51 2020 +0200 Add SOVERSION when build shared libmxnet.so library (#17815) https://en.wikipedia.org/wiki/Soname https://cmake.org/cmake/help/latest/prop_tgt/SOVERSION.html Co-authored-by: Leonard Lausen commit a3eabf0d29eaeb03766dd52ef403650a4804f369 Author: Leonard Lausen Date: Thu Aug 6 15:52:52 2020 +0000 Fix MXLibInfoCompiledWithCXX11ABI (#18864) * Fix MXLibInfoCompiledWithCXX11ABI * Fix test commit 84f898409a7a52fb031db770e801a992f9e9362b Author: bgawrych Date: Thu Aug 6 04:32:39 2020 +0200 ElementWiseSum fix for oneDNN (#18859) * Fix ElementwiseSum for DNNL * Add test for oneDNN ElemwiseSum Co-authored-by: Bart Gawrych commit a78f137eb10705add4987b99f7664e6fcc2e6db2 Author: Yang Shi Date: Wed Aug 5 14:24:46 2020 -0700 improve python api website ux - make toc sticky (#18863) commit 0f65ef614ecc1b286e3e67076c2e54c4a48b359a Author: Xi Wang Date: Wed Aug 5 10:48:50 2020 +0800 nb fix (#18858) commit 7b7cef5e0ba4a95fdfed55e6c8ba1aff59e6fc91 Author: Serge Panev Date: Tue Aug 4 18:23:48 2020 -0700 MXNet-TRT: Add PrePartition param caching - move init_tensorrt_params logic (#18490) * Update to TRT 7 API Signed-off-by: Serge Panev * Add PrePartition param caching - move init_tensorrt_params logic Signed-off-by: Serge Panev * Handle node with no defined input Signed-off-by: Serge Panev * Remove tmp comment Signed-off-by: Serge Panev commit 59e200a336e05e7458a8434fa3d0ae5547bd337f Author: Haibin Lin Date: Tue Aug 4 17:01:23 2020 -0700 fix nn.dense doc (#18830) Co-authored-by: Lin commit 2e97226585fd0e41761cd8324d0cc1cafc1d318f Author: Leonard Lausen Date: Tue Aug 4 21:11:32 2020 +0000 Fix edge case when casting gluon Block before export (#18853) * Fix edge case when casting gluon Block before export Fixes https://github.com/apache/incubator-mxnet/issues/18843 * Fix gpu test commit b8eccc86754f39ba8acaee92eeec04637e61e261 Author: Yang Shi Date: Tue Aug 4 14:08:09 2020 -0700 fix set default website version rewrite rule for cdn (#18856) commit 7a402194be54397ca31a493c5f0b936cff6f7419 Author: Serge Panev Date: Tue Aug 4 10:34:21 2020 -0700 Remove check for subgraph with cycles (#18555) * Remove check for subgraph with cycles Signed-off-by: Serge Panev * Add comments Signed-off-by: Serge Panev commit 95fa63f765f33b13c29c7b1c0822d2502eb16721 Author: Serge Panev Date: Mon Aug 3 17:15:02 2020 -0700 Update the onnx-tensorrt submodule - CI to TRT7 (#18574) commit 7f2e314294bb3bc97ddfb6d98d7c27580db62ea7 Author: Haibin Lin Date: Mon Aug 3 16:09:48 2020 -0700 update setup.py (#18850) * update setup.py * update python version Co-authored-by: Lin commit f872b43407ccfb7d17fe7492c7d869b83194f3a6 Author: Leonard Lausen Date: Mon Aug 3 20:11:06 2020 +0000 Protobuf_USE_STATIC_LIBS must be set on Apple too (#18851) Fixes https://github.com/apache/incubator-mxnet/issues/18840 commit 4bb82245ee5fcbfd32da6461f7b0770ae3c2d9b6 Author: Yang Shi Date: Mon Aug 3 12:30:13 2020 -0700 Fixed python website double scroller and improve UX (#18845) * make python site header scroll aware and avoid double scroller * add compiled assets * adjust python site second header height * add new line * set focus to main content on DOM load commit 7a5a48835b656786730488f1ec647862670aa53a Author: Iblis Lin Date: Tue Aug 4 03:28:08 2020 +0800 Fix broken link in docs/README.md (#18847) commit 534cdbca4c1a8b36219529cecf12a6fc1d768398 Author: Sheng Zha Date: Mon Aug 3 11:58:33 2020 -0700 Create greetings.yml (#18842) commit 9fd2cce3c9d10abab7c4c8b039c78d0ad8d8c91f Author: kpuatamazon <56725192+kpuatamazon@users.noreply.github.com> Date: Mon Aug 3 17:40:44 2020 +0100 Update tests/README.md Docker instructions to match ci/README.md (#18848) Documentation was missing python3-docker and had an outdated platform. commit 54b9e9c8d063fa00853e6cf80d22c922014e3e67 Author: Sheng Zha Date: Mon Aug 3 08:59:33 2020 -0700 remove unnecessary usage of pretrained models, and prefer smaller size (#18844) commit 51340d8f40721e03938e0021c6cbb557a44dd90e Author: Haibin Lin Date: Sat Aug 1 16:23:03 2020 -0700 Add compiled_with_cxx11_abi API (#18836) * draft * add impl * add test * set default val Co-authored-by: Ubuntu commit 5a22193b5588848a2c0879ea17b4d7a0bcfdddc7 Author: Sheng Zha Date: Fri Jul 31 17:06:17 2020 -0700 [NumPy] allow mixed array types (#18562) * allow mixed types in array func protocol * fix #18746 * add support for memory share check commit 08a5ee33319990db56d53abf3cf2bf46b91fa705 Author: Tao Lv Date: Sat Aug 1 03:38:20 2020 +0800 fix gelu to use erf based algorithm (#18827) commit ac3608932f507e3f41f79d814ba31bb8f83fec3a Author: Leonard Lausen Date: Fri Jul 31 04:54:10 2020 +0000 Fixup move gluon.metric api docs (#18748) * Fix metric API page * Update index.rst commit 7a240061bbaa5fc4dfcdd59945136ebcd854edc3 Author: Leonard Lausen Date: Fri Jul 31 02:58:55 2020 +0000 Enable DIST_KVSTORE by default in staticbuild (#18796) * Enable DIST_KVSTORE by default in staticbuild set(USE_DIST_KVSTORE ON CACHE BOOL "Build with DIST_KVSTORE support") * Ensure static linkage of dependencies * Fix for OS X * Fix shell syntax * Alternate approach to force static linkage of libprotobuf commit aa53291855b74f9a5dbf4707555bd3965a3c2e18 Author: Yang Shi Date: Thu Jul 30 19:53:27 2020 -0700 add adaptive left margin for python site document body (#18828) commit 045efb27842e850f6ddf7c48e5c16e5678508443 Author: Sheng Zha Date: Thu Jul 30 19:19:33 2020 -0700 [NumPy] DLPack refactor and npx.from_numpy (#18656) * refactor dlpack and add from_numpy to npx * remove reference of DeepNumPy * map platform-dependent types to fixed-size types * update DMLC_LOG_FATAL_THROW * fix flaky * fix flaky * test no error commit 608afef6fb69129730f4c18d0e42f5a8ac2078a7 Author: Xi Wang Date: Fri Jul 31 02:30:25 2020 +0800 Fix dirichlet flaky tests (#18817) * make parameter smoother * minor changes commit 6bbd53107aa16fc41e8d462cf5dc46fb70d592df Author: Leonard Lausen Date: Wed Jul 29 20:31:19 2020 +0000 Update clang-tidy integration (#18815) Run clang-tidy via cmake only on the code managed by mxnet (and not 3rdparty dependencies), update to clang-tidy-10 and run clang-tidy-10 -fix to fix all the warnings that are enforced on CI. Developers can run clang-tidy by specifying the -DCMAKE_CXX_CLANG_TIDY="clang-tidy-10" to cmake, or using the python ci/build.py -R --platform ubuntu_cpu /work/runtime_functions.sh build_ubuntu_cpu_clang_tidy script. commit b685fada9caadb4ca5d41eadd2d7ba1bc8322472 Author: Yang Shi Date: Wed Jul 29 12:22:12 2020 -0700 use regex that is supported by all browsers (#18811) commit 9308acaa6b8ed92bf428059c9705e433faf4e53b Author: Yang Shi Date: Wed Jul 29 12:21:42 2020 -0700 remove other language bindings section from website api page (#18783) * remove other language bindings section from api page * remove language binding docs redirect * add call for contribution banner * modify call for contribution wording Co-authored-by: Aaron Markham * more wording modification Co-authored-by: Aaron Markham * add hyperlink to 1.x version in banner * add reference to the C api deprecation github issue Co-authored-by: Aaron Markham commit 915f6b43de409ec7fbf0373d270e9d4a05621fe2 Author: Yang Shi Date: Wed Jul 29 11:28:37 2020 -0700 Remove deepnumpy reference and move Numpy tutorials to top level (#18798) * move np tutorials to top level * replace deepnumpy reference to np * add info in card * remove useless entry * replace NDArray API card with np.ndarray * python site refactor * remove duplicated drawer and refactor layout * extend document width to 100% for xl devices commit e9829e71a7f536d0fc78a0faf96f31336987770e Author: Joe Evans Date: Tue Jul 28 18:53:29 2020 -0700 Cherry-pick large tensor support from #18752. (#18804) Co-authored-by: Joe Evans commit 126636cc4497d5db21a2430d4bb83d4c5a36e0d1 Author: Leonard Lausen Date: Tue Jul 28 22:11:20 2020 +0000 Fix naming in runtime_functions.sh (#18795) commit f83dbac14e21273c8b1bf88a7dbf5c2a3a39b363 Author: Haibin Lin Date: Tue Jul 28 11:48:05 2020 -0700 remove executor manager from API doc (#18802) Co-authored-by: Lin commit 7908d7eb56fc9d20c12afffd8ea592b959b80bfc Author: Yiyan66 <57363390+Yiyan66@users.noreply.github.com> Date: Tue Jul 28 15:11:19 2020 +0800 [numpy] fix flaky mixed precision binary error (#18660) * temp * change test * fix bad func call * test * rectify * doc * change test commit a807f6de32213cfec9462c8df2ca1fad4f9bcbad Author: Sheng Zha Date: Mon Jul 27 22:06:50 2020 -0700 [NumPy] loss for np array (#17196) * loss for np/nd array * fix flaky commit 74430a92f5232808a169c9e238a419789a5c2fda Author: phile Date: Tue Jul 28 06:44:54 2020 +0800 remove NLL in metric (#18794) commit 9e77e8134efd80f5ca701a3f1d03c036af7749f2 Author: Przemyslaw Tredak Date: Mon Jul 27 14:27:52 2020 -0700 Update CUB and include it only for CUDA < 11 (#18799) commit 98b3f73bd0f30034e3f6848eb75d38c30c8b60b4 Author: Sheng Zha Date: Sat Jul 25 16:19:36 2020 -0700 add support for np.ndarray in autograd.function (#18790) commit c1db2d5636a98084392b90ad3f020a9f9d197852 Author: Leonard Lausen Date: Sat Jul 25 16:58:45 2020 +0000 Remove caffe plugin (#18787) * Remove caffe plugin * Fix * Remove CXX14 feature flag * Update test commit 2fbd1827ad83ef17f74c5412bcc09e30bdc146db Author: Leonard Lausen Date: Sat Jul 25 02:48:30 2020 +0000 Split up CI sanity test functions to enable fine-grained trigger (#18786) Developers can now trigger fine grained checks: python ci/build.py -R --platform ubuntu_cpu /work/runtime_functions.sh sanity_python python ci/build.py -R --platform ubuntu_cpu /work/runtime_functions.sh sanity_license etc commit 06b5d227bb5a8b35246f46b151cfda0d57e5cef8 Author: Serge Panev Date: Fri Jul 24 14:22:42 2020 -0700 ONNX import: use Conv pad attribute for symmetrical padding (#18675) Signed-off-by: Serge Panev commit e31ad77307cea634df9a8959ccff8e56be7611be Author: Yang Shi Date: Thu Jul 23 11:33:31 2020 -0700 set website default version to current stable (1.6) version (#18738) * set website default version - test redirect * enable first time redirect on all master website pages * update test code * remove unnecessary test code * fix typo * delete test code commit 02ae456ef0e4eef86455b0a39d5ccabfd5b29668 Author: Dick Carter Date: Thu Jul 23 11:17:10 2020 -0700 Improve environment variable handling in unittests (#18424) This PR makes it easy to create unittests that require specific settings of environment variables, while avoiding the pitfalls (discussed in comments section). This PR can be considered a recasting and expansion of the great vision of @larroy in creating the EnvManager class in #13140. In its base form, the facility is a drop-in replacement for EnvManager, and is called 'environment': with environment('MXNET_MY_NEW_FEATURE', '1'): with environment('MXNET_MY_NEW_FEATURE', '0'): Like EnvManager, this facility takes care of the save/restore of the previous environment variable state, including when exceptions are raised. In addition though, this PR introduces the features: A similarly-named unittest decorator: @with_environment(key, value) The ability to pass in multiple env vars as a dict (as is needed for some tests) in both forms, so for example: with environment({'MXNET_FEATURE_A': '1', 'MXNET_FEATURE_B': '1'}): Works on Windows! This PR includes a wrapping of the backend's setenv() and getenv() functions, and uses this direct access to the backend environment to keep it in sync with the python environment. This works around the problem that the C Runtime on Windows gets a snapshot of the Python environment at startup that is immutable from Python. with environment() has a simple implementation using the @contextmanager decorator Tests are included that validate the facility works with all combinations of before_val/set_val, namely unset/unset, unset/set, set/unset, set/set. There were 5 unittests previously using EnvManager, and this PR shifts those uses to with environment():, while converting over 20 other ad-hoc uses of os.environ[] within the unittests. This PR also enables those unittests that were bypassed on Windows (due to the inability to set environment variables) to run on all platforms. Further Comments Environment variables are a two-edged sword- they enable useful operating modes for testing, debugging or niche applications, but like all features they must be tested. The correct approach for testing with a particular env var setting is: def set_env_var(key, value): if value is None: os.environ.pop(key, None) else: os.environ[key] = value old_env_var_value = os.environ.get(env_var_name) try: set_env_var(env_var_name, test_env_var_value) finally: set_env_var(env_var_name, old_env_var_value ) The above code makes no assumption about whether the before-test and within-test state of the env var is set or unset, and restores the prior environment even if the test raises an exception. This represents a lot of boiler-plate code that could be potentially mishandled. The with environment() context makes it simple to handle all this properly. If an entire unittest wants a forced env var setting, then using the @with_environment() decorator avoids the code indent of the with environment() approach if used otherwise within the test. commit 18af71eebcd391c4d2a52b5bcdcc633df3e76603 Author: Leonard Lausen Date: Thu Jul 23 18:09:10 2020 +0000 CI: Migrate remaining Dockerfiles to docker-compose.yml and remove unused code (#18771) * Migrate remaining Dockerfiles to docker-compose.yml - Delete unused Dockerfiles - Delete unused install/*.sh scripts - Consolidate ubuntu_gpu_tensorrt and ubuntu_gpu - Remove deprecated logic in ci/build.py (no longer needed with docker-compose) - Remove ci/docker_cache.py (no longer needed with docker-compose) * Fix * Fix * Fix ubuntu_cpu_jekyll commit 1928117cee718bcdcd3bc1408940c8747f4c840e Author: Przemyslaw Tredak Date: Tue Jul 21 23:35:15 2020 -0700 Fix crash when accessing already destructed static variables (#18768) commit a330a022d4c32b9096c4b6d7066a936d6eef59a1 Author: Leonard Lausen Date: Wed Jul 22 06:31:47 2020 +0000 Fix mx.symbol.numpy._Symbol.__deepcopy__ logic error (#18686) * Fix mx.symbol.numpy._Symbol.__deepcopy__ logic error Performed shallow copy instead of deep copy * Test * Fix test commit 9548b0c64005320c44f54a726929bc0b179452da Author: Leonard Lausen Date: Tue Jul 21 21:42:01 2020 +0000 Remove duplicate settings in .codecov.yml (#18763) New PRs started showing the codecov/project badge again due apparent change in codecov's backend resolving these duplicate options specified in .codecov.yml --- CMakeLists.txt | 35 ++++--- benchmark/python/ffi/benchmark_ffi.py | 11 ++- cmake/libmxnet.sym | 15 +++ cmake/libmxnet.ver | 19 ++++ config/distribution/darwin_cpu.cmake | 1 - config/distribution/linux_cpu.cmake | 1 - config/distribution/linux_cu100.cmake | 1 - config/distribution/linux_cu101.cmake | 1 - config/distribution/linux_cu102.cmake | 1 - .../deploy/run-on-aws/use_sagemaker.rst | 19 +--- .../themes/mx-theme/mxtheme/layout.html | 1 + .../static/sphinx_materialdesign_theme.css | 2 +- .../sphinx_materialdesign_theme.css.map | 2 +- .../themes/mx-theme/src/js/feedback.js~HEAD | 33 +++++++ .../themes/mx-theme/src/js/feedback.js~HEAD_0 | 33 +++++++ .../src/js/feedback.js~upstream_master | 33 +++++++ .../src/js/feedback.js~upstream_master_0 | 33 +++++++ .../mx-theme/src/scss/layout/_layout.scss | 3 +- docs/static_site/src/pages/api/faq/cloud.md | 32 +------ example/gluon/image_classification.py | 3 +- include/mxnet/c_api.h | 2 +- .../contrib/onnx/mx2onnx/_op_translations.py | 41 +++++--- python/mxnet/gluon/loss.py | 45 +++++---- python/mxnet/gluon/trainer.py | 46 +++++---- python/mxnet/library.py | 19 +++- python/mxnet/ndarray/numpy/_op.py | 8 +- python/mxnet/ndarray/numpy/random.py | 14 +-- python/mxnet/symbol/numpy/_symbol.py | 2 +- python/mxnet/test_utils.py | 73 +++++--------- src/api/operator/numpy/np_matrix_op.cc | 20 ++++ src/api/operator/numpy/np_ordering_op.cc | 88 +++++++++++++++++ .../numpy/random/np_multinomial_op.cc | 75 +++++++++++++++ src/c_api/c_api.cc | 10 +- src/operator/numpy/np_matrix_op-inl.h | 5 + src/operator/numpy/random/np_multinomial_op.h | 10 ++ src/operator/subgraph/tensorrt/tensorrt-inl.h | 2 +- src/operator/tensor/elemwise_sum.cc | 15 +-- src/operator/tensor/ordering_op-inl.h | 18 ++++ tests/nightly/dist_async_kvstore.py | 2 +- tests/nightly/dist_device_sync_kvstore.py | 2 +- tests/nightly/dist_sync_kvstore.py | 6 +- tests/nightly/download.sh | 38 -------- tests/python/gpu/test_gluon_model_zoo_gpu.py | 2 +- tests/python/mkl/test_mkldnn.py | 24 ++++- .../test_contrib_gluon_data_vision.py | 3 +- tests/python/unittest/test_gluon.py | 4 +- tests/python/unittest/test_gluon_data.py | 2 +- tests/python/unittest/test_gluon_trainer.py | 64 ++++++++++--- tests/python/unittest/test_image.py | 2 +- .../test_numpy_contrib_gluon_data_vision.py | 2 +- tests/python/unittest/test_numpy_loss.py | 94 +++++++++++++++++-- tests/python/unittest/test_runtime.py | 4 +- 52 files changed, 744 insertions(+), 277 deletions(-) create mode 100644 cmake/libmxnet.sym create mode 100644 cmake/libmxnet.ver create mode 100644 docs/python_docs/themes/mx-theme/src/js/feedback.js~HEAD create mode 100644 docs/python_docs/themes/mx-theme/src/js/feedback.js~HEAD_0 create mode 100644 docs/python_docs/themes/mx-theme/src/js/feedback.js~upstream_master create mode 100644 docs/python_docs/themes/mx-theme/src/js/feedback.js~upstream_master_0 create mode 100644 src/api/operator/numpy/np_ordering_op.cc create mode 100644 src/api/operator/numpy/random/np_multinomial_op.cc delete mode 100644 tests/nightly/download.sh diff --git a/CMakeLists.txt b/CMakeLists.txt index 2c86dd9d0f7d..0b75c779d0ad 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -312,20 +312,6 @@ include_directories("3rdparty/tvm/include") include_directories("3rdparty/dmlc-core/include") include_directories("3rdparty/dlpack/include") -# commented out until PR goes through -#if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/dlpack) -# add_subdirectory(3rdparty/dlpack) -#endif() - -# Prevent stripping out symbols (operator registrations, for example) -if(NOT MSVC AND NOT APPLE) - set(BEGIN_WHOLE_ARCHIVE -Wl,--whole-archive) - set(END_WHOLE_ARCHIVE -Wl,--no-whole-archive) -elseif(CMAKE_CXX_COMPILER_ID MATCHES "Clang") - # using regular Clang or AppleClang - set(BEGIN_WHOLE_ARCHIVE -Wl,-force_load) -endif() - if(UNIX) find_library(RTLIB rt) if(RTLIB) @@ -665,6 +651,18 @@ if(UNIX) target_compile_options(mxnet PUBLIC "--coverage") target_link_libraries(mxnet PUBLIC gcov) endif() + if(CMAKE_BUILD_TYPE STREQUAL "Distribution") + # TODO For handling mxnet's symbols the following can be replace by + # annotating symbol visibility in source code, specifying + # set(CMAKE_CXX_VISIBILITY_PRESET hidden) and + # set(CMAKE_VISIBILITY_INLINES_HIDDEN ON) + # Symbols from statically linked libraries can be discarded via -Wl,--exclude-libs,ALL + if(APPLE) + set_target_properties(mxnet PROPERTIES LINK_FLAGS "-Wl,-exported_symbols_list,${PROJECT_SOURCE_DIR}/cmake/libmxnet.sym") + else() + set_target_properties(mxnet PROPERTIES LINK_FLAGS "-Wl,--version-script=${PROJECT_SOURCE_DIR}/cmake/libmxnet.ver") + endif() + endif() elseif(MSVC) if(USE_CUDA) if(USE_SPLIT_ARCH_DLL) @@ -834,8 +832,12 @@ endif() include(GNUInstallDirs) install(TARGETS mxnet RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + COMPONENT MXNET_Runtime LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + COMPONENT MXNET_Runtime + NAMELINK_COMPONENT MXNET_Development ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + COMPONENT MXNET_Development ) install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/dlpack/include/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/dmlc-core/include/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) @@ -876,7 +878,10 @@ if(INSTALL_PYTHON_VERSIONS) endforeach() endif() -add_subdirectory(tests) +if(NOT CMAKE_BUILD_TYPE STREQUAL "Distribution") + # Staticbuild applies linker version script to hide private symbols, breaking unit tests + add_subdirectory(tests) +endif() # ---[ Linter target find_package(Python3) diff --git a/benchmark/python/ffi/benchmark_ffi.py b/benchmark/python/ffi/benchmark_ffi.py index df4ace2d95af..919c72f34a55 100644 --- a/benchmark/python/ffi/benchmark_ffi.py +++ b/benchmark/python/ffi/benchmark_ffi.py @@ -62,7 +62,6 @@ def prepare_workloads(): OpArgMngr.add_workload("nan_to_num", pool['2x2']) OpArgMngr.add_workload("tri", 2, 3, 4) OpArgMngr.add_workload("tensordot", pool['2x2'], pool['2x2'], ((1, 0), (0, 1))) - OpArgMngr.add_workload("kron", pool['2x2'], pool['2x2']) OpArgMngr.add_workload("cumsum", pool['3x2'], axis=0, out=pool['3x2']) OpArgMngr.add_workload("random.shuffle", pool['3']) OpArgMngr.add_workload("equal", pool['2x2'], pool['2x2']) @@ -100,11 +99,14 @@ def prepare_workloads(): OpArgMngr.add_workload("trace", pool['2x2']) OpArgMngr.add_workload("transpose", pool['2x2']) OpArgMngr.add_workload("split", pool['3x3'], (0, 1, 2), axis=1) + OpArgMngr.add_workload("vstack", (pool['3x3'], pool['3x3'], pool['3x3'])) OpArgMngr.add_workload("argmax", pool['3x2'], axis=-1) OpArgMngr.add_workload("argmin", pool['3x2'], axis=-1) OpArgMngr.add_workload("atleast_1d", pool['2'], pool['2x2']) OpArgMngr.add_workload("atleast_2d", pool['2'], pool['2x2']) OpArgMngr.add_workload("atleast_3d", pool['2'], pool['2x2']) + OpArgMngr.add_workload("argsort", pool['3x2'], axis=-1) + OpArgMngr.add_workload("sort", pool['3x2'], axis=-1) OpArgMngr.add_workload("indices", dimensions=(1, 2, 3)) OpArgMngr.add_workload("subtract", pool['2x2'], pool['2x2']) OpArgMngr.add_workload("multiply", pool['2x2'], pool['2x2']) @@ -115,6 +117,10 @@ def prepare_workloads(): OpArgMngr.add_workload("power", pool['2x2'], pool['2x2']) OpArgMngr.add_workload("lcm", pool['2x2'].astype('int32'), pool['2x2'].astype('int32')) OpArgMngr.add_workload("diff", pool['2x2'], n=1, axis=-1) + OpArgMngr.add_workload("inner", pool['2x2'], pool['2x2']) + OpArgMngr.add_workload("random.multinomial", n=2, pvals=[1/6.]*6, size=(2,2)) + OpArgMngr.add_workload("random.rand", 3, 2) + OpArgMngr.add_workload("random.randn", 2, 2) OpArgMngr.add_workload("nonzero", pool['2x2']) OpArgMngr.add_workload("tril", pool['2x2'], k=0) OpArgMngr.add_workload("random.choice", pool['2'], size=(2, 2)) @@ -144,9 +150,6 @@ def prepare_workloads(): OpArgMngr.add_workload("random.logistic", loc=2, scale=2, size=(2,2)) OpArgMngr.add_workload("random.gumbel", loc=2, scale=2, size=(2,2)) OpArgMngr.add_workload("where", pool['2x3'], pool['2x3'], pool['2x1']) - OpArgMngr.add_workload("fmax", pool['2x2'], pool['2x2']) - OpArgMngr.add_workload("fmin", pool['2x2'], pool['2x2']) - OpArgMngr.add_workload("fmod", pool['2x2'], pool['2x2']) OpArgMngr.add_workload("may_share_memory", pool['2x3'][:0], pool['2x3'][:1]) OpArgMngr.add_workload('squeeze', pool['2x2'], axis=None) OpArgMngr.add_workload("pad", pool['2x2'], pad_width=((1,2),(1,2)), mode="constant") diff --git a/cmake/libmxnet.sym b/cmake/libmxnet.sym new file mode 100644 index 000000000000..0ddf63fca433 --- /dev/null +++ b/cmake/libmxnet.sym @@ -0,0 +1,15 @@ +MX* +NN* +_MX* +_NN* +mx* +nn* +_mx* +_nn* +Java_org_apache_mxnet* +*NDArray* +*Engine*Get* +*Storage*Get* +*on_enter_api* +*on_exit_api* +*MXAPISetLastError* diff --git a/cmake/libmxnet.ver b/cmake/libmxnet.ver new file mode 100644 index 000000000000..560549c29e58 --- /dev/null +++ b/cmake/libmxnet.ver @@ -0,0 +1,19 @@ +{ + global: + NN*; + MX*; + _NN*; + _MX*; + nn*; + mx*; + _nn*; + _mx*; + Java_org_apache_mxnet*; + *NDArray*; + *Engine*Get*; + *Storage*Get*; + *on_enter_api*; + *on_exit_api*; + *MXAPISetLastError*; + local: *; +}; diff --git a/config/distribution/darwin_cpu.cmake b/config/distribution/darwin_cpu.cmake index f44e004eb420..ed295efd33d2 100644 --- a/config/distribution/darwin_cpu.cmake +++ b/config/distribution/darwin_cpu.cmake @@ -32,4 +32,3 @@ set(USE_SSE ON CACHE BOOL "Build with x86 SSE instruction support") set(USE_F16C OFF CACHE BOOL "Build with x86 F16C instruction support") set(USE_LIBJPEG_TURBO ON CACHE BOOL "Build with libjpeg-turbo") set(USE_DIST_KVSTORE ON CACHE BOOL "Build with DIST_KVSTORE support") -set(USE_CXX11_ABI ON CACHE BOOL "Build with GLIBCXX_USE_CXX11_ABI") diff --git a/config/distribution/linux_cpu.cmake b/config/distribution/linux_cpu.cmake index 83bb1b07f53e..4579b42fce5c 100644 --- a/config/distribution/linux_cpu.cmake +++ b/config/distribution/linux_cpu.cmake @@ -30,4 +30,3 @@ set(USE_SSE ON CACHE BOOL "Build with x86 SSE instruction support") set(USE_F16C OFF CACHE BOOL "Build with x86 F16C instruction support") set(USE_LIBJPEG_TURBO ON CACHE BOOL "Build with libjpeg-turbo") set(USE_DIST_KVSTORE ON CACHE BOOL "Build with DIST_KVSTORE support") -set(USE_CXX11_ABI ON CACHE BOOL "Build with GLIBCXX_USE_CXX11_ABI") diff --git a/config/distribution/linux_cu100.cmake b/config/distribution/linux_cu100.cmake index b787c0666a4c..357ccd457593 100644 --- a/config/distribution/linux_cu100.cmake +++ b/config/distribution/linux_cu100.cmake @@ -32,7 +32,6 @@ set(USE_SSE ON CACHE BOOL "Build with x86 SSE instruction support") set(USE_F16C OFF CACHE BOOL "Build with x86 F16C instruction support") set(USE_LIBJPEG_TURBO ON CACHE BOOL "Build with libjpeg-turbo") set(USE_DIST_KVSTORE ON CACHE BOOL "Build with DIST_KVSTORE support") -set(USE_CXX11_ABI ON CACHE BOOL "Build with GLIBCXX_USE_CXX11_ABI") set(CUDACXX "/usr/local/cuda-10.0/bin/nvcc" CACHE STRING "Cuda compiler") set(MXNET_CUDA_ARCH "3.0;5.0;6.0;7.0" CACHE STRING "Cuda architectures") diff --git a/config/distribution/linux_cu101.cmake b/config/distribution/linux_cu101.cmake index 298b2a5e21e2..29fdda2d6f0a 100644 --- a/config/distribution/linux_cu101.cmake +++ b/config/distribution/linux_cu101.cmake @@ -34,7 +34,6 @@ set(USE_SSE ON CACHE BOOL "Build with x86 SSE instruction support") set(USE_F16C OFF CACHE BOOL "Build with x86 F16C instruction support") set(USE_LIBJPEG_TURBO ON CACHE BOOL "Build with libjpeg-turbo") set(USE_DIST_KVSTORE ON CACHE BOOL "Build with DIST_KVSTORE support") -set(USE_CXX11_ABI ON CACHE BOOL "Build with GLIBCXX_USE_CXX11_ABI") set(CUDACXX "/usr/local/cuda-10.1/bin/nvcc" CACHE STRING "Cuda compiler") set(MXNET_CUDA_ARCH "3.0;5.0;6.0;7.0" CACHE STRING "Cuda architectures") diff --git a/config/distribution/linux_cu102.cmake b/config/distribution/linux_cu102.cmake index 80ef2320d599..4e7e0509e4f9 100644 --- a/config/distribution/linux_cu102.cmake +++ b/config/distribution/linux_cu102.cmake @@ -32,7 +32,6 @@ set(USE_SSE ON CACHE BOOL "Build with x86 SSE instruction support") set(USE_F16C OFF CACHE BOOL "Build with x86 F16C instruction support") set(USE_LIBJPEG_TURBO ON CACHE BOOL "Build with libjpeg-turbo") set(USE_DIST_KVSTORE ON CACHE BOOL "Build with DIST_KVSTORE support") -set(USE_CXX11_ABI ON CACHE BOOL "Build with GLIBCXX_USE_CXX11_ABI") set(CUDACXX "/usr/local/cuda-10.2/bin/nvcc" CACHE STRING "Cuda compiler") set(MXNET_CUDA_ARCH "3.0;5.0;6.0;7.0" CACHE STRING "Cuda architectures") diff --git a/docs/python_docs/python/tutorials/deploy/run-on-aws/use_sagemaker.rst b/docs/python_docs/python/tutorials/deploy/run-on-aws/use_sagemaker.rst index d627befbd8fd..dc8052b10cdd 100644 --- a/docs/python_docs/python/tutorials/deploy/run-on-aws/use_sagemaker.rst +++ b/docs/python_docs/python/tutorials/deploy/run-on-aws/use_sagemaker.rst @@ -18,7 +18,7 @@ Run on Amazon SageMaker ----------------------- -This chapter will give a high level overview about Amazon SageMaker, +This chapter will give a high level overview about running MXNet on Amazon SageMaker, in-depth tutorials can be found on the `Sagemaker website `__. @@ -29,16 +29,7 @@ charged by time. Within this notebook you can `fetch, explore and prepare training data `__. -:: - - import mxnet as mx - import sagemaker - mx.test_utils.get_cifar10() # Downloads Cifar-10 dataset to ./data - sagemaker_session = sagemaker.Session() - inputs = sagemaker_session.upload_data(path='data/cifar', - key_prefix='data/cifar10') - -Once the data is ready, you can easily launch training via the SageMaker +With your own data on the notebook instance, you can easily launch training via the SageMaker SDK. So there is no need to manually configure and log into EC2 instances. You can either bring your own model or use SageMaker's `built-in @@ -51,11 +42,11 @@ instance: :: from sagemaker.mxnet import MXNet as MXNetEstimator - estimator = MXNetEstimator(entry_point='train.py', + estimator = MXNetEstimator(entry_point='train.py', role=sagemaker.get_execution_role(), - train_instance_count=1, + train_instance_count=1, train_instance_type='local', - hyperparameters={'batch_size': 1024, + hyperparameters={'batch_size': 1024, 'epochs': 30}) estimator.fit(inputs) diff --git a/docs/python_docs/themes/mx-theme/mxtheme/layout.html b/docs/python_docs/themes/mx-theme/mxtheme/layout.html index 1e94b28f8fd5..924b01a76be3 100644 --- a/docs/python_docs/themes/mx-theme/mxtheme/layout.html +++ b/docs/python_docs/themes/mx-theme/mxtheme/layout.html @@ -49,6 +49,7 @@ .dropdown-caret { width: 18px; + height: 54px; } .dropdown-caret-path { diff --git a/docs/python_docs/themes/mx-theme/mxtheme/static/sphinx_materialdesign_theme.css b/docs/python_docs/themes/mx-theme/mxtheme/static/sphinx_materialdesign_theme.css index dca3a3453ea1..58f7c2fd5f86 100644 --- a/docs/python_docs/themes/mx-theme/mxtheme/static/sphinx_materialdesign_theme.css +++ b/docs/python_docs/themes/mx-theme/mxtheme/static/sphinx_materialdesign_theme.css @@ -1,2 +1,2 @@ -.admonition,.mdl-shadow--2dp,.page-content pre:hover,.page-content table:not(.footnote):not(.indextable):not(.hlist):not(.option-list):not(.field-list){box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.2),0 1px 5px 0 rgba(0,0,0,.12)}.mdl-shadow--3dp{box-shadow:0 3px 4px 0 rgba(0,0,0,.14),0 3px 3px -2px rgba(0,0,0,.2),0 1px 8px 0 rgba(0,0,0,.12)}.mdl-shadow--4dp{box-shadow:0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12),0 2px 4px -1px rgba(0,0,0,.2)}.mdl-shadow--6dp{box-shadow:0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12),0 3px 5px -1px rgba(0,0,0,.2)}.mdl-shadow--8dp{box-shadow:0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12),0 5px 5px -3px rgba(0,0,0,.2)}.mdl-shadow--16dp{box-shadow:0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12),0 8px 10px -5px rgba(0,0,0,.2)}.mdl-shadow--24dp{box-shadow:0 9px 46px 8px rgba(0,0,0,.14),0 11px 15px -7px rgba(0,0,0,.12),0 24px 38px 3px rgba(0,0,0,.2)}.mdl-data-table,.page-content table:not(.footnote):not(.indextable):not(.hlist):not(.option-list):not(.field-list){position:relative;border:1px solid rgba(0,0,0,.12);border-collapse:collapse;white-space:nowrap;font-size:13px;background-color:#fff}.mdl-data-table thead,.page-content table:not(.footnote):not(.indextable):not(.hlist):not(.option-list):not(.field-list) thead{padding-bottom:3px}.mdl-data-table thead .mdl-data-table__select,.page-content table:not(.footnote):not(.indextable):not(.hlist):not(.option-list):not(.field-list) thead .mdl-data-table__select{margin-top:0}.mdl-data-table tbody tr,.page-content table:not(.footnote):not(.indextable):not(.hlist):not(.option-list):not(.field-list) tbody tr{position:relative;height:48px;transition-duration:.28s;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-property:background-color}.mdl-data-table tbody tr.is-selected,.page-content table:not(.footnote):not(.indextable):not(.hlist):not(.option-list):not(.field-list) tbody tr.is-selected{background-color:#e0e0e0}.mdl-data-table tbody tr:hover,.page-content table:not(.footnote):not(.indextable):not(.hlist):not(.option-list):not(.field-list) tbody tr:hover{background-color:#eee}.mdl-data-table td,.mdl-data-table th,.page-content table:not(.footnote):not(.indextable):not(.hlist):not(.option-list):not(.field-list) td,.page-content table:not(.footnote):not(.indextable):not(.hlist):not(.option-list):not(.field-list) th{padding:0 18px 12px;text-align:right}.mdl-data-table td:first-of-type,.mdl-data-table th:first-of-type,.page-content table:not(.footnote):not(.indextable):not(.hlist):not(.option-list):not(.field-list) td:first-of-type,.page-content table:not(.footnote):not(.indextable):not(.hlist):not(.option-list):not(.field-list) th:first-of-type{padding-left:24px}.mdl-data-table td:last-of-type,.mdl-data-table th:last-of-type,.page-content table:not(.footnote):not(.indextable):not(.hlist):not(.option-list):not(.field-list) td:last-of-type,.page-content table:not(.footnote):not(.indextable):not(.hlist):not(.option-list):not(.field-list) th:last-of-type{padding-right:24px}.mdl-data-table td,.page-content table:not(.footnote):not(.indextable):not(.hlist):not(.option-list):not(.field-list) td{position:relative;vertical-align:middle;height:48px;border-top:1px solid rgba(0,0,0,.12);border-bottom:1px solid rgba(0,0,0,.12);padding-top:12px;box-sizing:border-box}.mdl-data-table td .mdl-data-table__select,.page-content table:not(.footnote):not(.indextable):not(.hlist):not(.option-list):not(.field-list) td .mdl-data-table__select{vertical-align:middle}.mdl-data-table th,.page-content table:not(.footnote):not(.indextable):not(.hlist):not(.option-list):not(.field-list) th{position:relative;vertical-align:bottom;text-overflow:ellipsis;font-size:14px;font-weight:700;line-height:24px;letter-spacing:0;height:48px;font-size:12px;color:rgba(0,0,0,.54);padding-bottom:8px;box-sizing:border-box}.mdl-data-table th.mdl-data-table__header--sorted-ascending,.mdl-data-table th.mdl-data-table__header--sorted-descending,.page-content table:not(.footnote):not(.indextable):not(.hlist):not(.option-list):not(.field-list) th.mdl-data-table__header--sorted-ascending,.page-content table:not(.footnote):not(.indextable):not(.hlist):not(.option-list):not(.field-list) th.mdl-data-table__header--sorted-descending{color:rgba(0,0,0,.87)}.mdl-data-table th.mdl-data-table__header--sorted-ascending:before,.mdl-data-table th.mdl-data-table__header--sorted-descending:before,.page-content table:not(.footnote):not(.indextable):not(.hlist):not(.option-list):not(.field-list) th.mdl-data-table__header--sorted-ascending:before,.page-content table:not(.footnote):not(.indextable):not(.hlist):not(.option-list):not(.field-list) th.mdl-data-table__header--sorted-descending:before{font-family:Material Icons;font-weight:400;font-style:normal;font-size:24px;line-height:1;letter-spacing:normal;text-transform:none;display:inline-block;word-wrap:normal;font-feature-settings:"liga";-webkit-font-feature-settings:"liga";-webkit-font-smoothing:antialiased;font-size:16px;content:"\e5d8";margin-right:5px;vertical-align:sub}.mdl-data-table th.mdl-data-table__header--sorted-ascending:hover,.mdl-data-table th.mdl-data-table__header--sorted-descending:hover,.page-content table:not(.footnote):not(.indextable):not(.hlist):not(.option-list):not(.field-list) th.mdl-data-table__header--sorted-ascending:hover,.page-content table:not(.footnote):not(.indextable):not(.hlist):not(.option-list):not(.field-list) th.mdl-data-table__header--sorted-descending:hover{cursor:pointer}.mdl-data-table th.mdl-data-table__header--sorted-ascending:hover:before,.mdl-data-table th.mdl-data-table__header--sorted-descending:hover:before,.page-content table:not(.footnote):not(.indextable):not(.hlist):not(.option-list):not(.field-list) th.mdl-data-table__header--sorted-ascending:hover:before,.page-content table:not(.footnote):not(.indextable):not(.hlist):not(.option-list):not(.field-list) th.mdl-data-table__header--sorted-descending:hover:before{color:rgba(0,0,0,.26)}.mdl-data-table th.mdl-data-table__header--sorted-descending:before,.page-content table:not(.footnote):not(.indextable):not(.hlist):not(.option-list):not(.field-list) th.mdl-data-table__header--sorted-descending:before{content:"\e5db"}.mdl-data-table__select{width:16px}.mdl-data-table__cell--non-numeric.mdl-data-table__cell--non-numeric,.page-content table:not(.footnote):not(.indextable):not(.hlist):not(.option-list):not(.field-list) td,.page-content table:not(.footnote):not(.indextable):not(.hlist):not(.option-list):not(.field-list) th{text-align:left}.mdl-mini-footer{display:flex;flex-flow:row wrap;justify-content:space-between;padding:32px 16px;color:#9e9e9e;background-color:#424242}.mdl-mini-footer:after{content:"";display:block}.mdl-mini-footer .mdl-logo{line-height:36px}.mdl-mini-footer--link-list,.mdl-mini-footer__link-list,footer.mdl-mini-footer>div.mdl-mini-footer__left-section ul{display:flex;flex-flow:row nowrap;list-style:none;margin:0;padding:0}.mdl-mini-footer--link-list li,.mdl-mini-footer__link-list li,footer.mdl-mini-footer>div.mdl-mini-footer__left-section ul li{margin-bottom:0;margin-right:16px}@media screen and (min-width:760px){.mdl-mini-footer--link-list li,.mdl-mini-footer__link-list li,footer.mdl-mini-footer>div.mdl-mini-footer__left-section ul li{line-height:36px}}.mdl-mini-footer--link-list a,.mdl-mini-footer__link-list a,footer.mdl-mini-footer>div.mdl-mini-footer__left-section ul a{color:inherit;text-decoration:none;white-space:nowrap}.mdl-mini-footer--left-section,.mdl-mini-footer__left-section{display:inline-block;order:0}.mdl-mini-footer--right-section,.mdl-mini-footer__right-section{display:inline-block;order:1}.mdl-mini-footer--social-btn,.mdl-mini-footer__social-btn{width:36px;height:36px;padding:0;margin:0;background-color:#9e9e9e;border:none}.mdl-card{display:flex;flex-direction:column;font-size:16px;font-weight:400;min-height:200px;overflow:hidden;width:330px;z-index:1;position:relative;background:#fff;border-radius:2px;box-sizing:border-box}.mdl-card__media{background-color:#ff6e40;background-repeat:repeat;background-position:50% 50%;background-size:cover;background-origin:padding-box;background-attachment:scroll;box-sizing:border-box}.mdl-card__title{align-items:center;color:#000;display:block;display:flex;justify-content:stretch;line-height:normal;padding:16px;perspective-origin:165px 56px;transform-origin:165px 56px;box-sizing:border-box}.mdl-card__title.mdl-card--border{border-bottom:1px solid rgba(0,0,0,.1)}.mdl-card__title-text{align-self:flex-end;color:inherit;display:block;display:flex;font-size:24px;font-weight:300;line-height:normal;overflow:hidden;transform-origin:149px 48px;margin:0}.mdl-card__subtitle-text{font-size:14px;color:rgba(0,0,0,.54);margin:0}.mdl-card__supporting-text{color:rgba(0,0,0,.54);font-size:1rem;line-height:18px;overflow:hidden;padding:16px;width:90%}.mdl-card__supporting-text.mdl-card--border{border-bottom:1px solid rgba(0,0,0,.1)}.mdl-card__actions{font-size:16px;line-height:normal;width:100%;background-color:transparent;padding:8px;box-sizing:border-box}.mdl-card__actions.mdl-card--border{border-top:1px solid rgba(0,0,0,.1)}.mdl-card--expand{flex-grow:1}.mdl-card__menu{position:absolute;right:16px;top:16px}.mdl-button{background:transparent;border:none;border-radius:2px;color:#000;position:relative;height:36px;margin:0;min-width:64px;padding:0 16px;display:inline-block;font-family:Roboto,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;text-transform:uppercase;line-height:1;letter-spacing:0;overflow:hidden;will-change:box-shadow;transition:box-shadow .2s cubic-bezier(.4,0,1,1),background-color .2s cubic-bezier(.4,0,.2,1),color .2s cubic-bezier(.4,0,.2,1);outline:none;cursor:pointer;text-decoration:none;text-align:center;line-height:36px;vertical-align:middle}.mdl-button::-moz-focus-inner{border:0}.mdl-button:hover{background-color:hsla(0,0%,62%,.2)}.mdl-button:focus:not(:active){background-color:rgba(0,0,0,.12)}.mdl-button:active{background-color:hsla(0,0%,62%,.4)}.mdl-button.mdl-button--colored{color:#2196f3}.mdl-button.mdl-button--colored:focus:not(:active){background-color:rgba(0,0,0,.12)}input.mdl-button[type=submit]{-webkit-appearance:none}.mdl-button--raised{background:hsla(0,0%,62%,.2);box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.2),0 1px 5px 0 rgba(0,0,0,.12)}.mdl-button--raised:active{box-shadow:0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12),0 2px 4px -1px rgba(0,0,0,.2);background-color:hsla(0,0%,62%,.4)}.mdl-button--raised:focus:not(:active){box-shadow:0 0 8px rgba(0,0,0,.18),0 8px 16px rgba(0,0,0,.36);background-color:hsla(0,0%,62%,.4)}.mdl-button--raised.mdl-button--colored{background:#2196f3;color:#fff}.mdl-button--raised.mdl-button--colored:active,.mdl-button--raised.mdl-button--colored:focus:not(:active),.mdl-button--raised.mdl-button--colored:hover{background-color:#2196f3}.mdl-button--raised.mdl-button--colored .mdl-ripple{background:#fff}.mdl-button--fab{border-radius:50%;font-size:24px;height:56px;margin:auto;min-width:56px;width:56px;padding:0;overflow:hidden;background:hsla(0,0%,62%,.2);box-shadow:0 1px 1.5px 0 rgba(0,0,0,.12),0 1px 1px 0 rgba(0,0,0,.24);position:relative;line-height:normal}.admonition.attention .mdl-button--fab .admonition-title:before,.admonition.caution .mdl-button--fab .admonition-title:before,.admonition.danger .mdl-button--fab .admonition-title:before,.admonition.error .mdl-button--fab .admonition-title:before,.admonition.hint .mdl-button--fab .admonition-title:before,.admonition.important .mdl-button--fab .admonition-title:before,.admonition.note .mdl-button--fab .admonition-title:before,.admonition.seealso .mdl-button--fab .admonition-title:before,.admonition.tip .mdl-button--fab .admonition-title:before,.admonition.warning .mdl-button--fab .admonition-title:before,.mdl-button--fab .admonition.attention .admonition-title:before,.mdl-button--fab .admonition.caution .admonition-title:before,.mdl-button--fab .admonition.danger .admonition-title:before,.mdl-button--fab .admonition.error .admonition-title:before,.mdl-button--fab .admonition.hint .admonition-title:before,.mdl-button--fab .admonition.important .admonition-title:before,.mdl-button--fab .admonition.note .admonition-title:before,.mdl-button--fab .admonition.seealso .admonition-title:before,.mdl-button--fab .admonition.tip .admonition-title:before,.mdl-button--fab .admonition.warning .admonition-title:before,.mdl-button--fab .material-icons,.mdl-button--fab a.download:before{position:absolute;top:50%;left:50%;transform:translate(-12px,-12px);line-height:24px;width:24px}.mdl-button--fab.mdl-button--mini-fab{height:40px;min-width:40px;width:40px}.mdl-button--fab .mdl-button__ripple-container{border-radius:50%;-webkit-mask-image:-webkit-radial-gradient(circle,#fff,#000)}.mdl-button--fab:active{box-shadow:0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12),0 2px 4px -1px rgba(0,0,0,.2);background-color:hsla(0,0%,62%,.4)}.mdl-button--fab:focus:not(:active){box-shadow:0 0 8px rgba(0,0,0,.18),0 8px 16px rgba(0,0,0,.36);background-color:hsla(0,0%,62%,.4)}.mdl-button--fab.mdl-button--colored{background:#ff6e40;color:#fff}.mdl-button--fab.mdl-button--colored:active,.mdl-button--fab.mdl-button--colored:focus:not(:active),.mdl-button--fab.mdl-button--colored:hover{background-color:#ff6e40}.mdl-button--fab.mdl-button--colored .mdl-ripple{background:#fff}.mdl-button--icon{border-radius:50%;font-size:24px;height:32px;margin-left:0;margin-right:0;min-width:32px;width:32px;padding:0;overflow:hidden;color:inherit;line-height:normal}.admonition.attention .mdl-button--icon .admonition-title:before,.admonition.caution .mdl-button--icon .admonition-title:before,.admonition.danger .mdl-button--icon .admonition-title:before,.admonition.error .mdl-button--icon .admonition-title:before,.admonition.hint .mdl-button--icon .admonition-title:before,.admonition.important .mdl-button--icon .admonition-title:before,.admonition.note .mdl-button--icon .admonition-title:before,.admonition.seealso .mdl-button--icon .admonition-title:before,.admonition.tip .mdl-button--icon .admonition-title:before,.admonition.warning .mdl-button--icon .admonition-title:before,.mdl-button--icon .admonition.attention .admonition-title:before,.mdl-button--icon .admonition.caution .admonition-title:before,.mdl-button--icon .admonition.danger .admonition-title:before,.mdl-button--icon .admonition.error .admonition-title:before,.mdl-button--icon .admonition.hint .admonition-title:before,.mdl-button--icon .admonition.important .admonition-title:before,.mdl-button--icon .admonition.note .admonition-title:before,.mdl-button--icon .admonition.seealso .admonition-title:before,.mdl-button--icon .admonition.tip .admonition-title:before,.mdl-button--icon .admonition.warning .admonition-title:before,.mdl-button--icon .material-icons,.mdl-button--icon a.download:before{position:absolute;top:50%;left:50%;transform:translate(-12px,-12px);line-height:24px;width:24px}.mdl-button--icon.mdl-button--mini-icon{height:24px;min-width:24px;width:24px}.admonition.attention .mdl-button--icon.mdl-button--mini-icon .admonition-title:before,.admonition.caution .mdl-button--icon.mdl-button--mini-icon .admonition-title:before,.admonition.danger .mdl-button--icon.mdl-button--mini-icon .admonition-title:before,.admonition.error .mdl-button--icon.mdl-button--mini-icon .admonition-title:before,.admonition.hint .mdl-button--icon.mdl-button--mini-icon .admonition-title:before,.admonition.important .mdl-button--icon.mdl-button--mini-icon .admonition-title:before,.admonition.note .mdl-button--icon.mdl-button--mini-icon .admonition-title:before,.admonition.seealso .mdl-button--icon.mdl-button--mini-icon .admonition-title:before,.admonition.tip .mdl-button--icon.mdl-button--mini-icon .admonition-title:before,.admonition.warning .mdl-button--icon.mdl-button--mini-icon .admonition-title:before,.mdl-button--icon.mdl-button--mini-icon .admonition.attention .admonition-title:before,.mdl-button--icon.mdl-button--mini-icon .admonition.caution .admonition-title:before,.mdl-button--icon.mdl-button--mini-icon .admonition.danger .admonition-title:before,.mdl-button--icon.mdl-button--mini-icon .admonition.error .admonition-title:before,.mdl-button--icon.mdl-button--mini-icon .admonition.hint .admonition-title:before,.mdl-button--icon.mdl-button--mini-icon .admonition.important .admonition-title:before,.mdl-button--icon.mdl-button--mini-icon .admonition.note .admonition-title:before,.mdl-button--icon.mdl-button--mini-icon .admonition.seealso .admonition-title:before,.mdl-button--icon.mdl-button--mini-icon .admonition.tip .admonition-title:before,.mdl-button--icon.mdl-button--mini-icon .admonition.warning .admonition-title:before,.mdl-button--icon.mdl-button--mini-icon .material-icons,.mdl-button--icon.mdl-button--mini-icon a.download:before{top:0;left:0}.mdl-button--icon .mdl-button__ripple-container{border-radius:50%;-webkit-mask-image:-webkit-radial-gradient(circle,#fff,#000)}.mdl-button__ripple-container{display:block;height:100%;left:0;position:absolute;top:0;width:100%;z-index:0;overflow:hidden}.mdl-button.mdl-button--disabled .mdl-button__ripple-container .mdl-ripple,.mdl-button[disabled] .mdl-button__ripple-container .mdl-ripple{background-color:transparent}.mdl-button--primary.mdl-button--primary{color:#2196f3}.mdl-button--primary.mdl-button--primary .mdl-ripple{background:#fff}.mdl-button--primary.mdl-button--primary.mdl-button--fab,.mdl-button--primary.mdl-button--primary.mdl-button--raised{color:#fff;background-color:#2196f3}.mdl-button--accent.mdl-button--accent{color:#ff6e40}.mdl-button--accent.mdl-button--accent .mdl-ripple{background:#fff}.mdl-button--accent.mdl-button--accent.mdl-button--fab,.mdl-button--accent.mdl-button--accent.mdl-button--raised{color:#fff;background-color:#ff6e40}.mdl-button.mdl-button--disabled.mdl-button--disabled,.mdl-button[disabled][disabled]{color:rgba(0,0,0,.26);cursor:default;background-color:transparent}.mdl-button--fab.mdl-button--disabled.mdl-button--disabled,.mdl-button--fab[disabled][disabled]{background-color:rgba(0,0,0,.12);color:rgba(0,0,0,.26)}.mdl-button--raised.mdl-button--disabled.mdl-button--disabled,.mdl-button--raised[disabled][disabled]{background-color:rgba(0,0,0,.12);color:rgba(0,0,0,.26);box-shadow:none}.mdl-button--colored.mdl-button--disabled.mdl-button--disabled,.mdl-button--colored[disabled][disabled]{color:rgba(0,0,0,.26)}.admonition.attention .mdl-button .admonition-title:before,.admonition.caution .mdl-button .admonition-title:before,.admonition.danger .mdl-button .admonition-title:before,.admonition.error .mdl-button .admonition-title:before,.admonition.hint .mdl-button .admonition-title:before,.admonition.important .mdl-button .admonition-title:before,.admonition.note .mdl-button .admonition-title:before,.admonition.seealso .mdl-button .admonition-title:before,.admonition.tip .mdl-button .admonition-title:before,.admonition.warning .mdl-button .admonition-title:before,.mdl-button .admonition.attention .admonition-title:before,.mdl-button .admonition.caution .admonition-title:before,.mdl-button .admonition.danger .admonition-title:before,.mdl-button .admonition.error .admonition-title:before,.mdl-button .admonition.hint .admonition-title:before,.mdl-button .admonition.important .admonition-title:before,.mdl-button .admonition.note .admonition-title:before,.mdl-button .admonition.seealso .admonition-title:before,.mdl-button .admonition.tip .admonition-title:before,.mdl-button .admonition.warning .admonition-title:before,.mdl-button .material-icons,.mdl-button a.download:before{vertical-align:middle}.font-light{font-weight:300}.font-regular{font-weight:400}.font-heavy{font-weight:700}.left{text-align:left}.right{text-align:right}.center{text-align:center;margin-left:auto;margin-right:auto}.justify{text-align:justify}.hidden-sm{display:none}.container{width:100%;margin-left:auto;margin-right:auto}.row{position:relative;width:100%}.row [class^=col]{float:left;margin:.5rem 1%;min-height:.125rem}.row:after{content:"";display:table;clear:both}.col-1,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-10,.col-11,.col-12{width:98%}.col-1-sm{width:6.33333%}.col-2-sm{width:14.66667%}.col-3-sm{width:23%}.col-4-sm{width:31.33333%}.col-5-sm{width:39.66667%}.col-6-sm{width:48%}.col-7-sm{width:56.33333%}.col-8-sm{width:64.66667%}.col-9-sm{width:73%}.col-10-sm{width:81.33333%}.col-11-sm{width:89.66667%}.col-12-sm{width:98%}@media only screen and (min-width:45em){.col-1{width:6.33333%}.col-2{width:14.66667%}.col-3{width:23%}.col-4{width:31.33333%}.col-5{width:39.66667%}.col-6{width:48%}.col-7{width:56.33333%}.col-8{width:64.66667%}.col-9{width:73%}.col-10{width:81.33333%}.col-11{width:89.66667%}.col-12{width:98%}.hidden-sm{display:block}}.row{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;flex-wrap:wrap}.row>[class*=col-]{display:flex;flex-direction:column}.admonition.attention .admonition-title:before,.admonition.caution .admonition-title:before,.admonition.danger .admonition-title:before,.admonition.error .admonition-title:before,.admonition.hint .admonition-title:before,.admonition.important .admonition-title:before,.admonition.note .admonition-title:before,.admonition.seealso .admonition-title:before,.admonition.tip .admonition-title:before,.admonition.warning .admonition-title:before,.material-icons,a.download:before{font-family:Material Icons;font-weight:400;font-style:normal;font-size:24px;display:inline-block;line-height:1;text-transform:none;letter-spacing:normal;word-wrap:normal;white-space:nowrap;direction:ltr;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;-moz-osx-font-smoothing:grayscale;font-feature-settings:"liga"}html{font-size:16px}body{display:block!important;background-color:#fafafa;font-size:1rem;line-height:1.5rem;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol}.mdl-layout__content:focus{outline:none}.mdl-layout__content header.mdl-layout__drawer{display:none}.mdl-layout__container{height:calc(100% - 76px);margin-top:76px}.mdl-layout__header{position:fixed;transition:transform .5s}.mdl-layout--fixed-drawer>.mdl-layout__content{margin-left:300px}@media screen and (max-width:1024px){.mdl-layout--fixed-drawer>.mdl-layout__content{margin-left:0}}a.download>code.download,blockquote,h1,h2,h3,h4,h5,h6,span.mdl-layout-title{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol}.contents,.contents a,.globaltoc a.current,.toc-backref,.toctree-wrapper,.toctree-wrapper a,h1,h2,h3,h4,h5,h6{color:#048ccc!important}a{text-decoration:none}.page-content,.page-content dd,.page-content dl,.page-content dt,.page-content ol,.page-content p,.page-content table,.page-content td,.page-content th,.page-content ul{font-size:1rem}.brand{color:inherit;text-decoration:none}.section{overflow-x:auto}img{max-width:100%;display:block;margin-left:auto;margin-right:auto}div.figure p.caption{text-align:center;margin-top:.75rem}div.figure p.caption span.caption-number{font-style:normal}div.figure p.caption .caption-number:after{content:"\00a0"}.svg-icon{width:16px;height:16px;display:inline-block;fill:#f5f5f5;padding-right:5px;padding-top:4px;vertical-align:text-top}.admonition.attention a.download>i.admonition-title:before,.admonition.caution a.download>i.admonition-title:before,.admonition.danger a.download>i.admonition-title:before,.admonition.error a.download>i.admonition-title:before,.admonition.hint a.download>i.admonition-title:before,.admonition.important a.download>i.admonition-title:before,.admonition.note a.download>i.admonition-title:before,.admonition.seealso a.download>i.admonition-title:before,.admonition.tip a.download>i.admonition-title:before,.admonition.warning a.download>i.admonition-title:before,a.download>i.material-icons{position:relative;top:5px}a.download{text-decoration:none}.wrapper:after{content:"";display:table;clear:both}.wrapper{max-width:1090px;margin-right:auto;margin-left:auto;padding-right:45px;padding-left:30px}@media screen and (max-width:1024px){.wrapper{max-width:1120px;padding-right:15px;padding-left:15px}}.document{width:100%;margin:84px auto;display:flex}@media (min-width:1795px){.document{width:100%}}.document .page-content{width:100%;margin:0 auto;padding:0 12px}@media (min-width:992px){.document .page-content{width:90%;padding:0 5%}}@media (min-width:1200px){.document .page-content{width:calc(90% - 230px);padding:0 5%}}.document .side-doc-outline{width:230px}@media (max-width:1199px){.document .side-doc-outline{display:none}}.document .side-doc-outline--content{position:fixed;overflow-x:auto;overflow-y:auto;width:inherit;right:0}.document .side-doc-outline--content::-webkit-scrollbar{width:6px}.document .side-doc-outline--content::-webkit-scrollbar-track{border-radius:6px}.document .side-doc-outline--content::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,.3);border-radius:6px;box-shadow:0 0 0 1px hsla(0,0%,100%,.3)}@keyframes float-in{0%{transform:translateY(.5rem);opacity:0}to{transform:translateY(0);opacity:1}}@keyframes float-out{0%{transform:translateY(0);opacity:1}to{transform:translateY(.5rem);opacity:0}}.page-content .headerlink{display:inline-block;text-decoration:none;margin-left:.8rem;color:inherit;opacity:0}.page-content .headerlink:hover{animation:float-in .2s cubic-bezier(.4,0,.2,1) 0s forwards}.page-content h1 .toc-backref,.page-content h2 .toc-backref,.page-content h3 .toc-backref,.page-content h4 .toc-backref,.page-content h5 .toc-backref,.page-content h6 .toc-backref{text-decoration:none}.page-content h1:hover .headerlink,.page-content h2:hover .headerlink,.page-content h3:hover .headerlink,.page-content h4:hover .headerlink,.page-content h5:hover .headerlink,.page-content h6:hover .headerlink{animation:float-in .2s cubic-bezier(.4,0,.2,1) 0s forwards}.page-content h1{font-size:2rem;line-height:2.25rem}.page-content h2{font-size:1.75rem;line-height:2rem;padding-top:1.5rem;margin-top:0;margin-bottom:1rem}.page-content h3{font-size:1.5rem;line-height:1.75rem;padding-top:1rem;margin-top:0;margin-bottom:.75rem}.page-content h4{font-size:1.25rem;line-height:1.5rem;padding-top:.75rem;margin-top:0;margin-bottom:.5rem}.page-content div.page-content h5{font-size:1.1rem;line-height:1.5rem;padding-top:2rem;margin-top:0;margin-bottom:1rem}.page-content div.page-content h6{font-size:1rem;line-height:1.5rem;padding-top:2rem;margin-top:0;margin-bottom:1rem}.admonition{padding:12px 20px;margin-top:10px;margin-bottom:10px}.admonition p.last{margin:16px}.admonition .admonition-title{font-size:16px;font-weight:700;color:#555;text-transform:uppercase;margin-top:7px}.admonition.note{border-left:4px solid #00bcd4;background-color:rgba(0,188,212,.1)}.admonition.note .admonition-title{font-size:16px;font-weight:700;color:#00bcd4;margin-top:4px;margin-bottom:8px}.admonition.note .admonition-title:before{position:relative;margin-right:5px;top:3px;content:"info_outline";font-size:18px}.admonition.seealso{border-left:4px solid #00bcd4;background-color:rgba(0,188,212,.1)}.admonition.seealso .admonition-title{font-size:16px;font-weight:700;color:#00bcd4;margin-top:4px;margin-bottom:8px}.admonition.seealso .admonition-title:before{position:relative;margin-right:5px;top:3px;content:"search";font-size:18px}.admonition.hint{border-left:4px solid #00bcd4;background-color:rgba(0,188,212,.1)}.admonition.hint .admonition-title{font-size:16px;font-weight:700;color:#00bcd4;margin-top:4px;margin-bottom:8px}.admonition.hint .admonition-title:before{position:relative;margin-right:5px;top:3px;content:"help_outline";font-size:18px}.admonition.warning{border-left:4px solid #ffc107;background-color:rgba(255,193,7,.1)}.admonition.warning .admonition-title{font-size:16px;font-weight:700;color:#ffc107;margin-top:4px;margin-bottom:8px}.admonition.warning .admonition-title:before{position:relative;margin-right:5px;top:3px;content:"warning";font-size:18px}.admonition.attention{border-left:4px solid #ffc107;background-color:rgba(255,193,7,.1)}.admonition.attention .admonition-title{font-size:16px;font-weight:700;color:#ffc107;margin-top:4px;margin-bottom:8px}.admonition.attention .admonition-title:before{position:relative;margin-right:5px;top:3px;content:"warning";font-size:18px}.admonition.tip{border-left:4px solid #8bc34a;background-color:rgba(139,195,74,.1)}.admonition.tip .admonition-title{font-size:16px;font-weight:700;color:#8bc34a;margin-top:4px;margin-bottom:8px}.admonition.tip .admonition-title:before{position:relative;margin-right:5px;top:3px;content:"lightbulb_outline";font-size:18px}.admonition.important{border-left:4px solid #8bc34a;background-color:rgba(139,195,74,.1)}.admonition.important .admonition-title{font-size:16px;font-weight:700;color:#8bc34a;margin-top:4px;margin-bottom:8px}.admonition.important .admonition-title:before{position:relative;margin-right:5px;top:3px;content:"check_circle";font-size:18px}.admonition.error{border-left:4px solid #f44336;background-color:rgba(244,67,54,.1)}.admonition.error .admonition-title{font-size:16px;font-weight:700;color:#f44336;margin-top:4px;margin-bottom:8px}.admonition.error .admonition-title:before{position:relative;margin-right:5px;top:3px;content:"error_outline";font-size:18px}.admonition.caution{border-left:4px solid #f44336;background-color:rgba(244,67,54,.1)}.admonition.caution .admonition-title{font-size:16px;font-weight:700;color:#f44336;margin-top:4px;margin-bottom:8px}.admonition.caution .admonition-title:before{position:relative;margin-right:5px;top:3px;content:"error_outline";font-size:18px}.admonition.danger{border-left:4px solid #f44336;background-color:rgba(244,67,54,.1)}.admonition.danger .admonition-title{font-size:16px;font-weight:700;color:#f44336;margin-top:4px;margin-bottom:8px}.admonition.danger .admonition-title:before{position:relative;margin-right:5px;top:3px;content:"error_outline";font-size:18px}.page-content .highlight{margin:1px 0}.page-content .highlight pre{background:rgba(0,0,0,.05);color:rgba(0,0,0,.87);font-family:Menlo,DejaVu Sans Mono,Liberation Mono,Consolas,Ubuntu Mono,Courier New,andale mono,lucida console,monospace;padding:.75rem;overflow:auto;overflow-y:hidden}.page-content .highlight pre .nd,.page-content .highlight pre .o{color:rgba(0,0,0,.87)}.page-content div.highlight-console div.highlight{background:none}.page-content .output .highlight pre{color:rgba(0,0,0,.87);background:#fafafa;border:1px solid #999;padding:.75rem}.page-content .code,.page-content code:not(.download){margin:0;border-radius:2px}.page-content .code,.page-content .code span.pre,.page-content code:not(.download),.page-content code:not(.download) span.pre{font-family:Menlo,DejaVu Sans Mono,Liberation Mono,Consolas,Ubuntu Mono,Courier New,andale mono,lucida console,monospace}.page-content .viewcode-link{padding-left:2em;font-size:80%}.page-content .class>dt,.page-content .function>dt,.page-content .method>dt,.page-content .rubric{display:table;margin:10px 0;font-size:100%;line-height:normal;background:#e7f2fa;color:#2b98f0;border-top:3px solid #55adf3;padding:10px;position:relative}.page-content .class>dt .descclassname,.page-content .class>dt .descname,.page-content .function>dt .descclassname,.page-content .function>dt .descname,.page-content .method>dt .descclassname,.page-content .method>dt .descname,.page-content .rubric .descclassname,.page-content .rubric .descname{color:rgba(0,0,0,.87);background:#e7f2fa;padding:3px}.page-content .class>dt em,.page-content .function>dt em,.page-content .method>dt em,.page-content .rubric em{padding:0 2px}.page-content .rubric{margin:30px 0 10px}.page-content .field-body{padding-left:40px}.page-content .field-body ul{padding:0 0 0 16px;margin:0}.page-content .seealso .docutils>dt{float:left;clear:left;padding:0 6px}.page-content .seealso .docutils>dd{padding-left:6em}.page-content .nblast{padding-bottom:1em}.page-content pre{font-size:90%;background:#eee;color:#455a64;padding:16px 32px;width:auto;border-radius:4px;word-wrap:break-word}.page-content pre:hover:before{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;padding:0 .5rem;content:attr(click-to-copy);color:rgba(0,0,0,.5);border-radius:4px;position:relative;float:right;top:-.5rem;right:-.5rem;background:#c8c8c8;font-size:.8rem;cursor:pointer}.page-content blockquote{font-size:1rem;padding:0 1rem;border-left:3px solid rgba(0,0,0,.05)}.page-content blockquote:after{content:""!important;margin-left:0}.page-content blockquote:before{content:""!important}.page-content table:not(.footnote):not(.indextable):not(.hlist):not(.option-list):not(.field-list){margin:1.5rem 0;table-layout:fixed;max-width:100%;min-width:70%}.page-content table:not(.footnote):not(.indextable):not(.hlist):not(.option-list):not(.field-list) td,.page-content table:not(.footnote):not(.indextable):not(.hlist):not(.option-list):not(.field-list) th{white-space:normal;overflow-wrap:break-word}.page-content table:not(.footnote):not(.indextable):not(.hlist):not(.option-list):not(.field-list) caption{font-size:16px;margin:1rem 0 .8rem;white-space:normal}.page-content table:not(.footnote):not(.indextable):not(.hlist):not(.option-list):not(.field-list) caption .caption-number{font-style:normal}.page-content table:not(.footnote):not(.indextable):not(.hlist):not(.option-list):not(.field-list) caption .caption-number:after{content:"\00a0"}.globaltoc .caption,.globaltoc .toc{display:none}.globaltoc ul{list-style-type:none;padding:0;margin:0}.globaltoc ul li{min-height:18px}.globaltoc ul li .link-wrapper{display:flex;justify-content:space-between}.globaltoc ul li .link-wrapper>a{padding:4px 0;display:block;width:100%;font-size:1rem;text-decoration:none;color:#757575}.globaltoc ul li .link-wrapper>a.current{font-weight:700}.globaltoc .nav-toggle{padding:0;float:right;display:flex;align-items:center;justify-content:center;height:36px}.globaltoc .nav-toggle>a{padding:0;margin-left:0;margin-right:4px;cursor:pointer}.globaltoc .nav-toggle>a>i{font-size:18px}.globaltoc .nav-toggle.show{transform:rotate(180deg)}.globaltoc .nav-toggle.show>a{margin-right:0;margin-left:4px}.globaltoc nav>ul>li>span.link-wrapper{padding-left:8px}.globaltoc nav>ul>li>ul>li>span.link-wrapper{padding-left:16px}.globaltoc nav>ul>li>ul>li>ul>li>span.link-wrapper{padding-left:24px}.globaltoc nav>ul>li>ul>li>ul>li>ul>li>span.link-wrapper{padding-left:32px}.globaltoc nav>ul>li>ul>li>ul>li>ul>li>ul>li>span.link-wrapper{padding-left:40px}.globaltoc nav>ul>li>ul>li>ul>li>ul>li>ul>li>ul>li>span.link-wrapper{padding-left:48px}.localtoc{font-size:.75rem;padding-top:1rem}.localtoc .caption{padding-left:12px}.localtoc .caption-text{font-size:.9rem;font-weight:700}.localtoc>ul>li>a{display:none}.localtoc ul{padding:0;list-style-type:none}.localtoc li{padding-left:6px}.localtoc a{display:block;text-decoration:none;color:inherit;margin-top:8px;padding-left:8px;line-height:1.1rem}.localtoc a.current{padding-left:5px;border-left:3px solid;font-weight:700}.contents.topic,.toctree-wrapper{border-left:5px solid}.contents.topic>p.topic-title,.toctree-wrapper>p.caption{color:#757575;font-size:1rem;padding-left:14px}.contents.topic ul,.toctree-wrapper ul{padding-left:14px;list-style:none;line-height:30px}.contents.topic a,.toctree-wrapper a{font-size:1.2rem;text-decoration:none}.contents.topic a .pre,.toctree-wrapper a .pre{font-size:1rem}.contents.topic>ul>li>a,.toctree-wrapper>ul>li>a{font-size:1.3rem}.contents.topic>ul>li>a .pre,.toctree-wrapper>ul>li>a .pre{font-size:1.1rem}.page-content ul li{margin:.3rem 0}.page-content ul li p{margin:0}.page-content .option-list .option{font-family:Menlo,DejaVu Sans Mono,Liberation Mono,Consolas,Ubuntu Mono,Courier New,andale mono,lucida console,monospace}.page-content .option-list td{padding:.5rem;border:none}.mdl-layout__drawer{background-color:#fff}.mdl-layout__drawer::-webkit-scrollbar{width:6px}.mdl-layout__drawer::-webkit-scrollbar-track{border-radius:6px}.mdl-layout__drawer::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,.3);border-radius:6px;box-shadow:0 0 0 1px hsla(0,0%,100%,.3)}.mdl-layout__drawer>.mdl-layout-title{font-weight:700;text-align:right;margin:0;padding:0;line-height:32px;border-bottom:1px solid rgba(0,0,0,.1);min-height:64px}.mdl-layout__drawer>.mdl-layout-title .title{color:inherit;display:block;height:100%;width:100%;text-decoration:none}.mdl-layout__drawer>.mdl-layout-title .title>img.logo{width:100%;margin:0;padding:0}.mdl-layout__drawer>.mdl-layout-title .title-text{font-weight:700;text-align:right;padding:0 10px;margin:16px 0 8px;line-height:32px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;color:inherit;display:block}nav.breadcrumb>a.mdl-navigation__link{padding:0 8px;font-size:18px}@media (max-width:1199px){nav.breadcrumb{width:calc(100% - 64px)}nav.breadcrumb a.mdl-navigation__link.is-active{overflow-x:hidden;width:100%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.admonition.attention nav.breadcrumb i.admonition-title:before,.admonition.caution nav.breadcrumb i.admonition-title:before,.admonition.danger nav.breadcrumb i.admonition-title:before,.admonition.error nav.breadcrumb i.admonition-title:before,.admonition.hint nav.breadcrumb i.admonition-title:before,.admonition.important nav.breadcrumb i.admonition-title:before,.admonition.note nav.breadcrumb i.admonition-title:before,.admonition.seealso nav.breadcrumb i.admonition-title:before,.admonition.tip nav.breadcrumb i.admonition-title:before,.admonition.warning nav.breadcrumb i.admonition-title:before,nav.breadcrumb .admonition.attention i.admonition-title:before,nav.breadcrumb .admonition.caution i.admonition-title:before,nav.breadcrumb .admonition.danger i.admonition-title:before,nav.breadcrumb .admonition.error i.admonition-title:before,nav.breadcrumb .admonition.hint i.admonition-title:before,nav.breadcrumb .admonition.important i.admonition-title:before,nav.breadcrumb .admonition.note i.admonition-title:before,nav.breadcrumb .admonition.seealso i.admonition-title:before,nav.breadcrumb .admonition.tip i.admonition-title:before,nav.breadcrumb .admonition.warning i.admonition-title:before,nav.breadcrumb a.mdl-navigation__link:not(.is-active),nav.breadcrumb i.material-icons{display:none}}div.mdl-layout__header{margin-top:77px}.mdl-layout__drawer-button{top:13px!important}div.mdl-layout__header-row.header-links{background:hsla(0,0%,100%,.2);width:100%;overflow-x:auto;overflow-y:hidden}div.mdl-layout__header-row.header-links a.mdl-navigation__link{font-size:1rem}div.mdl-layout__header-row.header-links a.mdl-navigation__link i{font-size:1.2rem;margin:0 8px;position:relative;bottom:-.1rem}div.mdl-layout__header-row.header-links a.mdl-navigation__link:hover{background-color:#2196f3;color:#eee}div.mdl-layout__header-row.header-links a.mdl-navigation__link[href="#"]{background-color:#2196f3;opacity:1;color:#fff}.site-title{font-weight:300!important;line-height:57px;letter-spacing:-1px;margin-bottom:0;float:left;color:#fff}.site-title,.site-title:visited{color:#424242}.site-header{position:fixed;top:0;width:100%;min-height:55px;padding-top:10px;padding-bottom:10px;background-color:#048ccc;z-index:10;font-weight:300;font-size:17px;border-bottom:1px solid #fff}.site-header-logo{width:120px;display:initial}.site-nav{float:right;line-height:57px}.site-nav .menu-icon,.site-nav .nav-trigger{display:none}.site-nav .page-link{color:#fff;line-height:1.5;font-weight:300}.site-nav .page-link:not(:last-child){margin-right:40px}.site-nav .page-link:hover{color:#fff;text-shadow:-.06ex 0 #fff,.06ex 0 #fff}.site-nav .page-link.page-current{color:#fff;text-decoration:underline}@media screen and (max-width:1024px){.site-nav{position:absolute;top:9px;right:15px;background-color:#178dc9;border-radius:2px;text-align:right}.site-nav label[for=nav-trigger]{display:block;float:right;width:36px;height:36px;z-index:2;cursor:pointer}.site-nav .menu-icon{display:block;float:right;width:36px;height:26px;line-height:0;padding-top:20px;text-align:center}.site-nav .menu-icon>svg{fill:#fff}.site-nav input~.trigger{clear:both;display:none}.site-nav input:checked~.trigger{display:block;padding-bottom:5px}.site-nav .page-link{padding:5px 10px;display:block;margin-left:20px}.site-nav .page-link:not(:last-child){margin-right:0}}footer.mdl-mini-footer{background-color:#212121}footer.mdl-mini-footer>div.mdl-mini-footer__left-section{margin-bottom:20px;display:flex;flex-direction:column}footer.mdl-mini-footer>div.mdl-mini-footer__left-section .mdl-logo{font-size:1.1rem}footer.mdl-mini-footer>div.mdl-mini-footer__right-section{font-size:.9rem;display:flex;flex-direction:column;justify-content:flex-end}footer.mdl-mini-footer>div.mdl-mini-footer__right-section a{color:inherit;font-weight:700;text-decoration:none}footer.mdl-mini-footer p.caption{display:none}.pagenation{width:100%;margin-top:80px;height:92px;background-color:#424242;display:flex}.pagenation #button-next,.pagenation #button-prev,.pagenation .button-common{text-transform:none;padding:0;height:92px;display:flex;justify-content:center;align-items:center;color:#fff}.pagenation #button-prev{margin-right:auto}.pagenation #button-prev .pagenation-text{text-align:left}.pagenation #button-next{margin-left:auto;flex-direction:row-reverse}.pagenation #button-next .pagenation-text{text-align:right}.pagenation-arrow-L{margin-right:20px}.pagenation-arrow-R{margin-left:20px}.pagenation-text{line-height:30px;font-size:20px}.pagenation-direction{opacity:.7;font-size:18px}@media screen and (max-width:1024px){.pagenation #button-prev{width:20%}.pagenation #button-next{width:80%}.pagenation #button-prev .pagenation-text{display:none}}@media screen and (min-width:1025px){.pagenation #button-next,.pagenation #button-prev{width:50%}.pagenation #button-prev .pagenation-text{display:block}}.site-footer{border-top:1px solid #f5f5f5;padding:30px 0;background-color:#424242;position:relative;z-index:10}.site-footer .footer-category-title{color:#048ccc}.site-footer a,.site-footer a:visited{color:#f5f5f5!important}.site-footer2{background-color:#424242;padding-top:40px;padding-bottom:10px;position:relative;z-index:10}.footer-heading{margin-bottom:15px}.contact-list,.social-media-list{list-style:none;margin-left:0}.footer-bottom-warning{font-size:80%;color:#fff;float:left}.footer-logo{width:200px;margin-bottom:30px;margin-top:30px}.footer-col{float:left;margin-bottom:15px;padding-left:15px}.footer-text{color:#f5f5f5}#waterfall-exp::-webkit-input-placeholder{color:#ccc}#waterfall-exp:-ms-input-placeholder{color:#ccc}#waterfall-exp::-moz-placeholder{color:#ccc}ul.search span.highlighted{font-weight:700}ul.search>li{margin-bottom:24px}#search-results ul{list-style:none;padding:0}#search-results ul li>a{text-decoration:none;font-size:1.2rem}a.download:before{content:"file_download";position:relative;top:5px;margin-right:5px}button.download{position:sticky;margin-left:1em}.mdl-card{margin:1em 1.5em 1em 0;display:inline-block;width:250px;min-height:140px;padding:18px}.mdl-card:hover{box-shadow:0 10px 20px rgba(0,0,0,.25),0 6px 6px rgba(0,0,0,.22);color:#000;cursor:pointer}.mdl-card__title{padding:0 0 1em;font-size:18px;color:#444}.mdl-card__supporting-text{line-height:1.5rem;padding:0;width:100%}.head-card.mdl-card{width:auto;display:block;max-width:800px;padding:24px}.head-card>.mdl-card__title{padding-bottom:0;height:60px;font-weight:700;text-transform:uppercase}.head-card>.mdl-card__menu{color:#fff}.head-card>.mdl-card__actions{padding:0}.cards{display:flex;flex-direction:row;flex-wrap:wrap} +.admonition,.mdl-shadow--2dp,.page-content pre:hover,.page-content table:not(.footnote):not(.indextable):not(.hlist):not(.option-list):not(.field-list){box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.2),0 1px 5px 0 rgba(0,0,0,.12)}.mdl-shadow--3dp{box-shadow:0 3px 4px 0 rgba(0,0,0,.14),0 3px 3px -2px rgba(0,0,0,.2),0 1px 8px 0 rgba(0,0,0,.12)}.mdl-shadow--4dp{box-shadow:0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12),0 2px 4px -1px rgba(0,0,0,.2)}.mdl-shadow--6dp{box-shadow:0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12),0 3px 5px -1px rgba(0,0,0,.2)}.mdl-shadow--8dp{box-shadow:0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12),0 5px 5px -3px rgba(0,0,0,.2)}.mdl-shadow--16dp{box-shadow:0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12),0 8px 10px -5px rgba(0,0,0,.2)}.mdl-shadow--24dp{box-shadow:0 9px 46px 8px rgba(0,0,0,.14),0 11px 15px -7px rgba(0,0,0,.12),0 24px 38px 3px rgba(0,0,0,.2)}.mdl-data-table,.page-content table:not(.footnote):not(.indextable):not(.hlist):not(.option-list):not(.field-list){position:relative;border:1px solid rgba(0,0,0,.12);border-collapse:collapse;white-space:nowrap;font-size:13px;background-color:#fff}.mdl-data-table thead,.page-content table:not(.footnote):not(.indextable):not(.hlist):not(.option-list):not(.field-list) thead{padding-bottom:3px}.mdl-data-table thead .mdl-data-table__select,.page-content table:not(.footnote):not(.indextable):not(.hlist):not(.option-list):not(.field-list) thead .mdl-data-table__select{margin-top:0}.mdl-data-table tbody tr,.page-content table:not(.footnote):not(.indextable):not(.hlist):not(.option-list):not(.field-list) tbody tr{position:relative;height:48px;transition-duration:.28s;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-property:background-color}.mdl-data-table tbody tr.is-selected,.page-content table:not(.footnote):not(.indextable):not(.hlist):not(.option-list):not(.field-list) tbody tr.is-selected{background-color:#e0e0e0}.mdl-data-table tbody tr:hover,.page-content table:not(.footnote):not(.indextable):not(.hlist):not(.option-list):not(.field-list) tbody tr:hover{background-color:#eee}.mdl-data-table td,.mdl-data-table th,.page-content table:not(.footnote):not(.indextable):not(.hlist):not(.option-list):not(.field-list) td,.page-content table:not(.footnote):not(.indextable):not(.hlist):not(.option-list):not(.field-list) th{padding:0 18px 12px;text-align:right}.mdl-data-table td:first-of-type,.mdl-data-table th:first-of-type,.page-content table:not(.footnote):not(.indextable):not(.hlist):not(.option-list):not(.field-list) td:first-of-type,.page-content table:not(.footnote):not(.indextable):not(.hlist):not(.option-list):not(.field-list) th:first-of-type{padding-left:24px}.mdl-data-table td:last-of-type,.mdl-data-table th:last-of-type,.page-content table:not(.footnote):not(.indextable):not(.hlist):not(.option-list):not(.field-list) td:last-of-type,.page-content table:not(.footnote):not(.indextable):not(.hlist):not(.option-list):not(.field-list) th:last-of-type{padding-right:24px}.mdl-data-table td,.page-content table:not(.footnote):not(.indextable):not(.hlist):not(.option-list):not(.field-list) td{position:relative;vertical-align:middle;height:48px;border-top:1px solid rgba(0,0,0,.12);border-bottom:1px solid rgba(0,0,0,.12);padding-top:12px;box-sizing:border-box}.mdl-data-table td .mdl-data-table__select,.page-content table:not(.footnote):not(.indextable):not(.hlist):not(.option-list):not(.field-list) td .mdl-data-table__select{vertical-align:middle}.mdl-data-table th,.page-content table:not(.footnote):not(.indextable):not(.hlist):not(.option-list):not(.field-list) th{position:relative;vertical-align:bottom;text-overflow:ellipsis;font-size:14px;font-weight:700;line-height:24px;letter-spacing:0;height:48px;font-size:12px;color:rgba(0,0,0,.54);padding-bottom:8px;box-sizing:border-box}.mdl-data-table th.mdl-data-table__header--sorted-ascending,.mdl-data-table th.mdl-data-table__header--sorted-descending,.page-content table:not(.footnote):not(.indextable):not(.hlist):not(.option-list):not(.field-list) th.mdl-data-table__header--sorted-ascending,.page-content table:not(.footnote):not(.indextable):not(.hlist):not(.option-list):not(.field-list) th.mdl-data-table__header--sorted-descending{color:rgba(0,0,0,.87)}.mdl-data-table th.mdl-data-table__header--sorted-ascending:before,.mdl-data-table th.mdl-data-table__header--sorted-descending:before,.page-content table:not(.footnote):not(.indextable):not(.hlist):not(.option-list):not(.field-list) th.mdl-data-table__header--sorted-ascending:before,.page-content table:not(.footnote):not(.indextable):not(.hlist):not(.option-list):not(.field-list) th.mdl-data-table__header--sorted-descending:before{font-family:Material Icons;font-weight:400;font-style:normal;font-size:24px;line-height:1;letter-spacing:normal;text-transform:none;display:inline-block;word-wrap:normal;font-feature-settings:"liga";-webkit-font-feature-settings:"liga";-webkit-font-smoothing:antialiased;font-size:16px;content:"\e5d8";margin-right:5px;vertical-align:sub}.mdl-data-table th.mdl-data-table__header--sorted-ascending:hover,.mdl-data-table th.mdl-data-table__header--sorted-descending:hover,.page-content table:not(.footnote):not(.indextable):not(.hlist):not(.option-list):not(.field-list) th.mdl-data-table__header--sorted-ascending:hover,.page-content table:not(.footnote):not(.indextable):not(.hlist):not(.option-list):not(.field-list) th.mdl-data-table__header--sorted-descending:hover{cursor:pointer}.mdl-data-table th.mdl-data-table__header--sorted-ascending:hover:before,.mdl-data-table th.mdl-data-table__header--sorted-descending:hover:before,.page-content table:not(.footnote):not(.indextable):not(.hlist):not(.option-list):not(.field-list) th.mdl-data-table__header--sorted-ascending:hover:before,.page-content table:not(.footnote):not(.indextable):not(.hlist):not(.option-list):not(.field-list) th.mdl-data-table__header--sorted-descending:hover:before{color:rgba(0,0,0,.26)}.mdl-data-table th.mdl-data-table__header--sorted-descending:before,.page-content table:not(.footnote):not(.indextable):not(.hlist):not(.option-list):not(.field-list) th.mdl-data-table__header--sorted-descending:before{content:"\e5db"}.mdl-data-table__select{width:16px}.mdl-data-table__cell--non-numeric.mdl-data-table__cell--non-numeric,.page-content table:not(.footnote):not(.indextable):not(.hlist):not(.option-list):not(.field-list) td,.page-content table:not(.footnote):not(.indextable):not(.hlist):not(.option-list):not(.field-list) th{text-align:left}.mdl-mini-footer{display:flex;flex-flow:row wrap;justify-content:space-between;padding:32px 16px;color:#9e9e9e;background-color:#424242}.mdl-mini-footer:after{content:"";display:block}.mdl-mini-footer .mdl-logo{line-height:36px}.mdl-mini-footer--link-list,.mdl-mini-footer__link-list,footer.mdl-mini-footer>div.mdl-mini-footer__left-section ul{display:flex;flex-flow:row nowrap;list-style:none;margin:0;padding:0}.mdl-mini-footer--link-list li,.mdl-mini-footer__link-list li,footer.mdl-mini-footer>div.mdl-mini-footer__left-section ul li{margin-bottom:0;margin-right:16px}@media screen and (min-width:760px){.mdl-mini-footer--link-list li,.mdl-mini-footer__link-list li,footer.mdl-mini-footer>div.mdl-mini-footer__left-section ul li{line-height:36px}}.mdl-mini-footer--link-list a,.mdl-mini-footer__link-list a,footer.mdl-mini-footer>div.mdl-mini-footer__left-section ul a{color:inherit;text-decoration:none;white-space:nowrap}.mdl-mini-footer--left-section,.mdl-mini-footer__left-section{display:inline-block;order:0}.mdl-mini-footer--right-section,.mdl-mini-footer__right-section{display:inline-block;order:1}.mdl-mini-footer--social-btn,.mdl-mini-footer__social-btn{width:36px;height:36px;padding:0;margin:0;background-color:#9e9e9e;border:none}.mdl-card{display:flex;flex-direction:column;font-size:16px;font-weight:400;min-height:200px;overflow:hidden;width:330px;z-index:1;position:relative;background:#fff;border-radius:2px;box-sizing:border-box}.mdl-card__media{background-color:#ff6e40;background-repeat:repeat;background-position:50% 50%;background-size:cover;background-origin:padding-box;background-attachment:scroll;box-sizing:border-box}.mdl-card__title{align-items:center;color:#000;display:block;display:flex;justify-content:stretch;line-height:normal;padding:16px;perspective-origin:165px 56px;transform-origin:165px 56px;box-sizing:border-box}.mdl-card__title.mdl-card--border{border-bottom:1px solid rgba(0,0,0,.1)}.mdl-card__title-text{align-self:flex-end;color:inherit;display:block;display:flex;font-size:24px;font-weight:300;line-height:normal;overflow:hidden;transform-origin:149px 48px;margin:0}.mdl-card__subtitle-text{font-size:14px;color:rgba(0,0,0,.54);margin:0}.mdl-card__supporting-text{color:rgba(0,0,0,.54);font-size:1rem;line-height:18px;overflow:hidden;padding:16px;width:90%}.mdl-card__supporting-text.mdl-card--border{border-bottom:1px solid rgba(0,0,0,.1)}.mdl-card__actions{font-size:16px;line-height:normal;width:100%;background-color:transparent;padding:8px;box-sizing:border-box}.mdl-card__actions.mdl-card--border{border-top:1px solid rgba(0,0,0,.1)}.mdl-card--expand{flex-grow:1}.mdl-card__menu{position:absolute;right:16px;top:16px}.mdl-button{background:transparent;border:none;border-radius:2px;color:#000;position:relative;height:36px;margin:0;min-width:64px;padding:0 16px;display:inline-block;font-family:Roboto,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;text-transform:uppercase;line-height:1;letter-spacing:0;overflow:hidden;will-change:box-shadow;transition:box-shadow .2s cubic-bezier(.4,0,1,1),background-color .2s cubic-bezier(.4,0,.2,1),color .2s cubic-bezier(.4,0,.2,1);outline:none;cursor:pointer;text-decoration:none;text-align:center;line-height:36px;vertical-align:middle}.mdl-button::-moz-focus-inner{border:0}.mdl-button:hover{background-color:hsla(0,0%,62%,.2)}.mdl-button:focus:not(:active){background-color:rgba(0,0,0,.12)}.mdl-button:active{background-color:hsla(0,0%,62%,.4)}.mdl-button.mdl-button--colored{color:#2196f3}.mdl-button.mdl-button--colored:focus:not(:active){background-color:rgba(0,0,0,.12)}input.mdl-button[type=submit]{-webkit-appearance:none}.mdl-button--raised{background:hsla(0,0%,62%,.2);box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.2),0 1px 5px 0 rgba(0,0,0,.12)}.mdl-button--raised:active{box-shadow:0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12),0 2px 4px -1px rgba(0,0,0,.2);background-color:hsla(0,0%,62%,.4)}.mdl-button--raised:focus:not(:active){box-shadow:0 0 8px rgba(0,0,0,.18),0 8px 16px rgba(0,0,0,.36);background-color:hsla(0,0%,62%,.4)}.mdl-button--raised.mdl-button--colored{background:#2196f3;color:#fff}.mdl-button--raised.mdl-button--colored:active,.mdl-button--raised.mdl-button--colored:focus:not(:active),.mdl-button--raised.mdl-button--colored:hover{background-color:#2196f3}.mdl-button--raised.mdl-button--colored .mdl-ripple{background:#fff}.mdl-button--fab{border-radius:50%;font-size:24px;height:56px;margin:auto;min-width:56px;width:56px;padding:0;overflow:hidden;background:hsla(0,0%,62%,.2);box-shadow:0 1px 1.5px 0 rgba(0,0,0,.12),0 1px 1px 0 rgba(0,0,0,.24);position:relative;line-height:normal}.admonition.attention .mdl-button--fab .admonition-title:before,.admonition.caution .mdl-button--fab .admonition-title:before,.admonition.danger .mdl-button--fab .admonition-title:before,.admonition.error .mdl-button--fab .admonition-title:before,.admonition.hint .mdl-button--fab .admonition-title:before,.admonition.important .mdl-button--fab .admonition-title:before,.admonition.note .mdl-button--fab .admonition-title:before,.admonition.seealso .mdl-button--fab .admonition-title:before,.admonition.tip .mdl-button--fab .admonition-title:before,.admonition.warning .mdl-button--fab .admonition-title:before,.mdl-button--fab .admonition.attention .admonition-title:before,.mdl-button--fab .admonition.caution .admonition-title:before,.mdl-button--fab .admonition.danger .admonition-title:before,.mdl-button--fab .admonition.error .admonition-title:before,.mdl-button--fab .admonition.hint .admonition-title:before,.mdl-button--fab .admonition.important .admonition-title:before,.mdl-button--fab .admonition.note .admonition-title:before,.mdl-button--fab .admonition.seealso .admonition-title:before,.mdl-button--fab .admonition.tip .admonition-title:before,.mdl-button--fab .admonition.warning .admonition-title:before,.mdl-button--fab .material-icons,.mdl-button--fab a.download:before{position:absolute;top:50%;left:50%;transform:translate(-12px,-12px);line-height:24px;width:24px}.mdl-button--fab.mdl-button--mini-fab{height:40px;min-width:40px;width:40px}.mdl-button--fab .mdl-button__ripple-container{border-radius:50%;-webkit-mask-image:-webkit-radial-gradient(circle,#fff,#000)}.mdl-button--fab:active{box-shadow:0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12),0 2px 4px -1px rgba(0,0,0,.2);background-color:hsla(0,0%,62%,.4)}.mdl-button--fab:focus:not(:active){box-shadow:0 0 8px rgba(0,0,0,.18),0 8px 16px rgba(0,0,0,.36);background-color:hsla(0,0%,62%,.4)}.mdl-button--fab.mdl-button--colored{background:#ff6e40;color:#fff}.mdl-button--fab.mdl-button--colored:active,.mdl-button--fab.mdl-button--colored:focus:not(:active),.mdl-button--fab.mdl-button--colored:hover{background-color:#ff6e40}.mdl-button--fab.mdl-button--colored .mdl-ripple{background:#fff}.mdl-button--icon{border-radius:50%;font-size:24px;height:32px;margin-left:0;margin-right:0;min-width:32px;width:32px;padding:0;overflow:hidden;color:inherit;line-height:normal}.admonition.attention .mdl-button--icon .admonition-title:before,.admonition.caution .mdl-button--icon .admonition-title:before,.admonition.danger .mdl-button--icon .admonition-title:before,.admonition.error .mdl-button--icon .admonition-title:before,.admonition.hint .mdl-button--icon .admonition-title:before,.admonition.important .mdl-button--icon .admonition-title:before,.admonition.note .mdl-button--icon .admonition-title:before,.admonition.seealso .mdl-button--icon .admonition-title:before,.admonition.tip .mdl-button--icon .admonition-title:before,.admonition.warning .mdl-button--icon .admonition-title:before,.mdl-button--icon .admonition.attention .admonition-title:before,.mdl-button--icon .admonition.caution .admonition-title:before,.mdl-button--icon .admonition.danger .admonition-title:before,.mdl-button--icon .admonition.error .admonition-title:before,.mdl-button--icon .admonition.hint .admonition-title:before,.mdl-button--icon .admonition.important .admonition-title:before,.mdl-button--icon .admonition.note .admonition-title:before,.mdl-button--icon .admonition.seealso .admonition-title:before,.mdl-button--icon .admonition.tip .admonition-title:before,.mdl-button--icon .admonition.warning .admonition-title:before,.mdl-button--icon .material-icons,.mdl-button--icon a.download:before{position:absolute;top:50%;left:50%;transform:translate(-12px,-12px);line-height:24px;width:24px}.mdl-button--icon.mdl-button--mini-icon{height:24px;min-width:24px;width:24px}.admonition.attention .mdl-button--icon.mdl-button--mini-icon .admonition-title:before,.admonition.caution .mdl-button--icon.mdl-button--mini-icon .admonition-title:before,.admonition.danger .mdl-button--icon.mdl-button--mini-icon .admonition-title:before,.admonition.error .mdl-button--icon.mdl-button--mini-icon .admonition-title:before,.admonition.hint .mdl-button--icon.mdl-button--mini-icon .admonition-title:before,.admonition.important .mdl-button--icon.mdl-button--mini-icon .admonition-title:before,.admonition.note .mdl-button--icon.mdl-button--mini-icon .admonition-title:before,.admonition.seealso .mdl-button--icon.mdl-button--mini-icon .admonition-title:before,.admonition.tip .mdl-button--icon.mdl-button--mini-icon .admonition-title:before,.admonition.warning .mdl-button--icon.mdl-button--mini-icon .admonition-title:before,.mdl-button--icon.mdl-button--mini-icon .admonition.attention .admonition-title:before,.mdl-button--icon.mdl-button--mini-icon .admonition.caution .admonition-title:before,.mdl-button--icon.mdl-button--mini-icon .admonition.danger .admonition-title:before,.mdl-button--icon.mdl-button--mini-icon .admonition.error .admonition-title:before,.mdl-button--icon.mdl-button--mini-icon .admonition.hint .admonition-title:before,.mdl-button--icon.mdl-button--mini-icon .admonition.important .admonition-title:before,.mdl-button--icon.mdl-button--mini-icon .admonition.note .admonition-title:before,.mdl-button--icon.mdl-button--mini-icon .admonition.seealso .admonition-title:before,.mdl-button--icon.mdl-button--mini-icon .admonition.tip .admonition-title:before,.mdl-button--icon.mdl-button--mini-icon .admonition.warning .admonition-title:before,.mdl-button--icon.mdl-button--mini-icon .material-icons,.mdl-button--icon.mdl-button--mini-icon a.download:before{top:0;left:0}.mdl-button--icon .mdl-button__ripple-container{border-radius:50%;-webkit-mask-image:-webkit-radial-gradient(circle,#fff,#000)}.mdl-button__ripple-container{display:block;height:100%;left:0;position:absolute;top:0;width:100%;z-index:0;overflow:hidden}.mdl-button.mdl-button--disabled .mdl-button__ripple-container .mdl-ripple,.mdl-button[disabled] .mdl-button__ripple-container .mdl-ripple{background-color:transparent}.mdl-button--primary.mdl-button--primary{color:#2196f3}.mdl-button--primary.mdl-button--primary .mdl-ripple{background:#fff}.mdl-button--primary.mdl-button--primary.mdl-button--fab,.mdl-button--primary.mdl-button--primary.mdl-button--raised{color:#fff;background-color:#2196f3}.mdl-button--accent.mdl-button--accent{color:#ff6e40}.mdl-button--accent.mdl-button--accent .mdl-ripple{background:#fff}.mdl-button--accent.mdl-button--accent.mdl-button--fab,.mdl-button--accent.mdl-button--accent.mdl-button--raised{color:#fff;background-color:#ff6e40}.mdl-button.mdl-button--disabled.mdl-button--disabled,.mdl-button[disabled][disabled]{color:rgba(0,0,0,.26);cursor:default;background-color:transparent}.mdl-button--fab.mdl-button--disabled.mdl-button--disabled,.mdl-button--fab[disabled][disabled]{background-color:rgba(0,0,0,.12);color:rgba(0,0,0,.26)}.mdl-button--raised.mdl-button--disabled.mdl-button--disabled,.mdl-button--raised[disabled][disabled]{background-color:rgba(0,0,0,.12);color:rgba(0,0,0,.26);box-shadow:none}.mdl-button--colored.mdl-button--disabled.mdl-button--disabled,.mdl-button--colored[disabled][disabled]{color:rgba(0,0,0,.26)}.admonition.attention .mdl-button .admonition-title:before,.admonition.caution .mdl-button .admonition-title:before,.admonition.danger .mdl-button .admonition-title:before,.admonition.error .mdl-button .admonition-title:before,.admonition.hint .mdl-button .admonition-title:before,.admonition.important .mdl-button .admonition-title:before,.admonition.note .mdl-button .admonition-title:before,.admonition.seealso .mdl-button .admonition-title:before,.admonition.tip .mdl-button .admonition-title:before,.admonition.warning .mdl-button .admonition-title:before,.mdl-button .admonition.attention .admonition-title:before,.mdl-button .admonition.caution .admonition-title:before,.mdl-button .admonition.danger .admonition-title:before,.mdl-button .admonition.error .admonition-title:before,.mdl-button .admonition.hint .admonition-title:before,.mdl-button .admonition.important .admonition-title:before,.mdl-button .admonition.note .admonition-title:before,.mdl-button .admonition.seealso .admonition-title:before,.mdl-button .admonition.tip .admonition-title:before,.mdl-button .admonition.warning .admonition-title:before,.mdl-button .material-icons,.mdl-button a.download:before{vertical-align:middle}.font-light{font-weight:300}.font-regular{font-weight:400}.font-heavy{font-weight:700}.left{text-align:left}.right{text-align:right}.center{text-align:center;margin-left:auto;margin-right:auto}.justify{text-align:justify}.hidden-sm{display:none}.container{width:100%;margin-left:auto;margin-right:auto}.row{position:relative;width:100%}.row [class^=col]{float:left;margin:.5rem 1%;min-height:.125rem}.row:after{content:"";display:table;clear:both}.col-1,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-10,.col-11,.col-12{width:98%}.col-1-sm{width:6.33333%}.col-2-sm{width:14.66667%}.col-3-sm{width:23%}.col-4-sm{width:31.33333%}.col-5-sm{width:39.66667%}.col-6-sm{width:48%}.col-7-sm{width:56.33333%}.col-8-sm{width:64.66667%}.col-9-sm{width:73%}.col-10-sm{width:81.33333%}.col-11-sm{width:89.66667%}.col-12-sm{width:98%}@media only screen and (min-width:45em){.col-1{width:6.33333%}.col-2{width:14.66667%}.col-3{width:23%}.col-4{width:31.33333%}.col-5{width:39.66667%}.col-6{width:48%}.col-7{width:56.33333%}.col-8{width:64.66667%}.col-9{width:73%}.col-10{width:81.33333%}.col-11{width:89.66667%}.col-12{width:98%}.hidden-sm{display:block}}.row{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;flex-wrap:wrap}.row>[class*=col-]{display:flex;flex-direction:column}.admonition.attention .admonition-title:before,.admonition.caution .admonition-title:before,.admonition.danger .admonition-title:before,.admonition.error .admonition-title:before,.admonition.hint .admonition-title:before,.admonition.important .admonition-title:before,.admonition.note .admonition-title:before,.admonition.seealso .admonition-title:before,.admonition.tip .admonition-title:before,.admonition.warning .admonition-title:before,.material-icons,a.download:before{font-family:Material Icons;font-weight:400;font-style:normal;font-size:24px;display:inline-block;line-height:1;text-transform:none;letter-spacing:normal;word-wrap:normal;white-space:nowrap;direction:ltr;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;-moz-osx-font-smoothing:grayscale;font-feature-settings:"liga"}html{font-size:16px}body{display:block!important;background-color:#fafafa;font-size:1rem;line-height:1.5rem;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol}.mdl-layout__content:focus{outline:none}.mdl-layout__content header.mdl-layout__drawer{display:none}.mdl-layout__container{height:calc(100% - 76px);margin-top:76px}.mdl-layout__header{position:fixed;transition:transform .5s}.mdl-layout--fixed-drawer>.mdl-layout__content{margin-left:300px}@media screen and (max-width:1024px){.mdl-layout--fixed-drawer>.mdl-layout__content{margin-left:0}}a.download>code.download,blockquote,h1,h2,h3,h4,h5,h6,span.mdl-layout-title{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol}.contents,.contents a,.globaltoc a.current,.toc-backref,.toctree-wrapper,.toctree-wrapper a,h1,h2,h3,h4,h5,h6{color:#048ccc!important}a{text-decoration:none}.page-content,.page-content dd,.page-content dl,.page-content dt,.page-content ol,.page-content p,.page-content table,.page-content td,.page-content th,.page-content ul{font-size:1rem}.brand{color:inherit;text-decoration:none}.section{overflow-x:auto}img{max-width:100%;display:block;margin-left:auto;margin-right:auto}div.figure p.caption{text-align:center;margin-top:.75rem}div.figure p.caption span.caption-number{font-style:normal}div.figure p.caption .caption-number:after{content:"\00a0"}.svg-icon{width:16px;height:16px;display:inline-block;fill:#f5f5f5;padding-right:5px;padding-top:4px;vertical-align:text-top}.admonition.attention a.download>i.admonition-title:before,.admonition.caution a.download>i.admonition-title:before,.admonition.danger a.download>i.admonition-title:before,.admonition.error a.download>i.admonition-title:before,.admonition.hint a.download>i.admonition-title:before,.admonition.important a.download>i.admonition-title:before,.admonition.note a.download>i.admonition-title:before,.admonition.seealso a.download>i.admonition-title:before,.admonition.tip a.download>i.admonition-title:before,.admonition.warning a.download>i.admonition-title:before,a.download>i.material-icons{position:relative;top:5px}a.download{text-decoration:none}.wrapper:after{content:"";display:table;clear:both}.wrapper{max-width:1090px;margin-right:auto;margin-left:auto;padding-right:45px;padding-left:30px}@media screen and (max-width:1024px){.wrapper{max-width:1120px;padding-right:15px;padding-left:15px}}.document{width:100%;margin:84px auto;display:flex}@media (min-width:1795px){.document{width:100%}}.document .page-content{width:100%;margin:0 auto;padding:0 12px}@media (min-width:992px){.document .page-content{width:90%;padding:0 5%}}@media (min-width:1200px){.document .page-content{width:calc(90% - 230px);padding:0 5%}}.document .side-doc-outline{width:230px}@media (max-width:1199px){.document .side-doc-outline{display:none}}.document .side-doc-outline--content{position:sticky;overflow-x:auto;overflow-y:auto;width:inherit;right:0;top:80px}.document .side-doc-outline--content::-webkit-scrollbar{width:6px}.document .side-doc-outline--content::-webkit-scrollbar-track{border-radius:6px}.document .side-doc-outline--content::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,.3);border-radius:6px;box-shadow:0 0 0 1px hsla(0,0%,100%,.3)}@keyframes float-in{0%{transform:translateY(.5rem);opacity:0}to{transform:translateY(0);opacity:1}}@keyframes float-out{0%{transform:translateY(0);opacity:1}to{transform:translateY(.5rem);opacity:0}}.page-content .headerlink{display:inline-block;text-decoration:none;margin-left:.8rem;color:inherit;opacity:0}.page-content .headerlink:hover{animation:float-in .2s cubic-bezier(.4,0,.2,1) 0s forwards}.page-content h1 .toc-backref,.page-content h2 .toc-backref,.page-content h3 .toc-backref,.page-content h4 .toc-backref,.page-content h5 .toc-backref,.page-content h6 .toc-backref{text-decoration:none}.page-content h1:hover .headerlink,.page-content h2:hover .headerlink,.page-content h3:hover .headerlink,.page-content h4:hover .headerlink,.page-content h5:hover .headerlink,.page-content h6:hover .headerlink{animation:float-in .2s cubic-bezier(.4,0,.2,1) 0s forwards}.page-content h1{font-size:2rem;line-height:2.25rem}.page-content h2{font-size:1.75rem;line-height:2rem;padding-top:1.5rem;margin-top:0;margin-bottom:1rem}.page-content h3{font-size:1.5rem;line-height:1.75rem;padding-top:1rem;margin-top:0;margin-bottom:.75rem}.page-content h4{font-size:1.25rem;line-height:1.5rem;padding-top:.75rem;margin-top:0;margin-bottom:.5rem}.page-content div.page-content h5{font-size:1.1rem;line-height:1.5rem;padding-top:2rem;margin-top:0;margin-bottom:1rem}.page-content div.page-content h6{font-size:1rem;line-height:1.5rem;padding-top:2rem;margin-top:0;margin-bottom:1rem}.admonition{padding:12px 20px;margin-top:10px;margin-bottom:10px}.admonition p.last{margin:16px}.admonition .admonition-title{font-size:16px;font-weight:700;color:#555;text-transform:uppercase;margin-top:7px}.admonition.note{border-left:4px solid #00bcd4;background-color:rgba(0,188,212,.1)}.admonition.note .admonition-title{font-size:16px;font-weight:700;color:#00bcd4;margin-top:4px;margin-bottom:8px}.admonition.note .admonition-title:before{position:relative;margin-right:5px;top:3px;content:"info_outline";font-size:18px}.admonition.seealso{border-left:4px solid #00bcd4;background-color:rgba(0,188,212,.1)}.admonition.seealso .admonition-title{font-size:16px;font-weight:700;color:#00bcd4;margin-top:4px;margin-bottom:8px}.admonition.seealso .admonition-title:before{position:relative;margin-right:5px;top:3px;content:"search";font-size:18px}.admonition.hint{border-left:4px solid #00bcd4;background-color:rgba(0,188,212,.1)}.admonition.hint .admonition-title{font-size:16px;font-weight:700;color:#00bcd4;margin-top:4px;margin-bottom:8px}.admonition.hint .admonition-title:before{position:relative;margin-right:5px;top:3px;content:"help_outline";font-size:18px}.admonition.warning{border-left:4px solid #ffc107;background-color:rgba(255,193,7,.1)}.admonition.warning .admonition-title{font-size:16px;font-weight:700;color:#ffc107;margin-top:4px;margin-bottom:8px}.admonition.warning .admonition-title:before{position:relative;margin-right:5px;top:3px;content:"warning";font-size:18px}.admonition.attention{border-left:4px solid #ffc107;background-color:rgba(255,193,7,.1)}.admonition.attention .admonition-title{font-size:16px;font-weight:700;color:#ffc107;margin-top:4px;margin-bottom:8px}.admonition.attention .admonition-title:before{position:relative;margin-right:5px;top:3px;content:"warning";font-size:18px}.admonition.tip{border-left:4px solid #8bc34a;background-color:rgba(139,195,74,.1)}.admonition.tip .admonition-title{font-size:16px;font-weight:700;color:#8bc34a;margin-top:4px;margin-bottom:8px}.admonition.tip .admonition-title:before{position:relative;margin-right:5px;top:3px;content:"lightbulb_outline";font-size:18px}.admonition.important{border-left:4px solid #8bc34a;background-color:rgba(139,195,74,.1)}.admonition.important .admonition-title{font-size:16px;font-weight:700;color:#8bc34a;margin-top:4px;margin-bottom:8px}.admonition.important .admonition-title:before{position:relative;margin-right:5px;top:3px;content:"check_circle";font-size:18px}.admonition.error{border-left:4px solid #f44336;background-color:rgba(244,67,54,.1)}.admonition.error .admonition-title{font-size:16px;font-weight:700;color:#f44336;margin-top:4px;margin-bottom:8px}.admonition.error .admonition-title:before{position:relative;margin-right:5px;top:3px;content:"error_outline";font-size:18px}.admonition.caution{border-left:4px solid #f44336;background-color:rgba(244,67,54,.1)}.admonition.caution .admonition-title{font-size:16px;font-weight:700;color:#f44336;margin-top:4px;margin-bottom:8px}.admonition.caution .admonition-title:before{position:relative;margin-right:5px;top:3px;content:"error_outline";font-size:18px}.admonition.danger{border-left:4px solid #f44336;background-color:rgba(244,67,54,.1)}.admonition.danger .admonition-title{font-size:16px;font-weight:700;color:#f44336;margin-top:4px;margin-bottom:8px}.admonition.danger .admonition-title:before{position:relative;margin-right:5px;top:3px;content:"error_outline";font-size:18px}.page-content .highlight{margin:1px 0}.page-content .highlight pre{background:rgba(0,0,0,.05);color:rgba(0,0,0,.87);font-family:Menlo,DejaVu Sans Mono,Liberation Mono,Consolas,Ubuntu Mono,Courier New,andale mono,lucida console,monospace;padding:.75rem;overflow:auto;overflow-y:hidden}.page-content .highlight pre .nd,.page-content .highlight pre .o{color:rgba(0,0,0,.87)}.page-content div.highlight-console div.highlight{background:none}.page-content .output .highlight pre{color:rgba(0,0,0,.87);background:#fafafa;border:1px solid #999;padding:.75rem}.page-content .code,.page-content code:not(.download){margin:0;border-radius:2px}.page-content .code,.page-content .code span.pre,.page-content code:not(.download),.page-content code:not(.download) span.pre{font-family:Menlo,DejaVu Sans Mono,Liberation Mono,Consolas,Ubuntu Mono,Courier New,andale mono,lucida console,monospace}.page-content .viewcode-link{padding-left:2em;font-size:80%}.page-content .class>dt,.page-content .function>dt,.page-content .method>dt,.page-content .rubric{display:table;margin:10px 0;font-size:100%;line-height:normal;background:#e7f2fa;color:#2b98f0;border-top:3px solid #55adf3;padding:10px;position:relative}.page-content .class>dt .descclassname,.page-content .class>dt .descname,.page-content .function>dt .descclassname,.page-content .function>dt .descname,.page-content .method>dt .descclassname,.page-content .method>dt .descname,.page-content .rubric .descclassname,.page-content .rubric .descname{color:rgba(0,0,0,.87);background:#e7f2fa;padding:3px}.page-content .class>dt em,.page-content .function>dt em,.page-content .method>dt em,.page-content .rubric em{padding:0 2px}.page-content .rubric{margin:30px 0 10px}.page-content .field-body{padding-left:40px}.page-content .field-body ul{padding:0 0 0 16px;margin:0}.page-content .seealso .docutils>dt{float:left;clear:left;padding:0 6px}.page-content .seealso .docutils>dd{padding-left:6em}.page-content .nblast{padding-bottom:1em}.page-content pre{font-size:90%;background:#eee;color:#455a64;padding:16px 32px;width:auto;border-radius:4px;word-wrap:break-word}.page-content pre:hover:before{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;padding:0 .5rem;content:attr(click-to-copy);color:rgba(0,0,0,.5);border-radius:4px;position:relative;float:right;top:-.5rem;right:-.5rem;background:#c8c8c8;font-size:.8rem;cursor:pointer}.page-content blockquote{font-size:1rem;padding:0 1rem;border-left:3px solid rgba(0,0,0,.05)}.page-content blockquote:after{content:""!important;margin-left:0}.page-content blockquote:before{content:""!important}.page-content table:not(.footnote):not(.indextable):not(.hlist):not(.option-list):not(.field-list){margin:1.5rem 0;table-layout:fixed;max-width:100%;min-width:70%}.page-content table:not(.footnote):not(.indextable):not(.hlist):not(.option-list):not(.field-list) td,.page-content table:not(.footnote):not(.indextable):not(.hlist):not(.option-list):not(.field-list) th{white-space:normal;overflow-wrap:break-word}.page-content table:not(.footnote):not(.indextable):not(.hlist):not(.option-list):not(.field-list) caption{font-size:16px;margin:1rem 0 .8rem;white-space:normal}.page-content table:not(.footnote):not(.indextable):not(.hlist):not(.option-list):not(.field-list) caption .caption-number{font-style:normal}.page-content table:not(.footnote):not(.indextable):not(.hlist):not(.option-list):not(.field-list) caption .caption-number:after{content:"\00a0"}.globaltoc .caption,.globaltoc .toc{display:none}.globaltoc ul{list-style-type:none;padding:0;margin:0}.globaltoc ul li{min-height:18px}.globaltoc ul li .link-wrapper{display:flex;justify-content:space-between}.globaltoc ul li .link-wrapper>a{padding:4px 0;display:block;width:100%;font-size:1rem;text-decoration:none;color:#757575}.globaltoc ul li .link-wrapper>a.current{font-weight:700}.globaltoc .nav-toggle{padding:0;float:right;display:flex;align-items:center;justify-content:center;height:36px}.globaltoc .nav-toggle>a{padding:0;margin-left:0;margin-right:4px;cursor:pointer}.globaltoc .nav-toggle>a>i{font-size:18px}.globaltoc .nav-toggle.show{transform:rotate(180deg)}.globaltoc .nav-toggle.show>a{margin-right:0;margin-left:4px}.globaltoc nav>ul>li>span.link-wrapper{padding-left:8px}.globaltoc nav>ul>li>ul>li>span.link-wrapper{padding-left:16px}.globaltoc nav>ul>li>ul>li>ul>li>span.link-wrapper{padding-left:24px}.globaltoc nav>ul>li>ul>li>ul>li>ul>li>span.link-wrapper{padding-left:32px}.globaltoc nav>ul>li>ul>li>ul>li>ul>li>ul>li>span.link-wrapper{padding-left:40px}.globaltoc nav>ul>li>ul>li>ul>li>ul>li>ul>li>ul>li>span.link-wrapper{padding-left:48px}.localtoc{font-size:.75rem;padding-top:1rem}.localtoc .caption{padding-left:12px}.localtoc .caption-text{font-size:.9rem;font-weight:700}.localtoc>ul>li>a{display:none}.localtoc ul{padding:0;list-style-type:none}.localtoc li{padding-left:6px}.localtoc a{display:block;text-decoration:none;color:inherit;margin-top:8px;padding-left:8px;line-height:1.1rem}.localtoc a.current{padding-left:5px;border-left:3px solid;font-weight:700}.contents.topic,.toctree-wrapper{border-left:5px solid}.contents.topic>p.topic-title,.toctree-wrapper>p.caption{color:#757575;font-size:1rem;padding-left:14px}.contents.topic ul,.toctree-wrapper ul{padding-left:14px;list-style:none;line-height:30px}.contents.topic a,.toctree-wrapper a{font-size:1.2rem;text-decoration:none}.contents.topic a .pre,.toctree-wrapper a .pre{font-size:1rem}.contents.topic>ul>li>a,.toctree-wrapper>ul>li>a{font-size:1.3rem}.contents.topic>ul>li>a .pre,.toctree-wrapper>ul>li>a .pre{font-size:1.1rem}.page-content ul li{margin:.3rem 0}.page-content ul li p{margin:0}.page-content .option-list .option{font-family:Menlo,DejaVu Sans Mono,Liberation Mono,Consolas,Ubuntu Mono,Courier New,andale mono,lucida console,monospace}.page-content .option-list td{padding:.5rem;border:none}.mdl-layout__drawer{background-color:#fff}.mdl-layout__drawer::-webkit-scrollbar{width:6px}.mdl-layout__drawer::-webkit-scrollbar-track{border-radius:6px}.mdl-layout__drawer::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,.3);border-radius:6px;box-shadow:0 0 0 1px hsla(0,0%,100%,.3)}.mdl-layout__drawer>.mdl-layout-title{font-weight:700;text-align:right;margin:0;padding:0;line-height:32px;border-bottom:1px solid rgba(0,0,0,.1);min-height:64px}.mdl-layout__drawer>.mdl-layout-title .title{color:inherit;display:block;height:100%;width:100%;text-decoration:none}.mdl-layout__drawer>.mdl-layout-title .title>img.logo{width:100%;margin:0;padding:0}.mdl-layout__drawer>.mdl-layout-title .title-text{font-weight:700;text-align:right;padding:0 10px;margin:16px 0 8px;line-height:32px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;color:inherit;display:block}nav.breadcrumb>a.mdl-navigation__link{padding:0 8px;font-size:18px}@media (max-width:1199px){nav.breadcrumb{width:calc(100% - 64px)}nav.breadcrumb a.mdl-navigation__link.is-active{overflow-x:hidden;width:100%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.admonition.attention nav.breadcrumb i.admonition-title:before,.admonition.caution nav.breadcrumb i.admonition-title:before,.admonition.danger nav.breadcrumb i.admonition-title:before,.admonition.error nav.breadcrumb i.admonition-title:before,.admonition.hint nav.breadcrumb i.admonition-title:before,.admonition.important nav.breadcrumb i.admonition-title:before,.admonition.note nav.breadcrumb i.admonition-title:before,.admonition.seealso nav.breadcrumb i.admonition-title:before,.admonition.tip nav.breadcrumb i.admonition-title:before,.admonition.warning nav.breadcrumb i.admonition-title:before,nav.breadcrumb .admonition.attention i.admonition-title:before,nav.breadcrumb .admonition.caution i.admonition-title:before,nav.breadcrumb .admonition.danger i.admonition-title:before,nav.breadcrumb .admonition.error i.admonition-title:before,nav.breadcrumb .admonition.hint i.admonition-title:before,nav.breadcrumb .admonition.important i.admonition-title:before,nav.breadcrumb .admonition.note i.admonition-title:before,nav.breadcrumb .admonition.seealso i.admonition-title:before,nav.breadcrumb .admonition.tip i.admonition-title:before,nav.breadcrumb .admonition.warning i.admonition-title:before,nav.breadcrumb a.mdl-navigation__link:not(.is-active),nav.breadcrumb i.material-icons{display:none}}div.mdl-layout__header{margin-top:77px}.mdl-layout__drawer-button{top:13px!important}div.mdl-layout__header-row.header-links{background:hsla(0,0%,100%,.2);width:100%;overflow-x:auto;overflow-y:hidden}div.mdl-layout__header-row.header-links a.mdl-navigation__link{font-size:1rem}div.mdl-layout__header-row.header-links a.mdl-navigation__link i{font-size:1.2rem;margin:0 8px;position:relative;bottom:-.1rem}div.mdl-layout__header-row.header-links a.mdl-navigation__link:hover{background-color:#2196f3;color:#eee}div.mdl-layout__header-row.header-links a.mdl-navigation__link[href="#"]{background-color:#2196f3;opacity:1;color:#fff}.site-title{font-weight:300!important;line-height:57px;letter-spacing:-1px;margin-bottom:0;float:left;color:#fff}.site-title,.site-title:visited{color:#424242}.site-header{position:fixed;top:0;width:100%;min-height:55px;padding-top:10px;padding-bottom:10px;background-color:#048ccc;z-index:10;font-weight:300;font-size:17px;border-bottom:1px solid #fff}.site-header-logo{width:120px;display:initial}.site-nav{float:right;line-height:57px}.site-nav .menu-icon,.site-nav .nav-trigger{display:none}.site-nav .page-link{color:#fff;line-height:1.5;font-weight:300}.site-nav .page-link:not(:last-child){margin-right:40px}.site-nav .page-link:hover{color:#fff;text-shadow:-.06ex 0 #fff,.06ex 0 #fff}.site-nav .page-link.page-current{color:#fff;text-decoration:underline}@media screen and (max-width:1024px){.site-nav{position:absolute;top:9px;right:15px;background-color:#178dc9;border-radius:2px;text-align:right}.site-nav label[for=nav-trigger]{display:block;float:right;width:36px;height:36px;z-index:2;cursor:pointer}.site-nav .menu-icon{display:block;float:right;width:36px;height:26px;line-height:0;padding-top:20px;text-align:center}.site-nav .menu-icon>svg{fill:#fff}.site-nav input~.trigger{clear:both;display:none}.site-nav input:checked~.trigger{display:block;padding-bottom:5px}.site-nav .page-link{padding:5px 10px;display:block;margin-left:20px}.site-nav .page-link:not(:last-child){margin-right:0}}footer.mdl-mini-footer{background-color:#212121}footer.mdl-mini-footer>div.mdl-mini-footer__left-section{margin-bottom:20px;display:flex;flex-direction:column}footer.mdl-mini-footer>div.mdl-mini-footer__left-section .mdl-logo{font-size:1.1rem}footer.mdl-mini-footer>div.mdl-mini-footer__right-section{font-size:.9rem;display:flex;flex-direction:column;justify-content:flex-end}footer.mdl-mini-footer>div.mdl-mini-footer__right-section a{color:inherit;font-weight:700;text-decoration:none}footer.mdl-mini-footer p.caption{display:none}.pagenation{width:100%;margin-top:80px;height:92px;background-color:#424242;display:flex}.pagenation #button-next,.pagenation #button-prev,.pagenation .button-common{text-transform:none;padding:0;height:92px;display:flex;justify-content:center;align-items:center;color:#fff}.pagenation #button-prev{margin-right:auto}.pagenation #button-prev .pagenation-text{text-align:left}.pagenation #button-next{margin-left:auto;flex-direction:row-reverse}.pagenation #button-next .pagenation-text{text-align:right}.pagenation-arrow-L{margin-right:20px}.pagenation-arrow-R{margin-left:20px}.pagenation-text{line-height:30px;font-size:20px}.pagenation-direction{opacity:.7;font-size:18px}@media screen and (max-width:1024px){.pagenation #button-prev{width:20%}.pagenation #button-next{width:80%}.pagenation #button-prev .pagenation-text{display:none}}@media screen and (min-width:1025px){.pagenation #button-next,.pagenation #button-prev{width:50%}.pagenation #button-prev .pagenation-text{display:block}}.site-footer{border-top:1px solid #f5f5f5;padding:30px 0;background-color:#424242;position:relative;z-index:10}.site-footer .footer-category-title{color:#048ccc}.site-footer a,.site-footer a:visited{color:#f5f5f5!important}.site-footer2{background-color:#424242;padding-top:40px;padding-bottom:10px;position:relative;z-index:10}.footer-heading{margin-bottom:15px}.contact-list,.social-media-list{list-style:none;margin-left:0}.footer-bottom-warning{font-size:80%;color:#fff;float:left}.footer-logo{width:200px;margin-bottom:30px;margin-top:30px}.footer-col{float:left;margin-bottom:15px;padding-left:15px}.footer-text{color:#f5f5f5}#waterfall-exp::-webkit-input-placeholder{color:#ccc}#waterfall-exp:-ms-input-placeholder{color:#ccc}#waterfall-exp::-moz-placeholder{color:#ccc}ul.search span.highlighted{font-weight:700}ul.search>li{margin-bottom:24px}#search-results ul{list-style:none;padding:0}#search-results ul li>a{text-decoration:none;font-size:1.2rem}a.download:before{content:"file_download";position:relative;top:5px;margin-right:5px}button.download{position:sticky;margin-left:1em}.mdl-card{margin:1em 1.5em 1em 0;display:inline-block;width:250px;min-height:140px;padding:18px}.mdl-card:hover{box-shadow:0 10px 20px rgba(0,0,0,.25),0 6px 6px rgba(0,0,0,.22);color:#000;cursor:pointer}.mdl-card__title{padding:0 0 1em;font-size:18px;color:#444}.mdl-card__supporting-text{line-height:1.5rem;padding:0;width:100%}.head-card.mdl-card{width:auto;display:block;max-width:800px;padding:24px}.head-card>.mdl-card__title{padding-bottom:0;height:60px;font-weight:700;text-transform:uppercase}.head-card>.mdl-card__menu{color:#fff}.head-card>.mdl-card__actions{padding:0}.cards{display:flex;flex-direction:row;flex-wrap:wrap} /*# sourceMappingURL=/sphinx_materialdesign_theme.css.map */ \ No newline at end of file diff --git a/docs/python_docs/themes/mx-theme/mxtheme/static/sphinx_materialdesign_theme.css.map b/docs/python_docs/themes/mx-theme/mxtheme/static/sphinx_materialdesign_theme.css.map index ad360169c25d..aaab114a83a9 100644 --- a/docs/python_docs/themes/mx-theme/mxtheme/static/sphinx_materialdesign_theme.css.map +++ b/docs/python_docs/themes/mx-theme/mxtheme/static/sphinx_materialdesign_theme.css.map @@ -1 +1 @@ -{"version":3,"sources":["../../node_modules/material-design-lite/src/shadow/_shadow.scss","../../node_modules/material-design-lite/src/_mixins.scss","../../node_modules/material-design-lite/src/data-table/_data-table.scss","../../node_modules/material-design-lite/src/_variables.scss","../../node_modules/material-design-lite/src/footer/_mini_footer.scss","../../node_modules/material-design-lite/src/card/_card.scss","../../node_modules/material-design-lite/src/button/_button.scss","../scss/grid/_simplegrid.scss","../scss/fonts/_material-icons.scss","../scss/_root.scss","../scss/_variables.scss","../scss/layout/_layout.scss","../scss/headerings/_headerings.scss","../scss/admonitions/_admonitions.scss","../scss/code/_code.scss","../scss/blockquote/_blockquote.scss","../scss/tables/_tables.scss","../scss/toc/_globaltoc.scss","../scss/toc/_localtoc.scss","../scss/toc/_toctree.scss","../scss/lists/_lists.scss","../scss/drawer/_drawer.scss","../scss/header/_header.scss","../scss/footer/_footer.scss","../scss/search/_search.scss","../scss/downloadlink/_downloadlink.scss","../scss/card/_card.scss"],"names":[],"mappings":"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","file":"sphinx_materialdesign_theme.css","sourceRoot":"../../src/js","sourcesContent":["/**\n * Copyright 2015 Google Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n@import \"../variables\";\n@import \"../mixins\";\n\n.mdl-shadow--2dp {\n @include shadow-2dp();\n}\n\n.mdl-shadow--3dp {\n @include shadow-3dp();\n}\n\n.mdl-shadow--4dp {\n @include shadow-4dp();\n}\n\n.mdl-shadow--6dp {\n @include shadow-6dp();\n}\n\n.mdl-shadow--8dp {\n @include shadow-8dp();\n}\n\n.mdl-shadow--16dp {\n @include shadow-16dp();\n}\n\n.mdl-shadow--24dp {\n @include shadow-24dp();\n}\n","/**\n * Copyright 2015 Google Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/* Typography */\n\n@mixin typo-preferred-font($usePreferred: true) {\n @if $usePreferred {\n font-family: $preferred_font;\n }\n}\n\n@mixin typo-display-4($colorContrast: false, $usePreferred: true) {\n @include typo-preferred-font($usePreferred);\n font-size: 112px;\n font-weight: 300;\n line-height: 1;\n letter-spacing: -0.04em;\n\n @if $colorContrast {\n opacity: 0.54;\n }\n}\n\n@mixin typo-display-3($colorContrast: false, $usePreferred: true) {\n @include typo-preferred-font($usePreferred);\n font-size: 56px;\n font-weight: 400;\n line-height: 1.35;\n letter-spacing: -0.02em;\n\n @if $colorContrast {\n opacity: 0.54;\n }\n}\n\n@mixin typo-display-2($colorContrast: false, $usePreferred: true) {\n @include typo-preferred-font($usePreferred);\n font-size: 45px;\n font-weight: 400;\n line-height: 48px;\n\n @if $colorContrast {\n opacity: 0.54;\n }\n}\n\n@mixin typo-display-1($colorContrast: false, $usePreferred: true) {\n @include typo-preferred-font($usePreferred);\n font-size: 34px;\n font-weight: 400;\n line-height: 40px;\n\n @if $colorContrast {\n opacity: 0.54;\n }\n}\n\n@mixin typo-headline($colorContrast: false, $usePreferred: true) {\n @include typo-preferred-font($usePreferred);\n font-size: 24px;\n font-weight: 400;\n line-height: 32px;\n -moz-osx-font-smoothing: grayscale;\n\n @if $colorContrast {\n opacity: 0.87;\n }\n}\n\n@mixin typo-title($colorContrast: false, $usePreferred: true) {\n @include typo-preferred-font($usePreferred);\n font-size: 20px;\n font-weight: 500;\n line-height: 1;\n letter-spacing: 0.02em;\n\n @if $colorContrast {\n opacity: 0.87;\n }\n}\n\n@mixin typo-subhead($colorContrast: false, $usePreferred: true) {\n @include typo-preferred-font($usePreferred);\n font-size: 16px;\n font-weight: 400;\n line-height: 24px;\n letter-spacing: 0.04em;\n\n @if $colorContrast {\n opacity: 0.87;\n }\n}\n\n@mixin typo-subhead-2($colorContrast: false, $usePreferred: true) {\n @include typo-preferred-font($usePreferred);\n font-size: 16px;\n font-weight: 400;\n line-height: 28px;\n letter-spacing: 0.04em;\n\n @if $colorContrast {\n opacity: 0.87;\n }\n}\n\n@mixin typo-body-2($colorContrast: false, $usePreferred: false) {\n @include typo-preferred-font($usePreferred);\n font-size: 14px;\n @if $usePreferred {\n font-weight: 500;\n } @else {\n font-weight: bold;\n }\n line-height: 24px;\n letter-spacing: 0;\n\n @if $colorContrast {\n opacity: 0.87;\n }\n}\n\n@mixin typo-body-1($colorContrast: false, $usePreferred: false) {\n @include typo-preferred-font($usePreferred);\n font-size: 14px;\n font-weight: 400;\n line-height: 24px;\n letter-spacing: 0;\n\n @if $colorContrast {\n opacity: 0.87;\n }\n}\n\n@mixin typo-caption($colorContrast: false, $usePreferred: false) {\n @include typo-preferred-font($usePreferred);\n font-size: 12px;\n font-weight: 400;\n line-height: 1;\n letter-spacing: 0;\n\n @if $colorContrast {\n opacity: 0.54;\n }\n}\n\n@mixin typo-blockquote($colorContrast: false, $usePreferred: true) {\n @include typo-preferred-font($usePreferred);\n position: relative;\n font-size: 24px;\n font-weight: 300;\n font-style: italic;\n line-height: 1.35;\n letter-spacing: 0.08em;\n\n &:before {\n position: absolute;\n left: -0.5em;\n content: '“';\n }\n\n &:after {\n content: '”';\n margin-left: -0.05em;\n }\n\n @if $colorContrast {\n opacity: 0.54;\n }\n}\n\n@mixin typo-menu($colorContrast: false, $usePreferred: true) {\n @include typo-preferred-font($usePreferred);\n font-size: 14px;\n font-weight: 500;\n line-height: 1;\n letter-spacing: 0;\n\n @if $colorContrast {\n opacity: 0.87;\n }\n}\n\n@mixin typo-button($colorContrast: false, $usePreferred: true) {\n @include typo-preferred-font($usePreferred);\n font-size: 14px;\n font-weight: 500;\n text-transform: uppercase;\n line-height: 1;\n letter-spacing: 0;\n\n @if $colorContrast {\n opacity: 0.87;\n }\n}\n\n@mixin typo-icon() {\n font-family: 'Material Icons';\n font-weight: normal;\n font-style: normal;\n font-size: 24px;\n line-height: 1;\n letter-spacing: normal;\n text-transform: none;\n display: inline-block;\n word-wrap: normal;\n font-feature-settings: 'liga';\n -webkit-font-feature-settings: 'liga';\n -webkit-font-smoothing: antialiased;\n}\n\n/* Shadows */\n\n// Focus shadow mixin.\n@mixin focus-shadow() {\n box-shadow: 0 0 8px rgba(0,0,0,.18),0 8px 16px rgba(0,0,0,.36);\n}\n\n@mixin shadow-2dp() {\n box-shadow: 0 2px 2px 0 rgba(0, 0, 0, $shadow-key-penumbra-opacity),\n 0 3px 1px -2px rgba(0, 0, 0, $shadow-key-umbra-opacity),\n 0 1px 5px 0 rgba(0, 0, 0, $shadow-ambient-shadow-opacity);\n}\n@mixin shadow-3dp() {\n box-shadow: 0 3px 4px 0 rgba(0, 0, 0, $shadow-key-penumbra-opacity),\n 0 3px 3px -2px rgba(0, 0, 0, $shadow-key-umbra-opacity),\n 0 1px 8px 0 rgba(0, 0, 0, $shadow-ambient-shadow-opacity);\n}\n@mixin shadow-4dp() {\n box-shadow: 0 4px 5px 0 rgba(0, 0, 0, $shadow-key-penumbra-opacity),\n 0 1px 10px 0 rgba(0, 0, 0, $shadow-ambient-shadow-opacity),\n 0 2px 4px -1px rgba(0, 0, 0, $shadow-key-umbra-opacity);\n}\n@mixin shadow-6dp() {\n box-shadow: 0 6px 10px 0 rgba(0, 0, 0, $shadow-key-penumbra-opacity),\n 0 1px 18px 0 rgba(0, 0, 0, $shadow-ambient-shadow-opacity),\n 0 3px 5px -1px rgba(0, 0, 0, $shadow-key-umbra-opacity);\n}\n@mixin shadow-8dp() {\n box-shadow: 0 8px 10px 1px rgba(0, 0, 0, $shadow-key-penumbra-opacity),\n 0 3px 14px 2px rgba(0, 0, 0, $shadow-ambient-shadow-opacity),\n 0 5px 5px -3px rgba(0, 0, 0, $shadow-key-umbra-opacity);\n}\n\n@mixin shadow-16dp() {\n box-shadow: 0 16px 24px 2px rgba(0, 0, 0, $shadow-key-penumbra-opacity),\n 0 6px 30px 5px rgba(0, 0, 0, $shadow-ambient-shadow-opacity),\n 0 8px 10px -5px rgba(0, 0, 0, $shadow-key-umbra-opacity);\n}\n\n@mixin shadow-24dp() {\n box-shadow: 0 9px 46px 8px rgba(0, 0, 0, $shadow-key-penumbra-opacity),\n 0 11px 15px -7px rgba(0, 0, 0, $shadow-ambient-shadow-opacity),\n 0 24px 38px 3px rgba(0, 0, 0, $shadow-key-umbra-opacity);\n}\n\n/* Animations */\n\n@mixin material-animation-fast-out-slow-in($duration:0.2s) {\n transition-duration: $duration;\n transition-timing-function: $animation-curve-fast-out-slow-in;\n}\n\n@mixin material-animation-linear-out-slow-in($duration:0.2s) {\n transition-duration: $duration;\n transition-timing-function: $animation-curve-linear-out-slow-in;\n}\n\n@mixin material-animation-fast-out-linear-in($duration:0.2s) {\n transition-duration: $duration;\n transition-timing-function: $animation-curve-fast-out-linear-in;\n}\n\n@mixin material-animation-default($duration:0.2s) {\n transition-duration: $duration;\n transition-timing-function: $animation-curve-default;\n}\n\n/* Dialog */\n\n@mixin dialog-width($units:5) {\n @if(type_of($units) != 'number') {\n @error \"The unit given to dialog-width should be a number.\";\n }\n // 56dp is the base unit width for Dialogs.\n // With 5 units being the number of units for a mobile device.\n // https://goo.gl/sK2O5o\n width: $units * 56px;\n}\n","/**\n * Copyright 2015 Google Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n@import \"../variables\";\n@import \"../mixins\";\n\n.mdl-data-table {\n position: relative;\n border: $data-table-dividers;\n border-collapse: collapse;\n white-space: nowrap;\n font-size: $data-table-font-size;\n background-color: unquote(\"rgb(#{$color-white})\");\n\n thead {\n padding-bottom: 3px;\n\n .mdl-data-table__select {\n margin-top: 0;\n }\n }\n\n tbody {\n tr {\n position: relative;\n height: $data-table-row-height;\n @include material-animation-default(0.28s);\n transition-property: background-color;\n\n &.is-selected {\n background-color: $data-table-selection-color;\n }\n\n &:hover {\n background-color: $data-table-hover-color;\n }\n }\n }\n\n td, th {\n padding: 0 $data-table-column-padding 12px $data-table-column-padding;\n text-align: right;\n\n &:first-of-type {\n padding-left: 24px;\n }\n\n &:last-of-type {\n padding-right: 24px;\n }\n }\n\n td {\n position: relative;\n vertical-align: middle;\n height: $data-table-row-height;\n border-top: $data-table-dividers;\n border-bottom: $data-table-dividers;\n padding-top: $data-table-cell-top;\n box-sizing: border-box;\n\n .mdl-data-table__select {\n vertical-align: middle;\n }\n }\n\n th {\n position: relative;\n vertical-align: bottom;\n text-overflow: ellipsis;\n @include typo-body-2();\n height: $data-table-row-height;\n font-size: $data-table-header-font-size;\n color: $data-table-header-color;\n padding-bottom: 8px;\n box-sizing: border-box;\n\n &.mdl-data-table__header--sorted-ascending,\n &.mdl-data-table__header--sorted-descending {\n color: $data-table-header-sorted-color;\n &:before {\n @include typo-icon;\n font-size: $data-table-header-sort-icon-size;\n content: \"\\e5d8\";\n margin-right: 5px;\n vertical-align: sub;\n }\n &:hover {\n cursor: pointer;\n &:before {\n color: $data-table-header-sorted-icon-hover-color;\n }\n }\n }\n &.mdl-data-table__header--sorted-descending:before {\n content: \"\\e5db\";\n }\n }\n}\n\n.mdl-data-table__select {\n width: 16px;\n}\n\n.mdl-data-table__cell--non-numeric.mdl-data-table__cell--non-numeric {\n text-align: left;\n}\n","/**\n * Copyright 2015 Google Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/*------------------------------------*\\\n $CONTENTS\n\\*------------------------------------*/\n/**\n * STYLE GUIDE VARIABLES------------------Declarations of Sass variables\n * -----Typography\n * -----Colors\n * -----Textfield\n * -----Switch\n * -----Spinner\n * -----Radio\n * -----Menu\n * -----List\n * -----Layout\n * -----Icon toggles\n * -----Footer\n * -----Column\n * -----Checkbox\n * -----Card\n * -----Button\n * -----Animation\n * -----Progress\n * -----Badge\n * -----Shadows\n * -----Grid\n * -----Data table\n * -----Dialog\n * -----Snackbar\n * -----Tooltip\n * -----Chip\n *\n * Even though all variables have the `!default` directive, most of them\n * should not be changed as they are dependent one another. This can cause\n * visual distortions (like alignment issues) that are hard to track down\n * and fix.\n */\n\n\n/* ========== TYPOGRAPHY ========== */\n\n/* We're splitting fonts into \"preferred\" and \"performance\" in order to optimize\n page loading. For important text, such as the body, we want it to load\n immediately and not wait for the web font load, whereas for other sections,\n such as headers and titles, we're OK with things taking a bit longer to load.\n We do have some optional classes and parameters in the mixins, in case you\n definitely want to make sure you're using the preferred font and don't mind\n the performance hit.\n We should be able to improve on this once CSS Font Loading L3 becomes more\n widely available.\n*/\n$preferred_font: 'Roboto', 'Helvetica', 'Arial', sans-serif !default;\n$performance_font: 'Helvetica', 'Arial', sans-serif !default;\n\n/* ========== COLORS ========== */\n\n/**\n*\n* Material design color palettes.\n* @see http://www.google.com/design/spec/style/color.html\n*\n**/\n\n@import \"color-definitions\";\n@import \"functions\";\n\n/* ========== IMAGES ========== */\n$image_path: '/images' !default;\n\n/* ========== Color & Themes ========== */\n\n// Define whether individual color palette items should have classes created.\n// Setting this to true will remove individual color classes for each color in the palettes.\n// To improve overall performance (assuming they aren't used) by:\n// * Saving server bandwidth sending the extra classes\n// * Save client computation against the classes\n// it is RECOMMENDED you set this to true.\n$trim-color-classes: false !default;\n\n// Use color primarily for emphasis. Choose colors that fit with\n// your brand and provide good contrast between visual components.\n$color-primary: $palette-indigo-500 !default;\n$color-primary-dark: $palette-indigo-700 !default;\n$color-accent: $palette-pink-A200 !default;\n\n// Our primary is dark, so use $color-dark-contrast for overlaid text.\n$color-primary-contrast: $color-dark-contrast !default;\n// Our accent is dark, so use $color-dark-contrast for overlaid text.\n$color-accent-contrast: $color-dark-contrast !default;\n\n// Replace all colors with placeholders if we're generating a template.\n@if $styleguide-generate-template == true {\n $color-primary: '$color-primary';\n $color-primary-dark: '$color-primary-dark';\n $color-accent: '$color-accent';\n $color-primary-contrast: '$color-primary-contrast';\n $color-accent-contrast: '$color-accent-contrast';\n}\n\n/* ========== Typography ========== */\n\n// We use the following default color styles: text-color-primary and\n// text-color-secondary. For light themes, use text-color-primary-inverse\n// and text-color-secondary-inverse.\n\n$text-color-primary: unquote(\"rgba(#{$color-black}, 0.87)\") !default;\n$text-link-color: unquote(\"rgb(#{$color-accent})\") !default;\n\n// Define whether to target elements directly for typographic enhancements.\n// Turning this off means you need to use mdl-* classes more often.\n// Other components may also fail to adhere to MD without these rules.\n// It is strongly recommended you leave this as true.\n\n$target-elements-directly: true !default;\n\n/* ========== Components ========== */\n\n/* ========== Standard Buttons ========== */\n\n// Default button colors.\n$button-primary-color: unquote(\"rgba(#{$palette-grey-500}, 0.20)\") !default;\n$button-secondary-color: unquote(\"rgb(#{$color-black})\") !default;\n$button-hover-color: $button-primary-color !default;\n$button-active-color: unquote(\"rgba(#{$palette-grey-500}, 0.40)\") !default;\n$button-focus-color: unquote(\"rgba(#{$color-black}, 0.12)\") !default;\n\n// Colored button colors.\n$button-primary-color-alt: unquote(\"rgb(#{$color-primary})\") !default;\n$button-secondary-color-alt: unquote(\"rgb(#{$color-primary-contrast})\") !default;\n$button-hover-color-alt: unquote(\"rgb(#{$color-primary})\") !default;\n$button-active-color-alt: unquote(\"rgb(#{$color-primary})\") !default;\n$button-focus-color-alt: $button-focus-color !default;\n\n// Ripple color for colored raised buttons.\n$button-ripple-color-alt: unquote(\"rgb(#{$color-primary-contrast})\") !default;\n\n// Disabled button colors.\n$button-primary-color-disabled: unquote(\"rgba(#{$color-black}, 0.12)\") !default;\n$button-secondary-color-disabled: unquote(\"rgba(#{$color-black}, 0.26)\") !default;\n\n// FAB colors and sizes.\n$button-fab-color-alt: unquote(\"rgb(#{$color-accent})\") !default;\n$button-fab-hover-color-alt: unquote(\"rgb(#{$color-accent})\") !default;\n$button-fab-active-color-alt: unquote(\"rgb(#{$color-accent})\") !default;\n$button-fab-text-color-alt: unquote(\"rgb(#{$color-accent-contrast})\") !default;\n$button-fab-ripple-color-alt: unquote(\"rgb(#{$color-accent-contrast})\") !default;\n\n// Icon button colors and sizes.\n$button-icon-color: unquote(\"rgb(#{$palette-grey-700})\") !default;\n$button-icon-focus-color: $button-focus-color !default;\n\n/* ========== Icon Toggles ========== */\n\n$icon-toggle-color: unquote(\"rgb(#{$palette-grey-700})\") !default;\n$icon-toggle-focus-color: $button-focus-color !default;\n$icon-toggle-checked-color: unquote(\"rgb(#{$color-primary})\") !default;\n$icon-toggle-checked-focus-color: unquote(\"rgba(#{$color-primary}, 0.26)\") !default;\n$icon-toggle-disabled-color: unquote(\"rgba(#{$color-black}, 0.26)\") !default;\n\n/* ========== Radio Buttons ========== */\n\n$radio-color: unquote(\"rgb(#{$color-primary})\") !default;\n$radio-off-color: unquote(\"rgba(#{$color-black}, 0.54)\") !default;\n$radio-disabled-color: unquote(\"rgba(#{$color-black}, 0.26)\") !default;\n\n/* ========== Ripple effect ========== */\n\n$ripple-bg-color: unquote(\"rgb(#{$color-light-contrast})\") !default;\n\n/* ========== Layout ========== */\n\n$layout-nav-color: unquote(\"rgb(#{$palette-grey-300})\") !default;\n\n// Drawer\n$layout-drawer-bg-color: unquote(\"rgb(#{$palette-grey-50})\") !default;\n$layout-drawer-border-color: unquote(\"rgb(#{$palette-grey-300})\") !default;\n$layout-text-color: unquote(\"rgb(#{$palette-grey-800})\") !default;\n$layout-drawer-navigation-color: #757575 !default;\n$layout-drawer-navigation-link-active-background: unquote(\"rgb(#{$palette-grey-300})\") !default;\n$layout-drawer-navigation-link-active-color: unquote(\"rgb(#{$color-light-contrast})\") !default;\n\n// Header\n$layout-header-bg-color: unquote(\"rgb(#{$color-primary})\") !default;\n$layout-header-text-color: unquote(\"rgb(#{$color-primary-contrast})\") !default;\n$layout-header-nav-hover-color: unquote(\"rgba(#{$palette-grey-700}, 0.6)\") !default;\n$layout-header-tab-text-color: unquote(\"rgba(#{$color-primary-contrast}, 0.6)\") !default;\n\n// Tabs\n$layout-header-tab-highlight: unquote(\"rgb(#{$color-accent})\") !default;\n\n/* ========== Content Tabs ========== */\n\n$tab-highlight-color: unquote(\"rgb(#{$color-primary})\") !default;\n$tab-text-color: unquote(\"rgba(#{$color-black}, 0.54)\") !default;\n$tab-active-text-color: unquote(\"rgba(#{$color-black}, 0.87)\") !default;\n$tab-border-color: unquote(\"rgb(#{$palette-grey-300})\") !default;\n\n/* ========== Checkboxes ========== */\n\n$checkbox-color: unquote(\"rgb(#{$color-primary})\") !default;\n$checkbox-off-color: unquote(\"rgba(#{$color-black}, 0.54)\") !default;\n$checkbox-disabled-color: unquote(\"rgba(#{$color-black}, 0.26)\") !default;\n$checkbox-focus-color: unquote(\"rgba(#{$color-primary}, 0.26)\") !default;\n$checkbox-image-path: $image_path;\n\n/* ========== Switches ========== */\n\n$switch-color: unquote(\"rgb(#{$color-primary})\") !default;\n$switch-faded-color: unquote(\"rgba(#{$color-primary}, 0.26)\") !default;\n$switch-thumb-color: $switch-color !default;\n$switch-track-color: unquote(\"rgba(#{$color-primary}, 0.5)\") !default;\n\n$switch-off-thumb-color: unquote(\"rgb(#{$palette-grey-50})\") !default;\n$switch-off-track-color: unquote(\"rgba(#{$color-black}, 0.26)\") !default;\n$switch-disabled-thumb-color: unquote(\"rgb(#{$palette-grey-400})\") !default;\n$switch-disabled-track-color: unquote(\"rgba(#{$color-black}, 0.12)\") !default;\n\n/* ========== Spinner ========== */\n\n$spinner-color-1: unquote(\"rgb(#{$palette-blue-400})\") !default;\n$spinner-color-2: unquote(\"rgb(#{$palette-red-500})\") !default;\n$spinner-color-3: unquote(\"rgb(#{$palette-yellow-600})\") !default;\n$spinner-color-4: unquote(\"rgb(#{$palette-green-500})\") !default;\n\n$spinner-single-color: unquote(\"rgb(#{$color-primary})\") !default;\n\n/* ========== Text fields ========== */\n\n$input-text-background-color: transparent !default;\n$input-text-label-color: unquote(\"rgba(#{$color-black}, 0.26)\") !default;\n$input-text-bottom-border-color: unquote(\"rgba(#{$color-black}, 0.12)\") !default;\n$input-text-highlight-color: unquote(\"rgb(#{$color-primary})\") !default;\n$input-text-disabled-color: $input-text-bottom-border-color !default;\n$input-text-disabled-text-color: $input-text-label-color !default;\n$input-text-error-color: unquote(\"rgb(#{$palette-red-A700})\") !default;\n\n/* ========== Card ========== */\n\n$card-background-color: unquote(\"rgb(#{$color-white})\") !default;\n$card-text-color: unquote(\"rgb(#{$color-black})\") !default;\n$card-image-placeholder-color: unquote(\"rgb(#{$color-accent})\") !default;\n$card-supporting-text-text-color: unquote(\"rgba(#{$color-black}, 0.54)\") !default;\n$card-border-color: rgba(0,0,0,0.1) !default;\n$card-subtitle-color: unquote(\"rgba(#{$color-black}, 0.54)\") !default;\n\n/* ========== Sliders ========== */\n\n$range-bg-color: unquote(\"rgba(#{$color-black}, 0.26)\") !default;\n$range-color: unquote(\"rgb(#{$color-primary})\") !default;\n$range-faded-color: unquote(\"rgba(#{$color-primary}, 0.26)\") !default;\n$range-bg-focus-color: unquote(\"rgba(#{$color-black}, 0.12)\") !default;\n\n/* ========== Progress ========== */\n$progress-main-color: unquote(\"rgb(#{$color-primary})\") !default;\n$progress-secondary-color: unquote(\"rgba(#{$color-primary-contrast}, 0.7)\") !default;\n$progress-fallback-buffer-color: unquote(\"rgba(#{$color-primary-contrast}, 0.9)\") !default;\n$progress-image-path: $image_path;\n\n/* ========== List ========== */\n\n$list-main-text-text-color: unquote(\"rgba(#{$color-black}, 0.87)\") !default;\n$list-supporting-text-text-color: unquote(\"rgba(#{$color-black}, 0.54)\") !default;\n$list-icon-color: unquote(\"rgb(#{$palette-grey-600})\") !default;\n$list-avatar-color: white !default;\n\n/* ========== Item ========== */\n\n// Default Item Colors\n$default-item-text-color: unquote(\"rgba(#{$color-black}, 0.87)\") !default;\n$default-item-outline-color: unquote(\"rgb(#{$palette-grey-400})\") !default;\n$default-item-hover-bg-color: unquote(\"rgb(#{$palette-grey-200})\") !default;\n$default-item-focus-bg-color: unquote(\"rgb(#{$palette-grey-200})\") !default;\n$default-item-active-bg-color: unquote(\"rgb(#{$palette-grey-300})\") !default;\n$default-item-divider-color: unquote(\"rgba(#{$color-black}, 0.12)\") !default;\n\n// Disabled Button Colors\n$disabled-item-text-color: unquote(\"rgb(#{$palette-grey-400})\") !default;\n\n/* ========== Dropdown menu ========== */\n\n$default-dropdown-bg-color: unquote(\"rgb(#{$color-white})\") !default;\n\n/* ========== Tooltips ========== */\n\n$tooltip-text-color: unquote(\"rgb(#{$color-white})\") !default;\n$tooltip-background-color: unquote(\"rgba(#{$palette-grey-700}, 0.9)\") !default;\n\n/* ========== Footer ========== */\n\n$footer-bg-color: unquote(\"rgb(#{$palette-grey-800})\") !default;\n$footer-color: unquote(\"rgb(#{$palette-grey-500})\") !default;\n$footer-heading-color: unquote(\"rgb(#{$palette-grey-300})\") !default;\n$footer-button-fill-color: $footer-color !default;\n$footer-underline-color: $footer-color !default;\n\n\n/* TEXTFIELD */\n\n$input-text-font-size: 16px !default;\n$input-text-width: 100% !default;\n$input-text-padding: 4px !default;\n$input-text-vertical-spacing: 20px !default;\n\n$input-text-button-size: 32px !default;\n$input-text-floating-label-fontsize: 12px !default;\n$input-text-expandable-icon-top: 16px !default;\n\n\n/* SWITCH */\n\n$switch-label-font-size: 16px !default;\n$switch-label-height: 24px !default;\n$switch-track-height: 14px !default;\n$switch-track-length: 36px !default;\n$switch-thumb-size: 20px !default;\n$switch-track-top: ($switch-label-height - $switch-track-height) / 2 !default;\n$switch-thumb-top: ($switch-label-height - $switch-thumb-size) / 2 !default;\n$switch-ripple-size: $switch-label-height * 2 !default;\n$switch-helper-size: 8px !default;\n\n/* SPINNER */\n\n$spinner-size: 28px !default;\n$spinner-stroke-width: 3px !default;\n\n// Amount of circle the arc takes up.\n$spinner-arc-size: 270deg !default;\n// Time it takes to expand and contract arc.\n$spinner-arc-time: 1333ms !default;\n// How much the start location of the arc should rotate each time.\n$spinner-arc-start-rot: 216deg !default;\n\n$spinner-duration: 360 * $spinner-arc-time / (\n strip-units($spinner-arc-start-rot + (360deg - $spinner-arc-size)));\n\n\n/* RADIO */\n\n$radio-label-font-size: 16px !default;\n$radio-label-height: 24px !default;\n$radio-button-size: 16px !default;\n$radio-inner-margin: $radio-button-size / 4;\n$radio-padding: 8px !default;\n$radio-top-offset: ($radio-label-height - $radio-button-size) / 2;\n$radio-ripple-size: 42px !default;\n\n\n/* MENU */\n\n$menu-expand-duration: 0.3s !default;\n$menu-fade-duration: 0.2s !default;\n\n/* LIST */\n\n$list-border: 8px !default;\n$list-min-height: 48px !default;\n$list-min-padding: 16px !default;\n$list-bottom-padding: 20px !default;\n$list-avatar-text-left-distance: 72px !default;\n$list-icon-text-left-distance: 72px !default;\n\n$list-avatar-size: 40px !default;\n$list-icon-size: 24px !default;\n\n$list-two-line-height: 72px !default;\n$list-three-line-height: 88px !default;\n\n/* LAYOUT */\n\n$layout-drawer-narrow: 240px !default;\n$layout-drawer-wide: 456px !default;\n$layout-drawer-width: $layout-drawer-narrow !default;\n\n$layout-header-icon-size: 32px !default;\n$layout-screen-size-threshold: 1024px !default;\n$layout-header-icon-margin: 24px !default;\n$layout-drawer-button-mobile-size: 32px !default;\n$layout-drawer-button-desktop-size: 48px !default;\n\n$layout-header-mobile-row-height: 56px !default;\n$layout-mobile-header-height: $layout-header-mobile-row-height;\n$layout-header-desktop-row-height: 64px !default;\n$layout-desktop-header-height: $layout-header-desktop-row-height;\n\n$layout-header-desktop-baseline: 80px !default;\n$layout-header-mobile-baseline: 72px !default;\n$layout-header-mobile-indent: 16px !default;\n$layout-header-desktop-indent: 40px !default;\n\n$layout-tab-font-size: 14px !default;\n$layout-tab-bar-height: 48px !default;\n$layout-tab-mobile-padding: 12px !default;\n$layout-tab-desktop-padding: 24px !default;\n$layout-tab-highlight-thickness: 2px !default;\n\n\n/* ICON TOGGLE */\n\n$icon-toggle-size: 32px !default;\n$icon-toggle-font-size: 24px !default;\n$icon-toggle-ripple-size: 36px !default;\n\n/* FOOTER */\n\n/*mega-footer*/\n$footer-min-padding: 16px !default;\n$footer-padding-sides: 40px !default;\n$footer-heading-font-size: 14px !default;\n$footer-heading-line-height: (1.7 * $footer-heading-font-size) !default;\n$footer-btn-size: 36px !default;\n\n/*mini-footer*/\n$padding: 16px !default;\n$footer-heading-font-size: 24px !default;\n$footer-heading-line-height: (1.5 * $footer-heading-font-size) !default;\n$footer-btn-size: 36px !default;\n\n/* CHECKBOX */\n\n$checkbox-label-font-size: 16px !default;\n$checkbox-label-height: 24px !default;\n$checkbox-button-size: 16px !default;\n$checkbox-inner-margin: 2px !default;\n$checkbox-padding: 8px !default;\n$checkbox-top-offset:\n($checkbox-label-height - $checkbox-button-size - $checkbox-inner-margin) / 2;\n$checkbox-ripple-size: $checkbox-label-height * 1.5;\n\n/* CARD */\n\n/* Card dimensions */\n$card-width: 330px !default;\n$card-height: 200px !default;\n$card-font-size: 16px !default;\n$card-title-font-size: 24px !default;\n$card-subtitle-font-size: 14px !default;\n$card-horizontal-padding: 16px !default;\n$card-vertical-padding: 16px !default;\n\n$card-title-perspective-origin-x: 165px !default;\n$card-title-perspective-origin-y: 56px !default;\n\n$card-title-transform-origin-x: 165px !default;\n$card-title-transform-origin-y: 56px !default;\n\n$card-title-text-transform-origin-x: 149px !default;\n$card-title-text-transform-origin-y: 48px !default;\n\n$card-supporting-text-font-size: 1rem !default;\n$card-supporting-text-line-height: 18px !default;\n\n$card-actions-font-size: 16px !default;\n\n$card-title-text-font-weight: 300 !default;\n$card-z-index: 1 !default;\n\n/* Cover image */\n$card-cover-image-height: 186px !default;\n$card-background-image-url: '' !default;\n\n\n/* BUTTON */\n/**\n *\n * Dimensions\n *\n */\n$button-min-width: 64px !default;\n$button-height: 36px !default;\n$button-padding: 16px !default;\n$button-margin: 4px !default;\n$button-border-radius: 2px !default;\n\n$button-fab-size: 56px !default;\n$button-fab-size-mini: 40px !default;\n$button-fab-font-size: 24px !default;\n\n$button-icon-size: 32px !default;\n$button-icon-size-mini: 24px !default;\n\n\n/* ANIMATION */\n$animation-curve-fast-out-slow-in: cubic-bezier(0.4, 0, 0.2, 1) !default;\n$animation-curve-linear-out-slow-in: cubic-bezier(0, 0, 0.2, 1) !default;\n$animation-curve-fast-out-linear-in: cubic-bezier(0.4, 0, 1, 1) !default;\n\n$animation-curve-default: $animation-curve-fast-out-slow-in !default;\n\n\n/* PROGRESS */\n$bar-height: 4px !default;\n\n/* BADGE */\n$badge-font-size: 12px !default;\n$badge-color: unquote(\"rgb(#{$color-accent-contrast})\") !default;\n$badge-color-inverse: unquote(\"rgb(#{$color-accent})\") !default;\n$badge-background: unquote(\"rgb(#{$color-accent})\") !default;\n$badge-background-inverse: unquote(\"rgba(#{$color-accent-contrast},0.2)\") !default;\n$badge-size : 22px !default;\n$badge-padding: 2px !default;\n$badge-overlap: 12px !default;\n\n/* SHADOWS */\n\n$shadow-key-umbra-opacity: 0.2 !default;\n$shadow-key-penumbra-opacity: 0.14 !default;\n$shadow-ambient-shadow-opacity: 0.12 !default;\n\n/* GRID */\n\n$grid-desktop-columns: 12 !default;\n$grid-desktop-gutter: 16px !default;\n$grid-desktop-margin: 16px !default;\n\n$grid-desktop-breakpoint: 840px !default;\n\n$grid-tablet-columns: 8 !default;\n$grid-tablet-gutter: $grid-desktop-gutter !default;\n$grid-tablet-margin: $grid-desktop-margin !default;\n\n$grid-tablet-breakpoint: 480px !default;\n\n$grid-phone-columns: 4 !default;\n$grid-phone-gutter: $grid-desktop-gutter !default;\n$grid-phone-margin: $grid-desktop-margin !default;\n\n$grid-cell-default-columns: $grid-phone-columns !default;\n$grid-max-columns: $grid-desktop-columns !default;\n\n/* DATA TABLE */\n\n$data-table-font-size: 13px !default;\n$data-table-header-font-size: 12px !default;\n$data-table-header-sort-icon-size: 16px !default;\n\n$data-table-header-color: rgba(#000, 0.54) !default;\n$data-table-header-sorted-color: rgba(#000, 0.87) !default;\n$data-table-header-sorted-icon-hover-color: rgba(#000, 0.26) !default;\n$data-table-divider-color: rgba(#000, 0.12) !default;\n\n$data-table-hover-color: #eeeeee !default;\n$data-table-selection-color: #e0e0e0 !default;\n\n$data-table-dividers: 1px solid $data-table-divider-color !default;\n\n$data-table-row-height: 48px !default;\n$data-table-last-row-height: 56px !default;\n$data-table-header-height: 56px !default;\n\n$data-table-column-spacing: 36px !default;\n$data-table-column-padding: $data-table-column-spacing / 2;\n\n$data-table-card-header-height: 64px !default;\n$data-table-card-title-top: 20px !default;\n$data-table-card-padding: 24px !default;\n$data-table-button-padding-right: 16px !default;\n$data-table-cell-top: $data-table-card-padding / 2;\n\n/* DIALOG */\n$dialog-content-color: $card-supporting-text-text-color;\n\n/* SNACKBAR */\n\n// Hard coded since the color is not present in any palette.\n$snackbar-background-color: #323232 !default;\n$snackbar-tablet-breakpoint: $grid-tablet-breakpoint;\n$snackbar-action-color: unquote(\"rgb(#{$color-accent})\") !default;\n\n/* TOOLTIP */\n$tooltip-font-size: 10px !default;\n$tooltip-font-size-large: 14px !default;\n\n/* CHIP */\n$chip-bg-color: rgb(222, 222, 222) !default;\n$chip-bg-active-color: rgb(214, 214, 214) !default;\n$chip-height: 32px !default;\n$chip-font-size: 13px !default; \n","/**\n * Copyright 2015 Google Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n@import \"../variables\";\n\n.mdl-mini-footer {\n display: flex;\n flex-flow: row wrap;\n justify-content: space-between;\n\n padding: ($padding * 2) $padding;\n\n color: $footer-color;\n background-color: $footer-bg-color;\n\n &:after {\n content: '';\n display: block;\n }\n\n & .mdl-logo {\n line-height: $footer-btn-size;\n }\n}\n\n.mdl-mini-footer--link-list,\n.mdl-mini-footer__link-list {\n display: flex;\n flex-flow: row nowrap;\n\n list-style: none;\n\n margin: 0;\n padding: 0;\n\n & li {\n margin-bottom: 0;\n margin-right: $padding;\n\n @media screen and (min-width: 760px) {\n line-height: $footer-btn-size;\n }\n }\n\n & a {\n color: inherit;\n text-decoration: none;\n white-space: nowrap;\n }\n}\n\n.mdl-mini-footer--left-section,\n.mdl-mini-footer__left-section {\n display: inline-block;\n order: 0;\n}\n\n.mdl-mini-footer--right-section,\n.mdl-mini-footer__right-section {\n display: inline-block;\n order: 1;\n}\n\n.mdl-mini-footer--social-btn,\n.mdl-mini-footer__social-btn {\n width: $footer-btn-size;\n height: $footer-btn-size;\n\n padding: 0;\n margin: 0;\n\n background-color: $footer-button-fill-color;\n\n border: none;\n}\n","/**\n * Copyright 2015 Google Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n@import \"../variables\";\n\n.mdl-card {\n display: flex;\n flex-direction: column;\n font-size: $card-font-size;\n font-weight: 400;\n min-height: $card-height;\n overflow: hidden;\n width: $card-width;\n z-index: $card-z-index;\n position: relative;\n background: $card-background-color;\n border-radius: 2px;\n box-sizing: border-box;\n}\n\n.mdl-card__media {\n background-color: $card-image-placeholder-color;\n background-repeat: repeat;\n background-position: 50% 50%;\n background-size: cover;\n background-origin: padding-box;\n background-attachment: scroll;\n box-sizing: border-box;\n}\n\n.mdl-card__title {\n align-items: center;\n color: $card-text-color;\n display: block;\n display: flex;\n justify-content: stretch;\n line-height: normal;\n padding: $card-vertical-padding $card-horizontal-padding;\n perspective-origin: $card-title-perspective-origin-x $card-title-perspective-origin-y;\n transform-origin: $card-title-transform-origin-x $card-title-transform-origin-y;\n box-sizing: border-box;\n\n &.mdl-card--border {\n border-bottom: 1px solid $card-border-color;\n }\n}\n\n.mdl-card__title-text {\n align-self: flex-end;\n color: inherit;\n display: block;\n display: flex;\n font-size: $card-title-font-size;\n font-weight: $card-title-text-font-weight;\n line-height: normal;\n overflow: hidden;\n transform-origin: $card-title-text-transform-origin-x $card-title-text-transform-origin-y;\n margin: 0;\n}\n\n.mdl-card__subtitle-text {\n font-size: $card-subtitle-font-size;\n color: $card-subtitle-color;\n margin: 0;\n}\n\n.mdl-card__supporting-text {\n color: $card-supporting-text-text-color;\n font-size: $card-supporting-text-font-size;\n line-height: $card-supporting-text-line-height;\n overflow: hidden;\n padding: $card-vertical-padding $card-horizontal-padding;\n width: 90%;\n\n &.mdl-card--border {\n border-bottom: 1px solid $card-border-color;\n }\n}\n\n.mdl-card__actions {\n font-size: $card-actions-font-size;\n line-height: normal;\n width: 100%;\n background-color: rgba(0,0,0,0);\n padding: 8px;\n box-sizing: border-box;\n\n &.mdl-card--border {\n border-top: 1px solid $card-border-color;\n }\n}\n\n.mdl-card--expand {\n flex-grow: 1;\n}\n\n\n.mdl-card__menu {\n position: absolute;\n right: 16px;\n top: 16px;\n}\n","/**\n * Copyright 2015 Google Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n@import \"../variables\";\n@import \"../mixins\";\n\n// The button component. Defaults to a flat button.\n.mdl-button {\n background: transparent;\n border: none;\n border-radius: $button-border-radius;\n color: $button-secondary-color;\n position: relative;\n height: $button-height;\n margin: 0;\n min-width: $button-min-width;\n padding: 0 $button-padding;\n display: inline-block;\n @include typo-button();\n overflow: hidden;\n will-change: box-shadow;\n transition: box-shadow 0.2s $animation-curve-fast-out-linear-in,\n background-color 0.2s $animation-curve-default,\n color 0.2s $animation-curve-default;\n outline: none;\n cursor: pointer;\n text-decoration: none;\n text-align: center;\n line-height: $button-height;\n vertical-align: middle;\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &:hover {\n background-color: $button-hover-color;\n }\n\n &:focus:not(:active) {\n background-color: $button-focus-color;\n }\n\n &:active {\n background-color: $button-active-color;\n }\n\n &.mdl-button--colored {\n color: $button-primary-color-alt;\n\n &:focus:not(:active) {\n background-color: $button-focus-color-alt;\n }\n }\n}\n\ninput.mdl-button[type=\"submit\"] {\n -webkit-appearance:none;\n}\n\n // Raised buttons\n .mdl-button--raised {\n background: $button-primary-color;\n @include shadow-2dp();\n\n &:active {\n @include shadow-4dp();\n background-color: $button-active-color;\n }\n\n &:focus:not(:active) {\n @include focus-shadow();\n background-color: $button-active-color;\n }\n\n &.mdl-button--colored {\n background: $button-primary-color-alt;\n color: $button-secondary-color-alt;\n\n &:hover {\n background-color: $button-hover-color-alt;\n }\n\n &:active {\n background-color: $button-active-color-alt;\n }\n\n &:focus:not(:active) {\n background-color: $button-active-color-alt;\n }\n\n & .mdl-ripple {\n background: $button-ripple-color-alt;\n }\n }\n }\n\n\n // FABs\n .mdl-button--fab {\n border-radius: 50%;\n font-size: $button-fab-font-size;\n height: $button-fab-size;\n margin: auto;\n min-width: $button-fab-size;\n width: $button-fab-size;\n padding: 0;\n overflow: hidden;\n background: $button-primary-color;\n box-shadow: 0 1px 1.5px 0 rgba(0,0,0,0.12), 0 1px 1px 0 rgba(0,0,0,0.24);\n position: relative;\n line-height: normal;\n\n & .material-icons {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(- $button-fab-font-size / 2, - $button-fab-font-size / 2);\n line-height: $button-fab-font-size;\n width: $button-fab-font-size;\n }\n\n &.mdl-button--mini-fab {\n height: $button-fab-size-mini;\n min-width: $button-fab-size-mini;\n width: $button-fab-size-mini;\n }\n\n & .mdl-button__ripple-container {\n border-radius: 50%;\n // Fixes clipping bug in Safari.\n -webkit-mask-image: -webkit-radial-gradient(circle, white, black);\n }\n\n &:active {\n @include shadow-4dp();\n background-color: $button-active-color;\n }\n\n &:focus:not(:active) {\n @include focus-shadow();\n background-color: $button-active-color;\n }\n\n &.mdl-button--colored {\n background: $button-fab-color-alt;\n color: $button-fab-text-color-alt;\n\n &:hover {\n background-color: $button-fab-hover-color-alt;\n }\n\n &:focus:not(:active) {\n background-color: $button-fab-active-color-alt;\n }\n\n &:active {\n background-color: $button-fab-active-color-alt;\n }\n\n & .mdl-ripple {\n background: $button-fab-ripple-color-alt;\n }\n }\n }\n\n\n // Icon buttons\n .mdl-button--icon {\n border-radius: 50%;\n font-size: $button-fab-font-size;\n height: $button-icon-size;\n margin-left: 0;\n margin-right: 0;\n min-width: $button-icon-size;\n width: $button-icon-size;\n padding: 0;\n overflow: hidden;\n color: inherit;\n line-height: normal;\n\n & .material-icons {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(- $button-fab-font-size / 2, - $button-fab-font-size / 2);\n line-height: $button-fab-font-size;\n width: $button-fab-font-size;\n }\n\n &.mdl-button--mini-icon {\n height: $button-icon-size-mini;\n min-width: $button-icon-size-mini;\n width: $button-icon-size-mini;\n\n & .material-icons {\n top: ($button-icon-size-mini - $button-fab-font-size) / 2;\n left: ($button-icon-size-mini - $button-fab-font-size) / 2;\n }\n }\n\n & .mdl-button__ripple-container {\n border-radius: 50%;\n // Fixes clipping bug in Safari.\n -webkit-mask-image: -webkit-radial-gradient(circle, white, black);\n }\n }\n\n\n // Ripples\n .mdl-button__ripple-container {\n display: block;\n height: 100%;\n left: 0px;\n position: absolute;\n top: 0px;\n width: 100%;\n z-index: 0;\n overflow: hidden;\n\n .mdl-button[disabled] & .mdl-ripple,\n .mdl-button.mdl-button--disabled & .mdl-ripple {\n background-color: transparent;\n }\n }\n\n// Colorized buttons\n\n.mdl-button--primary.mdl-button--primary {\n color: $button-primary-color-alt;\n & .mdl-ripple {\n background: $button-secondary-color-alt;\n }\n &.mdl-button--raised, &.mdl-button--fab {\n color: $button-secondary-color-alt;\n background-color: $button-primary-color-alt;\n }\n}\n\n.mdl-button--accent.mdl-button--accent {\n color: $button-fab-color-alt;\n & .mdl-ripple {\n background: $button-fab-text-color-alt;\n }\n &.mdl-button--raised, &.mdl-button--fab {\n color: $button-fab-text-color-alt;\n background-color: $button-fab-color-alt;\n }\n}\n\n// Disabled buttons\n\n.mdl-button {\n // Bump up specificity by using [disabled] twice.\n &[disabled][disabled],\n &.mdl-button--disabled.mdl-button--disabled {\n color: $button-secondary-color-disabled;\n cursor: default;\n background-color: transparent;\n }\n\n &--fab {\n // Bump up specificity by using [disabled] twice.\n &[disabled][disabled],\n &.mdl-button--disabled.mdl-button--disabled {\n background-color: $button-primary-color-disabled;\n color: $button-secondary-color-disabled;\n }\n }\n\n &--raised {\n // Bump up specificity by using [disabled] twice.\n &[disabled][disabled],\n &.mdl-button--disabled.mdl-button--disabled {\n background-color: $button-primary-color-disabled;\n color: $button-secondary-color-disabled;\n box-shadow: none;\n }\n }\n &--colored {\n // Bump up specificity by using [disabled] twice.\n &[disabled][disabled],\n &.mdl-button--disabled.mdl-button--disabled {\n color: $button-secondary-color-disabled;\n }\n }\n}\n\n// Align icons inside buttons with text\n.mdl-button .material-icons {\n vertical-align: middle;\n}\n","// SIMPLE GRID - SASS/SCSS\n\n\n// fonts\n$font-weight-light: 300;\n$font-weight-regular: 400;\n$font-weight-heavy: 700;\n\n// colors\n$dark-grey: #333447;\n$dark-gray: #333447; // for the Americans\n\n\n.font-light {\n font-weight: $font-weight-light;\n}\n\n.font-regular {\n font-weight: $font-weight-regular;\n}\n\n.font-heavy {\n font-weight: $font-weight-heavy;\n}\n\n// utility\n\n.left {\n text-align: left;\n}\n\n.right {\n text-align: right;\n}\n\n.center {\n text-align: center;\n margin-left: auto;\n margin-right: auto;\n}\n\n.justify {\n text-align: justify;\n}\n\n.hidden-sm {\n display: none;\n}\n\n// grid\n\n$width: 98%;\n$gutter: 2%;\n$breakpoint-small: 33.75em; // 540px\n$breakpoint-med: 45em; // 720px\n$breakpoint-large: 60em; // 960px\n\n.container {\n width: 100%;\n margin-left: auto;\n margin-right: auto;\n}\n\n.row {\n position: relative;\n width: 100%;\n}\n\n.row [class^=\"col\"] {\n float: left;\n margin: 0.5rem 1%;\n min-height: 0.125rem;\n}\n\n.row::after {\n content: \"\";\n display: table;\n clear: both;\n}\n\n.col-1,\n.col-2,\n.col-3,\n.col-4,\n.col-5,\n.col-6,\n.col-7,\n.col-8,\n.col-9,\n.col-10,\n.col-11,\n.col-12 {\n width: $width;\n}\n\n.col-1-sm {\n width: ($width / 12) - ($gutter * 11 / 12);\n}\n\n.col-2-sm {\n width: ($width / 6) - ($gutter * 10 / 12);\n}\n\n.col-3-sm {\n width: ($width / 4) - ($gutter * 9 / 12);\n}\n\n.col-4-sm {\n width: ($width / 3) - ($gutter * 8 / 12);\n}\n\n.col-5-sm {\n width: ($width / (12 / 5)) - ($gutter * 7 / 12);\n}\n\n.col-6-sm {\n width: ($width / 2) - ($gutter * 6 / 12);\n}\n\n.col-7-sm {\n width: ($width / (12 / 7)) - ($gutter * 5 / 12);\n}\n\n.col-8-sm {\n width: ($width / (12 / 8)) - ($gutter * 4 / 12);\n}\n\n.col-9-sm {\n width: ($width / (12 / 9)) - ($gutter * 3 / 12);\n}\n\n.col-10-sm {\n width: ($width / (12 / 10)) - ($gutter * 2 / 12);\n}\n\n.col-11-sm {\n width: ($width / (12 / 11)) - ($gutter * 1 / 12);\n}\n\n.col-12-sm {\n width: $width;\n}\n\n@media only screen and (min-width: $breakpoint-med) {\n .col-1 {\n width: ($width / 12) - ($gutter * 11 / 12);\n }\n .col-2 {\n width: ($width / 6) - ($gutter * 10 / 12);\n }\n .col-3 {\n width: ($width / 4) - ($gutter * 9 / 12);\n }\n .col-4 {\n width: ($width / 3) - ($gutter * 8 / 12);\n }\n .col-5 {\n width: ($width / (12 / 5)) - ($gutter * 7 / 12);\n }\n .col-6 {\n width: ($width / 2) - ($gutter * 6 / 12);\n }\n .col-7 {\n width: ($width / (12 / 7)) - ($gutter * 5 / 12);\n }\n .col-8 {\n width: ($width / (12 / 8)) - ($gutter * 4 / 12);\n }\n .col-9 {\n width: ($width / (12 / 9)) - ($gutter * 3 / 12);\n }\n .col-10 {\n width: ($width / (12 / 10)) - ($gutter * 2 / 12);\n }\n .col-11 {\n width: ($width / (12 / 11)) - ($gutter * 1 / 12);\n }\n .col-12 {\n width: $width;\n }\n\n .hidden-sm {\n display: block;\n }\n}\n\n.row {\n display: -webkit-box;\n display: -webkit-flex;\n display: -ms-flexbox;\n display: flex;\n flex-wrap: wrap;\n}\n\n.row > [class*='col-'] {\n display: flex;\n flex-direction: column;\n}\n","\n/*\nMaterial Icons\n*/\n\n.material-icons {\n font-family: 'Material Icons';\n font-weight: normal;\n font-style: normal;\n font-size: 24px; /* Preferred icon size */\n display: inline-block;\n line-height: 1;\n text-transform: none;\n letter-spacing: normal;\n word-wrap: normal;\n white-space: nowrap;\n direction: ltr;\n \n /* Support for all WebKit browsers. */\n -webkit-font-smoothing: antialiased;\n /* Support for Safari and Chrome. */\n text-rendering: optimizeLegibility;\n \n /* Support for Firefox. */\n -moz-osx-font-smoothing: grayscale;\n \n /* Support for IE. */\n font-feature-settings: 'liga';\n }","html {\n font-size: $font_size;\n}\n\nbody {\n display: block !important;\n background-color: $background_color;\n font-size: 1rem;\n line-height: 1.5rem;\n font-family: $body_font_family;\n}\n\n.mdl-layout__content:focus {\n outline: none;\n }\n\n.mdl-layout__content header.mdl-layout__drawer {\n display: none;\n}\n\n.mdl-layout__container {\n height: calc(100% - 76px);\n margin-top: 76px;\n}\n.mdl-layout__header {\n position: fixed;\n transition: transform 0.5s;\n}\n.mdl-layout--fixed-drawer>.mdl-layout__content {\n margin-left: 300px; \n}\n\n@media screen and (max-width: 1024px) {\n .mdl-layout--fixed-drawer>.mdl-layout__content {\n margin-left:0\n }\n}\n\nh1, h2, h3, h4, h5, h6, blockquote, span.mdl-layout-title,\na.download > code.download {\n font-family: $body_font_family;\n}\n\nh1, h2, h3, h4, h5, h6, .toc-backref, .contents, .toctree-wrapper, .contents a, .toctree-wrapper a, .globaltoc a.current {\n color: $color-mxnet !important;\n}\n\na {\n text-decoration: none;\n}\n\n.page-content {\n font-size: 1rem;\n p, ul, ol, dl, dd, dt, table, th, td {\n font-size: 1rem;\n }\n}\n\n.brand {\n color: inherit;\n text-decoration: none;\n}\n\n.section {\n overflow-x: auto;\n}\n\n\n/*\n * Figure Directive Styles\n */\n img {\n max-width: 100%;\n display: block;\n margin-left: auto;\n margin-right: auto;\n }\n\ndiv.figure {\n p.caption {\n text-align: center;\n margin-top: .75rem;\n\n span.caption-number {\n font-style: normal;\n }\n .caption-number::after {\n content: \"\\00a0\";\n }\n }\n}\n\n.svg-icon {\n width: 16px;\n height: 16px;\n display: inline-block;\n fill: $grey-color-light;\n padding-right: 5px;\n padding-top: 4px;\n vertical-align: text-top;\n}\n\n/*\n * Download Link Styles\n */\na.download > i.material-icons {\n position: relative;\n top: 5px;\n}\n\na.download {\n text-decoration: none;\n}\n\n%clearfix:after {\n content: \"\";\n display: table;\n clear: both;\n}\n\n.wrapper {\n max-width: -webkit-calc(#{$content-width} - (#{$spacing-unit} * 2));\n max-width: calc(#{$content-width} - (#{$spacing-unit} * 2));\n margin-right: auto;\n margin-left: auto;\n padding-right: calc(#{$spacing-unit}+15px);\n padding-left: $spacing-unit;\n @extend %clearfix;\n\n @media screen and (max-width: $on-laptop) {\n max-width: -webkit-calc(#{$content-width} - (#{$spacing-unit}));\n max-width: calc(#{$content-width} - (#{$spacing-unit}));\n padding-right: $spacing-unit / 2;\n padding-left: $spacing-unit / 2;\n }\n}\n\n","/*\nVariables\n*/\n$font_size: 16px;\n\n$background_color: #fafafa;\n$code_background: rgba(0,0,0,.05);\n\n$code_font_family: \"Menlo\", \"DejaVu Sans Mono\", \"Liberation Mono\", \"Consolas\", \"Ubuntu Mono\", \"Courier New\", \"andale mono\", \"lucida console\", monospace !default;\n$body_font_family: -apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,\"Helvetica Neue\",Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",\"Segoe UI Symbol\" !default;\n$base-font-size: 17px !default;\n\n$xl-breakpoint: 1795px;\n$lg-breakpoint: 1200px;\n$md-breakpoint: 992px;\n$sm-breakpoint: 768px;\n$xs-breakpoint: 576px;\n\n$color-primary: $palette-blue-500;\n$color-primary-dark: $palette-blue-700 !default;\n$color-accent: $palette-deep-orange-A200 !default;\n$color-primary-contrast: $color-white !default;\n$color-accent-contrast: $color-white !default;\n\n\n$base-line-height: 1.5 !default;\n$spacing-unit: 30px !default;\n\n$color-mxnet: rgb(4,140,204);\n$color-mxnet-dark: rgb(4,60,110);\n$grey-color: #828282 !default;\n$grey-color-light: lighten($grey-color, 45%) !default;\n$grey-color-dark: darken($grey-color, 25%) !default;\n\n$table-text-align: left !default;\n\n// Width of the content area\n$content-width: 1150px !default;\n\n$on-palm: 600px !default;\n$on-palm: 900px !default;\n$on-laptop: 1024px !default;","/**\n * Layout Styles\n */\n $layout: (\n document: (\n xl: (\n width: 100%,\n )\n ),\n drawer-container: (\n width: $layout-drawer-width,\n ),\n side-doc-outline: (\n width: 230px,\n ),\n page-content: (\n md: (\n width: 90%,\n padding: 0 5%\n ),\n lg: (\n width: calc( 90% - 230px ),\n padding: 0 5%\n )\n )\n);\n\n.document {\n width: 100%;\n margin: 84px auto;\n display: flex;\n\n @media (min-width: $xl-breakpoint) {\n width: map-get(map-get(map-get($layout, document), xl), width);\n }\n .page-content {\n width: 100%;\n margin: 0 auto;\n padding: 0 12px;\n\n @media (min-width: $md-breakpoint) {\n width: map-get(map-get(map-get($layout, page-content), md), width);\n padding: map-get(map-get(map-get($layout, page-content), md), padding);\n }\n\n @media (min-width: $lg-breakpoint) {\n width: map-get(map-get(map-get($layout, page-content), lg), width);\n padding: map-get(map-get(map-get($layout, page-content), lg), padding);\n }\n }\n\n .side-doc-outline {\n width: map-get(map-get($layout, side-doc-outline), width);\n\n @media (max-width: $lg-breakpoint - 1) {\n display: none;\n } \n &--content {\n position: fixed;\n overflow-x: auto;\n overflow-y: auto;\n width: inherit;\n right: 0px;\n &::-webkit-scrollbar {\n width: 6px;\n }\n \n &::-webkit-scrollbar-track {\n border-radius: 6px;\n }\n \n &::-webkit-scrollbar-thumb {\n background-color: rgba(0, 0, 0, .3);\n border-radius: 6px;\n box-shadow:0 0 0 1px rgba(255, 255, 255, .3);\n }\n }\n }\n\n}","@keyframes float-in {\n 0% {\n transform: translateY(0.5rem);\n opacity: 0;\n }\n\t100% {\n\t\ttransform: translateY(0);\n\t\topacity: 1;\n\t}\n}\n\n@keyframes float-out {\n 0% {\n transform: translateY(0);\n opacity: 1;\n }\n\t100% {\n\t\ttransform: translateY(0.5rem);\n\t\topacity: 0;\n\t}\n}\n\n.page-content {\n .headerlink {\n display: inline-block;\n text-decoration: none;\n margin-left: 0.8rem;\n color: inherit;\n opacity: 0;\n &:hover {\n animation: float-in 0.2s $animation-curve-fast-out-slow-in 0s forwards;\n }\n }\n\n h1, h2, h3, h4, h5, h6 {\n .toc-backref {\n text-decoration: none;\n }\n &:hover {\n .headerlink {\n animation: float-in 0.2s $animation-curve-fast-out-slow-in 0s forwards;\n }\n }\n }\n\n h1 {\n font-size: 2rem;\n line-height: 2.25rem;\n }\n\n h2 {\n font-size: 1.75rem;\n line-height: 2rem;\n padding-top: 1.5rem;\n margin-top: 0;\n margin-bottom: 1rem;\n }\n\n h3 {\n font-size: 1.5rem;\n line-height: 1.75rem;\n padding-top: 1rem;\n margin-top: 0px;\n margin-bottom: .75rem;\n }\n\n h4 {\n font-size: 1.25rem;\n line-height: 1.5rem;\n padding-top: .75rem;\n margin-top: 0px;\n margin-bottom: .5rem;\n }\n\n div.page-content h5 {\n font-size: 1.1rem;\n line-height: 1.5rem;\n padding-top: 2rem;\n margin-top: 0px;\n margin-bottom: 1rem;\n }\n\n div.page-content h6 {\n font-size: 1rem;\n line-height: 1.5rem;\n padding-top: 2rem;\n margin-top: 0px;\n margin-bottom: 1rem;\n }\n\n\n}\n","\n/*\n * Admonition Styles\n */\n $admonitions: (\n hint: (\n font-color: rgb(0, 188, 212),\n background-color: rgba(0, 188, 212, 0.1),\n icon-content: \"help_outline\"\n ),\n note: (\n font-color: rgb(0, 188, 212),\n background-color: rgba(0, 188, 212, 0.1),\n icon-content: \"info_outline\"\n ),\n seealso: (\n font-color: rgb(0, 188, 212),\n background-color: rgba(0, 188, 212, 0.1),\n icon-content: \"search\"\n ),\n warning: (\n font-color: rgb(255, 193, 7),\n background-color: rgba(255, 193, 7, 0.1),\n icon-content: \"warning\"\n ),\n attention: (\n font-color: rgb(255, 193, 7),\n background-color: rgba(255, 193, 7, 0.1),\n icon-content: \"warning\"\n ),\n tip: (\n font-color: rgb(139, 195, 74),\n background-color: rgba(139, 195, 74, 0.1),\n icon-content: \"lightbulb_outline\"\n ),\n important: (\n font-color: rgb(139, 195, 74),\n background-color: rgba(139, 195, 74, 0.1),\n icon-content: \"check_circle\"\n ),\n error: (\n font-color: rgb(244, 67, 54),\n background-color: rgba(244, 67, 54, 0.1),\n icon-content: \"error_outline\"\n ),\n caution: (\n font-color: rgb(244, 67, 54),\n background-color: rgba(244, 67, 54, 0.1),\n icon-content: \"error_outline\"\n ),\n danger: (\n font-color: rgb(244, 67, 54),\n background-color: rgba(244, 67, 54, 0.1),\n icon-content: \"error_outline\"\n )\n);\n\n @mixin admonition-style($type) {\n border-left: solid 4px map-get(map-get($admonitions, $type), font-color);\n background-color: map-get(map-get($admonitions, $type), background-color);\n .admonition-title {\n font-size: 16px;\n font-weight: bold;\n color: map-get(map-get($admonitions, $type), font-color);\n\n margin-top: 4px;\n margin-bottom: 8px;\n &::before {\n @extend .material-icons;\n position: relative;\n margin-right: 5px;\n top: 3px;\n content: map-get(map-get($admonitions, $type), icon-content);\n font-size: 18px;\n }\n }\n}\n\n.admonition {\n @extend .mdl-shadow--2dp;\n\n padding: 12px 20px;\n margin-top: 10px;\n margin-bottom: 10px;\n p.last {\n margin: 16px;\n }\n .admonition-title {\n font-size: 16px;\n font-weight: bold;\n color: #555;\n text-transform: uppercase;\n margin-top: 7px;\n }\n\n @each $type in (note, seealso, hint, warning, attention, tip, important, error, caution, danger) {\n &.#{$type} {\n @include admonition-style($type);\n }\n }\n}\n",".page-content {\n .highlight {\n margin: 1px 0;\n pre {\n background: $code_background;\n color: rgba(0,0,0,.87);\n font-family: $code_font_family;\n padding: 0.75rem;\n overflow: auto;\n overflow-y: hidden;\n .o, .nd {\n color: rgba(0,0,0,.87);\n }\n }\n }\n\n div.highlight-console div.highlight {\n background: none;\n }\n\n // for jupyter notebook output cell\n .output {\n .highlight {\n pre {\n color: rgba(0,0,0,.87);\n background: $background_color;\n border-width: 1px;\n border-color: #999;\n border-style: solid;\n padding: 0.75rem;\n }\n }\n }\n\n .code, code:not(.download) {\n margin: 0 0;\n font-family: $code_font_family;\n border-radius: 2px;\n span.pre {\n font-family: $code_font_family;\n }\n }\n\n .viewcode-link {\n padding-left: 2em;\n font-size: 80%;\n }\n\n .rubric, .method > dt, .function > dt, .class > dt {\n display: table;\n margin: 10px 0;\n font-size: 100%;\n line-height: normal;\n background: #e7f2fa;\n color: #2B98F0;\n border-top: solid 3px #55ADF3;\n padding: 10px;\n position: relative;\n .descname, .descclassname {\n color: rgba(0,0,0,.87);\n background: #e7f2fa;\n padding: 3px;\n }\n em {\n padding: 0 2px;\n }\n }\n\n\n .rubric {\n margin: 30px 0 10px 0;\n }\n\n\n .field-body {\n padding-left: 40px;\n ul {\n padding: 0 0 0 16px;\n margin: 0;\n }\n }\n\n // .docutils > dt {\n // padding: 6px;\n // display: table;\n // margin-bottom: 6px;\n // border: none;\n // border-left: solid 3px #ccc;\n // background: #f0f0f0;\n // color: #555;\n // }\n\n .seealso .docutils > dt {\n float: left;\n clear: left;\n padding: 0 6px;\n }\n\n .seealso .docutils > dd {\n padding-left: 6em;\n }\n .nblast {\n padding-bottom: 1em;\n }\n\n pre {\n font-size: 90%;\n background: #eee;\n color: #455A64;\n padding: 16px 32px;\n width: auto;\n border-radius: 4px;\n word-wrap: break-word;\n\n &:hover {\n @extend .mdl-shadow--2dp;\n\n &:before {\n font-family: $body_font_family;\n padding: 0 0.5rem;\n content: attr(click-to-copy);\n color: rgba(0, 0, 0, 0.5);\n border-radius: 4px;\n position: relative;\n float: right;\n top: -0.5rem;\n right: -0.5rem;\n background: rgb(200, 200, 200);\n font-size: 0.8rem;\n cursor: pointer;\n }\n }\n }\n}\n","/*\n * Quotation Block Styles\n */\n .page-content {\n blockquote {\n font-size: 1rem;\n padding: 0 1rem;\n border-left: 3px solid $code_background;\n\n &:after {\n content: \"\" !important;\n margin-left: 0;\n }\n &:before {\n content: \"\" !important;\n }\n }\n }\n",".page-content {\n table:not(.footnote):not(.indextable):not(.hlist):not(.option-list):not(.field-list) {\n @extend .mdl-data-table;\n @extend .mdl-shadow--2dp;\n\n margin: 1.5rem 0;\n table-layout: fixed;\n max-width: 100%;\n min-width: 70%;\n\n th, td {\n @extend .mdl-data-table__cell--non-numeric;\n white-space: normal;\n overflow-wrap: break-word;\n }\n\n caption {\n font-size: $font_size;\n margin: 1rem 0 0.8rem 0;\n white-space: normal;\n .caption-number {\n font-style: normal;\n }\n .caption-number::after {\n content: \"\\00a0\";\n }\n }\n\n }\n}\n",".globaltoc {\n \n .caption, .toc {\n display: none;\n }\n\n ul {\n\n list-style-type: none;\n padding: 0;\n margin: 0;\n\n li {\n min-height: 18px;\n .link-wrapper {\n display: flex;\n justify-content: space-between;\n > a {\n padding: 4px 0;\n display: block;\n width: 100%;\n font-size: 1rem;\n text-decoration: none;\n color: $layout-drawer-navigation-color;\n &.current {\n font-weight: bold;\n }\n }\n }\n }\n }\n\n .nav-toggle {\n padding: 0;\n float: right;\n display: flex;\n align-items: center;\n justify-content: center;\n height: 36px;\n > a {\n padding: 0;\n margin-left: 0;\n margin-right: 4px;\n cursor: pointer;\n > i {\n font-size: 18px;\n }\n }\n &.show {\n transform: rotateZ(180deg);\n > a {\n margin-right: 0;\n margin-left: 4px;\n }\n }\n }\n\n nav {\n > ul > li > span.link-wrapper {\n padding-left: 8px;\n }\n > ul > li > ul > li > span.link-wrapper {\n padding-left: 16px;\n }\n > ul > li > ul > li > ul > li > span.link-wrapper {\n padding-left: 24px;\n }\n > ul > li > ul > li > ul > li > ul> li > span.link-wrapper {\n padding-left: 32px;\n }\n > ul > li > ul > li > ul > li > ul > li > ul> li > span.link-wrapper {\n padding-left: 40px;\n }\n > ul > li > ul > li > ul > li > ul > li > ul > li > ul> li > span.link-wrapper {\n padding-left: 48px;\n }\n }\n}\n",".localtoc {\n font-size: 0.75rem;\n padding-top: 1rem;\n\n .caption {\n padding-left: 12px;\n &-text {\n font-size: 0.9rem;\n font-weight: 700;\n }\n }\n\n > ul > li > a {\n display: none;\n }\n\n ul {\n padding: 0;\n list-style-type: none;\n }\n\n li {\n padding-left: 6px;\n }\n\n a {\n display: block;\n text-decoration: none;\n color: inherit;\n margin-top: 8px;\n padding-left: 8px;\n line-height: 1.1rem;\n \n &.current {\n padding-left: 5px;\n border-left: 3px solid;\n font-weight: bold;\n }\n }\n}","/*\r\n * Toctree and Contents Directive Styles\r\n */\r\n .toctree-wrapper,\r\n .contents.topic {\r\n border-left: 5px solid;\r\n }\r\n\r\n .toctree-wrapper > p.caption,\r\n .contents.topic > p.topic-title {\r\n color: rgb(117, 117, 117);\r\n font-size: 1rem;\r\n padding-left: 14px;\r\n }\r\n\r\n .toctree-wrapper ul,\r\n .contents.topic ul{\r\n padding-left: 14px;\r\n list-style: none;\r\n line-height: 30px;\r\n }\r\n\r\n .toctree-wrapper a,\r\n .contents.topic a {\r\n font-size: 1.2rem;\r\n text-decoration: none;\r\n .pre {\r\n font-size: 1rem;\r\n }\r\n }\r\n\r\n .toctree-wrapper > ul > li > a,\r\n .contents.topic > ul > li > a {\r\n font-size: 1.3rem;\r\n .pre {\r\n font-size: 1.1rem;\r\n }\r\n }\r\n",".page-content {\n ul {\n li {\n margin: .3rem 0;\n p {\n margin: 0;\n }\n }\n }\n .option-list {\n .option {\n font-family: $code_font_family;\n }\n td {\n padding: 0.5rem;\n border: none;\n }\n }\n}\n","/*\r\n * Drawer Styles\r\n */\r\n.mdl-layout {\r\n &__drawer {\r\n background-color: #fff;\r\n\r\n &::-webkit-scrollbar {\r\n width: 6px;\r\n }\r\n\r\n &::-webkit-scrollbar-track {\r\n border-radius: 6px;\r\n }\r\n\r\n &::-webkit-scrollbar-thumb {\r\n background-color: rgba(0, 0, 0, .3);\r\n border-radius: 6px;\r\n box-shadow:0 0 0 1px rgba(255, 255, 255, .3);\r\n }\r\n\r\n > .mdl-layout-title {\r\n font-weight: bold;\r\n text-align: right;\r\n margin: 0;\r\n padding: 0;\r\n line-height: 32px;\r\n border-bottom: 1px solid rgba(0,0,0,.1);\r\n min-height: 64px;\r\n .title {\r\n color: inherit;\r\n display: block;\r\n height: 100%;\r\n width: 100%;\r\n text-decoration: none;\r\n > img.logo {\r\n width: 100%;\r\n margin: 0;\r\n padding: 0;\r\n }\r\n\r\n &-text {\r\n font-weight: bold;\r\n text-align: right;\r\n padding: 0 10px;\r\n margin: 16px 0 8px 0;\r\n line-height: 32px;\r\n font-family: $body_font_family;\r\n color: inherit;\r\n display: block;\r\n }\r\n }\r\n }\r\n }\r\n}\r\n","/*\r\n * Header Styles\r\n */\r\n\r\nnav.breadcrumb {\r\n > a.mdl-navigation__link {\r\n padding: 0 8px;\r\n font-size: 18px;\r\n }\r\n @media (max-width: $lg-breakpoint - 1) {\r\n width: calc( 100% - 64px );\r\n a.mdl-navigation__link.is-active {\r\n overflow-x: hidden;\r\n width: 100%;\r\n overflow: hidden;\r\n white-space: nowrap;\r\n text-overflow: ellipsis;\r\n }\r\n a.mdl-navigation__link:not(.is-active),\r\n i.material-icons {\r\n display: none;\r\n }\r\n }\r\n}\r\n\r\ndiv.mdl-layout__header {\r\n margin-top: 77px;\r\n}\r\n\r\n.mdl-layout__drawer-button {\r\n top: 13px !important;\r\n}\r\n\r\ndiv.mdl-layout__header-row.header-links {\r\n background: rgba(255,255,255,0.2);\r\n width: 100%;\r\n overflow-x: auto;\r\n overflow-y: hidden;\r\n\r\n a.mdl-navigation__link {\r\n font-size: 1rem;\r\n i {\r\n font-size: 1.2rem;\r\n margin: 0 8px;\r\n position: relative;\r\n bottom: -0.1rem;\r\n }\r\n };\r\n\r\n a.mdl-navigation__link:hover {\r\n background-color: unquote(\"rgb(#{$color-primary})\");\r\n color: #eeeeee;\r\n };\r\n a.mdl-navigation__link[href=\"#\"] {\r\n background-color: unquote(\"rgb(#{$color-primary})\");\r\n opacity: 1;\r\n color: #ffffff;\r\n };\r\n}\r\n\r\n/* mxnet-header */\r\n\r\n\r\n.site-title {\r\n font-weight: 300 !important;\r\n line-height: 57px;\r\n letter-spacing: -1px;\r\n margin-bottom: 0;\r\n float: left;\r\n color: white;\r\n\r\n &,\r\n &:visited {\r\n color: $grey-color-dark;\r\n }\r\n}\r\n\r\n\r\n.site-header {\r\n position: fixed;\r\n top: 0;\r\n width: 100%;\r\n min-height: 55px;\r\n padding-top: 10px;\r\n padding-bottom: 10px;\r\n background-color: $color-mxnet;\r\n z-index: 10;\r\n font-weight: 300;\r\n font-size: 17px;\r\n border-bottom: 1px solid white;\r\n}\r\n\r\n.site-header-logo {\r\n width: 120px;\r\n display: initial;\r\n}\r\n\r\n.site-nav {\r\n float: right;\r\n line-height: 57px;\r\n\r\n .nav-trigger {\r\n display: none;\r\n }\r\n\r\n .menu-icon {\r\n display: none;\r\n }\r\n\r\n .page-link {\r\n color: white;\r\n line-height: 1.5;\r\n font-weight: 300;\r\n // Gaps between nav items, but not on the last one\r\n &:not(:last-child) {\r\n margin-right: 40px;\r\n }\r\n\r\n &:hover {\r\n color: white;\r\n text-shadow: -0.06ex 0 white, 0.06ex 0 white;\r\n }\r\n }\r\n\r\n .page-link.page-current {\r\n color: white;\r\n text-decoration: underline;\r\n }\r\n\r\n @media screen and (max-width: $on-laptop) {\r\n position: absolute;\r\n top: 9px;\r\n right: 15px;\r\n background-color: rgb(23,141,201);\r\n border-radius: 2px;\r\n text-align: right;\r\n\r\n label[for=\"nav-trigger\"] {\r\n display: block;\r\n float: right;\r\n width: 36px;\r\n height: 36px;\r\n z-index: 2;\r\n cursor: pointer;\r\n }\r\n\r\n .menu-icon {\r\n display: block;\r\n float: right;\r\n width: 36px;\r\n height: 26px;\r\n line-height: 0;\r\n padding-top: 20px;\r\n text-align: center;\r\n\r\n > svg {\r\n fill: white;\r\n }\r\n }\r\n\r\n input ~ .trigger {\r\n clear: both;\r\n display: none;\r\n }\r\n\r\n input:checked ~ .trigger {\r\n display: block;\r\n padding-bottom: 5px;\r\n }\r\n\r\n .page-link {\r\n padding: 5px 10px;\r\n display: block;\r\n\r\n &:not(:last-child) {\r\n margin-right: 0;\r\n }\r\n\r\n margin-left: 20px;\r\n }\r\n }\r\n}","/*\r\n * Footer Styles\r\n */\r\nfooter.mdl-mini-footer {\r\n background-color: #212121;\r\n > div.mdl-mini-footer__left-section {\r\n margin-bottom: 20px;\r\n display: flex;\r\n flex-direction: column;\r\n .mdl-logo {\r\n font-size: 1.1rem;\r\n }\r\n ul {\r\n @extend .mdl-mini-footer__link-list;\r\n }\r\n }\r\n > div.mdl-mini-footer__right-section {\r\n font-size: 0.9rem;\r\n display: flex;\r\n flex-direction: column;\r\n justify-content: flex-end;\r\n\r\n a {\r\n color: inherit;\r\n font-weight: bold;\r\n text-decoration: none;\r\n }\r\n }\r\n p.caption {\r\n display: none;\r\n }\r\n}\r\n\r\n/*\r\n * Pagenation Block Styles\r\n */\r\n .pagenation {\r\n width: 100%;\r\n margin-top: 80px;\r\n height: 92px;\r\n background-color: #424242;\r\n display: flex;\r\n\r\n .button-common {\r\n text-transform: none;\r\n padding: 0;\r\n height: 92px;\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n color: #ffffff;\r\n }\r\n #button-prev {\r\n @extend .button-common;\r\n margin-right: auto;\r\n .pagenation-text {\r\n text-align: left;\r\n }\r\n \r\n }\r\n #button-next {\r\n @extend .button-common;\r\n margin-left: auto;\r\n flex-direction: row-reverse;\r\n .pagenation-text {\r\n text-align: right;\r\n }\r\n }\r\n\r\n &-arrow {\r\n &-L {\r\n margin-right: 20px;\r\n }\r\n &-R {\r\n margin-left: 20px;\r\n }\r\n }\r\n\r\n &-text {\r\n line-height: 30px;\r\n font-size: 20px;\r\n }\r\n\r\n &-direction {\r\n opacity: 0.7;\r\n font-size: 18px;\r\n }\r\n @media screen and (max-width: 1024px) {\r\n #button-prev {\r\n width: 20%;\r\n }\r\n \r\n #button-next {\r\n width: 80%;\r\n }\r\n \r\n #button-prev .pagenation-text {\r\n display: none;\r\n }\r\n }\r\n @media screen and (min-width: 1025px) {\r\n #button-prev,\r\n #button-next {\r\n width: 50%;\r\n }\r\n \r\n #button-prev .pagenation-text {\r\n display: block;\r\n }\r\n }\r\n}\r\n\r\n\r\n\r\n/**\r\n * Site footer\r\n */\r\n.site-footer {\r\n border-top: 1px solid $grey-color-light;\r\n padding: $spacing-unit 0;\r\n background-color: #424242;\r\n position: relative;\r\n z-index: 10;\r\n .footer-category-title {\r\n color: $color-mxnet;\r\n }\r\n a {\r\n color: $grey-color-light !important;\r\n\r\n &:visited {\r\n color: $grey-color-light !important;\r\n }\r\n }\r\n\r\n}\r\n\r\n.site-footer2 {\r\n background-color: #424242;\r\n padding-top: 40px;\r\n padding-bottom: 10px;\r\n position: relative;\r\n z-index: 10;\r\n}\r\n\r\n.footer-heading {\r\n margin-bottom: $spacing-unit / 2;\r\n}\r\n\r\n.contact-list,\r\n.social-media-list {\r\n list-style: none;\r\n margin-left: 0;\r\n}\r\n\r\n\r\n.footer-bottom-warning {\r\n font-size: 80%;\r\n color: white;\r\n float: left;\r\n}\r\n\r\n.footer-logo {\r\n width: 200px;\r\n margin-bottom: 30px;\r\n margin-top: 30px;\r\n}\r\n\r\n.footer-col {\r\n float: left;\r\n margin-bottom: $spacing-unit / 2;\r\n padding-left: $spacing-unit / 2;\r\n}\r\n\r\n.footer-text {\r\n color: $grey-color-light;\r\n}\r\n\r\n"," /*\r\n * Search Styles\r\n */\r\n#waterfall-exp::-webkit-input-placeholder {\r\n color: #ccc;\r\n}\r\n#waterfall-exp:-ms-input-placeholder {\r\n color: #ccc;\r\n}\r\n#waterfall-exp::-moz-placeholder {\r\n color: #ccc;\r\n}\r\n\r\nul.search span.highlighted {\r\n font-weight: bold;\r\n}\r\n\r\nul.search > li {\r\n margin-bottom: 24px;\r\n}\r\n\r\n#search-results {\r\n ul {\r\n list-style: none;\r\n padding: 0;\r\n li {\r\n > a {\r\n text-decoration: none;\r\n font-size: 1.2rem;\r\n }\r\n }\r\n }\r\n}\r\n","a.download {\n &:before {\n @extend .material-icons;\n content: \"file_download\";\n position: relative;\n top: 5px;\n margin-right: 5px;\n }\n}\n\nbutton.download {\n position: sticky;\n margin-left: 1em;\n}\n",".mdl-card {\n margin: 1em 1.5em 1em 0;\n display: inline-block;\n width: 250px;\n min-height: 140px;\n padding: 18px;\n}\n.mdl-card:hover {\n box-shadow: 0 10px 20px rgba(0,0,0,0.25), 0 6px 6px rgba(0,0,0,0.22);\n color: #000;\n cursor: pointer;\n}\n.mdl-card__title {\n padding: 0 0 1em 0;\n font-size: 18px;\n color: #444;\n}\n\n.mdl-card__supporting-text {\n line-height: 1.5rem;\n padding: 0px;\n width: 100%;\n}\n\n.head-card.mdl-card {\n width: auto;\n display: block;\n max-width: 800px;\n padding: 24px;\n}\n\n.head-card > .mdl-card__title {\n padding-bottom: 0px;\n height: 60px;\n font-weight: 700;\n text-transform: uppercase;\n}\n.head-card > .mdl-card__menu {\n color: #fff;\n}\n.head-card > .mdl-card__actions {\n padding: 0;\n}\n.cards {\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../../node_modules/material-design-lite/src/shadow/_shadow.scss","../../node_modules/material-design-lite/src/_mixins.scss","../../node_modules/material-design-lite/src/data-table/_data-table.scss","../../node_modules/material-design-lite/src/_variables.scss","../../node_modules/material-design-lite/src/footer/_mini_footer.scss","../../node_modules/material-design-lite/src/card/_card.scss","../../node_modules/material-design-lite/src/button/_button.scss","../scss/grid/_simplegrid.scss","../scss/fonts/_material-icons.scss","../scss/_root.scss","../scss/_variables.scss","../scss/layout/_layout.scss","../scss/headerings/_headerings.scss","../scss/admonitions/_admonitions.scss","../scss/code/_code.scss","../scss/blockquote/_blockquote.scss","../scss/tables/_tables.scss","../scss/toc/_globaltoc.scss","../scss/toc/_localtoc.scss","../scss/toc/_toctree.scss","../scss/lists/_lists.scss","../scss/drawer/_drawer.scss","../scss/header/_header.scss","../scss/footer/_footer.scss","../scss/search/_search.scss","../scss/downloadlink/_downloadlink.scss","../scss/card/_card.scss"],"names":[],"mappings":"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","file":"sphinx_materialdesign_theme.css","sourceRoot":"../../src/js","sourcesContent":["/**\n * Copyright 2015 Google Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n@import \"../variables\";\n@import \"../mixins\";\n\n.mdl-shadow--2dp {\n @include shadow-2dp();\n}\n\n.mdl-shadow--3dp {\n @include shadow-3dp();\n}\n\n.mdl-shadow--4dp {\n @include shadow-4dp();\n}\n\n.mdl-shadow--6dp {\n @include shadow-6dp();\n}\n\n.mdl-shadow--8dp {\n @include shadow-8dp();\n}\n\n.mdl-shadow--16dp {\n @include shadow-16dp();\n}\n\n.mdl-shadow--24dp {\n @include shadow-24dp();\n}\n","/**\n * Copyright 2015 Google Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/* Typography */\n\n@mixin typo-preferred-font($usePreferred: true) {\n @if $usePreferred {\n font-family: $preferred_font;\n }\n}\n\n@mixin typo-display-4($colorContrast: false, $usePreferred: true) {\n @include typo-preferred-font($usePreferred);\n font-size: 112px;\n font-weight: 300;\n line-height: 1;\n letter-spacing: -0.04em;\n\n @if $colorContrast {\n opacity: 0.54;\n }\n}\n\n@mixin typo-display-3($colorContrast: false, $usePreferred: true) {\n @include typo-preferred-font($usePreferred);\n font-size: 56px;\n font-weight: 400;\n line-height: 1.35;\n letter-spacing: -0.02em;\n\n @if $colorContrast {\n opacity: 0.54;\n }\n}\n\n@mixin typo-display-2($colorContrast: false, $usePreferred: true) {\n @include typo-preferred-font($usePreferred);\n font-size: 45px;\n font-weight: 400;\n line-height: 48px;\n\n @if $colorContrast {\n opacity: 0.54;\n }\n}\n\n@mixin typo-display-1($colorContrast: false, $usePreferred: true) {\n @include typo-preferred-font($usePreferred);\n font-size: 34px;\n font-weight: 400;\n line-height: 40px;\n\n @if $colorContrast {\n opacity: 0.54;\n }\n}\n\n@mixin typo-headline($colorContrast: false, $usePreferred: true) {\n @include typo-preferred-font($usePreferred);\n font-size: 24px;\n font-weight: 400;\n line-height: 32px;\n -moz-osx-font-smoothing: grayscale;\n\n @if $colorContrast {\n opacity: 0.87;\n }\n}\n\n@mixin typo-title($colorContrast: false, $usePreferred: true) {\n @include typo-preferred-font($usePreferred);\n font-size: 20px;\n font-weight: 500;\n line-height: 1;\n letter-spacing: 0.02em;\n\n @if $colorContrast {\n opacity: 0.87;\n }\n}\n\n@mixin typo-subhead($colorContrast: false, $usePreferred: true) {\n @include typo-preferred-font($usePreferred);\n font-size: 16px;\n font-weight: 400;\n line-height: 24px;\n letter-spacing: 0.04em;\n\n @if $colorContrast {\n opacity: 0.87;\n }\n}\n\n@mixin typo-subhead-2($colorContrast: false, $usePreferred: true) {\n @include typo-preferred-font($usePreferred);\n font-size: 16px;\n font-weight: 400;\n line-height: 28px;\n letter-spacing: 0.04em;\n\n @if $colorContrast {\n opacity: 0.87;\n }\n}\n\n@mixin typo-body-2($colorContrast: false, $usePreferred: false) {\n @include typo-preferred-font($usePreferred);\n font-size: 14px;\n @if $usePreferred {\n font-weight: 500;\n } @else {\n font-weight: bold;\n }\n line-height: 24px;\n letter-spacing: 0;\n\n @if $colorContrast {\n opacity: 0.87;\n }\n}\n\n@mixin typo-body-1($colorContrast: false, $usePreferred: false) {\n @include typo-preferred-font($usePreferred);\n font-size: 14px;\n font-weight: 400;\n line-height: 24px;\n letter-spacing: 0;\n\n @if $colorContrast {\n opacity: 0.87;\n }\n}\n\n@mixin typo-caption($colorContrast: false, $usePreferred: false) {\n @include typo-preferred-font($usePreferred);\n font-size: 12px;\n font-weight: 400;\n line-height: 1;\n letter-spacing: 0;\n\n @if $colorContrast {\n opacity: 0.54;\n }\n}\n\n@mixin typo-blockquote($colorContrast: false, $usePreferred: true) {\n @include typo-preferred-font($usePreferred);\n position: relative;\n font-size: 24px;\n font-weight: 300;\n font-style: italic;\n line-height: 1.35;\n letter-spacing: 0.08em;\n\n &:before {\n position: absolute;\n left: -0.5em;\n content: '“';\n }\n\n &:after {\n content: '”';\n margin-left: -0.05em;\n }\n\n @if $colorContrast {\n opacity: 0.54;\n }\n}\n\n@mixin typo-menu($colorContrast: false, $usePreferred: true) {\n @include typo-preferred-font($usePreferred);\n font-size: 14px;\n font-weight: 500;\n line-height: 1;\n letter-spacing: 0;\n\n @if $colorContrast {\n opacity: 0.87;\n }\n}\n\n@mixin typo-button($colorContrast: false, $usePreferred: true) {\n @include typo-preferred-font($usePreferred);\n font-size: 14px;\n font-weight: 500;\n text-transform: uppercase;\n line-height: 1;\n letter-spacing: 0;\n\n @if $colorContrast {\n opacity: 0.87;\n }\n}\n\n@mixin typo-icon() {\n font-family: 'Material Icons';\n font-weight: normal;\n font-style: normal;\n font-size: 24px;\n line-height: 1;\n letter-spacing: normal;\n text-transform: none;\n display: inline-block;\n word-wrap: normal;\n font-feature-settings: 'liga';\n -webkit-font-feature-settings: 'liga';\n -webkit-font-smoothing: antialiased;\n}\n\n/* Shadows */\n\n// Focus shadow mixin.\n@mixin focus-shadow() {\n box-shadow: 0 0 8px rgba(0,0,0,.18),0 8px 16px rgba(0,0,0,.36);\n}\n\n@mixin shadow-2dp() {\n box-shadow: 0 2px 2px 0 rgba(0, 0, 0, $shadow-key-penumbra-opacity),\n 0 3px 1px -2px rgba(0, 0, 0, $shadow-key-umbra-opacity),\n 0 1px 5px 0 rgba(0, 0, 0, $shadow-ambient-shadow-opacity);\n}\n@mixin shadow-3dp() {\n box-shadow: 0 3px 4px 0 rgba(0, 0, 0, $shadow-key-penumbra-opacity),\n 0 3px 3px -2px rgba(0, 0, 0, $shadow-key-umbra-opacity),\n 0 1px 8px 0 rgba(0, 0, 0, $shadow-ambient-shadow-opacity);\n}\n@mixin shadow-4dp() {\n box-shadow: 0 4px 5px 0 rgba(0, 0, 0, $shadow-key-penumbra-opacity),\n 0 1px 10px 0 rgba(0, 0, 0, $shadow-ambient-shadow-opacity),\n 0 2px 4px -1px rgba(0, 0, 0, $shadow-key-umbra-opacity);\n}\n@mixin shadow-6dp() {\n box-shadow: 0 6px 10px 0 rgba(0, 0, 0, $shadow-key-penumbra-opacity),\n 0 1px 18px 0 rgba(0, 0, 0, $shadow-ambient-shadow-opacity),\n 0 3px 5px -1px rgba(0, 0, 0, $shadow-key-umbra-opacity);\n}\n@mixin shadow-8dp() {\n box-shadow: 0 8px 10px 1px rgba(0, 0, 0, $shadow-key-penumbra-opacity),\n 0 3px 14px 2px rgba(0, 0, 0, $shadow-ambient-shadow-opacity),\n 0 5px 5px -3px rgba(0, 0, 0, $shadow-key-umbra-opacity);\n}\n\n@mixin shadow-16dp() {\n box-shadow: 0 16px 24px 2px rgba(0, 0, 0, $shadow-key-penumbra-opacity),\n 0 6px 30px 5px rgba(0, 0, 0, $shadow-ambient-shadow-opacity),\n 0 8px 10px -5px rgba(0, 0, 0, $shadow-key-umbra-opacity);\n}\n\n@mixin shadow-24dp() {\n box-shadow: 0 9px 46px 8px rgba(0, 0, 0, $shadow-key-penumbra-opacity),\n 0 11px 15px -7px rgba(0, 0, 0, $shadow-ambient-shadow-opacity),\n 0 24px 38px 3px rgba(0, 0, 0, $shadow-key-umbra-opacity);\n}\n\n/* Animations */\n\n@mixin material-animation-fast-out-slow-in($duration:0.2s) {\n transition-duration: $duration;\n transition-timing-function: $animation-curve-fast-out-slow-in;\n}\n\n@mixin material-animation-linear-out-slow-in($duration:0.2s) {\n transition-duration: $duration;\n transition-timing-function: $animation-curve-linear-out-slow-in;\n}\n\n@mixin material-animation-fast-out-linear-in($duration:0.2s) {\n transition-duration: $duration;\n transition-timing-function: $animation-curve-fast-out-linear-in;\n}\n\n@mixin material-animation-default($duration:0.2s) {\n transition-duration: $duration;\n transition-timing-function: $animation-curve-default;\n}\n\n/* Dialog */\n\n@mixin dialog-width($units:5) {\n @if(type_of($units) != 'number') {\n @error \"The unit given to dialog-width should be a number.\";\n }\n // 56dp is the base unit width for Dialogs.\n // With 5 units being the number of units for a mobile device.\n // https://goo.gl/sK2O5o\n width: $units * 56px;\n}\n","/**\n * Copyright 2015 Google Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n@import \"../variables\";\n@import \"../mixins\";\n\n.mdl-data-table {\n position: relative;\n border: $data-table-dividers;\n border-collapse: collapse;\n white-space: nowrap;\n font-size: $data-table-font-size;\n background-color: unquote(\"rgb(#{$color-white})\");\n\n thead {\n padding-bottom: 3px;\n\n .mdl-data-table__select {\n margin-top: 0;\n }\n }\n\n tbody {\n tr {\n position: relative;\n height: $data-table-row-height;\n @include material-animation-default(0.28s);\n transition-property: background-color;\n\n &.is-selected {\n background-color: $data-table-selection-color;\n }\n\n &:hover {\n background-color: $data-table-hover-color;\n }\n }\n }\n\n td, th {\n padding: 0 $data-table-column-padding 12px $data-table-column-padding;\n text-align: right;\n\n &:first-of-type {\n padding-left: 24px;\n }\n\n &:last-of-type {\n padding-right: 24px;\n }\n }\n\n td {\n position: relative;\n vertical-align: middle;\n height: $data-table-row-height;\n border-top: $data-table-dividers;\n border-bottom: $data-table-dividers;\n padding-top: $data-table-cell-top;\n box-sizing: border-box;\n\n .mdl-data-table__select {\n vertical-align: middle;\n }\n }\n\n th {\n position: relative;\n vertical-align: bottom;\n text-overflow: ellipsis;\n @include typo-body-2();\n height: $data-table-row-height;\n font-size: $data-table-header-font-size;\n color: $data-table-header-color;\n padding-bottom: 8px;\n box-sizing: border-box;\n\n &.mdl-data-table__header--sorted-ascending,\n &.mdl-data-table__header--sorted-descending {\n color: $data-table-header-sorted-color;\n &:before {\n @include typo-icon;\n font-size: $data-table-header-sort-icon-size;\n content: \"\\e5d8\";\n margin-right: 5px;\n vertical-align: sub;\n }\n &:hover {\n cursor: pointer;\n &:before {\n color: $data-table-header-sorted-icon-hover-color;\n }\n }\n }\n &.mdl-data-table__header--sorted-descending:before {\n content: \"\\e5db\";\n }\n }\n}\n\n.mdl-data-table__select {\n width: 16px;\n}\n\n.mdl-data-table__cell--non-numeric.mdl-data-table__cell--non-numeric {\n text-align: left;\n}\n","/**\n * Copyright 2015 Google Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/*------------------------------------*\\\n $CONTENTS\n\\*------------------------------------*/\n/**\n * STYLE GUIDE VARIABLES------------------Declarations of Sass variables\n * -----Typography\n * -----Colors\n * -----Textfield\n * -----Switch\n * -----Spinner\n * -----Radio\n * -----Menu\n * -----List\n * -----Layout\n * -----Icon toggles\n * -----Footer\n * -----Column\n * -----Checkbox\n * -----Card\n * -----Button\n * -----Animation\n * -----Progress\n * -----Badge\n * -----Shadows\n * -----Grid\n * -----Data table\n * -----Dialog\n * -----Snackbar\n * -----Tooltip\n * -----Chip\n *\n * Even though all variables have the `!default` directive, most of them\n * should not be changed as they are dependent one another. This can cause\n * visual distortions (like alignment issues) that are hard to track down\n * and fix.\n */\n\n\n/* ========== TYPOGRAPHY ========== */\n\n/* We're splitting fonts into \"preferred\" and \"performance\" in order to optimize\n page loading. For important text, such as the body, we want it to load\n immediately and not wait for the web font load, whereas for other sections,\n such as headers and titles, we're OK with things taking a bit longer to load.\n We do have some optional classes and parameters in the mixins, in case you\n definitely want to make sure you're using the preferred font and don't mind\n the performance hit.\n We should be able to improve on this once CSS Font Loading L3 becomes more\n widely available.\n*/\n$preferred_font: 'Roboto', 'Helvetica', 'Arial', sans-serif !default;\n$performance_font: 'Helvetica', 'Arial', sans-serif !default;\n\n/* ========== COLORS ========== */\n\n/**\n*\n* Material design color palettes.\n* @see http://www.google.com/design/spec/style/color.html\n*\n**/\n\n@import \"color-definitions\";\n@import \"functions\";\n\n/* ========== IMAGES ========== */\n$image_path: '/images' !default;\n\n/* ========== Color & Themes ========== */\n\n// Define whether individual color palette items should have classes created.\n// Setting this to true will remove individual color classes for each color in the palettes.\n// To improve overall performance (assuming they aren't used) by:\n// * Saving server bandwidth sending the extra classes\n// * Save client computation against the classes\n// it is RECOMMENDED you set this to true.\n$trim-color-classes: false !default;\n\n// Use color primarily for emphasis. Choose colors that fit with\n// your brand and provide good contrast between visual components.\n$color-primary: $palette-indigo-500 !default;\n$color-primary-dark: $palette-indigo-700 !default;\n$color-accent: $palette-pink-A200 !default;\n\n// Our primary is dark, so use $color-dark-contrast for overlaid text.\n$color-primary-contrast: $color-dark-contrast !default;\n// Our accent is dark, so use $color-dark-contrast for overlaid text.\n$color-accent-contrast: $color-dark-contrast !default;\n\n// Replace all colors with placeholders if we're generating a template.\n@if $styleguide-generate-template == true {\n $color-primary: '$color-primary';\n $color-primary-dark: '$color-primary-dark';\n $color-accent: '$color-accent';\n $color-primary-contrast: '$color-primary-contrast';\n $color-accent-contrast: '$color-accent-contrast';\n}\n\n/* ========== Typography ========== */\n\n// We use the following default color styles: text-color-primary and\n// text-color-secondary. For light themes, use text-color-primary-inverse\n// and text-color-secondary-inverse.\n\n$text-color-primary: unquote(\"rgba(#{$color-black}, 0.87)\") !default;\n$text-link-color: unquote(\"rgb(#{$color-accent})\") !default;\n\n// Define whether to target elements directly for typographic enhancements.\n// Turning this off means you need to use mdl-* classes more often.\n// Other components may also fail to adhere to MD without these rules.\n// It is strongly recommended you leave this as true.\n\n$target-elements-directly: true !default;\n\n/* ========== Components ========== */\n\n/* ========== Standard Buttons ========== */\n\n// Default button colors.\n$button-primary-color: unquote(\"rgba(#{$palette-grey-500}, 0.20)\") !default;\n$button-secondary-color: unquote(\"rgb(#{$color-black})\") !default;\n$button-hover-color: $button-primary-color !default;\n$button-active-color: unquote(\"rgba(#{$palette-grey-500}, 0.40)\") !default;\n$button-focus-color: unquote(\"rgba(#{$color-black}, 0.12)\") !default;\n\n// Colored button colors.\n$button-primary-color-alt: unquote(\"rgb(#{$color-primary})\") !default;\n$button-secondary-color-alt: unquote(\"rgb(#{$color-primary-contrast})\") !default;\n$button-hover-color-alt: unquote(\"rgb(#{$color-primary})\") !default;\n$button-active-color-alt: unquote(\"rgb(#{$color-primary})\") !default;\n$button-focus-color-alt: $button-focus-color !default;\n\n// Ripple color for colored raised buttons.\n$button-ripple-color-alt: unquote(\"rgb(#{$color-primary-contrast})\") !default;\n\n// Disabled button colors.\n$button-primary-color-disabled: unquote(\"rgba(#{$color-black}, 0.12)\") !default;\n$button-secondary-color-disabled: unquote(\"rgba(#{$color-black}, 0.26)\") !default;\n\n// FAB colors and sizes.\n$button-fab-color-alt: unquote(\"rgb(#{$color-accent})\") !default;\n$button-fab-hover-color-alt: unquote(\"rgb(#{$color-accent})\") !default;\n$button-fab-active-color-alt: unquote(\"rgb(#{$color-accent})\") !default;\n$button-fab-text-color-alt: unquote(\"rgb(#{$color-accent-contrast})\") !default;\n$button-fab-ripple-color-alt: unquote(\"rgb(#{$color-accent-contrast})\") !default;\n\n// Icon button colors and sizes.\n$button-icon-color: unquote(\"rgb(#{$palette-grey-700})\") !default;\n$button-icon-focus-color: $button-focus-color !default;\n\n/* ========== Icon Toggles ========== */\n\n$icon-toggle-color: unquote(\"rgb(#{$palette-grey-700})\") !default;\n$icon-toggle-focus-color: $button-focus-color !default;\n$icon-toggle-checked-color: unquote(\"rgb(#{$color-primary})\") !default;\n$icon-toggle-checked-focus-color: unquote(\"rgba(#{$color-primary}, 0.26)\") !default;\n$icon-toggle-disabled-color: unquote(\"rgba(#{$color-black}, 0.26)\") !default;\n\n/* ========== Radio Buttons ========== */\n\n$radio-color: unquote(\"rgb(#{$color-primary})\") !default;\n$radio-off-color: unquote(\"rgba(#{$color-black}, 0.54)\") !default;\n$radio-disabled-color: unquote(\"rgba(#{$color-black}, 0.26)\") !default;\n\n/* ========== Ripple effect ========== */\n\n$ripple-bg-color: unquote(\"rgb(#{$color-light-contrast})\") !default;\n\n/* ========== Layout ========== */\n\n$layout-nav-color: unquote(\"rgb(#{$palette-grey-300})\") !default;\n\n// Drawer\n$layout-drawer-bg-color: unquote(\"rgb(#{$palette-grey-50})\") !default;\n$layout-drawer-border-color: unquote(\"rgb(#{$palette-grey-300})\") !default;\n$layout-text-color: unquote(\"rgb(#{$palette-grey-800})\") !default;\n$layout-drawer-navigation-color: #757575 !default;\n$layout-drawer-navigation-link-active-background: unquote(\"rgb(#{$palette-grey-300})\") !default;\n$layout-drawer-navigation-link-active-color: unquote(\"rgb(#{$color-light-contrast})\") !default;\n\n// Header\n$layout-header-bg-color: unquote(\"rgb(#{$color-primary})\") !default;\n$layout-header-text-color: unquote(\"rgb(#{$color-primary-contrast})\") !default;\n$layout-header-nav-hover-color: unquote(\"rgba(#{$palette-grey-700}, 0.6)\") !default;\n$layout-header-tab-text-color: unquote(\"rgba(#{$color-primary-contrast}, 0.6)\") !default;\n\n// Tabs\n$layout-header-tab-highlight: unquote(\"rgb(#{$color-accent})\") !default;\n\n/* ========== Content Tabs ========== */\n\n$tab-highlight-color: unquote(\"rgb(#{$color-primary})\") !default;\n$tab-text-color: unquote(\"rgba(#{$color-black}, 0.54)\") !default;\n$tab-active-text-color: unquote(\"rgba(#{$color-black}, 0.87)\") !default;\n$tab-border-color: unquote(\"rgb(#{$palette-grey-300})\") !default;\n\n/* ========== Checkboxes ========== */\n\n$checkbox-color: unquote(\"rgb(#{$color-primary})\") !default;\n$checkbox-off-color: unquote(\"rgba(#{$color-black}, 0.54)\") !default;\n$checkbox-disabled-color: unquote(\"rgba(#{$color-black}, 0.26)\") !default;\n$checkbox-focus-color: unquote(\"rgba(#{$color-primary}, 0.26)\") !default;\n$checkbox-image-path: $image_path;\n\n/* ========== Switches ========== */\n\n$switch-color: unquote(\"rgb(#{$color-primary})\") !default;\n$switch-faded-color: unquote(\"rgba(#{$color-primary}, 0.26)\") !default;\n$switch-thumb-color: $switch-color !default;\n$switch-track-color: unquote(\"rgba(#{$color-primary}, 0.5)\") !default;\n\n$switch-off-thumb-color: unquote(\"rgb(#{$palette-grey-50})\") !default;\n$switch-off-track-color: unquote(\"rgba(#{$color-black}, 0.26)\") !default;\n$switch-disabled-thumb-color: unquote(\"rgb(#{$palette-grey-400})\") !default;\n$switch-disabled-track-color: unquote(\"rgba(#{$color-black}, 0.12)\") !default;\n\n/* ========== Spinner ========== */\n\n$spinner-color-1: unquote(\"rgb(#{$palette-blue-400})\") !default;\n$spinner-color-2: unquote(\"rgb(#{$palette-red-500})\") !default;\n$spinner-color-3: unquote(\"rgb(#{$palette-yellow-600})\") !default;\n$spinner-color-4: unquote(\"rgb(#{$palette-green-500})\") !default;\n\n$spinner-single-color: unquote(\"rgb(#{$color-primary})\") !default;\n\n/* ========== Text fields ========== */\n\n$input-text-background-color: transparent !default;\n$input-text-label-color: unquote(\"rgba(#{$color-black}, 0.26)\") !default;\n$input-text-bottom-border-color: unquote(\"rgba(#{$color-black}, 0.12)\") !default;\n$input-text-highlight-color: unquote(\"rgb(#{$color-primary})\") !default;\n$input-text-disabled-color: $input-text-bottom-border-color !default;\n$input-text-disabled-text-color: $input-text-label-color !default;\n$input-text-error-color: unquote(\"rgb(#{$palette-red-A700})\") !default;\n\n/* ========== Card ========== */\n\n$card-background-color: unquote(\"rgb(#{$color-white})\") !default;\n$card-text-color: unquote(\"rgb(#{$color-black})\") !default;\n$card-image-placeholder-color: unquote(\"rgb(#{$color-accent})\") !default;\n$card-supporting-text-text-color: unquote(\"rgba(#{$color-black}, 0.54)\") !default;\n$card-border-color: rgba(0,0,0,0.1) !default;\n$card-subtitle-color: unquote(\"rgba(#{$color-black}, 0.54)\") !default;\n\n/* ========== Sliders ========== */\n\n$range-bg-color: unquote(\"rgba(#{$color-black}, 0.26)\") !default;\n$range-color: unquote(\"rgb(#{$color-primary})\") !default;\n$range-faded-color: unquote(\"rgba(#{$color-primary}, 0.26)\") !default;\n$range-bg-focus-color: unquote(\"rgba(#{$color-black}, 0.12)\") !default;\n\n/* ========== Progress ========== */\n$progress-main-color: unquote(\"rgb(#{$color-primary})\") !default;\n$progress-secondary-color: unquote(\"rgba(#{$color-primary-contrast}, 0.7)\") !default;\n$progress-fallback-buffer-color: unquote(\"rgba(#{$color-primary-contrast}, 0.9)\") !default;\n$progress-image-path: $image_path;\n\n/* ========== List ========== */\n\n$list-main-text-text-color: unquote(\"rgba(#{$color-black}, 0.87)\") !default;\n$list-supporting-text-text-color: unquote(\"rgba(#{$color-black}, 0.54)\") !default;\n$list-icon-color: unquote(\"rgb(#{$palette-grey-600})\") !default;\n$list-avatar-color: white !default;\n\n/* ========== Item ========== */\n\n// Default Item Colors\n$default-item-text-color: unquote(\"rgba(#{$color-black}, 0.87)\") !default;\n$default-item-outline-color: unquote(\"rgb(#{$palette-grey-400})\") !default;\n$default-item-hover-bg-color: unquote(\"rgb(#{$palette-grey-200})\") !default;\n$default-item-focus-bg-color: unquote(\"rgb(#{$palette-grey-200})\") !default;\n$default-item-active-bg-color: unquote(\"rgb(#{$palette-grey-300})\") !default;\n$default-item-divider-color: unquote(\"rgba(#{$color-black}, 0.12)\") !default;\n\n// Disabled Button Colors\n$disabled-item-text-color: unquote(\"rgb(#{$palette-grey-400})\") !default;\n\n/* ========== Dropdown menu ========== */\n\n$default-dropdown-bg-color: unquote(\"rgb(#{$color-white})\") !default;\n\n/* ========== Tooltips ========== */\n\n$tooltip-text-color: unquote(\"rgb(#{$color-white})\") !default;\n$tooltip-background-color: unquote(\"rgba(#{$palette-grey-700}, 0.9)\") !default;\n\n/* ========== Footer ========== */\n\n$footer-bg-color: unquote(\"rgb(#{$palette-grey-800})\") !default;\n$footer-color: unquote(\"rgb(#{$palette-grey-500})\") !default;\n$footer-heading-color: unquote(\"rgb(#{$palette-grey-300})\") !default;\n$footer-button-fill-color: $footer-color !default;\n$footer-underline-color: $footer-color !default;\n\n\n/* TEXTFIELD */\n\n$input-text-font-size: 16px !default;\n$input-text-width: 100% !default;\n$input-text-padding: 4px !default;\n$input-text-vertical-spacing: 20px !default;\n\n$input-text-button-size: 32px !default;\n$input-text-floating-label-fontsize: 12px !default;\n$input-text-expandable-icon-top: 16px !default;\n\n\n/* SWITCH */\n\n$switch-label-font-size: 16px !default;\n$switch-label-height: 24px !default;\n$switch-track-height: 14px !default;\n$switch-track-length: 36px !default;\n$switch-thumb-size: 20px !default;\n$switch-track-top: ($switch-label-height - $switch-track-height) / 2 !default;\n$switch-thumb-top: ($switch-label-height - $switch-thumb-size) / 2 !default;\n$switch-ripple-size: $switch-label-height * 2 !default;\n$switch-helper-size: 8px !default;\n\n/* SPINNER */\n\n$spinner-size: 28px !default;\n$spinner-stroke-width: 3px !default;\n\n// Amount of circle the arc takes up.\n$spinner-arc-size: 270deg !default;\n// Time it takes to expand and contract arc.\n$spinner-arc-time: 1333ms !default;\n// How much the start location of the arc should rotate each time.\n$spinner-arc-start-rot: 216deg !default;\n\n$spinner-duration: 360 * $spinner-arc-time / (\n strip-units($spinner-arc-start-rot + (360deg - $spinner-arc-size)));\n\n\n/* RADIO */\n\n$radio-label-font-size: 16px !default;\n$radio-label-height: 24px !default;\n$radio-button-size: 16px !default;\n$radio-inner-margin: $radio-button-size / 4;\n$radio-padding: 8px !default;\n$radio-top-offset: ($radio-label-height - $radio-button-size) / 2;\n$radio-ripple-size: 42px !default;\n\n\n/* MENU */\n\n$menu-expand-duration: 0.3s !default;\n$menu-fade-duration: 0.2s !default;\n\n/* LIST */\n\n$list-border: 8px !default;\n$list-min-height: 48px !default;\n$list-min-padding: 16px !default;\n$list-bottom-padding: 20px !default;\n$list-avatar-text-left-distance: 72px !default;\n$list-icon-text-left-distance: 72px !default;\n\n$list-avatar-size: 40px !default;\n$list-icon-size: 24px !default;\n\n$list-two-line-height: 72px !default;\n$list-three-line-height: 88px !default;\n\n/* LAYOUT */\n\n$layout-drawer-narrow: 240px !default;\n$layout-drawer-wide: 456px !default;\n$layout-drawer-width: $layout-drawer-narrow !default;\n\n$layout-header-icon-size: 32px !default;\n$layout-screen-size-threshold: 1024px !default;\n$layout-header-icon-margin: 24px !default;\n$layout-drawer-button-mobile-size: 32px !default;\n$layout-drawer-button-desktop-size: 48px !default;\n\n$layout-header-mobile-row-height: 56px !default;\n$layout-mobile-header-height: $layout-header-mobile-row-height;\n$layout-header-desktop-row-height: 64px !default;\n$layout-desktop-header-height: $layout-header-desktop-row-height;\n\n$layout-header-desktop-baseline: 80px !default;\n$layout-header-mobile-baseline: 72px !default;\n$layout-header-mobile-indent: 16px !default;\n$layout-header-desktop-indent: 40px !default;\n\n$layout-tab-font-size: 14px !default;\n$layout-tab-bar-height: 48px !default;\n$layout-tab-mobile-padding: 12px !default;\n$layout-tab-desktop-padding: 24px !default;\n$layout-tab-highlight-thickness: 2px !default;\n\n\n/* ICON TOGGLE */\n\n$icon-toggle-size: 32px !default;\n$icon-toggle-font-size: 24px !default;\n$icon-toggle-ripple-size: 36px !default;\n\n/* FOOTER */\n\n/*mega-footer*/\n$footer-min-padding: 16px !default;\n$footer-padding-sides: 40px !default;\n$footer-heading-font-size: 14px !default;\n$footer-heading-line-height: (1.7 * $footer-heading-font-size) !default;\n$footer-btn-size: 36px !default;\n\n/*mini-footer*/\n$padding: 16px !default;\n$footer-heading-font-size: 24px !default;\n$footer-heading-line-height: (1.5 * $footer-heading-font-size) !default;\n$footer-btn-size: 36px !default;\n\n/* CHECKBOX */\n\n$checkbox-label-font-size: 16px !default;\n$checkbox-label-height: 24px !default;\n$checkbox-button-size: 16px !default;\n$checkbox-inner-margin: 2px !default;\n$checkbox-padding: 8px !default;\n$checkbox-top-offset:\n($checkbox-label-height - $checkbox-button-size - $checkbox-inner-margin) / 2;\n$checkbox-ripple-size: $checkbox-label-height * 1.5;\n\n/* CARD */\n\n/* Card dimensions */\n$card-width: 330px !default;\n$card-height: 200px !default;\n$card-font-size: 16px !default;\n$card-title-font-size: 24px !default;\n$card-subtitle-font-size: 14px !default;\n$card-horizontal-padding: 16px !default;\n$card-vertical-padding: 16px !default;\n\n$card-title-perspective-origin-x: 165px !default;\n$card-title-perspective-origin-y: 56px !default;\n\n$card-title-transform-origin-x: 165px !default;\n$card-title-transform-origin-y: 56px !default;\n\n$card-title-text-transform-origin-x: 149px !default;\n$card-title-text-transform-origin-y: 48px !default;\n\n$card-supporting-text-font-size: 1rem !default;\n$card-supporting-text-line-height: 18px !default;\n\n$card-actions-font-size: 16px !default;\n\n$card-title-text-font-weight: 300 !default;\n$card-z-index: 1 !default;\n\n/* Cover image */\n$card-cover-image-height: 186px !default;\n$card-background-image-url: '' !default;\n\n\n/* BUTTON */\n/**\n *\n * Dimensions\n *\n */\n$button-min-width: 64px !default;\n$button-height: 36px !default;\n$button-padding: 16px !default;\n$button-margin: 4px !default;\n$button-border-radius: 2px !default;\n\n$button-fab-size: 56px !default;\n$button-fab-size-mini: 40px !default;\n$button-fab-font-size: 24px !default;\n\n$button-icon-size: 32px !default;\n$button-icon-size-mini: 24px !default;\n\n\n/* ANIMATION */\n$animation-curve-fast-out-slow-in: cubic-bezier(0.4, 0, 0.2, 1) !default;\n$animation-curve-linear-out-slow-in: cubic-bezier(0, 0, 0.2, 1) !default;\n$animation-curve-fast-out-linear-in: cubic-bezier(0.4, 0, 1, 1) !default;\n\n$animation-curve-default: $animation-curve-fast-out-slow-in !default;\n\n\n/* PROGRESS */\n$bar-height: 4px !default;\n\n/* BADGE */\n$badge-font-size: 12px !default;\n$badge-color: unquote(\"rgb(#{$color-accent-contrast})\") !default;\n$badge-color-inverse: unquote(\"rgb(#{$color-accent})\") !default;\n$badge-background: unquote(\"rgb(#{$color-accent})\") !default;\n$badge-background-inverse: unquote(\"rgba(#{$color-accent-contrast},0.2)\") !default;\n$badge-size : 22px !default;\n$badge-padding: 2px !default;\n$badge-overlap: 12px !default;\n\n/* SHADOWS */\n\n$shadow-key-umbra-opacity: 0.2 !default;\n$shadow-key-penumbra-opacity: 0.14 !default;\n$shadow-ambient-shadow-opacity: 0.12 !default;\n\n/* GRID */\n\n$grid-desktop-columns: 12 !default;\n$grid-desktop-gutter: 16px !default;\n$grid-desktop-margin: 16px !default;\n\n$grid-desktop-breakpoint: 840px !default;\n\n$grid-tablet-columns: 8 !default;\n$grid-tablet-gutter: $grid-desktop-gutter !default;\n$grid-tablet-margin: $grid-desktop-margin !default;\n\n$grid-tablet-breakpoint: 480px !default;\n\n$grid-phone-columns: 4 !default;\n$grid-phone-gutter: $grid-desktop-gutter !default;\n$grid-phone-margin: $grid-desktop-margin !default;\n\n$grid-cell-default-columns: $grid-phone-columns !default;\n$grid-max-columns: $grid-desktop-columns !default;\n\n/* DATA TABLE */\n\n$data-table-font-size: 13px !default;\n$data-table-header-font-size: 12px !default;\n$data-table-header-sort-icon-size: 16px !default;\n\n$data-table-header-color: rgba(#000, 0.54) !default;\n$data-table-header-sorted-color: rgba(#000, 0.87) !default;\n$data-table-header-sorted-icon-hover-color: rgba(#000, 0.26) !default;\n$data-table-divider-color: rgba(#000, 0.12) !default;\n\n$data-table-hover-color: #eeeeee !default;\n$data-table-selection-color: #e0e0e0 !default;\n\n$data-table-dividers: 1px solid $data-table-divider-color !default;\n\n$data-table-row-height: 48px !default;\n$data-table-last-row-height: 56px !default;\n$data-table-header-height: 56px !default;\n\n$data-table-column-spacing: 36px !default;\n$data-table-column-padding: $data-table-column-spacing / 2;\n\n$data-table-card-header-height: 64px !default;\n$data-table-card-title-top: 20px !default;\n$data-table-card-padding: 24px !default;\n$data-table-button-padding-right: 16px !default;\n$data-table-cell-top: $data-table-card-padding / 2;\n\n/* DIALOG */\n$dialog-content-color: $card-supporting-text-text-color;\n\n/* SNACKBAR */\n\n// Hard coded since the color is not present in any palette.\n$snackbar-background-color: #323232 !default;\n$snackbar-tablet-breakpoint: $grid-tablet-breakpoint;\n$snackbar-action-color: unquote(\"rgb(#{$color-accent})\") !default;\n\n/* TOOLTIP */\n$tooltip-font-size: 10px !default;\n$tooltip-font-size-large: 14px !default;\n\n/* CHIP */\n$chip-bg-color: rgb(222, 222, 222) !default;\n$chip-bg-active-color: rgb(214, 214, 214) !default;\n$chip-height: 32px !default;\n$chip-font-size: 13px !default; \n","/**\n * Copyright 2015 Google Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n@import \"../variables\";\n\n.mdl-mini-footer {\n display: flex;\n flex-flow: row wrap;\n justify-content: space-between;\n\n padding: ($padding * 2) $padding;\n\n color: $footer-color;\n background-color: $footer-bg-color;\n\n &:after {\n content: '';\n display: block;\n }\n\n & .mdl-logo {\n line-height: $footer-btn-size;\n }\n}\n\n.mdl-mini-footer--link-list,\n.mdl-mini-footer__link-list {\n display: flex;\n flex-flow: row nowrap;\n\n list-style: none;\n\n margin: 0;\n padding: 0;\n\n & li {\n margin-bottom: 0;\n margin-right: $padding;\n\n @media screen and (min-width: 760px) {\n line-height: $footer-btn-size;\n }\n }\n\n & a {\n color: inherit;\n text-decoration: none;\n white-space: nowrap;\n }\n}\n\n.mdl-mini-footer--left-section,\n.mdl-mini-footer__left-section {\n display: inline-block;\n order: 0;\n}\n\n.mdl-mini-footer--right-section,\n.mdl-mini-footer__right-section {\n display: inline-block;\n order: 1;\n}\n\n.mdl-mini-footer--social-btn,\n.mdl-mini-footer__social-btn {\n width: $footer-btn-size;\n height: $footer-btn-size;\n\n padding: 0;\n margin: 0;\n\n background-color: $footer-button-fill-color;\n\n border: none;\n}\n","/**\n * Copyright 2015 Google Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n@import \"../variables\";\n\n.mdl-card {\n display: flex;\n flex-direction: column;\n font-size: $card-font-size;\n font-weight: 400;\n min-height: $card-height;\n overflow: hidden;\n width: $card-width;\n z-index: $card-z-index;\n position: relative;\n background: $card-background-color;\n border-radius: 2px;\n box-sizing: border-box;\n}\n\n.mdl-card__media {\n background-color: $card-image-placeholder-color;\n background-repeat: repeat;\n background-position: 50% 50%;\n background-size: cover;\n background-origin: padding-box;\n background-attachment: scroll;\n box-sizing: border-box;\n}\n\n.mdl-card__title {\n align-items: center;\n color: $card-text-color;\n display: block;\n display: flex;\n justify-content: stretch;\n line-height: normal;\n padding: $card-vertical-padding $card-horizontal-padding;\n perspective-origin: $card-title-perspective-origin-x $card-title-perspective-origin-y;\n transform-origin: $card-title-transform-origin-x $card-title-transform-origin-y;\n box-sizing: border-box;\n\n &.mdl-card--border {\n border-bottom: 1px solid $card-border-color;\n }\n}\n\n.mdl-card__title-text {\n align-self: flex-end;\n color: inherit;\n display: block;\n display: flex;\n font-size: $card-title-font-size;\n font-weight: $card-title-text-font-weight;\n line-height: normal;\n overflow: hidden;\n transform-origin: $card-title-text-transform-origin-x $card-title-text-transform-origin-y;\n margin: 0;\n}\n\n.mdl-card__subtitle-text {\n font-size: $card-subtitle-font-size;\n color: $card-subtitle-color;\n margin: 0;\n}\n\n.mdl-card__supporting-text {\n color: $card-supporting-text-text-color;\n font-size: $card-supporting-text-font-size;\n line-height: $card-supporting-text-line-height;\n overflow: hidden;\n padding: $card-vertical-padding $card-horizontal-padding;\n width: 90%;\n\n &.mdl-card--border {\n border-bottom: 1px solid $card-border-color;\n }\n}\n\n.mdl-card__actions {\n font-size: $card-actions-font-size;\n line-height: normal;\n width: 100%;\n background-color: rgba(0,0,0,0);\n padding: 8px;\n box-sizing: border-box;\n\n &.mdl-card--border {\n border-top: 1px solid $card-border-color;\n }\n}\n\n.mdl-card--expand {\n flex-grow: 1;\n}\n\n\n.mdl-card__menu {\n position: absolute;\n right: 16px;\n top: 16px;\n}\n","/**\n * Copyright 2015 Google Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n@import \"../variables\";\n@import \"../mixins\";\n\n// The button component. Defaults to a flat button.\n.mdl-button {\n background: transparent;\n border: none;\n border-radius: $button-border-radius;\n color: $button-secondary-color;\n position: relative;\n height: $button-height;\n margin: 0;\n min-width: $button-min-width;\n padding: 0 $button-padding;\n display: inline-block;\n @include typo-button();\n overflow: hidden;\n will-change: box-shadow;\n transition: box-shadow 0.2s $animation-curve-fast-out-linear-in,\n background-color 0.2s $animation-curve-default,\n color 0.2s $animation-curve-default;\n outline: none;\n cursor: pointer;\n text-decoration: none;\n text-align: center;\n line-height: $button-height;\n vertical-align: middle;\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &:hover {\n background-color: $button-hover-color;\n }\n\n &:focus:not(:active) {\n background-color: $button-focus-color;\n }\n\n &:active {\n background-color: $button-active-color;\n }\n\n &.mdl-button--colored {\n color: $button-primary-color-alt;\n\n &:focus:not(:active) {\n background-color: $button-focus-color-alt;\n }\n }\n}\n\ninput.mdl-button[type=\"submit\"] {\n -webkit-appearance:none;\n}\n\n // Raised buttons\n .mdl-button--raised {\n background: $button-primary-color;\n @include shadow-2dp();\n\n &:active {\n @include shadow-4dp();\n background-color: $button-active-color;\n }\n\n &:focus:not(:active) {\n @include focus-shadow();\n background-color: $button-active-color;\n }\n\n &.mdl-button--colored {\n background: $button-primary-color-alt;\n color: $button-secondary-color-alt;\n\n &:hover {\n background-color: $button-hover-color-alt;\n }\n\n &:active {\n background-color: $button-active-color-alt;\n }\n\n &:focus:not(:active) {\n background-color: $button-active-color-alt;\n }\n\n & .mdl-ripple {\n background: $button-ripple-color-alt;\n }\n }\n }\n\n\n // FABs\n .mdl-button--fab {\n border-radius: 50%;\n font-size: $button-fab-font-size;\n height: $button-fab-size;\n margin: auto;\n min-width: $button-fab-size;\n width: $button-fab-size;\n padding: 0;\n overflow: hidden;\n background: $button-primary-color;\n box-shadow: 0 1px 1.5px 0 rgba(0,0,0,0.12), 0 1px 1px 0 rgba(0,0,0,0.24);\n position: relative;\n line-height: normal;\n\n & .material-icons {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(- $button-fab-font-size / 2, - $button-fab-font-size / 2);\n line-height: $button-fab-font-size;\n width: $button-fab-font-size;\n }\n\n &.mdl-button--mini-fab {\n height: $button-fab-size-mini;\n min-width: $button-fab-size-mini;\n width: $button-fab-size-mini;\n }\n\n & .mdl-button__ripple-container {\n border-radius: 50%;\n // Fixes clipping bug in Safari.\n -webkit-mask-image: -webkit-radial-gradient(circle, white, black);\n }\n\n &:active {\n @include shadow-4dp();\n background-color: $button-active-color;\n }\n\n &:focus:not(:active) {\n @include focus-shadow();\n background-color: $button-active-color;\n }\n\n &.mdl-button--colored {\n background: $button-fab-color-alt;\n color: $button-fab-text-color-alt;\n\n &:hover {\n background-color: $button-fab-hover-color-alt;\n }\n\n &:focus:not(:active) {\n background-color: $button-fab-active-color-alt;\n }\n\n &:active {\n background-color: $button-fab-active-color-alt;\n }\n\n & .mdl-ripple {\n background: $button-fab-ripple-color-alt;\n }\n }\n }\n\n\n // Icon buttons\n .mdl-button--icon {\n border-radius: 50%;\n font-size: $button-fab-font-size;\n height: $button-icon-size;\n margin-left: 0;\n margin-right: 0;\n min-width: $button-icon-size;\n width: $button-icon-size;\n padding: 0;\n overflow: hidden;\n color: inherit;\n line-height: normal;\n\n & .material-icons {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(- $button-fab-font-size / 2, - $button-fab-font-size / 2);\n line-height: $button-fab-font-size;\n width: $button-fab-font-size;\n }\n\n &.mdl-button--mini-icon {\n height: $button-icon-size-mini;\n min-width: $button-icon-size-mini;\n width: $button-icon-size-mini;\n\n & .material-icons {\n top: ($button-icon-size-mini - $button-fab-font-size) / 2;\n left: ($button-icon-size-mini - $button-fab-font-size) / 2;\n }\n }\n\n & .mdl-button__ripple-container {\n border-radius: 50%;\n // Fixes clipping bug in Safari.\n -webkit-mask-image: -webkit-radial-gradient(circle, white, black);\n }\n }\n\n\n // Ripples\n .mdl-button__ripple-container {\n display: block;\n height: 100%;\n left: 0px;\n position: absolute;\n top: 0px;\n width: 100%;\n z-index: 0;\n overflow: hidden;\n\n .mdl-button[disabled] & .mdl-ripple,\n .mdl-button.mdl-button--disabled & .mdl-ripple {\n background-color: transparent;\n }\n }\n\n// Colorized buttons\n\n.mdl-button--primary.mdl-button--primary {\n color: $button-primary-color-alt;\n & .mdl-ripple {\n background: $button-secondary-color-alt;\n }\n &.mdl-button--raised, &.mdl-button--fab {\n color: $button-secondary-color-alt;\n background-color: $button-primary-color-alt;\n }\n}\n\n.mdl-button--accent.mdl-button--accent {\n color: $button-fab-color-alt;\n & .mdl-ripple {\n background: $button-fab-text-color-alt;\n }\n &.mdl-button--raised, &.mdl-button--fab {\n color: $button-fab-text-color-alt;\n background-color: $button-fab-color-alt;\n }\n}\n\n// Disabled buttons\n\n.mdl-button {\n // Bump up specificity by using [disabled] twice.\n &[disabled][disabled],\n &.mdl-button--disabled.mdl-button--disabled {\n color: $button-secondary-color-disabled;\n cursor: default;\n background-color: transparent;\n }\n\n &--fab {\n // Bump up specificity by using [disabled] twice.\n &[disabled][disabled],\n &.mdl-button--disabled.mdl-button--disabled {\n background-color: $button-primary-color-disabled;\n color: $button-secondary-color-disabled;\n }\n }\n\n &--raised {\n // Bump up specificity by using [disabled] twice.\n &[disabled][disabled],\n &.mdl-button--disabled.mdl-button--disabled {\n background-color: $button-primary-color-disabled;\n color: $button-secondary-color-disabled;\n box-shadow: none;\n }\n }\n &--colored {\n // Bump up specificity by using [disabled] twice.\n &[disabled][disabled],\n &.mdl-button--disabled.mdl-button--disabled {\n color: $button-secondary-color-disabled;\n }\n }\n}\n\n// Align icons inside buttons with text\n.mdl-button .material-icons {\n vertical-align: middle;\n}\n","// SIMPLE GRID - SASS/SCSS\n\n\n// fonts\n$font-weight-light: 300;\n$font-weight-regular: 400;\n$font-weight-heavy: 700;\n\n// colors\n$dark-grey: #333447;\n$dark-gray: #333447; // for the Americans\n\n\n.font-light {\n font-weight: $font-weight-light;\n}\n\n.font-regular {\n font-weight: $font-weight-regular;\n}\n\n.font-heavy {\n font-weight: $font-weight-heavy;\n}\n\n// utility\n\n.left {\n text-align: left;\n}\n\n.right {\n text-align: right;\n}\n\n.center {\n text-align: center;\n margin-left: auto;\n margin-right: auto;\n}\n\n.justify {\n text-align: justify;\n}\n\n.hidden-sm {\n display: none;\n}\n\n// grid\n\n$width: 98%;\n$gutter: 2%;\n$breakpoint-small: 33.75em; // 540px\n$breakpoint-med: 45em; // 720px\n$breakpoint-large: 60em; // 960px\n\n.container {\n width: 100%;\n margin-left: auto;\n margin-right: auto;\n}\n\n.row {\n position: relative;\n width: 100%;\n}\n\n.row [class^=\"col\"] {\n float: left;\n margin: 0.5rem 1%;\n min-height: 0.125rem;\n}\n\n.row::after {\n content: \"\";\n display: table;\n clear: both;\n}\n\n.col-1,\n.col-2,\n.col-3,\n.col-4,\n.col-5,\n.col-6,\n.col-7,\n.col-8,\n.col-9,\n.col-10,\n.col-11,\n.col-12 {\n width: $width;\n}\n\n.col-1-sm {\n width: ($width / 12) - ($gutter * 11 / 12);\n}\n\n.col-2-sm {\n width: ($width / 6) - ($gutter * 10 / 12);\n}\n\n.col-3-sm {\n width: ($width / 4) - ($gutter * 9 / 12);\n}\n\n.col-4-sm {\n width: ($width / 3) - ($gutter * 8 / 12);\n}\n\n.col-5-sm {\n width: ($width / (12 / 5)) - ($gutter * 7 / 12);\n}\n\n.col-6-sm {\n width: ($width / 2) - ($gutter * 6 / 12);\n}\n\n.col-7-sm {\n width: ($width / (12 / 7)) - ($gutter * 5 / 12);\n}\n\n.col-8-sm {\n width: ($width / (12 / 8)) - ($gutter * 4 / 12);\n}\n\n.col-9-sm {\n width: ($width / (12 / 9)) - ($gutter * 3 / 12);\n}\n\n.col-10-sm {\n width: ($width / (12 / 10)) - ($gutter * 2 / 12);\n}\n\n.col-11-sm {\n width: ($width / (12 / 11)) - ($gutter * 1 / 12);\n}\n\n.col-12-sm {\n width: $width;\n}\n\n@media only screen and (min-width: $breakpoint-med) {\n .col-1 {\n width: ($width / 12) - ($gutter * 11 / 12);\n }\n .col-2 {\n width: ($width / 6) - ($gutter * 10 / 12);\n }\n .col-3 {\n width: ($width / 4) - ($gutter * 9 / 12);\n }\n .col-4 {\n width: ($width / 3) - ($gutter * 8 / 12);\n }\n .col-5 {\n width: ($width / (12 / 5)) - ($gutter * 7 / 12);\n }\n .col-6 {\n width: ($width / 2) - ($gutter * 6 / 12);\n }\n .col-7 {\n width: ($width / (12 / 7)) - ($gutter * 5 / 12);\n }\n .col-8 {\n width: ($width / (12 / 8)) - ($gutter * 4 / 12);\n }\n .col-9 {\n width: ($width / (12 / 9)) - ($gutter * 3 / 12);\n }\n .col-10 {\n width: ($width / (12 / 10)) - ($gutter * 2 / 12);\n }\n .col-11 {\n width: ($width / (12 / 11)) - ($gutter * 1 / 12);\n }\n .col-12 {\n width: $width;\n }\n\n .hidden-sm {\n display: block;\n }\n}\n\n.row {\n display: -webkit-box;\n display: -webkit-flex;\n display: -ms-flexbox;\n display: flex;\n flex-wrap: wrap;\n}\n\n.row > [class*='col-'] {\n display: flex;\n flex-direction: column;\n}\n","\n/*\nMaterial Icons\n*/\n\n.material-icons {\n font-family: 'Material Icons';\n font-weight: normal;\n font-style: normal;\n font-size: 24px; /* Preferred icon size */\n display: inline-block;\n line-height: 1;\n text-transform: none;\n letter-spacing: normal;\n word-wrap: normal;\n white-space: nowrap;\n direction: ltr;\n \n /* Support for all WebKit browsers. */\n -webkit-font-smoothing: antialiased;\n /* Support for Safari and Chrome. */\n text-rendering: optimizeLegibility;\n \n /* Support for Firefox. */\n -moz-osx-font-smoothing: grayscale;\n \n /* Support for IE. */\n font-feature-settings: 'liga';\n }","html {\n font-size: $font_size;\n}\n\nbody {\n display: block !important;\n background-color: $background_color;\n font-size: 1rem;\n line-height: 1.5rem;\n font-family: $body_font_family;\n}\n\n.mdl-layout__content:focus {\n outline: none;\n }\n\n.mdl-layout__content header.mdl-layout__drawer {\n display: none;\n}\n\n.mdl-layout__container {\n height: calc(100% - 76px);\n margin-top: 76px;\n}\n.mdl-layout__header {\n position: fixed;\n transition: transform 0.5s;\n}\n.mdl-layout--fixed-drawer>.mdl-layout__content {\n margin-left: 300px; \n}\n\n@media screen and (max-width: 1024px) {\n .mdl-layout--fixed-drawer>.mdl-layout__content {\n margin-left:0\n }\n}\n\nh1, h2, h3, h4, h5, h6, blockquote, span.mdl-layout-title,\na.download > code.download {\n font-family: $body_font_family;\n}\n\nh1, h2, h3, h4, h5, h6, .toc-backref, .contents, .toctree-wrapper, .contents a, .toctree-wrapper a, .globaltoc a.current {\n color: $color-mxnet !important;\n}\n\na {\n text-decoration: none;\n}\n\n.page-content {\n font-size: 1rem;\n p, ul, ol, dl, dd, dt, table, th, td {\n font-size: 1rem;\n }\n}\n\n.brand {\n color: inherit;\n text-decoration: none;\n}\n\n.section {\n overflow-x: auto;\n}\n\n\n/*\n * Figure Directive Styles\n */\n img {\n max-width: 100%;\n display: block;\n margin-left: auto;\n margin-right: auto;\n }\n\ndiv.figure {\n p.caption {\n text-align: center;\n margin-top: .75rem;\n\n span.caption-number {\n font-style: normal;\n }\n .caption-number::after {\n content: \"\\00a0\";\n }\n }\n}\n\n.svg-icon {\n width: 16px;\n height: 16px;\n display: inline-block;\n fill: $grey-color-light;\n padding-right: 5px;\n padding-top: 4px;\n vertical-align: text-top;\n}\n\n/*\n * Download Link Styles\n */\na.download > i.material-icons {\n position: relative;\n top: 5px;\n}\n\na.download {\n text-decoration: none;\n}\n\n%clearfix:after {\n content: \"\";\n display: table;\n clear: both;\n}\n\n.wrapper {\n max-width: -webkit-calc(#{$content-width} - (#{$spacing-unit} * 2));\n max-width: calc(#{$content-width} - (#{$spacing-unit} * 2));\n margin-right: auto;\n margin-left: auto;\n padding-right: calc(#{$spacing-unit}+15px);\n padding-left: $spacing-unit;\n @extend %clearfix;\n\n @media screen and (max-width: $on-laptop) {\n max-width: -webkit-calc(#{$content-width} - (#{$spacing-unit}));\n max-width: calc(#{$content-width} - (#{$spacing-unit}));\n padding-right: $spacing-unit / 2;\n padding-left: $spacing-unit / 2;\n }\n}\n\n","/*\nVariables\n*/\n$font_size: 16px;\n\n$background_color: #fafafa;\n$code_background: rgba(0,0,0,.05);\n\n$code_font_family: \"Menlo\", \"DejaVu Sans Mono\", \"Liberation Mono\", \"Consolas\", \"Ubuntu Mono\", \"Courier New\", \"andale mono\", \"lucida console\", monospace !default;\n$body_font_family: -apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,\"Helvetica Neue\",Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",\"Segoe UI Symbol\" !default;\n$base-font-size: 17px !default;\n\n$xl-breakpoint: 1795px;\n$lg-breakpoint: 1200px;\n$md-breakpoint: 992px;\n$sm-breakpoint: 768px;\n$xs-breakpoint: 576px;\n\n$color-primary: $palette-blue-500;\n$color-primary-dark: $palette-blue-700 !default;\n$color-accent: $palette-deep-orange-A200 !default;\n$color-primary-contrast: $color-white !default;\n$color-accent-contrast: $color-white !default;\n\n\n$base-line-height: 1.5 !default;\n$spacing-unit: 30px !default;\n\n$color-mxnet: rgb(4,140,204);\n$color-mxnet-dark: rgb(4,60,110);\n$grey-color: #828282 !default;\n$grey-color-light: lighten($grey-color, 45%) !default;\n$grey-color-dark: darken($grey-color, 25%) !default;\n\n$table-text-align: left !default;\n\n// Width of the content area\n$content-width: 1150px !default;\n\n$on-palm: 600px !default;\n$on-palm: 900px !default;\n$on-laptop: 1024px !default;","/**\n * Layout Styles\n */\n $layout: (\n document: (\n xl: (\n width: 100%,\n )\n ),\n drawer-container: (\n width: $layout-drawer-width,\n ),\n side-doc-outline: (\n width: 230px,\n ),\n page-content: (\n md: (\n width: 90%,\n padding: 0 5%\n ),\n lg: (\n width: calc( 90% - 230px ),\n padding: 0 5%\n )\n )\n);\n\n.document {\n width: 100%;\n margin: 84px auto;\n display: flex;\n\n @media (min-width: $xl-breakpoint) {\n width: map-get(map-get(map-get($layout, document), xl), width);\n }\n .page-content {\n width: 100%;\n margin: 0 auto;\n padding: 0 12px;\n\n @media (min-width: $md-breakpoint) {\n width: map-get(map-get(map-get($layout, page-content), md), width);\n padding: map-get(map-get(map-get($layout, page-content), md), padding);\n }\n\n @media (min-width: $lg-breakpoint) {\n width: map-get(map-get(map-get($layout, page-content), lg), width);\n padding: map-get(map-get(map-get($layout, page-content), lg), padding);\n }\n }\n\n .side-doc-outline {\n width: map-get(map-get($layout, side-doc-outline), width);\n\n @media (max-width: $lg-breakpoint - 1) {\n display: none;\n } \n &--content {\n position: sticky;\n overflow-x: auto;\n overflow-y: auto;\n width: inherit;\n right: 0px;\n top: 80px;\n &::-webkit-scrollbar {\n width: 6px;\n }\n \n &::-webkit-scrollbar-track {\n border-radius: 6px;\n }\n \n &::-webkit-scrollbar-thumb {\n background-color: rgba(0, 0, 0, .3);\n border-radius: 6px;\n box-shadow:0 0 0 1px rgba(255, 255, 255, .3);\n }\n }\n }\n\n}","@keyframes float-in {\n 0% {\n transform: translateY(0.5rem);\n opacity: 0;\n }\n\t100% {\n\t\ttransform: translateY(0);\n\t\topacity: 1;\n\t}\n}\n\n@keyframes float-out {\n 0% {\n transform: translateY(0);\n opacity: 1;\n }\n\t100% {\n\t\ttransform: translateY(0.5rem);\n\t\topacity: 0;\n\t}\n}\n\n.page-content {\n .headerlink {\n display: inline-block;\n text-decoration: none;\n margin-left: 0.8rem;\n color: inherit;\n opacity: 0;\n &:hover {\n animation: float-in 0.2s $animation-curve-fast-out-slow-in 0s forwards;\n }\n }\n\n h1, h2, h3, h4, h5, h6 {\n .toc-backref {\n text-decoration: none;\n }\n &:hover {\n .headerlink {\n animation: float-in 0.2s $animation-curve-fast-out-slow-in 0s forwards;\n }\n }\n }\n\n h1 {\n font-size: 2rem;\n line-height: 2.25rem;\n }\n\n h2 {\n font-size: 1.75rem;\n line-height: 2rem;\n padding-top: 1.5rem;\n margin-top: 0;\n margin-bottom: 1rem;\n }\n\n h3 {\n font-size: 1.5rem;\n line-height: 1.75rem;\n padding-top: 1rem;\n margin-top: 0px;\n margin-bottom: .75rem;\n }\n\n h4 {\n font-size: 1.25rem;\n line-height: 1.5rem;\n padding-top: .75rem;\n margin-top: 0px;\n margin-bottom: .5rem;\n }\n\n div.page-content h5 {\n font-size: 1.1rem;\n line-height: 1.5rem;\n padding-top: 2rem;\n margin-top: 0px;\n margin-bottom: 1rem;\n }\n\n div.page-content h6 {\n font-size: 1rem;\n line-height: 1.5rem;\n padding-top: 2rem;\n margin-top: 0px;\n margin-bottom: 1rem;\n }\n\n\n}\n","\n/*\n * Admonition Styles\n */\n $admonitions: (\n hint: (\n font-color: rgb(0, 188, 212),\n background-color: rgba(0, 188, 212, 0.1),\n icon-content: \"help_outline\"\n ),\n note: (\n font-color: rgb(0, 188, 212),\n background-color: rgba(0, 188, 212, 0.1),\n icon-content: \"info_outline\"\n ),\n seealso: (\n font-color: rgb(0, 188, 212),\n background-color: rgba(0, 188, 212, 0.1),\n icon-content: \"search\"\n ),\n warning: (\n font-color: rgb(255, 193, 7),\n background-color: rgba(255, 193, 7, 0.1),\n icon-content: \"warning\"\n ),\n attention: (\n font-color: rgb(255, 193, 7),\n background-color: rgba(255, 193, 7, 0.1),\n icon-content: \"warning\"\n ),\n tip: (\n font-color: rgb(139, 195, 74),\n background-color: rgba(139, 195, 74, 0.1),\n icon-content: \"lightbulb_outline\"\n ),\n important: (\n font-color: rgb(139, 195, 74),\n background-color: rgba(139, 195, 74, 0.1),\n icon-content: \"check_circle\"\n ),\n error: (\n font-color: rgb(244, 67, 54),\n background-color: rgba(244, 67, 54, 0.1),\n icon-content: \"error_outline\"\n ),\n caution: (\n font-color: rgb(244, 67, 54),\n background-color: rgba(244, 67, 54, 0.1),\n icon-content: \"error_outline\"\n ),\n danger: (\n font-color: rgb(244, 67, 54),\n background-color: rgba(244, 67, 54, 0.1),\n icon-content: \"error_outline\"\n )\n);\n\n @mixin admonition-style($type) {\n border-left: solid 4px map-get(map-get($admonitions, $type), font-color);\n background-color: map-get(map-get($admonitions, $type), background-color);\n .admonition-title {\n font-size: 16px;\n font-weight: bold;\n color: map-get(map-get($admonitions, $type), font-color);\n\n margin-top: 4px;\n margin-bottom: 8px;\n &::before {\n @extend .material-icons;\n position: relative;\n margin-right: 5px;\n top: 3px;\n content: map-get(map-get($admonitions, $type), icon-content);\n font-size: 18px;\n }\n }\n}\n\n.admonition {\n @extend .mdl-shadow--2dp;\n\n padding: 12px 20px;\n margin-top: 10px;\n margin-bottom: 10px;\n p.last {\n margin: 16px;\n }\n .admonition-title {\n font-size: 16px;\n font-weight: bold;\n color: #555;\n text-transform: uppercase;\n margin-top: 7px;\n }\n\n @each $type in (note, seealso, hint, warning, attention, tip, important, error, caution, danger) {\n &.#{$type} {\n @include admonition-style($type);\n }\n }\n}\n",".page-content {\n .highlight {\n margin: 1px 0;\n pre {\n background: $code_background;\n color: rgba(0,0,0,.87);\n font-family: $code_font_family;\n padding: 0.75rem;\n overflow: auto;\n overflow-y: hidden;\n .o, .nd {\n color: rgba(0,0,0,.87);\n }\n }\n }\n\n div.highlight-console div.highlight {\n background: none;\n }\n\n // for jupyter notebook output cell\n .output {\n .highlight {\n pre {\n color: rgba(0,0,0,.87);\n background: $background_color;\n border-width: 1px;\n border-color: #999;\n border-style: solid;\n padding: 0.75rem;\n }\n }\n }\n\n .code, code:not(.download) {\n margin: 0 0;\n font-family: $code_font_family;\n border-radius: 2px;\n span.pre {\n font-family: $code_font_family;\n }\n }\n\n .viewcode-link {\n padding-left: 2em;\n font-size: 80%;\n }\n\n .rubric, .method > dt, .function > dt, .class > dt {\n display: table;\n margin: 10px 0;\n font-size: 100%;\n line-height: normal;\n background: #e7f2fa;\n color: #2B98F0;\n border-top: solid 3px #55ADF3;\n padding: 10px;\n position: relative;\n .descname, .descclassname {\n color: rgba(0,0,0,.87);\n background: #e7f2fa;\n padding: 3px;\n }\n em {\n padding: 0 2px;\n }\n }\n\n\n .rubric {\n margin: 30px 0 10px 0;\n }\n\n\n .field-body {\n padding-left: 40px;\n ul {\n padding: 0 0 0 16px;\n margin: 0;\n }\n }\n\n // .docutils > dt {\n // padding: 6px;\n // display: table;\n // margin-bottom: 6px;\n // border: none;\n // border-left: solid 3px #ccc;\n // background: #f0f0f0;\n // color: #555;\n // }\n\n .seealso .docutils > dt {\n float: left;\n clear: left;\n padding: 0 6px;\n }\n\n .seealso .docutils > dd {\n padding-left: 6em;\n }\n .nblast {\n padding-bottom: 1em;\n }\n\n pre {\n font-size: 90%;\n background: #eee;\n color: #455A64;\n padding: 16px 32px;\n width: auto;\n border-radius: 4px;\n word-wrap: break-word;\n\n &:hover {\n @extend .mdl-shadow--2dp;\n\n &:before {\n font-family: $body_font_family;\n padding: 0 0.5rem;\n content: attr(click-to-copy);\n color: rgba(0, 0, 0, 0.5);\n border-radius: 4px;\n position: relative;\n float: right;\n top: -0.5rem;\n right: -0.5rem;\n background: rgb(200, 200, 200);\n font-size: 0.8rem;\n cursor: pointer;\n }\n }\n }\n}\n","/*\n * Quotation Block Styles\n */\n .page-content {\n blockquote {\n font-size: 1rem;\n padding: 0 1rem;\n border-left: 3px solid $code_background;\n\n &:after {\n content: \"\" !important;\n margin-left: 0;\n }\n &:before {\n content: \"\" !important;\n }\n }\n }\n",".page-content {\n table:not(.footnote):not(.indextable):not(.hlist):not(.option-list):not(.field-list) {\n @extend .mdl-data-table;\n @extend .mdl-shadow--2dp;\n\n margin: 1.5rem 0;\n table-layout: fixed;\n max-width: 100%;\n min-width: 70%;\n\n th, td {\n @extend .mdl-data-table__cell--non-numeric;\n white-space: normal;\n overflow-wrap: break-word;\n }\n\n caption {\n font-size: $font_size;\n margin: 1rem 0 0.8rem 0;\n white-space: normal;\n .caption-number {\n font-style: normal;\n }\n .caption-number::after {\n content: \"\\00a0\";\n }\n }\n\n }\n}\n",".globaltoc {\n \n .caption, .toc {\n display: none;\n }\n\n ul {\n\n list-style-type: none;\n padding: 0;\n margin: 0;\n\n li {\n min-height: 18px;\n .link-wrapper {\n display: flex;\n justify-content: space-between;\n > a {\n padding: 4px 0;\n display: block;\n width: 100%;\n font-size: 1rem;\n text-decoration: none;\n color: $layout-drawer-navigation-color;\n &.current {\n font-weight: bold;\n }\n }\n }\n }\n }\n\n .nav-toggle {\n padding: 0;\n float: right;\n display: flex;\n align-items: center;\n justify-content: center;\n height: 36px;\n > a {\n padding: 0;\n margin-left: 0;\n margin-right: 4px;\n cursor: pointer;\n > i {\n font-size: 18px;\n }\n }\n &.show {\n transform: rotateZ(180deg);\n > a {\n margin-right: 0;\n margin-left: 4px;\n }\n }\n }\n\n nav {\n > ul > li > span.link-wrapper {\n padding-left: 8px;\n }\n > ul > li > ul > li > span.link-wrapper {\n padding-left: 16px;\n }\n > ul > li > ul > li > ul > li > span.link-wrapper {\n padding-left: 24px;\n }\n > ul > li > ul > li > ul > li > ul> li > span.link-wrapper {\n padding-left: 32px;\n }\n > ul > li > ul > li > ul > li > ul > li > ul> li > span.link-wrapper {\n padding-left: 40px;\n }\n > ul > li > ul > li > ul > li > ul > li > ul > li > ul> li > span.link-wrapper {\n padding-left: 48px;\n }\n }\n}\n",".localtoc {\n font-size: 0.75rem;\n padding-top: 1rem;\n\n .caption {\n padding-left: 12px;\n &-text {\n font-size: 0.9rem;\n font-weight: 700;\n }\n }\n\n > ul > li > a {\n display: none;\n }\n\n ul {\n padding: 0;\n list-style-type: none;\n }\n\n li {\n padding-left: 6px;\n }\n\n a {\n display: block;\n text-decoration: none;\n color: inherit;\n margin-top: 8px;\n padding-left: 8px;\n line-height: 1.1rem;\n \n &.current {\n padding-left: 5px;\n border-left: 3px solid;\n font-weight: bold;\n }\n }\n}","/*\r\n * Toctree and Contents Directive Styles\r\n */\r\n .toctree-wrapper,\r\n .contents.topic {\r\n border-left: 5px solid;\r\n }\r\n\r\n .toctree-wrapper > p.caption,\r\n .contents.topic > p.topic-title {\r\n color: rgb(117, 117, 117);\r\n font-size: 1rem;\r\n padding-left: 14px;\r\n }\r\n\r\n .toctree-wrapper ul,\r\n .contents.topic ul{\r\n padding-left: 14px;\r\n list-style: none;\r\n line-height: 30px;\r\n }\r\n\r\n .toctree-wrapper a,\r\n .contents.topic a {\r\n font-size: 1.2rem;\r\n text-decoration: none;\r\n .pre {\r\n font-size: 1rem;\r\n }\r\n }\r\n\r\n .toctree-wrapper > ul > li > a,\r\n .contents.topic > ul > li > a {\r\n font-size: 1.3rem;\r\n .pre {\r\n font-size: 1.1rem;\r\n }\r\n }\r\n",".page-content {\n ul {\n li {\n margin: .3rem 0;\n p {\n margin: 0;\n }\n }\n }\n .option-list {\n .option {\n font-family: $code_font_family;\n }\n td {\n padding: 0.5rem;\n border: none;\n }\n }\n}\n","/*\r\n * Drawer Styles\r\n */\r\n.mdl-layout {\r\n &__drawer {\r\n background-color: #fff;\r\n\r\n &::-webkit-scrollbar {\r\n width: 6px;\r\n }\r\n\r\n &::-webkit-scrollbar-track {\r\n border-radius: 6px;\r\n }\r\n\r\n &::-webkit-scrollbar-thumb {\r\n background-color: rgba(0, 0, 0, .3);\r\n border-radius: 6px;\r\n box-shadow:0 0 0 1px rgba(255, 255, 255, .3);\r\n }\r\n\r\n > .mdl-layout-title {\r\n font-weight: bold;\r\n text-align: right;\r\n margin: 0;\r\n padding: 0;\r\n line-height: 32px;\r\n border-bottom: 1px solid rgba(0,0,0,.1);\r\n min-height: 64px;\r\n .title {\r\n color: inherit;\r\n display: block;\r\n height: 100%;\r\n width: 100%;\r\n text-decoration: none;\r\n > img.logo {\r\n width: 100%;\r\n margin: 0;\r\n padding: 0;\r\n }\r\n\r\n &-text {\r\n font-weight: bold;\r\n text-align: right;\r\n padding: 0 10px;\r\n margin: 16px 0 8px 0;\r\n line-height: 32px;\r\n font-family: $body_font_family;\r\n color: inherit;\r\n display: block;\r\n }\r\n }\r\n }\r\n }\r\n}\r\n","/*\r\n * Header Styles\r\n */\r\n\r\nnav.breadcrumb {\r\n > a.mdl-navigation__link {\r\n padding: 0 8px;\r\n font-size: 18px;\r\n }\r\n @media (max-width: $lg-breakpoint - 1) {\r\n width: calc( 100% - 64px );\r\n a.mdl-navigation__link.is-active {\r\n overflow-x: hidden;\r\n width: 100%;\r\n overflow: hidden;\r\n white-space: nowrap;\r\n text-overflow: ellipsis;\r\n }\r\n a.mdl-navigation__link:not(.is-active),\r\n i.material-icons {\r\n display: none;\r\n }\r\n }\r\n}\r\n\r\ndiv.mdl-layout__header {\r\n margin-top: 77px;\r\n}\r\n\r\n.mdl-layout__drawer-button {\r\n top: 13px !important;\r\n}\r\n\r\ndiv.mdl-layout__header-row.header-links {\r\n background: rgba(255,255,255,0.2);\r\n width: 100%;\r\n overflow-x: auto;\r\n overflow-y: hidden;\r\n\r\n a.mdl-navigation__link {\r\n font-size: 1rem;\r\n i {\r\n font-size: 1.2rem;\r\n margin: 0 8px;\r\n position: relative;\r\n bottom: -0.1rem;\r\n }\r\n };\r\n\r\n a.mdl-navigation__link:hover {\r\n background-color: unquote(\"rgb(#{$color-primary})\");\r\n color: #eeeeee;\r\n };\r\n a.mdl-navigation__link[href=\"#\"] {\r\n background-color: unquote(\"rgb(#{$color-primary})\");\r\n opacity: 1;\r\n color: #ffffff;\r\n };\r\n}\r\n\r\n/* mxnet-header */\r\n\r\n\r\n.site-title {\r\n font-weight: 300 !important;\r\n line-height: 57px;\r\n letter-spacing: -1px;\r\n margin-bottom: 0;\r\n float: left;\r\n color: white;\r\n\r\n &,\r\n &:visited {\r\n color: $grey-color-dark;\r\n }\r\n}\r\n\r\n\r\n.site-header {\r\n position: fixed;\r\n top: 0;\r\n width: 100%;\r\n min-height: 55px;\r\n padding-top: 10px;\r\n padding-bottom: 10px;\r\n background-color: $color-mxnet;\r\n z-index: 10;\r\n font-weight: 300;\r\n font-size: 17px;\r\n border-bottom: 1px solid white;\r\n}\r\n\r\n.site-header-logo {\r\n width: 120px;\r\n display: initial;\r\n}\r\n\r\n.site-nav {\r\n float: right;\r\n line-height: 57px;\r\n\r\n .nav-trigger {\r\n display: none;\r\n }\r\n\r\n .menu-icon {\r\n display: none;\r\n }\r\n\r\n .page-link {\r\n color: white;\r\n line-height: 1.5;\r\n font-weight: 300;\r\n // Gaps between nav items, but not on the last one\r\n &:not(:last-child) {\r\n margin-right: 40px;\r\n }\r\n\r\n &:hover {\r\n color: white;\r\n text-shadow: -0.06ex 0 white, 0.06ex 0 white;\r\n }\r\n }\r\n\r\n .page-link.page-current {\r\n color: white;\r\n text-decoration: underline;\r\n }\r\n\r\n @media screen and (max-width: $on-laptop) {\r\n position: absolute;\r\n top: 9px;\r\n right: 15px;\r\n background-color: rgb(23,141,201);\r\n border-radius: 2px;\r\n text-align: right;\r\n\r\n label[for=\"nav-trigger\"] {\r\n display: block;\r\n float: right;\r\n width: 36px;\r\n height: 36px;\r\n z-index: 2;\r\n cursor: pointer;\r\n }\r\n\r\n .menu-icon {\r\n display: block;\r\n float: right;\r\n width: 36px;\r\n height: 26px;\r\n line-height: 0;\r\n padding-top: 20px;\r\n text-align: center;\r\n\r\n > svg {\r\n fill: white;\r\n }\r\n }\r\n\r\n input ~ .trigger {\r\n clear: both;\r\n display: none;\r\n }\r\n\r\n input:checked ~ .trigger {\r\n display: block;\r\n padding-bottom: 5px;\r\n }\r\n\r\n .page-link {\r\n padding: 5px 10px;\r\n display: block;\r\n\r\n &:not(:last-child) {\r\n margin-right: 0;\r\n }\r\n\r\n margin-left: 20px;\r\n }\r\n }\r\n}","/*\r\n * Footer Styles\r\n */\r\nfooter.mdl-mini-footer {\r\n background-color: #212121;\r\n > div.mdl-mini-footer__left-section {\r\n margin-bottom: 20px;\r\n display: flex;\r\n flex-direction: column;\r\n .mdl-logo {\r\n font-size: 1.1rem;\r\n }\r\n ul {\r\n @extend .mdl-mini-footer__link-list;\r\n }\r\n }\r\n > div.mdl-mini-footer__right-section {\r\n font-size: 0.9rem;\r\n display: flex;\r\n flex-direction: column;\r\n justify-content: flex-end;\r\n\r\n a {\r\n color: inherit;\r\n font-weight: bold;\r\n text-decoration: none;\r\n }\r\n }\r\n p.caption {\r\n display: none;\r\n }\r\n}\r\n\r\n/*\r\n * Pagenation Block Styles\r\n */\r\n .pagenation {\r\n width: 100%;\r\n margin-top: 80px;\r\n height: 92px;\r\n background-color: #424242;\r\n display: flex;\r\n\r\n .button-common {\r\n text-transform: none;\r\n padding: 0;\r\n height: 92px;\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n color: #ffffff;\r\n }\r\n #button-prev {\r\n @extend .button-common;\r\n margin-right: auto;\r\n .pagenation-text {\r\n text-align: left;\r\n }\r\n \r\n }\r\n #button-next {\r\n @extend .button-common;\r\n margin-left: auto;\r\n flex-direction: row-reverse;\r\n .pagenation-text {\r\n text-align: right;\r\n }\r\n }\r\n\r\n &-arrow {\r\n &-L {\r\n margin-right: 20px;\r\n }\r\n &-R {\r\n margin-left: 20px;\r\n }\r\n }\r\n\r\n &-text {\r\n line-height: 30px;\r\n font-size: 20px;\r\n }\r\n\r\n &-direction {\r\n opacity: 0.7;\r\n font-size: 18px;\r\n }\r\n @media screen and (max-width: 1024px) {\r\n #button-prev {\r\n width: 20%;\r\n }\r\n \r\n #button-next {\r\n width: 80%;\r\n }\r\n \r\n #button-prev .pagenation-text {\r\n display: none;\r\n }\r\n }\r\n @media screen and (min-width: 1025px) {\r\n #button-prev,\r\n #button-next {\r\n width: 50%;\r\n }\r\n \r\n #button-prev .pagenation-text {\r\n display: block;\r\n }\r\n }\r\n}\r\n\r\n\r\n\r\n/**\r\n * Site footer\r\n */\r\n.site-footer {\r\n border-top: 1px solid $grey-color-light;\r\n padding: $spacing-unit 0;\r\n background-color: #424242;\r\n position: relative;\r\n z-index: 10;\r\n .footer-category-title {\r\n color: $color-mxnet;\r\n }\r\n a {\r\n color: $grey-color-light !important;\r\n\r\n &:visited {\r\n color: $grey-color-light !important;\r\n }\r\n }\r\n\r\n}\r\n\r\n.site-footer2 {\r\n background-color: #424242;\r\n padding-top: 40px;\r\n padding-bottom: 10px;\r\n position: relative;\r\n z-index: 10;\r\n}\r\n\r\n.footer-heading {\r\n margin-bottom: $spacing-unit / 2;\r\n}\r\n\r\n.contact-list,\r\n.social-media-list {\r\n list-style: none;\r\n margin-left: 0;\r\n}\r\n\r\n\r\n.footer-bottom-warning {\r\n font-size: 80%;\r\n color: white;\r\n float: left;\r\n}\r\n\r\n.footer-logo {\r\n width: 200px;\r\n margin-bottom: 30px;\r\n margin-top: 30px;\r\n}\r\n\r\n.footer-col {\r\n float: left;\r\n margin-bottom: $spacing-unit / 2;\r\n padding-left: $spacing-unit / 2;\r\n}\r\n\r\n.footer-text {\r\n color: $grey-color-light;\r\n}\r\n\r\n"," /*\r\n * Search Styles\r\n */\r\n#waterfall-exp::-webkit-input-placeholder {\r\n color: #ccc;\r\n}\r\n#waterfall-exp:-ms-input-placeholder {\r\n color: #ccc;\r\n}\r\n#waterfall-exp::-moz-placeholder {\r\n color: #ccc;\r\n}\r\n\r\nul.search span.highlighted {\r\n font-weight: bold;\r\n}\r\n\r\nul.search > li {\r\n margin-bottom: 24px;\r\n}\r\n\r\n#search-results {\r\n ul {\r\n list-style: none;\r\n padding: 0;\r\n li {\r\n > a {\r\n text-decoration: none;\r\n font-size: 1.2rem;\r\n }\r\n }\r\n }\r\n}\r\n","a.download {\n &:before {\n @extend .material-icons;\n content: \"file_download\";\n position: relative;\n top: 5px;\n margin-right: 5px;\n }\n}\n\nbutton.download {\n position: sticky;\n margin-left: 1em;\n}\n",".mdl-card {\n margin: 1em 1.5em 1em 0;\n display: inline-block;\n width: 250px;\n min-height: 140px;\n padding: 18px;\n}\n.mdl-card:hover {\n box-shadow: 0 10px 20px rgba(0,0,0,0.25), 0 6px 6px rgba(0,0,0,0.22);\n color: #000;\n cursor: pointer;\n}\n.mdl-card__title {\n padding: 0 0 1em 0;\n font-size: 18px;\n color: #444;\n}\n\n.mdl-card__supporting-text {\n line-height: 1.5rem;\n padding: 0px;\n width: 100%;\n}\n\n.head-card.mdl-card {\n width: auto;\n display: block;\n max-width: 800px;\n padding: 24px;\n}\n\n.head-card > .mdl-card__title {\n padding-bottom: 0px;\n height: 60px;\n font-weight: 700;\n text-transform: uppercase;\n}\n.head-card > .mdl-card__menu {\n color: #fff;\n}\n.head-card > .mdl-card__actions {\n padding: 0;\n}\n.cards {\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n}\n"]} \ No newline at end of file diff --git a/docs/python_docs/themes/mx-theme/src/js/feedback.js~HEAD b/docs/python_docs/themes/mx-theme/src/js/feedback.js~HEAD new file mode 100644 index 000000000000..f45423765b74 --- /dev/null +++ b/docs/python_docs/themes/mx-theme/src/js/feedback.js~HEAD @@ -0,0 +1,33 @@ +/*! + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +$(document).ready(function() { + $(".feedback-answer").on("click", function () { + $(".feedback-question").remove(); + $(".feedback-answer-container").remove(); + $(".feedback-thank-you").show(); + ga("send", { + hitType: "event", + eventCategory: "Did this page help you?", + eventAction: $(this).attr("data-response"), + eventLabel: window.location.pathname || "unknown", + eventValue: $(this).attr("data-response") === "yes" ? 1 : 0 + }); + }); +}); diff --git a/docs/python_docs/themes/mx-theme/src/js/feedback.js~HEAD_0 b/docs/python_docs/themes/mx-theme/src/js/feedback.js~HEAD_0 new file mode 100644 index 000000000000..f45423765b74 --- /dev/null +++ b/docs/python_docs/themes/mx-theme/src/js/feedback.js~HEAD_0 @@ -0,0 +1,33 @@ +/*! + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +$(document).ready(function() { + $(".feedback-answer").on("click", function () { + $(".feedback-question").remove(); + $(".feedback-answer-container").remove(); + $(".feedback-thank-you").show(); + ga("send", { + hitType: "event", + eventCategory: "Did this page help you?", + eventAction: $(this).attr("data-response"), + eventLabel: window.location.pathname || "unknown", + eventValue: $(this).attr("data-response") === "yes" ? 1 : 0 + }); + }); +}); diff --git a/docs/python_docs/themes/mx-theme/src/js/feedback.js~upstream_master b/docs/python_docs/themes/mx-theme/src/js/feedback.js~upstream_master new file mode 100644 index 000000000000..f45423765b74 --- /dev/null +++ b/docs/python_docs/themes/mx-theme/src/js/feedback.js~upstream_master @@ -0,0 +1,33 @@ +/*! + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +$(document).ready(function() { + $(".feedback-answer").on("click", function () { + $(".feedback-question").remove(); + $(".feedback-answer-container").remove(); + $(".feedback-thank-you").show(); + ga("send", { + hitType: "event", + eventCategory: "Did this page help you?", + eventAction: $(this).attr("data-response"), + eventLabel: window.location.pathname || "unknown", + eventValue: $(this).attr("data-response") === "yes" ? 1 : 0 + }); + }); +}); diff --git a/docs/python_docs/themes/mx-theme/src/js/feedback.js~upstream_master_0 b/docs/python_docs/themes/mx-theme/src/js/feedback.js~upstream_master_0 new file mode 100644 index 000000000000..f45423765b74 --- /dev/null +++ b/docs/python_docs/themes/mx-theme/src/js/feedback.js~upstream_master_0 @@ -0,0 +1,33 @@ +/*! + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +$(document).ready(function() { + $(".feedback-answer").on("click", function () { + $(".feedback-question").remove(); + $(".feedback-answer-container").remove(); + $(".feedback-thank-you").show(); + ga("send", { + hitType: "event", + eventCategory: "Did this page help you?", + eventAction: $(this).attr("data-response"), + eventLabel: window.location.pathname || "unknown", + eventValue: $(this).attr("data-response") === "yes" ? 1 : 0 + }); + }); +}); diff --git a/docs/python_docs/themes/mx-theme/src/scss/layout/_layout.scss b/docs/python_docs/themes/mx-theme/src/scss/layout/_layout.scss index be12d9406b16..e2cc395d2f49 100644 --- a/docs/python_docs/themes/mx-theme/src/scss/layout/_layout.scss +++ b/docs/python_docs/themes/mx-theme/src/scss/layout/_layout.scss @@ -56,11 +56,12 @@ display: none; } &--content { - position: fixed; + position: sticky; overflow-x: auto; overflow-y: auto; width: inherit; right: 0px; + top: 80px; &::-webkit-scrollbar { width: 6px; } diff --git a/docs/static_site/src/pages/api/faq/cloud.md b/docs/static_site/src/pages/api/faq/cloud.md index 2a5837b017eb..dd1643cb54a1 100644 --- a/docs/static_site/src/pages/api/faq/cloud.md +++ b/docs/static_site/src/pages/api/faq/cloud.md @@ -37,40 +37,16 @@ and maintain the resources for precisely the amount of time needed. In this document, we provide a step-by-step guide that will teach you how to set up an AWS cluster with _MXNet_. We show how to: -- [Use Amazon S3 to host data](#use-amazon-s3-to-host-data) -- [Set up an EC2 GPU instance with all dependencies installed](#set-up-an-ec2-gpu-instance) +- [Use Pre-installed EC2 GPU Instance](#use-pre-installed-ec2-gpu-instance) - [Build and run MXNet on a single computer](#build-and-run-mxnet-on-a-gpu-instance) - [Set up an EC2 GPU cluster for distributed training](#set-up-an-ec2-gpu-cluster-for-distributed-training) -### Use Amazon S3 to Host Data - -Amazon S3 provides distributed data storage which proves especially convenient for hosting large datasets. -To use S3, you need [AWS credentials](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSGettingStartedGuide/AWSCredentials.html), -including an `ACCESS_KEY_ID` and a `SECRET_ACCESS_KEY`. - -To use _MXNet_ with S3, set the environment variables `AWS_ACCESS_KEY_ID` and -`AWS_SECRET_ACCESS_KEY` by adding the following two lines in -`~/.bashrc` (replacing the strings with the correct ones): - -```bash -export AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE -export AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY -``` - -There are several ways to upload data to S3. One simple way is to use -[s3cmd](https://s3tools.org/s3cmd). For example: - -```bash -wget http://data.mxnet.io/mxnet/data/mnist.zip -unzip mnist.zip && s3cmd put t*-ubyte s3://dmlc/mnist/ -``` - ### Use Pre-installed EC2 GPU Instance The [Deep Learning AMIs](https://aws.amazon.com/marketplace/search/results?x=0&y=0&searchTerms=Deep+Learning+AMI) are a series of images supported and maintained by Amazon Web Services for use on Amazon Elastic Compute Cloud (Amazon EC2) and contain the latest MXNet release. -Now you can launch _MXNet_ directly on an EC2 GPU instance. +Now you can launch _MXNet_ directly on an EC2 GPU instance. You can also use [Jupyter](https://jupyter.org) notebook on EC2 machine. Here is a [good tutorial](https://github.com/dmlc/mxnet-notebooks) on how to connect to a Jupyter notebook running on an EC2 instance. @@ -81,7 +57,7 @@ on how to connect to a Jupyter notebook running on an EC2 instance. provide a foundational image with NVIDIA CUDA, cuDNN, GPU drivers, Intel MKL-DNN, Docker and Nvidia-Docker, etc. for deploying your own custom deep learning environment. You may follow the [MXNet Build From Source -instructions](= "1.5.0": + node = onnx.helper.make_node( + pool_types[pool_type], + input_nodes, # input + [name], + kernel_shape=kernel, + pads=pad_dims, + strides=stride, + name=name, + ceil_mode=ceil_mode + ) + else: + node = onnx.helper.make_node( + pool_types[pool_type], + input_nodes, # input + [name], + kernel_shape=kernel, + pads=pad_dims, + strides=stride, + name=name + ) return [node] diff --git a/python/mxnet/gluon/loss.py b/python/mxnet/gluon/loss.py index bc447b0f1c55..75d8981bd02a 100644 --- a/python/mxnet/gluon/loss.py +++ b/python/mxnet/gluon/loss.py @@ -77,18 +77,28 @@ def _reshape_like(F, x, y): def _batch_mean(F, loss, batch_axis): """Return mean on the specified batch axis, not keeping the axis""" if is_np_array(): - axes = list(range(loss.ndim)) - del axes[batch_axis] - return F.np.mean(loss, axis=axes) + if F is ndarray: + axes = list(range(loss.ndim)) + del axes[batch_axis] + return F.np.mean(loss, axis=axes) + else: + assert batch_axis == 0, 'Currently, we have not supported the "exclude" ' \ + 'flag in mean. So we only support batch_axis=0.' + return F.npx.batch_flatten(loss).mean(axis=1) else: return F.mean(loss, axis=batch_axis, exclude=True) def _batch_sum(F, loss, batch_axis): """Return sum on the specified batch axis, not keeping the axis""" if is_np_array(): - axes = list(range(loss.ndim)) - del axes[batch_axis] - return F.np.sum(loss, axis=axes) + if F is ndarray: + axes = list(range(loss.ndim)) + del axes[batch_axis] + return F.np.sum(loss, axis=axes) + else: + assert batch_axis == 0, 'Currently, we have not supported the "exclude" ' \ + 'flag in mean. So we only support batch_axis=0.' + return F.npx.batch_flatten(loss).sum(axis=1) else: return F.sum(loss, axis=batch_axis, exclude=True) @@ -899,8 +909,8 @@ def hybrid_forward(self, F, pred, target, sample_weight=None, epsilon=1e-08): stirling_factor = target * \ log_fn(target) - target + 0.5 * log_fn(2 * target * np.pi) target_gt_1 = target > 1 - stirling_factor *= target_gt_1 - loss += stirling_factor + stirling_factor = stirling_factor * target_gt_1 + loss = loss + stirling_factor loss = _apply_weighting(F, loss, self._weight, sample_weight) return _batch_mean(F, loss, self._batch_axis) @@ -1023,7 +1033,8 @@ class SDMLLoss(Loss): def __init__(self, smoothing_parameter=0.3, weight=1., batch_axis=0, **kwargs): super(SDMLLoss, self).__init__(weight, batch_axis, **kwargs) self.kl_loss = KLDivLoss(from_logits=True) - self.smoothing_parameter = smoothing_parameter # Smoothing probability mass + # Smoothing probability mass + self.smoothing_parameter = smoothing_parameter def _compute_distances(self, F, x1, x2): """ @@ -1032,17 +1043,13 @@ def _compute_distances(self, F, x1, x2): """ if is_np_array(): expand_dims_fn = F.np.expand_dims - broadcast_to_fn = F.np.broadcast_to else: expand_dims_fn = F.expand_dims - broadcast_to_fn = F.broadcast_to - - # extracting sizes expecting [batch_size, dim] - assert x1.shape == x2.shape - batch_size, dim = x1.shape - # expanding both tensor form [batch_size, dim] to [batch_size, batch_size, dim] - x1_ = broadcast_to_fn(expand_dims_fn(x1, 1), [batch_size, batch_size, dim]) - x2_ = broadcast_to_fn(expand_dims_fn(x2, 0), [batch_size, batch_size, dim]) + + # expanding x1 form [batch_size, dim] to [batch_size, 1, dim] + # and x2 to [1, batch_size, dim] + x1_ = expand_dims_fn(x1, 1) + x2_ = expand_dims_fn(x2, 0) # pointwise squared differences squared_diffs = (x1_ - x2_)**2 # sum of squared differences distance @@ -1073,7 +1080,6 @@ def _compute_labels(self, F, batch_size): labels = gold * (1 - self.smoothing_parameter) + (1 - gold) * self.smoothing_parameter / (batch_size - 1) return labels - def hybrid_forward(self, F, x1, x2): """ the function computes the kl divergence between the negative distances @@ -1092,6 +1098,7 @@ def hybrid_forward(self, F, x1, x2): learn to predict french president comparing it with all the other vectors in batch 2 """ + assert F is ndarray, 'SDMLLoss does not support symbolic ' if is_np_array(): log_softmax_fn = F.npx.log_softmax else: diff --git a/python/mxnet/gluon/trainer.py b/python/mxnet/gluon/trainer.py index dc9da80923da..7f1a7d09e585 100644 --- a/python/mxnet/gluon/trainer.py +++ b/python/mxnet/gluon/trainer.py @@ -20,6 +20,7 @@ """Parameter optimizer.""" __all__ = ['Trainer'] +import sys from collections import OrderedDict from .. import optimizer as opt @@ -77,25 +78,34 @@ class Trainer(object): """ def __init__(self, params, optimizer, optimizer_params=None, kvstore='device', compression_params=None, update_on_kvstore=None): + self._param2name = {} + self._param2idx = {} + py_version = sys.version_info + assert isinstance(params, (dict, OrderedDict)), \ + 'invalid params type: {}. Expected dict type'.format(type(params)) + names = list(params.keys()) param_list = [] - if isinstance(params, (dict, OrderedDict)): - for key in sorted(list(params.keys())): - param_list.append(params[key]) - params = param_list - if not isinstance(params, (list, tuple)): - raise ValueError( - "First argument must be a list or dict of Parameters, " \ - "got %s."%(type(params))) + # only python 3.5 requires sorting + if py_version[0] == 3 and py_version[1] == 5: + names = sorted(names) + for name in names: + p = params[name] + if not isinstance(p, Parameter): + raise ValueError( + "First argument must be a dict of Parameters, " \ + "got list of %s."%(type(p))) + param_list.append(p) + # Shared parameters have same uuid; only need to store one of the shared versions + if p._uuid in self._param2name: + continue + self._param2name[p._uuid] = name + params = param_list + self._params = [] # parameters to initialize on the kvstore self._contains_sparse_weight = False self._contains_sparse_grad = False - self._param2idx = {} for i, param in enumerate(params): - if not isinstance(param, Parameter): - raise ValueError( - "First argument must be a list or dict of Parameters, " \ - "got list of %s."%(type(param))) if param._uuid in self._param2idx: # Shared parameters have same uuid; only need to store one of the shared versions continue @@ -388,25 +398,25 @@ def _allreduce_grads(self): return for i, param in enumerate(self._params): if param.grad_req != 'null': - + idx = self._param2idx[param._uuid] grad_list = param.list_grad() # sparse gradients, call push and pull separately if grad_list[0].stype != 'default': - self._kvstore.push(i, grad_list, priority=-i) + self._kvstore.push(idx, grad_list, priority=-i) if param._stype == 'default': if self._update_on_kvstore: pull_list = param.list_data() else: pull_list = param.list_grad() - self._kvstore.pull(i, pull_list, priority=-i, + self._kvstore.pull(idx, pull_list, priority=-i, ignore_sparse=self._distributed) else: # allreduce dense gradients if not update_on_kvstore, # otherwise push dense gradients, pull dense weights if self._update_on_kvstore: - self._kvstore.pushpull(i, grad_list, out=param.list_data(), priority=-i) + self._kvstore.pushpull(idx, grad_list, out=param.list_data(), priority=-i) else: - self._kvstore.pushpull(i, grad_list, priority=-i) + self._kvstore.pushpull(idx, grad_list, priority=-i) def update(self, batch_size, ignore_stale_grad=False): """Makes one step of parameter update. diff --git a/python/mxnet/library.py b/python/mxnet/library.py index 9ce3f7b2223e..487fff940fda 100644 --- a/python/mxnet/library.py +++ b/python/mxnet/library.py @@ -73,14 +73,23 @@ def load(path, verbose=True): func = getattr(mx_sym_op, op) setattr(mx_sym, op, func) -def compiled_with_cxx11_abi(): - """Check if the library is compiled with cxx11 ABI. + +def compiled_with_gcc_cxx11_abi(): + """Check if the library is compiled with _GLIBCXX_USE_CXX11_ABI. + + Please see + https://gcc.gnu.org/onlinedocs/libstdc++/manual/using_dual_abi.html for + more information. When building libraries relying on MXNet C++ headers, it + is required to use the same C++ ABI in the library as well as in libmxnet. Returns ------- - bool - Whether the library is compiled with cxx11 ABI. + int + 1 If compiled with _GLIBCXX_USE_CXX11_ABI=1 + 0 If compiled with _GLIBCXX_USE_CXX11_ABI=0 + -1 If compiled with a compiler that does not support _GLIBCXX_USE_CXX11_ABI + """ - ret = ctypes.c_bool() + ret = ctypes.c_int() check_call(_LIB.MXLibInfoCompiledWithCXX11ABI(ctypes.byref(ret))) return ret.value diff --git a/python/mxnet/ndarray/numpy/_op.py b/python/mxnet/ndarray/numpy/_op.py index 14dbf94a1417..e3af383d3acd 100644 --- a/python/mxnet/ndarray/numpy/_op.py +++ b/python/mxnet/ndarray/numpy/_op.py @@ -1620,7 +1620,7 @@ def argsort(a, axis=-1, kind=None, order=None): if order is not None: raise NotImplementedError("order not supported here") - return _npi.argsort(data=a, axis=axis, is_ascend=True, dtype='int64') + return _api_internal.argsort(a, axis, True, 'int64') @set_module('mxnet.ndarray.numpy') @@ -1664,7 +1664,7 @@ def sort(a, axis=-1, kind=None, order=None): """ if order is not None: raise NotImplementedError("order not supported here") - return _npi.sort(data=a, axis=axis, is_ascend=True) + return _api_internal.sort(a, axis, True) @set_module('mxnet.ndarray.numpy') @@ -4581,7 +4581,7 @@ def get_list(arrays): return [arr for arr in arrays] arrays = get_list(arrays) - return _npi.vstack(*arrays) + return _api_internal.vstack(*arrays) @set_module('mxnet.ndarray.numpy') @@ -4626,7 +4626,7 @@ def get_list(arrays): return [arr for arr in arrays] arrays = get_list(arrays) - return _npi.vstack(*arrays) + return _api_internal.vstack(*arrays) @set_module('mxnet.ndarray.numpy') diff --git a/python/mxnet/ndarray/numpy/random.py b/python/mxnet/ndarray/numpy/random.py index c2a2c0bf78ec..f55355a64326 100644 --- a/python/mxnet/ndarray/numpy/random.py +++ b/python/mxnet/ndarray/numpy/random.py @@ -21,7 +21,6 @@ from ...context import current_context from . import _internal as _npi from . import _api_internal -from ..ndarray import NDArray __all__ = ['randint', 'uniform', 'normal', "choice", "rand", "multinomial", "multivariate_normal", @@ -331,14 +330,11 @@ def multinomial(n, pvals, size=None): >>> np.random.multinomial(100, [1.0 / 3, 2.0 / 3]) array([32, 68]) """ - if isinstance(pvals, NDArray): - return _npi.multinomial(pvals, pvals=None, n=n, size=size) - else: - if isinstance(pvals, np.ndarray): - raise ValueError('numpy ndarray is not supported!') - if any(isinstance(i, list) for i in pvals): - raise ValueError('object too deep for desired array') - return _npi.multinomial(n=n, pvals=pvals, size=size) + if isinstance(pvals, np.ndarray): + raise ValueError('numpy ndarray is not supported!') + if any(isinstance(i, list) for i in pvals): + raise ValueError('object too deep for desired array') + return _api_internal.multinomial(n, pvals, size) def rayleigh(scale=1.0, size=None, ctx=None, out=None): diff --git a/python/mxnet/symbol/numpy/_symbol.py b/python/mxnet/symbol/numpy/_symbol.py index 2df7357e0c03..ee465442d159 100644 --- a/python/mxnet/symbol/numpy/_symbol.py +++ b/python/mxnet/symbol/numpy/_symbol.py @@ -8012,7 +8012,7 @@ def diagonal(a, offset=0, axis1=0, axis2=1): # pylint:disable=redefined-outer-name, too-many-arguments @set_module('mxnet.symbol.numpy') -def sum(a, axis=None, dtype=None, out=None, keepdims=None, initial=None, where=None): +def sum(a, axis=None, dtype=None, out=None, keepdims=False, initial=None, where=None): r""" Sum of array elements over a given axis. diff --git a/python/mxnet/test_utils.py b/python/mxnet/test_utils.py index cb71c7dd46b9..da4f35f8817f 100644 --- a/python/mxnet/test_utils.py +++ b/python/mxnet/test_utils.py @@ -1764,10 +1764,15 @@ def download(url, fname=None, dirname=None, overwrite=False, retries=5): def get_mnist(path='data'): """Download and load the MNIST dataset + Parameters + ---------- + path : str + Path in which to save the files. + Returns ------- dict - A dict containing the data + A dict containing the data. """ def read_data(label_url, image_url): if not os.path.isdir(path): @@ -1782,8 +1787,7 @@ def read_data(label_url, image_url): return (label, image) # changed to mxnet.io for more stable hosting - # path = 'http://yann.lecun.com/exdb/mnist/' - url_path = 'http://data.mxnet.io/data/mnist/' + url_path = 'https://repo.mxnet.io/gluon/dataset/mnist/' (train_lbl, train_img) = read_data( url_path+'train-labels-idx1-ubyte.gz', url_path+'train-images-idx3-ubyte.gz') (test_lbl, test_img) = read_data( @@ -1791,17 +1795,6 @@ def read_data(label_url, image_url): return {'train_data':train_img, 'train_label':train_lbl, 'test_data':test_img, 'test_label':test_lbl} -def get_mnist_pkl(path='data'): - """Downloads MNIST dataset as a pkl.gz into a directory in the current directory - with the name `data` - """ - if not os.path.isdir(path): - os.makedirs(path) - if not os.path.exists(os.path.join(path, 'mnist.pkl.gz')): - mx.gluon.utils.download('http://deeplearning.net/data/mnist/mnist.pkl.gz', - sha1_hash='0b07d663e8a02d51849faa39e226ed19d7b7ed23', - path=path) - def get_mnist_ubyte(path='data'): """Downloads ubyte version of the MNIST dataset into a directory in the current directory with the name `data` and extracts all files in the zip archive to this directory. @@ -1811,12 +1804,13 @@ def get_mnist_ubyte(path='data'): files = ['train-images-idx3-ubyte', 'train-labels-idx1-ubyte', 't10k-images-idx3-ubyte', 't10k-labels-idx1-ubyte'] if not all(os.path.exists(os.path.join(path, f)) for f in files): - url = 'http://data.mxnet.io/mxnet/data/mnist.zip' - sha1 = '74fc763958b9d6e04eb32717f80355bf895f0561' - zip_file_path = mx.gluon.utils.download(url, path=path, sha1_hash=sha1, - verify_ssl=False) - with zipfile.ZipFile(zip_file_path) as zf: - zf.extractall(path) + get_mnist(path) + for f in files: + ubyte_file_path = os.path.join(path, f) + zip_file_path = ubyte_file_path + '.gz' + with gzip.GzipFile(zip_file_path) as zf: + with open(ubyte_file_path, 'wb') as ubyte_file: + ubyte_file.write(zf.read()) def get_cifar10(path='data'): """Downloads CIFAR10 dataset into a directory in the current directory with the name `data`, @@ -1828,23 +1822,23 @@ def get_cifar10(path='data'): (not os.path.exists(os.path.join(path, 'cifar', 'test.rec'))) or \ (not os.path.exists(os.path.join(path, 'cifar', 'train.lst'))) or \ (not os.path.exists(os.path.join(path, 'cifar', 'test.lst'))): - url = 'http://data.mxnet.io/mxnet/data/cifar10.zip' + url = 'https://repo.mxnet.io/gluon/dataset/cifar10/cifar10-b9ac2870.zip' sha1 = 'b9ac287012f2dad9dfb49d8271c39ecdd7db376c' zip_file_path = mx.gluon.utils.download(url, path=path, sha1_hash=sha1, verify_ssl=False) with zipfile.ZipFile(zip_file_path) as zf: zf.extractall(path) -def get_mnist_iterator(batch_size, input_shape, num_parts=1, part_index=0): +def get_mnist_iterator(batch_size, input_shape, num_parts=1, part_index=0, path='data'): """Returns training and validation iterators for MNIST dataset """ - get_mnist_ubyte() + get_mnist_ubyte(path) flat = len(input_shape) != 3 train_dataiter = mx.io.MNISTIter( - image="data/train-images-idx3-ubyte", - label="data/train-labels-idx1-ubyte", + image=os.path.join(path, "train-images-idx3-ubyte"), + label=os.path.join(path, "train-labels-idx1-ubyte"), input_shape=input_shape, batch_size=batch_size, shuffle=True, @@ -1853,8 +1847,8 @@ def get_mnist_iterator(batch_size, input_shape, num_parts=1, part_index=0): part_index=part_index) val_dataiter = mx.io.MNISTIter( - image="data/t10k-images-idx3-ubyte", - label="data/t10k-labels-idx1-ubyte", + image=os.path.join(path, "t10k-images-idx3-ubyte"), + label=os.path.join(path, "t10k-labels-idx1-ubyte"), input_shape=input_shape, batch_size=batch_size, flat=flat, @@ -1863,31 +1857,6 @@ def get_mnist_iterator(batch_size, input_shape, num_parts=1, part_index=0): return (train_dataiter, val_dataiter) -def get_zip_data(data_dir, url, data_origin_name): - """Download and extract zip data. - - Parameters - ---------- - - data_dir : str - Absolute or relative path of the directory name to store zip files - url : str - URL to download data from - data_origin_name : str - Name of the downloaded zip file - - Examples - -------- - >>> get_zip_data("data_dir", - "http://files.grouplens.org/datasets/movielens/ml-10m.zip", - "ml-10m.zip") - """ - data_origin_name = os.path.join(data_dir, data_origin_name) - if not os.path.exists(data_origin_name): - download(url, dirname=data_dir, overwrite=False) - zip_file = zipfile.ZipFile(data_origin_name) - zip_file.extractall(path=data_dir) - def get_bz2_data(data_dir, data_name, url, data_origin_name): """Download and extract bz2 data. diff --git a/src/api/operator/numpy/np_matrix_op.cc b/src/api/operator/numpy/np_matrix_op.cc index 7b53c580683a..61d179647a88 100644 --- a/src/api/operator/numpy/np_matrix_op.cc +++ b/src/api/operator/numpy/np_matrix_op.cc @@ -615,4 +615,24 @@ MXNET_REGISTER_API("_npi.tril_indices") *ret = ADT(0, ndarray_handles.begin(), ndarray_handles.end()); }); +MXNET_REGISTER_API("_npi.vstack") +.set_body([](runtime::MXNetArgs args, runtime::MXNetRetValue* ret) { + using namespace runtime; + const nnvm::Op* op = Op::Get("_npi_vstack"); + nnvm::NodeAttrs attrs; + op::NumpyVstackParam param; + param.num_args = args.size(); + + attrs.parsed = param; + attrs.op = op; + SetAttrDict(&attrs); + int num_outputs = 0; + std::vector inputs_vec(args.size(), nullptr); + for (int i = 0; i < args.size(); ++i) { + inputs_vec[i] = args[i].operator mxnet::NDArray*(); + } + NDArray** inputs = inputs_vec.data(); + auto ndoutputs = Invoke(op, &attrs, param.num_args, inputs, &num_outputs, nullptr); + *ret = ndoutputs[0]; +}); } // namespace mxnet diff --git a/src/api/operator/numpy/np_ordering_op.cc b/src/api/operator/numpy/np_ordering_op.cc new file mode 100644 index 000000000000..ec0db28b4f9a --- /dev/null +++ b/src/api/operator/numpy/np_ordering_op.cc @@ -0,0 +1,88 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +/*! + * \file np_ordering_op.cc + * \brief Implementation of the API of functions in src/operator/tensor/ordering_op.cc + */ +#include +#include +#include "../utils.h" +#include "../../../operator/tensor/ordering_op-inl.h" + +namespace mxnet { + +MXNET_REGISTER_API("_npi.sort") +.set_body([](runtime::MXNetArgs args, runtime::MXNetRetValue* ret) { + using namespace runtime; + const nnvm::Op* op = Op::Get("_npi_sort"); + nnvm::NodeAttrs attrs; + op::SortParam param; + + if (args[1].type_code() == kNull) { + param.axis = dmlc::nullopt; + } else { + param.axis = args[1].operator int(); + } + param.is_ascend = true; + + attrs.parsed = std::move(param); + attrs.op = op; + + int num_inputs = 1; + NDArray* inputs[] = {args[0].operator mxnet::NDArray*()}; + + int num_outputs = 0; + SetAttrDict(&attrs); + auto ndoutputs = Invoke(op, &attrs, num_inputs, inputs, &num_outputs, nullptr); + *ret = reinterpret_cast(ndoutputs[0]); +}); + +MXNET_REGISTER_API("_npi.argsort") +.set_body([](runtime::MXNetArgs args, runtime::MXNetRetValue* ret) { + using namespace runtime; + const nnvm::Op* op = Op::Get("_npi_argsort"); + nnvm::NodeAttrs attrs; + op::ArgSortParam param; + + if (args[1].type_code() == kNull) { + param.axis = dmlc::nullopt; + } else { + param.axis = args[1].operator int(); + } + param.is_ascend = true; + if (args[3].type_code() == kNull) { + param.dtype = mshadow::kFloat32; + } else { + param.dtype = String2MXNetTypeWithBool(args[3].operator std::string()); + } + + attrs.parsed = std::move(param); + attrs.op = op; + + int num_inputs = 1; + NDArray* inputs[] = {args[0].operator mxnet::NDArray*()}; + + int num_outputs = 0; + SetAttrDict(&attrs); + auto ndoutputs = Invoke(op, &attrs, num_inputs, inputs, &num_outputs, nullptr); + *ret = reinterpret_cast(ndoutputs[0]); +}); + +} // namespace mxnet diff --git a/src/api/operator/numpy/random/np_multinomial_op.cc b/src/api/operator/numpy/random/np_multinomial_op.cc new file mode 100644 index 000000000000..591768cb0bbc --- /dev/null +++ b/src/api/operator/numpy/random/np_multinomial_op.cc @@ -0,0 +1,75 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +/*! + * \file np_multinomial_op.cc + * \brief Implementation of the API of functions in src/operator/numpy/random/np_multinomial_op.cc + */ +#include +#include +#include +#include "../../utils.h" +#include "../../../../operator/numpy/random/np_multinomial_op.h" + +namespace mxnet { + +MXNET_REGISTER_API("_npi.multinomial") +.set_body([](runtime::MXNetArgs args, runtime::MXNetRetValue* ret) { + using namespace runtime; + const nnvm::Op* op = Op::Get("_npi_multinomial"); + nnvm::NodeAttrs attrs; + op::NumpyMultinomialParam param; + NDArray** inputs = new NDArray*[1](); + int num_inputs = 0; + + // parse int + param.n = args[0].operator int(); + + // parse pvals + if (args[1].type_code() == kNull) { + param.pvals = dmlc::nullopt; + } else if (args[1].type_code() == kNDArrayHandle) { + param.pvals = dmlc::nullopt; + inputs[0] = args[1].operator mxnet::NDArray*(); + num_inputs = 1; + } else { + param.pvals = Obj2Tuple(args[1].operator ObjectRef()); + } + + // parse size + if (args[2].type_code() == kNull) { + param.size = dmlc::nullopt; + } else { + if (args[2].type_code() == kDLInt) { + param.size = mxnet::Tuple(1, args[2].operator int64_t()); + } else { + param.size = mxnet::Tuple(args[2].operator ObjectRef()); + } + } + + attrs.parsed = std::move(param); + attrs.op = op; + SetAttrDict(&attrs); + inputs = num_inputs == 0 ? nullptr : inputs; + int num_outputs = 0; + auto ndoutputs = Invoke(op, &attrs, num_inputs, inputs, &num_outputs, nullptr); + *ret = ndoutputs[0]; +}); + +} // namespace mxnet diff --git a/src/c_api/c_api.cc b/src/c_api/c_api.cc index 011994b54c67..ab367b973595 100644 --- a/src/c_api/c_api.cc +++ b/src/c_api/c_api.cc @@ -1299,11 +1299,13 @@ int MXLibInfoFeatures(const struct LibFeature **lib_features, size_t *size) { API_END(); } -int MXLibInfoCompiledWithCXX11ABI(bool* result) { - using namespace features; +int MXLibInfoCompiledWithCXX11ABI(int* result) { API_BEGIN(); - LibInfo* lib_info = LibInfo::getInstance(); - *result = lib_info->cxx11_abi(); +#ifdef _GLIBCXX_USE_CXX11_ABI + *result = _GLIBCXX_USE_CXX11_ABI; +#else + *result = -1; +#endif API_END(); } diff --git a/src/operator/numpy/np_matrix_op-inl.h b/src/operator/numpy/np_matrix_op-inl.h index 0fea76b3d894..6ff792e1476e 100644 --- a/src/operator/numpy/np_matrix_op-inl.h +++ b/src/operator/numpy/np_matrix_op-inl.h @@ -61,6 +61,11 @@ struct NumpyVstackParam : public dmlc::Parameter { DMLC_DECLARE_FIELD(num_args).set_lower_bound(1) .describe("Number of inputs to be vstacked."); } + void SetAttrDict(std::unordered_map* dict) { + std::ostringstream num_args_s; + num_args_s << num_args; + (*dict)["num_args"] = num_args_s.str(); + } }; struct NumpyColumnStackParam : public dmlc::Parameter { diff --git a/src/operator/numpy/random/np_multinomial_op.h b/src/operator/numpy/random/np_multinomial_op.h index 9c5c73f3f6b4..d77f11ca1c5a 100644 --- a/src/operator/numpy/random/np_multinomial_op.h +++ b/src/operator/numpy/random/np_multinomial_op.h @@ -27,6 +27,7 @@ #include #include +#include #include "../../mshadow_op.h" #include "../../mxnet_op.h" #include "../../operator_common.h" @@ -55,6 +56,15 @@ struct NumpyMultinomialParam : public dmlc::Parameter { "e.g., (m, n, k), then m * n * k samples are drawn. " "Default is None, in which case a single value is returned."); } + void SetAttrDict(std::unordered_map* dict) { + std::ostringstream n_s, pvals_s, size_s; + n_s << n; + pvals_s << pvals; + size_s << size; + (*dict)["n"] = n_s.str(); + (*dict)["pvals"] = pvals_s.str(); + (*dict)["size"] = size_s.str(); + } }; inline bool NumpyMultinomialOpShape(const nnvm::NodeAttrs& attrs, diff --git a/src/operator/subgraph/tensorrt/tensorrt-inl.h b/src/operator/subgraph/tensorrt/tensorrt-inl.h index b35a1715000e..3119d31fa909 100644 --- a/src/operator/subgraph/tensorrt/tensorrt-inl.h +++ b/src/operator/subgraph/tensorrt/tensorrt-inl.h @@ -302,7 +302,7 @@ class TensorrtProperty : public SubgraphProperty { TRTParam param; std::ostringstream params_oss; for (auto ¶m_name : new_sym.ListInputNames(nnvm::Symbol::kAll)) { - NDArray *cache; + NDArray *cache = nullptr; auto it_args = in_args_dict.find(param_name); if (it_args != in_args_dict.end()) { cache = it_args->second; diff --git a/src/operator/tensor/elemwise_sum.cc b/src/operator/tensor/elemwise_sum.cc index 5885d73efe29..c513e65b0c0e 100644 --- a/src/operator/tensor/elemwise_sum.cc +++ b/src/operator/tensor/elemwise_sum.cc @@ -113,7 +113,14 @@ void ElementWiseSumComputeExCPU(const nnvm::NodeAttrs& attrs, CHECK_EQ(outputs.size(), 1U); CHECK_EQ(req.size(), 1U); if (req[0] == kNullOp) return; - if (common::ContainsOnlyStorage(inputs, kRowSparseStorage) || +#if MXNET_USE_MKLDNN == 1 + if (IsMKLDNNData(inputs)) { + MKLDNNRun(MKLDNNSumForward, attrs, ctx, inputs, req, outputs); + } else if (common::ContainsOnlyStorage(inputs, kDefaultStorage)) { + FallBackCompute(ElementWiseSumCompute, attrs, ctx, inputs, req, outputs); + } +#endif + else if (common::ContainsOnlyStorage(inputs, kRowSparseStorage) || // NOLINT(*) (inputs.size() == 3U && inputs[0].storage_type() == kDefaultStorage && inputs[1].storage_type() == kCSRStorage && inputs[2].storage_type() == kDefaultStorage) || (inputs.size() > 4U && common::ContainsStorageType(inputs, kDefaultStorage) && @@ -123,12 +130,6 @@ void ElementWiseSumComputeExCPU(const nnvm::NodeAttrs& attrs, ResourceRequest(ResourceRequest::kTempSpace)); NDArray out_nd = outputs[0]; mxnet::ndarray::ElementwiseSum(s, rsc, inputs, &out_nd); -#if MXNET_USE_MKLDNN == 1 - } else if (IsMKLDNNData(inputs)) { - MKLDNNRun(MKLDNNSumForward, attrs, ctx, inputs, req, outputs); - } else if (common::ContainsOnlyStorage(inputs, kDefaultStorage)) { - FallBackCompute(ElementWiseSumCompute, attrs, ctx, inputs, req, outputs); -#endif } else { LogUnimplementedOp(attrs, ctx, inputs, req, outputs); } diff --git a/src/operator/tensor/ordering_op-inl.h b/src/operator/tensor/ordering_op-inl.h index b671b6c281dd..a5e83284e532 100644 --- a/src/operator/tensor/ordering_op-inl.h +++ b/src/operator/tensor/ordering_op-inl.h @@ -30,11 +30,13 @@ #include #include #include +#include #include #include "../mshadow_op.h" #include "../elemwise_op_common.h" #include "./sort_op.h" #include "./indexing_op.h" +#include "../../api/operator/op_utils.h" namespace mshadow { template @@ -105,6 +107,13 @@ struct SortParam : public dmlc::Parameter { DMLC_DECLARE_FIELD(is_ascend).set_default(true) .describe("Whether to sort in ascending or descending order."); } + void SetAttrDict(std::unordered_map* dict) { + std::ostringstream axis_s, is_ascend_s; + axis_s << axis; + is_ascend_s << is_ascend; + (*dict)["axis"] = axis_s.str(); + (*dict)["is_ascend_s"] = is_ascend_s.str(); + } }; struct ArgSortParam : public dmlc::Parameter { @@ -130,6 +139,15 @@ struct ArgSortParam : public dmlc::Parameter { " \"both\". An error will be raised if the selected data type cannot precisely " "represent the indices."); } + void SetAttrDict(std::unordered_map* dict) { + std::ostringstream axis_s, is_ascend_s, dtype_s; + axis_s << axis; + is_ascend_s << is_ascend; + dtype_s << dtype; + (*dict)["axis"] = axis_s.str(); + (*dict)["is_ascend_s"] = is_ascend_s.str(); + (*dict)["dtype"] = MXNetTypeWithBool2String(dtype); + } }; inline void ParseTopKParam(const TShape& src_shape, diff --git a/tests/nightly/dist_async_kvstore.py b/tests/nightly/dist_async_kvstore.py index f1bf13d93d37..4e0fbf789ff2 100644 --- a/tests/nightly/dist_async_kvstore.py +++ b/tests/nightly/dist_async_kvstore.py @@ -31,7 +31,7 @@ def check_trainer_kv_update(weight_stype, update_on_kv): x = mx.gluon.Parameter('x', shape=(10,1), lr_mult=1.0, stype=weight_stype) x.initialize(ctx=[mx.cpu(0), mx.cpu(1)], init='zeros') try: - trainer = mx.gluon.Trainer([x], 'sgd', {'learning_rate': 0.1}, + trainer = mx.gluon.Trainer({'x':x}, 'sgd', {'learning_rate': 0.1}, kvstore=kv, update_on_kvstore=update_on_kv) trainer._init_kvstore() assert trainer._kv_initialized diff --git a/tests/nightly/dist_device_sync_kvstore.py b/tests/nightly/dist_device_sync_kvstore.py index b7b4e4c71f0e..c6b526f02228 100644 --- a/tests/nightly/dist_device_sync_kvstore.py +++ b/tests/nightly/dist_device_sync_kvstore.py @@ -109,7 +109,7 @@ def check_trainer_kv_update(update_on_kv): x = mx.gluon.Parameter('x', shape=(10,1), lr_mult=1.0) x.initialize(ctx=[mx.cpu(0), mx.cpu(1)], init='zeros') try: - trainer = mx.gluon.Trainer([x], 'sgd', {'learning_rate': 0.1}, + trainer = mx.gluon.Trainer({'x':x}, 'sgd', {'learning_rate': 0.1}, kvstore=kv, update_on_kvstore=update_on_kv) trainer._init_kvstore() assert trainer._kv_initialized diff --git a/tests/nightly/dist_sync_kvstore.py b/tests/nightly/dist_sync_kvstore.py index 3f5137ba09b9..4a4a5c8d9670 100644 --- a/tests/nightly/dist_sync_kvstore.py +++ b/tests/nightly/dist_sync_kvstore.py @@ -381,7 +381,7 @@ def test_gluon_trainer_type(): def check_trainer_kv_type(stype, grad_stype, update_on_kv, expected): x = mx.gluon.Parameter('x', shape=(10,1), lr_mult=1.0, stype=stype, grad_stype=grad_stype) x.initialize(ctx=[mx.cpu(0), mx.cpu(1)], init='zeros') - trainer = mx.gluon.Trainer([x], 'sgd', {'learning_rate': 0.1}, + trainer = mx.gluon.Trainer({'x':x}, 'sgd', {'learning_rate': 0.1}, kvstore=kv, update_on_kvstore=update_on_kv) try: trainer._init_kvstore() @@ -405,7 +405,7 @@ def check_trainer_step(): shape = (10, 1) x = mx.gluon.Parameter('x', shape=shape) x.initialize(ctx=ctx, init='ones') - trainer = mx.gluon.Trainer([x], 'sgd', {'learning_rate': 1.0, 'multi_precision': False}, kvstore=kv) + trainer = mx.gluon.Trainer({'x':x}, 'sgd', {'learning_rate': 1.0, 'multi_precision': False}, kvstore=kv) with mx.autograd.record(): w = x.data(ctx) y = (my_rank + 1) * w @@ -423,7 +423,7 @@ def check_trainer_sparse_step(): all_rows = mx.nd.arange(0, shape[0], ctx=ctx) x = mx.gluon.Parameter('x', shape=shape, stype='row_sparse', grad_stype='row_sparse') x.initialize(ctx=ctx, init='ones') - trainer = mx.gluon.Trainer([x], 'sgd', {'learning_rate': 1.0}, kvstore=kv) + trainer = mx.gluon.Trainer({'x':x}, 'sgd', {'learning_rate': 1.0}, kvstore=kv) with mx.autograd.record(): w = x.row_sparse_data(all_rows) y = (my_rank + 1) * w diff --git a/tests/nightly/download.sh b/tests/nightly/download.sh deleted file mode 100644 index d07fc6f4ab8a..000000000000 --- a/tests/nightly/download.sh +++ /dev/null @@ -1,38 +0,0 @@ -#!/bin/bash - -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you 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. - - -dmlc_download() { - url=http://data.mxnet.io/mxnet/datasets/ - dir=$1 - file=$2 - if [ ! -e data/${dir}/$file ]; then - wget ${url}/${dir}/${file} -P data/${dir}/ || exit -1 - else - echo "data/${dir}/$file already exits" - fi -} - -dmlc_download mnist t10k-images-idx3-ubyte -dmlc_download mnist t10k-labels-idx1-ubyte -dmlc_download mnist train-images-idx3-ubyte -dmlc_download mnist train-labels-idx1-ubyte - -dmlc_download cifar10 train.rec -dmlc_download cifar10 test.rec diff --git a/tests/python/gpu/test_gluon_model_zoo_gpu.py b/tests/python/gpu/test_gluon_model_zoo_gpu.py index 1d0d3f4b2313..bad65489d9a1 100644 --- a/tests/python/gpu/test_gluon_model_zoo_gpu.py +++ b/tests/python/gpu/test_gluon_model_zoo_gpu.py @@ -36,7 +36,7 @@ def eprint(*args, **kwargs): VAL_DATA='data/val-5k-256.rec' def download_data(): return mx.test_utils.download( - 'http://data.mxnet.io/data/val-5k-256.rec', VAL_DATA) + 'https://repo.mxnet.io/gluon/dataset/test/val-5k-256-9e70d85e0.rec', VAL_DATA) @with_seed() @pytest.mark.serial diff --git a/tests/python/mkl/test_mkldnn.py b/tests/python/mkl/test_mkldnn.py index 0bd5d1ead13b..115baea380f2 100644 --- a/tests/python/mkl/test_mkldnn.py +++ b/tests/python/mkl/test_mkldnn.py @@ -219,6 +219,28 @@ def test_flatten_slice_after_conv(): print(p[0]) +def test_mkldnn_sum_with_mkldnn_layout(): + + x_shape = (32, 3, 224, 224) + x_npy = np.ones(x_shape, dtype='float32') + w_shape = (32, 3, 3, 3) + w_npy = np.ones(w_shape, dtype='float32') + + x = mx.sym.Variable("x") + w = mx.sym.Variable("w") + z = mx.symbol.Convolution(data=x, weight=w, num_filter=32, kernel=(3, 3)) + num_inputs = [2, 3, 4, 5] + for i in num_inputs: + inputs = [] + for n in range(i): + inputs.append(z) + y = mx.sym.add_n(*inputs) # (only MKLDNN data input) + exe = y._simple_bind(ctx=mx.cpu(), x=x_shape, w=w_shape) + out = exe.forward(is_train=False, x=x_npy, w=np.ones(w_shape))[0] + #conv with kernel (3,3) on ones should give result=27 + single_cov = 27.0 + assert_almost_equal(out[0].asnumpy()[0, 0, 0], single_cov*i) + def test_mkldnn_sum_inplace_with_cpu_layout(): x_shape = (32, 3, 224, 224) x_npy = np.ones(x_shape, dtype='float32') @@ -227,7 +249,7 @@ def test_mkldnn_sum_inplace_with_cpu_layout(): x = mx.sym.Variable("x") y = mx.sym.Variable("y") z = mx.symbol.Convolution(data=x, num_filter=32, kernel=(3, 3)) - z = mx.sym.add_n(z, y) + z = mx.sym.add_n(z, y) # (MKLDNN data, cpu data) exe = z._simple_bind(ctx=mx.cpu(), x=x_shape, y=y_shape) out = exe.forward(is_train=False, x=x_npy, y=y_npy)[0] assert_almost_equal(out[0].asnumpy()[0, 0, 0], 1.0) diff --git a/tests/python/unittest/test_contrib_gluon_data_vision.py b/tests/python/unittest/test_contrib_gluon_data_vision.py index 166b07f843d7..fee9177969a6 100644 --- a/tests/python/unittest/test_contrib_gluon_data_vision.py +++ b/tests/python/unittest/test_contrib_gluon_data_vision.py @@ -51,7 +51,7 @@ def _generate_objects(): class TestImage(unittest.TestCase): - IMAGES_URL = "http://data.mxnet.io/data/test_images.tar.gz" + IMAGES_URL = "https://repo.mxnet.io/gluon/dataset/test/test_images-9cebe48a.tar.gz" def setUp(self): self.IMAGES_DIR = tempfile.mkdtemp() @@ -146,3 +146,4 @@ def test_bbox_augmenters(self): max_attempts=50) for batch in det_iter: pass + mx.nd.waitall() diff --git a/tests/python/unittest/test_gluon.py b/tests/python/unittest/test_gluon.py index 71ae41c2cfa6..4bd2171dfd18 100644 --- a/tests/python/unittest/test_gluon.py +++ b/tests/python/unittest/test_gluon.py @@ -70,7 +70,7 @@ def test_sparse_parameter(): assert len(p.list_grad()) == 2 # getting row_sparse data without trainer throws an exception assertRaises(RuntimeError, p.list_row_sparse_data, row_id) - trainer = mx.gluon.Trainer([p], 'sgd') + trainer = mx.gluon.Trainer({'p':p}, 'sgd') assert len(p.list_row_sparse_data(row_id)) == 2 weight = p.row_sparse_data(row_id) assert weight.context == mx.cpu(1) @@ -104,7 +104,7 @@ def test_parameter_row_sparse_data(): dim0 = 4 x = gluon.Parameter('x', shape=(dim0, 2), stype='row_sparse') x.initialize(init='xavier', ctx=[ctx0, ctx1]) - trainer = gluon.Trainer([x], 'sgd') + trainer = gluon.Trainer({'x':x}, 'sgd') x_param = x._data[0].copy() assert x_param.stype == 'row_sparse' row_id_0 = mx.nd.array([0,1], ctx=ctx0) diff --git a/tests/python/unittest/test_gluon_data.py b/tests/python/unittest/test_gluon_data.py index b68d03f697fc..abdf558c2b1c 100644 --- a/tests/python/unittest/test_gluon_data.py +++ b/tests/python/unittest/test_gluon_data.py @@ -52,7 +52,7 @@ def test_array_dataset(): def prepare_record(tmpdir_factory): test_images = tmpdir_factory.mktemp("test_images") test_images_tar = test_images.join("test_images.tar.gz") - gluon.utils.download("http://data.mxnet.io/data/test_images.tar.gz", str(test_images_tar)) + gluon.utils.download("https://repo.mxnet.io/gluon/dataset/test/test_images-9cebe48a.tar.gz", str(test_images_tar)) tarfile.open(test_images_tar).extractall(str(test_images)) imgs = os.listdir(str(test_images.join("test_images"))) record = mx.recordio.MXIndexedRecordIO(str(test_images.join("test.idx")), str(test_images.join("test.rec")), 'w') diff --git a/tests/python/unittest/test_gluon_trainer.py b/tests/python/unittest/test_gluon_trainer.py index 1e3a1028cf43..5c94fc8d003c 100644 --- a/tests/python/unittest/test_gluon_trainer.py +++ b/tests/python/unittest/test_gluon_trainer.py @@ -36,7 +36,7 @@ def test_multi_trainer(): x = gluon.Parameter('x', shape=(10,), stype='row_sparse') x.initialize() # test set trainer - trainer0 = gluon.Trainer([x], 'sgd') + trainer0 = gluon.Trainer({'x':x}, 'sgd') assert(x._trainer() is trainer0) # test unset trainer x._set_trainer(None) @@ -44,13 +44,13 @@ def test_multi_trainer(): x._set_trainer(trainer0) with pytest.raises(RuntimeError): # multiple trainers for a sparse Parameter is not allowed - trainer1 = gluon.Trainer([x], 'sgd') + trainer1 = gluon.Trainer({'x':x}, 'sgd') @with_seed() def test_trainer_with_sparse_grad_on_single_context(): x = gluon.Parameter('x', shape=(10,), grad_stype='row_sparse') x.initialize(ctx=[mx.cpu(0)], init='zeros') - trainer = gluon.Trainer([x], 'sgd', {'learning_rate': 1.0, 'momentum': 0.5}) + trainer = gluon.Trainer({'x':x}, 'sgd', {'learning_rate': 1.0, 'momentum': 0.5}) with mx.autograd.record(): for w in x.list_data(): y = w + 1 @@ -66,7 +66,7 @@ def test_trainer_with_teststore(): x = gluon.Parameter('x', shape=(10,)) x.initialize(ctx=[mx.cpu(0), mx.cpu(1)], init='zeros') kv = mx.kv.create('teststore') - trainer = gluon.Trainer([x], 'sgd', {'learning_rate': 1.0, 'momentum': 0.5}, kvstore=kv) + trainer = gluon.Trainer({'x':x}, 'sgd', {'learning_rate': 1.0, 'momentum': 0.5}, kvstore=kv) with mx.autograd.record(): for w in x.list_data(): y = w + 1 @@ -77,14 +77,14 @@ def test_trainer_with_teststore(): assert (x.data(mx.cpu(1)).asnumpy() == -2).all() # Expect exceptions if update_on_kvstore is set to True, # because TestStore does not support that - invalid_trainer = gluon.Trainer([x], 'sgd', kvstore=kv, update_on_kvstore=True) + invalid_trainer = gluon.Trainer({'x':x}, 'sgd', kvstore=kv, update_on_kvstore=True) pytest.raises(ValueError, invalid_trainer._init_kvstore) @with_seed() def test_trainer(): x = gluon.Parameter('x', shape=(10,)) x.initialize(ctx=[mx.cpu(0), mx.cpu(1)], init='zeros') - trainer = gluon.Trainer([x], 'sgd', {'learning_rate': 1.0, 'momentum': 0.5}) + trainer = gluon.Trainer({'x':x}, 'sgd', {'learning_rate': 1.0, 'momentum': 0.5}) with mx.autograd.record(): for w in x.list_data(): y = w + 1 @@ -119,7 +119,7 @@ def test_trainer(): x = gluon.Parameter('x', shape=(10,)) x.initialize(ctx=[mx.cpu(0), mx.cpu(1)], init='zeros') - trainer2 = gluon.Trainer([x], 'sgd', {'learning_rate': 1.0, 'momentum': 0.5}, + trainer2 = gluon.Trainer({'x':x}, 'sgd', {'learning_rate': 1.0, 'momentum': 0.5}, update_on_kvstore=False) with mx.autograd.record(): for i, w in enumerate(x.list_data()): @@ -139,7 +139,7 @@ def test_trainer_save_load(): x = gluon.Parameter('x', shape=(10,), lr_mult=1.0) x.initialize(ctx=[mx.cpu(0), mx.cpu(1)], init='zeros') - trainer = gluon.Trainer([x], 'sgd', {'learning_rate': 0.1}) + trainer = gluon.Trainer({'x':x}, 'sgd', {'learning_rate': 0.1}) with mx.autograd.record(): for w in x.list_data(): y = w + 1 @@ -158,7 +158,7 @@ def test_trainer_sparse_save_load(): x = gluon.Parameter('x', shape=(10, 1), lr_mult=1.0, stype='row_sparse', grad_stype='row_sparse') x.initialize(ctx=[mx.cpu(0)], init='zeros') - trainer = gluon.Trainer([x], 'sgd', {'learning_rate': 0.1}) + trainer = gluon.Trainer({'x':x}, 'sgd', {'learning_rate': 0.1}) all_rows = mx.nd.arange(0, 10, ctx=mx.cpu(0)) with mx.autograd.record(): for w in x.list_row_sparse_data(all_rows): @@ -257,7 +257,7 @@ def test_trainer_sparse_kv(): def check_trainer_sparse_kv(kv, stype, grad_stype, update_on_kv, expected): x = mx.gluon.Parameter('x', shape=(10,1), lr_mult=1.0, stype=stype, grad_stype=grad_stype) x.initialize(ctx=[mx.cpu(0), mx.cpu(1)], init='zeros') - trainer = gluon.Trainer([x], 'sgd', {'learning_rate': 0.1}, + trainer = gluon.Trainer({'x':x}, 'sgd', {'learning_rate': 0.1}, kvstore=kv, update_on_kvstore=update_on_kv) all_rows = mx.nd.arange(0, 10, ctx=mx.cpu(0)) try: @@ -297,7 +297,7 @@ def test_trainer_lr_sched(): factor = 0.1 lr = 1 lr_sched = mx.lr_scheduler.FactorScheduler(freq, factor=factor, base_lr=lr) - trainer = gluon.Trainer([x], 'sgd', {'learning_rate': lr, 'lr_scheduler': lr_sched}) + trainer = gluon.Trainer({'x':x}, 'sgd', {'learning_rate': lr, 'lr_scheduler': lr_sched}) for i in range(10): with mx.autograd.record(): for w in x.list_data(): @@ -316,7 +316,7 @@ def test_trainer_lr_sched(): factor = 0.1 lr = 1 lr_sched = mx.lr_scheduler.FactorScheduler(freq, factor=factor, base_lr=lr) - trainer = gluon.Trainer([x], 'sgd', {'learning_rate': lr, 'lr_scheduler': lr_sched}, + trainer = gluon.Trainer({'x':x}, 'sgd', {'learning_rate': lr, 'lr_scheduler': lr_sched}, update_on_kvstore=False) for i in range(10): with mx.autograd.record(): @@ -359,3 +359,43 @@ def test_trainer_allreduce_hybridsequential(): out = net(mx.nd.ones((1, 1), ctx=ctx)) out.backward() trainer.allreduce_grads() + + +def test_trainer_share_parameters(): + class Net(gluon.Block): + def __init__(self, **kwargs): + super(Net, self).__init__(**kwargs) + self.dense1 = gluon.nn.Dense(5, in_units=2, use_bias=False) + params = self.dense1.collect_params() + self.dense2 = gluon.nn.Dense(5, in_units=2, + use_bias=False).share_parameters(params) + self.dense3 = gluon.nn.Dense(5, in_units=5, use_bias=False) + + def forward(self, x): + hidden = self.dense1(x) + self.dense2(x) + out = self.dense3(hidden) + return out + + net = Net() + ctxes = [mx.cpu(0), mx.cpu(1)] + net.initialize(mx.init.One(), ctx=ctxes) + trainer = gluon.Trainer(net.collect_params(), 'sgd', {'learning_rate': 1}) + data = mx.nd.array([[1, 1], [1, 1]]) + xs = gluon.utils.split_and_load(data, ctxes) + ys = [] + with mx.autograd.record(): + for x in xs: + y = net(x) + ys.append(y) + for y in ys: + y.backward() + trainer.step(1) + params = net.collect_params() + shared_params = [] + for param in params.values(): + p = param.data(mx.cpu(0)).asnumpy() + if p.shape[1] == 2: + shared_params.append(p) + + assert((shared_params[0] == shared_params[1]).all()) + diff --git a/tests/python/unittest/test_image.py b/tests/python/unittest/test_image.py index 9cb287a50b11..d638946ea10a 100644 --- a/tests/python/unittest/test_image.py +++ b/tests/python/unittest/test_image.py @@ -110,7 +110,7 @@ def _test_imageiter_last_batch(imageiter_list, assert_data_shape): class TestImage(unittest.TestCase): - IMAGES_URL = "http://data.mxnet.io/data/test_images.tar.gz" + IMAGES_URL = "https://repo.mxnet.io/gluon/dataset/test/test_images-9cebe48a.tar.gz" def setUp(self): self.IMAGES_DIR = tempfile.mkdtemp() diff --git a/tests/python/unittest/test_numpy_contrib_gluon_data_vision.py b/tests/python/unittest/test_numpy_contrib_gluon_data_vision.py index 8c3e76aac91c..6713965fd093 100644 --- a/tests/python/unittest/test_numpy_contrib_gluon_data_vision.py +++ b/tests/python/unittest/test_numpy_contrib_gluon_data_vision.py @@ -51,7 +51,7 @@ def _generate_objects(): class TestImage(unittest.TestCase): - IMAGES_URL = "http://data.mxnet.io/data/test_images.tar.gz" + IMAGES_URL = "https://repo.mxnet.io/gluon/dataset/test/test_images-9cebe48a.tar.gz" def setUp(self): self.IMAGES_DIR = tempfile.mkdtemp() diff --git a/tests/python/unittest/test_numpy_loss.py b/tests/python/unittest/test_numpy_loss.py index 6c63546f85b1..14f46f0b4a76 100644 --- a/tests/python/unittest/test_numpy_loss.py +++ b/tests/python/unittest/test_numpy_loss.py @@ -20,57 +20,94 @@ from mxnet import gluon, autograd from mxnet.test_utils import assert_almost_equal, default_context, use_np from common import setup_module, with_seed, teardown_module, xfail_when_nonstandard_decimal_separator -import unittest +import pytest @xfail_when_nonstandard_decimal_separator @with_seed() @use_np -def test_loss_np_ndarray(): +@pytest.mark.parametrize("hybridize", [False, True]) +def test_loss_np_ndarray(hybridize): output = mx.np.array([1, 2, 3, 4]) label = mx.np.array([1, 3, 5, 7]) weighting = mx.np.array([0.5, 1, 0.5, 1]) loss = gluon.loss.L1Loss() + if hybridize: + loss.hybridize() assert mx.np.sum(loss(output, label)) == 6. loss = gluon.loss.L1Loss(weight=0.5) + if hybridize: + loss.hybridize() assert mx.np.sum(loss(output, label)) == 3. loss = gluon.loss.L1Loss() + if hybridize: + loss.hybridize() assert mx.np.sum(loss(output, label, weighting)) == 5. loss = gluon.loss.L2Loss() + if hybridize: + loss.hybridize() assert mx.np.sum(loss(output, label)) == 7. loss = gluon.loss.L2Loss(weight=0.25) + if hybridize: + loss.hybridize() assert mx.np.sum(loss(output, label)) == 1.75 loss = gluon.loss.L2Loss() + if hybridize: + loss.hybridize() assert mx.np.sum(loss(output, label, weighting)) == 6 loss = gluon.loss.HuberLoss() + if hybridize: + loss.hybridize() assert mx.np.sum(loss(output, label)) == 4.5 loss = gluon.loss.HuberLoss(weight=0.25) + if hybridize: + loss.hybridize() assert mx.np.sum(loss(output, label)) == 1.125 loss = gluon.loss.HuberLoss() + if hybridize: + loss.hybridize() assert mx.np.sum(loss(output, label, weighting)) == 3.75 loss = gluon.loss.HingeLoss(margin=10) + if hybridize: + loss.hybridize() assert mx.np.sum(loss(output, label)) == 13. loss = gluon.loss.HingeLoss(margin=8, weight=0.25) + if hybridize: + loss.hybridize() assert mx.np.sum(loss(output, label)) == 2.25 loss = gluon.loss.HingeLoss(margin=7) + if hybridize: + loss.hybridize() assert mx.np.sum(loss(output, label, weighting)) == 4. loss = gluon.loss.SquaredHingeLoss(margin=10) + if hybridize: + loss.hybridize() assert mx.np.sum(loss(output, label)) == 97. loss = gluon.loss.SquaredHingeLoss(margin=8, weight=0.25) + if hybridize: + loss.hybridize() assert mx.np.sum(loss(output, label)) == 13.25 loss = gluon.loss.SquaredHingeLoss(margin=7) + if hybridize: + loss.hybridize() assert mx.np.sum(loss(output, label, weighting)) == 19. loss = gluon.loss.TripletLoss(margin=10) + if hybridize: + loss.hybridize() assert mx.np.sum(loss(output, label, -label)) == 6. loss = gluon.loss.TripletLoss(margin=8, weight=0.25) + if hybridize: + loss.hybridize() assert mx.np.sum(loss(output, label, -label)) == 1. loss = gluon.loss.TripletLoss(margin=7) + if hybridize: + loss.hybridize() assert mx.np.sum(loss(output, label, -label, weighting)) == 1.5 output = mx.np.array([[0, 2], [1, 4]]) @@ -78,30 +115,48 @@ def test_loss_np_ndarray(): weighting = mx.np.array([[0.5], [1.0]]) loss = gluon.loss.SoftmaxCrossEntropyLoss() + if hybridize: + loss.hybridize() L = loss(output, label).asnumpy() assert_almost_equal(L, np.array([ 2.12692809, 0.04858733]), rtol=1e-3, atol=1e-4) + loss = gluon.loss.SoftmaxCrossEntropyLoss() + if hybridize: + loss.hybridize() L = loss(output, label, weighting).asnumpy() assert_almost_equal(L, np.array([ 1.06346405, 0.04858733]), rtol=1e-3, atol=1e-4) @with_seed() @use_np -def test_bce_equal_ce2(): +@pytest.mark.parametrize("hybridize", [False, True]) +def test_bce_equal_ce2(hybridize): N = 100 loss1 = gluon.loss.SigmoidBCELoss(from_sigmoid=True) + if hybridize: + loss1.hybridize() loss2 = gluon.loss.SoftmaxCELoss(from_logits=True) + if hybridize: + loss2.hybridize() out1 = mx.np.random.uniform(0.1, 0.9, size=(N, 1)) out2 = mx.np.log(mx.np.concatenate((1-out1, out1), axis=1) + 1e-8) label = mx.np.round(mx.np.random.uniform(0, 1, size=(N, 1))) assert_almost_equal(loss1(out1, label).asnumpy(), loss2(out2, label).asnumpy()) + @use_np -def test_logistic_loss_equal_bce(): +@pytest.mark.parametrize("hybridize", [False, True]) +def test_logistic_loss_equal_bce(hybridize): N = 100 loss_binary = gluon.loss.LogisticLoss(label_format='binary') + if hybridize: + loss_binary.hybridize() loss_signed = gluon.loss.LogisticLoss(label_format='signed') + if hybridize: + loss_signed.hybridize() loss_bce = gluon.loss.SigmoidBCELoss(from_sigmoid=False) + if hybridize: + loss_bce.hybridize() data = mx.np.random.uniform(-10, 10, size=(N, 1)) label = mx.np.round(mx.np.random.uniform(0, 1, size=(N, 1))) assert_almost_equal(loss_binary(data, label), loss_bce(data, label), atol=1e-6) @@ -110,28 +165,41 @@ def test_logistic_loss_equal_bce(): @with_seed() @use_np -def test_ctc_loss(): +@pytest.mark.parametrize("hybridize", [False, True]) +def test_ctc_loss(hybridize): loss = gluon.loss.CTCLoss() + if hybridize: + loss.hybridize() l = loss(mx.np.ones((2,20,4)), mx.np.array([[1,0,-1,-1],[2,1,1,-1]])) assert_almost_equal(l, np.array([18.82820702, 16.50581741])) loss = gluon.loss.CTCLoss(layout='TNC') + if hybridize: + loss.hybridize() l = loss(mx.np.ones((20,2,4)), mx.np.array([[1,0,-1,-1],[2,1,1,-1]])) assert_almost_equal(l, np.array([18.82820702, 16.50581741])) loss = gluon.loss.CTCLoss(layout='TNC', label_layout='TN') + if hybridize: + loss.hybridize() l = loss(mx.np.ones((20,2,4)), mx.np.array([[1,0,-1,-1],[2,1,1,-1]]).T) assert_almost_equal(l, np.array([18.82820702, 16.50581741])) loss = gluon.loss.CTCLoss() + if hybridize: + loss.hybridize() l = loss(mx.np.ones((2,20,4)), mx.np.array([[2,1,2,2],[3,2,2,2]]), None, mx.np.array([2,3])) assert_almost_equal(l, np.array([18.82820702, 16.50581741])) loss = gluon.loss.CTCLoss() + if hybridize: + loss.hybridize() l = loss(mx.np.ones((2,25,4)), mx.np.array([[2,1,-1,-1],[3,2,2,-1]]), mx.np.array([20,20])) assert_almost_equal(l, np.array([18.82820702, 16.50581741])) loss = gluon.loss.CTCLoss() + if hybridize: + loss.hybridize() l = loss(mx.np.ones((2,25,4)), mx.np.array([[2,1,3,3],[3,2,2,3]]), mx.np.array([20,20]), mx.np.array([2,3])) assert_almost_equal(l, np.array([18.82820702, 16.50581741])) @@ -171,15 +239,19 @@ def test_sdml_loss(): avg_loss = loss.sum()/len(loss) assert(avg_loss < 0.05) + @with_seed() @use_np -def test_cosine_loss(): +@pytest.mark.parametrize("hybridize", [False, True]) +def test_cosine_loss(hybridize): #Generating samples input1 = mx.np.random.randn(3, 2) input2 = mx.np.random.randn(3, 2) label = mx.np.sign(mx.np.random.randn(input1.shape[0])) #Calculating loss from cosine embedding loss function in Gluon Loss = gluon.loss.CosineEmbeddingLoss() + if hybridize: + Loss.hybridize() loss = Loss(input1, input2, label) # Calculating the loss Numpy way @@ -192,9 +264,11 @@ def test_cosine_loss(): mx.np.where(label == 1, 1-x, mx.npx.relu(x)), (-1,)) assert_almost_equal(loss.asnumpy(), numpy_loss.asnumpy(), rtol=1e-3, atol=1e-5) + @xfail_when_nonstandard_decimal_separator @use_np -def test_poisson_nllloss(): +@pytest.mark.parametrize("hybridize", [False, True]) +def test_poisson_nllloss(hybridize): shape=(3, 4) not_axis0 = tuple(range(1, len(shape))) pred = mx.np.random.normal(size=shape) @@ -209,7 +283,11 @@ def test_poisson_nllloss(): target[:] += mx.np.abs(min_target) Loss = gluon.loss.PoissonNLLLoss(from_logits=True) + if hybridize: + Loss.hybridize() Loss_no_logits = gluon.loss.PoissonNLLLoss(from_logits=False) + if hybridize: + Loss_no_logits.hybridize() #Calculating by brute formula for default value of from_logits = True # 1) Testing for flag logits = True @@ -230,6 +308,8 @@ def test_poisson_nllloss(): np_compute_full = mx.np.mean((np_pred - np_target * mx.np.log(np_pred + 1e-08)) + ((np_target * np.log(np_target)-\ np_target + 0.5 * np.log(2 * np_target * np.pi))*(np_target > 1)), axis=1) Loss_compute_full = gluon.loss.PoissonNLLLoss(from_logits=False, compute_full=True) + if hybridize: + Loss_compute_full.hybridize() loss_compute_full = Loss_compute_full(np_pred, np_target) assert_almost_equal(np_compute_full, loss_compute_full) diff --git a/tests/python/unittest/test_runtime.py b/tests/python/unittest/test_runtime.py index d117ac0f4b30..13f992a78aff 100644 --- a/tests/python/unittest/test_runtime.py +++ b/tests/python/unittest/test_runtime.py @@ -50,5 +50,5 @@ def test_is_enabled_not_existing(): features.is_enabled('this girl is on fire') def test_cxx11_abi(): - abi = mx.library.compiled_with_cxx11_abi() - assert abi or not abi + abi = mx.library.compiled_with_gcc_cxx11_abi() + assert abi in (-1, 0, 1)