<!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]-->
    <head>
        <title>{{ page.title }} - SystemML {{site.SYSTEMML_VERSION}}</title>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
        {% if page.description %}
        <meta name="description" content="{{page.description | replace: 'SYSTEMML_VERSION', site.SYSTEMML_VERSION}}">
        {% endif %}
        <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">
    </head>
    <body>
        <!--[if lt IE 7]>
            <p class="chromeframe">You are using an outdated browser. <a href="http://browsehappy.com/">Upgrade your browser today</a> or <a href="http://www.google.com/chromeframe/?redirect=true">install Google Chrome Frame</a> to better experience this site.</p>
        <![endif]-->

        <header class="navbar navbar-default navbar-fixed-top" id="topbar">
            <div class="container">
                <div class="navbar-header">
                    <div class="navbar-brand brand projectlogo">
                        <img class="logo" src="img/systemml-logo.png" alt="Apache SystemML (incubating)" title="Apache SystemML (incubating)"/>
                    </div>
                    <div class="navbar-brand brand projecttitle">
                        <a href="index.html">Apache SystemML (incubating)</a><br/>
                        <span class="version">{{site.SYSTEMML_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.html">Overview</a></li>
                        <li><a href="https://github.com/apache/incubator-systemml">GitHub</a></li>
                        <li class="dropdown">
                            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Documentation<b class="caret"></b></a>
                            <ul class="dropdown-menu" role="menu">
                                <li><b>Running SystemML:</b></li>
                                <li><a href="https://github.com/apache/incubator-systemml">SystemML GitHub README</a></li>
                                <li><a href="spark-mlcontext-programming-guide.html">Spark MLContext</a></li>
                                <li><a href="spark-batch-mode.html">Spark Batch Mode</a>
                                <li><a href="hadoop-batch-mode.html">Hadoop Batch Mode</a>
                                <li><a href="standalone-guide.html">Standalone Guide</a></li>
                                <li><a href="jmlc.html">Java Machine Learning Connector (JMLC)</a>
                                <li class="divider"></li>
                                <li><b>Language Guides:</b></li>
                                <li><a href="dml-language-reference.html">DML Language Reference</a></li>
                                <li><a href="beginners-guide-to-dml-and-pydml.html">Beginner's Guide to DML and PyDML</a></li>
                                <li><a href="beginners-guide-python.html">Beginner's Guide for Python users</a></li>
                                <li class="divider"></li>
                                <li><b>ML Algorithms:</b></li>
                                <li><a href="algorithms-reference.html">Algorithms Reference</a></li>
                                <li class="divider"></li>
                                <li><b>Tools:</b></li>
                                <li><a href="debugger-guide.html">Debugger Guide</a></li>
                                <li><a href="developer-tools-systemml.html">IDE Guide</a></li>
                                <li class="divider"></li>
                                <li><b>Other:</b></li>
                                <li><a href="contributing-to-systemml.html">Contributing to SystemML</a></li>
                                <li><a href="engine-dev-guide.html">Engine Developer Guide</a></li>
                                <li><a href="troubleshooting-guide.html">Troubleshooting Guide</a></li>
                            </ul>
                        </li>
                        <li class="dropdown">
                            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Issue Tracking<b class="caret"></b></a>
                            <ul class="dropdown-menu" role="menu">
                                <li><b>JIRA:</b></li>
                                <li><a href="https://issues.apache.org/jira/browse/SYSTEMML">SystemML JIRA</a></li>
                                {% if site.FEEDBACK_LINKS == true %}
                                <li><a href="#" id="feedback-link-improvement" title="Click to file a JIRA improvement about this page.">Improve this Page</a></li>
                                <li><a href="#" id="feedback-link-bug" title="Click to file a JIRA bug about this page.">Fix this Page</a></li>
                                {% endif %}
                            </ul>
                        </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> <!-- /container -->

        {% if site.FEEDBACK_LINKS == true %}
        <div style="display: none;">
            <!-- Use GET method so that if a user is not already logged on to JIRA, after the user logs in, the
                 user will be redirected to the form that pre-populates the fields based on the URL parameters -->
            <form name="feedback" action="https://issues.apache.org/jira/secure/CreateIssueDetails!init.jspa" method="GET" id="feedback">
                <input name="pid" type="hidden" value="12319522" /> <!-- SystemML Project ID -->
                <input name="priority" type="hidden" value="4" /> <!-- Minor -->
                <input name="components" type="hidden" value="12328679" /> <!-- Documentation -->
                <input id="feedback-issuetype" name="issuetype" type="hidden" value="" />
                <input id="feedback-summary" name="summary" type="hidden" value="" />
                <input id="feedback-description" name="description" type="hidden" value="" />
                <input type="submit" value="Submit" />
            </form>
        </div>
        {% endif %}

        <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.FEEDBACK_LINKS == true %}
        <script type="text/javascript">
            function getPageTitle() {
                {% if page.displayTitle %}
                var displayTitle = "{{ page.displayTitle | xml_escape }}";
                // return title rather than displayTitle if displayTitle contains HTML
                if (displayTitle.indexOf("&lt;") != -1) {
                    return "{{ page.title }}";
                } else {
                    return displayTitle;
                }
                {% else %}
                return pageTitle = "{{ page.title }}";
                {% endif %}
            }

            function getPageName() {
                var pageName = document.location.pathname;
                pageName = pageName.replace("/", "");
                pageName = pageName.replace(".html", ".md");
                if (pageName == "") { // no page name
                    pageName = "index.md";
                } else if (pageName.indexOf("/", pageName.length - 1) !== -1) { // ends with slash
                    pageName = "index.md";
                } else if (pageName.lastIndexOf("/") !== -1) { // has slashes
                    pageName = pageName.split("/").pop();
                }
                if (pageName.indexOf(".md") == -1) {
                    pageName = pageName + ".md";
                }
                return pageName;
            }

            function getSection() {
                var hash = window.location.hash;
                if (hash == "") {
                    return "";
                }
                var section = $(hash).text();
                return section;
            }

            function getPageTitleDisplay() {
                return "Page Title: " + getPageTitle() + "\r\n";
            }

            function getPageNameDisplay() {
                return "Page Name: " + getPageName() + "\r\n";
            }

            function getSectionDisplay() {
                var section = getSection();
                if (section == "") {
                    return "";
                }
                return "Section: " + section + "\r\n";
            }

            $(document).ready(function() {
                $('#feedback-link-improvement').click(function(e) {
                    e.preventDefault();
                    var issueSummary = "ADD DOCUMENTATION IMPROVEMENT SUMMARY HERE";
                    var issueDescription = getPageNameDisplay() + getPageTitleDisplay() + getSectionDisplay() + "ADD DOCUMENTATION IMPROVEMENT DESCRIPTION HERE";
                    $('#feedback-summary').val(issueSummary);
                    $('#feedback-description').val(issueDescription);
                    $('#feedback-issuetype').val(4); <!-- Improvement Issue -->
                    $('#feedback').submit();
                });
                $('#feedback-link-bug').click(function(e) {
                    e.preventDefault();
                    var issueSummary = "ADD DOCUMENTATION BUG SUMMARY HERE";
                    var issueDescription = getPageNameDisplay() + getPageTitleDisplay() + getSectionDisplay() + "ADD DOCUMENTATION BUG DESCRIPTION HERE";
                    $('#feedback-summary').val(issueSummary);
                    $('#feedback-description').val(issueDescription);
                    $('#feedback-issuetype').val(1); <!-- Bug Issue -->
                    $('#feedback').submit();
                });
            });
        </script>
        {% endif %}


{% 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>
    </body>
</html>
