<!DOCTYPE html>
<!--[if lt IE 7]>      <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
<!--[if IE 7]>         <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
<!--[if IE 8]>         <html class="no-js lt-ie9"> <![endif]-->
<!--[if gt IE 8]><!-->
<html class="no-js">
<!--<![endif]-->
<!--
{% comment %}
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.
{% endcomment %}
-->

<head>
    <title>{{ page.title }} - SystemDS {{site.SYSTEMDS_VERSION}}</title>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="description" content="{{page.description | replace: 'SYSTEMDS_VERSION', site.SYSTEMDS_VERSION}}">
    <meta name="viewport" content="width=device-width">
    <link rel="stylesheet" href="/css/bootstrap.min.css">
    <link rel="stylesheet" href="/css/main.css">
    <link rel="stylesheet" href="/css/pygments-default.css">
    <link rel="shortcut icon" href="/img/favicon.png">
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/docsearch.js@2/dist/cdn/docsearch.min.css" />
</head>

<body>
    <header class="navbar navbar-default navbar-fixed-top" id="topbar">
        <div class="container">
            <div class="navbar-header">
                <div class="navbar-brand brand projectlogo">
                    <a href="http://systemml.apache.org/"><img class="logo" src="/img/systemml-logo.png" alt="Apache SystemDS" title="Apache SystemDS" /></a>
                </div>
                <div class="navbar-brand brand projecttitle">
                    <a href="http://systemml.apache.org/">Apache SystemDS<sup id="trademark">™</sup></a><br />
                    <span class="version">{{site.SYSTEMDS_VERSION}}</span>
                </div>
                <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target=".navbar-collapse">
                    <span class="sr-only">Toggle navigation</span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                </button>
            </div>
            <nav class="navbar-collapse collapse">
                <ul class="nav navbar-nav navbar-right">
                    <li><a href="/index">Overview</a></li>
                    <li><a href="https://github.com/apache/systemml">GitHub</a></li>
                    <li class="dropdown">
                        <a href="#" class="dropdown-toggle" data-toggle="dropdown">API Docs<b class="caret"></b></a>
                        <ul class="dropdown-menu" role="menu">
                            <li><a href="/api/java/index">Java</a></li>
                            <li><a href="/api/python/index">Python</a></li>
                        </ul>
                    </li>
                    <li class="dropdown">
                        <a href="#" class="dropdown-toggle" data-toggle="dropdown">Issues<b class="caret"></b></a>
                        <ul class="dropdown-menu" role="menu">
                            <li><a href="https://issues.apache.org/jira/browse/SYSTEMML">SystemDS JIRA</a></li>
                        </ul>
                    </li>
                    <li><input id="s-bar" placeholder="Search Docs.." style="margin-top: 20px;"></input>
                    </li>
                </ul>
            </nav>
        </div>
    </header>

    <div class="container" id="content">
        {% if page.displayTitle %}
        <h1 class="title">{{ page.displayTitle }}</h1>
        {% else %}
        <h1 class="title">{{ page.title }}</h1>
        {% endif %} {{ content }}
    </div>

    <script src="/js/vendor/jquery-1.12.0.min.js"></script>
    <script src="/js/vendor/bootstrap.min.js"></script>
    <script src="/js/vendor/anchor.min.js"></script>
    <script src="/js/main.js"></script>

    {% if site.analytics_on == true %} {% case site.analytics_provider %} {% when "google_universal" %}
    <!-- Analytics -->
    <script>
        (function(i, s, o, g, r, a, m) {
            i['GoogleAnalyticsObject'] = r;
            i[r] = i[r] || function() {
                (i[r].q = i[r].q || []).push(arguments)
            }, i[r].l = 1 * new Date();
            a = s.createElement(o),
                m = s.getElementsByTagName(o)[0];
            a.async = 1;
            a.src = g;
            m.parentNode.insertBefore(a, m)
        })(window, document, 'script', '//www.google-analytics.com/analytics.js', 'ga');
        ga('create', '{{ site.analytics_google_universal_tracking_id }}', 'auto');
        ga('send', 'pageview');
    </script>
    {% endcase %} {% endif %}

    <!-- MathJax Section -->
    <script type="text/x-mathjax-config">
        MathJax.Hub.Config({ TeX: { equationNumbers: { autoNumber: "AMS" } } });
    </script>
    <script>
        // Note that we load MathJax this way to work with local file (file://), HTTP and HTTPS.
        // We could use "//cdn.mathjax...", but that won't support "file://".
        (function(d, script) {
            script = d.createElement('script');
            script.type = 'text/javascript';
            script.async = true;
            script.onload = function() {
                MathJax.Hub.Config({
                    tex2jax: {
                        inlineMath: [
                            ["$", "$"],
                            ["\\\\(", "\\\\)"]
                        ],
                        displayMath: [
                            ["$$", "$$"],
                            ["\\[", "\\]"]
                        ],
                        processEscapes: true,
                        skipTags: ['script', 'noscript', 'style', 'textarea', 'pre']
                    }
                });
            };
            script.src = ('https:' == document.location.protocol ? 'https://' : 'http://') +
                'cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML';
            d.getElementsByTagName('head')[0].appendChild(script);
        }(document));
    </script>
    <!-- Algolia search section -->
    <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/docsearch.js@2/dist/cdn/docsearch.min.js"></script>
    <script>
        // Crawler configuration for the search indexing is available at:
        // https://github.com/algolia/docsearch-configs/blob/master/configs/apache_systemml.json

        docsearch({
            apiKey: '78c19564c220d4642a41197baae304ef',
            indexName: 'apache_systemml',
            inputSelector: "#s-bar",
            // For custom styling for the dropdown, please set debug to true
            // so that the dropdown won't disappear when the inspect tools are 
            // open.
            debug: false
        });
    </script>
</body>

</html>