diff --git a/doc/build/html/.buildinfo b/doc/build/html/.buildinfo index f5a7cbe72a1e93856451c80ab8e036875d1ac74f..88615b3de44869809c5aa41cff03ef7bc799120c 100644 --- a/doc/build/html/.buildinfo +++ b/doc/build/html/.buildinfo @@ -1,4 +1,8 @@ # Sphinx build info version 1 # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +<<<<<<< HEAD config: 7f2c9a031c209e5385ba1222f3149fc4 +======= +config: d55aeb7a84c31da790ac20b6aed3af14 +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/doc/build/html/_modules/index.html b/doc/build/html/_modules/index.html index d14aa45ae451ab60f7018647051736a0d541f6b3..907f6ed17d5f29b694bfff76c18c6b1497559dd5 100644 --- a/doc/build/html/_modules/index.html +++ b/doc/build/html/_modules/index.html @@ -1,3 +1,4 @@ +<<<<<<< HEAD <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> @@ -11,6 +12,18 @@ <link rel="stylesheet" href="../_static/alabaster.css" type="text/css" /> <link rel="stylesheet" href="../_static/pygments.css" type="text/css" /> +======= + +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> + <head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> + <title>Overview: module code — Navigation Toolbox a0 documentation</title> + <link rel="stylesheet" href="../_static/alabaster.css" type="text/css" /> + <link rel="stylesheet" href="../_static/pygments.css" type="text/css" /> +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 <script type="text/javascript"> var DOCUMENTATION_OPTIONS = { URL_ROOT: '../', @@ -24,16 +37,28 @@ <script type="text/javascript" src="../_static/jquery.js"></script> <script type="text/javascript" src="../_static/underscore.js"></script> <script type="text/javascript" src="../_static/doctools.js"></script> +<<<<<<< HEAD <script type="text/javascript" src="https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script> +======= + <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script> +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 <link rel="index" title="Index" href="../genindex.html" /> <link rel="search" title="Search" href="../search.html" /> <link rel="stylesheet" href="../_static/custom.css" type="text/css" /> +<<<<<<< HEAD <meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" /> </head> <body role="document"> +======= + + <meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" /> + + </head> + <body> +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 <div class="document"> @@ -42,7 +67,11 @@ <div class="body" role="main"> <h1>All modules for which code is available</h1> +<<<<<<< HEAD <ul><li><a href="processing.html">processing</a></li> +======= +<ul><li><a href="navipy/processing.html">navipy.processing</a></li> +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 </ul> </div> @@ -74,8 +103,13 @@ ©2017, Olivier J.N. Bertrand. | +<<<<<<< HEAD Powered by <a href="http://sphinx-doc.org/">Sphinx 1.5.3</a> & <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.8</a> +======= + Powered by <a href="http://sphinx-doc.org/">Sphinx 1.6.5</a> + & <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.10</a> +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 </div> diff --git a/doc/build/html/_sources/database.rst.txt b/doc/build/html/_sources/database.rst.txt index bb62b910508144c23449709aed14d1ade8748e73..10120c818891e6289fd083b950dd23efab51c11c 100644 --- a/doc/build/html/_sources/database.rst.txt +++ b/doc/build/html/_sources/database.rst.txt @@ -1,4 +1,8 @@ Database ======== +<<<<<<< HEAD .. automodule:: database +======= +.. automodule:: navipy.database +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 diff --git a/doc/build/html/_sources/processing.rst.txt b/doc/build/html/_sources/processing.rst.txt index 65590a24ac53d21f74acdb28e1762b14af4a3f71..1dd180797baa638e6bbe8da18e551959aafc59e0 100644 --- a/doc/build/html/_sources/processing.rst.txt +++ b/doc/build/html/_sources/processing.rst.txt @@ -1,6 +1,7 @@ Processing a scene ================== +<<<<<<< HEAD .. automodule:: processing Scene @@ -30,3 +31,34 @@ Average place-code vector Optic-flow ---------- .. autofunction:: processing.optic_flow +======= +.. automodule:: navipy.processing + +Scene +----- +.. autofunction:: navipy.processing.scene + +Skyline +------- +.. autofunction:: navipy.processing.skyline + +Michelson-contrast +------------------ +.. autofunction:: navipy.processing.michelson_contrast + +Contrast-weighted-nearness +-------------------------- +.. autofunction:: navipy.processing.contrast_weighted_nearness + +Place-code vectors +------------------ +.. autofunction:: navipy.processing.pcv + +Average place-code vector +------------------------- +.. autofunction:: navipy.processing.apcv + +Optic-flow +---------- +.. autofunction:: navipy.processing.optic_flow +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 diff --git a/doc/build/html/_sources/rendering.rst.txt b/doc/build/html/_sources/rendering.rst.txt index 09de1f385e83b9e2716753f5f475a2ba63eb385b..7d98baf76dabf14a8c1e84879ef2ee2954daad18 100644 --- a/doc/build/html/_sources/rendering.rst.txt +++ b/doc/build/html/_sources/rendering.rst.txt @@ -3,6 +3,7 @@ Rendering Need to introduce blender here +<<<<<<< HEAD Cyberbee -------- @@ -11,3 +12,53 @@ Regular sampling (Bee sampling) Building your environment ------------------------- +======= + +Building your environment +------------------------- + + +How to generate a database using blender +---------------------------------------- +Regular sampling +~~~~~~~~~~~~~~~~ +Blender comes with its own python installation. Thus, we need to tell blender to use our virtualenv where the navigation toolbox is installed. To do we need to import the os module + +.. literalinclude:: example/rendering/demo_render.py + :lines: 5-6 + +then activate the environment: + +.. literalinclude:: example/rendering/demo_render.py + :lines: 12-26 + +Now, blender can import all modules used by the navigation toolbox. + +.. literalinclude:: example/rendering/demo_render.py + :lines: 30-31 + +With the toolbox at disposition we just need to configure the BeeSampling to render images on a regular 3D grid. + +.. literalinclude:: example/rendering/demo_render.py + :lines: 34 +.. literalinclude:: example/rendering/demo_render.py + :lines: 37-44 + +If we want to use the distance to objects, we need to tell the BeeSampling what is the maximum distance to objects in the environment. Otherwise the distance can go until infinity, and since the image are compressed in the database, all distance to object will be equal to zero: + +.. literalinclude:: example/rendering/demo_render.py + :lines: 48-49 + +Finally we can generate the database. + +.. literalinclude:: example/rendering/demo_render.py + :lines: 53-54 + +How to test the script: +~~~~~~~~~~~~~~~~~~~~~~~ +>>> blender test.blend --background --python demo_test.py + + +Cyberbee +-------- +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 diff --git a/doc/build/html/_static/alabaster.css b/doc/build/html/_static/alabaster.css index 517cb43e58b2e57a766cbed1ca59eddbe7f4515c..d2f9c5267bc5cb19b79ccf736bc56c2f7657f819 100644 --- a/doc/build/html/_static/alabaster.css +++ b/doc/build/html/_static/alabaster.css @@ -15,6 +15,44 @@ +<<<<<<< HEAD +======= + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 @import url("basic.css"); /* -- page layout ----------------------------------------------------------- */ @@ -22,7 +60,11 @@ body { font-family: 'goudy old style', 'minion pro', 'bell mt', Georgia, 'Hiragino Mincho Pro', serif; font-size: 17px; +<<<<<<< HEAD background-color: white; +======= + background-color: #fff; +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 color: #000; margin: 0; padding: 0; @@ -54,7 +96,11 @@ hr { } div.body { +<<<<<<< HEAD background-color: #ffffff; +======= + background-color: #fff; +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 color: #3E4349; padding: 0 30px 0 30px; } @@ -76,7 +122,11 @@ div.footer a { } p.caption { +<<<<<<< HEAD font-family: ; +======= + font-family: inherit; +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 font-size: inherit; } @@ -232,6 +282,7 @@ div.body p, div.body dd, div.body li { div.admonition { margin: 20px 0px; padding: 10px 30px; +<<<<<<< HEAD background-color: #FCC; border: 1px solid #FAA; } @@ -245,6 +296,17 @@ dd div.admonition { padding-left: 60px; } +======= + background-color: #EEE; + border: 1px solid #CCC; +} + +div.admonition tt.xref, div.admonition code.xref, div.admonition a tt { + background-color: #FBFBFB; + border-bottom: 1px solid #fafafa; +} + +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 div.admonition p.admonition-title { font-family: 'Garamond', 'Georgia', serif; font-weight: normal; @@ -259,25 +321,85 @@ div.admonition p.last { } div.highlight { +<<<<<<< HEAD background-color: white; +======= + background-color: #fff; +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 } dt:target, .highlight { background: #FAF3E8; } +<<<<<<< HEAD +======= +div.warning { + background-color: #FCC; + border: 1px solid #FAA; +} + +div.danger { + background-color: #FCC; + border: 1px solid #FAA; + -moz-box-shadow: 2px 2px 4px #D52C2C; + -webkit-box-shadow: 2px 2px 4px #D52C2C; + box-shadow: 2px 2px 4px #D52C2C; +} + +div.error { + background-color: #FCC; + border: 1px solid #FAA; + -moz-box-shadow: 2px 2px 4px #D52C2C; + -webkit-box-shadow: 2px 2px 4px #D52C2C; + box-shadow: 2px 2px 4px #D52C2C; +} + +div.caution { + background-color: #FCC; + border: 1px solid #FAA; +} + +div.attention { + background-color: #FCC; + border: 1px solid #FAA; +} + +div.important { + background-color: #EEE; + border: 1px solid #CCC; +} + +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 div.note { background-color: #EEE; border: 1px solid #CCC; } +<<<<<<< HEAD +======= +div.tip { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.hint { + background-color: #EEE; + border: 1px solid #CCC; +} + +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 div.seealso { background-color: #EEE; border: 1px solid #CCC; } div.topic { +<<<<<<< HEAD background-color: #eee; +======= + background-color: #EEE; +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 } p.admonition-title { @@ -312,16 +434,28 @@ tt.descname, code.descname { } img.screenshot { +<<<<<<< HEAD -moz-box-shadow: 2px 2px 4px #eee; -webkit-box-shadow: 2px 2px 4px #eee; box-shadow: 2px 2px 4px #eee; +======= + -moz-box-shadow: 2px 2px 4px #EEE; + -webkit-box-shadow: 2px 2px 4px #EEE; + box-shadow: 2px 2px 4px #EEE; +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 } table.docutils { border: 1px solid #888; +<<<<<<< HEAD -moz-box-shadow: 2px 2px 4px #eee; -webkit-box-shadow: 2px 2px 4px #eee; box-shadow: 2px 2px 4px #eee; +======= + -moz-box-shadow: 2px 2px 4px #EEE; + -webkit-box-shadow: 2px 2px 4px #EEE; + box-shadow: 2px 2px 4px #EEE; +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 } table.docutils td, table.docutils th { @@ -361,6 +495,19 @@ table.field-list p { margin-bottom: 0.8em; } +<<<<<<< HEAD +======= +/* Cloned from + * https://github.com/sphinx-doc/sphinx/commit/ef60dbfce09286b20b7385333d63a60321784e68 + */ +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 table.footnote td.label { width: .1px; padding: 0.3em 0 0.3em 0.5em; @@ -397,16 +544,26 @@ pre { line-height: 1.3em; } +<<<<<<< HEAD +======= +div.viewcode-block:target { + background: #ffd; +} + +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 dl pre, blockquote pre, li pre { margin-left: 0; padding-left: 30px; } +<<<<<<< HEAD dl dl pre { margin-left: -90px; padding-left: 90px; } +======= +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 tt, code { background-color: #ecf0f3; color: #222; @@ -415,7 +572,11 @@ tt, code { tt.xref, code.xref, a tt { background-color: #FBFBFB; +<<<<<<< HEAD border-bottom: 1px solid white; +======= + border-bottom: 1px solid #fff; +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 } a.reference { @@ -517,7 +678,11 @@ a:hover tt, a:hover code { div.documentwrapper { float: none; +<<<<<<< HEAD background: white; +======= + background: #fff; +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 } div.sphinxsidebar { @@ -532,7 +697,11 @@ a:hover tt, a:hover code { div.sphinxsidebar h3, div.sphinxsidebar h4, div.sphinxsidebar p, div.sphinxsidebar h3 a { +<<<<<<< HEAD color: white; +======= + color: #fff; +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 } div.sphinxsidebar a { diff --git a/doc/build/html/_static/basic.css b/doc/build/html/_static/basic.css index 7ed0e58edb31c235c086d98790de21cabd63f3ec..cfcd2d4bc6a9a60bd4d4fa8e4d494bf83fc06769 100644 --- a/doc/build/html/_static/basic.css +++ b/doc/build/html/_static/basic.css @@ -4,7 +4,11 @@ * * Sphinx stylesheet -- basic theme. * +<<<<<<< HEAD * :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. +======= + * :copyright: Copyright 2007-2017 by the Sphinx team, see AUTHORS. +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 * :license: BSD, see LICENSE for details. * */ @@ -398,6 +402,16 @@ table.field-list td, table.field-list th { margin: 0; } +<<<<<<< HEAD +======= +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 /* -- other body styles ----------------------------------------------------- */ ol.arabic { @@ -438,10 +452,21 @@ dd { margin-left: 30px; } +<<<<<<< HEAD dt:target, .highlighted { background-color: #fbe54e; } +======= +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 dl.glossary dt { font-weight: bold; font-size: 1.1em; diff --git a/doc/build/html/_static/doctools.js b/doc/build/html/_static/doctools.js index 816349563588e87ca99c7cf2d6e54268e52e761d..50af265ed2381de9feb127ca0c1c34b144fb9f53 100644 --- a/doc/build/html/_static/doctools.js +++ b/doc/build/html/_static/doctools.js @@ -4,7 +4,11 @@ * * Sphinx JavaScript utilities for all documentation. * +<<<<<<< HEAD * :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. +======= + * :copyright: Copyright 2007-2017 by the Sphinx team, see AUTHORS. +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 * :license: BSD, see LICENSE for details. * */ @@ -45,7 +49,11 @@ jQuery.urlencode = encodeURIComponent; * it will always return arrays of strings for the value parts. */ jQuery.getQueryParameters = function(s) { +<<<<<<< HEAD if (typeof s == 'undefined') +======= + if (typeof s === 'undefined') +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 s = document.location.search; var parts = s.substr(s.indexOf('?') + 1).split('&'); var result = {}; @@ -66,6 +74,7 @@ jQuery.getQueryParameters = function(s) { * span elements with the given class name. */ jQuery.fn.highlightText = function(text, className) { +<<<<<<< HEAD function highlight(node) { if (node.nodeType == 3) { var val = node.nodeValue; @@ -73,15 +82,47 @@ jQuery.fn.highlightText = function(text, className) { if (pos >= 0 && !jQuery(node.parentNode).hasClass(className)) { var span = document.createElement("span"); span.className = className; +======= + function highlight(node, addItems) { + if (node.nodeType === 3) { + var val = node.nodeValue; + var pos = val.toLowerCase().indexOf(text); + if (pos >= 0 && !jQuery(node.parentNode).hasClass(className)) { + var span; + var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.className = className; + } +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 span.appendChild(document.createTextNode(val.substr(pos, text.length))); node.parentNode.insertBefore(span, node.parentNode.insertBefore( document.createTextNode(val.substr(pos + text.length)), node.nextSibling)); node.nodeValue = val.substr(0, pos); +<<<<<<< HEAD +======= + if (isInSVG) { + var bbox = span.getBBox(); + var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute('class', className); + var parentOfText = node.parentNode.parentNode; + addItems.push({ + "parent": node.parentNode, + "target": rect}); + } +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 } } else if (!jQuery(node).is("button, select, textarea")) { jQuery.each(node.childNodes, function() { +<<<<<<< HEAD highlight(this); }); } @@ -89,6 +130,20 @@ jQuery.fn.highlightText = function(text, className) { return this.each(function() { highlight(this); }); +======= + highlight(this, addItems); + }); + } + } + var addItems = []; + var result = this.each(function() { + highlight(this, addItems); + }); + for (var i = 0; i < addItems.length; ++i) { + jQuery(addItems[i].parent).before(addItems[i].target); + } + return result; +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 }; /* @@ -131,21 +186,35 @@ var Documentation = { * i18n support */ TRANSLATIONS : {}, +<<<<<<< HEAD PLURAL_EXPR : function(n) { return n == 1 ? 0 : 1; }, +======= + PLURAL_EXPR : function(n) { return n === 1 ? 0 : 1; }, +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 LOCALE : 'unknown', // gettext and ngettext don't access this so that the functions // can safely bound to a different name (_ = Documentation.gettext) gettext : function(string) { var translated = Documentation.TRANSLATIONS[string]; +<<<<<<< HEAD if (typeof translated == 'undefined') return string; return (typeof translated == 'string') ? translated : translated[0]; +======= + if (typeof translated === 'undefined') + return string; + return (typeof translated === 'string') ? translated : translated[0]; +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 }, ngettext : function(singular, plural, n) { var translated = Documentation.TRANSLATIONS[singular]; +<<<<<<< HEAD if (typeof translated == 'undefined') +======= + if (typeof translated === 'undefined') +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 return (n == 1) ? singular : plural; return translated[Documentation.PLURALEXPR(n)]; }, @@ -216,7 +285,11 @@ var Documentation = { var src = $(this).attr('src'); var idnum = $(this).attr('id').substr(7); $('tr.cg-' + idnum).toggle(); +<<<<<<< HEAD if (src.substr(-9) == 'minus.png') +======= + if (src.substr(-9) === 'minus.png') +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 $(this).attr('src', src.substr(0, src.length-9) + 'plus.png'); else $(this).attr('src', src.substr(0, src.length-8) + 'minus.png'); @@ -248,7 +321,11 @@ var Documentation = { var path = document.location.pathname; var parts = path.split(/\//); $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() { +<<<<<<< HEAD if (this == '..') +======= + if (this === '..') +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 parts.pop(); }); var url = parts.join('/'); diff --git a/doc/build/html/_static/jquery.js b/doc/build/html/_static/jquery.js index 25a72c959823a235fd59d7f5e9fa0f8faee57f48..16638b66a7d5d16719be56c34666c8310fdabcb3 100644 --- a/doc/build/html/_static/jquery.js +++ b/doc/build/html/_static/jquery.js @@ -1,3 +1,4 @@ +<<<<<<< HEAD /*! * jQuery JavaScript Library v3.1.1 * https://jquery.com/ @@ -10217,3 +10218,9 @@ if ( !noGlobal ) { return jQuery; } ); +======= +/*! jQuery v3.1.0 | (c) jQuery Foundation | jquery.org/license */ +!function(a,b){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){"use strict";var c=[],d=a.document,e=Object.getPrototypeOf,f=c.slice,g=c.concat,h=c.push,i=c.indexOf,j={},k=j.toString,l=j.hasOwnProperty,m=l.toString,n=m.call(Object),o={};function p(a,b){b=b||d;var c=b.createElement("script");c.text=a,b.head.appendChild(c).parentNode.removeChild(c)}var q="3.1.0",r=function(a,b){return new r.fn.init(a,b)},s=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,t=/^-ms-/,u=/-([a-z])/g,v=function(a,b){return b.toUpperCase()};r.fn=r.prototype={jquery:q,constructor:r,length:0,toArray:function(){return f.call(this)},get:function(a){return null!=a?a<0?this[a+this.length]:this[a]:f.call(this)},pushStack:function(a){var b=r.merge(this.constructor(),a);return b.prevObject=this,b},each:function(a){return r.each(this,a)},map:function(a){return this.pushStack(r.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(f.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(a<0?b:0);return this.pushStack(c>=0&&c<b?[this[c]]:[])},end:function(){return this.prevObject||this.constructor()},push:h,sort:c.sort,splice:c.splice},r.extend=r.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||r.isFunction(g)||(g={}),h===i&&(g=this,h--);h<i;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(r.isPlainObject(d)||(e=r.isArray(d)))?(e?(e=!1,f=c&&r.isArray(c)?c:[]):f=c&&r.isPlainObject(c)?c:{},g[b]=r.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},r.extend({expando:"jQuery"+(q+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===r.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){var b=r.type(a);return("number"===b||"string"===b)&&!isNaN(a-parseFloat(a))},isPlainObject:function(a){var b,c;return!(!a||"[object Object]"!==k.call(a))&&(!(b=e(a))||(c=l.call(b,"constructor")&&b.constructor,"function"==typeof c&&m.call(c)===n))},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?j[k.call(a)]||"object":typeof a},globalEval:function(a){p(a)},camelCase:function(a){return a.replace(t,"ms-").replace(u,v)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b){var c,d=0;if(w(a)){for(c=a.length;d<c;d++)if(b.call(a[d],d,a[d])===!1)break}else for(d in a)if(b.call(a[d],d,a[d])===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(s,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(w(Object(a))?r.merge(c,"string"==typeof a?[a]:a):h.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:i.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;d<c;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;f<g;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,e,f=0,h=[];if(w(a))for(d=a.length;f<d;f++)e=b(a[f],f,c),null!=e&&h.push(e);else for(f in a)e=b(a[f],f,c),null!=e&&h.push(e);return g.apply([],h)},guid:1,proxy:function(a,b){var c,d,e;if("string"==typeof b&&(c=a[b],b=a,a=c),r.isFunction(a))return d=f.call(arguments,2),e=function(){return a.apply(b||this,d.concat(f.call(arguments)))},e.guid=a.guid=a.guid||r.guid++,e},now:Date.now,support:o}),"function"==typeof Symbol&&(r.fn[Symbol.iterator]=c[Symbol.iterator]),r.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(a,b){j["[object "+b+"]"]=b.toLowerCase()});function w(a){var b=!!a&&"length"in a&&a.length,c=r.type(a);return"function"!==c&&!r.isWindow(a)&&("array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a)}var x=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=function(a,b){for(var c=0,d=a.length;c<d;c++)if(a[c]===b)return c;return-1},J="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",K="[\\x20\\t\\r\\n\\f]",L="(?:\\\\.|[\\w-]|[^\0-\\xa0])+",M="\\["+K+"*("+L+")(?:"+K+"*([*^$|!~]?=)"+K+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+L+"))|)"+K+"*\\]",N=":("+L+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+M+")*)|.*)\\)|)",O=new RegExp(K+"+","g"),P=new RegExp("^"+K+"+|((?:^|[^\\\\])(?:\\\\.)*)"+K+"+$","g"),Q=new RegExp("^"+K+"*,"+K+"*"),R=new RegExp("^"+K+"*([>+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(N),U=new RegExp("^"+L+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L+"|[*])"),ATTR:new RegExp("^"+M),PSEUDO:new RegExp("^"+N),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),aa=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:d<0?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ba=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g,ca=function(a,b){return b?"\0"===a?"\ufffd":a.slice(0,-1)+"\\"+a.charCodeAt(a.length-1).toString(16)+" ":"\\"+a},da=function(){m()},ea=ta(function(a){return a.disabled===!0},{dir:"parentNode",next:"legend"});try{G.apply(D=H.call(v.childNodes),v.childNodes),D[v.childNodes.length].nodeType}catch(fa){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s=b&&b.ownerDocument,w=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==w&&9!==w&&11!==w)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==w&&(l=Z.exec(a)))if(f=l[1]){if(9===w){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(s&&(j=s.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(l[2])return G.apply(d,b.getElementsByTagName(a)),d;if((f=l[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==w)s=b,r=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(ba,ca):b.setAttribute("id",k=u),o=g(a),h=o.length;while(h--)o[h]="#"+k+" "+sa(o[h]);r=o.join(","),s=$.test(a)&&qa(b.parentNode)||b}if(r)try{return G.apply(d,s.querySelectorAll(r)),d}catch(x){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(P,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("fieldset");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&a.sourceIndex-b.sourceIndex;if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return function(b){return"label"in b&&b.disabled===a||"form"in b&&b.disabled===a||"form"in b&&b.disabled===!1&&(b.isDisabled===a||b.isDisabled!==!a&&("label"in b||!ea(b))!==a)}}function pa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function qa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return!!b&&"HTML"!==b.nodeName},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),v!==n&&(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(n.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}},d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){if("undefined"!=typeof b.getElementsByClassName&&p)return b.getElementsByClassName(a)},r=[],q=[],(c.qsa=Y.test(n.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="<a id='"+u+"'></a><select id='"+u+"-\r\\' msallowcapture=''><option selected=''></option></select>",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){a.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+K+"*[*^$|!~]?="),2!==a.querySelectorAll(":enabled").length&&q.push(":enabled",":disabled"),o.appendChild(a).disabled=!0,2!==a.querySelectorAll(":disabled").length&&q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Y.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"*"),s.call(a,"[s!='']:x"),r.push("!=",N)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Y.test(o.compareDocumentPosition),t=b||Y.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?I(k,a)-I(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?I(k,a)-I(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?la(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(S,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.escape=function(a){return(a+"").replace(ba,ca)},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(_,aa),a[3]=(a[3]||a[4]||a[5]||"").replace(_,aa),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return V.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&T.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(_,aa).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:!b||(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(O," ")+" ").indexOf(c)>-1:"|="===b&&(e===c||e.slice(0,c.length+1)===c+"-"))}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(P,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(_,aa),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return U.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(_,aa).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:oa(!1),disabled:oa(!0),checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:pa(function(){return[0]}),last:pa(function(a,b){return[b-1]}),eq:pa(function(a,b,c){return[c<0?c+b:c]}),even:pa(function(a,b){for(var c=0;c<b;c+=2)a.push(c);return a}),odd:pa(function(a,b){for(var c=1;c<b;c+=2)a.push(c);return a}),lt:pa(function(a,b,c){for(var d=c<0?c+b:c;--d>=0;)a.push(d);return a}),gt:pa(function(a,b,c){for(var d=c<0?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=ma(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=na(b);function ra(){}ra.prototype=d.filters=d.pseudos,d.setFilters=new ra,g=ga.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){c&&!(e=Q.exec(h))||(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=R.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(P," ")}),h=h.slice(c.length));for(g in d.filter)!(e=V[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?ga.error(a):z(a,i).slice(0)};function sa(a){for(var b=0,c=a.length,d="";b<c;b++)d+=a[b].value;return d}function ta(a,b,c){var d=b.dir,e=b.next,f=e||d,g=c&&"parentNode"===f,h=x++;return b.first?function(b,c,e){while(b=b[d])if(1===b.nodeType||g)return a(b,c,e)}:function(b,c,i){var j,k,l,m=[w,h];if(i){while(b=b[d])if((1===b.nodeType||g)&&a(b,c,i))return!0}else while(b=b[d])if(1===b.nodeType||g)if(l=b[u]||(b[u]={}),k=l[b.uniqueID]||(l[b.uniqueID]={}),e&&e===b.nodeName.toLowerCase())b=b[d]||b;else{if((j=k[f])&&j[0]===w&&j[1]===h)return m[2]=j[2];if(k[f]=m,m[2]=a(b,c,i))return!0}}}function ua(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function va(a,b,c){for(var d=0,e=b.length;d<e;d++)ga(a,b[d],c);return c}function wa(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;h<i;h++)(f=a[h])&&(c&&!c(f,d,e)||(g.push(f),j&&b.push(h)));return g}function xa(a,b,c,d,e,f){return d&&!d[u]&&(d=xa(d)),e&&!e[u]&&(e=xa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||va(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:wa(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=wa(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?I(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=wa(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ya(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ta(function(a){return a===b},h,!0),l=ta(function(a){return I(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];i<f;i++)if(c=d.relative[a[i].type])m=[ta(ua(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;e<f;e++)if(d.relative[a[e].type])break;return xa(i>1&&ua(m),i>1&&sa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(P,"$1"),c,i<e&&ya(a.slice(i,e)),e<f&&ya(a=a.slice(e)),e<f&&sa(a))}m.push(c)}return ua(m)}function za(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=E.call(i));u=wa(u)}G.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&ga.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=ya(b[c]),f[u]?d.push(f):e.push(f);f=A(a,za(e,d)),f.selector=a}return f},i=ga.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(_,aa),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=V.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(_,aa),$.test(j[0].type)&&qa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&sa(j),!a)return G.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,!b||$.test(a)&&qa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("fieldset"))}),ja(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){if(!c)return a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){if(!c&&"input"===a.nodeName.toLowerCase())return a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(J,function(a,b,c){var d;if(!c)return a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);r.find=x,r.expr=x.selectors,r.expr[":"]=r.expr.pseudos,r.uniqueSort=r.unique=x.uniqueSort,r.text=x.getText,r.isXMLDoc=x.isXML,r.contains=x.contains,r.escapeSelector=x.escape;var y=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&r(a).is(c))break;d.push(a)}return d},z=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},A=r.expr.match.needsContext,B=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i,C=/^.[^:#\[\.,]*$/;function D(a,b,c){if(r.isFunction(b))return r.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return r.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(C.test(b))return r.filter(b,a,c);b=r.filter(b,a)}return r.grep(a,function(a){return i.call(b,a)>-1!==c&&1===a.nodeType})}r.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?r.find.matchesSelector(d,a)?[d]:[]:r.find.matches(a,r.grep(b,function(a){return 1===a.nodeType}))},r.fn.extend({find:function(a){var b,c,d=this.length,e=this;if("string"!=typeof a)return this.pushStack(r(a).filter(function(){for(b=0;b<d;b++)if(r.contains(e[b],this))return!0}));for(c=this.pushStack([]),b=0;b<d;b++)r.find(a,e[b],c);return d>1?r.uniqueSort(c):c},filter:function(a){return this.pushStack(D(this,a||[],!1))},not:function(a){return this.pushStack(D(this,a||[],!0))},is:function(a){return!!D(this,"string"==typeof a&&A.test(a)?r(a):a||[],!1).length}});var E,F=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,G=r.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||E,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:F.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof r?b[0]:b,r.merge(this,r.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),B.test(e[1])&&r.isPlainObject(b))for(e in b)r.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&(this[0]=f,this.length=1),this}return a.nodeType?(this[0]=a,this.length=1,this):r.isFunction(a)?void 0!==c.ready?c.ready(a):a(r):r.makeArray(a,this)};G.prototype=r.fn,E=r(d);var H=/^(?:parents|prev(?:Until|All))/,I={children:!0,contents:!0,next:!0,prev:!0};r.fn.extend({has:function(a){var b=r(a,this),c=b.length;return this.filter(function(){for(var a=0;a<c;a++)if(r.contains(this,b[a]))return!0})},closest:function(a,b){var c,d=0,e=this.length,f=[],g="string"!=typeof a&&r(a);if(!A.test(a))for(;d<e;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&r.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?r.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?i.call(r(a),this[0]):i.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(r.uniqueSort(r.merge(this.get(),r(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function J(a,b){while((a=a[b])&&1!==a.nodeType);return a}r.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return y(a,"parentNode")},parentsUntil:function(a,b,c){return y(a,"parentNode",c)},next:function(a){return J(a,"nextSibling")},prev:function(a){return J(a,"previousSibling")},nextAll:function(a){return y(a,"nextSibling")},prevAll:function(a){return y(a,"previousSibling")},nextUntil:function(a,b,c){return y(a,"nextSibling",c)},prevUntil:function(a,b,c){return y(a,"previousSibling",c)},siblings:function(a){return z((a.parentNode||{}).firstChild,a)},children:function(a){return z(a.firstChild)},contents:function(a){return a.contentDocument||r.merge([],a.childNodes)}},function(a,b){r.fn[a]=function(c,d){var e=r.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=r.filter(d,e)),this.length>1&&(I[a]||r.uniqueSort(e),H.test(a)&&e.reverse()),this.pushStack(e)}});var K=/\S+/g;function L(a){var b={};return r.each(a.match(K)||[],function(a,c){b[c]=!0}),b}r.Callbacks=function(a){a="string"==typeof a?L(a):r.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h<f.length)f[h].apply(c[0],c[1])===!1&&a.stopOnFalse&&(h=f.length,c=!1)}a.memory||(c=!1),b=!1,e&&(f=c?[]:"")},j={add:function(){return f&&(c&&!b&&(h=f.length-1,g.push(c)),function d(b){r.each(b,function(b,c){r.isFunction(c)?a.unique&&j.has(c)||f.push(c):c&&c.length&&"string"!==r.type(c)&&d(c)})}(arguments),c&&!b&&i()),this},remove:function(){return r.each(arguments,function(a,b){var c;while((c=r.inArray(b,f,c))>-1)f.splice(c,1),c<=h&&h--}),this},has:function(a){return a?r.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||b||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j};function M(a){return a}function N(a){throw a}function O(a,b,c){var d;try{a&&r.isFunction(d=a.promise)?d.call(a).done(b).fail(c):a&&r.isFunction(d=a.then)?d.call(a,b,c):b.call(void 0,a)}catch(a){c.call(void 0,a)}}r.extend({Deferred:function(b){var c=[["notify","progress",r.Callbacks("memory"),r.Callbacks("memory"),2],["resolve","done",r.Callbacks("once memory"),r.Callbacks("once memory"),0,"resolved"],["reject","fail",r.Callbacks("once memory"),r.Callbacks("once memory"),1,"rejected"]],d="pending",e={state:function(){return d},always:function(){return f.done(arguments).fail(arguments),this},"catch":function(a){return e.then(null,a)},pipe:function(){var a=arguments;return r.Deferred(function(b){r.each(c,function(c,d){var e=r.isFunction(a[d[4]])&&a[d[4]];f[d[1]](function(){var a=e&&e.apply(this,arguments);a&&r.isFunction(a.promise)?a.promise().progress(b.notify).done(b.resolve).fail(b.reject):b[d[0]+"With"](this,e?[a]:arguments)})}),a=null}).promise()},then:function(b,d,e){var f=0;function g(b,c,d,e){return function(){var h=this,i=arguments,j=function(){var a,j;if(!(b<f)){if(a=d.apply(h,i),a===c.promise())throw new TypeError("Thenable self-resolution");j=a&&("object"==typeof a||"function"==typeof a)&&a.then,r.isFunction(j)?e?j.call(a,g(f,c,M,e),g(f,c,N,e)):(f++,j.call(a,g(f,c,M,e),g(f,c,N,e),g(f,c,M,c.notifyWith))):(d!==M&&(h=void 0,i=[a]),(e||c.resolveWith)(h,i))}},k=e?j:function(){try{j()}catch(a){r.Deferred.exceptionHook&&r.Deferred.exceptionHook(a,k.stackTrace),b+1>=f&&(d!==N&&(h=void 0,i=[a]),c.rejectWith(h,i))}};b?k():(r.Deferred.getStackHook&&(k.stackTrace=r.Deferred.getStackHook()),a.setTimeout(k))}}return r.Deferred(function(a){c[0][3].add(g(0,a,r.isFunction(e)?e:M,a.notifyWith)),c[1][3].add(g(0,a,r.isFunction(b)?b:M)),c[2][3].add(g(0,a,r.isFunction(d)?d:N))}).promise()},promise:function(a){return null!=a?r.extend(a,e):e}},f={};return r.each(c,function(a,b){var g=b[2],h=b[5];e[b[1]]=g.add,h&&g.add(function(){d=h},c[3-a][2].disable,c[0][2].lock),g.add(b[3].fire),f[b[0]]=function(){return f[b[0]+"With"](this===f?void 0:this,arguments),this},f[b[0]+"With"]=g.fireWith}),e.promise(f),b&&b.call(f,f),f},when:function(a){var b=arguments.length,c=b,d=Array(c),e=f.call(arguments),g=r.Deferred(),h=function(a){return function(c){d[a]=this,e[a]=arguments.length>1?f.call(arguments):c,--b||g.resolveWith(d,e)}};if(b<=1&&(O(a,g.done(h(c)).resolve,g.reject),"pending"===g.state()||r.isFunction(e[c]&&e[c].then)))return g.then();while(c--)O(e[c],h(c),g.reject);return g.promise()}});var P=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;r.Deferred.exceptionHook=function(b,c){a.console&&a.console.warn&&b&&P.test(b.name)&&a.console.warn("jQuery.Deferred exception: "+b.message,b.stack,c)},r.readyException=function(b){a.setTimeout(function(){throw b})};var Q=r.Deferred();r.fn.ready=function(a){return Q.then(a)["catch"](function(a){r.readyException(a)}),this},r.extend({isReady:!1,readyWait:1,holdReady:function(a){a?r.readyWait++:r.ready(!0)},ready:function(a){(a===!0?--r.readyWait:r.isReady)||(r.isReady=!0,a!==!0&&--r.readyWait>0||Q.resolveWith(d,[r]))}}),r.ready.then=Q.then;function R(){d.removeEventListener("DOMContentLoaded",R),a.removeEventListener("load",R),r.ready()}"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(r.ready):(d.addEventListener("DOMContentLoaded",R),a.addEventListener("load",R));var S=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===r.type(c)){e=!0;for(h in c)S(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0, +r.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(r(a),c)})),b))for(;h<i;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},T=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function U(){this.expando=r.expando+U.uid++}U.uid=1,U.prototype={cache:function(a){var b=a[this.expando];return b||(b={},T(a)&&(a.nodeType?a[this.expando]=b:Object.defineProperty(a,this.expando,{value:b,configurable:!0}))),b},set:function(a,b,c){var d,e=this.cache(a);if("string"==typeof b)e[r.camelCase(b)]=c;else for(d in b)e[r.camelCase(d)]=b[d];return e},get:function(a,b){return void 0===b?this.cache(a):a[this.expando]&&a[this.expando][r.camelCase(b)]},access:function(a,b,c){return void 0===b||b&&"string"==typeof b&&void 0===c?this.get(a,b):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d=a[this.expando];if(void 0!==d){if(void 0!==b){r.isArray(b)?b=b.map(r.camelCase):(b=r.camelCase(b),b=b in d?[b]:b.match(K)||[]),c=b.length;while(c--)delete d[b[c]]}(void 0===b||r.isEmptyObject(d))&&(a.nodeType?a[this.expando]=void 0:delete a[this.expando])}},hasData:function(a){var b=a[this.expando];return void 0!==b&&!r.isEmptyObject(b)}};var V=new U,W=new U,X=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,Y=/[A-Z]/g;function Z(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(Y,"-$&").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c||"false"!==c&&("null"===c?null:+c+""===c?+c:X.test(c)?JSON.parse(c):c)}catch(e){}W.set(a,b,c)}else c=void 0;return c}r.extend({hasData:function(a){return W.hasData(a)||V.hasData(a)},data:function(a,b,c){return W.access(a,b,c)},removeData:function(a,b){W.remove(a,b)},_data:function(a,b,c){return V.access(a,b,c)},_removeData:function(a,b){V.remove(a,b)}}),r.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=W.get(f),1===f.nodeType&&!V.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=r.camelCase(d.slice(5)),Z(f,d,e[d])));V.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){W.set(this,a)}):S(this,function(b){var c;if(f&&void 0===b){if(c=W.get(f,a),void 0!==c)return c;if(c=Z(f,a),void 0!==c)return c}else this.each(function(){W.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){W.remove(this,a)})}}),r.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=V.get(a,b),c&&(!d||r.isArray(c)?d=V.access(a,b,r.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=r.queue(a,b),d=c.length,e=c.shift(),f=r._queueHooks(a,b),g=function(){r.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return V.get(a,c)||V.access(a,c,{empty:r.Callbacks("once memory").add(function(){V.remove(a,[b+"queue",c])})})}}),r.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?r.queue(this[0],a):void 0===b?this:this.each(function(){var c=r.queue(this,a,b);r._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&r.dequeue(this,a)})},dequeue:function(a){return this.each(function(){r.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=r.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=V.get(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var $=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,_=new RegExp("^(?:([+-])=|)("+$+")([a-z%]*)$","i"),aa=["Top","Right","Bottom","Left"],ba=function(a,b){return a=b||a,"none"===a.style.display||""===a.style.display&&r.contains(a.ownerDocument,a)&&"none"===r.css(a,"display")},ca=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};function da(a,b,c,d){var e,f=1,g=20,h=d?function(){return d.cur()}:function(){return r.css(a,b,"")},i=h(),j=c&&c[3]||(r.cssNumber[b]?"":"px"),k=(r.cssNumber[b]||"px"!==j&&+i)&&_.exec(r.css(a,b));if(k&&k[3]!==j){j=j||k[3],c=c||[],k=+i||1;do f=f||".5",k/=f,r.style(a,b,k+j);while(f!==(f=h()/i)&&1!==f&&--g)}return c&&(k=+k||+i||0,e=c[1]?k+(c[1]+1)*c[2]:+c[2],d&&(d.unit=j,d.start=k,d.end=e)),e}var ea={};function fa(a){var b,c=a.ownerDocument,d=a.nodeName,e=ea[d];return e?e:(b=c.body.appendChild(c.createElement(d)),e=r.css(b,"display"),b.parentNode.removeChild(b),"none"===e&&(e="block"),ea[d]=e,e)}function ga(a,b){for(var c,d,e=[],f=0,g=a.length;f<g;f++)d=a[f],d.style&&(c=d.style.display,b?("none"===c&&(e[f]=V.get(d,"display")||null,e[f]||(d.style.display="")),""===d.style.display&&ba(d)&&(e[f]=fa(d))):"none"!==c&&(e[f]="none",V.set(d,"display",c)));for(f=0;f<g;f++)null!=e[f]&&(a[f].style.display=e[f]);return a}r.fn.extend({show:function(){return ga(this,!0)},hide:function(){return ga(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){ba(this)?r(this).show():r(this).hide()})}});var ha=/^(?:checkbox|radio)$/i,ia=/<([a-z][^\/\0>\x20\t\r\n\f]+)/i,ja=/^$|\/(?:java|ecma)script/i,ka={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};ka.optgroup=ka.option,ka.tbody=ka.tfoot=ka.colgroup=ka.caption=ka.thead,ka.th=ka.td;function la(a,b){var c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&r.nodeName(a,b)?r.merge([a],c):c}function ma(a,b){for(var c=0,d=a.length;c<d;c++)V.set(a[c],"globalEval",!b||V.get(b[c],"globalEval"))}var na=/<|&#?\w+;/;function oa(a,b,c,d,e){for(var f,g,h,i,j,k,l=b.createDocumentFragment(),m=[],n=0,o=a.length;n<o;n++)if(f=a[n],f||0===f)if("object"===r.type(f))r.merge(m,f.nodeType?[f]:f);else if(na.test(f)){g=g||l.appendChild(b.createElement("div")),h=(ia.exec(f)||["",""])[1].toLowerCase(),i=ka[h]||ka._default,g.innerHTML=i[1]+r.htmlPrefilter(f)+i[2],k=i[0];while(k--)g=g.lastChild;r.merge(m,g.childNodes),g=l.firstChild,g.textContent=""}else m.push(b.createTextNode(f));l.textContent="",n=0;while(f=m[n++])if(d&&r.inArray(f,d)>-1)e&&e.push(f);else if(j=r.contains(f.ownerDocument,f),g=la(l.appendChild(f),"script"),j&&ma(g),c){k=0;while(f=g[k++])ja.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),o.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="<textarea>x</textarea>",o.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var pa=d.documentElement,qa=/^key/,ra=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,sa=/^([^.]*)(?:\.(.+)|)/;function ta(){return!0}function ua(){return!1}function va(){try{return d.activeElement}catch(a){}}function wa(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)wa(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=ua;else if(!e)return a;return 1===f&&(g=e,e=function(a){return r().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=r.guid++)),a.each(function(){r.event.add(this,b,e,d,c)})}r.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=V.get(a);if(q){c.handler&&(f=c,c=f.handler,e=f.selector),e&&r.find.matchesSelector(pa,e),c.guid||(c.guid=r.guid++),(i=q.events)||(i=q.events={}),(g=q.handle)||(g=q.handle=function(b){return"undefined"!=typeof r&&r.event.triggered!==b.type?r.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(K)||[""],j=b.length;while(j--)h=sa.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n&&(l=r.event.special[n]||{},n=(e?l.delegateType:l.bindType)||n,l=r.event.special[n]||{},k=r.extend({type:n,origType:p,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&r.expr.match.needsContext.test(e),namespace:o.join(".")},f),(m=i[n])||(m=i[n]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,o,g)!==!1||a.addEventListener&&a.addEventListener(n,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),r.event.global[n]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=V.hasData(a)&&V.get(a);if(q&&(i=q.events)){b=(b||"").match(K)||[""],j=b.length;while(j--)if(h=sa.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n){l=r.event.special[n]||{},n=(d?l.delegateType:l.bindType)||n,m=i[n]||[],h=h[2]&&new RegExp("(^|\\.)"+o.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&p!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,o,q.handle)!==!1||r.removeEvent(a,n,q.handle),delete i[n])}else for(n in i)r.event.remove(a,n+b[j],c,d,!0);r.isEmptyObject(i)&&V.remove(a,"handle events")}},dispatch:function(a){var b=r.event.fix(a),c,d,e,f,g,h,i=new Array(arguments.length),j=(V.get(this,"events")||{})[b.type]||[],k=r.event.special[b.type]||{};for(i[0]=b,c=1;c<arguments.length;c++)i[c]=arguments[c];if(b.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,b)!==!1){h=r.event.handlers.call(this,b,j),c=0;while((f=h[c++])&&!b.isPropagationStopped()){b.currentTarget=f.elem,d=0;while((g=f.handlers[d++])&&!b.isImmediatePropagationStopped())b.rnamespace&&!b.rnamespace.test(g.namespace)||(b.handleObj=g,b.data=g.data,e=((r.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==e&&(b.result=e)===!1&&(b.preventDefault(),b.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,b),b.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&("click"!==a.type||isNaN(a.button)||a.button<1))for(;i!==this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(d=[],c=0;c<h;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?r(e,this).index(i)>-1:r.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},addProp:function(a,b){Object.defineProperty(r.Event.prototype,a,{enumerable:!0,configurable:!0,get:r.isFunction(b)?function(){if(this.originalEvent)return b(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[a]},set:function(b){Object.defineProperty(this,a,{enumerable:!0,configurable:!0,writable:!0,value:b})}})},fix:function(a){return a[r.expando]?a:new r.Event(a)},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==va()&&this.focus)return this.focus(),!1},delegateType:"focusin"},blur:{trigger:function(){if(this===va()&&this.blur)return this.blur(),!1},delegateType:"focusout"},click:{trigger:function(){if("checkbox"===this.type&&this.click&&r.nodeName(this,"input"))return this.click(),!1},_default:function(a){return r.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}}},r.removeEvent=function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c)},r.Event=function(a,b){return this instanceof r.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?ta:ua,this.target=a.target&&3===a.target.nodeType?a.target.parentNode:a.target,this.currentTarget=a.currentTarget,this.relatedTarget=a.relatedTarget):this.type=a,b&&r.extend(this,b),this.timeStamp=a&&a.timeStamp||r.now(),void(this[r.expando]=!0)):new r.Event(a,b)},r.Event.prototype={constructor:r.Event,isDefaultPrevented:ua,isPropagationStopped:ua,isImmediatePropagationStopped:ua,isSimulated:!1,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=ta,a&&!this.isSimulated&&a.preventDefault()},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=ta,a&&!this.isSimulated&&a.stopPropagation()},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=ta,a&&!this.isSimulated&&a.stopImmediatePropagation(),this.stopPropagation()}},r.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:function(a){var b=a.button;return null==a.which&&qa.test(a.type)?null!=a.charCode?a.charCode:a.keyCode:!a.which&&void 0!==b&&ra.test(a.type)?1&b?1:2&b?3:4&b?2:0:a.which}},r.event.addProp),r.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){r.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return e&&(e===d||r.contains(d,e))||(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),r.fn.extend({on:function(a,b,c,d){return wa(this,a,b,c,d)},one:function(a,b,c,d){return wa(this,a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,r(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return b!==!1&&"function"!=typeof b||(c=b,b=void 0),c===!1&&(c=ua),this.each(function(){r.event.remove(this,a,c,b)})}});var xa=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,ya=/<script|<style|<link/i,za=/checked\s*(?:[^=]|=\s*.checked.)/i,Aa=/^true\/(.*)/,Ba=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function Ca(a,b){return r.nodeName(a,"table")&&r.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a:a}function Da(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function Ea(a){var b=Aa.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Fa(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(V.hasData(a)&&(f=V.access(a),g=V.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;c<d;c++)r.event.add(b,e,j[e][c])}W.hasData(a)&&(h=W.access(a),i=r.extend({},h),W.set(b,i))}}function Ga(a,b){var c=b.nodeName.toLowerCase();"input"===c&&ha.test(a.type)?b.checked=a.checked:"input"!==c&&"textarea"!==c||(b.defaultValue=a.defaultValue)}function Ha(a,b,c,d){b=g.apply([],b);var e,f,h,i,j,k,l=0,m=a.length,n=m-1,q=b[0],s=r.isFunction(q);if(s||m>1&&"string"==typeof q&&!o.checkClone&&za.test(q))return a.each(function(e){var f=a.eq(e);s&&(b[0]=q.call(this,e,f.html())),Ha(f,b,c,d)});if(m&&(e=oa(b,a[0].ownerDocument,!1,a,d),f=e.firstChild,1===e.childNodes.length&&(e=f),f||d)){for(h=r.map(la(e,"script"),Da),i=h.length;l<m;l++)j=e,l!==n&&(j=r.clone(j,!0,!0),i&&r.merge(h,la(j,"script"))),c.call(a[l],j,l);if(i)for(k=h[h.length-1].ownerDocument,r.map(h,Ea),l=0;l<i;l++)j=h[l],ja.test(j.type||"")&&!V.access(j,"globalEval")&&r.contains(k,j)&&(j.src?r._evalUrl&&r._evalUrl(j.src):p(j.textContent.replace(Ba,""),k))}return a}function Ia(a,b,c){for(var d,e=b?r.filter(b,a):a,f=0;null!=(d=e[f]);f++)c||1!==d.nodeType||r.cleanData(la(d)),d.parentNode&&(c&&r.contains(d.ownerDocument,d)&&ma(la(d,"script")),d.parentNode.removeChild(d));return a}r.extend({htmlPrefilter:function(a){return a.replace(xa,"<$1></$2>")},clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=r.contains(a.ownerDocument,a);if(!(o.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||r.isXMLDoc(a)))for(g=la(h),f=la(a),d=0,e=f.length;d<e;d++)Ga(f[d],g[d]);if(b)if(c)for(f=f||la(a),g=g||la(h),d=0,e=f.length;d<e;d++)Fa(f[d],g[d]);else Fa(a,h);return g=la(h,"script"),g.length>0&&ma(g,!i&&la(a,"script")),h},cleanData:function(a){for(var b,c,d,e=r.event.special,f=0;void 0!==(c=a[f]);f++)if(T(c)){if(b=c[V.expando]){if(b.events)for(d in b.events)e[d]?r.event.remove(c,d):r.removeEvent(c,d,b.handle);c[V.expando]=void 0}c[W.expando]&&(c[W.expando]=void 0)}}}),r.fn.extend({detach:function(a){return Ia(this,a,!0)},remove:function(a){return Ia(this,a)},text:function(a){return S(this,function(a){return void 0===a?r.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=a)})},null,a,arguments.length)},append:function(){return Ha(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ca(this,a);b.appendChild(a)}})},prepend:function(){return Ha(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ca(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ha(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ha(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(r.cleanData(la(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null!=a&&a,b=null==b?a:b,this.map(function(){return r.clone(this,a,b)})},html:function(a){return S(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!ya.test(a)&&!ka[(ia.exec(a)||["",""])[1].toLowerCase()]){a=r.htmlPrefilter(a);try{for(;c<d;c++)b=this[c]||{},1===b.nodeType&&(r.cleanData(la(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=[];return Ha(this,arguments,function(b){var c=this.parentNode;r.inArray(this,a)<0&&(r.cleanData(la(this)),c&&c.replaceChild(b,this))},a)}}),r.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){r.fn[a]=function(a){for(var c,d=[],e=r(a),f=e.length-1,g=0;g<=f;g++)c=g===f?this:this.clone(!0),r(e[g])[b](c),h.apply(d,c.get());return this.pushStack(d)}});var Ja=/^margin/,Ka=new RegExp("^("+$+")(?!px)[a-z%]+$","i"),La=function(b){var c=b.ownerDocument.defaultView;return c&&c.opener||(c=a),c.getComputedStyle(b)};!function(){function b(){if(i){i.style.cssText="box-sizing:border-box;position:relative;display:block;margin:auto;border:1px;padding:1px;top:1%;width:50%",i.innerHTML="",pa.appendChild(h);var b=a.getComputedStyle(i);c="1%"!==b.top,g="2px"===b.marginLeft,e="4px"===b.width,i.style.marginRight="50%",f="4px"===b.marginRight,pa.removeChild(h),i=null}}var c,e,f,g,h=d.createElement("div"),i=d.createElement("div");i.style&&(i.style.backgroundClip="content-box",i.cloneNode(!0).style.backgroundClip="",o.clearCloneStyle="content-box"===i.style.backgroundClip,h.style.cssText="border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute",h.appendChild(i),r.extend(o,{pixelPosition:function(){return b(),c},boxSizingReliable:function(){return b(),e},pixelMarginRight:function(){return b(),f},reliableMarginLeft:function(){return b(),g}}))}();function Ma(a,b,c){var d,e,f,g,h=a.style;return c=c||La(a),c&&(g=c.getPropertyValue(b)||c[b],""!==g||r.contains(a.ownerDocument,a)||(g=r.style(a,b)),!o.pixelMarginRight()&&Ka.test(g)&&Ja.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0!==g?g+"":g}function Na(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}var Oa=/^(none|table(?!-c[ea]).+)/,Pa={position:"absolute",visibility:"hidden",display:"block"},Qa={letterSpacing:"0",fontWeight:"400"},Ra=["Webkit","Moz","ms"],Sa=d.createElement("div").style;function Ta(a){if(a in Sa)return a;var b=a[0].toUpperCase()+a.slice(1),c=Ra.length;while(c--)if(a=Ra[c]+b,a in Sa)return a}function Ua(a,b,c){var d=_.exec(b);return d?Math.max(0,d[2]-(c||0))+(d[3]||"px"):b}function Va(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;f<4;f+=2)"margin"===c&&(g+=r.css(a,c+aa[f],!0,e)),d?("content"===c&&(g-=r.css(a,"padding"+aa[f],!0,e)),"margin"!==c&&(g-=r.css(a,"border"+aa[f]+"Width",!0,e))):(g+=r.css(a,"padding"+aa[f],!0,e),"padding"!==c&&(g+=r.css(a,"border"+aa[f]+"Width",!0,e)));return g}function Wa(a,b,c){var d,e=!0,f=La(a),g="border-box"===r.css(a,"boxSizing",!1,f);if(a.getClientRects().length&&(d=a.getBoundingClientRect()[b]),d<=0||null==d){if(d=Ma(a,b,f),(d<0||null==d)&&(d=a.style[b]),Ka.test(d))return d;e=g&&(o.boxSizingReliable()||d===a.style[b]),d=parseFloat(d)||0}return d+Va(a,b,c||(g?"border":"content"),e,f)+"px"}r.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Ma(a,"opacity");return""===c?"1":c}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":"cssFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=r.camelCase(b),i=a.style;return b=r.cssProps[h]||(r.cssProps[h]=Ta(h)||h),g=r.cssHooks[b]||r.cssHooks[h],void 0===c?g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b]:(f=typeof c,"string"===f&&(e=_.exec(c))&&e[1]&&(c=da(a,b,e),f="number"),null!=c&&c===c&&("number"===f&&(c+=e&&e[3]||(r.cssNumber[h]?"":"px")),o.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),g&&"set"in g&&void 0===(c=g.set(a,c,d))||(i[b]=c)),void 0)}},css:function(a,b,c,d){var e,f,g,h=r.camelCase(b);return b=r.cssProps[h]||(r.cssProps[h]=Ta(h)||h),g=r.cssHooks[b]||r.cssHooks[h],g&&"get"in g&&(e=g.get(a,!0,c)),void 0===e&&(e=Ma(a,b,d)),"normal"===e&&b in Qa&&(e=Qa[b]),""===c||c?(f=parseFloat(e),c===!0||isFinite(f)?f||0:e):e}}),r.each(["height","width"],function(a,b){r.cssHooks[b]={get:function(a,c,d){if(c)return!Oa.test(r.css(a,"display"))||a.getClientRects().length&&a.getBoundingClientRect().width?Wa(a,b,d):ca(a,Pa,function(){return Wa(a,b,d)})},set:function(a,c,d){var e,f=d&&La(a),g=d&&Va(a,b,d,"border-box"===r.css(a,"boxSizing",!1,f),f);return g&&(e=_.exec(c))&&"px"!==(e[3]||"px")&&(a.style[b]=c,c=r.css(a,b)),Ua(a,c,g)}}}),r.cssHooks.marginLeft=Na(o.reliableMarginLeft,function(a,b){if(b)return(parseFloat(Ma(a,"marginLeft"))||a.getBoundingClientRect().left-ca(a,{marginLeft:0},function(){return a.getBoundingClientRect().left}))+"px"}),r.each({margin:"",padding:"",border:"Width"},function(a,b){r.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];d<4;d++)e[a+aa[d]+b]=f[d]||f[d-2]||f[0];return e}},Ja.test(a)||(r.cssHooks[a+b].set=Ua)}),r.fn.extend({css:function(a,b){return S(this,function(a,b,c){var d,e,f={},g=0;if(r.isArray(b)){for(d=La(a),e=b.length;g<e;g++)f[b[g]]=r.css(a,b[g],!1,d);return f}return void 0!==c?r.style(a,b,c):r.css(a,b)},a,b,arguments.length>1)}});function Xa(a,b,c,d,e){return new Xa.prototype.init(a,b,c,d,e)}r.Tween=Xa,Xa.prototype={constructor:Xa,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||r.easing._default,this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(r.cssNumber[c]?"":"px")},cur:function(){var a=Xa.propHooks[this.prop];return a&&a.get?a.get(this):Xa.propHooks._default.get(this)},run:function(a){var b,c=Xa.propHooks[this.prop];return this.options.duration?this.pos=b=r.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Xa.propHooks._default.set(this),this}},Xa.prototype.init.prototype=Xa.prototype,Xa.propHooks={_default:{get:function(a){var b;return 1!==a.elem.nodeType||null!=a.elem[a.prop]&&null==a.elem.style[a.prop]?a.elem[a.prop]:(b=r.css(a.elem,a.prop,""),b&&"auto"!==b?b:0)},set:function(a){r.fx.step[a.prop]?r.fx.step[a.prop](a):1!==a.elem.nodeType||null==a.elem.style[r.cssProps[a.prop]]&&!r.cssHooks[a.prop]?a.elem[a.prop]=a.now:r.style(a.elem,a.prop,a.now+a.unit)}}},Xa.propHooks.scrollTop=Xa.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},r.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},_default:"swing"},r.fx=Xa.prototype.init,r.fx.step={};var Ya,Za,$a=/^(?:toggle|show|hide)$/,_a=/queueHooks$/;function ab(){Za&&(a.requestAnimationFrame(ab),r.fx.tick())}function bb(){return a.setTimeout(function(){Ya=void 0}),Ya=r.now()}function cb(a,b){var c,d=0,e={height:a};for(b=b?1:0;d<4;d+=2-b)c=aa[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function db(a,b,c){for(var d,e=(gb.tweeners[b]||[]).concat(gb.tweeners["*"]),f=0,g=e.length;f<g;f++)if(d=e[f].call(c,b,a))return d}function eb(a,b,c){var d,e,f,g,h,i,j,k,l="width"in b||"height"in b,m=this,n={},o=a.style,p=a.nodeType&&ba(a),q=V.get(a,"fxshow");c.queue||(g=r._queueHooks(a,"fx"),null==g.unqueued&&(g.unqueued=0,h=g.empty.fire,g.empty.fire=function(){g.unqueued||h()}),g.unqueued++,m.always(function(){m.always(function(){g.unqueued--,r.queue(a,"fx").length||g.empty.fire()})}));for(d in b)if(e=b[d],$a.test(e)){if(delete b[d],f=f||"toggle"===e,e===(p?"hide":"show")){if("show"!==e||!q||void 0===q[d])continue;p=!0}n[d]=q&&q[d]||r.style(a,d)}if(i=!r.isEmptyObject(b),i||!r.isEmptyObject(n)){l&&1===a.nodeType&&(c.overflow=[o.overflow,o.overflowX,o.overflowY],j=q&&q.display,null==j&&(j=V.get(a,"display")),k=r.css(a,"display"),"none"===k&&(j?k=j:(ga([a],!0),j=a.style.display||j,k=r.css(a,"display"),ga([a]))),("inline"===k||"inline-block"===k&&null!=j)&&"none"===r.css(a,"float")&&(i||(m.done(function(){o.display=j}),null==j&&(k=o.display,j="none"===k?"":k)),o.display="inline-block")),c.overflow&&(o.overflow="hidden",m.always(function(){o.overflow=c.overflow[0],o.overflowX=c.overflow[1],o.overflowY=c.overflow[2]})),i=!1;for(d in n)i||(q?"hidden"in q&&(p=q.hidden):q=V.access(a,"fxshow",{display:j}),f&&(q.hidden=!p),p&&ga([a],!0),m.done(function(){p||ga([a]),V.remove(a,"fxshow");for(d in n)r.style(a,d,n[d])})),i=db(p?q[d]:0,d,m),d in q||(q[d]=i.start,p&&(i.end=i.start,i.start=0))}}function fb(a,b){var c,d,e,f,g;for(c in a)if(d=r.camelCase(c),e=b[d],f=a[c],r.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=r.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function gb(a,b,c){var d,e,f=0,g=gb.prefilters.length,h=r.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=Ya||bb(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;g<i;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),f<1&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:r.extend({},b),opts:r.extend(!0,{specialEasing:{},easing:r.easing._default},c),originalProperties:b,originalOptions:c,startTime:Ya||bb(),duration:c.duration,tweens:[],createTween:function(b,c){var d=r.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;c<d;c++)j.tweens[c].run(1);return b?(h.notifyWith(a,[j,1,0]),h.resolveWith(a,[j,b])):h.rejectWith(a,[j,b]),this}}),k=j.props;for(fb(k,j.opts.specialEasing);f<g;f++)if(d=gb.prefilters[f].call(j,a,k,j.opts))return r.isFunction(d.stop)&&(r._queueHooks(j.elem,j.opts.queue).stop=r.proxy(d.stop,d)),d;return r.map(k,db,j),r.isFunction(j.opts.start)&&j.opts.start.call(a,j),r.fx.timer(r.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}r.Animation=r.extend(gb,{tweeners:{"*":[function(a,b){var c=this.createTween(a,b);return da(c.elem,a,_.exec(b),c),c}]},tweener:function(a,b){r.isFunction(a)?(b=a,a=["*"]):a=a.match(K);for(var c,d=0,e=a.length;d<e;d++)c=a[d],gb.tweeners[c]=gb.tweeners[c]||[],gb.tweeners[c].unshift(b)},prefilters:[eb],prefilter:function(a,b){b?gb.prefilters.unshift(a):gb.prefilters.push(a)}}),r.speed=function(a,b,c){var e=a&&"object"==typeof a?r.extend({},a):{complete:c||!c&&b||r.isFunction(a)&&a,duration:a,easing:c&&b||b&&!r.isFunction(b)&&b};return r.fx.off||d.hidden?e.duration=0:e.duration="number"==typeof e.duration?e.duration:e.duration in r.fx.speeds?r.fx.speeds[e.duration]:r.fx.speeds._default,null!=e.queue&&e.queue!==!0||(e.queue="fx"),e.old=e.complete,e.complete=function(){r.isFunction(e.old)&&e.old.call(this),e.queue&&r.dequeue(this,e.queue)},e},r.fn.extend({fadeTo:function(a,b,c,d){return this.filter(ba).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=r.isEmptyObject(a),f=r.speed(b,c,d),g=function(){var b=gb(this,r.extend({},a),f);(e||V.get(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=r.timers,g=V.get(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&_a.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));!b&&c||r.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=V.get(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=r.timers,g=d?d.length:0;for(c.finish=!0,r.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;b<g;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),r.each(["toggle","show","hide"],function(a,b){var c=r.fn[b];r.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(cb(b,!0),a,d,e)}}),r.each({slideDown:cb("show"),slideUp:cb("hide"),slideToggle:cb("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){r.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),r.timers=[],r.fx.tick=function(){var a,b=0,c=r.timers;for(Ya=r.now();b<c.length;b++)a=c[b],a()||c[b]!==a||c.splice(b--,1);c.length||r.fx.stop(),Ya=void 0},r.fx.timer=function(a){r.timers.push(a),a()?r.fx.start():r.timers.pop()},r.fx.interval=13,r.fx.start=function(){Za||(Za=a.requestAnimationFrame?a.requestAnimationFrame(ab):a.setInterval(r.fx.tick,r.fx.interval))},r.fx.stop=function(){a.cancelAnimationFrame?a.cancelAnimationFrame(Za):a.clearInterval(Za),Za=null},r.fx.speeds={slow:600,fast:200,_default:400},r.fn.delay=function(b,c){return b=r.fx?r.fx.speeds[b]||b:b,c=c||"fx",this.queue(c,function(c,d){var e=a.setTimeout(c,b);d.stop=function(){a.clearTimeout(e)}})},function(){var a=d.createElement("input"),b=d.createElement("select"),c=b.appendChild(d.createElement("option"));a.type="checkbox",o.checkOn=""!==a.value,o.optSelected=c.selected,a=d.createElement("input"),a.value="t",a.type="radio",o.radioValue="t"===a.value}();var hb,ib=r.expr.attrHandle;r.fn.extend({attr:function(a,b){return S(this,r.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){r.removeAttr(this,a)})}}),r.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return"undefined"==typeof a.getAttribute?r.prop(a,b,c):(1===f&&r.isXMLDoc(a)||(e=r.attrHooks[b.toLowerCase()]||(r.expr.match.bool.test(b)?hb:void 0)),void 0!==c?null===c?void r.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=r.find.attr(a,b),null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!o.radioValue&&"radio"===b&&r.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d=0,e=b&&b.match(K); +if(e&&1===a.nodeType)while(c=e[d++])a.removeAttribute(c)}}),hb={set:function(a,b,c){return b===!1?r.removeAttr(a,c):a.setAttribute(c,c),c}},r.each(r.expr.match.bool.source.match(/\w+/g),function(a,b){var c=ib[b]||r.find.attr;ib[b]=function(a,b,d){var e,f,g=b.toLowerCase();return d||(f=ib[g],ib[g]=e,e=null!=c(a,b,d)?g:null,ib[g]=f),e}});var jb=/^(?:input|select|textarea|button)$/i,kb=/^(?:a|area)$/i;r.fn.extend({prop:function(a,b){return S(this,r.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[r.propFix[a]||a]})}}),r.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&r.isXMLDoc(a)||(b=r.propFix[b]||b,e=r.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=r.find.attr(a,"tabindex");return b?parseInt(b,10):jb.test(a.nodeName)||kb.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),o.optSelected||(r.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null},set:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}}),r.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){r.propFix[this.toLowerCase()]=this});var lb=/[\t\r\n\f]/g;function mb(a){return a.getAttribute&&a.getAttribute("class")||""}r.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).addClass(a.call(this,b,mb(this)))});if("string"==typeof a&&a){b=a.match(K)||[];while(c=this[i++])if(e=mb(c),d=1===c.nodeType&&(" "+e+" ").replace(lb," ")){g=0;while(f=b[g++])d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=r.trim(d),e!==h&&c.setAttribute("class",h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).removeClass(a.call(this,b,mb(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a){b=a.match(K)||[];while(c=this[i++])if(e=mb(c),d=1===c.nodeType&&(" "+e+" ").replace(lb," ")){g=0;while(f=b[g++])while(d.indexOf(" "+f+" ")>-1)d=d.replace(" "+f+" "," ");h=r.trim(d),e!==h&&c.setAttribute("class",h)}}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):r.isFunction(a)?this.each(function(c){r(this).toggleClass(a.call(this,c,mb(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c){d=0,e=r(this),f=a.match(K)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else void 0!==a&&"boolean"!==c||(b=mb(this),b&&V.set(this,"__className__",b),this.setAttribute&&this.setAttribute("class",b||a===!1?"":V.get(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;b=" "+a+" ";while(c=this[d++])if(1===c.nodeType&&(" "+mb(c)+" ").replace(lb," ").indexOf(b)>-1)return!0;return!1}});var nb=/\r/g,ob=/[\x20\t\r\n\f]+/g;r.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=r.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,r(this).val()):a,null==e?e="":"number"==typeof e?e+="":r.isArray(e)&&(e=r.map(e,function(a){return null==a?"":a+""})),b=r.valHooks[this.type]||r.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=r.valHooks[e.type]||r.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(nb,""):null==c?"":c)}}}),r.extend({valHooks:{option:{get:function(a){var b=r.find.attr(a,"value");return null!=b?b:r.trim(r.text(a)).replace(ob," ")}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type,g=f?null:[],h=f?e+1:d.length,i=e<0?h:f?e:0;i<h;i++)if(c=d[i],(c.selected||i===e)&&!c.disabled&&(!c.parentNode.disabled||!r.nodeName(c.parentNode,"optgroup"))){if(b=r(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=r.makeArray(b),g=e.length;while(g--)d=e[g],(d.selected=r.inArray(r.valHooks.option.get(d),f)>-1)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),r.each(["radio","checkbox"],function(){r.valHooks[this]={set:function(a,b){if(r.isArray(b))return a.checked=r.inArray(r(a).val(),b)>-1}},o.checkOn||(r.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var pb=/^(?:focusinfocus|focusoutblur)$/;r.extend(r.event,{trigger:function(b,c,e,f){var g,h,i,j,k,m,n,o=[e||d],p=l.call(b,"type")?b.type:b,q=l.call(b,"namespace")?b.namespace.split("."):[];if(h=i=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!pb.test(p+r.event.triggered)&&(p.indexOf(".")>-1&&(q=p.split("."),p=q.shift(),q.sort()),k=p.indexOf(":")<0&&"on"+p,b=b[r.expando]?b:new r.Event(p,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=q.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:r.makeArray(c,[b]),n=r.event.special[p]||{},f||!n.trigger||n.trigger.apply(e,c)!==!1)){if(!f&&!n.noBubble&&!r.isWindow(e)){for(j=n.delegateType||p,pb.test(j+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),i=h;i===(e.ownerDocument||d)&&o.push(i.defaultView||i.parentWindow||a)}g=0;while((h=o[g++])&&!b.isPropagationStopped())b.type=g>1?j:n.bindType||p,m=(V.get(h,"events")||{})[b.type]&&V.get(h,"handle"),m&&m.apply(h,c),m=k&&h[k],m&&m.apply&&T(h)&&(b.result=m.apply(h,c),b.result===!1&&b.preventDefault());return b.type=p,f||b.isDefaultPrevented()||n._default&&n._default.apply(o.pop(),c)!==!1||!T(e)||k&&r.isFunction(e[p])&&!r.isWindow(e)&&(i=e[k],i&&(e[k]=null),r.event.triggered=p,e[p](),r.event.triggered=void 0,i&&(e[k]=i)),b.result}},simulate:function(a,b,c){var d=r.extend(new r.Event,c,{type:a,isSimulated:!0});r.event.trigger(d,null,b)}}),r.fn.extend({trigger:function(a,b){return this.each(function(){r.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];if(c)return r.event.trigger(a,b,c,!0)}}),r.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(a,b){r.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),r.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),o.focusin="onfocusin"in a,o.focusin||r.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){r.event.simulate(b,a.target,r.event.fix(a))};r.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=V.access(d,b);e||d.addEventListener(a,c,!0),V.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=V.access(d,b)-1;e?V.access(d,b,e):(d.removeEventListener(a,c,!0),V.remove(d,b))}}});var qb=a.location,rb=r.now(),sb=/\?/;r.parseXML=function(b){var c;if(!b||"string"!=typeof b)return null;try{c=(new a.DOMParser).parseFromString(b,"text/xml")}catch(d){c=void 0}return c&&!c.getElementsByTagName("parsererror").length||r.error("Invalid XML: "+b),c};var tb=/\[\]$/,ub=/\r?\n/g,vb=/^(?:submit|button|image|reset|file)$/i,wb=/^(?:input|select|textarea|keygen)/i;function xb(a,b,c,d){var e;if(r.isArray(b))r.each(b,function(b,e){c||tb.test(a)?d(a,e):xb(a+"["+("object"==typeof e&&null!=e?b:"")+"]",e,c,d)});else if(c||"object"!==r.type(b))d(a,b);else for(e in b)xb(a+"["+e+"]",b[e],c,d)}r.param=function(a,b){var c,d=[],e=function(a,b){var c=r.isFunction(b)?b():b;d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(null==c?"":c)};if(r.isArray(a)||a.jquery&&!r.isPlainObject(a))r.each(a,function(){e(this.name,this.value)});else for(c in a)xb(c,a[c],b,e);return d.join("&")},r.fn.extend({serialize:function(){return r.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=r.prop(this,"elements");return a?r.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!r(this).is(":disabled")&&wb.test(this.nodeName)&&!vb.test(a)&&(this.checked||!ha.test(a))}).map(function(a,b){var c=r(this).val();return null==c?null:r.isArray(c)?r.map(c,function(a){return{name:b.name,value:a.replace(ub,"\r\n")}}):{name:b.name,value:c.replace(ub,"\r\n")}}).get()}});var yb=/%20/g,zb=/#.*$/,Ab=/([?&])_=[^&]*/,Bb=/^(.*?):[ \t]*([^\r\n]*)$/gm,Cb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Db=/^(?:GET|HEAD)$/,Eb=/^\/\//,Fb={},Gb={},Hb="*/".concat("*"),Ib=d.createElement("a");Ib.href=qb.href;function Jb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(K)||[];if(r.isFunction(c))while(d=f[e++])"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Kb(a,b,c,d){var e={},f=a===Gb;function g(h){var i;return e[h]=!0,r.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Lb(a,b){var c,d,e=r.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&r.extend(!0,a,d),a}function Mb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}if(f)return f!==i[0]&&i.unshift(f),c[f]}function Nb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}r.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:qb.href,type:"GET",isLocal:Cb.test(qb.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Hb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":r.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Lb(Lb(a,r.ajaxSettings),b):Lb(r.ajaxSettings,a)},ajaxPrefilter:Jb(Fb),ajaxTransport:Jb(Gb),ajax:function(b,c){"object"==typeof b&&(c=b,b=void 0),c=c||{};var e,f,g,h,i,j,k,l,m,n,o=r.ajaxSetup({},c),p=o.context||o,q=o.context&&(p.nodeType||p.jquery)?r(p):r.event,s=r.Deferred(),t=r.Callbacks("once memory"),u=o.statusCode||{},v={},w={},x="canceled",y={readyState:0,getResponseHeader:function(a){var b;if(k){if(!h){h={};while(b=Bb.exec(g))h[b[1].toLowerCase()]=b[2]}b=h[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return k?g:null},setRequestHeader:function(a,b){return null==k&&(a=w[a.toLowerCase()]=w[a.toLowerCase()]||a,v[a]=b),this},overrideMimeType:function(a){return null==k&&(o.mimeType=a),this},statusCode:function(a){var b;if(a)if(k)y.always(a[y.status]);else for(b in a)u[b]=[u[b],a[b]];return this},abort:function(a){var b=a||x;return e&&e.abort(b),A(0,b),this}};if(s.promise(y),o.url=((b||o.url||qb.href)+"").replace(Eb,qb.protocol+"//"),o.type=c.method||c.type||o.method||o.type,o.dataTypes=(o.dataType||"*").toLowerCase().match(K)||[""],null==o.crossDomain){j=d.createElement("a");try{j.href=o.url,j.href=j.href,o.crossDomain=Ib.protocol+"//"+Ib.host!=j.protocol+"//"+j.host}catch(z){o.crossDomain=!0}}if(o.data&&o.processData&&"string"!=typeof o.data&&(o.data=r.param(o.data,o.traditional)),Kb(Fb,o,c,y),k)return y;l=r.event&&o.global,l&&0===r.active++&&r.event.trigger("ajaxStart"),o.type=o.type.toUpperCase(),o.hasContent=!Db.test(o.type),f=o.url.replace(zb,""),o.hasContent?o.data&&o.processData&&0===(o.contentType||"").indexOf("application/x-www-form-urlencoded")&&(o.data=o.data.replace(yb,"+")):(n=o.url.slice(f.length),o.data&&(f+=(sb.test(f)?"&":"?")+o.data,delete o.data),o.cache===!1&&(f=f.replace(Ab,""),n=(sb.test(f)?"&":"?")+"_="+rb++ +n),o.url=f+n),o.ifModified&&(r.lastModified[f]&&y.setRequestHeader("If-Modified-Since",r.lastModified[f]),r.etag[f]&&y.setRequestHeader("If-None-Match",r.etag[f])),(o.data&&o.hasContent&&o.contentType!==!1||c.contentType)&&y.setRequestHeader("Content-Type",o.contentType),y.setRequestHeader("Accept",o.dataTypes[0]&&o.accepts[o.dataTypes[0]]?o.accepts[o.dataTypes[0]]+("*"!==o.dataTypes[0]?", "+Hb+"; q=0.01":""):o.accepts["*"]);for(m in o.headers)y.setRequestHeader(m,o.headers[m]);if(o.beforeSend&&(o.beforeSend.call(p,y,o)===!1||k))return y.abort();if(x="abort",t.add(o.complete),y.done(o.success),y.fail(o.error),e=Kb(Gb,o,c,y)){if(y.readyState=1,l&&q.trigger("ajaxSend",[y,o]),k)return y;o.async&&o.timeout>0&&(i=a.setTimeout(function(){y.abort("timeout")},o.timeout));try{k=!1,e.send(v,A)}catch(z){if(k)throw z;A(-1,z)}}else A(-1,"No Transport");function A(b,c,d,h){var j,m,n,v,w,x=c;k||(k=!0,i&&a.clearTimeout(i),e=void 0,g=h||"",y.readyState=b>0?4:0,j=b>=200&&b<300||304===b,d&&(v=Mb(o,y,d)),v=Nb(o,v,y,j),j?(o.ifModified&&(w=y.getResponseHeader("Last-Modified"),w&&(r.lastModified[f]=w),w=y.getResponseHeader("etag"),w&&(r.etag[f]=w)),204===b||"HEAD"===o.type?x="nocontent":304===b?x="notmodified":(x=v.state,m=v.data,n=v.error,j=!n)):(n=x,!b&&x||(x="error",b<0&&(b=0))),y.status=b,y.statusText=(c||x)+"",j?s.resolveWith(p,[m,x,y]):s.rejectWith(p,[y,x,n]),y.statusCode(u),u=void 0,l&&q.trigger(j?"ajaxSuccess":"ajaxError",[y,o,j?m:n]),t.fireWith(p,[y,x]),l&&(q.trigger("ajaxComplete",[y,o]),--r.active||r.event.trigger("ajaxStop")))}return y},getJSON:function(a,b,c){return r.get(a,b,c,"json")},getScript:function(a,b){return r.get(a,void 0,b,"script")}}),r.each(["get","post"],function(a,b){r[b]=function(a,c,d,e){return r.isFunction(c)&&(e=e||d,d=c,c=void 0),r.ajax(r.extend({url:a,type:b,dataType:e,data:c,success:d},r.isPlainObject(a)&&a))}}),r._evalUrl=function(a){return r.ajax({url:a,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},r.fn.extend({wrapAll:function(a){var b;return this[0]&&(r.isFunction(a)&&(a=a.call(this[0])),b=r(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this},wrapInner:function(a){return r.isFunction(a)?this.each(function(b){r(this).wrapInner(a.call(this,b))}):this.each(function(){var b=r(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=r.isFunction(a);return this.each(function(c){r(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(a){return this.parent(a).not("body").each(function(){r(this).replaceWith(this.childNodes)}),this}}),r.expr.pseudos.hidden=function(a){return!r.expr.pseudos.visible(a)},r.expr.pseudos.visible=function(a){return!!(a.offsetWidth||a.offsetHeight||a.getClientRects().length)},r.ajaxSettings.xhr=function(){try{return new a.XMLHttpRequest}catch(b){}};var Ob={0:200,1223:204},Pb=r.ajaxSettings.xhr();o.cors=!!Pb&&"withCredentials"in Pb,o.ajax=Pb=!!Pb,r.ajaxTransport(function(b){var c,d;if(o.cors||Pb&&!b.crossDomain)return{send:function(e,f){var g,h=b.xhr();if(h.open(b.type,b.url,b.async,b.username,b.password),b.xhrFields)for(g in b.xhrFields)h[g]=b.xhrFields[g];b.mimeType&&h.overrideMimeType&&h.overrideMimeType(b.mimeType),b.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest");for(g in e)h.setRequestHeader(g,e[g]);c=function(a){return function(){c&&(c=d=h.onload=h.onerror=h.onabort=h.onreadystatechange=null,"abort"===a?h.abort():"error"===a?"number"!=typeof h.status?f(0,"error"):f(h.status,h.statusText):f(Ob[h.status]||h.status,h.statusText,"text"!==(h.responseType||"text")||"string"!=typeof h.responseText?{binary:h.response}:{text:h.responseText},h.getAllResponseHeaders()))}},h.onload=c(),d=h.onerror=c("error"),void 0!==h.onabort?h.onabort=d:h.onreadystatechange=function(){4===h.readyState&&a.setTimeout(function(){c&&d()})},c=c("abort");try{h.send(b.hasContent&&b.data||null)}catch(i){if(c)throw i}},abort:function(){c&&c()}}}),r.ajaxPrefilter(function(a){a.crossDomain&&(a.contents.script=!1)}),r.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(a){return r.globalEval(a),a}}}),r.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),r.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(e,f){b=r("<script>").prop({charset:a.scriptCharset,src:a.url}).on("load error",c=function(a){b.remove(),c=null,a&&f("error"===a.type?404:200,a.type)}),d.head.appendChild(b[0])},abort:function(){c&&c()}}}});var Qb=[],Rb=/(=)\?(?=&|$)|\?\?/;r.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=Qb.pop()||r.expando+"_"+rb++;return this[a]=!0,a}}),r.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(Rb.test(b.url)?"url":"string"==typeof b.data&&0===(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&Rb.test(b.data)&&"data");if(h||"jsonp"===b.dataTypes[0])return e=b.jsonpCallback=r.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(Rb,"$1"+e):b.jsonp!==!1&&(b.url+=(sb.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||r.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){void 0===f?r(a).removeProp(e):a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,Qb.push(e)),g&&r.isFunction(f)&&f(g[0]),g=f=void 0}),"script"}),o.createHTMLDocument=function(){var a=d.implementation.createHTMLDocument("").body;return a.innerHTML="<form></form><form></form>",2===a.childNodes.length}(),r.parseHTML=function(a,b,c){if("string"!=typeof a)return[];"boolean"==typeof b&&(c=b,b=!1);var e,f,g;return b||(o.createHTMLDocument?(b=d.implementation.createHTMLDocument(""),e=b.createElement("base"),e.href=d.location.href,b.head.appendChild(e)):b=d),f=B.exec(a),g=!c&&[],f?[b.createElement(f[1])]:(f=oa([a],b,g),g&&g.length&&r(g).remove(),r.merge([],f.childNodes))},r.fn.load=function(a,b,c){var d,e,f,g=this,h=a.indexOf(" ");return h>-1&&(d=r.trim(a.slice(h)),a=a.slice(0,h)),r.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(e="POST"),g.length>0&&r.ajax({url:a,type:e||"GET",dataType:"html",data:b}).done(function(a){f=arguments,g.html(d?r("<div>").append(r.parseHTML(a)).find(d):a)}).always(c&&function(a,b){g.each(function(){c.apply(this,f||[a.responseText,b,a])})}),this},r.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){r.fn[b]=function(a){return this.on(b,a)}}),r.expr.pseudos.animated=function(a){return r.grep(r.timers,function(b){return a===b.elem}).length};function Sb(a){return r.isWindow(a)?a:9===a.nodeType&&a.defaultView}r.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=r.css(a,"position"),l=r(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=r.css(a,"top"),i=r.css(a,"left"),j=("absolute"===k||"fixed"===k)&&(f+i).indexOf("auto")>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),r.isFunction(b)&&(b=b.call(a,c,r.extend({},h))),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),"using"in b?b.using.call(a,m):l.css(m)}},r.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){r.offset.setOffset(this,a,b)});var b,c,d,e,f=this[0];if(f)return f.getClientRects().length?(d=f.getBoundingClientRect(),d.width||d.height?(e=f.ownerDocument,c=Sb(e),b=e.documentElement,{top:d.top+c.pageYOffset-b.clientTop,left:d.left+c.pageXOffset-b.clientLeft}):d):{top:0,left:0}},position:function(){if(this[0]){var a,b,c=this[0],d={top:0,left:0};return"fixed"===r.css(c,"position")?b=c.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),r.nodeName(a[0],"html")||(d=a.offset()),d={top:d.top+r.css(a[0],"borderTopWidth",!0),left:d.left+r.css(a[0],"borderLeftWidth",!0)}),{top:b.top-d.top-r.css(c,"marginTop",!0),left:b.left-d.left-r.css(c,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent;while(a&&"static"===r.css(a,"position"))a=a.offsetParent;return a||pa})}}),r.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c="pageYOffset"===b;r.fn[a]=function(d){return S(this,function(a,d,e){var f=Sb(a);return void 0===e?f?f[b]:a[d]:void(f?f.scrollTo(c?f.pageXOffset:e,c?e:f.pageYOffset):a[d]=e)},a,d,arguments.length)}}),r.each(["top","left"],function(a,b){r.cssHooks[b]=Na(o.pixelPosition,function(a,c){if(c)return c=Ma(a,b),Ka.test(c)?r(a).position()[b]+"px":c})}),r.each({Height:"height",Width:"width"},function(a,b){r.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){r.fn[d]=function(e,f){var g=arguments.length&&(c||"boolean"!=typeof e),h=c||(e===!0||f===!0?"margin":"border");return S(this,function(b,c,e){var f;return r.isWindow(b)?0===d.indexOf("outer")?b["inner"+a]:b.document.documentElement["client"+a]:9===b.nodeType?(f=b.documentElement,Math.max(b.body["scroll"+a],f["scroll"+a],b.body["offset"+a],f["offset"+a],f["client"+a])):void 0===e?r.css(b,c,h):r.style(b,c,e,h)},b,g?e:void 0,g)}})}),r.fn.extend({bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}}),r.parseJSON=JSON.parse,"function"==typeof define&&define.amd&&define("jquery",[],function(){return r});var Tb=a.jQuery,Ub=a.$;return r.noConflict=function(b){return a.$===r&&(a.$=Ub),b&&a.jQuery===r&&(a.jQuery=Tb),r},b||(a.jQuery=a.$=r),r}); +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 diff --git a/doc/build/html/_static/pygments.css b/doc/build/html/_static/pygments.css index 8213e90bed399b1ddc4914808df328f5803e953f..63f0e1dc5e002fdae0ef553dee4fb46365aa107a 100644 --- a/doc/build/html/_static/pygments.css +++ b/doc/build/html/_static/pygments.css @@ -47,8 +47,15 @@ .highlight .mh { color: #208050 } /* Literal.Number.Hex */ .highlight .mi { color: #208050 } /* Literal.Number.Integer */ .highlight .mo { color: #208050 } /* Literal.Number.Oct */ +<<<<<<< HEAD .highlight .sb { color: #4070a0 } /* Literal.String.Backtick */ .highlight .sc { color: #4070a0 } /* Literal.String.Char */ +======= +.highlight .sa { color: #4070a0 } /* Literal.String.Affix */ +.highlight .sb { color: #4070a0 } /* Literal.String.Backtick */ +.highlight .sc { color: #4070a0 } /* Literal.String.Char */ +.highlight .dl { color: #4070a0 } /* Literal.String.Delimiter */ +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 .highlight .sd { color: #4070a0; font-style: italic } /* Literal.String.Doc */ .highlight .s2 { color: #4070a0 } /* Literal.String.Double */ .highlight .se { color: #4070a0; font-weight: bold } /* Literal.String.Escape */ @@ -59,7 +66,15 @@ .highlight .s1 { color: #4070a0 } /* Literal.String.Single */ .highlight .ss { color: #517918 } /* Literal.String.Symbol */ .highlight .bp { color: #007020 } /* Name.Builtin.Pseudo */ +<<<<<<< HEAD +.highlight .vc { color: #bb60d5 } /* Name.Variable.Class */ +.highlight .vg { color: #bb60d5 } /* Name.Variable.Global */ +.highlight .vi { color: #bb60d5 } /* Name.Variable.Instance */ +======= +.highlight .fm { color: #06287e } /* Name.Function.Magic */ .highlight .vc { color: #bb60d5 } /* Name.Variable.Class */ .highlight .vg { color: #bb60d5 } /* Name.Variable.Global */ .highlight .vi { color: #bb60d5 } /* Name.Variable.Instance */ +.highlight .vm { color: #bb60d5 } /* Name.Variable.Magic */ +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 .highlight .il { color: #208050 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/doc/build/html/_static/searchtools.js b/doc/build/html/_static/searchtools.js index bbfb3ac1450393053f44a2d291a80895936e44cd..6bcdf57bbd27b800d4f894ae03a3c455bf9a6c93 100644 --- a/doc/build/html/_static/searchtools.js +++ b/doc/build/html/_static/searchtools.js @@ -4,7 +4,11 @@ * * Sphinx JavaScript utilities for the full-text search. * +<<<<<<< HEAD * :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. +======= + * :copyright: Copyright 2007-2017 by the Sphinx team, see AUTHORS. +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 * :license: BSD, see LICENSE for details. * */ @@ -540,6 +544,12 @@ var Search = { }); } else if (DOCUMENTATION_OPTIONS.HAS_SOURCE) { var suffix = DOCUMENTATION_OPTIONS.SOURCELINK_SUFFIX; +<<<<<<< HEAD +======= + if (suffix === undefined) { + suffix = '.txt'; + } +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 $.ajax({url: DOCUMENTATION_OPTIONS.URL_ROOT + '_sources/' + item[5] + (item[5].slice(-suffix.length) === suffix ? '' : suffix), dataType: "text", complete: function(jqxhr, textstatus) { diff --git a/doc/build/html/_static/underscore.js b/doc/build/html/_static/underscore.js index b29332f945b859cea0075bb69e8bd5c1c113f05c..6477b4465b5055b704818543eeeb2258e5aa1994 100644 --- a/doc/build/html/_static/underscore.js +++ b/doc/build/html/_static/underscore.js @@ -1,3 +1,4 @@ +<<<<<<< HEAD // Underscore.js 1.8.3 // http://underscorejs.org // (c) 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors @@ -1546,3 +1547,36 @@ }); } }.call(this)); +======= +// Underscore.js 1.3.1 +// (c) 2009-2012 Jeremy Ashkenas, DocumentCloud Inc. +// Underscore is freely distributable under the MIT license. +// Portions of Underscore are inspired or borrowed from Prototype, +// Oliver Steele's Functional, and John Resig's Micro-Templating. +// For all details and documentation: +// http://documentcloud.github.com/underscore +(function(){function q(a,c,d){if(a===c)return a!==0||1/a==1/c;if(a==null||c==null)return a===c;if(a._chain)a=a._wrapped;if(c._chain)c=c._wrapped;if(a.isEqual&&b.isFunction(a.isEqual))return a.isEqual(c);if(c.isEqual&&b.isFunction(c.isEqual))return c.isEqual(a);var e=l.call(a);if(e!=l.call(c))return false;switch(e){case "[object String]":return a==String(c);case "[object Number]":return a!=+a?c!=+c:a==0?1/a==1/c:a==+c;case "[object Date]":case "[object Boolean]":return+a==+c;case "[object RegExp]":return a.source== +c.source&&a.global==c.global&&a.multiline==c.multiline&&a.ignoreCase==c.ignoreCase}if(typeof a!="object"||typeof c!="object")return false;for(var f=d.length;f--;)if(d[f]==a)return true;d.push(a);var f=0,g=true;if(e=="[object Array]"){if(f=a.length,g=f==c.length)for(;f--;)if(!(g=f in a==f in c&&q(a[f],c[f],d)))break}else{if("constructor"in a!="constructor"in c||a.constructor!=c.constructor)return false;for(var h in a)if(b.has(a,h)&&(f++,!(g=b.has(c,h)&&q(a[h],c[h],d))))break;if(g){for(h in c)if(b.has(c, +h)&&!f--)break;g=!f}}d.pop();return g}var r=this,G=r._,n={},k=Array.prototype,o=Object.prototype,i=k.slice,H=k.unshift,l=o.toString,I=o.hasOwnProperty,w=k.forEach,x=k.map,y=k.reduce,z=k.reduceRight,A=k.filter,B=k.every,C=k.some,p=k.indexOf,D=k.lastIndexOf,o=Array.isArray,J=Object.keys,s=Function.prototype.bind,b=function(a){return new m(a)};if(typeof exports!=="undefined"){if(typeof module!=="undefined"&&module.exports)exports=module.exports=b;exports._=b}else r._=b;b.VERSION="1.3.1";var j=b.each= +b.forEach=function(a,c,d){if(a!=null)if(w&&a.forEach===w)a.forEach(c,d);else if(a.length===+a.length)for(var e=0,f=a.length;e<f;e++){if(e in a&&c.call(d,a[e],e,a)===n)break}else for(e in a)if(b.has(a,e)&&c.call(d,a[e],e,a)===n)break};b.map=b.collect=function(a,c,b){var e=[];if(a==null)return e;if(x&&a.map===x)return a.map(c,b);j(a,function(a,g,h){e[e.length]=c.call(b,a,g,h)});if(a.length===+a.length)e.length=a.length;return e};b.reduce=b.foldl=b.inject=function(a,c,d,e){var f=arguments.length>2;a== +null&&(a=[]);if(y&&a.reduce===y)return e&&(c=b.bind(c,e)),f?a.reduce(c,d):a.reduce(c);j(a,function(a,b,i){f?d=c.call(e,d,a,b,i):(d=a,f=true)});if(!f)throw new TypeError("Reduce of empty array with no initial value");return d};b.reduceRight=b.foldr=function(a,c,d,e){var f=arguments.length>2;a==null&&(a=[]);if(z&&a.reduceRight===z)return e&&(c=b.bind(c,e)),f?a.reduceRight(c,d):a.reduceRight(c);var g=b.toArray(a).reverse();e&&!f&&(c=b.bind(c,e));return f?b.reduce(g,c,d,e):b.reduce(g,c)};b.find=b.detect= +function(a,c,b){var e;E(a,function(a,g,h){if(c.call(b,a,g,h))return e=a,true});return e};b.filter=b.select=function(a,c,b){var e=[];if(a==null)return e;if(A&&a.filter===A)return a.filter(c,b);j(a,function(a,g,h){c.call(b,a,g,h)&&(e[e.length]=a)});return e};b.reject=function(a,c,b){var e=[];if(a==null)return e;j(a,function(a,g,h){c.call(b,a,g,h)||(e[e.length]=a)});return e};b.every=b.all=function(a,c,b){var e=true;if(a==null)return e;if(B&&a.every===B)return a.every(c,b);j(a,function(a,g,h){if(!(e= +e&&c.call(b,a,g,h)))return n});return e};var E=b.some=b.any=function(a,c,d){c||(c=b.identity);var e=false;if(a==null)return e;if(C&&a.some===C)return a.some(c,d);j(a,function(a,b,h){if(e||(e=c.call(d,a,b,h)))return n});return!!e};b.include=b.contains=function(a,c){var b=false;if(a==null)return b;return p&&a.indexOf===p?a.indexOf(c)!=-1:b=E(a,function(a){return a===c})};b.invoke=function(a,c){var d=i.call(arguments,2);return b.map(a,function(a){return(b.isFunction(c)?c||a:a[c]).apply(a,d)})};b.pluck= +function(a,c){return b.map(a,function(a){return a[c]})};b.max=function(a,c,d){if(!c&&b.isArray(a))return Math.max.apply(Math,a);if(!c&&b.isEmpty(a))return-Infinity;var e={computed:-Infinity};j(a,function(a,b,h){b=c?c.call(d,a,b,h):a;b>=e.computed&&(e={value:a,computed:b})});return e.value};b.min=function(a,c,d){if(!c&&b.isArray(a))return Math.min.apply(Math,a);if(!c&&b.isEmpty(a))return Infinity;var e={computed:Infinity};j(a,function(a,b,h){b=c?c.call(d,a,b,h):a;b<e.computed&&(e={value:a,computed:b})}); +return e.value};b.shuffle=function(a){var b=[],d;j(a,function(a,f){f==0?b[0]=a:(d=Math.floor(Math.random()*(f+1)),b[f]=b[d],b[d]=a)});return b};b.sortBy=function(a,c,d){return b.pluck(b.map(a,function(a,b,g){return{value:a,criteria:c.call(d,a,b,g)}}).sort(function(a,b){var c=a.criteria,d=b.criteria;return c<d?-1:c>d?1:0}),"value")};b.groupBy=function(a,c){var d={},e=b.isFunction(c)?c:function(a){return a[c]};j(a,function(a,b){var c=e(a,b);(d[c]||(d[c]=[])).push(a)});return d};b.sortedIndex=function(a, +c,d){d||(d=b.identity);for(var e=0,f=a.length;e<f;){var g=e+f>>1;d(a[g])<d(c)?e=g+1:f=g}return e};b.toArray=function(a){return!a?[]:a.toArray?a.toArray():b.isArray(a)?i.call(a):b.isArguments(a)?i.call(a):b.values(a)};b.size=function(a){return b.toArray(a).length};b.first=b.head=function(a,b,d){return b!=null&&!d?i.call(a,0,b):a[0]};b.initial=function(a,b,d){return i.call(a,0,a.length-(b==null||d?1:b))};b.last=function(a,b,d){return b!=null&&!d?i.call(a,Math.max(a.length-b,0)):a[a.length-1]};b.rest= +b.tail=function(a,b,d){return i.call(a,b==null||d?1:b)};b.compact=function(a){return b.filter(a,function(a){return!!a})};b.flatten=function(a,c){return b.reduce(a,function(a,e){if(b.isArray(e))return a.concat(c?e:b.flatten(e));a[a.length]=e;return a},[])};b.without=function(a){return b.difference(a,i.call(arguments,1))};b.uniq=b.unique=function(a,c,d){var d=d?b.map(a,d):a,e=[];b.reduce(d,function(d,g,h){if(0==h||(c===true?b.last(d)!=g:!b.include(d,g)))d[d.length]=g,e[e.length]=a[h];return d},[]); +return e};b.union=function(){return b.uniq(b.flatten(arguments,true))};b.intersection=b.intersect=function(a){var c=i.call(arguments,1);return b.filter(b.uniq(a),function(a){return b.every(c,function(c){return b.indexOf(c,a)>=0})})};b.difference=function(a){var c=b.flatten(i.call(arguments,1));return b.filter(a,function(a){return!b.include(c,a)})};b.zip=function(){for(var a=i.call(arguments),c=b.max(b.pluck(a,"length")),d=Array(c),e=0;e<c;e++)d[e]=b.pluck(a,""+e);return d};b.indexOf=function(a,c, +d){if(a==null)return-1;var e;if(d)return d=b.sortedIndex(a,c),a[d]===c?d:-1;if(p&&a.indexOf===p)return a.indexOf(c);for(d=0,e=a.length;d<e;d++)if(d in a&&a[d]===c)return d;return-1};b.lastIndexOf=function(a,b){if(a==null)return-1;if(D&&a.lastIndexOf===D)return a.lastIndexOf(b);for(var d=a.length;d--;)if(d in a&&a[d]===b)return d;return-1};b.range=function(a,b,d){arguments.length<=1&&(b=a||0,a=0);for(var d=arguments[2]||1,e=Math.max(Math.ceil((b-a)/d),0),f=0,g=Array(e);f<e;)g[f++]=a,a+=d;return g}; +var F=function(){};b.bind=function(a,c){var d,e;if(a.bind===s&&s)return s.apply(a,i.call(arguments,1));if(!b.isFunction(a))throw new TypeError;e=i.call(arguments,2);return d=function(){if(!(this instanceof d))return a.apply(c,e.concat(i.call(arguments)));F.prototype=a.prototype;var b=new F,g=a.apply(b,e.concat(i.call(arguments)));return Object(g)===g?g:b}};b.bindAll=function(a){var c=i.call(arguments,1);c.length==0&&(c=b.functions(a));j(c,function(c){a[c]=b.bind(a[c],a)});return a};b.memoize=function(a, +c){var d={};c||(c=b.identity);return function(){var e=c.apply(this,arguments);return b.has(d,e)?d[e]:d[e]=a.apply(this,arguments)}};b.delay=function(a,b){var d=i.call(arguments,2);return setTimeout(function(){return a.apply(a,d)},b)};b.defer=function(a){return b.delay.apply(b,[a,1].concat(i.call(arguments,1)))};b.throttle=function(a,c){var d,e,f,g,h,i=b.debounce(function(){h=g=false},c);return function(){d=this;e=arguments;var b;f||(f=setTimeout(function(){f=null;h&&a.apply(d,e);i()},c));g?h=true: +a.apply(d,e);i();g=true}};b.debounce=function(a,b){var d;return function(){var e=this,f=arguments;clearTimeout(d);d=setTimeout(function(){d=null;a.apply(e,f)},b)}};b.once=function(a){var b=false,d;return function(){if(b)return d;b=true;return d=a.apply(this,arguments)}};b.wrap=function(a,b){return function(){var d=[a].concat(i.call(arguments,0));return b.apply(this,d)}};b.compose=function(){var a=arguments;return function(){for(var b=arguments,d=a.length-1;d>=0;d--)b=[a[d].apply(this,b)];return b[0]}}; +b.after=function(a,b){return a<=0?b():function(){if(--a<1)return b.apply(this,arguments)}};b.keys=J||function(a){if(a!==Object(a))throw new TypeError("Invalid object");var c=[],d;for(d in a)b.has(a,d)&&(c[c.length]=d);return c};b.values=function(a){return b.map(a,b.identity)};b.functions=b.methods=function(a){var c=[],d;for(d in a)b.isFunction(a[d])&&c.push(d);return c.sort()};b.extend=function(a){j(i.call(arguments,1),function(b){for(var d in b)a[d]=b[d]});return a};b.defaults=function(a){j(i.call(arguments, +1),function(b){for(var d in b)a[d]==null&&(a[d]=b[d])});return a};b.clone=function(a){return!b.isObject(a)?a:b.isArray(a)?a.slice():b.extend({},a)};b.tap=function(a,b){b(a);return a};b.isEqual=function(a,b){return q(a,b,[])};b.isEmpty=function(a){if(b.isArray(a)||b.isString(a))return a.length===0;for(var c in a)if(b.has(a,c))return false;return true};b.isElement=function(a){return!!(a&&a.nodeType==1)};b.isArray=o||function(a){return l.call(a)=="[object Array]"};b.isObject=function(a){return a===Object(a)}; +b.isArguments=function(a){return l.call(a)=="[object Arguments]"};if(!b.isArguments(arguments))b.isArguments=function(a){return!(!a||!b.has(a,"callee"))};b.isFunction=function(a){return l.call(a)=="[object Function]"};b.isString=function(a){return l.call(a)=="[object String]"};b.isNumber=function(a){return l.call(a)=="[object Number]"};b.isNaN=function(a){return a!==a};b.isBoolean=function(a){return a===true||a===false||l.call(a)=="[object Boolean]"};b.isDate=function(a){return l.call(a)=="[object Date]"}; +b.isRegExp=function(a){return l.call(a)=="[object RegExp]"};b.isNull=function(a){return a===null};b.isUndefined=function(a){return a===void 0};b.has=function(a,b){return I.call(a,b)};b.noConflict=function(){r._=G;return this};b.identity=function(a){return a};b.times=function(a,b,d){for(var e=0;e<a;e++)b.call(d,e)};b.escape=function(a){return(""+a).replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'").replace(/\//g,"/")};b.mixin=function(a){j(b.functions(a), +function(c){K(c,b[c]=a[c])})};var L=0;b.uniqueId=function(a){var b=L++;return a?a+b:b};b.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var t=/.^/,u=function(a){return a.replace(/\\\\/g,"\\").replace(/\\'/g,"'")};b.template=function(a,c){var d=b.templateSettings,d="var __p=[],print=function(){__p.push.apply(__p,arguments);};with(obj||{}){__p.push('"+a.replace(/\\/g,"\\\\").replace(/'/g,"\\'").replace(d.escape||t,function(a,b){return"',_.escape("+ +u(b)+"),'"}).replace(d.interpolate||t,function(a,b){return"',"+u(b)+",'"}).replace(d.evaluate||t,function(a,b){return"');"+u(b).replace(/[\r\n\t]/g," ")+";__p.push('"}).replace(/\r/g,"\\r").replace(/\n/g,"\\n").replace(/\t/g,"\\t")+"');}return __p.join('');",e=new Function("obj","_",d);return c?e(c,b):function(a){return e.call(this,a,b)}};b.chain=function(a){return b(a).chain()};var m=function(a){this._wrapped=a};b.prototype=m.prototype;var v=function(a,c){return c?b(a).chain():a},K=function(a,c){m.prototype[a]= +function(){var a=i.call(arguments);H.call(a,this._wrapped);return v(c.apply(b,a),this._chain)}};b.mixin(b);j("pop,push,reverse,shift,sort,splice,unshift".split(","),function(a){var b=k[a];m.prototype[a]=function(){var d=this._wrapped;b.apply(d,arguments);var e=d.length;(a=="shift"||a=="splice")&&e===0&&delete d[0];return v(d,this._chain)}});j(["concat","join","slice"],function(a){var b=k[a];m.prototype[a]=function(){return v(b.apply(this._wrapped,arguments),this._chain)}});m.prototype.chain=function(){this._chain= +true;return this};m.prototype.value=function(){return this._wrapped}}).call(this); +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 diff --git a/doc/build/html/_static/websupport.js b/doc/build/html/_static/websupport.js index 98e7f40b6327e673e382068cdfb3bf3674a06cca..005d15569ed9198f0cf0480a042a55606322d780 100644 --- a/doc/build/html/_static/websupport.js +++ b/doc/build/html/_static/websupport.js @@ -4,7 +4,11 @@ * * sphinx.websupport utilities for all documentation. * +<<<<<<< HEAD * :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. +======= + * :copyright: Copyright 2007-2017 by the Sphinx team, see AUTHORS. +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 * :license: BSD, see LICENSE for details. * */ diff --git a/doc/build/html/analysing.html b/doc/build/html/analysing.html index ab0ee24821d7c1aa1641ceaf69e7b58d8bae8a74..a07e3ea8af6312f492aa7a6d441f5fa942fd881a 100644 --- a/doc/build/html/analysing.html +++ b/doc/build/html/analysing.html @@ -1,3 +1,4 @@ +<<<<<<< HEAD <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> @@ -11,6 +12,18 @@ <link rel="stylesheet" href="_static/alabaster.css" type="text/css" /> <link rel="stylesheet" href="_static/pygments.css" type="text/css" /> +======= + +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> + <head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> + <title>Analysing — Navigation Toolbox a0 documentation</title> + <link rel="stylesheet" href="_static/alabaster.css" type="text/css" /> + <link rel="stylesheet" href="_static/pygments.css" type="text/css" /> +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 <script type="text/javascript"> var DOCUMENTATION_OPTIONS = { URL_ROOT: './', @@ -24,7 +37,11 @@ <script type="text/javascript" src="_static/jquery.js"></script> <script type="text/javascript" src="_static/underscore.js"></script> <script type="text/javascript" src="_static/doctools.js"></script> +<<<<<<< HEAD <script type="text/javascript" src="https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script> +======= + <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script> +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 <link rel="index" title="Index" href="genindex.html" /> <link rel="search" title="Search" href="search.html" /> <link rel="next" title="Database" href="database.html" /> @@ -32,10 +49,18 @@ <link rel="stylesheet" href="_static/custom.css" type="text/css" /> +<<<<<<< HEAD <meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" /> </head> <body role="document"> +======= + + <meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" /> + + </head> + <body> +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 <div class="document"> @@ -109,8 +134,13 @@ ©2017, Olivier J.N. Bertrand. | +<<<<<<< HEAD Powered by <a href="http://sphinx-doc.org/">Sphinx 1.5.3</a> & <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.8</a> +======= + Powered by <a href="http://sphinx-doc.org/">Sphinx 1.6.5</a> + & <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.10</a> +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 | <a href="_sources/analysing.rst.txt" diff --git a/doc/build/html/comparing.html b/doc/build/html/comparing.html index fcc2203254c4a474b49aafbd125b66e5318aa43b..190d13e3a674ace466694fa1e549048cb57367c9 100644 --- a/doc/build/html/comparing.html +++ b/doc/build/html/comparing.html @@ -1,3 +1,4 @@ +<<<<<<< HEAD <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> @@ -11,6 +12,18 @@ <link rel="stylesheet" href="_static/alabaster.css" type="text/css" /> <link rel="stylesheet" href="_static/pygments.css" type="text/css" /> +======= + +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> + <head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> + <title>Comparing — Navigation Toolbox a0 documentation</title> + <link rel="stylesheet" href="_static/alabaster.css" type="text/css" /> + <link rel="stylesheet" href="_static/pygments.css" type="text/css" /> +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 <script type="text/javascript"> var DOCUMENTATION_OPTIONS = { URL_ROOT: './', @@ -24,7 +37,11 @@ <script type="text/javascript" src="_static/jquery.js"></script> <script type="text/javascript" src="_static/underscore.js"></script> <script type="text/javascript" src="_static/doctools.js"></script> +<<<<<<< HEAD <script type="text/javascript" src="https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script> +======= + <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script> +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 <link rel="index" title="Index" href="genindex.html" /> <link rel="search" title="Search" href="search.html" /> <link rel="next" title="Computing" href="computing.html" /> @@ -32,10 +49,18 @@ <link rel="stylesheet" href="_static/custom.css" type="text/css" /> +<<<<<<< HEAD <meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" /> </head> <body role="document"> +======= + + <meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" /> + + </head> + <body> +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 <div class="document"> @@ -106,8 +131,13 @@ ©2017, Olivier J.N. Bertrand. | +<<<<<<< HEAD Powered by <a href="http://sphinx-doc.org/">Sphinx 1.5.3</a> & <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.8</a> +======= + Powered by <a href="http://sphinx-doc.org/">Sphinx 1.6.5</a> + & <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.10</a> +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 | <a href="_sources/comparing.rst.txt" diff --git a/doc/build/html/computing.html b/doc/build/html/computing.html index 823a14506dca9cdc1944e5cdd6ceb55f6141caf9..dacccb87c8d6a9f7d35562ca8cb52ae71bce72c1 100644 --- a/doc/build/html/computing.html +++ b/doc/build/html/computing.html @@ -1,3 +1,4 @@ +<<<<<<< HEAD <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> @@ -11,6 +12,18 @@ <link rel="stylesheet" href="_static/alabaster.css" type="text/css" /> <link rel="stylesheet" href="_static/pygments.css" type="text/css" /> +======= + +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> + <head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> + <title>Computing — Navigation Toolbox a0 documentation</title> + <link rel="stylesheet" href="_static/alabaster.css" type="text/css" /> + <link rel="stylesheet" href="_static/pygments.css" type="text/css" /> +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 <script type="text/javascript"> var DOCUMENTATION_OPTIONS = { URL_ROOT: './', @@ -24,7 +37,11 @@ <script type="text/javascript" src="_static/jquery.js"></script> <script type="text/javascript" src="_static/underscore.js"></script> <script type="text/javascript" src="_static/doctools.js"></script> +<<<<<<< HEAD <script type="text/javascript" src="https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script> +======= + <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script> +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 <link rel="index" title="Index" href="genindex.html" /> <link rel="search" title="Search" href="search.html" /> <link rel="next" title="Moving" href="moving.html" /> @@ -32,10 +49,18 @@ <link rel="stylesheet" href="_static/custom.css" type="text/css" /> +<<<<<<< HEAD <meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" /> </head> <body role="document"> +======= + + <meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" /> + + </head> + <body> +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 <div class="document"> @@ -105,8 +130,13 @@ ©2017, Olivier J.N. Bertrand. | +<<<<<<< HEAD Powered by <a href="http://sphinx-doc.org/">Sphinx 1.5.3</a> & <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.8</a> +======= + Powered by <a href="http://sphinx-doc.org/">Sphinx 1.6.5</a> + & <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.10</a> +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 | <a href="_sources/computing.rst.txt" diff --git a/doc/build/html/database.html b/doc/build/html/database.html index 5290e2e42ea597f7db773bd80a6f738870442cb3..17375fbfa9c6f3a366390601d7c62080e3845fb2 100644 --- a/doc/build/html/database.html +++ b/doc/build/html/database.html @@ -1,3 +1,4 @@ +<<<<<<< HEAD <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> @@ -11,6 +12,18 @@ <link rel="stylesheet" href="_static/alabaster.css" type="text/css" /> <link rel="stylesheet" href="_static/pygments.css" type="text/css" /> +======= + +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> + <head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> + <title>Database — Navigation Toolbox a0 documentation</title> + <link rel="stylesheet" href="_static/alabaster.css" type="text/css" /> + <link rel="stylesheet" href="_static/pygments.css" type="text/css" /> +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 <script type="text/javascript"> var DOCUMENTATION_OPTIONS = { URL_ROOT: './', @@ -24,17 +37,29 @@ <script type="text/javascript" src="_static/jquery.js"></script> <script type="text/javascript" src="_static/underscore.js"></script> <script type="text/javascript" src="_static/doctools.js"></script> +<<<<<<< HEAD <script type="text/javascript" src="https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script> +======= + <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script> +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 <link rel="index" title="Index" href="genindex.html" /> <link rel="search" title="Search" href="search.html" /> <link rel="prev" title="Analysing" href="analysing.html" /> <link rel="stylesheet" href="_static/custom.css" type="text/css" /> +<<<<<<< HEAD <meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" /> </head> <body role="document"> +======= + + <meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" /> + + </head> + <body> +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 <div class="document"> @@ -42,11 +67,19 @@ <div class="bodywrapper"> <div class="body" role="main"> +<<<<<<< HEAD <div class="section" id="module-database"> <span id="database"></span><h1>Database<a class="headerlink" href="#module-database" title="Permalink to this headline">¶</a></h1> <p>Database are generated by the rendering module, and contains all images and there corresponding position-orientations.</p> <ul class="simple"> <li>position_orientation: containing all position and orientation of where images were rendered. The position-orientation is described by [‘x’,’y’,’z’,’alpha_0’,’alpha_1’,’alpha_2’]</li> +======= + <div class="section" id="module-navipy.database"> +<span id="database"></span><h1>Database<a class="headerlink" href="#module-navipy.database" title="Permalink to this headline">¶</a></h1> +<p>Database are generated by the rendering module, and contains all images and there corresponding position-orientations.</p> +<ul class="simple"> +<li>position_orientation: containing all position and orientation of where images were rendered. The position-orientation is described by [‘x’,’y’,’z’,’alpha_0’,’alpha_1’,’alpha_2’]</li> +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 <li>image: containing all images ever rendered. Each channel of each image are normalised, so to use the full coding range.</li> <li>normalisation: the normalisation constantes</li> </ul> @@ -145,8 +178,13 @@ ©2017, Olivier J.N. Bertrand. | +<<<<<<< HEAD Powered by <a href="http://sphinx-doc.org/">Sphinx 1.5.3</a> & <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.8</a> +======= + Powered by <a href="http://sphinx-doc.org/">Sphinx 1.6.5</a> + & <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.10</a> +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 | <a href="_sources/database.rst.txt" diff --git a/doc/build/html/example/database/load_image_posorient.py b/doc/build/html/example/database/load_image_posorient.py index a0662123dcf2ceb2bca56c33752ca8c81e07cf5c..6b541b666a430872d89887850abc89693e122d7d 100644 --- a/doc/build/html/example/database/load_image_posorient.py +++ b/doc/build/html/example/database/load_image_posorient.py @@ -1,7 +1,11 @@ import pandas as pd import numpy as np import matplotlib.pyplot as plt +<<<<<<< HEAD from database import DataBaseLoad +======= +from navipy.database import DataBaseLoad +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 import os diff --git a/doc/build/html/example/database/load_image_rowid.py b/doc/build/html/example/database/load_image_rowid.py index cacf4139b8c8b2737b15000e8c42006913edcda5..1f9a43c4b86cbf85a025e6dbbadd7b87dc8ff61a 100644 --- a/doc/build/html/example/database/load_image_rowid.py +++ b/doc/build/html/example/database/load_image_rowid.py @@ -1,6 +1,10 @@ import numpy as np import matplotlib.pyplot as plt +<<<<<<< HEAD from database import DataBaseLoad +======= +from navipy.database import DataBaseLoad +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 import os diff --git a/doc/build/html/example/processing/apcv.py b/doc/build/html/example/processing/apcv.py index ecca32ce52f4daa2598f22c9ffdbf5c98f209ce6..dda72e09c1325118bd34e1e5f4d806086b4968de 100644 --- a/doc/build/html/example/processing/apcv.py +++ b/doc/build/html/example/processing/apcv.py @@ -1,6 +1,11 @@ import matplotlib.pyplot as plt +<<<<<<< HEAD from database import DataBaseLoad import processing +======= +from navipy.database import DataBaseLoad +import navipy.processing as processing +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 import os import numpy as np diff --git a/doc/build/html/example/processing/contrast_weighted_nearness.py b/doc/build/html/example/processing/contrast_weighted_nearness.py index 92066428cbe39cedf98954f34932eebb9c16d36e..6d66414e06ecbcd8f807f42fd547fc41a954b075 100644 --- a/doc/build/html/example/processing/contrast_weighted_nearness.py +++ b/doc/build/html/example/processing/contrast_weighted_nearness.py @@ -1,6 +1,11 @@ import matplotlib.pyplot as plt +<<<<<<< HEAD from database import DataBaseLoad import processing +======= +from navipy.database import DataBaseLoad +import navipy.processing as processing +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 import os diff --git a/doc/build/html/example/processing/michelson_contrast.py b/doc/build/html/example/processing/michelson_contrast.py index 85a8f1018f984960639b1c826243ed7f1c27f872..a4fe479171b99c7ea124d512aeaa7295df21d283 100644 --- a/doc/build/html/example/processing/michelson_contrast.py +++ b/doc/build/html/example/processing/michelson_contrast.py @@ -1,6 +1,11 @@ import matplotlib.pyplot as plt +<<<<<<< HEAD from database import DataBaseLoad import processing +======= +from navipy.database import DataBaseLoad +import navipy.processing as processing +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 import os diff --git a/doc/build/html/example/processing/pcv.py b/doc/build/html/example/processing/pcv.py index ad89b8be731c5930decfc913641f3c438a23a846..88b41ac750638ce8a8609699da77902f5acb4c36 100644 --- a/doc/build/html/example/processing/pcv.py +++ b/doc/build/html/example/processing/pcv.py @@ -1,6 +1,11 @@ # import matplotlib.pyplot as plt +<<<<<<< HEAD from database import DataBaseLoad import processing +======= +from navipy.database import DataBaseLoad +import navipy.processing as processing +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 import os diff --git a/doc/build/html/example/processing/scene.py b/doc/build/html/example/processing/scene.py index be6d1d36cbdbd62c49f22b408a388be271483ba4..286abb840d524264292e927f702785f50ad45200 100644 --- a/doc/build/html/example/processing/scene.py +++ b/doc/build/html/example/processing/scene.py @@ -1,7 +1,12 @@ import numpy as np import matplotlib.pyplot as plt +<<<<<<< HEAD from database import DataBaseLoad import processing +======= +from navipy.database import DataBaseLoad +import navipy.processing as processing +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 import os diff --git a/doc/build/html/example/processing/skyline.py b/doc/build/html/example/processing/skyline.py index a178e8f7580e5a2f337f53f903afbce09e135b9d..4be700819292a3cc1451ef04ef74bf7b45ddb508 100644 --- a/doc/build/html/example/processing/skyline.py +++ b/doc/build/html/example/processing/skyline.py @@ -1,6 +1,11 @@ import matplotlib.pyplot as plt +<<<<<<< HEAD from database import DataBaseLoad import processing +======= +from navipy.database import DataBaseLoad +import navipy.processing as processing +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 import os diff --git a/doc/build/html/genindex.html b/doc/build/html/genindex.html index fab698b8dd8f124a6f47e994261d370a441dc19f..5bb3ce1ed3ea05acb52fe0c0570dc7938fc73c6e 100644 --- a/doc/build/html/genindex.html +++ b/doc/build/html/genindex.html @@ -1,4 +1,5 @@ +<<<<<<< HEAD <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> @@ -12,6 +13,18 @@ <link rel="stylesheet" href="_static/alabaster.css" type="text/css" /> <link rel="stylesheet" href="_static/pygments.css" type="text/css" /> +======= + +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> + <head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> + <title>Index — Navigation Toolbox a0 documentation</title> + <link rel="stylesheet" href="_static/alabaster.css" type="text/css" /> + <link rel="stylesheet" href="_static/pygments.css" type="text/css" /> +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 <script type="text/javascript"> var DOCUMENTATION_OPTIONS = { URL_ROOT: './', @@ -25,16 +38,28 @@ <script type="text/javascript" src="_static/jquery.js"></script> <script type="text/javascript" src="_static/underscore.js"></script> <script type="text/javascript" src="_static/doctools.js"></script> +<<<<<<< HEAD <script type="text/javascript" src="https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script> +======= + <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script> +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 <link rel="index" title="Index" href="#" /> <link rel="search" title="Search" href="search.html" /> <link rel="stylesheet" href="_static/custom.css" type="text/css" /> +<<<<<<< HEAD <meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" /> </head> <body role="document"> +======= + + <meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" /> + + </head> + <body> +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 <div class="document"> @@ -48,8 +73,13 @@ <div class="genindex-jumpbox"> <a href="#A"><strong>A</strong></a> | <a href="#C"><strong>C</strong></a> +<<<<<<< HEAD | <a href="#D"><strong>D</strong></a> | <a href="#M"><strong>M</strong></a> +======= + | <a href="#M"><strong>M</strong></a> + | <a href="#N"><strong>N</strong></a> +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 | <a href="#O"><strong>O</strong></a> | <a href="#P"><strong>P</strong></a> | <a href="#S"><strong>S</strong></a> @@ -58,7 +88,11 @@ <h2 id="A">A</h2> <table style="width: 100%" class="indextable genindextable"><tr> <td style="width: 33%; vertical-align: top;"><ul> +<<<<<<< HEAD <li><a href="processing.html#processing.apcv">apcv() (in module processing)</a> +======= + <li><a href="processing.html#navipy.processing.apcv">apcv() (in module navipy.processing)</a> +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 </li> </ul></td> </tr></table> @@ -66,23 +100,45 @@ <h2 id="C">C</h2> <table style="width: 100%" class="indextable genindextable"><tr> <td style="width: 33%; vertical-align: top;"><ul> +<<<<<<< HEAD <li><a href="processing.html#processing.contrast_weighted_nearness">contrast_weighted_nearness() (in module processing)</a> +======= + <li><a href="processing.html#navipy.processing.contrast_weighted_nearness">contrast_weighted_nearness() (in module navipy.processing)</a> +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 </li> </ul></td> </tr></table> +<<<<<<< HEAD <h2 id="D">D</h2> <table style="width: 100%" class="indextable genindextable"><tr> <td style="width: 33%; vertical-align: top;"><ul> <li><a href="database.html#module-database">database (module)</a> +======= +<h2 id="M">M</h2> +<table style="width: 100%" class="indextable genindextable"><tr> + <td style="width: 33%; vertical-align: top;"><ul> + <li><a href="processing.html#navipy.processing.michelson_contrast">michelson_contrast() (in module navipy.processing)</a> +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 </li> </ul></td> </tr></table> +<<<<<<< HEAD <h2 id="M">M</h2> <table style="width: 100%" class="indextable genindextable"><tr> <td style="width: 33%; vertical-align: top;"><ul> <li><a href="processing.html#processing.michelson_contrast">michelson_contrast() (in module processing)</a> +======= +<h2 id="N">N</h2> +<table style="width: 100%" class="indextable genindextable"><tr> + <td style="width: 33%; vertical-align: top;"><ul> + <li><a href="database.html#module-navipy.database">navipy.database (module)</a> +</li> + </ul></td> + <td style="width: 33%; vertical-align: top;"><ul> + <li><a href="processing.html#module-navipy.processing">navipy.processing (module)</a> +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 </li> </ul></td> </tr></table> @@ -90,7 +146,11 @@ <h2 id="O">O</h2> <table style="width: 100%" class="indextable genindextable"><tr> <td style="width: 33%; vertical-align: top;"><ul> +<<<<<<< HEAD <li><a href="processing.html#processing.optic_flow">optic_flow() (in module processing)</a> +======= + <li><a href="processing.html#navipy.processing.optic_flow">optic_flow() (in module navipy.processing)</a> +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 </li> </ul></td> </tr></table> @@ -98,11 +158,15 @@ <h2 id="P">P</h2> <table style="width: 100%" class="indextable genindextable"><tr> <td style="width: 33%; vertical-align: top;"><ul> +<<<<<<< HEAD <li><a href="processing.html#processing.pcv">pcv() (in module processing)</a> </li> </ul></td> <td style="width: 33%; vertical-align: top;"><ul> <li><a href="processing.html#module-processing">processing (module)</a> +======= + <li><a href="processing.html#navipy.processing.pcv">pcv() (in module navipy.processing)</a> +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 </li> </ul></td> </tr></table> @@ -110,11 +174,19 @@ <h2 id="S">S</h2> <table style="width: 100%" class="indextable genindextable"><tr> <td style="width: 33%; vertical-align: top;"><ul> +<<<<<<< HEAD <li><a href="processing.html#processing.scene">scene() (in module processing)</a> </li> </ul></td> <td style="width: 33%; vertical-align: top;"><ul> <li><a href="processing.html#processing.skyline">skyline() (in module processing)</a> +======= + <li><a href="processing.html#navipy.processing.scene">scene() (in module navipy.processing)</a> +</li> + </ul></td> + <td style="width: 33%; vertical-align: top;"><ul> + <li><a href="processing.html#navipy.processing.skyline">skyline() (in module navipy.processing)</a> +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 </li> </ul></td> </tr></table> @@ -153,8 +225,13 @@ ©2017, Olivier J.N. Bertrand. | +<<<<<<< HEAD Powered by <a href="http://sphinx-doc.org/">Sphinx 1.5.3</a> & <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.8</a> +======= + Powered by <a href="http://sphinx-doc.org/">Sphinx 1.6.5</a> + & <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.10</a> +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 </div> diff --git a/doc/build/html/gettingstarted.html b/doc/build/html/gettingstarted.html index 641db624cba7dae4af659982e09ee026b788d541..5c93fa8eedd29382b99daa9781c142c39e59a502 100644 --- a/doc/build/html/gettingstarted.html +++ b/doc/build/html/gettingstarted.html @@ -1,3 +1,4 @@ +<<<<<<< HEAD <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> @@ -11,6 +12,18 @@ <link rel="stylesheet" href="_static/alabaster.css" type="text/css" /> <link rel="stylesheet" href="_static/pygments.css" type="text/css" /> +======= + +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> + <head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> + <title>Getting started — Navigation Toolbox a0 documentation</title> + <link rel="stylesheet" href="_static/alabaster.css" type="text/css" /> + <link rel="stylesheet" href="_static/pygments.css" type="text/css" /> +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 <script type="text/javascript"> var DOCUMENTATION_OPTIONS = { URL_ROOT: './', @@ -24,7 +37,11 @@ <script type="text/javascript" src="_static/jquery.js"></script> <script type="text/javascript" src="_static/underscore.js"></script> <script type="text/javascript" src="_static/doctools.js"></script> +<<<<<<< HEAD <script type="text/javascript" src="https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script> +======= + <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script> +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 <link rel="index" title="Index" href="genindex.html" /> <link rel="search" title="Search" href="search.html" /> <link rel="next" title="Rendering" href="rendering.html" /> @@ -32,10 +49,18 @@ <link rel="stylesheet" href="_static/custom.css" type="text/css" /> +<<<<<<< HEAD <meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" /> </head> <body role="document"> +======= + + <meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" /> + + </head> + <body> +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 <div class="document"> @@ -56,7 +81,11 @@ <h3>Related Topics</h3> <ul> <li><a href="index.html">Documentation overview</a><ul> +<<<<<<< HEAD <li>Previous: <a href="index.html" title="previous chapter">Welcome to Navigation Toolbox’s documentation!</a></li> +======= + <li>Previous: <a href="index.html" title="previous chapter">Welcome to Navigation Toolbox’s documentation!</a></li> +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 <li>Next: <a href="rendering.html" title="next chapter">Rendering</a></li> </ul></li> </ul> @@ -86,8 +115,13 @@ ©2017, Olivier J.N. Bertrand. | +<<<<<<< HEAD Powered by <a href="http://sphinx-doc.org/">Sphinx 1.5.3</a> & <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.8</a> +======= + Powered by <a href="http://sphinx-doc.org/">Sphinx 1.6.5</a> + & <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.10</a> +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 | <a href="_sources/gettingstarted.rst.txt" diff --git a/doc/build/html/index.html b/doc/build/html/index.html index a8bfa13c1b6cc6fcc49e3f72bb7aa467eda41934..2fdb77fdc7da7e6d6ef9917dadbd6fe32b48b484 100644 --- a/doc/build/html/index.html +++ b/doc/build/html/index.html @@ -1,3 +1,4 @@ +<<<<<<< HEAD <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> @@ -11,6 +12,18 @@ <link rel="stylesheet" href="_static/alabaster.css" type="text/css" /> <link rel="stylesheet" href="_static/pygments.css" type="text/css" /> +======= + +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> + <head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> + <title>Welcome to Navigation Toolbox’s documentation! — Navigation Toolbox a0 documentation</title> + <link rel="stylesheet" href="_static/alabaster.css" type="text/css" /> + <link rel="stylesheet" href="_static/pygments.css" type="text/css" /> +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 <script type="text/javascript"> var DOCUMENTATION_OPTIONS = { URL_ROOT: './', @@ -24,17 +37,29 @@ <script type="text/javascript" src="_static/jquery.js"></script> <script type="text/javascript" src="_static/underscore.js"></script> <script type="text/javascript" src="_static/doctools.js"></script> +<<<<<<< HEAD <script type="text/javascript" src="https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script> +======= + <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script> +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 <link rel="index" title="Index" href="genindex.html" /> <link rel="search" title="Search" href="search.html" /> <link rel="next" title="Getting started" href="gettingstarted.html" /> <link rel="stylesheet" href="_static/custom.css" type="text/css" /> +<<<<<<< HEAD <meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" /> </head> <body role="document"> +======= + + <meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" /> + + </head> + <body> +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 <div class="document"> @@ -43,7 +68,11 @@ <div class="body" role="main"> <div class="section" id="welcome-to-navigation-toolbox-s-documentation"> +<<<<<<< HEAD <h1>Welcome to Navigation Toolbox’s documentation!<a class="headerlink" href="#welcome-to-navigation-toolbox-s-documentation" title="Permalink to this headline">¶</a></h1> +======= +<h1>Welcome to Navigation Toolbox’s documentation!<a class="headerlink" href="#welcome-to-navigation-toolbox-s-documentation" title="Permalink to this headline">¶</a></h1> +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 <div class="toctree-wrapper compound"> <ul> <li class="toctree-l1"><a class="reference internal" href="gettingstarted.html">Getting started</a></li> @@ -74,7 +103,11 @@ <div class="sphinxsidebarwrapper"> <h3><a href="#">Table Of Contents</a></h3> <ul> +<<<<<<< HEAD <li><a class="reference internal" href="#">Welcome to Navigation Toolbox’s documentation!</a></li> +======= +<li><a class="reference internal" href="#">Welcome to Navigation Toolbox’s documentation!</a></li> +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 <li><a class="reference internal" href="#indices-and-tables">Indices and tables</a></li> </ul> <div class="relations"> @@ -110,8 +143,13 @@ ©2017, Olivier J.N. Bertrand. | +<<<<<<< HEAD Powered by <a href="http://sphinx-doc.org/">Sphinx 1.5.3</a> & <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.8</a> +======= + Powered by <a href="http://sphinx-doc.org/">Sphinx 1.6.5</a> + & <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.10</a> +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 | <a href="_sources/index.rst.txt" diff --git a/doc/build/html/moving.html b/doc/build/html/moving.html index 785174bc38f77d82944ea0c6730201821debe4c6..4244f13360c86b736981c3290f65ab4537589a03 100644 --- a/doc/build/html/moving.html +++ b/doc/build/html/moving.html @@ -1,3 +1,4 @@ +<<<<<<< HEAD <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> @@ -11,6 +12,18 @@ <link rel="stylesheet" href="_static/alabaster.css" type="text/css" /> <link rel="stylesheet" href="_static/pygments.css" type="text/css" /> +======= + +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> + <head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> + <title>Moving — Navigation Toolbox a0 documentation</title> + <link rel="stylesheet" href="_static/alabaster.css" type="text/css" /> + <link rel="stylesheet" href="_static/pygments.css" type="text/css" /> +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 <script type="text/javascript"> var DOCUMENTATION_OPTIONS = { URL_ROOT: './', @@ -24,7 +37,11 @@ <script type="text/javascript" src="_static/jquery.js"></script> <script type="text/javascript" src="_static/underscore.js"></script> <script type="text/javascript" src="_static/doctools.js"></script> +<<<<<<< HEAD <script type="text/javascript" src="https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script> +======= + <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script> +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 <link rel="index" title="Index" href="genindex.html" /> <link rel="search" title="Search" href="search.html" /> <link rel="next" title="Analysing" href="analysing.html" /> @@ -32,10 +49,18 @@ <link rel="stylesheet" href="_static/custom.css" type="text/css" /> +<<<<<<< HEAD <meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" /> </head> <body role="document"> +======= + + <meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" /> + + </head> + <body> +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 <div class="document"> @@ -102,8 +127,13 @@ ©2017, Olivier J.N. Bertrand. | +<<<<<<< HEAD Powered by <a href="http://sphinx-doc.org/">Sphinx 1.5.3</a> & <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.8</a> +======= + Powered by <a href="http://sphinx-doc.org/">Sphinx 1.6.5</a> + & <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.10</a> +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 | <a href="_sources/moving.rst.txt" diff --git a/doc/build/html/processing.html b/doc/build/html/processing.html index 8e59974e76903761880c01be3231c8a1e1a45bab..e3dbc64b063ecad54a8cbf277ff1a38be1635077 100644 --- a/doc/build/html/processing.html +++ b/doc/build/html/processing.html @@ -1,3 +1,4 @@ +<<<<<<< HEAD <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> @@ -11,6 +12,18 @@ <link rel="stylesheet" href="_static/alabaster.css" type="text/css" /> <link rel="stylesheet" href="_static/pygments.css" type="text/css" /> +======= + +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> + <head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> + <title>Processing a scene — Navigation Toolbox a0 documentation</title> + <link rel="stylesheet" href="_static/alabaster.css" type="text/css" /> + <link rel="stylesheet" href="_static/pygments.css" type="text/css" /> +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 <script type="text/javascript"> var DOCUMENTATION_OPTIONS = { URL_ROOT: './', @@ -24,7 +37,11 @@ <script type="text/javascript" src="_static/jquery.js"></script> <script type="text/javascript" src="_static/underscore.js"></script> <script type="text/javascript" src="_static/doctools.js"></script> +<<<<<<< HEAD <script type="text/javascript" src="https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script> +======= + <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script> +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 <link rel="index" title="Index" href="genindex.html" /> <link rel="search" title="Search" href="search.html" /> <link rel="next" title="Comparing" href="comparing.html" /> @@ -32,10 +49,18 @@ <link rel="stylesheet" href="_static/custom.css" type="text/css" /> +<<<<<<< HEAD <meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" /> </head> <body role="document"> +======= + + <meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" /> + + </head> + <body> +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 <div class="document"> @@ -43,8 +68,13 @@ <div class="bodywrapper"> <div class="body" role="main"> +<<<<<<< HEAD <div class="section" id="module-processing"> <span id="processing-a-scene"></span><h1>Processing a scene<a class="headerlink" href="#module-processing" title="Permalink to this headline">¶</a></h1> +======= + <div class="section" id="module-navipy.processing"> +<span id="processing-a-scene"></span><h1>Processing a scene<a class="headerlink" href="#module-navipy.processing" title="Permalink to this headline">¶</a></h1> +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 <p>The scene processing part of the toolbox defines methodes to transform an image into a place code in the sense of Basten and Mallot (2010).</p> @@ -86,6 +116,7 @@ Therefore ibs and obs have 4 and 3 dimension, respectively.</p> <div class="section" id="scene"> <h2>Scene<a class="headerlink" href="#scene" title="Permalink to this headline">¶</a></h2> <dl class="function"> +<<<<<<< HEAD <dt id="processing.scene"> <code class="descclassname">processing.</code><code class="descname">scene</code><span class="sig-paren">(</span><em>database</em>, <em>posorient=None</em>, <em>rowid=None</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/processing.html#scene"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#processing.scene" title="Permalink to this definition">¶</a></dt> <dd><p>Return a scene at a position orientation or given rowid @@ -102,6 +133,26 @@ in a given database.</p> <tr class="field-odd field"><th class="field-name">returns:</th><td class="field-body">a scene [elevation, azimuth, channel, 1] or [ommatidia,channel,1].</td> </tr> <tr class="field-even field"><th class="field-name">rtype:</th><td class="field-body">np.ndarray</td> +======= +<dt id="navipy.processing.scene"> +<code class="descclassname">navipy.processing.</code><code class="descname">scene</code><span class="sig-paren">(</span><em>database</em>, <em>posorient=None</em>, <em>rowid=None</em><span class="sig-paren">)</span><a class="headerlink" href="#navipy.processing.scene" title="Permalink to this definition">¶</a></dt> +<dd><p>Return a scene at a position orientation or given rowid in a given database.</p> +<table class="docutils field-list" frame="void" rules="none"> +<col class="field-name" /> +<col class="field-body" /> +<tbody valign="top"> +<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple"> +<li><strong>database</strong> – a DataBaseLoad class :param posorient: a pandas Series with index: [‘x’,’y’,’z’,’alpha_0,’alpha_1,’alpha_2’] (default None, i.e. not used)</li> +<li><strong>rowid</strong> – a row identification integer for directly reading in the database (default None, i.e. not used).</li> +</ul> +</td> +</tr> +<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first">a scene [elevation, azimuth, channel, 1] or [ommatidia,channel,1].</p> +</td> +</tr> +<tr class="field-odd field"><th class="field-name">Return type:</th><td class="field-body"><p class="first last">np.ndarray</p> +</td> +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 </tr> </tbody> </table> @@ -113,13 +164,17 @@ in a given database.</p> <div class="figure"> <img alt="_images/scene.png" src="_images/scene.png" /> </div> +<<<<<<< HEAD </div></blockquote> +======= +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 </dd></dl> </div> <div class="section" id="skyline"> <h2>Skyline<a class="headerlink" href="#skyline" title="Permalink to this headline">¶</a></h2> <dl class="function"> +<<<<<<< HEAD <dt id="processing.skyline"> <code class="descclassname">processing.</code><code class="descname">skyline</code><span class="sig-paren">(</span><em>scene</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/processing.html#skyline"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#processing.skyline" title="Permalink to this definition">¶</a></dt> <dd><p>Return the average along the elevation of a scene</p> @@ -135,6 +190,14 @@ in a given database.</p> </tr> </tbody> </table> +======= +<dt id="navipy.processing.skyline"> +<code class="descclassname">navipy.processing.</code><code class="descname">skyline</code><span class="sig-paren">(</span><em>scene</em><span class="sig-paren">)</span><a class="headerlink" href="#navipy.processing.skyline" title="Permalink to this definition">¶</a></dt> +<dd><p>Return the average along the elevation of a scene +:param scene: the scenery at a given location (a 4d numpy array) +:returns: the skyline [1,azimuth,channel,1] +:rtype: np.ndarray</p> +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">rowid</span> <span class="o">=</span> <span class="mi">12</span> <span class="n">my_scene</span> <span class="o">=</span> <span class="n">processing</span><span class="o">.</span><span class="n">scene</span><span class="p">(</span><span class="n">mydb</span><span class="p">,</span> <span class="n">rowid</span><span class="o">=</span><span class="n">rowid</span><span class="p">)</span> <span class="n">my_skyline</span> <span class="o">=</span> <span class="n">processing</span><span class="o">.</span><span class="n">skyline</span><span class="p">(</span><span class="n">my_scene</span><span class="p">)</span> @@ -150,8 +213,13 @@ in a given database.</p> <div class="section" id="michelson-contrast"> <h2>Michelson-contrast<a class="headerlink" href="#michelson-contrast" title="Permalink to this headline">¶</a></h2> <dl class="function"> +<<<<<<< HEAD <dt id="processing.michelson_contrast"> <code class="descclassname">processing.</code><code class="descname">michelson_contrast</code><span class="sig-paren">(</span><em>scene</em>, <em>size=3</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/processing.html#michelson_contrast"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#processing.michelson_contrast" title="Permalink to this definition">¶</a></dt> +======= +<dt id="navipy.processing.michelson_contrast"> +<code class="descclassname">navipy.processing.</code><code class="descname">michelson_contrast</code><span class="sig-paren">(</span><em>scene</em>, <em>size=3</em><span class="sig-paren">)</span><a class="headerlink" href="#navipy.processing.michelson_contrast" title="Permalink to this definition">¶</a></dt> +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 <dd><p>Return the michelson constrast</p> <div class="math"> \[\frac{I_\text{max}-I_\text{min}}{I_\text{max}+I_\text{min}}\]</div> @@ -161,8 +229,13 @@ in a given database.</p> <col class="field-body" /> <tbody valign="top"> <tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple"> +<<<<<<< HEAD <li><strong>scene</strong> – an image based scene</li> <li><strong>size</strong> – the size of the region to calculate the maximum and minimum of the local image intensity</li> +======= +<li><strong>scene</strong> – an image based scene</li> +<li><strong>size</strong> – the size of the region to calculate the maximum and minimum of the local image intensity</li> +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 </ul> </td> </tr> @@ -189,17 +262,28 @@ in a given database.</p> <div class="section" id="contrast-weighted-nearness"> <h2>Contrast-weighted-nearness<a class="headerlink" href="#contrast-weighted-nearness" title="Permalink to this headline">¶</a></h2> <dl class="function"> +<<<<<<< HEAD <dt id="processing.contrast_weighted_nearness"> <code class="descclassname">processing.</code><code class="descname">contrast_weighted_nearness</code><span class="sig-paren">(</span><em>scene</em>, <em>contrast_size=3</em>, <em>distance_channel=3</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/processing.html#contrast_weighted_nearness"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#processing.contrast_weighted_nearness" title="Permalink to this definition">¶</a></dt> +======= +<dt id="navipy.processing.contrast_weighted_nearness"> +<code class="descclassname">navipy.processing.</code><code class="descname">contrast_weighted_nearness</code><span class="sig-paren">(</span><em>scene</em>, <em>contrast_size=3</em>, <em>distance_channel=3</em><span class="sig-paren">)</span><a class="headerlink" href="#navipy.processing.contrast_weighted_nearness" title="Permalink to this definition">¶</a></dt> +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 <dd><p>Return the michelson contrast wheighted nearness</p> <table class="docutils field-list" frame="void" rules="none"> <col class="field-name" /> <col class="field-body" /> <tbody valign="top"> <tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first last simple"> +<<<<<<< HEAD <li><strong>scene</strong> – an image based scene</li> <li><strong>contrast_size</strong> – the size of the region to calculate the maximum and minimum of the local image intensity in the michelson-contrast.</li> <li><strong>distance_channel</strong> – the index of the distance-channel.</li> +======= +<li><strong>scene</strong> – an image based scene</li> +<li><strong>contrast_size</strong> – the size of the region to calculate the maximum and minimum of the local image intensity in the michelson-contrast.</li> +<li><strong>distance_channel</strong> – the index of the distance-channel.</li> +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 </ul> </td> </tr> @@ -220,16 +304,26 @@ in a given database.</p> <div class="section" id="place-code-vectors"> <h2>Place-code vectors<a class="headerlink" href="#place-code-vectors" title="Permalink to this headline">¶</a></h2> <dl class="function"> +<<<<<<< HEAD <dt id="processing.pcv"> <code class="descclassname">processing.</code><code class="descname">pcv</code><span class="sig-paren">(</span><em>place_code</em>, <em>viewing_directions</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/processing.html#pcv"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#processing.pcv" title="Permalink to this definition">¶</a></dt> +======= +<dt id="navipy.processing.pcv"> +<code class="descclassname">navipy.processing.</code><code class="descname">pcv</code><span class="sig-paren">(</span><em>place_code</em>, <em>viewing_directions</em><span class="sig-paren">)</span><a class="headerlink" href="#navipy.processing.pcv" title="Permalink to this definition">¶</a></dt> +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 <dd><p>Place code vectors</p> <table class="docutils field-list" frame="void" rules="none"> <col class="field-name" /> <col class="field-body" /> <tbody valign="top"> <tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple"> +<<<<<<< HEAD <li><strong>place_code</strong> – the place code at a given location (e.g. an ibs scene)</li> <li><strong>viewing_directions</strong> – viewing direction of each pixel</li> +======= +<li><strong>place_code</strong> – the place code at a given location (e.g. an ibs scene)</li> +<li><strong>viewing_directions</strong> – viewing direction of each pixel</li> +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 </ul> </td> </tr> @@ -253,16 +347,26 @@ in a given database.</p> <div class="section" id="average-place-code-vector"> <h2>Average place-code vector<a class="headerlink" href="#average-place-code-vector" title="Permalink to this headline">¶</a></h2> <dl class="function"> +<<<<<<< HEAD <dt id="processing.apcv"> <code class="descclassname">processing.</code><code class="descname">apcv</code><span class="sig-paren">(</span><em>place_code</em>, <em>viewing_directions</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/processing.html#apcv"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#processing.apcv" title="Permalink to this definition">¶</a></dt> +======= +<dt id="navipy.processing.apcv"> +<code class="descclassname">navipy.processing.</code><code class="descname">apcv</code><span class="sig-paren">(</span><em>place_code</em>, <em>viewing_directions</em><span class="sig-paren">)</span><a class="headerlink" href="#navipy.processing.apcv" title="Permalink to this definition">¶</a></dt> +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 <dd><p>Calculate the average scene vector</p> <table class="docutils field-list" frame="void" rules="none"> <col class="field-name" /> <col class="field-body" /> <tbody valign="top"> <tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple"> +<<<<<<< HEAD <li><strong>place_code</strong> – the place code at a given location (e.g. an ibs scene)</li> <li><strong>viewing_directions</strong> – viewing direction of each pixel</li> +======= +<li><strong>place_code</strong> – the place code at a given location (e.g. an ibs scene)</li> +<li><strong>viewing_directions</strong> – viewing direction of each pixel</li> +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 </ul> </td> </tr> @@ -289,8 +393,13 @@ in a given database.</p> <div class="section" id="optic-flow"> <h2>Optic-flow<a class="headerlink" href="#optic-flow" title="Permalink to this headline">¶</a></h2> <dl class="function"> +<<<<<<< HEAD <dt id="processing.optic_flow"> <code class="descclassname">processing.</code><code class="descname">optic_flow</code><span class="sig-paren">(</span><em>place_code</em>, <em>viewing_directions</em>, <em>velocity</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/processing.html#optic_flow"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#processing.optic_flow" title="Permalink to this definition">¶</a></dt> +======= +<dt id="navipy.processing.optic_flow"> +<code class="descclassname">navipy.processing.</code><code class="descname">optic_flow</code><span class="sig-paren">(</span><em>place_code</em>, <em>viewing_directions</em>, <em>velocity</em><span class="sig-paren">)</span><a class="headerlink" href="#navipy.processing.optic_flow" title="Permalink to this definition">¶</a></dt> +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 <dd><p>NOT IMPLEMENTED</p> </dd></dl> @@ -350,8 +459,13 @@ in a given database.</p> ©2017, Olivier J.N. Bertrand. | +<<<<<<< HEAD Powered by <a href="http://sphinx-doc.org/">Sphinx 1.5.3</a> & <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.8</a> +======= + Powered by <a href="http://sphinx-doc.org/">Sphinx 1.6.5</a> + & <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.10</a> +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 | <a href="_sources/processing.rst.txt" diff --git a/doc/build/html/py-modindex.html b/doc/build/html/py-modindex.html index 9f87949cb1daa21975855eb7aa51ee92aca5cd93..a78947590b5733b562579ea39637dd382462e0a1 100644 --- a/doc/build/html/py-modindex.html +++ b/doc/build/html/py-modindex.html @@ -1,3 +1,4 @@ +<<<<<<< HEAD <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> @@ -11,6 +12,18 @@ <link rel="stylesheet" href="_static/alabaster.css" type="text/css" /> <link rel="stylesheet" href="_static/pygments.css" type="text/css" /> +======= + +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> + <head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> + <title>Python Module Index — Navigation Toolbox a0 documentation</title> + <link rel="stylesheet" href="_static/alabaster.css" type="text/css" /> + <link rel="stylesheet" href="_static/pygments.css" type="text/css" /> +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 <script type="text/javascript"> var DOCUMENTATION_OPTIONS = { URL_ROOT: './', @@ -24,13 +37,18 @@ <script type="text/javascript" src="_static/jquery.js"></script> <script type="text/javascript" src="_static/underscore.js"></script> <script type="text/javascript" src="_static/doctools.js"></script> +<<<<<<< HEAD <script type="text/javascript" src="https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script> +======= + <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script> +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 <link rel="index" title="Index" href="genindex.html" /> <link rel="search" title="Search" href="search.html" /> <link rel="stylesheet" href="_static/custom.css" type="text/css" /> +<<<<<<< HEAD <meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" /> @@ -41,6 +59,15 @@ </head> <body role="document"> +======= + + <meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" /> + + + + </head> + <body> +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 <div class="document"> @@ -52,12 +79,17 @@ <h1>Python Module Index</h1> <div class="modindex-jumpbox"> +<<<<<<< HEAD <a href="#cap-d"><strong>d</strong></a> | <a href="#cap-p"><strong>p</strong></a> +======= + <a href="#cap-n"><strong>n</strong></a> +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 </div> <table class="indextable modindextable"> <tr class="pcap"><td></td><td> </td><td></td></tr> +<<<<<<< HEAD <tr class="cap" id="cap-d"><td></td><td> <strong>d</strong></td><td></td></tr> <tr> @@ -72,6 +104,25 @@ <td></td> <td> <a href="processing.html#module-processing"><code class="xref">processing</code></a></td><td> +======= + <tr class="cap" id="cap-n"><td></td><td> + <strong>n</strong></td><td></td></tr> + <tr> + <td><img src="_static/minus.png" class="toggler" + id="toggle-1" style="display: none" alt="-" /></td> + <td> + <code class="xref">navipy</code></td><td> + <em></em></td></tr> + <tr class="cg-1"> + <td></td> + <td>    + <a href="database.html#module-navipy.database"><code class="xref">navipy.database</code></a></td><td> + <em></em></td></tr> + <tr class="cg-1"> + <td></td> + <td>    + <a href="processing.html#module-navipy.processing"><code class="xref">navipy.processing</code></a></td><td> +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 <em></em></td></tr> </table> @@ -105,8 +156,13 @@ ©2017, Olivier J.N. Bertrand. | +<<<<<<< HEAD Powered by <a href="http://sphinx-doc.org/">Sphinx 1.5.3</a> & <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.8</a> +======= + Powered by <a href="http://sphinx-doc.org/">Sphinx 1.6.5</a> + & <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.10</a> +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 </div> diff --git a/doc/build/html/rendering.html b/doc/build/html/rendering.html index 0ccd2440b30afc394de1b7b8cc3dd2dac2bbf3b4..b5a0e4df361170c0908acfadf8f697c42b97a17d 100644 --- a/doc/build/html/rendering.html +++ b/doc/build/html/rendering.html @@ -1,3 +1,4 @@ +<<<<<<< HEAD <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> @@ -11,6 +12,18 @@ <link rel="stylesheet" href="_static/alabaster.css" type="text/css" /> <link rel="stylesheet" href="_static/pygments.css" type="text/css" /> +======= + +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> + <head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> + <title>Rendering — Navigation Toolbox a0 documentation</title> + <link rel="stylesheet" href="_static/alabaster.css" type="text/css" /> + <link rel="stylesheet" href="_static/pygments.css" type="text/css" /> +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 <script type="text/javascript"> var DOCUMENTATION_OPTIONS = { URL_ROOT: './', @@ -24,7 +37,11 @@ <script type="text/javascript" src="_static/jquery.js"></script> <script type="text/javascript" src="_static/underscore.js"></script> <script type="text/javascript" src="_static/doctools.js"></script> +<<<<<<< HEAD <script type="text/javascript" src="https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script> +======= + <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script> +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 <link rel="index" title="Index" href="genindex.html" /> <link rel="search" title="Search" href="search.html" /> <link rel="next" title="Processing a scene" href="processing.html" /> @@ -32,10 +49,18 @@ <link rel="stylesheet" href="_static/custom.css" type="text/css" /> +<<<<<<< HEAD <meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" /> </head> <body role="document"> +======= + + <meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" /> + + </head> + <body> +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 <div class="document"> @@ -46,6 +71,7 @@ <div class="section" id="rendering"> <h1>Rendering<a class="headerlink" href="#rendering" title="Permalink to this headline">¶</a></h1> <p>Need to introduce blender here</p> +<<<<<<< HEAD <div class="section" id="cyberbee"> <h2>Cyberbee<a class="headerlink" href="#cyberbee" title="Permalink to this headline">¶</a></h2> </div> @@ -55,6 +81,78 @@ <div class="section" id="building-your-environment"> <h2>Building your environment<a class="headerlink" href="#building-your-environment" title="Permalink to this headline">¶</a></h2> </div> +======= +<div class="section" id="building-your-environment"> +<h2>Building your environment<a class="headerlink" href="#building-your-environment" title="Permalink to this headline">¶</a></h2> +</div> +<div class="section" id="how-to-generate-a-database-using-blender"> +<h2>How to generate a database using blender<a class="headerlink" href="#how-to-generate-a-database-using-blender" title="Permalink to this headline">¶</a></h2> +<div class="section" id="regular-sampling"> +<h3>Regular sampling<a class="headerlink" href="#regular-sampling" title="Permalink to this headline">¶</a></h3> +<p>Blender comes with its own python installation. Thus, we need to tell blender to use our virtualenv where the navigation toolbox is installed. To do we need to import the os module</p> +<div class="highlight-default"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">os</span> +<span class="kn">import</span> <span class="nn">tempfile</span> +</pre></div> +</div> +<p>then activate the environment:</p> +<div class="highlight-default"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">activate_virtualenv</span><span class="p">(</span><span class="n">name</span><span class="p">):</span> + <span class="sd">"""Activate given virtualenv.</span> +<span class="sd"> Virtualenv home folder is given by environment variable</span> +<span class="sd"> ``WORKON_HOME`` or ``~/Envs`.</span> +<span class="sd"> """</span> + <span class="k">if</span> <span class="s1">'WORKON_HOME'</span> <span class="ow">in</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">:</span> + <span class="n">home</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">[</span><span class="s1">'WORKON_HOME'</span><span class="p">]</span> + <span class="k">else</span><span class="p">:</span> + <span class="n">home</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">expanduser</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="s1">'~'</span><span class="p">,</span> <span class="s1">'Envs'</span><span class="p">))</span> + <span class="n">filepath</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">home</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="s1">'bin'</span><span class="p">,</span> <span class="s1">'activate_this.py'</span><span class="p">)</span> + <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">filepath</span><span class="p">,</span> <span class="s1">'r'</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span> + <span class="n">exec</span><span class="p">(</span><span class="n">f</span><span class="o">.</span><span class="n">read</span><span class="p">(),</span> <span class="nb">dict</span><span class="p">(</span><span class="vm">__file__</span><span class="o">=</span><span class="n">filepath</span><span class="p">))</span> + + +<span class="n">activate_virtualenv</span><span class="p">(</span><span class="n">environment_name</span><span class="p">)</span> +</pre></div> +</div> +<p>Now, blender can import all modules used by the navigation toolbox.</p> +<div class="highlight-default"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span> <span class="c1"># noqa: E402</span> +<span class="kn">from</span> <span class="nn">navipy.rendering.bee_sampling</span> <span class="k">import</span> <span class="n">BeeSampling</span> <span class="c1"># noqa: E402</span> +</pre></div> +</div> +<p>With the toolbox at disposition we just need to configure the BeeSampling to render images on a regular 3D grid.</p> +<div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bee_samp</span> <span class="o">=</span> <span class="n">BeeSampling</span><span class="p">()</span> +</pre></div> +</div> +<div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">x</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">linspace</span><span class="p">(</span><span class="o">-</span><span class="mi">25</span><span class="p">,</span> <span class="mi">25</span><span class="p">,</span> <span class="mi">201</span><span class="p">)</span> +<span class="n">y</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">linspace</span><span class="p">(</span><span class="o">-</span><span class="mi">25</span><span class="p">,</span> <span class="mi">25</span><span class="p">,</span> <span class="mi">201</span><span class="p">)</span> +<span class="n">z</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">linspace</span><span class="p">(</span><span class="mf">1.8</span><span class="p">,</span> <span class="mf">1.8</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span> +<span class="n">alpha_1</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">([</span><span class="mi">0</span><span class="p">])</span> <span class="o">+</span> <span class="n">np</span><span class="o">.</span><span class="n">pi</span> <span class="o">/</span> <span class="mi">2</span> +<span class="n">alpha_2</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">([</span><span class="mi">0</span><span class="p">])</span> +<span class="n">alpha_3</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">([</span><span class="mi">0</span><span class="p">])</span> +<span class="n">bee_samp</span><span class="o">.</span><span class="n">create_sampling_grid</span><span class="p">(</span> + <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">z</span><span class="p">,</span> <span class="n">alpha1</span><span class="o">=</span><span class="n">alpha_1</span><span class="p">,</span> <span class="n">alpha2</span><span class="o">=</span><span class="n">alpha_2</span><span class="p">,</span> <span class="n">alpha3</span><span class="o">=</span><span class="n">alpha_3</span><span class="p">)</span> +</pre></div> +</div> +<p>If we want to use the distance to objects, we need to tell the BeeSampling what is the maximum distance to objects in the environment. Otherwise the distance can go until infinity, and since the image are compressed in the database, all distance to object will be equal to zero:</p> +<div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">world_dim</span> <span class="o">=</span> <span class="mi">50</span> <span class="o">*</span> <span class="n">np</span><span class="o">.</span><span class="n">sqrt</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span> +<span class="n">bee_samp</span><span class="o">.</span><span class="n">world_dim</span> <span class="o">=</span> <span class="n">world_dim</span> +</pre></div> +</div> +<p>Finally we can generate the database.</p> +<div class="highlight-default"><div class="highlight"><pre><span></span><span class="k">with</span> <span class="n">tempfile</span><span class="o">.</span><span class="n">TemporaryDirectory</span><span class="p">()</span> <span class="k">as</span> <span class="n">folder</span><span class="p">:</span> + <span class="n">bee_samp</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="n">folder</span> <span class="o">+</span> <span class="s1">'/database.db'</span><span class="p">)</span> +</pre></div> +</div> +</div> +<div class="section" id="how-to-test-the-script"> +<h3>How to test the script:<a class="headerlink" href="#how-to-test-the-script" title="Permalink to this headline">¶</a></h3> +<div class="highlight-default"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">blender</span> <span class="n">test</span><span class="o">.</span><span class="n">blend</span> <span class="o">--</span><span class="n">background</span> <span class="o">--</span><span class="n">python</span> <span class="n">demo_test</span><span class="o">.</span><span class="n">py</span> +</pre></div> +</div> +</div> +</div> +<div class="section" id="cyberbee"> +<h2>Cyberbee<a class="headerlink" href="#cyberbee" title="Permalink to this headline">¶</a></h2> +</div> +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 </div> @@ -66,9 +164,19 @@ <h3><a href="index.html">Table Of Contents</a></h3> <ul> <li><a class="reference internal" href="#">Rendering</a><ul> +<<<<<<< HEAD <li><a class="reference internal" href="#cyberbee">Cyberbee</a></li> <li><a class="reference internal" href="#regular-sampling-bee-sampling">Regular sampling (Bee sampling)</a></li> <li><a class="reference internal" href="#building-your-environment">Building your environment</a></li> +======= +<li><a class="reference internal" href="#building-your-environment">Building your environment</a></li> +<li><a class="reference internal" href="#how-to-generate-a-database-using-blender">How to generate a database using blender</a><ul> +<li><a class="reference internal" href="#regular-sampling">Regular sampling</a></li> +<li><a class="reference internal" href="#how-to-test-the-script">How to test the script:</a></li> +</ul> +</li> +<li><a class="reference internal" href="#cyberbee">Cyberbee</a></li> +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 </ul> </li> </ul> @@ -106,8 +214,13 @@ ©2017, Olivier J.N. Bertrand. | +<<<<<<< HEAD Powered by <a href="http://sphinx-doc.org/">Sphinx 1.5.3</a> & <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.8</a> +======= + Powered by <a href="http://sphinx-doc.org/">Sphinx 1.6.5</a> + & <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.10</a> +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 | <a href="_sources/rendering.rst.txt" diff --git a/doc/build/html/search.html b/doc/build/html/search.html index a118c3cb14984b4074e358fe26ec567a64bbea23..9773532a238bbf90b359f46cc713fde8aec9aeb1 100644 --- a/doc/build/html/search.html +++ b/doc/build/html/search.html @@ -1,3 +1,4 @@ +<<<<<<< HEAD <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> @@ -11,6 +12,18 @@ <link rel="stylesheet" href="_static/alabaster.css" type="text/css" /> <link rel="stylesheet" href="_static/pygments.css" type="text/css" /> +======= + +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> + <head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> + <title>Search — Navigation Toolbox a0 documentation</title> + <link rel="stylesheet" href="_static/alabaster.css" type="text/css" /> + <link rel="stylesheet" href="_static/pygments.css" type="text/css" /> +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 <script type="text/javascript"> var DOCUMENTATION_OPTIONS = { URL_ROOT: './', @@ -24,7 +37,11 @@ <script type="text/javascript" src="_static/jquery.js"></script> <script type="text/javascript" src="_static/underscore.js"></script> <script type="text/javascript" src="_static/doctools.js"></script> +<<<<<<< HEAD <script type="text/javascript" src="https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script> +======= + <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script> +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 <script type="text/javascript" src="_static/searchtools.js"></script> <link rel="index" title="Index" href="genindex.html" /> <link rel="search" title="Search" href="#" /> @@ -37,11 +54,19 @@ <link rel="stylesheet" href="_static/custom.css" type="text/css" /> +<<<<<<< HEAD +======= + +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 <meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" /> </head> +<<<<<<< HEAD <body role="document"> +======= + <body> +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 <div class="document"> @@ -92,8 +117,13 @@ ©2017, Olivier J.N. Bertrand. | +<<<<<<< HEAD Powered by <a href="http://sphinx-doc.org/">Sphinx 1.5.3</a> & <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.8</a> +======= + Powered by <a href="http://sphinx-doc.org/">Sphinx 1.6.5</a> + & <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.10</a> +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 </div> diff --git a/doc/build/html/searchindex.js b/doc/build/html/searchindex.js index 30030b8347410fd3410ebe9bb6d26439fc40711a..3ff99626634480c190728c412e821d83a11fe3b7 100644 --- a/doc/build/html/searchindex.js +++ b/doc/build/html/searchindex.js @@ -1 +1,5 @@ -Search.setIndex({docnames:["analysing","comparing","computing","database","gettingstarted","index","moving","processing","rendering"],envversion:51,filenames:["analysing.rst","comparing.rst","computing.rst","database.rst","gettingstarted.rst","index.rst","moving.rst","processing.rst","rendering.rst"],objects:{"":{database:[3,0,0,"-"],processing:[7,0,0,"-"]},processing:{apcv:[7,1,1,""],contrast_weighted_nearness:[7,1,1,""],michelson_contrast:[7,1,1,""],optic_flow:[7,1,1,""],pcv:[7,1,1,""],scene:[7,1,1,""],skyline:[7,1,1,""]}},objnames:{"0":["py","module","Python module"],"1":["py","function","Python function"]},objtypes:{"0":"py:module","1":"py:function"},terms:{"case":[3,7],"class":7,"default":7,"import":3,"return":[3,7],IBS:7,NOT:7,OBS:7,The:[3,7],about:1,abus:7,access:3,along:7,alpha_0:[3,7],alpha_1:[3,7],alpha_2:[3,7],alreadi:3,alwai:7,analys:5,apcv:7,around:7,arrai:7,azimuth:7,base:7,basten:7,bee:3,been:3,blender:8,calcul:[3,7],can:[3,7],cartesian:7,certain:3,channel:[3,7],classic:7,code:3,compar:5,compon:7,comput:5,consist:3,constant:3,constrast:7,contain:3,contrast_s:7,contrast_weighted_near:7,coordin:7,correspond:3,cost:3,databas:[5,7],databaseload:[3,7],defin:7,depend:3,deriv:7,describ:3,differ:3,dimens:7,direct:7,directli:7,distanc:7,distance_channel:7,each:[3,7],either:7,elev:7,entir:3,equirectangular:7,ever:3,extens:7,eye:7,follow:7,from:[3,7],full:3,gener:3,get:5,get_posori:3,given:[3,7],has:3,have:7,head:3,here:8,highest:7,hire:[3,7],howev:3,ibpc:7,ibs:7,identif:7,identifi:3,imag:[6,7],implement:7,inde:3,index:[3,5,7],insect:7,instead:3,integ:7,intens:7,interpol:6,introduc:8,know:3,local:7,locat:7,look:3,lowest:7,lumin:7,mai:3,mallot:7,manner:7,map:7,maximum:7,memori:1,method:7,michelson_contrast:7,minimum:7,modul:[3,5],more:3,move:5,my_apcv:7,my_contrast:7,my_pcv:7,my_scen:7,my_skylin:7,mydb:[3,7],mydb_filenam:3,navig:3,ndarrai:7,need:[7,8],neighbour:6,none:7,normalis:3,number:[3,7],numpi:7,obpc:7,obs:7,omatidium:7,ommatidia:7,ommatidium:7,optic_flow:7,orient:7,orientaiton:3,page:5,panda:7,panoram:7,param:7,paramet:7,part:7,pcv:7,pdf:[3,7],pixel:7,place_cod:7,png:[3,7],posit:7,position_orient:3,posori:[3,7],process:[3,5],project:7,provid:3,rang:3,read:7,read_imag:3,region:7,regular:7,render:[3,5],repres:7,respect:7,row:[3,7],rowid:[3,7],rtype:7,scene:5,sceneri:7,search:5,sens:7,seri:[3,7],situat:3,size:7,sourc:[3,7],space:7,speak:3,speed:3,start:5,strategi:3,tabl:3,talk:1,technic:3,terminolog:7,therefor:7,thi:3,through:3,thu:[3,7],time:3,toolbox:7,transform:7,type:7,uniqu:3,use:3,used:[3,7],useful:3,veloc:7,view:7,viewing_direct:7,were:3,wheight:7,when:7,where:3,which:3},titles:["Analysing","Comparing","Computing","Database","Getting started","Welcome to Navigation Toolbox’s documentation!","Moving","Processing a scene","Rendering"],titleterms:{agent:0,all:3,analys:0,area:0,around:0,attractor:0,averag:[2,7],bee:8,between:6,build:8,catchment:0,code:[2,7],compar:1,comput:2,contrast:7,cyberbe:8,databas:3,differ:[1,2],document:5,doe:0,environ:8,familiar:[1,2],few:0,find:0,flow:7,from:2,get:4,goal:0,grid:6,home:0,how:3,idf:1,imag:[1,2,3],indic:5,infomax:1,load:3,michelson:7,move:6,navig:5,nearness:7,network:[1,2],optic:7,orient:3,place:[2,7],point:6,posit:3,process:7,regular:8,render:8,ridf:1,rotat:[1,2],sampl:8,scene:7,skylin:7,start:4,tabl:5,toolbox:5,type:0,vector:[2,7],weight:7,welcom:5,your:8}}) \ No newline at end of file +<<<<<<< HEAD +Search.setIndex({docnames:["analysing","comparing","computing","database","gettingstarted","index","moving","processing","rendering"],envversion:51,filenames:["analysing.rst","comparing.rst","computing.rst","database.rst","gettingstarted.rst","index.rst","moving.rst","processing.rst","rendering.rst"],objects:{"":{database:[3,0,0,"-"],processing:[7,0,0,"-"]},processing:{apcv:[7,1,1,""],contrast_weighted_nearness:[7,1,1,""],michelson_contrast:[7,1,1,""],optic_flow:[7,1,1,""],pcv:[7,1,1,""],scene:[7,1,1,""],skyline:[7,1,1,""]}},objnames:{"0":["py","module","Python module"],"1":["py","function","Python function"]},objtypes:{"0":"py:module","1":"py:function"},terms:{"case":[3,7],"class":7,"default":7,"import":3,"return":[3,7],IBS:7,NOT:7,OBS:7,The:[3,7],about:1,abus:7,access:3,along:7,alpha_0:[3,7],alpha_1:[3,7],alpha_2:[3,7],alreadi:3,alwai:7,analys:5,apcv:7,around:7,arrai:7,azimuth:7,base:7,basten:7,bee:3,been:3,blender:8,calcul:[3,7],can:[3,7],cartesian:7,certain:3,channel:[3,7],classic:7,code:3,compar:5,compon:7,comput:5,consist:3,constant:3,constrast:7,contain:3,contrast_s:7,contrast_weighted_near:7,coordin:7,correspond:3,cost:3,databas:[5,7],databaseload:[3,7],defin:7,depend:3,deriv:7,describ:3,differ:3,dimens:7,direct:7,directli:7,distanc:7,distance_channel:7,each:[3,7],either:7,elev:7,entir:3,equirectangular:7,ever:3,extens:7,eye:7,follow:7,from:[3,7],full:3,gener:3,get:5,get_posori:3,given:[3,7],has:3,have:7,head:3,here:8,highest:7,hire:[3,7],howev:3,ibpc:7,ibs:7,identif:7,identifi:3,imag:[6,7],implement:7,inde:3,index:[3,5,7],insect:7,instead:3,integ:7,intens:7,interpol:6,introduc:8,know:3,local:7,locat:7,look:3,lowest:7,lumin:7,mai:3,mallot:7,manner:7,map:7,maximum:7,memori:1,method:7,michelson_contrast:7,minimum:7,modul:[3,5],more:3,move:5,my_apcv:7,my_contrast:7,my_pcv:7,my_scen:7,my_skylin:7,mydb:[3,7],mydb_filenam:3,navig:3,ndarrai:7,need:[7,8],neighbour:6,none:7,normalis:3,number:[3,7],numpi:7,obpc:7,obs:7,omatidium:7,ommatidia:7,ommatidium:7,optic_flow:7,orient:7,orientaiton:3,page:5,panda:7,panoram:7,param:7,paramet:7,part:7,pcv:7,pdf:[3,7],pixel:7,place_cod:7,png:[3,7],posit:7,position_orient:3,posori:[3,7],process:[3,5],project:7,provid:3,rang:3,read:7,read_imag:3,region:7,regular:7,render:[3,5],repres:7,respect:7,row:[3,7],rowid:[3,7],rtype:7,scene:5,sceneri:7,search:5,sens:7,seri:[3,7],situat:3,size:7,sourc:[3,7],space:7,speak:3,speed:3,start:5,strategi:3,tabl:3,talk:1,technic:3,terminolog:7,therefor:7,thi:3,through:3,thu:[3,7],time:3,toolbox:7,transform:7,type:7,uniqu:3,use:3,used:[3,7],useful:3,veloc:7,view:7,viewing_direct:7,were:3,wheight:7,when:7,where:3,which:3},titles:["Analysing","Comparing","Computing","Database","Getting started","Welcome to Navigation Toolbox’s documentation!","Moving","Processing a scene","Rendering"],titleterms:{agent:0,all:3,analys:0,area:0,around:0,attractor:0,averag:[2,7],bee:8,between:6,build:8,catchment:0,code:[2,7],compar:1,comput:2,contrast:7,cyberbe:8,databas:3,differ:[1,2],document:5,doe:0,environ:8,familiar:[1,2],few:0,find:0,flow:7,from:2,get:4,goal:0,grid:6,home:0,how:3,idf:1,imag:[1,2,3],indic:5,infomax:1,load:3,michelson:7,move:6,navig:5,nearness:7,network:[1,2],optic:7,orient:3,place:[2,7],point:6,posit:3,process:7,regular:8,render:8,ridf:1,rotat:[1,2],sampl:8,scene:7,skylin:7,start:4,tabl:5,toolbox:5,type:0,vector:[2,7],weight:7,welcom:5,your:8}}) +======= +Search.setIndex({docnames:["analysing","comparing","computing","database","gettingstarted","index","moving","processing","rendering"],envversion:53,filenames:["analysing.rst","comparing.rst","computing.rst","database.rst","gettingstarted.rst","index.rst","moving.rst","processing.rst","rendering.rst"],objects:{"navipy.processing":{apcv:[7,1,1,""],contrast_weighted_nearness:[7,1,1,""],michelson_contrast:[7,1,1,""],optic_flow:[7,1,1,""],pcv:[7,1,1,""],scene:[7,1,1,""],skyline:[7,1,1,""]},navipy:{database:[3,0,0,"-"],processing:[7,0,0,"-"]}},objnames:{"0":["py","module","Python module"],"1":["py","function","Python function"]},objtypes:{"0":"py:module","1":"py:function"},terms:{"case":[3,7],"class":7,"default":7,"final":8,"import":[3,8],"return":[3,7],IBS:7,NOT:7,OBS:7,The:[3,7],With:8,__file__:8,about:1,abspath:[],abus:7,access:3,activ:8,activate_thi:8,activate_virtualenv:8,all:8,along:7,alpha1:8,alpha2:8,alpha3:8,alpha_0:[3,7],alpha_1:[3,7,8],alpha_2:[3,7,8],alpha_3:8,alreadi:3,alwai:7,analys:5,apcv:7,around:7,arrai:[7,8],astyp:[],axarr:[],azimuth:7,background:8,base:7,basten:7,bee:3,bee_samp:8,bee_sampl:8,been:3,beesampl:8,bin:8,blend:8,calcul:[3,7],can:[3,7,8],care:[],cartesian:7,certain:3,channel:[3,7],classic:7,code:3,come:8,compar:5,compon:7,compress:8,comput:5,configur:8,connect:[],consist:3,constant:3,constrast:7,contain:3,contrast_s:7,contrast_weighted_near:7,coordin:7,correspond:3,cost:3,creat:[],create_sampling_grid:8,databas:[5,7],databaseload:[3,7],def:8,defin:7,demo_test:8,depend:3,deriv:7,describ:3,dict:8,differ:3,dimens:7,direct:7,directli:7,disposit:8,distanc:[7,8],distance_channel:7,e402:8,each:[3,7],either:7,elev:7,els:8,entir:3,env:8,environment_nam:8,equal:8,equirectangular:7,ever:3,exampl:[],exec:8,expandus:8,extens:7,eye:7,figsiz:[],filepath:8,folder:8,follow:7,from:[3,7,8],full:3,gener:3,get:5,get_posori:3,given:[3,7,8],grid:8,grow:[],has:3,have:7,head:3,here:8,highest:7,hire:[3,7],home:8,howev:3,ibpc:7,ibs:7,identif:7,identifi:3,imag:[6,7,8],implement:7,imshow:[],inde:3,index:[3,5,7],infin:8,insect:7,instal:8,instead:3,integ:7,intens:7,interpol:6,introduc:8,invert_yaxi:[],its:8,join:8,just:8,know:3,line:[],linspac:8,list:[],literalinclud:[],local:7,locat:7,look:3,lowest:7,lumin:7,mai:3,mallot:7,manner:7,map:7,matplotlib:[],max:[],maximum:[7,8],memori:1,mesh:[],method:7,michelson_contrast:7,min:[],minimum:7,modul:[3,5,8],more:3,move:5,my_apcv:7,my_contrast:7,my_pcv:7,my_scen:7,my_skylin:7,mydb:[3,7],mydb_filenam:3,name:8,navig:[3,8],navipi:[7,8],ndarrai:7,need:[7,8],neighbour:6,none:7,noqa:8,normalis:3,now:8,number:[3,7],numpi:[7,8],object:8,obpc:7,obs:7,omatidium:7,ommatidia:7,ommatidium:7,open:8,optic_flow:7,orient:7,orientaiton:3,orinet:[],otherwis:8,our:8,own:8,page:5,panda:7,panoram:7,param:7,paramet:7,part:7,path:8,pcv:7,pdf:[3,7],pixel:7,place_cod:7,plot:[],plt:[],png:[3,7],point:[],posit:7,position_orient:3,posori:[3,7],process:[3,5],project:7,provid:3,pyplot:[],python:8,quickli:[],rang:3,read:[7,8],read_imag:3,region:7,regular:7,render:[3,5],repres:7,respect:7,row:[3,7],rowid:[3,7],rtype:7,scene:5,sceneri:7,search:5,sens:7,seri:[3,7],show:[],sinc:8,situat:3,size:7,sourc:[3,7],space:7,speak:3,speed:3,sqrt:8,start:5,strategi:3,subplot:[],tabl:3,talk:1,technic:3,tell:8,tempfil:8,temporarydirectori:8,terminolog:7,therefor:7,thi:3,three:[],through:3,thu:[3,7,8],time:3,to_plot_dist:[],to_plot_im:[],toolbox:[7,8],transform:7,type:7,uint8:[],uniqu:3,until:8,use:[3,8],used:[3,7,8],useful:3,variabl:8,veloc:7,view:7,viewing_direct:7,virtualenv:8,want:8,were:3,what:8,wheight:7,when:7,where:[3,8],which:3,workon_hom:8,world_dim:8,zero:8},titles:["Analysing","Comparing","Computing","Database","Getting started","Welcome to Navigation Toolbox\u2019s documentation!","Moving","Processing a scene","Rendering"],titleterms:{agent:0,all:3,analys:0,area:0,around:0,attractor:0,averag:[2,7],between:6,blender:8,build:8,catchment:0,code:[2,7],compar:1,comput:2,contrast:7,cyberbe:8,databas:[3,8],differ:[1,2],document:5,doe:0,environ:8,familiar:[1,2],few:0,find:0,flow:7,from:2,gener:8,get:4,goal:0,grid:6,home:0,how:[3,8],idf:1,imag:[1,2,3],indic:5,infomax:1,load:3,michelson:7,move:6,navig:5,nearness:7,network:[1,2],optic:7,orient:3,place:[2,7],point:6,posit:3,process:7,regular:8,render:8,ridf:1,rotat:[1,2],sampl:8,scene:7,script:8,skylin:7,start:4,tabl:5,test:8,toolbox:5,type:0,using:8,vector:[2,7],weight:7,welcom:5,your:8}}) +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 diff --git a/doc/source/database.rst b/doc/source/database.rst index bb62b910508144c23449709aed14d1ade8748e73..10120c818891e6289fd083b950dd23efab51c11c 100644 --- a/doc/source/database.rst +++ b/doc/source/database.rst @@ -1,4 +1,8 @@ Database ======== +<<<<<<< HEAD .. automodule:: database +======= +.. automodule:: navipy.database +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 diff --git a/doc/source/example/database/load_image_posorient.py b/doc/source/example/database/load_image_posorient.py index a0662123dcf2ceb2bca56c33752ca8c81e07cf5c..6b541b666a430872d89887850abc89693e122d7d 100644 --- a/doc/source/example/database/load_image_posorient.py +++ b/doc/source/example/database/load_image_posorient.py @@ -1,7 +1,11 @@ import pandas as pd import numpy as np import matplotlib.pyplot as plt +<<<<<<< HEAD from database import DataBaseLoad +======= +from navipy.database import DataBaseLoad +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 import os diff --git a/doc/source/example/database/load_image_rowid.py b/doc/source/example/database/load_image_rowid.py index cacf4139b8c8b2737b15000e8c42006913edcda5..1f9a43c4b86cbf85a025e6dbbadd7b87dc8ff61a 100644 --- a/doc/source/example/database/load_image_rowid.py +++ b/doc/source/example/database/load_image_rowid.py @@ -1,6 +1,10 @@ import numpy as np import matplotlib.pyplot as plt +<<<<<<< HEAD from database import DataBaseLoad +======= +from navipy.database import DataBaseLoad +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 import os diff --git a/doc/source/example/processing/apcv.py b/doc/source/example/processing/apcv.py index ecca32ce52f4daa2598f22c9ffdbf5c98f209ce6..dda72e09c1325118bd34e1e5f4d806086b4968de 100644 --- a/doc/source/example/processing/apcv.py +++ b/doc/source/example/processing/apcv.py @@ -1,6 +1,11 @@ import matplotlib.pyplot as plt +<<<<<<< HEAD from database import DataBaseLoad import processing +======= +from navipy.database import DataBaseLoad +import navipy.processing as processing +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 import os import numpy as np diff --git a/doc/source/example/processing/contrast_weighted_nearness.py b/doc/source/example/processing/contrast_weighted_nearness.py index 92066428cbe39cedf98954f34932eebb9c16d36e..6d66414e06ecbcd8f807f42fd547fc41a954b075 100644 --- a/doc/source/example/processing/contrast_weighted_nearness.py +++ b/doc/source/example/processing/contrast_weighted_nearness.py @@ -1,6 +1,11 @@ import matplotlib.pyplot as plt +<<<<<<< HEAD from database import DataBaseLoad import processing +======= +from navipy.database import DataBaseLoad +import navipy.processing as processing +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 import os diff --git a/doc/source/example/processing/michelson_contrast.py b/doc/source/example/processing/michelson_contrast.py index 85a8f1018f984960639b1c826243ed7f1c27f872..a4fe479171b99c7ea124d512aeaa7295df21d283 100644 --- a/doc/source/example/processing/michelson_contrast.py +++ b/doc/source/example/processing/michelson_contrast.py @@ -1,6 +1,11 @@ import matplotlib.pyplot as plt +<<<<<<< HEAD from database import DataBaseLoad import processing +======= +from navipy.database import DataBaseLoad +import navipy.processing as processing +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 import os diff --git a/doc/source/example/processing/pcv.py b/doc/source/example/processing/pcv.py index ad89b8be731c5930decfc913641f3c438a23a846..88b41ac750638ce8a8609699da77902f5acb4c36 100644 --- a/doc/source/example/processing/pcv.py +++ b/doc/source/example/processing/pcv.py @@ -1,6 +1,11 @@ # import matplotlib.pyplot as plt +<<<<<<< HEAD from database import DataBaseLoad import processing +======= +from navipy.database import DataBaseLoad +import navipy.processing as processing +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 import os diff --git a/doc/source/example/processing/scene.py b/doc/source/example/processing/scene.py index be6d1d36cbdbd62c49f22b408a388be271483ba4..286abb840d524264292e927f702785f50ad45200 100644 --- a/doc/source/example/processing/scene.py +++ b/doc/source/example/processing/scene.py @@ -1,7 +1,12 @@ import numpy as np import matplotlib.pyplot as plt +<<<<<<< HEAD from database import DataBaseLoad import processing +======= +from navipy.database import DataBaseLoad +import navipy.processing as processing +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 import os diff --git a/doc/source/example/processing/skyline.py b/doc/source/example/processing/skyline.py index a178e8f7580e5a2f337f53f903afbce09e135b9d..4be700819292a3cc1451ef04ef74bf7b45ddb508 100644 --- a/doc/source/example/processing/skyline.py +++ b/doc/source/example/processing/skyline.py @@ -1,6 +1,11 @@ import matplotlib.pyplot as plt +<<<<<<< HEAD from database import DataBaseLoad import processing +======= +from navipy.database import DataBaseLoad +import navipy.processing as processing +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 import os diff --git a/doc/source/example/processing/testblubb.py~ b/doc/source/example/processing/testblubb.py~ new file mode 100644 index 0000000000000000000000000000000000000000..e6755723fa5238687a8e600bc4fc483c1433a1a2 --- /dev/null +++ b/doc/source/example/processing/testblubb.py~ @@ -0,0 +1,22 @@ +import numpy as np +import matplotlib.pyplot as plt + +import os +import sys +sys.path.insert(0, '/media/luiza/Daten/Repos/toolbox-navigation/src/database') +from database import DataBaseLoad +sys.path.insert(0, '/media/luiza/Daten/Repos/toolbox-navigation/src/processing') +import processing + + +# 1) Connect to the database +mydb_filename = os.path.abspath('../database.db') +mydb = DataBaseLoad(mydb_filename) +# 2) Define the position-orinetation at which +# we want the image and get the scene +rowid = 5000 +my_scene = processing.scene(mydb, rowid=rowid) + +print(my_scene.shape) +print(my_scene.type) +print('elevation' in my_scene) diff --git a/doc/source/example/rendering/demo_render.py b/doc/source/example/rendering/demo_render.py new file mode 100644 index 0000000000000000000000000000000000000000..18124c94a523b02c9d4290b1714000d631163039 --- /dev/null +++ b/doc/source/example/rendering/demo_render.py @@ -0,0 +1,54 @@ +""" +Example on how to use the rendering module +""" +# Import module from blender +import os +import tempfile + + +environment_name = 'toolbox-navigation' + + +def activate_virtualenv(name): + """Activate given virtualenv. + Virtualenv home folder is given by environment variable + ``WORKON_HOME`` or ``~/Envs`. + """ + if 'WORKON_HOME' in os.environ: + home = os.environ['WORKON_HOME'] + else: + home = os.path.expanduser(os.path.join('~', 'Envs')) + filepath = os.path.join(home, name, 'bin', 'activate_this.py') + with open(filepath, 'r') as f: + exec(f.read(), dict(__file__=filepath)) + + +activate_virtualenv(environment_name) +# +# Import module in virtualenv +# +import numpy as np # noqa: E402 +from navipy.rendering.bee_sampling import BeeSampling # noqa: E402 + +# create a bee sampling +bee_samp = BeeSampling() +# Create a list of point from which we want to render images +# Careful three d meshing grow quickly. +x = np.linspace(-25, 25, 201) +y = np.linspace(-25, 25, 201) +z = np.linspace(1.8, 1.8, 1) +alpha_1 = np.array([0]) + np.pi / 2 +alpha_2 = np.array([0]) +alpha_3 = np.array([0]) +bee_samp.create_sampling_grid( + x, y, z, alpha1=alpha_1, alpha2=alpha_2, alpha3=alpha_3) +# Assign maximum world dimension. Otherwise the distance +# will go to infinity, and the distance to objects after compression +# will be set to 0 +world_dim = 50 * np.sqrt(2) +bee_samp.world_dim = world_dim +# set the number of sample for rendring in blender +bee_samp.set_cycle_samples(samples=50) +# Rendering in a tmp folder +with tempfile.TemporaryDirectory() as folder: + bee_samp.render(folder + '/database.db') diff --git a/doc/source/processing.rst b/doc/source/processing.rst index 65590a24ac53d21f74acdb28e1762b14af4a3f71..1dd180797baa638e6bbe8da18e551959aafc59e0 100644 --- a/doc/source/processing.rst +++ b/doc/source/processing.rst @@ -1,6 +1,7 @@ Processing a scene ================== +<<<<<<< HEAD .. automodule:: processing Scene @@ -30,3 +31,34 @@ Average place-code vector Optic-flow ---------- .. autofunction:: processing.optic_flow +======= +.. automodule:: navipy.processing + +Scene +----- +.. autofunction:: navipy.processing.scene + +Skyline +------- +.. autofunction:: navipy.processing.skyline + +Michelson-contrast +------------------ +.. autofunction:: navipy.processing.michelson_contrast + +Contrast-weighted-nearness +-------------------------- +.. autofunction:: navipy.processing.contrast_weighted_nearness + +Place-code vectors +------------------ +.. autofunction:: navipy.processing.pcv + +Average place-code vector +------------------------- +.. autofunction:: navipy.processing.apcv + +Optic-flow +---------- +.. autofunction:: navipy.processing.optic_flow +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 diff --git a/doc/source/rendering.rst b/doc/source/rendering.rst index 09de1f385e83b9e2716753f5f475a2ba63eb385b..7d98baf76dabf14a8c1e84879ef2ee2954daad18 100644 --- a/doc/source/rendering.rst +++ b/doc/source/rendering.rst @@ -3,6 +3,7 @@ Rendering Need to introduce blender here +<<<<<<< HEAD Cyberbee -------- @@ -11,3 +12,53 @@ Regular sampling (Bee sampling) Building your environment ------------------------- +======= + +Building your environment +------------------------- + + +How to generate a database using blender +---------------------------------------- +Regular sampling +~~~~~~~~~~~~~~~~ +Blender comes with its own python installation. Thus, we need to tell blender to use our virtualenv where the navigation toolbox is installed. To do we need to import the os module + +.. literalinclude:: example/rendering/demo_render.py + :lines: 5-6 + +then activate the environment: + +.. literalinclude:: example/rendering/demo_render.py + :lines: 12-26 + +Now, blender can import all modules used by the navigation toolbox. + +.. literalinclude:: example/rendering/demo_render.py + :lines: 30-31 + +With the toolbox at disposition we just need to configure the BeeSampling to render images on a regular 3D grid. + +.. literalinclude:: example/rendering/demo_render.py + :lines: 34 +.. literalinclude:: example/rendering/demo_render.py + :lines: 37-44 + +If we want to use the distance to objects, we need to tell the BeeSampling what is the maximum distance to objects in the environment. Otherwise the distance can go until infinity, and since the image are compressed in the database, all distance to object will be equal to zero: + +.. literalinclude:: example/rendering/demo_render.py + :lines: 48-49 + +Finally we can generate the database. + +.. literalinclude:: example/rendering/demo_render.py + :lines: 53-54 + +How to test the script: +~~~~~~~~~~~~~~~~~~~~~~~ +>>> blender test.blend --background --python demo_test.py + + +Cyberbee +-------- +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 diff --git a/navipy/database/__init__.py b/navipy/database/__init__.py index 37d5330f2d329338dea633d099b0c8ab59cda58b..7e7062b286cfc1bf2451dd6b02610716732abbdb 100644 --- a/navipy/database/__init__.py +++ b/navipy/database/__init__.py @@ -146,7 +146,10 @@ It creates three sql table on initialisation. filename, detect_types=sqlite3.PARSE_DECLTYPES) self.db_cursor = self.db.cursor() for tablename, _ in self.tablecolumns.items(): +<<<<<<< HEAD print(tablename) +======= +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 assert self.table_exist(tablename),\ '{} does not contain a table named {}'.format( filename, tablename) @@ -160,7 +163,10 @@ It creates three sql table on initialisation. for colname, coltype in val.items(): columns += ' , ' + colname + ' ' + coltype columns += ')' +<<<<<<< HEAD print(key, columns) +======= +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 self.db_cursor.execute( "create table {} {}".format(key, columns)) self.db.commit() @@ -279,6 +285,27 @@ class DataBaseLoad(DataBase): to write on database (Load class)""" return False +<<<<<<< HEAD +======= + def iter_posorients(self): + """Iter through all position orientation in the database + """ + self.db_cursor.execute( + """ + SELECT * + FROM position_orientation + """) + + columns_names = [] + for col in self.db_cursor.description: + columns_names.append(col[0]) + for row in self.db_cursor: + toyield = pd.Series(data=row, index=columns_names) + toyield.name = toyield.id + toyield.drop('id', inplace=True) + yield toyield + +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 def get_posorients(self): """Return the position orientations of all points in the \ database @@ -288,6 +315,27 @@ database posorient.set_index('id', inplace=True) return posorient +<<<<<<< HEAD +======= + def read_posorient(self, posorient=None, rowid=None): + assert (posorient is None) or (rowid is None),\ + 'posorient and rowid can not be both None' + if posorient is not None: + rowid = self.get_posid(posorient) + # Read images + tablename = 'position_orientation' + toreturn = pd.read_sql_query( + """ + SELECT * + FROM {} + WHERE (rowid={}) + """.format(tablename, rowid), self.db) + toreturn = toreturn.loc[0, :] + toreturn.name = toreturn.id + toreturn.drop('id') + return toreturn + +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 def read_image(self, posorient=None, rowid=None): """Read an image at a given position-orientation or given id of row in the \ database. diff --git a/navipy/moving/__init__.py b/navipy/moving/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/navipy/moving/agent.py b/navipy/moving/agent.py new file mode 100644 index 0000000000000000000000000000000000000000..7dd1d6cb106919808e37107ebb6ec7ea4e2e592a --- /dev/null +++ b/navipy/moving/agent.py @@ -0,0 +1,292 @@ +""" + +""" +import numpy as np +import pandas as pd +import networkx as nx +from pandas.api.types import is_numeric_dtype +from navipy.database import DataBaseLoad +import navipy.moving.maths as navimomath + + +class AbstractAgent(): + + def __init__(self, + database, + memory_friendly=False): + + if isinstance(database, DataBaseLoad): + self.db = database + else: + raise TypeError('database should be of type DataBaseLoad') + + if memory_friendly: + self.__posorients = None + else: + self.__posorients = self.db.get_posorients() + # set mode of motion + mode_move = {'mode': 'on_cubic_grid', + 'param': {'grid_spacing': 1}} + self.mode_of_motion = mode_move + + @property + def posorients(self): + toreturn = self.__posorients + if toreturn is not None: + toreturn = toreturn.copy() + return toreturn + + @property + def mode_of_motion(self): + """ + """ + toreturn = self.__mode_move + toreturn['describe'] = \ + navimomath.mode_moves_supported()[ + self.__mode_move['mode']]['describe'] + return toreturn + + @mode_of_motion.setter + def mode_of_motion(self, mode): + """ + + """ + if not isinstance(mode, dict): + raise TypeError('Mode is not a dictionary') + if 'mode' not in mode: + raise KeyError("'mode' is not a key of mode") + if 'param' not in mode: + raise KeyError("'param' is not a key of mode") + if mode['mode'] in navimomath.mode_moves_supported().keys(): + for param in navimomath.mode_moves_supported()[ + mode['mode']]['param']: + if param not in mode['param']: + raise KeyError( + "'{}' is not in mode['param']".format(param)) + self.__mode_move = mode + else: + raise ValueError('mode is not supported') + + def abstractmove(self, posorients_vel): + + if isinstance(posorients_vel, pd.Series) is False: + raise TypeError('posorients_vel should be a pandas Series') + for col in ['x', 'y', 'z', 'alpha_0', 'alpha_1', 'alpha_2', + 'dx', 'dy', 'dz', 'dalpha_0', 'dalpha_1', 'dalpha_2']: + if col not in posorients_vel.index: + raise KeyError( + 'posorients_vel should have {} as index'.format(col)) + # Compute the next position + posorients_vel = navimomath.next_pos( + posorients_vel, + move_mode=self.__mode_move['mode'], + move_param=self.__mode_move['param']) + + # Compute the closest possible position + if posorients_vel is None: + posorients_vel[['x', 'y', 'z', + 'alpha_0', 'alpha_1', 'alpha_2']] = \ + navimomath.closest_pos_memory_friendly( + posorients_vel, + self.db) + else: + posorients_vel[['x', 'y', 'z', + 'alpha_0', 'alpha_1', 'alpha_2']] = \ + navimomath.closest_pos( + posorients_vel, + self.__posorients) + return posorients_vel + + +class Single(AbstractAgent): + + def __init__(self, + database, + initial_condition, + memory_friendly=False): + super().__init__(database, memory_friendly) + + self.__posorientvel = pd.Series( + index=['x', 'y', 'z', + 'alpha_0', 'alpha_1', 'alpha_2', + 'dx', 'dy', 'dz', + 'dalpha_0', 'dalpha_1', 'dalpha_2'], + dtype=np.float) + + if isinstance(initial_condition, pd.Series): + if is_numeric_dtype(initial_condition): + for key in self.__posorientvel.index: + self.__posorientvel.loc[key] = initial_condition.loc[key] + else: + raise TypeError('vel should be numeric') + + else: + raise TypeError('vel should be a pandas Series') + + def move(self): + # Compute the next position + self.__posorientvel = self.abstractmove(self.__posorientvel) + + @property + def position(self): + return self.__posorientvel.loc[['x', 'y', 'z']] + + @property + def velocity(self): + return self.__posorientvel.loc[['dx', 'dy', 'dz']] + + @velocity.setter + def velocity(self, vel): + if isinstance(vel, pd.Series): + if is_numeric_dtype(vel): + # Use explicitly vel.dx, ... + # to make sure that the Series contain those + self.__posorientvel.dx = vel.dx + self.__posorientvel.dy = vel.dy + self.__posorientvel.dz = vel.dz + else: + raise TypeError('vel should be numeric') + else: + raise TypeError('vel should be a pandas Series') + + @property + def orientation(self): + return self.__posorientvel.loc[['alpha_0', 'alpha_1', 'alpha_2']] + + @property + def angular_velocity(self): + return self.__posorientvel.loc[['dalpha_0', 'dalpha_1', 'dalpha_2']] + + @angular_velocity.setter + def angular_velocity(self, angvel): + if isinstance(angvel, pd.Series): + if is_numeric_dtype(angvel): + # Use explicitly vel.dx, ... + # to make sure that the Series contain those + self.__posorientvel.dalpha_0 = angvel.dalpha_0 + self.__posorientvel.dalpha_1 = angvel.dalpha_1 + self.__posorientvel.dalpha_2 = angvel.dalpha_2 + else: + raise TypeError('vel should be numeric') + else: + raise TypeError('vel should be a pandas Series') + + +class Multi(AbstractAgent): + + def __init__(self, database): + super().__init__(database, False) + # Init the graph + self.__graph = nx.DiGraph() + for row_id, posor in self.db.get_posorients().iterrows(): + posor.name = row_id + self.__graph.add_node(row_id, + posorient=posor) + + @property + def graph(self): + return self.__graph + + @graph.setter + def graph(self, graph): + if isinstance(graph, nx.DiGraph) is False: + raise TypeError('graph is not a nx.DiGraph') + self.__graph = graph.copy() + self.check_graph() + + def build_graph(self, callback_function): + # Build a graph with luises code + for node in self.__graph.nodes: + posorient = self.__graph[node]['posorient'] + next_node = callback_function(posorient) + if next_node not in self.__graph.nodes(): + raise ValueError('Node does not exist') + else: + self.__graph.add_edge(node, next_node) + self.check_graph() + + def check_graph(self): + self.check_single_target() + + def check_single_target(self): + for node in self.__graph.nodes: + # not connected -> loop not ran + for count, _ in enumerate(self.__graph.neighbors(node)): + # count == 0 -> connected to one node + # count == 1 -> connected to two nodes + if count > 0: + raise ValueError( + 'Node {} leads to several locations'.format(node)) + + def find_attractors(self): + """Return a list of node going to each attractor in a graph + """ + attractors = list() + for attractor in nx.attracting_components(self.__graph): + att = dict() + att['attractor'] = attractor + attractors.append(att) + return attractors + + def find_attractors_sources(self, attractors=None): + """Find all sources going to each attractors + """ + if attractors is None: + attractors = self.find_attractors() + + if isinstance(attractors, list) is False: + raise TypeError('Attractors should be a list of dict') + elif len(attractors) == 0: + raise ValueError('No attractors found') + + # Check attractor + for att in attractors: + keyatt = att.keys() + if 'attractor' not in keyatt: + raise ValueError( + 'Each attractors should contain the key attractor') + + # Calculate connection + for att_i, att in enumerate(attractors): + + # [0] because one node of the attractor is enough + # all other node of the attractor are connected to this one + target = list(att['attractor'])[0] + attractors[att_i]['paths'] = \ + nx.shortest_path(self.graph, target=target) + attractors[att_i]['sources'] = \ + list(attractors[att_i]['paths'].keys()) + return attractors + + def catchment_area(self, attractors=None): + """Return the catchment area for attractors + """ + if attractors is None: + attractors = self.find_attractors_sources() + + if isinstance(attractors, list) is False: + raise TypeError('Attractors should be a list of dict') + elif len(attractors) == 0: + raise ValueError('No attractors found') + + # Check attractor + for att in attractors: + keyatt = att.keys() + if 'sources' not in keyatt: + raise ValueError( + 'Each attractors should contains a list of sources') + + return [len(att['sources']) for att in attractors] + + def reach_goals(self, goals): + """ Return all paths to the goals """ + return nx.shortest_path(self.__graph, target=goals) + + def neighboring_nodes(self, target): + """ Return the nodes going to the target """ + # Reverse graph because nx.neighbors give the end node + # and we want to find the start node going to target + # not where target goes. + tmpgraph = self.__graph.reverse(copy=True) + neighbors = tmpgraph.neighbors(target) + return neighbors diff --git a/navipy/moving/agent.py~ b/navipy/moving/agent.py~ new file mode 100644 index 0000000000000000000000000000000000000000..b8aeee59364cf80b0203b8eeb3d4cd078dc686ba --- /dev/null +++ b/navipy/moving/agent.py~ @@ -0,0 +1,6 @@ +""" + +""" +import numpy as np +import pandas as pd +import .maths diff --git a/navipy/moving/maths.py b/navipy/moving/maths.py new file mode 100644 index 0000000000000000000000000000000000000000..49b34716c5684b81a7554a9cfbd3b2a2a36d5f25 --- /dev/null +++ b/navipy/moving/maths.py @@ -0,0 +1,78 @@ +""" +Mathematical computation are done in this module. Those involve mostly +geometry, and predefined grids shapes +""" +import numpy as np +import pandas as pd + + +def mode_moves_supported(): + return { + 'on_cubic_grid': { + 'param': + ['grid_spacing'], + 'describe': + "Agent restricted to move on a grid"}, + 'free_run': { + 'param': [], + 'describe': + "Freely moving agent, pos(t+dt)=pos+speed (dt=1)"}} + + +def next_pos(motion_vec, move_mode, move_param=None): + """return the future position knowing speed and current position + + :param motion_vec: the position and speed of the agent +(pandas Series with columns ['x','y','z','dx','dy','dz']) + :param grid_spacing: the spacing between two grid points +(only relevant for regular grids) + :param grid_mode: the type of grid. + + ..todo: add literal include for supported_grid_mode + """ + if isinstance(motion_vec, pd.Series) is False: + raise TypeError('motion vector must be a pandas Series') + if move_mode not in mode_moves_supported().keys(): + raise KeyError( + 'move mode must is not supported {}'.format(move_mode)) + + speed = motion_vec.loc[['dx', 'dy', 'dz']] + if move_mode == 'on_cubic_grid': + grid_spacing = move_param['grid_spacing'] + if np.linalg.norm(speed) > 0: + speed /= np.linalg.norm(speed) + scaling = grid_spacing / (2 * np.sin(np.pi / 8)) + elif move_mode is 'free_run': + scaling = 1 # <=> dt = 1, user need to scale speed in dt units + else: + raise ValueError('grid_mode is not supported') + + toreturn = motion_vec + toreturn.loc[['x', 'y', 'z']] += speed.rename({'dx': 'x', + 'dy': 'y', + 'dz': 'z'}) * scaling + return toreturn + + +def closest_pos(pos, positions): + """Return the closest position from a list of positions + + :param pos: the position to find (a pandas Series with ['x','y','z'] + :param positions: the possible closest positions + (a pandas dataframe with ['x','y','z']) + """ + euclidian_dist = np.sqrt( + (pos.x - positions.x)**2 + + (pos.y - positions.y)**2 + + (pos.z - positions.z)**2) + return positions.loc[euclidian_dist.idxmin(), :] + + +def closest_pos_memory_friendly(pos, database): + """Return the closest position from a list of positions + + :param pos: the position to find (a pandas Series with ['x','y','z'] + :param database: the possible closest positions + (a pandas dataframe with ['x','y','z']) + """ + raise NameError('Not implemated') diff --git a/navipy/moving/maths.py~ b/navipy/moving/maths.py~ new file mode 100644 index 0000000000000000000000000000000000000000..4fd7a5baeb4906a31bc4db58ee3cb4e8b189c3cd --- /dev/null +++ b/navipy/moving/maths.py~ @@ -0,0 +1,30 @@ +""" +Mathematical computation are done in this module. Those involve mostly +geometry, and predefined grids shapes +""" +import numpy as np +import pandas as pd + + +def next_pos(motion_vec, grid_spacing=1, grid_mode='cubic'): + """ + + """ + supported_grid_mode = ['cubic', + None] + assert isinstance(motion_vec, pd.Series),\ + 'motion vector must be a pandas Series' + assert grid_mode in supported_grid_mode, + 'grid mode must is not supported {}'.format(grid_mode) + + speed = motion_vec.loc[['dx', 'dy', 'dz']] + position = motion_vec.loc[['x', 'y', 'z']] + if grid_mode == 'cubic': + speed /= np.linalg.norm(speed) + scaling = grid_spacing / (2 * np.sin(np.pi / 8)) + elif grid_mode == None: + scaling = 1 + else: + raise ValueError('grid_mode is not supported') + + return position + speed.rename({'dx': 'x', 'dy': 'y', 'dz': 'z'}) * scaling diff --git a/navipy/moving/test_agent.py b/navipy/moving/test_agent.py new file mode 100644 index 0000000000000000000000000000000000000000..c482eb9da26024bbab1271b93db22156aa8561aa --- /dev/null +++ b/navipy/moving/test_agent.py @@ -0,0 +1,258 @@ +""" +Test of maths +""" +import numpy as np +import pandas as pd +import networkx as nx +import navipy.moving.agent as naviagent +import navipy.database as navidb +import pkg_resources + +import unittest + + +class TestNavipyMovingAgent(unittest.TestCase): + + def setUp(self): + self.mydb_filename = pkg_resources.resource_filename( + 'navipy', 'resources/database.db') + self.mydb = navidb.DataBaseLoad(self.mydb_filename) + + def test_abstractagent_nodb(self): + with self.assertRaises(TypeError): + naviagent.AbstractAgent('NotDB') + + def test_memfriendly(self): + """posorient is loaded if memory_friendly is False """ + agent = naviagent.AbstractAgent(self.mydb, memory_friendly=False) + self.assertTrue( + isinstance(agent.posorients, pd.DataFrame), + 'posorients should be a pd.DataFrame when memfriendly is false') + agent = naviagent.AbstractAgent(self.mydb, memory_friendly=True) + self.assertTrue( + agent.posorients is None, + 'posorients should be None when memfriendly is true') + + def test_abstractmove_inputs(self): + """abstractmove should TypeError if not pandas Series """ + agent = naviagent.AbstractAgent(self.mydb, memory_friendly=False) + with self.assertRaises(TypeError): + agent.abstractmove('NotPandasSeries') + + posorient_vel = pd.Series() + for col in ['x', 'y', 'z', 'alpha_0', 'alpha_1', 'alpha_2', + 'dx', 'dy', 'dz', 'dalpha_0', 'dalpha_1', 'dalpha_2']: + with self.assertRaises(KeyError): + agent.abstractmove(posorient_vel) + posorient_vel[col] = 2 + + def test_abstractmove_null_vellocity(self): + """abstractmove should leads to same point with null vel""" + agent = naviagent.AbstractAgent(self.mydb, memory_friendly=False) + + posorient_vel = pd.Series(data=0, + index=['x', 'y', 'z', + 'alpha_0', 'alpha_1', 'alpha_2', + 'dx', 'dy', 'dz', + 'dalpha_0', 'dalpha_1', 'dalpha_2']) + pos = self.mydb.read_posorient(rowid=1) + posorient_vel.loc[['x', 'y', 'z']] = pos.loc[['x', 'y', 'z']] + + newpos = agent.abstractmove(posorient_vel) + self.assertTrue(newpos.equals(posorient_vel), + 'Agent moved although velocity is null') + + # + # Single + # + def test_init_inputs(self): + initial_condition = 'A' + with self.assertRaises(TypeError): + naviagent.Single(self.mydb, + initial_condition, + memory_friendly=False) + + initial_condition = pd.Series(index=['x'], data='a') + with self.assertRaises(TypeError): + naviagent.Single(self.mydb, + initial_condition, + memory_friendly=False) + + def test_velocity_setter(self): + posorient_vel = pd.Series(data=np.random.rand(12), + index=['x', 'y', 'z', + 'alpha_0', 'alpha_1', 'alpha_2', + 'dx', 'dy', 'dz', + 'dalpha_0', 'dalpha_1', 'dalpha_2']) + agent = naviagent.Single(self.mydb, + posorient_vel, + memory_friendly=False) + agent.velocity = posorient_vel + self.assertTrue( + posorient_vel.loc[['dx', 'dy', 'dz']].equals( + agent.velocity), + 'velocity setter failed') + + def test_angular_velocity(self): + posorient_vel = pd.Series(data=np.random.rand(12), + index=['x', 'y', 'z', + 'alpha_0', 'alpha_1', 'alpha_2', + 'dx', 'dy', 'dz', + 'dalpha_0', 'dalpha_1', 'dalpha_2']) + agent = naviagent.Single(self.mydb, + posorient_vel, + memory_friendly=False) + agent.angular_velocity = posorient_vel + self.assertTrue( + posorient_vel.loc[['dalpha_0', 'dalpha_1', 'dalpha_2']].equals( + agent.angular_velocity), + 'angular velocity setter failed') + + # + # Multi + # + def test_init(self): + agent = naviagent.Multi(self.mydb) + self.assertEqual(sorted(agent.graph.nodes), + sorted(list(self.mydb.get_posorients().index)), + 'Init of graph failed. Node missmatch') + + def test_graph_setter(self): + agent = naviagent.Multi(self.mydb) + graph_nodes = list(agent.graph.nodes) + graph_edges = list() + for gnode in graph_nodes[1:]: + graph_edges.append((gnode, graph_nodes[0])) + + graph = nx.DiGraph() + graph.add_nodes_from(graph_nodes) + graph.add_edges_from(graph_edges) + agent.graph = graph + + graph_edges.append((graph_nodes[2], graph_nodes[1])) + graph = nx.DiGraph() + graph.add_nodes_from(graph_nodes) + graph.add_edges_from(graph_edges) + with self.assertRaises(ValueError): + agent.graph = graph + + def test_catchment_area(self): + """ + 1 Test all node to first + 2 Test 11 nodes to first, 14 to 12th + 3 Two loops attractors + """ + # Test all node to first + agent = naviagent.Multi(self.mydb) + + graph_nodes = list(agent.graph.nodes) + graph_edges = list() + for gnode in graph_nodes[1:]: + graph_edges.append((gnode, graph_nodes[0])) + + graph = nx.DiGraph() + graph.add_nodes_from(graph_nodes) + graph.add_edges_from(graph_edges) + agent.graph = graph + attractors = agent.find_attractors() + self.assertEqual(len(attractors), 1, 'Too many or too few attractors') + attractors = agent.find_attractors_sources(attractors) + catchment_area = agent.catchment_area(attractors) + self.assertEqual(catchment_area, [len(graph_nodes)], + 'Too big or too short catchment area') + + # Test 11 nodes to first, 14 to 12th + graph_edges = list() + for gnode in graph_nodes[1:11]: + graph_edges.append((gnode, graph_nodes[0])) + for gnode in graph_nodes[11:]: + graph_edges.append((gnode, graph_nodes[11])) + + graph = nx.DiGraph() + graph.add_nodes_from(graph_nodes) + graph.add_edges_from(graph_edges) + agent.graph = graph + attractors = agent.find_attractors() + self.assertEqual(len(attractors), 2, 'Too many or too few attractors') + attractors = agent.find_attractors_sources(attractors) + catchment_area = agent.catchment_area(attractors) + self.assertEqual(sorted(catchment_area), [11, 14], + 'Too big or too short catchment area') + + # Two loops attractors + graph_edges = list() + for snode, enode in zip(graph_nodes[:11], + np.alpha_2(graph_nodes[:11], 1)): + graph_edges.append((snode, enode)) + for snode, enode in zip(graph_nodes[11:], + np.alpha_2(graph_nodes[11:], 1)): + graph_edges.append((snode, enode)) + + graph = nx.DiGraph() + graph.add_nodes_from(graph_nodes) + graph.add_edges_from(graph_edges) + agent.graph = graph + attractors = agent.find_attractors() + self.assertEqual(len(attractors), 2, 'Too many or too few attractors') + attractors = agent.find_attractors_sources(attractors) + catchment_area = agent.catchment_area(attractors) + self.assertEqual(sorted(catchment_area), [11, 14], + 'Too big or too short catchment area') + + def test_neighboring_nodes(self): + """ Counting neighnoring nodes for 3 situations + 1. Local maxima + 2. Saddle points + 3. Local minima + """ + agent = naviagent.Multi(self.mydb) + # Local maxima + graph_nodes = list(agent.graph.nodes) + graph_edges = list() + graph_edges.append((graph_nodes[0], + graph_nodes[1])) + + graph = nx.DiGraph() + graph.add_nodes_from(graph_nodes) + graph.add_edges_from(graph_edges) + agent.graph = graph + neighbors = agent.neighboring_nodes(graph_nodes[0]) + expected_nbh = [] + obtained_nbh = [a for a in neighbors] + self.assertEqual(sorted(expected_nbh), + sorted(obtained_nbh), + 'Problem neighbors maxima') + + # Saddle points + graph_edges.append((graph_nodes[1], + graph_nodes[2])) + + graph = nx.DiGraph() + graph.add_nodes_from(graph_nodes) + graph.add_edges_from(graph_edges) + agent.graph = graph + neighbors = agent.neighboring_nodes(graph_nodes[1]) + expected_nbh = [graph_nodes[0]] + obtained_nbh = [a for a in neighbors] + self.assertEqual(sorted(expected_nbh), + sorted(obtained_nbh), + 'Problem neighbors saddle') + + # Local maxima points + graph_edges.append((graph_nodes[3], + graph_nodes[2])) + + graph = nx.DiGraph() + graph.add_nodes_from(graph_nodes) + graph.add_edges_from(graph_edges) + agent.graph = graph + neighbors = agent.neighboring_nodes(graph_nodes[2]) + expected_nbh = [graph_nodes[3], graph_nodes[1]] + obtained_nbh = [a for a in neighbors] + self.assertEqual(sorted(expected_nbh), + sorted(obtained_nbh), + 'Problem neighbors minima') + + +if __name__ == '__main__': + unittest.main() diff --git a/navipy/moving/test_maths.py b/navipy/moving/test_maths.py new file mode 100644 index 0000000000000000000000000000000000000000..9e5753028784287d4b7415777cbf4fc0b82d5247 --- /dev/null +++ b/navipy/moving/test_maths.py @@ -0,0 +1,92 @@ +""" +Test of maths +""" +import numpy as np +import pandas as pd +import navipy.moving.maths as navimaths + + +import unittest + + +class TestNavipyMovingMaths(unittest.TestCase): + + def test_motion_vec_pandas(self): + motion_vec = 'NotPandas' + move_mode = 'on_cubic_grid' + mode_param = dict() + mode_param['grid_spacing'] = 1 + with self.assertRaises(TypeError): + navimaths.next_pos(motion_vec, + move_mode, + move_mode) + + def test_notsupported_mofm(self): + motion_vec = pd.Series(data=0, + index=['x', 'y', 'z', 'dx', 'dy', 'dz']) + move_mode = 'NotSupportedMode' + mode_param = dict() + mode_param['grid_spacing'] = 1 + with self.assertRaises(KeyError): + navimaths.next_pos(motion_vec, + move_mode, + move_mode) + + def test_null_velocity(self): + # Test if stay at same position. + motion_vec = pd.Series(data=0, + index=['x', 'y', 'z', 'dx', 'dy', 'dz']) + move_mode = 'on_cubic_grid' + mode_param = dict() + mode_param['grid_spacing'] = 1 + new_pos = navimaths.next_pos(motion_vec, move_mode, mode_param) + self.assertTrue(new_pos.equals(motion_vec), + 'At null velocity the agent should not move') + + def test_closest_cubic(self): + """ Test if the snaping to cubic is correct """ + positions = pd.DataFrame({'x': [0, 0, 0, 1, 1, 1, 2, 2, 2], + 'y': [0, 1, 2, 0, 1, 2, 0, 1, 2], + 'z': [0, 0, 0, 0, 0, 0, 0, 0, 0]}, + dtype=np.float) + move_mode = 'on_cubic_grid' + move_param = dict() + move_param['grid_spacing'] = 1 + expected_dict = dict() + expected_dict[-22] = 7 # [2,1] + expected_dict[22] = 7 + expected_dict[24] = 8 # [2,2] + expected_dict[67] = 8 + expected_dict[68] = 5 # [1,2] + expected_dict[112] = 5 + expected_dict[113] = 2 # [0,2] + expected_dict[157] = 2 + expected_dict[158] = 1 # [0, 1] + expected_dict[202] = 1 + expected_dict[204] = 0 # [0, 0] + expected_dict[247] = 0 + expected_dict[248] = 3 # [1, 0] + expected_dict[292] = 3 + expected_dict[293] = 6 # [2, 0] + expected_dict[337] = 6 + expected_dict[338] = 7 # equivalent to -22 + + for angle, exp_i in expected_dict.items(): + + alpha = np.deg2rad(angle) + motion_vec = pd.Series( + data=[1, 1, 0, + np.cos(alpha), np.sin(alpha), 0], + index=['x', 'y', 'z', + 'dx', 'dy', 'dz'], + dtype=np.float) + newpos = navimaths.next_pos(motion_vec, + move_mode, + move_param) + snappos = navimaths.closest_pos(newpos, positions) + self.assertEqual(snappos.name, exp_i, + 'closest pos is not correctly snapped') + + +if __name__ == '__main__': + unittest.main() diff --git a/navipy/processing/__init__.py b/navipy/processing/__init__.py index a0cb55ded22b8c6d71232cee5b7c5ae807c7b1c0..8bbda19c6f10c78c3f05bd823501aec7504585b7 100644 --- a/navipy/processing/__init__.py +++ b/navipy/processing/__init__.py @@ -90,6 +90,7 @@ def is_numeric_array(array): def scene(database, posorient=None, rowid=None): +<<<<<<< HEAD """ Return a scene at a position orientation or given rowid in a given database. :param database: a DataBaseLoad class \ @@ -106,6 +107,24 @@ def scene(database, posorient=None, rowid=None): .. plot:: example/processing/scene.py +======= + """ Return a scene at a position orientation or given rowid \ + in a given database. + + :param database: a DataBaseLoad class \ + :param posorient: a pandas Series with index: \ + ['x','y','z','alpha_0,'alpha_1,'alpha_2'] (default None, i.e. not used) + :param rowid: a row identification integer for directly reading \ + in the database (default None, i.e. not used). + :returns: a scene [elevation, azimuth, channel, 1] or \ + [ommatidia,channel,1]. + :rtype: np.ndarray + + .. literalinclude:: example/processing/scene.py + :lines: 13-14 + + .. plot:: example/processing/scene.py +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 """ # where to check if db is okay? in database? diff --git a/navipy/rendering/bee_sampling.py b/navipy/rendering/bee_sampling.py new file mode 100644 index 0000000000000000000000000000000000000000..ff113ec58ca8d2659e16cc1fd435241c00c916f8 --- /dev/null +++ b/navipy/rendering/bee_sampling.py @@ -0,0 +1,132 @@ +""" +The beesampling class +""" +import bpy +import os +import numpy as np +import pandas as pd +import warnings +from navipy.rendering.cyber_bee import Cyberbee +from navipy.database import DataBaseSave + + +class BeeSampling(Cyberbee): + """ + BeeSampling is a class deriving from Cyberbee. + The BeeSampling can be used to generate a database of +images taken on a rectangular regular grid. For the database, +the BeeSampling rely on DataBase + It worth noting that the generated database can take a large +harddrive space, as each image is composed of 4 channels of 180x360 pixels. + """ + + def __init__(self): + """Initialise the BeeSampling""" + Cyberbee.__init__(self) + self.blenddirname = os.path.dirname(bpy.data.filepath) + self.blendfilename = os.path.basename(bpy.data.filepath) + self.__grid_posorients = None + self.__grid_size = None + self.world_dim = np.inf + + def create_sampling_grid(self, x, y, z, alpha1, alpha2, alpha3): + """Create a cubic grid from all the sampling points + + :param x: the positions along the x-axis + :param y: the positions along the y-axis + :param z: the positions along the z-axis + :param alpha1: the first euler angles + :param alpha2: the 2nd euler angles + :param alpha3: the 3rd euler angles + """ + [mx, my, mz, ma1, ma2, ma3] = np.meshgrid(x, + y, + z, + alpha1, + alpha2, + alpha3) + self.grid_size = mx.shape + mx = mx.flatten() + my = my.flatten() + mz = mz.flatten() + ma1 = ma1.flatten() + ma2 = ma2.flatten() + ma3 = ma3.flatten() + self.__grid_posorients = pd.DataFrame(index=range(mx.shape[0]), + columns=['x', 'y', 'z', + 'alpha_0', + 'alpha_1', + 'alpha_2']) + self.__grid_posorients.loc[:, 'x'] = mx + self.__grid_posorients.loc[:, 'y'] = my + self.__grid_posorients.loc[:, 'z'] = mz + self.__grid_posorients.loc[:, 'alpha_0'] = ma1 + self.__grid_posorients.loc[:, 'alpha_1'] = ma2 + self.__grid_posorients.loc[:, 'alpha_2'] = ma3 + self.__grid_posorients.index.name = 'grid_index' + self.__grid_posorients.name = 'grid_position_orientation' + + def get_grid_posorients(self): + """return a copy of the posorientation matrix + + :returns: position-orientations of the grid + :rtype: pandas array + """ + return self.__grid_posorients.copy() + + def set_gridindeces2nan(self, indeces): + """Set certain grid point to nan, so they will be ignore in the rendering + + :param indeces: a list of indeces to be set to nan + """ + self.__grid_posorients.loc[indeces, :] = np.nan + + def render(self, database_filename): + database_folder = os.path.dirname(database_filename) + if not os.path.exists(database_folder): + os.makedirs(database_folder) + dataloger = DataBaseSave(database_filename, + channels=['R', 'G', 'B', 'D'], + arr_dtype=np.uint8) + for frame_i, posorient in self.__grid_posorients.iterrows(): + if np.any(np.isnan(posorient)): + # warnings.warn('frame_i: {} posorient nans'.format(frame_i)) + continue + rowid = dataloger.get_posid(posorient) + if dataloger.check_data_validity(rowid): + warnings.warn( + 'frame_i: {} data is valid rowid {}'.format(frame_i, + rowid)) + continue + # The position-orientatios is valid (none nan) + # and the cmaxminrange has not already been assigned + # so the image need to be rendered + self.update(posorient) + distance = self.get_distance() + distance[distance > self.world_dim] = self.world_dim + image = self.get_image() + image[:, :, 3] = distance + dataloger.write_image(posorient, image) + print('rendering completed') + + +if __name__ == "__main__": + import tempfile + bee_samp = BeeSampling() + # Create mesh + world_dim = 15.0 + x = np.linspace(-7.5, 7.5, 5) + y = np.linspace(-7.5, 7.5, 5) + z = np.arange(1, 8, 2) + alpha_1 = np.array([0]) + np.pi / 2 + alpha_2 = np.array([0]) + alpha_3 = np.array([0]) + bee_samp.create_sampling_grid( + x, y, z, alpha1=alpha_1, alpha2=alpha_2, alpha3=alpha_3) + bee_samp.world_dim = world_dim + grid_pos = bee_samp.get_grid_posorients() + condition = (grid_pos.x**2 + grid_pos.y**2) < ((bee_samp.world_dim / 2)**2) + bee_samp.set_gridindeces2nan(condition[condition == 0].index) + bee_samp.set_cycle_samples(samples=5) + with tempfile.TemporaryDirectory() as folder: + bee_samp.render(folder + '/database.db') diff --git a/navipy/rendering/cyber_bee.py b/navipy/rendering/cyber_bee.py new file mode 100644 index 0000000000000000000000000000000000000000..7184ff8c80ecf4aebb5655d3874e5936c7b4829c --- /dev/null +++ b/navipy/rendering/cyber_bee.py @@ -0,0 +1,265 @@ +""" + How to test the script: + ----------------------- + >>> blender test.blend --background --python Cyberbee.py + + :Author: Olivier Bertrand (olivier.bertrand@uni-bielefeld.de) + :Parent module: Scene_rendering +""" +import bpy +import numpy as np +import tempfile +import os + + +class Cyberbee(): + """ + Cyberbee is a small class binding python with blender. + With Cyberbee one can move the bee to a position, and render what + the bee see at this position. + + The Bee eye is a panoramic camera with equirectangular projection + The light rays attaining the eyes are filtered with a gaussian. + """ + + def __init__(self): + """Initialise the Cyberbee""" + # Rendering engine needs to be Cycles to support panoramic + # equirectangular camera + bpy.context.scene.render.engine = 'CYCLES' + bpy.context.scene.render.layers["RenderLayer"].use_pass_z = True + # Look for object camera + camera_found = False + for obj in bpy.context.scene.objects: + if obj.type == 'CAMERA': + self.camera = obj + camera_found = True + break + assert camera_found, 'The blender file does not contain a camera' + # The bee eye is panoramic, and with equirectangular projection + self.camera.data.type = 'PANO' + self.camera.data.cycles.panorama_type = 'EQUIRECTANGULAR' + # Filtering props + bpy.context.scene.cycles.filter_type = 'GAUSSIAN' + # Call all set function with default values + self.set_camera_rotation_mode() + self.set_camera_fov() + self.set_camera_gaussian_width() + self.set_camera_resolution() + self.set_cycle_samples() + # switch on nodes + # Create render link to OutputFile with Image and Z buffer + bpy.context.scene.use_nodes = True + scene = bpy.context.scene + nodes = scene.node_tree.nodes + + render_layers = nodes['Render Layers'] + output_file = nodes.new("CompositorNodeOutputFile") + output_file.format.file_format = "OPEN_EXR" + output_file.file_slots.remove(output_file.inputs[0]) + tmp_fileoutput = dict() + tmp_fileoutput['Image'] = 'Image' + tmp_fileoutput['Depth'] = 'Depth' + tmp_fileoutput['Folder'] = tempfile.TemporaryDirectory().name + tmp_fileoutput['ext'] = '.exr' + output_file.file_slots.new(tmp_fileoutput['Image']) + output_file.file_slots.new(tmp_fileoutput['Depth']) + output_file.base_path = tmp_fileoutput['Folder'] + scene.node_tree.links.new( + render_layers.outputs['Image'], + output_file.inputs['Image'] + ) + scene.node_tree.links.new( + render_layers.outputs['Z'], + output_file.inputs['Depth'] + ) + self.tmp_fileoutput = tmp_fileoutput + + def set_camera_rotation_mode(self, mode='XYZ'): + """change the camera rotation mode + + :param mode: the mode of rotation for the camera see blender doc + (default: 'XYZ'). + :type mode: a string + .. seealso: blender bpy.data.scenes["Scene"].camera.rotation_mode + """ + bpy.data.scenes["Scene"].camera.rotation_mode = mode + + def get_camera_rotation_mode(self): + """get the current camera rotation mode + + :returns: the mode of rotation used by the camera + :rtype: string + """ + return bpy.data.scenes["Scene"].camera.rotation_mode + + def set_cycle_samples(self, samples=30): + """change the samples for rendering with cycle + + :param samples: the number of samples to use when rendering images + :type samples: int + """ + bpy.context.scene.cycles.samples = samples + + def get_cycle_samples(self): + """get the samples for rendering with cycle + + :returns: the number of samples used for the rendering + :rtype: int + """ + return bpy.context.scene.cycles.samples + + def set_camera_fov(self, latmin=-90, latmax=+90, + longmin=-180, longmax=+180): + """change the field of view of the panoramic camera + + :param latmin: minimum latitude (in deg) + :type latmin: float + :param latmax: maximum latitude (in deg) + :type latmax: float + :param longmin: minimum longitude (in deg) + :type longmin: float + :param longmin: maximum longitude (in deg) + :type longmin: float + """ + assert self.camera.data.type == 'PANO', 'Camera is not panoramic' + assert self.camera.data.cycles.panorama_type == 'EQUIRECTANGULAR',\ + 'Camera is not equirectangular' + self.camera.data.cycles.latitude_min = np.deg2rad(latmin) + self.camera.data.cycles.latitude_max = np.deg2rad(latmax) + self.camera.data.cycles.longitude_min = np.deg2rad(longmin) + self.camera.data.cycles.longitude_max = np.deg2rad(longmax) + + def get_camera_fov(self): + """get fov of camera + + :returns: the field of view of the camera as min/max,longitude/latitude + in degrees + :rtype: dict + """ + assert self.camera.data.type == 'PANO', 'Camera is not panoramic' + assert self.camera.cycles.panorama_type == 'EQUIRECTANGULAR',\ + 'Camera is not equirectangular' + fov = dict() + fov['latitude_min'] = np.rad2ged(self.camera.data.cycles.latitude_min) + fov['latitude_max'] = np.rad2ged(self.camera.data.cycles.latitude_max) + fov['longitude_min'] = np.rad2ged( + self.camera.data.cycles.longitude_min) + fov['longitude_max'] = np.rad2ged( + self.camera.data.cycles.longitude_max) + return fov + + def set_camera_gaussian_width(self, gauss_w=1.5): + """change width of the gaussian spatial filter + + :param gauss_w: width of the gaussian filter + :type gauss_w: float + """ + bpy.context.scene.cycles.filter_width = gauss_w + + def get_camera_gaussian_width(self, gauss_w=1.5): + """get width of the gaussian spatial filter + + :returns: the width of the gaussian filter + :rtype: float + """ + return bpy.context.scene.cycles.filter_width + + def set_camera_resolution(self, resolution_x=360, resolution_y=180): + """change the camera resolution (nb of pixels) + + :param resolution_x: number of pixels along the x-axis of the camera + :type resolution_x: int + :param resolution_y: number of pixels along the y-axis of the camera + :type resolution_y: int + """ + bpy.context.scene.render.resolution_x = resolution_x + bpy.context.scene.render.resolution_y = resolution_y + bpy.context.scene.render.resolution_percentage = 100 + + def get_camera_resolution(self): + """return camera resolution (x,y) + + :returns: the resolution of the camera along (x-axis,y-axis) + :rtype: (int,int) + """ + resolution_x = bpy.context.scene.render.resolution_x + resolution_y = bpy.context.scene.render.resolution_y + return resolution_x, resolution_y + + def update(self, posorient): + """assign the position and the orientation of the camera. + + :param posorient: is a 1x6 vector continaing: + x,y,z, angle_1, angle_2, angle_3, + here the angles are euler rotation around the axis + specified by scene.camera.rotation_mode + :type posorient: 1x6 double array + """ + assert len(posorient) == 6, 'posorient should be a 1x6 double array' + self.camera.location = posorient[:3] + self.camera.rotation_euler = posorient[3:] + # Render + bpy.ops.render.render() + + def get_image(self): + """return the last rendered image as a numpy array + + :returns: the image (height,width,4) + :rtype: a double numpy array + + .. note: A temporary file will be written on the harddrive, + due to API blender limitation + """ + # save image as a temporary file, and then loaded + # sadly the rendered image pixels can not directly be access + filename = os.path.join(self.tmp_fileoutput['Folder'], + self.tmp_fileoutput['Image'] + '0001' + + self.tmp_fileoutput['ext']) + im_width, im_height = self.get_camera_resolution() + im = bpy.data.images.load(filename) + pixels = np.array(im.pixels) + # im=PIL.Image.open(filename) + # pixels=np.asarray(im) + pixels = pixels.reshape([im_height, im_width, 4]) + return pixels + + def get_distance(self): + """return the last rendered distance map as a numpy array + + :returns: the distance map (height, width) + :rtype: a double numpy array + + .. note: A temporary file will be written on the harddrive, + due to API blender limitation + """ + # save image as a temporary file, and then loaded + # sadly the rendered image pixels can not directly be access + filename = os.path.join(self.tmp_fileoutput['Folder'], + self.tmp_fileoutput['Depth'] + '0001' + + self.tmp_fileoutput['ext']) + im_width, im_height = self.get_camera_resolution() + im = bpy.data.images.load(filename) + distance = np.array(im.pixels) + # im=PIL.Image.open(filename) + # distance=np.asarray(im) + distance = distance.reshape([im_height, im_width, 4]) + distance = distance[:, :, 0] + return distance + + +if __name__ == "__main__": + # Initiate the Cyberbee + mybee = Cyberbee() + frames_per_revolution = 5.0 + step_size = 2 * np.pi / frames_per_revolution + posorients = np.zeros((frames_per_revolution, 6)) + posorients[:, 0] = np.sin(np.arange(frames_per_revolution) * step_size) * 5 + posorients[:, 1] = np.cos(np.arange(frames_per_revolution) * step_size) * 5 + for frame_i, posorient in enumerate(posorients): + mybee.update(posorient) + # Test image + image = mybee.get_image() + # Test distance + distance = mybee.get_distance() + print('Cyberbee OK') diff --git a/todo b/todo index 612f2322aafd788480977dd319faa36ff772424c..137d19c4cdafc1f11d804bf1ac0db12f278f3947 100644 --- a/todo +++ b/todo @@ -1,2 +1,59 @@ +<<<<<<< HEAD +======= +0001: Remove DUPLICATE: +Remove DUPLICATE: is_numeric_array is in: + processing.__init__ + and comparing.__init__ + + use the one it processing.__init__ + +Remove DUPLICATE: check_scene is in: + processing.__init__ + and comparing.__init__ + +Move check_scene, is_numeric_array to: + processing.__init__ +------------------------------------------------------ +0002: Restructure processing: +Move function in processing/__init__ to processing/place_code.py +Move function optic_flow in processing/place_code.py to processing/motion_code.py + +------------------------------------------------------ +0003: Improve database +In the init database I would like to use class properties instead of get/read +line: 263,273,and 394 + def create(self) +should be replaced by: + @property + def create(self) + +It implies that at every point that self.create() is called should be changed to self.create [Note the absence of parenthesis] + +line: 298 + def get_posorients(self) +should be replaced by + @property + def posorients(self) + +Need to propagate the changes through all the code (see rendering / processing / moving ) +------------------------------------------------------ +0004: Change every assert by a if () raise TypeError/IOError/KeyError/... +- present in processing +- present in database + +------------------------------------------------------ +0005: Write test function for raise Error +- for every raise error create a test function, checking that the error is correctly thrown (see moving/test_agent for inspiration) + +------------------------------------------------------ +0006: Improve comparing/__init__.py +- Change comment in simple_image_diff +- call simple_image_diff in imagediff. you can then remove all the assert (that should be raise Error at that point) from imagediff +- Add comment to diff_optic_flow / add reference to article. +- rename capitalised variable A,ATA, and b as longer variable name [future PEP8 will forbid this] + +------------------------------------------------------ +0007: Fix test processing +>>>>>>> a85c0cc1d498234a17941f8c483c69983b367529 - Fix db in test function such that it work from any location. (probably need to add a module resources and function to load them) - Test are failing WHY???