Commit 0dfdff28 by PE Hladik

update documentation

parent e0168bfc
# Sphinx build info version 1 # 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. # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done.
config: 8d6238250f69b97f9d900e69d2ee510c config: c103baf0970c33bc4d41f39bfbad1b13
tags: 645f666f9bcd5a90fca523b33c5a78b7 tags: 645f666f9bcd5a90fca523b33c5a78b7
...@@ -125,8 +125,8 @@ It is possible to get more information from the tasks using :class:`Results <sim ...@@ -125,8 +125,8 @@ It is possible to get more information from the tasks using :class:`Results <sim
Or the number of preemptions per task:: Or the number of preemptions per task::
for task in model.results.task_list: for task in model.results.tasks.values():
print("%s %d" % (task.name, sum([job.preemption_count for job in task.jobs]))) print("%s %s" % (task.name, task.preemption_count))
You can get all the metrics provided in the :class:`TaskR <simso.core.results.TaskR>` and :class:`JobR <simso.core.results.JobR>` objects. Read the documentation of these classes to know exactly what is directly accessible. You can get all the metrics provided in the :class:`TaskR <simso.core.results.TaskR>` and :class:`JobR <simso.core.results.JobR>` objects. Read the documentation of these classes to know exactly what is directly accessible.
...@@ -137,8 +137,8 @@ It is also possible to get the monitor object from each processors. This is a ve ...@@ -137,8 +137,8 @@ It is also possible to get the monitor object from each processors. This is a ve
prev = None prev = None
for evt in processor.monitor: for evt in processor.monitor:
if evt[1].event == ProcEvent.RUN: if evt[1].event == ProcEvent.RUN:
if prev is not None and prev != evt[1].args.identifier: if prev is not None and prev != evt[1].args.task:
cxt += 1 cxt += 1
prev = evt[1].args.identifier prev = evt[1].args.task
print("Number of context switches (without counting the OS): " + str(cxt)) print("Number of context switches (without counting the OS): " + str(cxt))
...@@ -130,7 +130,7 @@ Then the Scheduler can be initialized like this:: ...@@ -130,7 +130,7 @@ Then the Scheduler can be initialized like this::
class P_EDF(PartitionedScheduler): class P_EDF(PartitionedScheduler):
def init(self): def init(self):
PartitionedScheduler.init(self, SchedulerInfo("simso.schedulers.EDF_mono")) PartitionedScheduler.init(self, SchedulerInfo("EDF_mono", EDF_mono))
Defining the packing Defining the packing
...@@ -170,7 +170,7 @@ Complete source code:: ...@@ -170,7 +170,7 @@ Complete source code::
class P_EDF(PartitionedScheduler): class P_EDF(PartitionedScheduler):
def init(self): def init(self):
PartitionedScheduler.init(self, SchedulerInfo("simso.schedulers.EDF_mono")) PartitionedScheduler.init(self, SchedulerInfo("EDF_mono", EDF_mono))
def packer(self): def packer(self):
# First Fit # First Fit
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
* *
* Sphinx stylesheet -- basic theme. * Sphinx stylesheet -- basic theme.
* *
* :copyright: Copyright 2007-2014 by the Sphinx team, see AUTHORS. * :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS.
* :license: BSD, see LICENSE for details. * :license: BSD, see LICENSE for details.
* *
*/ */
...@@ -197,7 +197,10 @@ h3:hover > a.headerlink, ...@@ -197,7 +197,10 @@ h3:hover > a.headerlink,
h4:hover > a.headerlink, h4:hover > a.headerlink,
h5:hover > a.headerlink, h5:hover > a.headerlink,
h6:hover > a.headerlink, h6:hover > a.headerlink,
dt:hover > a.headerlink { dt:hover > a.headerlink,
caption:hover > a.headerlink,
p.caption:hover > a.headerlink,
div.code-block-caption:hover > a.headerlink {
visibility: visible; visibility: visible;
} }
...@@ -314,6 +317,13 @@ table.docutils { ...@@ -314,6 +317,13 @@ table.docutils {
border-collapse: collapse; border-collapse: collapse;
} }
table caption span.caption-number {
font-style: italic;
}
table caption span.caption-text {
}
table.docutils td, table.docutils th { table.docutils td, table.docutils th {
padding: 1px 8px 1px 5px; padding: 1px 8px 1px 5px;
border-top: 0; border-top: 0;
...@@ -344,6 +354,25 @@ table.citation td { ...@@ -344,6 +354,25 @@ table.citation td {
border-bottom: none; border-bottom: none;
} }
/* -- figures --------------------------------------------------------------- */
div.figure {
margin: 0.5em;
padding: 0.5em;
}
div.figure p.caption {
padding: 0.3em;
}
div.figure p.caption span.caption-number {
font-style: italic;
}
div.figure p.caption span.caption-text {
}
/* -- other body styles ----------------------------------------------------- */ /* -- other body styles ----------------------------------------------------- */
ol.arabic { ol.arabic {
...@@ -406,6 +435,10 @@ dl.glossary dt { ...@@ -406,6 +435,10 @@ dl.glossary dt {
font-size: 1.3em; font-size: 1.3em;
} }
.sig-paren {
font-size: larger;
}
.versionmodified { .versionmodified {
font-style: italic; font-style: italic;
} }
...@@ -471,22 +504,51 @@ table.highlighttable td { ...@@ -471,22 +504,51 @@ table.highlighttable td {
padding: 0 0.5em 0 0.5em; padding: 0 0.5em 0 0.5em;
} }
tt.descname { div.code-block-caption {
padding: 2px 5px;
font-size: small;
}
div.code-block-caption code {
background-color: transparent;
}
div.code-block-caption + div > div.highlight > pre {
margin-top: 0;
}
div.code-block-caption span.caption-number {
padding: 0.1em 0.3em;
font-style: italic;
}
div.code-block-caption span.caption-text {
}
div.literal-block-wrapper {
padding: 1em 1em 0;
}
div.literal-block-wrapper div.highlight {
margin: 0;
}
code.descname {
background-color: transparent; background-color: transparent;
font-weight: bold; font-weight: bold;
font-size: 1.2em; font-size: 1.2em;
} }
tt.descclassname { code.descclassname {
background-color: transparent; background-color: transparent;
} }
tt.xref, a tt { code.xref, a code {
background-color: transparent; background-color: transparent;
font-weight: bold; font-weight: bold;
} }
h1 tt, h2 tt, h3 tt, h4 tt, h5 tt, h6 tt { h1 code, h2 code, h3 code, h4 code, h5 code, h6 code {
background-color: transparent; background-color: transparent;
} }
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
* *
* Sphinx JavaScript utilities for all documentation. * Sphinx JavaScript utilities for all documentation.
* *
* :copyright: Copyright 2007-2014 by the Sphinx team, see AUTHORS. * :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS.
* :license: BSD, see LICENSE for details. * :license: BSD, see LICENSE for details.
* *
*/ */
...@@ -91,6 +91,30 @@ jQuery.fn.highlightText = function(text, className) { ...@@ -91,6 +91,30 @@ jQuery.fn.highlightText = function(text, className) {
}); });
}; };
/*
* backward compatibility for jQuery.browser
* This will be supported until firefox bug is fixed.
*/
if (!jQuery.browser) {
jQuery.uaMatch = function(ua) {
ua = ua.toLowerCase();
var match = /(chrome)[ \/]([\w.]+)/.exec(ua) ||
/(webkit)[ \/]([\w.]+)/.exec(ua) ||
/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) ||
/(msie) ([\w.]+)/.exec(ua) ||
ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) ||
[];
return {
browser: match[ 1 ] || "",
version: match[ 2 ] || "0"
};
};
jQuery.browser = {};
jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true;
}
/** /**
* Small JavaScript module for the documentation. * Small JavaScript module for the documentation.
*/ */
...@@ -152,9 +176,10 @@ var Documentation = { ...@@ -152,9 +176,10 @@ var Documentation = {
/** /**
* workaround a firefox stupidity * workaround a firefox stupidity
* see: https://bugzilla.mozilla.org/show_bug.cgi?id=645075
*/ */
fixFirefoxAnchorBug : function() { fixFirefoxAnchorBug : function() {
if (document.location.hash && $.browser.mozilla) if (document.location.hash)
window.setTimeout(function() { window.setTimeout(function() {
document.location.href += ''; document.location.href += '';
}, 10); }, 10);
......

368 Bytes | W: | H:

347 Bytes | W: | H:

docs/html/_static/down-pressed.png
docs/html/_static/down-pressed.png
docs/html/_static/down-pressed.png
docs/html/_static/down-pressed.png
  • 2-up
  • Swipe
  • Onion skin

363 Bytes | W: | H:

347 Bytes | W: | H:

docs/html/_static/down.png
docs/html/_static/down.png
docs/html/_static/down.png
docs/html/_static/down.png
  • 2-up
  • Swipe
  • Onion skin

392 Bytes | W: | H:

358 Bytes | W: | H:

docs/html/_static/file.png
docs/html/_static/file.png
docs/html/_static/file.png
docs/html/_static/file.png
  • 2-up
  • Swipe
  • Onion skin
This source diff could not be displayed because it is too large. You can view the blob instead.

199 Bytes | W: | H:

173 Bytes | W: | H:

docs/html/_static/minus.png
docs/html/_static/minus.png
docs/html/_static/minus.png
docs/html/_static/minus.png
  • 2-up
  • Swipe
  • Onion skin
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
* *
* Sphinx stylesheet -- nature theme. * Sphinx stylesheet -- nature theme.
* *
* :copyright: Copyright 2007-2014 by the Sphinx team, see AUTHORS. * :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS.
* :license: BSD, see LICENSE for details. * :license: BSD, see LICENSE for details.
* *
*/ */
...@@ -226,7 +226,7 @@ pre { ...@@ -226,7 +226,7 @@ pre {
-moz-box-shadow: 1px 1px 1px #d8d8d8; -moz-box-shadow: 1px 1px 1px #d8d8d8;
} }
tt { code {
background-color: #ecf0f3; background-color: #ecf0f3;
color: #222; color: #222;
/* padding: 1px 2px; */ /* padding: 1px 2px; */
...@@ -242,4 +242,10 @@ div.viewcode-block:target { ...@@ -242,4 +242,10 @@ div.viewcode-block:target {
background-color: #f4debf; background-color: #f4debf;
border-top: 1px solid #ac9; border-top: 1px solid #ac9;
border-bottom: 1px solid #ac9; border-bottom: 1px solid #ac9;
}
div.code-block-caption {
background-color: #ddd;
color: #222;
border: 1px solid #C6C9CB;
} }
\ No newline at end of file

199 Bytes | W: | H:

173 Bytes | W: | H:

docs/html/_static/plus.png
docs/html/_static/plus.png
docs/html/_static/plus.png
docs/html/_static/plus.png
  • 2-up
  • Swipe
  • Onion skin
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
* *
* Sphinx JavaScript utilties for the full-text search. * Sphinx JavaScript utilties for the full-text search.
* *
* :copyright: Copyright 2007-2014 by the Sphinx team, see AUTHORS. * :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS.
* :license: BSD, see LICENSE for details. * :license: BSD, see LICENSE for details.
* *
*/ */
...@@ -439,7 +439,7 @@ var Search = { ...@@ -439,7 +439,7 @@ var Search = {
dataType: "text", dataType: "text",
complete: function(jqxhr, textstatus) { complete: function(jqxhr, textstatus) {
var data = jqxhr.responseText; var data = jqxhr.responseText;
if (data !== '') { if (data !== '' && data !== undefined) {
listItem.append(Search.makeSearchSummary(data, searchterms, hlterms)); listItem.append(Search.makeSearchSummary(data, searchterms, hlterms));
} }
Search.output.append(listItem); Search.output.append(listItem);
......
// Underscore.js 1.7.0 // Underscore.js 1.3.1
// http://underscorejs.org // (c) 2009-2012 Jeremy Ashkenas, DocumentCloud Inc.
// (c) 2009-2014 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors // Underscore is freely distributable under the MIT license.
// Underscore may be freely distributed under the MIT license. // Portions of Underscore are inspired or borrowed from Prototype,
// Oliver Steele's Functional, and John Resig's Micro-Templating.
(function() { // For all details and documentation:
// http://documentcloud.github.com/underscore
// Baseline setup (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=
// Establish the root object, `window` in the browser, or `exports` on the server. 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==
var root = this; 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=
// Save the previous value of the `_` variable. 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=
var previousUnderscore = root._; 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,
// Save bytes in the minified (but not gzipped) version: 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=
var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype; 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,
// Create quick reference variables for speed access to core prototypes. 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 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,
push = ArrayProto.push, 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:
slice = ArrayProto.slice, 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]}};
concat = ArrayProto.concat, 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,
toString = ObjProto.toString, 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)};
hasOwnProperty = ObjProto.hasOwnProperty; 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,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#x27;").replace(/\//g,"&#x2F;")};b.mixin=function(a){j(b.functions(a),
// All **ECMAScript 5** native function implementations that we hope to use 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("+
// are declared here. 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]=
var 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=
nativeIsArray = Array.isArray, true;return this};m.prototype.value=function(){return this._wrapped}}).call(this);
nativeKeys = Object.keys,
nativeBind = FuncProto.bind;
// Create a safe reference to the Underscore object for use below.
var _ = function(obj) {
if (obj instanceof _) return obj;
if (!(this instanceof _)) return new _(obj);
this._wrapped = obj;
};
// Export the Underscore object for **Node.js**, with
// backwards-compatibility for the old `require()` API. If we're in
// the browser, add `_` as a global object.
if (typeof exports !== 'undefined') {
if (typeof module !== 'undefined' && module.exports) {
exports = module.exports = _;
}
exports._ = _;
} else {
root._ = _;
}
// Current version.
_.VERSION = '1.7.0';
// Internal function that returns an efficient (for current engines) version
// of the passed-in callback, to be repeatedly applied in other Underscore
// functions.
var createCallback = function(func, context, argCount) {
if (context === void 0) return func;
switch (argCount == null ? 3 : argCount) {
case 1: return function(value) {
return func.call(context, value);
};
case 2: return function(value, other) {
return func.call(context, value, other);
};
case 3: return function(value, index, collection) {
return func.call(context, value, index, collection);
};
case 4: return function(accumulator, value, index, collection) {
return func.call(context, accumulator, value, index, collection);
};
}
return function() {
return func.apply(context, arguments);
};
};
// A mostly-internal function to generate callbacks that can be applied
// to each element in a collection, returning the desired result — either
// identity, an arbitrary callback, a property matcher, or a property accessor.
_.iteratee = function(value, context, argCount) {
if (value == null) return _.identity;
if (_.isFunction(value)) return createCallback(value, context, argCount);
if (_.isObject(value)) return _.matches(value);
return _.property(value);
};
// Collection Functions
// --------------------
// The cornerstone, an `each` implementation, aka `forEach`.
// Handles raw objects in addition to array-likes. Treats all
// sparse array-likes as if they were dense.
_.each = _.forEach = function(obj, iteratee, context) {
if (obj == null) return obj;
iteratee = createCallback(iteratee, context);
var i, length = obj.length;
if (length === +length) {
for (i = 0; i < length; i++) {
iteratee(obj[i], i, obj);
}
} else {
var keys = _.keys(obj);
for (i = 0, length = keys.length; i < length; i++) {
iteratee(obj[keys[i]], keys[i], obj);
}
}
return obj;
};
// Return the results of applying the iteratee to each element.
_.map = _.collect = function(obj, iteratee, context) {
if (obj == null) return [];
iteratee = _.iteratee(iteratee, context);
var keys = obj.length !== +obj.length && _.keys(obj),
length = (keys || obj).length,
results = Array(length),
currentKey;
for (var index = 0; index < length; index++) {
currentKey = keys ? keys[index] : index;
results[index] = iteratee(obj[currentKey], currentKey, obj);
}
return results;
};
var reduceError = 'Reduce of empty array with no initial value';
// **Reduce** builds up a single result from a list of values, aka `inject`,
// or `foldl`.
_.reduce = _.foldl = _.inject = function(obj, iteratee, memo, context) {
if (obj == null) obj = [];
iteratee = createCallback(iteratee, context, 4);
var keys = obj.length !== +obj.length && _.keys(obj),
length = (keys || obj).length,
index = 0, currentKey;
if (arguments.length < 3) {
if (!length) throw new TypeError(reduceError);
memo = obj[keys ? keys[index++] : index++];
}
for (; index < length; index++) {
currentKey = keys ? keys[index] : index;
memo = iteratee(memo, obj[currentKey], currentKey, obj);
}
return memo;
};
// The right-associative version of reduce, also known as `foldr`.
_.reduceRight = _.foldr = function(obj, iteratee, memo, context) {
if (obj == null) obj = [];
iteratee = createCallback(iteratee, context, 4);
var keys = obj.length !== + obj.length && _.keys(obj),
index = (keys || obj).length,
currentKey;
if (arguments.length < 3) {
if (!index) throw new TypeError(reduceError);
memo = obj[keys ? keys[--index] : --index];
}
while (index--) {
currentKey = keys ? keys[index] : index;
memo = iteratee(memo, obj[currentKey], currentKey, obj);
}
return memo;
};
// Return the first value which passes a truth test. Aliased as `detect`.
_.find = _.detect = function(obj, predicate, context) {
var result;
predicate = _.iteratee(predicate, context);
_.some(obj, function(value, index, list) {
if (predicate(value, index, list)) {
result = value;
return true;
}
});
return result;
};
// Return all the elements that pass a truth test.
// Aliased as `select`.
_.filter = _.select = function(obj, predicate, context) {
var results = [];
if (obj == null) return results;
predicate = _.iteratee(predicate, context);
_.each(obj, function(value, index, list) {
if (predicate(value, index, list)) results.push(value);
});
return results;
};
// Return all the elements for which a truth test fails.
_.reject = function(obj, predicate, context) {
return _.filter(obj, _.negate(_.iteratee(predicate)), context);
};
// Determine whether all of the elements match a truth test.
// Aliased as `all`.
_.every = _.all = function(obj, predicate, context) {
if (obj == null) return true;
predicate = _.iteratee(predicate, context);
var keys = obj.length !== +obj.length && _.keys(obj),
length = (keys || obj).length,
index, currentKey;
for (index = 0; index < length; index++) {
currentKey = keys ? keys[index] : index;
if (!predicate(obj[currentKey], currentKey, obj)) return false;
}
return true;
};
// Determine if at least one element in the object matches a truth test.
// Aliased as `any`.
_.some = _.any = function(obj, predicate, context) {
if (obj == null) return false;
predicate = _.iteratee(predicate, context);
var keys = obj.length !== +obj.length && _.keys(obj),
length = (keys || obj).length,
index, currentKey;
for (index = 0; index < length; index++) {
currentKey = keys ? keys[index] : index;
if (predicate(obj[currentKey], currentKey, obj)) return true;
}
return false;
};
// Determine if the array or object contains a given value (using `===`).
// Aliased as `include`.
_.contains = _.include = function(obj, target) {
if (obj == null) return false;
if (obj.length !== +obj.length) obj = _.values(obj);
return _.indexOf(obj, target) >= 0;
};
// Invoke a method (with arguments) on every item in a collection.
_.invoke = function(obj, method) {
var args = slice.call(arguments, 2);
var isFunc = _.isFunction(method);
return _.map(obj, function(value) {
return (isFunc ? method : value[method]).apply(value, args);
});
};
// Convenience version of a common use case of `map`: fetching a property.
_.pluck = function(obj, key) {
return _.map(obj, _.property(key));
};
// Convenience version of a common use case of `filter`: selecting only objects
// containing specific `key:value` pairs.
_.where = function(obj, attrs) {
return _.filter(obj, _.matches(attrs));
};
// Convenience version of a common use case of `find`: getting the first object
// containing specific `key:value` pairs.
_.findWhere = function(obj, attrs) {
return _.find(obj, _.matches(attrs));
};
// Return the maximum element (or element-based computation).
_.max = function(obj, iteratee, context) {
var result = -Infinity, lastComputed = -Infinity,
value, computed;
if (iteratee == null && obj != null) {
obj = obj.length === +obj.length ? obj : _.values(obj);
for (var i = 0, length = obj.length; i < length; i++) {
value = obj[i];
if (value > result) {
result = value;
}
}
} else {
iteratee = _.iteratee(iteratee, context);
_.each(obj, function(value, index, list) {
computed = iteratee(value, index, list);
if (computed > lastComputed || computed === -Infinity && result === -Infinity) {
result = value;
lastComputed = computed;
}
});
}
return result;
};
// Return the minimum element (or element-based computation).
_.min = function(obj, iteratee, context) {
var result = Infinity, lastComputed = Infinity,
value, computed;
if (iteratee == null && obj != null) {
obj = obj.length === +obj.length ? obj : _.values(obj);
for (var i = 0, length = obj.length; i < length; i++) {
value = obj[i];
if (value < result) {
result = value;
}
}
} else {
iteratee = _.iteratee(iteratee, context);
_.each(obj, function(value, index, list) {
computed = iteratee(value, index, list);
if (computed < lastComputed || computed === Infinity && result === Infinity) {
result = value;
lastComputed = computed;
}
});
}
return result;
};
// Shuffle a collection, using the modern version of the
// [Fisher-Yates shuffle](http://en.wikipedia.org/wiki/Fisher–Yates_shuffle).
_.shuffle = function(obj) {
var set = obj && obj.length === +obj.length ? obj : _.values(obj);
var length = set.length;
var shuffled = Array(length);
for (var index = 0, rand; index < length; index++) {
rand = _.random(0, index);
if (rand !== index) shuffled[index] = shuffled[rand];
shuffled[rand] = set[index];
}
return shuffled;
};
// Sample **n** random values from a collection.
// If **n** is not specified, returns a single random element.
// The internal `guard` argument allows it to work with `map`.
_.sample = function(obj, n, guard) {
if (n == null || guard) {
if (obj.length !== +obj.length) obj = _.values(obj);
return obj[_.random(obj.length - 1)];
}
return _.shuffle(obj).slice(0, Math.max(0, n));
};
// Sort the object's values by a criterion produced by an iteratee.
_.sortBy = function(obj, iteratee, context) {
iteratee = _.iteratee(iteratee, context);
return _.pluck(_.map(obj, function(value, index, list) {
return {
value: value,
index: index,
criteria: iteratee(value, index, list)
};
}).sort(function(left, right) {
var a = left.criteria;
var b = right.criteria;
if (a !== b) {
if (a > b || a === void 0) return 1;
if (a < b || b === void 0) return -1;
}
return left.index - right.index;
}), 'value');
};
// An internal function used for aggregate "group by" operations.
var group = function(behavior) {
return function(obj, iteratee, context) {
var result = {};
iteratee = _.iteratee(iteratee, context);
_.each(obj, function(value, index) {
var key = iteratee(value, index, obj);
behavior(result, value, key);
});
return result;
};
};
// Groups the object's values by a criterion. Pass either a string attribute
// to group by, or a function that returns the criterion.
_.groupBy = group(function(result, value, key) {
if (_.has(result, key)) result[key].push(value); else result[key] = [value];
});
// Indexes the object's values by a criterion, similar to `groupBy`, but for
// when you know that your index values will be unique.
_.indexBy = group(function(result, value, key) {
result[key] = value;
});
// Counts instances of an object that group by a certain criterion. Pass
// either a string attribute to count by, or a function that returns the
// criterion.
_.countBy = group(function(result, value, key) {
if (_.has(result, key)) result[key]++; else result[key] = 1;
});
// Use a comparator function to figure out the smallest index at which
// an object should be inserted so as to maintain order. Uses binary search.
_.sortedIndex = function(array, obj, iteratee, context) {
iteratee = _.iteratee(iteratee, context, 1);
var value = iteratee(obj);
var low = 0, high = array.length;
while (low < high) {
var mid = low + high >>> 1;
if (iteratee(array[mid]) < value) low = mid + 1; else high = mid;
}
return low;
};
// Safely create a real, live array from anything iterable.
_.toArray = function(obj) {
if (!obj) return [];
if (_.isArray(obj)) return slice.call(obj);
if (obj.length === +obj.length) return _.map(obj, _.identity);
return _.values(obj);
};
// Return the number of elements in an object.
_.size = function(obj) {
if (obj == null) return 0;
return obj.length === +obj.length ? obj.length : _.keys(obj).length;
};
// Split a collection into two arrays: one whose elements all satisfy the given
// predicate, and one whose elements all do not satisfy the predicate.
_.partition = function(obj, predicate, context) {
predicate = _.iteratee(predicate, context);
var pass = [], fail = [];
_.each(obj, function(value, key, obj) {
(predicate(value, key, obj) ? pass : fail).push(value);
});
return [pass, fail];
};
// Array Functions
// ---------------
// Get the first element of an array. Passing **n** will return the first N
// values in the array. Aliased as `head` and `take`. The **guard** check
// allows it to work with `_.map`.
_.first = _.head = _.take = function(array, n, guard) {
if (array == null) return void 0;
if (n == null || guard) return array[0];
if (n < 0) return [];
return slice.call(array, 0, n);
};
// Returns everything but the last entry of the array. Especially useful on
// the arguments object. Passing **n** will return all the values in
// the array, excluding the last N. The **guard** check allows it to work with
// `_.map`.
_.initial = function(array, n, guard) {
return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n)));
};
// Get the last element of an array. Passing **n** will return the last N
// values in the array. The **guard** check allows it to work with `_.map`.
_.last = function(array, n, guard) {
if (array == null) return void 0;
if (n == null || guard) return array[array.length - 1];
return slice.call(array, Math.max(array.length - n, 0));
};
// Returns everything but the first entry of the array. Aliased as `tail` and `drop`.
// Especially useful on the arguments object. Passing an **n** will return
// the rest N values in the array. The **guard**
// check allows it to work with `_.map`.
_.rest = _.tail = _.drop = function(array, n, guard) {
return slice.call(array, n == null || guard ? 1 : n);
};
// Trim out all falsy values from an array.
_.compact = function(array) {
return _.filter(array, _.identity);
};
// Internal implementation of a recursive `flatten` function.
var flatten = function(input, shallow, strict, output) {
if (shallow && _.every(input, _.isArray)) {
return concat.apply(output, input);
}
for (var i = 0, length = input.length; i < length; i++) {
var value = input[i];
if (!_.isArray(value) && !_.isArguments(value)) {
if (!strict) output.push(value);
} else if (shallow) {
push.apply(output, value);
} else {
flatten(value, shallow, strict, output);
}
}
return output;
};
// Flatten out an array, either recursively (by default), or just one level.
_.flatten = function(array, shallow) {
return flatten(array, shallow, false, []);
};
// Return a version of the array that does not contain the specified value(s).
_.without = function(array) {
return _.difference(array, slice.call(arguments, 1));
};
// Produce a duplicate-free version of the array. If the array has already
// been sorted, you have the option of using a faster algorithm.
// Aliased as `unique`.
_.uniq = _.unique = function(array, isSorted, iteratee, context) {
if (array == null) return [];
if (!_.isBoolean(isSorted)) {
context = iteratee;
iteratee = isSorted;
isSorted = false;
}
if (iteratee != null) iteratee = _.iteratee(iteratee, context);
var result = [];
var seen = [];
for (var i = 0, length = array.length; i < length; i++) {
var value = array[i];
if (isSorted) {
if (!i || seen !== value) result.push(value);
seen = value;
} else if (iteratee) {
var computed = iteratee(value, i, array);
if (_.indexOf(seen, computed) < 0) {
seen.push(computed);
result.push(value);
}
} else if (_.indexOf(result, value) < 0) {
result.push(value);
}
}
return result;
};
// Produce an array that contains the union: each distinct element from all of
// the passed-in arrays.
_.union = function() {
return _.uniq(flatten(arguments, true, true, []));
};
// Produce an array that contains every item shared between all the
// passed-in arrays.
_.intersection = function(array) {
if (array == null) return [];
var result = [];
var argsLength = arguments.length;
for (var i = 0, length = array.length; i < length; i++) {
var item = array[i];
if (_.contains(result, item)) continue;
for (var j = 1; j < argsLength; j++) {
if (!_.contains(arguments[j], item)) break;
}
if (j === argsLength) result.push(item);
}
return result;
};
// Take the difference between one array and a number of other arrays.
// Only the elements present in just the first array will remain.
_.difference = function(array) {
var rest = flatten(slice.call(arguments, 1), true, true, []);
return _.filter(array, function(value){
return !_.contains(rest, value);
});
};
// Zip together multiple lists into a single array -- elements that share
// an index go together.
_.zip = function(array) {
if (array == null) return [];
var length = _.max(arguments, 'length').length;
var results = Array(length);
for (var i = 0; i < length; i++) {
results[i] = _.pluck(arguments, i);
}
return results;
};
// Converts lists into objects. Pass either a single array of `[key, value]`
// pairs, or two parallel arrays of the same length -- one of keys, and one of
// the corresponding values.
_.object = function(list, values) {
if (list == null) return {};
var result = {};
for (var i = 0, length = list.length; i < length; i++) {
if (values) {
result[list[i]] = values[i];
} else {
result[list[i][0]] = list[i][1];
}
}
return result;
};
// Return the position of the first occurrence of an item in an array,
// or -1 if the item is not included in the array.
// If the array is large and already in sort order, pass `true`
// for **isSorted** to use binary search.
_.indexOf = function(array, item, isSorted) {
if (array == null) return -1;
var i = 0, length = array.length;
if (isSorted) {
if (typeof isSorted == 'number') {
i = isSorted < 0 ? Math.max(0, length + isSorted) : isSorted;
} else {
i = _.sortedIndex(array, item);
return array[i] === item ? i : -1;
}
}
for (; i < length; i++) if (array[i] === item) return i;
return -1;
};
_.lastIndexOf = function(array, item, from) {
if (array == null) return -1;
var idx = array.length;
if (typeof from == 'number') {
idx = from < 0 ? idx + from + 1 : Math.min(idx, from + 1);
}
while (--idx >= 0) if (array[idx] === item) return idx;
return -1;
};
// Generate an integer Array containing an arithmetic progression. A port of
// the native Python `range()` function. See
// [the Python documentation](http://docs.python.org/library/functions.html#range).
_.range = function(start, stop, step) {
if (arguments.length <= 1) {
stop = start || 0;
start = 0;
}
step = step || 1;
var length = Math.max(Math.ceil((stop - start) / step), 0);
var range = Array(length);
for (var idx = 0; idx < length; idx++, start += step) {
range[idx] = start;
}
return range;
};
// Function (ahem) Functions
// ------------------
// Reusable constructor function for prototype setting.
var Ctor = function(){};
// Create a function bound to a given object (assigning `this`, and arguments,
// optionally). Delegates to **ECMAScript 5**'s native `Function.bind` if
// available.
_.bind = function(func, context) {
var args, bound;
if (nativeBind && func.bind === nativeBind) return nativeBind.apply(func, slice.call(arguments, 1));
if (!_.isFunction(func)) throw new TypeError('Bind must be called on a function');
args = slice.call(arguments, 2);
bound = function() {
if (!(this instanceof bound)) return func.apply(context, args.concat(slice.call(arguments)));
Ctor.prototype = func.prototype;
var self = new Ctor;
Ctor.prototype = null;
var result = func.apply(self, args.concat(slice.call(arguments)));
if (_.isObject(result)) return result;
return self;
};
return bound;
};
// Partially apply a function by creating a version that has had some of its
// arguments pre-filled, without changing its dynamic `this` context. _ acts
// as a placeholder, allowing any combination of arguments to be pre-filled.
_.partial = function(func) {
var boundArgs = slice.call(arguments, 1);
return function() {
var position = 0;
var args = boundArgs.slice();
for (var i = 0, length = args.length; i < length; i++) {
if (args[i] === _) args[i] = arguments[position++];
}
while (position < arguments.length) args.push(arguments[position++]);
return func.apply(this, args);
};
};
// Bind a number of an object's methods to that object. Remaining arguments
// are the method names to be bound. Useful for ensuring that all callbacks
// defined on an object belong to it.
_.bindAll = function(obj) {
var i, length = arguments.length, key;
if (length <= 1) throw new Error('bindAll must be passed function names');
for (i = 1; i < length; i++) {
key = arguments[i];
obj[key] = _.bind(obj[key], obj);
}
return obj;
};
// Memoize an expensive function by storing its results.
_.memoize = function(func, hasher) {
var memoize = function(key) {
var cache = memoize.cache;
var address = hasher ? hasher.apply(this, arguments) : key;
if (!_.has(cache, address)) cache[address] = func.apply(this, arguments);
return cache[address];
};
memoize.cache = {};
return memoize;
};
// Delays a function for the given number of milliseconds, and then calls
// it with the arguments supplied.
_.delay = function(func, wait) {
var args = slice.call(arguments, 2);
return setTimeout(function(){
return func.apply(null, args);
}, wait);
};
// Defers a function, scheduling it to run after the current call stack has
// cleared.
_.defer = function(func) {
return _.delay.apply(_, [func, 1].concat(slice.call(arguments, 1)));
};
// Returns a function, that, when invoked, will only be triggered at most once
// during a given window of time. Normally, the throttled function will run
// as much as it can, without ever going more than once per `wait` duration;
// but if you'd like to disable the execution on the leading edge, pass
// `{leading: false}`. To disable execution on the trailing edge, ditto.
_.throttle = function(func, wait, options) {
var context, args, result;
var timeout = null;
var previous = 0;
if (!options) options = {};
var later = function() {
previous = options.leading === false ? 0 : _.now();
timeout = null;
result = func.apply(context, args);
if (!timeout) context = args = null;
};
return function() {
var now = _.now();
if (!previous && options.leading === false) previous = now;
var remaining = wait - (now - previous);
context = this;
args = arguments;
if (remaining <= 0 || remaining > wait) {
clearTimeout(timeout);
timeout = null;
previous = now;
result = func.apply(context, args);
if (!timeout) context = args = null;
} else if (!timeout && options.trailing !== false) {
timeout = setTimeout(later, remaining);
}
return result;
};
};
// Returns a function, that, as long as it continues to be invoked, will not
// be triggered. The function will be called after it stops being called for
// N milliseconds. If `immediate` is passed, trigger the function on the
// leading edge, instead of the trailing.
_.debounce = function(func, wait, immediate) {
var timeout, args, context, timestamp, result;
var later = function() {
var last = _.now() - timestamp;
if (last < wait && last > 0) {
timeout = setTimeout(later, wait - last);
} else {
timeout = null;
if (!immediate) {
result = func.apply(context, args);
if (!timeout) context = args = null;
}
}
};
return function() {
context = this;
args = arguments;
timestamp = _.now();
var callNow = immediate && !timeout;
if (!timeout) timeout = setTimeout(later, wait);
if (callNow) {
result = func.apply(context, args);
context = args = null;
}
return result;
};
};
// Returns the first function passed as an argument to the second,
// allowing you to adjust arguments, run code before and after, and
// conditionally execute the original function.
_.wrap = function(func, wrapper) {
return _.partial(wrapper, func);
};
// Returns a negated version of the passed-in predicate.
_.negate = function(predicate) {
return function() {
return !predicate.apply(this, arguments);
};
};
// Returns a function that is the composition of a list of functions, each
// consuming the return value of the function that follows.
_.compose = function() {
var args = arguments;
var start = args.length - 1;
return function() {
var i = start;
var result = args[start].apply(this, arguments);
while (i--) result = args[i].call(this, result);
return result;
};
};
// Returns a function that will only be executed after being called N times.
_.after = function(times, func) {
return function() {
if (--times < 1) {
return func.apply(this, arguments);
}
};
};
// Returns a function that will only be executed before being called N times.
_.before = function(times, func) {
var memo;
return function() {
if (--times > 0) {
memo = func.apply(this, arguments);
} else {
func = null;
}
return memo;
};
};
// Returns a function that will be executed at most one time, no matter how
// often you call it. Useful for lazy initialization.
_.once = _.partial(_.before, 2);
// Object Functions
// ----------------
// Retrieve the names of an object's properties.
// Delegates to **ECMAScript 5**'s native `Object.keys`
_.keys = function(obj) {
if (!_.isObject(obj)) return [];
if (nativeKeys) return nativeKeys(obj);
var keys = [];
for (var key in obj) if (_.has(obj, key)) keys.push(key);
return keys;
};
// Retrieve the values of an object's properties.
_.values = function(obj) {
var keys = _.keys(obj);
var length = keys.length;
var values = Array(length);
for (var i = 0; i < length; i++) {
values[i] = obj[keys[i]];
}
return values;
};
// Convert an object into a list of `[key, value]` pairs.
_.pairs = function(obj) {
var keys = _.keys(obj);
var length = keys.length;
var pairs = Array(length);
for (var i = 0; i < length; i++) {
pairs[i] = [keys[i], obj[keys[i]]];
}
return pairs;
};
// Invert the keys and values of an object. The values must be serializable.
_.invert = function(obj) {
var result = {};
var keys = _.keys(obj);
for (var i = 0, length = keys.length; i < length; i++) {
result[obj[keys[i]]] = keys[i];
}
return result;
};
// Return a sorted list of the function names available on the object.
// Aliased as `methods`
_.functions = _.methods = function(obj) {
var names = [];
for (var key in obj) {
if (_.isFunction(obj[key])) names.push(key);
}
return names.sort();
};
// Extend a given object with all the properties in passed-in object(s).
_.extend = function(obj) {
if (!_.isObject(obj)) return obj;
var source, prop;
for (var i = 1, length = arguments.length; i < length; i++) {
source = arguments[i];
for (prop in source) {
if (hasOwnProperty.call(source, prop)) {
obj[prop] = source[prop];
}
}
}
return obj;
};
// Return a copy of the object only containing the whitelisted properties.
_.pick = function(obj, iteratee, context) {
var result = {}, key;
if (obj == null) return result;
if (_.isFunction(iteratee)) {
iteratee = createCallback(iteratee, context);
for (key in obj) {
var value = obj[key];
if (iteratee(value, key, obj)) result[key] = value;
}
} else {
var keys = concat.apply([], slice.call(arguments, 1));
obj = new Object(obj);
for (var i = 0, length = keys.length; i < length; i++) {
key = keys[i];
if (key in obj) result[key] = obj[key];
}
}
return result;
};
// Return a copy of the object without the blacklisted properties.
_.omit = function(obj, iteratee, context) {
if (_.isFunction(iteratee)) {
iteratee = _.negate(iteratee);
} else {
var keys = _.map(concat.apply([], slice.call(arguments, 1)), String);
iteratee = function(value, key) {
return !_.contains(keys, key);
};
}
return _.pick(obj, iteratee, context);
};
// Fill in a given object with default properties.
_.defaults = function(obj) {
if (!_.isObject(obj)) return obj;
for (var i = 1, length = arguments.length; i < length; i++) {
var source = arguments[i];
for (var prop in source) {
if (obj[prop] === void 0) obj[prop] = source[prop];
}
}
return obj;
};
// Create a (shallow-cloned) duplicate of an object.
_.clone = function(obj) {
if (!_.isObject(obj)) return obj;
return _.isArray(obj) ? obj.slice() : _.extend({}, obj);
};
// Invokes interceptor with the obj, and then returns obj.
// The primary purpose of this method is to "tap into" a method chain, in
// order to perform operations on intermediate results within the chain.
_.tap = function(obj, interceptor) {
interceptor(obj);
return obj;
};
// Internal recursive comparison function for `isEqual`.
var eq = function(a, b, aStack, bStack) {
// Identical objects are equal. `0 === -0`, but they aren't identical.
// See the [Harmony `egal` proposal](http://wiki.ecmascript.org/doku.php?id=harmony:egal).
if (a === b) return a !== 0 || 1 / a === 1 / b;
// A strict comparison is necessary because `null == undefined`.
if (a == null || b == null) return a === b;
// Unwrap any wrapped objects.
if (a instanceof _) a = a._wrapped;
if (b instanceof _) b = b._wrapped;
// Compare `[[Class]]` names.
var className = toString.call(a);
if (className !== toString.call(b)) return false;
switch (className) {
// Strings, numbers, regular expressions, dates, and booleans are compared by value.
case '[object RegExp]':
// RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i')
case '[object String]':
// Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is
// equivalent to `new String("5")`.
return '' + a === '' + b;
case '[object Number]':
// `NaN`s are equivalent, but non-reflexive.
// Object(NaN) is equivalent to NaN
if (+a !== +a) return +b !== +b;
// An `egal` comparison is performed for other numeric values.
return +a === 0 ? 1 / +a === 1 / b : +a === +b;
case '[object Date]':
case '[object Boolean]':
// Coerce dates and booleans to numeric primitive values. Dates are compared by their
// millisecond representations. Note that invalid dates with millisecond representations
// of `NaN` are not equivalent.
return +a === +b;
}
if (typeof a != 'object' || typeof b != 'object') return false;
// Assume equality for cyclic structures. The algorithm for detecting cyclic
// structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.
var length = aStack.length;
while (length--) {
// Linear search. Performance is inversely proportional to the number of
// unique nested structures.
if (aStack[length] === a) return bStack[length] === b;
}
// Objects with different constructors are not equivalent, but `Object`s
// from different frames are.
var aCtor = a.constructor, bCtor = b.constructor;
if (
aCtor !== bCtor &&
// Handle Object.create(x) cases
'constructor' in a && 'constructor' in b &&
!(_.isFunction(aCtor) && aCtor instanceof aCtor &&
_.isFunction(bCtor) && bCtor instanceof bCtor)
) {
return false;
}
// Add the first object to the stack of traversed objects.
aStack.push(a);
bStack.push(b);
var size, result;
// Recursively compare objects and arrays.
if (className === '[object Array]') {
// Compare array lengths to determine if a deep comparison is necessary.
size = a.length;
result = size === b.length;
if (result) {
// Deep compare the contents, ignoring non-numeric properties.
while (size--) {
if (!(result = eq(a[size], b[size], aStack, bStack))) break;
}
}
} else {
// Deep compare objects.
var keys = _.keys(a), key;
size = keys.length;
// Ensure that both objects contain the same number of properties before comparing deep equality.
result = _.keys(b).length === size;
if (result) {
while (size--) {
// Deep compare each member
key = keys[size];
if (!(result = _.has(b, key) && eq(a[key], b[key], aStack, bStack))) break;
}
}
}
// Remove the first object from the stack of traversed objects.
aStack.pop();
bStack.pop();
return result;
};
// Perform a deep comparison to check if two objects are equal.
_.isEqual = function(a, b) {
return eq(a, b, [], []);
};
// Is a given array, string, or object empty?
// An "empty" object has no enumerable own-properties.
_.isEmpty = function(obj) {
if (obj == null) return true;
if (_.isArray(obj) || _.isString(obj) || _.isArguments(obj)) return obj.length === 0;
for (var key in obj) if (_.has(obj, key)) return false;
return true;
};
// Is a given value a DOM element?
_.isElement = function(obj) {
return !!(obj && obj.nodeType === 1);
};
// Is a given value an array?
// Delegates to ECMA5's native Array.isArray
_.isArray = nativeIsArray || function(obj) {
return toString.call(obj) === '[object Array]';
};
// Is a given variable an object?
_.isObject = function(obj) {
var type = typeof obj;
return type === 'function' || type === 'object' && !!obj;
};
// Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp.
_.each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp'], function(name) {
_['is' + name] = function(obj) {
return toString.call(obj) === '[object ' + name + ']';
};
});
// Define a fallback version of the method in browsers (ahem, IE), where
// there isn't any inspectable "Arguments" type.
if (!_.isArguments(arguments)) {
_.isArguments = function(obj) {
return _.has(obj, 'callee');
};
}
// Optimize `isFunction` if appropriate. Work around an IE 11 bug.
if (typeof /./ !== 'function') {
_.isFunction = function(obj) {
return typeof obj == 'function' || false;
};
}
// Is a given object a finite number?
_.isFinite = function(obj) {
return isFinite(obj) && !isNaN(parseFloat(obj));
};
// Is the given value `NaN`? (NaN is the only number which does not equal itself).
_.isNaN = function(obj) {
return _.isNumber(obj) && obj !== +obj;
};
// Is a given value a boolean?
_.isBoolean = function(obj) {
return obj === true || obj === false || toString.call(obj) === '[object Boolean]';
};
// Is a given value equal to null?
_.isNull = function(obj) {
return obj === null;
};
// Is a given variable undefined?
_.isUndefined = function(obj) {
return obj === void 0;
};
// Shortcut function for checking if an object has a given property directly
// on itself (in other words, not on a prototype).
_.has = function(obj, key) {
return obj != null && hasOwnProperty.call(obj, key);
};
// Utility Functions
// -----------------
// Run Underscore.js in *noConflict* mode, returning the `_` variable to its
// previous owner. Returns a reference to the Underscore object.
_.noConflict = function() {
root._ = previousUnderscore;
return this;
};
// Keep the identity function around for default iteratees.
_.identity = function(value) {
return value;
};
_.constant = function(value) {
return function() {
return value;
};
};
_.noop = function(){};
_.property = function(key) {
return function(obj) {
return obj[key];
};
};
// Returns a predicate for checking whether an object has a given set of `key:value` pairs.
_.matches = function(attrs) {
var pairs = _.pairs(attrs), length = pairs.length;
return function(obj) {
if (obj == null) return !length;
obj = new Object(obj);
for (var i = 0; i < length; i++) {
var pair = pairs[i], key = pair[0];
if (pair[1] !== obj[key] || !(key in obj)) return false;
}
return true;
};
};
// Run a function **n** times.
_.times = function(n, iteratee, context) {
var accum = Array(Math.max(0, n));
iteratee = createCallback(iteratee, context, 1);
for (var i = 0; i < n; i++) accum[i] = iteratee(i);
return accum;
};
// Return a random integer between min and max (inclusive).
_.random = function(min, max) {
if (max == null) {
max = min;
min = 0;
}
return min + Math.floor(Math.random() * (max - min + 1));
};
// A (possibly faster) way to get the current timestamp as an integer.
_.now = Date.now || function() {
return new Date().getTime();
};
// List of HTML entities for escaping.
var escapeMap = {
'&': '&amp;',
'<': '&lt;',
'>': '&gt;',
'"': '&quot;',
"'": '&#x27;',
'`': '&#x60;'
};
var unescapeMap = _.invert(escapeMap);
// Functions for escaping and unescaping strings to/from HTML interpolation.
var createEscaper = function(map) {
var escaper = function(match) {
return map[match];
};
// Regexes for identifying a key that needs to be escaped
var source = '(?:' + _.keys(map).join('|') + ')';
var testRegexp = RegExp(source);
var replaceRegexp = RegExp(source, 'g');
return function(string) {
string = string == null ? '' : '' + string;
return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string;
};
};
_.escape = createEscaper(escapeMap);
_.unescape = createEscaper(unescapeMap);
// If the value of the named `property` is a function then invoke it with the
// `object` as context; otherwise, return it.
_.result = function(object, property) {
if (object == null) return void 0;
var value = object[property];
return _.isFunction(value) ? object[property]() : value;
};
// Generate a unique integer id (unique within the entire client session).
// Useful for temporary DOM ids.
var idCounter = 0;
_.uniqueId = function(prefix) {
var id = ++idCounter + '';
return prefix ? prefix + id : id;
};
// By default, Underscore uses ERB-style template delimiters, change the
// following template settings to use alternative delimiters.
_.templateSettings = {
evaluate : /<%([\s\S]+?)%>/g,
interpolate : /<%=([\s\S]+?)%>/g,
escape : /<%-([\s\S]+?)%>/g
};
// When customizing `templateSettings`, if you don't want to define an
// interpolation, evaluation or escaping regex, we need one that is
// guaranteed not to match.
var noMatch = /(.)^/;
// Certain characters need to be escaped so that they can be put into a
// string literal.
var escapes = {
"'": "'",
'\\': '\\',
'\r': 'r',
'\n': 'n',
'\u2028': 'u2028',
'\u2029': 'u2029'
};
var escaper = /\\|'|\r|\n|\u2028|\u2029/g;
var escapeChar = function(match) {
return '\\' + escapes[match];
};
// JavaScript micro-templating, similar to John Resig's implementation.
// Underscore templating handles arbitrary delimiters, preserves whitespace,
// and correctly escapes quotes within interpolated code.
// NB: `oldSettings` only exists for backwards compatibility.
_.template = function(text, settings, oldSettings) {
if (!settings && oldSettings) settings = oldSettings;
settings = _.defaults({}, settings, _.templateSettings);
// Combine delimiters into one regular expression via alternation.
var matcher = RegExp([
(settings.escape || noMatch).source,
(settings.interpolate || noMatch).source,
(settings.evaluate || noMatch).source
].join('|') + '|$', 'g');
// Compile the template source, escaping string literals appropriately.
var index = 0;
var source = "__p+='";
text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
source += text.slice(index, offset).replace(escaper, escapeChar);
index = offset + match.length;
if (escape) {
source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
} else if (interpolate) {
source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
} else if (evaluate) {
source += "';\n" + evaluate + "\n__p+='";
}
// Adobe VMs need the match returned to produce the correct offest.
return match;
});
source += "';\n";
// If a variable is not specified, place data values in local scope.
if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n';
source = "var __t,__p='',__j=Array.prototype.join," +
"print=function(){__p+=__j.call(arguments,'');};\n" +
source + 'return __p;\n';
try {
var render = new Function(settings.variable || 'obj', '_', source);
} catch (e) {
e.source = source;
throw e;
}
var template = function(data) {
return render.call(this, data, _);
};
// Provide the compiled source as a convenience for precompilation.
var argument = settings.variable || 'obj';
template.source = 'function(' + argument + '){\n' + source + '}';
return template;
};
// Add a "chain" function. Start chaining a wrapped Underscore object.
_.chain = function(obj) {
var instance = _(obj);
instance._chain = true;
return instance;
};
// OOP
// ---------------
// If Underscore is called as a function, it returns a wrapped object that
// can be used OO-style. This wrapper holds altered versions of all the
// underscore functions. Wrapped objects may be chained.
// Helper function to continue chaining intermediate results.
var result = function(obj) {
return this._chain ? _(obj).chain() : obj;
};
// Add your own custom functions to the Underscore object.
_.mixin = function(obj) {
_.each(_.functions(obj), function(name) {
var func = _[name] = obj[name];
_.prototype[name] = function() {
var args = [this._wrapped];
push.apply(args, arguments);
return result.call(this, func.apply(_, args));
};
});
};
// Add all of the Underscore functions to the wrapper object.
_.mixin(_);
// Add all mutator Array functions to the wrapper.
_.each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {
var method = ArrayProto[name];
_.prototype[name] = function() {
var obj = this._wrapped;
method.apply(obj, arguments);
if ((name === 'shift' || name === 'splice') && obj.length === 0) delete obj[0];
return result.call(this, obj);
};
});
// Add all accessor Array functions to the wrapper.
_.each(['concat', 'join', 'slice'], function(name) {
var method = ArrayProto[name];
_.prototype[name] = function() {
return result.call(this, method.apply(this._wrapped, arguments));
};
});
// Extracts the result from a wrapped and chained object.
_.prototype.value = function() {
return this._wrapped;
};
// AMD registration happens at the end for compatibility with AMD loaders
// that may not enforce next-turn semantics on modules. Even though general
// practice for AMD registration is to be anonymous, underscore registers
// as a named module because, like jQuery, it is a base library that is
// popular enough to be bundled in a third party lib, but not be part of
// an AMD load request. Those cases could generate an error when an
// anonymous define() is called outside of a loader request.
if (typeof define === 'function' && define.amd) {
define('underscore', [], function() {
return _;
});
}
}.call(this));

372 Bytes | W: | H:

345 Bytes | W: | H:

docs/html/_static/up-pressed.png
docs/html/_static/up-pressed.png
docs/html/_static/up-pressed.png
docs/html/_static/up-pressed.png
  • 2-up
  • Swipe
  • Onion skin

363 Bytes | W: | H:

345 Bytes | W: | H:

docs/html/_static/up.png
docs/html/_static/up.png
docs/html/_static/up.png
docs/html/_static/up.png
  • 2-up
  • Swipe
  • Onion skin
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
* *
* sphinx.websupport utilties for all documentation. * sphinx.websupport utilties for all documentation.
* *
* :copyright: Copyright 2007-2014 by the Sphinx team, see AUTHORS. * :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS.
* :license: BSD, see LICENSE for details. * :license: BSD, see LICENSE for details.
* *
*/ */
...@@ -50,51 +50,51 @@ ...@@ -50,51 +50,51 @@
} }
function initEvents() { function initEvents() {
$('a.comment-close').live("click", function(event) { $(document).on("click", 'a.comment-close', function(event) {
event.preventDefault(); event.preventDefault();
hide($(this).attr('id').substring(2)); hide($(this).attr('id').substring(2));
}); });
$('a.vote').live("click", function(event) { $(document).on("click", 'a.vote', function(event) {
event.preventDefault(); event.preventDefault();
handleVote($(this)); handleVote($(this));
}); });
$('a.reply').live("click", function(event) { $(document).on("click", 'a.reply', function(event) {
event.preventDefault(); event.preventDefault();
openReply($(this).attr('id').substring(2)); openReply($(this).attr('id').substring(2));
}); });
$('a.close-reply').live("click", function(event) { $(document).on("click", 'a.close-reply', function(event) {
event.preventDefault(); event.preventDefault();
closeReply($(this).attr('id').substring(2)); closeReply($(this).attr('id').substring(2));
}); });
$('a.sort-option').live("click", function(event) { $(document).on("click", 'a.sort-option', function(event) {
event.preventDefault(); event.preventDefault();
handleReSort($(this)); handleReSort($(this));
}); });
$('a.show-proposal').live("click", function(event) { $(document).on("click", 'a.show-proposal', function(event) {
event.preventDefault(); event.preventDefault();
showProposal($(this).attr('id').substring(2)); showProposal($(this).attr('id').substring(2));
}); });
$('a.hide-proposal').live("click", function(event) { $(document).on("click", 'a.hide-proposal', function(event) {
event.preventDefault(); event.preventDefault();
hideProposal($(this).attr('id').substring(2)); hideProposal($(this).attr('id').substring(2));
}); });
$('a.show-propose-change').live("click", function(event) { $(document).on("click", 'a.show-propose-change', function(event) {
event.preventDefault(); event.preventDefault();
showProposeChange($(this).attr('id').substring(2)); showProposeChange($(this).attr('id').substring(2));
}); });
$('a.hide-propose-change').live("click", function(event) { $(document).on("click", 'a.hide-propose-change', function(event) {
event.preventDefault(); event.preventDefault();
hideProposeChange($(this).attr('id').substring(2)); hideProposeChange($(this).attr('id').substring(2));
}); });
$('a.accept-comment').live("click", function(event) { $(document).on("click", 'a.accept-comment', function(event) {
event.preventDefault(); event.preventDefault();
acceptComment($(this).attr('id').substring(2)); acceptComment($(this).attr('id').substring(2));
}); });
$('a.delete-comment').live("click", function(event) { $(document).on("click", 'a.delete-comment', function(event) {
event.preventDefault(); event.preventDefault();
deleteComment($(this).attr('id').substring(2)); deleteComment($(this).attr('id').substring(2));
}); });
$('a.comment-markup').live("click", function(event) { $(document).on("click", 'a.comment-markup', function(event) {
event.preventDefault(); event.preventDefault();
toggleCommentMarkupBox($(this).attr('id').substring(2)); toggleCommentMarkupBox($(this).attr('id').substring(2));
}); });
...@@ -700,8 +700,8 @@ ...@@ -700,8 +700,8 @@
(<a href="#" class="comment-markup" id="ab<%id%>">markup</a>):</p>\ (<a href="#" class="comment-markup" id="ab<%id%>">markup</a>):</p>\
<div class="comment-markup-box" id="mb<%id%>">\ <div class="comment-markup-box" id="mb<%id%>">\
reStructured text markup: <i>*emph*</i>, <b>**strong**</b>, \ reStructured text markup: <i>*emph*</i>, <b>**strong**</b>, \
<tt>``code``</tt>, \ <code>``code``</code>, \
code blocks: <tt>::</tt> and an indented block after blank line</div>\ code blocks: <code>::</code> and an indented block after blank line</div>\
<form method="post" id="cf<%id%>" class="comment-form" action="">\ <form method="post" id="cf<%id%>" class="comment-form" action="">\
<textarea name="comment" cols="80"></textarea>\ <textarea name="comment" cols="80"></textarea>\
<p class="propose-button">\ <p class="propose-button">\
......
...@@ -27,8 +27,8 @@ ...@@ -27,8 +27,8 @@
<link rel="next" title="How to write a scheduling policy" href="write_scheduler.html" /> <link rel="next" title="How to write a scheduling policy" href="write_scheduler.html" />
<link rel="prev" title="Introduction" href="introduction.html" /> <link rel="prev" title="Introduction" href="introduction.html" />
</head> </head>
<body> <body role="document">
<div class="related"> <div class="related" role="navigation" aria-label="related navigation">
<h3>Navigation</h3> <h3>Navigation</h3>
<ul> <ul>
<li class="right" style="margin-right: 10px"> <li class="right" style="margin-right: 10px">
...@@ -43,13 +43,13 @@ ...@@ -43,13 +43,13 @@
<li class="right" > <li class="right" >
<a href="introduction.html" title="Introduction" <a href="introduction.html" title="Introduction"
accesskey="P">previous</a> |</li> accesskey="P">previous</a> |</li>
<li><a href="index.html">SimSo documentation</a> &raquo;</li> <li class="nav-item nav-item-0"><a href="index.html">SimSo documentation</a> &raquo;</li>
</ul> </ul>
</div> </div>
<div class="document"> <div class="document">
<div class="documentwrapper"> <div class="documentwrapper">
<div class="body"> <div class="body" role="main">
<div class="section" id="frequently-asked-questions"> <div class="section" id="frequently-asked-questions">
<h1>Frequently Asked Questions<a class="headerlink" href="#frequently-asked-questions" title="Permalink to this headline"></a></h1> <h1>Frequently Asked Questions<a class="headerlink" href="#frequently-asked-questions" title="Permalink to this headline"></a></h1>
...@@ -78,7 +78,7 @@ ...@@ -78,7 +78,7 @@
</div> </div>
<div class="clearer"></div> <div class="clearer"></div>
</div> </div>
<div class="related"> <div class="related" role="navigation" aria-label="related navigation">
<h3>Navigation</h3> <h3>Navigation</h3>
<ul> <ul>
<li class="right" style="margin-right: 10px"> <li class="right" style="margin-right: 10px">
...@@ -93,10 +93,10 @@ ...@@ -93,10 +93,10 @@
<li class="right" > <li class="right" >
<a href="introduction.html" title="Introduction" <a href="introduction.html" title="Introduction"
>previous</a> |</li> >previous</a> |</li>
<li><a href="index.html">SimSo documentation</a> &raquo;</li> <li class="nav-item nav-item-0"><a href="index.html">SimSo documentation</a> &raquo;</li>
</ul> </ul>
</div> </div>
<div class="footer"> <div class="footer" role="contentinfo">
</div> </div>
</body> </body>
</html> </html>
\ No newline at end of file
...@@ -26,8 +26,8 @@ ...@@ -26,8 +26,8 @@
<script type="text/javascript" src="_static/doctools.js"></script> <script type="text/javascript" src="_static/doctools.js"></script>
<link rel="top" title="SimSo documentation" href="index.html" /> <link rel="top" title="SimSo documentation" href="index.html" />
</head> </head>
<body> <body role="document">
<div class="related"> <div class="related" role="navigation" aria-label="related navigation">
<h3>Navigation</h3> <h3>Navigation</h3>
<ul> <ul>
<li class="right" style="margin-right: 10px"> <li class="right" style="margin-right: 10px">
...@@ -36,13 +36,13 @@ ...@@ -36,13 +36,13 @@
<li class="right" > <li class="right" >
<a href="py-modindex.html" title="Python Module Index" <a href="py-modindex.html" title="Python Module Index"
>modules</a> |</li> >modules</a> |</li>
<li><a href="index.html">SimSo documentation</a> &raquo;</li> <li class="nav-item nav-item-0"><a href="index.html">SimSo documentation</a> &raquo;</li>
</ul> </ul>
</div> </div>
<div class="document"> <div class="document">
<div class="documentwrapper"> <div class="documentwrapper">
<div class="body"> <div class="body" role="main">
<h1 id="index">Index</h1> <h1 id="index">Index</h1>
...@@ -720,7 +720,7 @@ ...@@ -720,7 +720,7 @@
</div> </div>
<div class="clearer"></div> <div class="clearer"></div>
</div> </div>
<div class="related"> <div class="related" role="navigation" aria-label="related navigation">
<h3>Navigation</h3> <h3>Navigation</h3>
<ul> <ul>
<li class="right" style="margin-right: 10px"> <li class="right" style="margin-right: 10px">
...@@ -729,10 +729,10 @@ ...@@ -729,10 +729,10 @@
<li class="right" > <li class="right" >
<a href="py-modindex.html" title="Python Module Index" <a href="py-modindex.html" title="Python Module Index"
>modules</a> |</li> >modules</a> |</li>
<li><a href="index.html">SimSo documentation</a> &raquo;</li> <li class="nav-item nav-item-0"><a href="index.html">SimSo documentation</a> &raquo;</li>
</ul> </ul>
</div> </div>
<div class="footer"> <div class="footer" role="contentinfo">
</div> </div>
</body> </body>
</html> </html>
\ No newline at end of file
...@@ -26,8 +26,8 @@ ...@@ -26,8 +26,8 @@
<link rel="top" title="SimSo documentation" href="#" /> <link rel="top" title="SimSo documentation" href="#" />
<link rel="next" title="Introduction" href="introduction.html" /> <link rel="next" title="Introduction" href="introduction.html" />
</head> </head>
<body> <body role="document">
<div class="related"> <div class="related" role="navigation" aria-label="related navigation">
<h3>Navigation</h3> <h3>Navigation</h3>
<ul> <ul>
<li class="right" style="margin-right: 10px"> <li class="right" style="margin-right: 10px">
...@@ -39,13 +39,13 @@ ...@@ -39,13 +39,13 @@
<li class="right" > <li class="right" >
<a href="introduction.html" title="Introduction" <a href="introduction.html" title="Introduction"
accesskey="N">next</a> |</li> accesskey="N">next</a> |</li>
<li><a href="#">SimSo documentation</a> &raquo;</li> <li class="nav-item nav-item-0"><a href="#">SimSo documentation</a> &raquo;</li>
</ul> </ul>
</div> </div>
<div class="document"> <div class="document">
<div class="documentwrapper"> <div class="documentwrapper">
<div class="body"> <div class="body" role="main">
<div class="section" id="simso-documentation"> <div class="section" id="simso-documentation">
<h1>SimSo documentation<a class="headerlink" href="#simso-documentation" title="Permalink to this headline"></a></h1> <h1>SimSo documentation<a class="headerlink" href="#simso-documentation" title="Permalink to this headline"></a></h1>
...@@ -97,9 +97,9 @@ ...@@ -97,9 +97,9 @@
<div class="section" id="indices-and-tables"> <div class="section" id="indices-and-tables">
<h1>Indices and tables<a class="headerlink" href="#indices-and-tables" title="Permalink to this headline"></a></h1> <h1>Indices and tables<a class="headerlink" href="#indices-and-tables" title="Permalink to this headline"></a></h1>
<ul class="simple"> <ul class="simple">
<li><a class="reference internal" href="genindex.html"><em>Index</em></a></li> <li><a class="reference internal" href="genindex.html"><span>Index</span></a></li>
<li><a class="reference internal" href="py-modindex.html"><em>Module Index</em></a></li> <li><a class="reference internal" href="py-modindex.html"><span>Module Index</span></a></li>
<li><a class="reference internal" href="search.html"><em>Search Page</em></a></li> <li><a class="reference internal" href="search.html"><span>Search Page</span></a></li>
</ul> </ul>
</div> </div>
...@@ -108,7 +108,7 @@ ...@@ -108,7 +108,7 @@
</div> </div>
<div class="clearer"></div> <div class="clearer"></div>
</div> </div>
<div class="related"> <div class="related" role="navigation" aria-label="related navigation">
<h3>Navigation</h3> <h3>Navigation</h3>
<ul> <ul>
<li class="right" style="margin-right: 10px"> <li class="right" style="margin-right: 10px">
...@@ -120,10 +120,10 @@ ...@@ -120,10 +120,10 @@
<li class="right" > <li class="right" >
<a href="introduction.html" title="Introduction" <a href="introduction.html" title="Introduction"
>next</a> |</li> >next</a> |</li>
<li><a href="#">SimSo documentation</a> &raquo;</li> <li class="nav-item nav-item-0"><a href="#">SimSo documentation</a> &raquo;</li>
</ul> </ul>
</div> </div>
<div class="footer"> <div class="footer" role="contentinfo">
</div> </div>
</body> </body>
</html> </html>
\ No newline at end of file
...@@ -27,8 +27,8 @@ ...@@ -27,8 +27,8 @@
<link rel="next" title="Frequently Asked Questions" href="faq.html" /> <link rel="next" title="Frequently Asked Questions" href="faq.html" />
<link rel="prev" title="SimSo documentation" href="index.html" /> <link rel="prev" title="SimSo documentation" href="index.html" />
</head> </head>
<body> <body role="document">
<div class="related"> <div class="related" role="navigation" aria-label="related navigation">
<h3>Navigation</h3> <h3>Navigation</h3>
<ul> <ul>
<li class="right" style="margin-right: 10px"> <li class="right" style="margin-right: 10px">
...@@ -43,13 +43,13 @@ ...@@ -43,13 +43,13 @@
<li class="right" > <li class="right" >
<a href="index.html" title="SimSo documentation" <a href="index.html" title="SimSo documentation"
accesskey="P">previous</a> |</li> accesskey="P">previous</a> |</li>
<li><a href="index.html">SimSo documentation</a> &raquo;</li> <li class="nav-item nav-item-0"><a href="index.html">SimSo documentation</a> &raquo;</li>
</ul> </ul>
</div> </div>
<div class="document"> <div class="document">
<div class="documentwrapper"> <div class="documentwrapper">
<div class="body"> <div class="body" role="main">
<div class="section" id="introduction"> <div class="section" id="introduction">
<h1>Introduction<a class="headerlink" href="#introduction" title="Permalink to this headline"></a></h1> <h1>Introduction<a class="headerlink" href="#introduction" title="Permalink to this headline"></a></h1>
...@@ -156,7 +156,7 @@ ...@@ -156,7 +156,7 @@
</div> </div>
<div class="clearer"></div> <div class="clearer"></div>
</div> </div>
<div class="related"> <div class="related" role="navigation" aria-label="related navigation">
<h3>Navigation</h3> <h3>Navigation</h3>
<ul> <ul>
<li class="right" style="margin-right: 10px"> <li class="right" style="margin-right: 10px">
...@@ -171,10 +171,10 @@ ...@@ -171,10 +171,10 @@
<li class="right" > <li class="right" >
<a href="index.html" title="SimSo documentation" <a href="index.html" title="SimSo documentation"
>previous</a> |</li> >previous</a> |</li>
<li><a href="index.html">SimSo documentation</a> &raquo;</li> <li class="nav-item nav-item-0"><a href="index.html">SimSo documentation</a> &raquo;</li>
</ul> </ul>
</div> </div>
<div class="footer"> <div class="footer" role="contentinfo">
</div> </div>
</body> </body>
</html> </html>
\ No newline at end of file
...@@ -26,8 +26,8 @@ ...@@ -26,8 +26,8 @@
<link rel="top" title="SimSo documentation" href="index.html" /> <link rel="top" title="SimSo documentation" href="index.html" />
<link rel="prev" title="Main modules" href="modules.html" /> <link rel="prev" title="Main modules" href="modules.html" />
</head> </head>
<body> <body role="document">
<div class="related"> <div class="related" role="navigation" aria-label="related navigation">
<h3>Navigation</h3> <h3>Navigation</h3>
<ul> <ul>
<li class="right" style="margin-right: 10px"> <li class="right" style="margin-right: 10px">
...@@ -39,13 +39,13 @@ ...@@ -39,13 +39,13 @@
<li class="right" > <li class="right" >
<a href="modules.html" title="Main modules" <a href="modules.html" title="Main modules"
accesskey="P">previous</a> |</li> accesskey="P">previous</a> |</li>
<li><a href="index.html">SimSo documentation</a> &raquo;</li> <li class="nav-item nav-item-0"><a href="index.html">SimSo documentation</a> &raquo;</li>
</ul> </ul>
</div> </div>
<div class="document"> <div class="document">
<div class="documentwrapper"> <div class="documentwrapper">
<div class="body"> <div class="body" role="main">
<div class="section" id="licenses"> <div class="section" id="licenses">
<h1>Licenses<a class="headerlink" href="#licenses" title="Permalink to this headline"></a></h1> <h1>Licenses<a class="headerlink" href="#licenses" title="Permalink to this headline"></a></h1>
...@@ -111,7 +111,7 @@ in GPL and LGPL versions.</p> ...@@ -111,7 +111,7 @@ in GPL and LGPL versions.</p>
</div> </div>
<div class="clearer"></div> <div class="clearer"></div>
</div> </div>
<div class="related"> <div class="related" role="navigation" aria-label="related navigation">
<h3>Navigation</h3> <h3>Navigation</h3>
<ul> <ul>
<li class="right" style="margin-right: 10px"> <li class="right" style="margin-right: 10px">
...@@ -123,10 +123,10 @@ in GPL and LGPL versions.</p> ...@@ -123,10 +123,10 @@ in GPL and LGPL versions.</p>
<li class="right" > <li class="right" >
<a href="modules.html" title="Main modules" <a href="modules.html" title="Main modules"
>previous</a> |</li> >previous</a> |</li>
<li><a href="index.html">SimSo documentation</a> &raquo;</li> <li class="nav-item nav-item-0"><a href="index.html">SimSo documentation</a> &raquo;</li>
</ul> </ul>
</div> </div>
<div class="footer"> <div class="footer" role="contentinfo">
</div> </div>
</body> </body>
</html> </html>
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
No preview for this file type
...@@ -28,8 +28,8 @@ ...@@ -28,8 +28,8 @@
</head> </head>
<body> <body role="document">
<div class="related"> <div class="related" role="navigation" aria-label="related navigation">
<h3>Navigation</h3> <h3>Navigation</h3>
<ul> <ul>
<li class="right" style="margin-right: 10px"> <li class="right" style="margin-right: 10px">
...@@ -38,13 +38,13 @@ ...@@ -38,13 +38,13 @@
<li class="right" > <li class="right" >
<a href="#" title="Python Module Index" <a href="#" title="Python Module Index"
>modules</a> |</li> >modules</a> |</li>
<li><a href="index.html">SimSo documentation</a> &raquo;</li> <li class="nav-item nav-item-0"><a href="index.html">SimSo documentation</a> &raquo;</li>
</ul> </ul>
</div> </div>
<div class="document"> <div class="document">
<div class="documentwrapper"> <div class="documentwrapper">
<div class="body"> <div class="body" role="main">
<h1>Python Module Index</h1> <h1>Python Module Index</h1>
...@@ -61,72 +61,72 @@ ...@@ -61,72 +61,72 @@
<td><img src="_static/minus.png" class="toggler" <td><img src="_static/minus.png" class="toggler"
id="toggle-1" style="display: none" alt="-" /></td> id="toggle-1" style="display: none" alt="-" /></td>
<td> <td>
<tt class="xref">simso</tt></td><td> <code class="xref">simso</code></td><td>
<em></em></td></tr> <em></em></td></tr>
<tr class="cg-1"> <tr class="cg-1">
<td></td> <td></td>
<td>&nbsp;&nbsp;&nbsp; <td>&nbsp;&nbsp;&nbsp;
<a href="modules.html#module-simso.configuration"><tt class="xref">simso.configuration</tt></a></td><td> <a href="modules.html#module-simso.configuration"><code class="xref">simso.configuration</code></a></td><td>
<em></em></td></tr> <em></em></td></tr>
<tr class="cg-1"> <tr class="cg-1">
<td></td> <td></td>
<td>&nbsp;&nbsp;&nbsp; <td>&nbsp;&nbsp;&nbsp;
<a href="modules.html#module-simso.configuration.Configuration"><tt class="xref">simso.configuration.Configuration</tt></a></td><td> <a href="modules.html#module-simso.configuration.Configuration"><code class="xref">simso.configuration.Configuration</code></a></td><td>
<em></em></td></tr> <em></em></td></tr>
<tr class="cg-1"> <tr class="cg-1">
<td></td> <td></td>
<td>&nbsp;&nbsp;&nbsp; <td>&nbsp;&nbsp;&nbsp;
<a href="modules.html#module-simso.core"><tt class="xref">simso.core</tt></a></td><td> <a href="modules.html#module-simso.core"><code class="xref">simso.core</code></a></td><td>
<em></em></td></tr> <em></em></td></tr>
<tr class="cg-1"> <tr class="cg-1">
<td></td> <td></td>
<td>&nbsp;&nbsp;&nbsp; <td>&nbsp;&nbsp;&nbsp;
<a href="modules.html#module-simso.core.Job"><tt class="xref">simso.core.Job</tt></a></td><td> <a href="modules.html#module-simso.core.Job"><code class="xref">simso.core.Job</code></a></td><td>
<em></em></td></tr> <em></em></td></tr>
<tr class="cg-1"> <tr class="cg-1">
<td></td> <td></td>
<td>&nbsp;&nbsp;&nbsp; <td>&nbsp;&nbsp;&nbsp;
<a href="modules.html#module-simso.core.Logger"><tt class="xref">simso.core.Logger</tt></a></td><td> <a href="modules.html#module-simso.core.Logger"><code class="xref">simso.core.Logger</code></a></td><td>
<em></em></td></tr> <em></em></td></tr>
<tr class="cg-1"> <tr class="cg-1">
<td></td> <td></td>
<td>&nbsp;&nbsp;&nbsp; <td>&nbsp;&nbsp;&nbsp;
<a href="modules.html#module-simso.core.Model"><tt class="xref">simso.core.Model</tt></a></td><td> <a href="modules.html#module-simso.core.Model"><code class="xref">simso.core.Model</code></a></td><td>
<em></em></td></tr> <em></em></td></tr>
<tr class="cg-1"> <tr class="cg-1">
<td></td> <td></td>
<td>&nbsp;&nbsp;&nbsp; <td>&nbsp;&nbsp;&nbsp;
<a href="modules.html#module-simso.core.Processor"><tt class="xref">simso.core.Processor</tt></a></td><td> <a href="modules.html#module-simso.core.Processor"><code class="xref">simso.core.Processor</code></a></td><td>
<em></em></td></tr> <em></em></td></tr>
<tr class="cg-1"> <tr class="cg-1">
<td></td> <td></td>
<td>&nbsp;&nbsp;&nbsp; <td>&nbsp;&nbsp;&nbsp;
<a href="modules.html#module-simso.core.results"><tt class="xref">simso.core.results</tt></a></td><td> <a href="modules.html#module-simso.core.results"><code class="xref">simso.core.results</code></a></td><td>
<em></em></td></tr> <em></em></td></tr>
<tr class="cg-1"> <tr class="cg-1">
<td></td> <td></td>
<td>&nbsp;&nbsp;&nbsp; <td>&nbsp;&nbsp;&nbsp;
<a href="modules.html#module-simso.core.Scheduler"><tt class="xref">simso.core.Scheduler</tt></a></td><td> <a href="modules.html#module-simso.core.Scheduler"><code class="xref">simso.core.Scheduler</code></a></td><td>
<em></em></td></tr> <em></em></td></tr>
<tr class="cg-1"> <tr class="cg-1">
<td></td> <td></td>
<td>&nbsp;&nbsp;&nbsp; <td>&nbsp;&nbsp;&nbsp;
<a href="modules.html#module-simso.core.Task"><tt class="xref">simso.core.Task</tt></a></td><td> <a href="modules.html#module-simso.core.Task"><code class="xref">simso.core.Task</code></a></td><td>
<em></em></td></tr> <em></em></td></tr>
<tr class="cg-1"> <tr class="cg-1">
<td></td> <td></td>
<td>&nbsp;&nbsp;&nbsp; <td>&nbsp;&nbsp;&nbsp;
<a href="modules.html#module-simso.core.Timer"><tt class="xref">simso.core.Timer</tt></a></td><td> <a href="modules.html#module-simso.core.Timer"><code class="xref">simso.core.Timer</code></a></td><td>
<em></em></td></tr> <em></em></td></tr>
<tr class="cg-1"> <tr class="cg-1">
<td></td> <td></td>
<td>&nbsp;&nbsp;&nbsp; <td>&nbsp;&nbsp;&nbsp;
<a href="modules.html#module-simso.generator.task_generator"><tt class="xref">simso.generator.task_generator</tt></a></td><td> <a href="modules.html#module-simso.generator.task_generator"><code class="xref">simso.generator.task_generator</code></a></td><td>
<em></em></td></tr> <em></em></td></tr>
<tr class="cg-1"> <tr class="cg-1">
<td></td> <td></td>
<td>&nbsp;&nbsp;&nbsp; <td>&nbsp;&nbsp;&nbsp;
<a href="modules.html#module-simso.utils.PartitionedScheduler"><tt class="xref">simso.utils.PartitionedScheduler</tt></a></td><td> <a href="modules.html#module-simso.utils.PartitionedScheduler"><code class="xref">simso.utils.PartitionedScheduler</code></a></td><td>
<em></em></td></tr> <em></em></td></tr>
</table> </table>
...@@ -135,7 +135,7 @@ ...@@ -135,7 +135,7 @@
</div> </div>
<div class="clearer"></div> <div class="clearer"></div>
</div> </div>
<div class="related"> <div class="related" role="navigation" aria-label="related navigation">
<h3>Navigation</h3> <h3>Navigation</h3>
<ul> <ul>
<li class="right" style="margin-right: 10px"> <li class="right" style="margin-right: 10px">
...@@ -144,10 +144,10 @@ ...@@ -144,10 +144,10 @@
<li class="right" > <li class="right" >
<a href="#" title="Python Module Index" <a href="#" title="Python Module Index"
>modules</a> |</li> >modules</a> |</li>
<li><a href="index.html">SimSo documentation</a> &raquo;</li> <li class="nav-item nav-item-0"><a href="index.html">SimSo documentation</a> &raquo;</li>
</ul> </ul>
</div> </div>
<div class="footer"> <div class="footer" role="contentinfo">
</div> </div>
</body> </body>
</html> </html>
\ No newline at end of file
...@@ -33,8 +33,8 @@ ...@@ -33,8 +33,8 @@
</head> </head>
<body> <body role="document">
<div class="related"> <div class="related" role="navigation" aria-label="related navigation">
<h3>Navigation</h3> <h3>Navigation</h3>
<ul> <ul>
<li class="right" style="margin-right: 10px"> <li class="right" style="margin-right: 10px">
...@@ -43,13 +43,13 @@ ...@@ -43,13 +43,13 @@
<li class="right" > <li class="right" >
<a href="py-modindex.html" title="Python Module Index" <a href="py-modindex.html" title="Python Module Index"
>modules</a> |</li> >modules</a> |</li>
<li><a href="index.html">SimSo documentation</a> &raquo;</li> <li class="nav-item nav-item-0"><a href="index.html">SimSo documentation</a> &raquo;</li>
</ul> </ul>
</div> </div>
<div class="document"> <div class="document">
<div class="documentwrapper"> <div class="documentwrapper">
<div class="body"> <div class="body" role="main">
<h1 id="search-documentation">Search</h1> <h1 id="search-documentation">Search</h1>
<div id="fallback" class="admonition warning"> <div id="fallback" class="admonition warning">
...@@ -79,7 +79,7 @@ ...@@ -79,7 +79,7 @@
</div> </div>
<div class="clearer"></div> <div class="clearer"></div>
</div> </div>
<div class="related"> <div class="related" role="navigation" aria-label="related navigation">
<h3>Navigation</h3> <h3>Navigation</h3>
<ul> <ul>
<li class="right" style="margin-right: 10px"> <li class="right" style="margin-right: 10px">
...@@ -88,10 +88,10 @@ ...@@ -88,10 +88,10 @@
<li class="right" > <li class="right" >
<a href="py-modindex.html" title="Python Module Index" <a href="py-modindex.html" title="Python Module Index"
>modules</a> |</li> >modules</a> |</li>
<li><a href="index.html">SimSo documentation</a> &raquo;</li> <li class="nav-item nav-item-0"><a href="index.html">SimSo documentation</a> &raquo;</li>
</ul> </ul>
</div> </div>
<div class="footer"> <div class="footer" role="contentinfo">
</div> </div>
</body> </body>
</html> </html>
\ No newline at end of file
Search.setIndex({envversion:42,terms:{"default":4,all:[0,5,4],code:[2,5,6,3,4],edf:[],scratch:[],edh:2,global:2,affect_task_to_processor:5,is_act:4,worst_fit:4,per:[0,4],kato:[2,4],follow:[0,2,6,5,4],hyperperiod:4,llf:2,abid:6,millisecond:4,whose:6,decid:4,procur:4,depend:[],send:[5,3],init:[0,5,4],program:6,decis:[2,4],under:[2,6,4],set_stack_fil:4,aris:4,stafford:4,neglig:4,adapt:[2,4],merchant:4,sourc:[2,5,6,3,4],lre:2,risk:6,fals:[5,4],account:2,util:[],worst:[2,4],gen_uunifastdiscard:4,veri:[0,2,5,4],appar:[],four:5,computation_tim:[0,4],observation_window:4,proc:4,button:[],list:[5,3,4],factori:4,"try":0,schedulerinfo:[5,4],computation_time_cycl:4,team:[],quick:2,evt:0,pleas:[3,4],impli:4,version:[2,6],direct:4,rate:2,pass:[0,5,4],download:[],click:[],append:5,compat:[2,3],index:1,what:[],stack_fil:4,sum:0,abl:4,"while":5,current:[2,4],experiment:0,"new":[0,3,4],abort_on_miss:4,method:[0,5,4],laxiti:[2,4],impact:2,full:5,deriv:[],absolut:[5,4],french:6,dpfair:2,met:4,lgpl:6,modif:4,argv:0,ubuntu:3,path:[],modifi:[2,6],interpret:4,wait:4,search:1,convers:2,overhead_termin:4,ekg:2,observ:4,precis:4,prior:4,amount:4,overriden:[5,4],action:4,implement:[],uunifast:4,orient:6,overrid:4,taskr:[0,4],via:2,extra:4,appli:5,modul:[],releas:[2,6,4],heurist:[2,4],task_typ:4,instal:[],total:4,unit:4,from:[],proceed:2,distinct:4,pred:4,doubl:[],dure:4,cho:2,websit:2,few:[0,2,6],handler:4,overhead:[2,5,6,4],taken:[],prev:0,type:[2,4],more:[],sort:4,list_activation_d:4,notic:4,start_dat:4,warn:4,exce:4,prototyp:2,particular:[2,4],decreasing_next_fit:4,editor:[],cach:[2,4],must:[2,5,3,4],none:[0,5,4],graphic:[2,6,3],retriev:4,setup:2,uniqu:4,histori:0,remain:4,minimum:4,purpos:[6,4],exceeded_deadlin:4,def:[0,5],control:[3,4],complic:6,give:5,process:[6,4],lock:4,add_processor:[0,4],accept:6,abort:4,umin:4,everi:[0,4],occur:[5,4],declar:4,delai:4,cours:0,multipl:2,ripol:4,anoth:4,write:[],pair:4,cur_dir:4,simpi:[],voltag:2,simpl:[2,4],sim:4,updat:[2,5],product:[],resourc:2,max:4,decreasing_first_fit:4,after:4,laa:6,befor:[0,5,4],llref:2,attent:6,mai:6,end:4,law:6,data:[6,4],alloc:5,bini:4,third:[],tutori:[0,5],is_run:4,light:6,secur:6,explicit:[],caus:4,callback:4,"switch":[0,2],allow:[2,3,4],mechan:4,lambda:5,order:[0,2,3,4,5],gen_periods_discret:4,help:5,endors:[],offici:4,govern:6,cxtsave:4,through:[0,2,5,4],is_period:[],affect:5,still:[5,4],mainli:4,dynam:[2,4],group:[0,4],obviou:[],fit:[2,5,4],chosen:[5,4],fix:[2,4],cl_overhead:4,cla:[0,4],late:2,platform:2,matlabcentr:4,bin:5,main:[],non:4,good:[2,5,4],"return":[5,4],greater:4,cea:6,python:[2,5,6,3,4],epdf:2,inria:6,lesser:6,instead:4,interrupt:4,now:4,nor:[],introduct:[],choic:3,term:6,somewher:4,name:[0,5,4],delta_preempt:4,edit:[],config:0,easili:3,mode:[],each:[0,5,3,4],fulli:3,taskinfo:4,truncat:4,mean:6,monoton:2,ensur:6,contributor:4,redistribut:[6,4],edf_mono:5,"static":2,p_edf:5,our:5,happen:0,reduct:2,special:4,out:4,fileexchang:4,matrix:4,space:[5,4],profit:4,miss:5,robert:4,semi:2,ret:4,profil:4,uunifastdiscard:[],suitabl:6,rel:4,print:[0,5],correct:[0,4],decreasing_worst_fit:4,prioriti:[2,5],advanc:4,migrat:4,manipul:6,given:4,free:[5,6],reason:5,base:[2,6,4],theori:4,dictionari:4,put:4,earliest:[2,5],could:[0,5,3],mac:3,counterpart:6,thing:5,place:4,propos:4,outsid:4,retain:4,typic:4,interact:4,end_dat:4,first:[],origin:4,softwar:[2,6,4],major:4,simulation_fil:4,internal_id:4,onc:4,csdp:4,number:[0,4],proc_info:4,restrict:6,date:[5,3,4],task_info:4,done:[0,5,3,4],messag:[5,4],owner:[],round_to_int:4,open:2,gpl:[2,6],differ:[0,4],"long":4,script:[],associ:[6,4],licens:[],reli:6,least:[2,5,4],attach:4,atask:4,too:4,which:[5,4],termin:4,white:[],"final":0,store:4,schema:3,knowledg:6,grant:6,juli:3,copi:6,specifi:[3,4],pyqt4:2,mathwork:4,kept:5,exactli:0,holder:[6,4],than:4,character:4,wide:[0,4],erickson:2,slack:4,provid:[0,2,3,4,5,6],andersson:2,second:5,structur:5,exampl:[],project:[],matter:4,reus:6,redifin:5,str:0,mandatori:5,initi:[],randomli:4,analysi:[0,4],comput:[0,6,4],max_:4,robdavi:4,respons:[5,4],argument:[0,4],packag:3,expir:4,have:[0,6,4],close:4,need:[5,4],"import":[0,5],cecil:[2,6],loguniform:4,get_cl:4,techniqu:2,zero:2,inform:[0,4],self:[5,4],euromicro:2,now_m:4,also:[0,2,3,4,5,6],discret:[2,6],take:[2,4],advis:4,min_:4,tasks_ev:4,tool:4,singl:[5,4],even:4,sure:5,distribut:[6,4],n_instr:4,though:3,object:[0,6,4],reach:4,decreasing_best_fit:4,phase:4,followed_bi:4,model:[],equival:4,schedulerr:4,url:6,doc:4,yang:2,resch:[5,4],usual:[5,4],fact:6,run_model:[0,4],preemption_count:0,gen_periods_uniform:4,shot:4,show:5,text:2,random:4,prid:2,directli:[0,5,4],permiss:[],find:[2,5],xml:3,access:[0,6],onli:[5,6,4],execut:[0,5,3,4],facil:4,iep:[],explain:5,next_fit:4,activ:[5,3,4],enough:4,should:[2,5,4],configur:[],busi:4,analyz:4,flexibl:[0,2],count:[0,4],variou:4,get:[0,4],express:4,stop:4,decreas:2,ptask:4,procev:0,report:4,on_termin:[5,4],ready_list:5,requir:[0,2,6,4],first_fit:4,overhead_activ:4,add_task:[0,4],bar:4,enabl:6,emb:4,yield:4,migration_overhead:4,roger:4,statist:2,partit:[],contain:[2,4],where:[0,5,4],remov:[5,4],view:4,kernel:4,fair:2,packer:[5,4],actual_computation_tim:4,see:[2,4],deadlin:[0,2,5,4],arg:[0,4],fail:5,reserv:[6,4],best:[2,4],subject:[],statu:6,suffer:4,preemption_cost:4,extend:4,someth:0,pd2:2,cs_overhead:4,written:3,between:4,progress:4,neither:[],approach:5,best_fit:4,attribut:[0,4],accord:4,pretti:5,jobr:[0,4],kei:[5,4],nelissen:2,cycl:4,job:[],spare:4,here:[5,4],nset:4,embed:[0,2],monitor:[0,4],disclaim:4,last:[2,5],cycles_per_m:[0,4],mono:5,uniprocessor:[],incident:4,contract:4,len:[0,5],polici:[],tovar:2,present:6,context:[0,2],logic:[5,4],get_hyperperiod:4,whole:4,etm:4,load:[],among:5,cxt:0,point:[5,4],instanti:[0,5,4],priorit:5,pfair:2,scheduler_info:[0,4],period:[0,2,5,4],exemplari:4,linux:3,respect:[5,6],damag:4,liabil:[6,4],coupl:4,tort:4,numpi:[],window:[3,4],been:4,compon:4,accumul:4,much:2,valu:4,basic:0,calc_load:4,gen_kato_util:4,"abstract":4,partial:0,on_activ:[5,4],gen_taskset:4,emberson:4,fire:4,consequenti:4,ani:[2,5,4],understand:2,els:[0,5],those:4,"case":4,ident:5,look:5,gnu:6,servic:4,durat:[0,4],aim:2,defin:[],invok:[5,4],abov:4,error:4,edzl:2,howev:[3,4],pack:[],earli:2,helper:4,readi:[5,4],metric:[0,4],therefor:6,them:5,kwarg:4,gen_randfixedsum:4,"__init__":4,scienc:[],parent:4,develop:[2,5,6],thei:5,author:[6,4],parti:[],make:4,econom:6,same:[0,6,4],binari:[2,4],instanc:4,funk:2,largest:4,set_nam:[],success:6,acet:4,complet:[],finish:[5,4],archiv:2,closest:5,optim:[2,4],target_util:4,permit:4,upon:4,moment:4,rais:0,user:[2,6,3],extern:3,stack:4,funaoka:2,redefin:4,cxtload:4,mllf:2,com:4,sporadictask:4,min:[5,4],itself:6,spent:4,inherit:[5,4],without:[0,4],contact:4,thi:[0,2,3,4,5,6],everyth:2,left:[],twent:[],distanc:4,identifi:[0,4],just:[],unfair:2,paul:4,speed:[3,4],yet:5,languag:6,york:4,gen_periods_loguniform:4,easi:[2,5,4],mix:4,baruah:2,had:6,except:0,add:[0,4],input:4,save:4,task_list:[0,5,4],real:[2,6,4],cherami:6,nvnlf:2,minimalist:5,read:[0,6,4],arriv:3,know:0,librairi:2,characterist:[0,3],get_observation_window:4,loss:4,like:[2,5],specif:[6,4],arbitrari:5,generictask:4,manual:0,pillai:2,necessari:[2,5],either:4,xsd:3,page:1,actual_computation_time_cycl:4,www:[6,4],right:[6,4],often:2,simplifi:4,in_m:4,some:[0,2],maxim:6,intern:4,wcet:[0,5,4],guarante:[5,4],indirect:4,librari:[0,2,3],u_i:4,scale:2,cnr:6,remind:5,avoid:4,shall:4,subclass:[5,4],substitut:4,select:5,condit:[6,4],reproduc:[6,4],core:[],encourag:6,previou:[0,4],run:[0,2,5,4],randfixedsum:4,check_al:[0,4],processorr:4,confer:2,step:[],nutshel:5,promot:[],taskset:4,drawn:6,about:4,simplest:5,materi:4,http:[6,4],simul:[],constructor:[0,5,4],discard:4,univers:[],base_cpi:4,et_stddev:4,"float":[5,4],profession:6,automat:0,invers:4,warranti:[6,4],bsd:[6,4],one_shot:4,empti:0,liabl:4,lieu:4,wrap:2,chang:[0,4],next:[2,4],your:3,preemption:[0,2,4],log:[0,4],wai:[2,5,4],fast:2,custom:0,avail:[],start:[5,4],anderson:2,interfac:[2,6,3],includ:4,call:[5,4],strict:4,etc:[0,4],"function":[3,4],form:4,tupl:4,regard:[6,4],proc_info_list:4,msg:4,multiprocessor:[2,5,6,4],low:2,gen_ripol:4,eas:5,highest:5,"true":[5,4],conclus:4,info:6,zhu:2,consist:5,possibl:[0,2,3,4,5],whether:4,levin:2,realist:4,maximum:[0,2,4],release_lock:4,limit:[6,4],otherwis:[3,4],problem:2,similar:4,temporarli:4,procinfo:4,creat:[],certain:4,utilis:4,filenam:[0,4],repres:4,incomplet:3,circul:6,file:[],behavior:4,umax:4,ship:3,check:[0,4],probabl:4,again:4,when:[0,2,5,4],detail:[],virtual:4,event:[0,2,6,5,4],power:2,field:4,create_job:4,other:[2,4],bool:4,copyright:[6,4],task_info_list:4,test:[2,6,4],regnier:2,davi:4,staffordrandfixedsum:4,task_migr:4,architectur:[2,5,4],"class":[0,5,4],souc:2,absolute_deadlin:[5,4],get_lock:4,debian:3,reduc:2,set_observation_window:4,experienc:6,faster:4,algorithm:[2,5,4],directori:[],dvf:2,pseudo:2,indirectli:5,rule:6,goe:4,depth:6,activation_d:[0,4],time:[0,2,6,3,4],rapitasystem:4,licensor:6,cpu:[0,5,4],oop:5},objtypes:{"0":"py:module","1":"py:attribute","2":"py:method","3":"py:function","4":"py:class"},objnames:{"0":["py","module","Python module"],"1":["py","attribute","Python attribute"],"2":["py","method","Python method"],"3":["py","function","Python function"],"4":["py","class","Python class"]},filenames:["text_mode","index","introduction","faq","modules","write_scheduler","licenses"],titles:["Using SimSo in script mode","SimSo documentation","Introduction","Frequently Asked Questions","Main modules","How to write a scheduling policy","Licenses"],objects:{"simso.utils":{PartitionedScheduler:[4,0,0,"-"]},"simso.core.Scheduler.SchedulerInfo":{get_cls:[4,2,1,""],instantiate:[4,2,1,""]},"simso.core.Model.Model":{run_model:[4,2,1,""],logs:[4,1,1,""],cycles_per_ms:[4,1,1,""],task_list:[4,1,1,""],duration:[4,1,1,""],etm:[4,1,1,""],processors:[4,1,1,""]},"simso.configuration":{Configuration:[4,0,0,"-"]},"simso.generator.task_generator":{gen_periods_uniform:[4,3,1,""],gen_periods_loguniform:[4,3,1,""],gen_uunifastdiscard:[4,3,1,""],gen_kato_utilizations:[4,3,1,""],gen_tasksets:[4,3,1,""],gen_periods_discrete:[4,3,1,""],gen_randfixedsum:[4,3,1,""],gen_ripoll:[4,3,1,""],StaffordRandFixedSum:[4,3,1,""]},"simso.core.Task.GenericTask":{jobs:[4,1,1,""],monitor:[4,1,1,""],followed_by:[4,1,1,""],period:[4,1,1,""],create_job:[4,2,1,""],deadline:[4,1,1,""],wcet:[4,1,1,""],identifier:[4,1,1,""],data:[4,1,1,""]},"simso.core.Task.TaskInfo":{csdp:[4,1,1,""],stack_file:[4,1,1,""],set_stack_file:[4,2,1,""]},"simso.core.Timer.Timer":{start:[4,2,1,""],stop:[4,2,1,""]},"simso.generator":{task_generator:[4,0,0,"-"]},"simso.configuration.Configuration.Configuration":{save:[4,2,1,""],add_task:[4,2,1,""],check_all:[4,2,1,""],scheduler_info:[4,1,1,""],add_processor:[4,2,1,""],proc_info_list:[4,1,1,""],task_info_list:[4,1,1,""],get_hyperperiod:[4,2,1,""]},"simso.core.Logger":{Logger:[4,4,1,""]},"simso.utils.PartitionedScheduler.PartitionedScheduler":{init:[4,2,1,""]},"simso.core":{Task:[4,0,0,"-"],results:[4,0,0,"-"],Timer:[4,0,0,"-"],Processor:[4,0,0,"-"],Job:[4,0,0,"-"],Scheduler:[4,0,0,"-"],Model:[4,0,0,"-"],Logger:[4,0,0,"-"]},"simso.core.results.Results":{set_observation_window:[4,2,1,""],tasks_event:[4,2,1,""],calc_load:[4,2,1,""],get_observation_window:[4,2,1,""],observation_window:[4,1,1,""]},"simso.core.Scheduler.Scheduler":{add_task:[4,2,1,""],schedule:[4,2,1,""],on_terminated:[4,2,1,""],add_processor:[4,2,1,""],init:[4,2,1,""],release_lock:[4,2,1,""],on_activate:[4,2,1,""],get_lock:[4,2,1,""]},"simso.core.Scheduler":{SchedulerInfo:[4,4,1,""],Scheduler:[4,4,1,""]},"simso.core.Job.Job":{computation_time_cycles:[4,1,1,""],task:[4,1,1,""],actual_computation_time:[4,1,1,""],end_date:[4,1,1,""],is_running:[4,2,1,""],start_date:[4,1,1,""],computation_time:[4,1,1,""],is_active:[4,2,1,""],period:[4,1,1,""],ret:[4,1,1,""],laxity:[4,1,1,""],exceeded_deadline:[4,1,1,""],abort:[4,2,1,""],deadline:[4,1,1,""],wcet:[4,1,1,""],aborted:[4,1,1,""],activation_date:[4,1,1,""],absolute_deadline:[4,1,1,""],data:[4,1,1,""],cpu:[4,1,1,""],actual_computation_time_cycles:[4,1,1,""]},"simso.core.Logger.Logger":{logs:[4,1,1,""],log:[4,2,1,""]},"simso.core.Job":{Job:[4,4,1,""]},"simso.core.Processor":{Processor:[4,4,1,""]},"simso.core.Processor.Processor":{running:[4,1,1,""],resched:[4,2,1,""],is_running:[4,2,1,""],internal_id:[4,1,1,""]},"simso.configuration.Configuration":{Configuration:[4,4,1,""]},"simso.utils.PartitionedScheduler":{PartitionedScheduler:[4,4,1,""],decreasing_first_fit:[4,3,1,""],next_fit:[4,3,1,""],decreasing_best_fit:[4,3,1,""],worst_fit:[4,3,1,""],decreasing_worst_fit:[4,3,1,""],decreasing_next_fit:[4,3,1,""],best_fit:[4,3,1,""],first_fit:[4,3,1,""]},simso:{core:[4,0,0,"-"],configuration:[4,0,0,"-"]},"simso.core.Task":{Task:[4,3,1,""],GenericTask:[4,4,1,""],SporadicTask:[4,4,1,""],PTask:[4,4,1,""],ATask:[4,4,1,""],TaskInfo:[4,4,1,""]},"simso.core.Model":{Model:[4,4,1,""]},"simso.core.results":{TaskR:[4,4,1,""],Results:[4,4,1,""],ProcessorR:[4,4,1,""],SchedulerR:[4,4,1,""],JobR:[4,4,1,""]},"simso.core.Timer":{Timer:[4,4,1,""]}},titleterms:{oper:3,load:0,set:[],edf:5,skeleton:5,creat:0,schedul:[2,5,4],modul:4,creation:5,indic:1,detail:0,sporad:3,implement:5,result:4,file:[0,5],tabl:[0,1,5,4],download:2,instal:2,simul:0,pack:5,partitionedschedul:4,content:[0,5,4],what:2,defin:5,depend:[2,6],script:0,polici:5,parti:[],support:3,configur:[0,4],question:3,system:3,pyqt:6,uniform:3,avail:2,how:5,write:5,explan:5,scratch:0,simpi:6,you:3,main:4,complet:5,core:4,handl:3,gener:[3,4],licens:6,initi:5,util:4,step:2,numpi:6,ask:3,from:0,mode:0,logger:4,introduct:2,task:[3,4],third:[],simso:[0,1,2,3,4,6],document:1,uniprocessor:5,work:3,job:4,timer:4,doe:3,heterogen:3,codeeditor:[],exampl:[0,5],can:3,partit:5,own:3,model:[0,4],more:0,processor:[3,4],frequent:3,first:[0,2]}}) Search.setIndex({envversion:46,filenames:["faq","index","introduction","licenses","modules","text_mode","write_scheduler"],objects:{"simso.configuration":{Configuration:[4,0,0,"-"]},"simso.configuration.Configuration":{Configuration:[4,4,1,""]},"simso.configuration.Configuration.Configuration":{add_processor:[4,2,1,""],add_task:[4,2,1,""],check_all:[4,2,1,""],get_hyperperiod:[4,2,1,""],proc_info_list:[4,1,1,""],save:[4,2,1,""],scheduler_info:[4,1,1,""],task_info_list:[4,1,1,""]},"simso.core":{Job:[4,0,0,"-"],Logger:[4,0,0,"-"],Model:[4,0,0,"-"],Processor:[4,0,0,"-"],Scheduler:[4,0,0,"-"],Task:[4,0,0,"-"],Timer:[4,0,0,"-"],results:[4,0,0,"-"]},"simso.core.Job":{Job:[4,4,1,""]},"simso.core.Job.Job":{abort:[4,2,1,""],aborted:[4,1,1,""],absolute_deadline:[4,1,1,""],activation_date:[4,1,1,""],actual_computation_time:[4,1,1,""],actual_computation_time_cycles:[4,1,1,""],computation_time:[4,1,1,""],computation_time_cycles:[4,1,1,""],cpu:[4,1,1,""],data:[4,1,1,""],deadline:[4,1,1,""],end_date:[4,1,1,""],exceeded_deadline:[4,1,1,""],is_active:[4,2,1,""],is_running:[4,2,1,""],laxity:[4,1,1,""],period:[4,1,1,""],ret:[4,1,1,""],start_date:[4,1,1,""],task:[4,1,1,""],wcet:[4,1,1,""]},"simso.core.Logger":{Logger:[4,4,1,""]},"simso.core.Logger.Logger":{log:[4,2,1,""],logs:[4,1,1,""]},"simso.core.Model":{Model:[4,4,1,""]},"simso.core.Model.Model":{cycles_per_ms:[4,1,1,""],duration:[4,1,1,""],etm:[4,1,1,""],logs:[4,1,1,""],processors:[4,1,1,""],run_model:[4,2,1,""],task_list:[4,1,1,""]},"simso.core.Processor":{Processor:[4,4,1,""]},"simso.core.Processor.Processor":{internal_id:[4,1,1,""],is_running:[4,2,1,""],resched:[4,2,1,""],running:[4,1,1,""]},"simso.core.Scheduler":{Scheduler:[4,4,1,""],SchedulerInfo:[4,4,1,""]},"simso.core.Scheduler.Scheduler":{add_processor:[4,2,1,""],add_task:[4,2,1,""],get_lock:[4,2,1,""],init:[4,2,1,""],on_activate:[4,2,1,""],on_terminated:[4,2,1,""],release_lock:[4,2,1,""],schedule:[4,2,1,""]},"simso.core.Scheduler.SchedulerInfo":{get_cls:[4,2,1,""],instantiate:[4,2,1,""]},"simso.core.Task":{ATask:[4,4,1,""],GenericTask:[4,4,1,""],PTask:[4,4,1,""],SporadicTask:[4,4,1,""],Task:[4,3,1,""],TaskInfo:[4,4,1,""]},"simso.core.Task.GenericTask":{create_job:[4,2,1,""],data:[4,1,1,""],deadline:[4,1,1,""],followed_by:[4,1,1,""],identifier:[4,1,1,""],jobs:[4,1,1,""],monitor:[4,1,1,""],period:[4,1,1,""],wcet:[4,1,1,""]},"simso.core.Task.TaskInfo":{csdp:[4,1,1,""],set_stack_file:[4,2,1,""],stack_file:[4,1,1,""]},"simso.core.Timer":{Timer:[4,4,1,""]},"simso.core.Timer.Timer":{start:[4,2,1,""],stop:[4,2,1,""]},"simso.core.results":{JobR:[4,4,1,""],ProcessorR:[4,4,1,""],Results:[4,4,1,""],SchedulerR:[4,4,1,""],TaskR:[4,4,1,""]},"simso.core.results.Results":{calc_load:[4,2,1,""],get_observation_window:[4,2,1,""],observation_window:[4,1,1,""],set_observation_window:[4,2,1,""],tasks_event:[4,2,1,""]},"simso.generator":{task_generator:[4,0,0,"-"]},"simso.generator.task_generator":{StaffordRandFixedSum:[4,3,1,""],gen_kato_utilizations:[4,3,1,""],gen_periods_discrete:[4,3,1,""],gen_periods_loguniform:[4,3,1,""],gen_periods_uniform:[4,3,1,""],gen_randfixedsum:[4,3,1,""],gen_ripoll:[4,3,1,""],gen_tasksets:[4,3,1,""],gen_uunifastdiscard:[4,3,1,""]},"simso.utils":{PartitionedScheduler:[4,0,0,"-"]},"simso.utils.PartitionedScheduler":{PartitionedScheduler:[4,4,1,""],best_fit:[4,3,1,""],decreasing_best_fit:[4,3,1,""],decreasing_first_fit:[4,3,1,""],decreasing_next_fit:[4,3,1,""],decreasing_worst_fit:[4,3,1,""],first_fit:[4,3,1,""],next_fit:[4,3,1,""],worst_fit:[4,3,1,""]},"simso.utils.PartitionedScheduler.PartitionedScheduler":{init:[4,2,1,""]},simso:{configuration:[4,0,0,"-"],core:[4,0,0,"-"]}},objnames:{"0":["py","module","Python module"],"1":["py","attribute","Python attribute"],"2":["py","method","Python method"],"3":["py","function","Python function"],"4":["py","class","Python class"]},objtypes:{"0":"py:module","1":"py:attribute","2":"py:method","3":"py:function","4":"py:class"},terms:{"__init__":4,"abstract":4,"case":4,"class":[4,5,6],"default":4,"final":5,"float":[4,6],"function":[0,4],"import":[5,6],"long":4,"new":[0,4,5],"return":[4,6],"static":2,"switch":[2,5],"true":[4,6],"try":5,"while":6,abid:3,abl:4,abort:4,abort_on_miss:4,about:4,abov:4,absolut:[4,6],absolute_deadlin:[4,6],accept:3,access:[3,5],accord:4,account:2,accumul:4,acet:4,action:4,activ:[0,4,6],activation_d:[4,5],actual_computation_tim:4,actual_computation_time_cycl:4,adapt:[2,4],add:[4,5],add_processor:[4,5],add_task:[4,5],advanc:4,advis:4,affect:6,affect_task_to_processor:6,after:4,again:4,aim:2,algorithm:[2,4,6],all:[4,5,6],alloc:6,allow:[0,2,4],also:[0,2,3,4,5,6],among:6,amount:4,analysi:[4,5],analyz:4,anderson:2,andersson:2,ani:[2,4,6],anoth:4,append:6,appli:6,approach:6,arbitrari:6,architectur:[2,4,6],archiv:2,arg:[4,5],argument:[4,5],argv:5,aris:4,arriv:0,associ:[3,4],atask:4,attach:4,attent:3,attribut:[4,5],author:[3,4],automat:5,avail:[0,1],avoid:4,bar:4,baruah:2,base:[2,3,4],base_cpi:4,basic:5,been:4,befor:[4,5,6],behavior:4,best:[2,4],best_fit:4,between:4,bin:6,binari:[2,4],bini:4,bool:4,bsd:[3,4],busi:4,cach:[2,4],calc_load:4,call:[4,6],callback:4,caus:4,cea:3,cecil:[2,3],certain:4,chang:[4,5],character:4,characterist:[0,5],check:[4,5],check_al:[4,5],cherami:3,cho:2,choic:0,chosen:[4,6],circul:3,cl_overhead:4,cla:[4,5],close:4,closest:6,cnr:3,code:[0,2,3,4,6],com:4,compat:[0,2],complet:[0,5],complic:3,compon:4,comput:[3,4,5],computation_tim:[4,5],computation_time_cycl:4,conclus:4,condit:[3,4],confer:2,config:5,configur:1,consequenti:4,consist:6,constructor:[4,5,6],contact:4,contain:[2,4],context:[2,5],contract:4,contributor:4,control:[0,4],convers:2,copi:3,copyright:[3,4],core:1,correct:[4,5],could:[0,5,6],count:[4,5],counterpart:3,coupl:4,cours:5,cpu:[4,5,6],creat:[0,1,4],create_job:4,cs_overhead:4,csdp:4,cur_dir:4,current:[2,4],custom:5,cxt:5,cxtload:4,cxtsave:4,cycl:4,cycles_per_m:[4,5],damag:4,data:[3,4],date:[0,4,6],davi:4,deadlin:[2,4,5,6],debian:0,decid:4,decis:[2,4],declar:4,decreas:2,decreasing_best_fit:4,decreasing_first_fit:4,decreasing_next_fit:4,decreasing_worst_fit:4,def:[5,6],defin:4,delai:4,delta_preempt:4,depend:[0,1],depth:3,detail:[1,4],develop:[2,3,6],dictionari:4,differ:[4,5],direct:4,directli:[4,5,6],discard:4,disclaim:4,discret:[2,3],distanc:4,distinct:4,distribut:[3,4],doc:4,done:[0,4,5,6],download:1,dpfair:2,drawn:3,durat:[4,5],dure:4,dvf:2,dynam:[2,4],each:[0,4,5,6],earli:2,earliest:[2,6],eas:6,easi:[2,4,6],easili:0,econom:3,edf:[1,2],edf_mono:6,edh:2,edzl:2,either:4,ekg:2,els:[5,6],emb:4,embed:[2,5],emberson:4,empti:5,enabl:3,encourag:3,end:4,end_dat:4,enough:4,ensur:3,epdf:2,equival:4,erickson:2,error:4,et_stddev:4,etc:[4,5],etm:4,euromicro:2,even:4,event:[2,3,4,5,6],everi:[4,5],everyth:2,evt:5,exactli:5,exampl:[1,4],exce:4,exceeded_deadlin:4,except:5,execut:[0,4,5,6],exemplari:4,experienc:3,experiment:5,expir:4,explain:6,express:4,extend:4,extern:0,extra:4,facil:4,fact:3,factori:4,fail:6,fair:2,fals:[4,6],fast:2,faster:4,few:[2,3,5],field:4,file:[0,1,4],fileexchang:4,filenam:[4,5],find:[2,6],finish:[4,6],fire:4,first:1,first_fit:4,fit:[2,4,6],fix:[2,4],flexibl:[2,5],follow:[2,3,4,5,6],followed_bi:4,form:4,four:6,free:[3,6],french:3,from:[0,1,2,4],full:6,fulli:0,funaoka:2,funk:2,gen_kato_util:4,gen_periods_discret:4,gen_periods_loguniform:4,gen_periods_uniform:4,gen_randfixedsum:4,gen_ripol:4,gen_taskset:4,gen_uunifastdiscard:4,generictask:4,get:[4,5],get_cl:4,get_hyperperiod:4,get_lock:4,get_observation_window:4,give:6,given:4,global:2,gnu:3,goe:4,good:[2,4,6],govern:3,gpl:[2,3],grant:3,graphic:[0,2,3],greater:4,group:[4,5],guarante:[4,6],had:3,handler:4,happen:5,have:[3,4,5],help:6,helper:4,here:[4,6],heurist:[2,4],highest:6,histori:5,holder:[3,4],how:[1,2],howev:[0,4],http:[3,4],hyperperiod:4,ident:6,identifi:[4,5],impact:2,implement:[0,4],impli:4,in_m:4,incident:4,includ:4,incomplet:0,index:1,indirect:4,indirectli:6,info:3,inform:[4,5],inherit:[4,6],init:[4,5,6],initi:[4,5],input:4,inria:3,instal:[0,1],instanc:4,instanti:[4,5,6],instead:4,interact:4,interfac:[0,2,3],intern:4,internal_id:4,interpret:4,interrupt:4,introduct:1,invers:4,invok:[4,6],is_act:4,is_run:4,itself:3,job:0,jobr:[4,5],juli:0,kato:[2,4],kei:[4,6],kept:6,kernel:4,know:5,knowledg:3,kwarg:4,laa:3,lambda:6,languag:3,largest:4,last:[2,6],late:2,law:3,laxiti:[2,4],least:[2,4,6],len:[5,6],lesser:3,levin:2,lgpl:3,liabil:[3,4],liabl:4,librairi:2,librari:[0,2,5],licens:[1,2],licensor:3,lieu:4,light:3,like:[2,6],limit:[3,4],linux:0,list:[0,4,6],list_activation_d:4,llf:2,llref:2,load:[1,3,4],lock:4,log:[4,5],logic:[4,6],loguniform:4,look:6,loss:4,low:2,lre:2,mac:0,mai:3,main:[1,2],mainli:4,major:4,make:4,mandatori:6,manipul:3,manual:5,materi:4,mathwork:4,matlabcentr:4,matrix:4,matter:4,max:4,max_:4,maxim:3,maximum:[2,4,5],mean:3,mechan:4,merchant:4,messag:[4,6],met:4,method:[4,5,6],metric:[4,5],migrat:4,migration_overhead:4,millisecond:4,min:[4,6],min_:4,minimalist:6,minimum:4,miss:6,mix:4,mllf:2,mode:[1,2],model:[0,1,2],modif:4,modifi:[2,3],modul:1,moment:4,monitor:[4,5],mono:6,monoton:2,more:[1,2,3,4],msg:4,much:2,multipl:2,multiprocessor:[2,3,4,6],must:[0,2,4,6],n_instr:4,name:[4,5,6],necessari:[2,6],need:[4,6],neglig:4,nelissen:2,next:[2,4],next_fit:4,non:4,none:[4,5,6],notic:4,now:4,now_m:4,nset:4,number:[4,5],numpi:2,nutshel:6,nvnlf:2,object:[3,4,5],observ:4,observation_window:4,occur:[4,6],offici:4,often:2,on_activ:[4,6],on_termin:[4,6],onc:4,one_shot:4,onli:[3,4,6],oop:6,open:2,optim:[2,4],order:[0,2,4,5,6],orient:3,origin:4,other:[2,4],otherwis:[0,4],our:6,out:4,outsid:4,overhead:[2,3,4,6],overhead_activ:4,overhead_termin:4,overrid:4,overriden:[4,6],p_edf:6,pack:[2,4],packag:0,packer:[4,6],page:1,pair:4,parent:4,partial:5,particular:[2,4],partit:[1,2,4],pass:[4,5,6],paul:4,pd2:2,per:[4,5],period:[2,4,5,6],permit:4,pfair:2,phase:4,pillai:2,place:4,platform:2,pleas:[0,4],point:[4,6],polici:[1,2,4],possibl:[0,2,4,5,6],power:2,precis:4,pred:4,preemption:[2,4,5],preemption_cost:4,preemption_count:5,present:3,pretti:6,prev:5,previou:[4,5],prid:2,print:[5,6],prior:4,priorit:6,prioriti:[2,6],probabl:4,problem:2,proc:4,proc_info:4,proc_info_list:4,proceed:2,process:[3,4],processorr:4,procev:5,procinfo:4,procur:4,profession:3,profil:4,profit:4,program:3,progress:4,propos:4,prototyp:2,provid:[0,2,3,4,5,6],pseudo:2,ptask:4,purpos:[3,4],put:4,pyqt4:2,python:[0,2,3,4,6],quick:2,rais:5,randfixedsum:4,random:4,randomli:4,rapitasystem:4,rate:2,reach:4,read:[3,4,5],readi:[4,6],ready_list:6,real:[2,3,4],realist:4,reason:6,redefin:4,redifin:6,redistribut:[3,4],reduc:2,reduct:2,regard:[3,4],regnier:2,rel:4,releas:[2,3,4],release_lock:4,reli:3,remain:4,remind:6,remov:[4,6],report:4,repres:4,reproduc:[3,4],requir:[2,3,4,5],resch:[4,6],reserv:[3,4],resourc:2,respect:[3,6],respons:[4,6],restrict:3,ret:4,retain:4,retriev:4,reus:3,right:[3,4],ripol:4,risk:3,robdavi:4,robert:4,roger:4,round_to_int:4,rule:3,run:[2,4,5,6],run_model:[4,5],same:[3,4,5],save:4,scale:2,schedul:1,scheduler_info:[4,5],schedulerinfo:[4,6],schedulerr:4,schema:0,scratch:1,script:[0,1],search:1,second:6,secur:3,see:[2,4],select:6,self:[4,6],semi:2,send:[0,6],servic:4,set:[0,2,4],set_observation_window:4,set_stack_fil:4,setup:2,shall:4,ship:0,shot:4,should:[2,4,6],show:6,sim:4,similar:4,simpi:2,simpl:[2,4],simplest:6,simplifi:4,simul:[1,2,3,4],simulation_fil:4,singl:[4,6],slack:4,softwar:[2,3,4],some:[2,5],someth:5,somewher:4,sort:4,souc:2,sourc:[0,2,3,4,6],space:[4,6],spare:4,special:4,specif:[3,4],specifi:[0,4],speed:[0,4],spent:4,sporadictask:4,stack:4,stack_fil:4,stafford:4,staffordrandfixedsum:4,start:[4,6],start_dat:4,statist:2,statu:3,step:1,still:[4,6],stop:4,store:4,str:5,strict:4,structur:6,subclass:[4,6],substitut:4,success:3,suffer:4,suitabl:3,sure:6,take:[2,4],target_util:4,task_info:4,task_info_list:4,task_list:[4,6],task_migr:4,task_typ:4,taskinfo:4,taskr:[4,5],tasks_ev:4,taskset:4,techniqu:2,temporarli:4,term:3,termin:4,test:[2,3,4],text:2,than:4,thei:6,them:6,theori:4,therefor:3,thi:[0,2,3,4,5,6],thing:6,those:4,though:0,through:[2,4,5,6],time:[0,2,3,4,5],too:4,tool:4,tort:4,total:4,tovar:2,truncat:4,tupl:4,tutori:[5,6],type:[2,4],typic:4,u_i:4,ubuntu:0,umax:4,umin:4,under:[2,3,4],understand:2,unfair:2,uniprocessor:[1,2,4],uniqu:4,unit:4,updat:[2,6],upon:4,url:3,user:[0,2,3],usual:[4,6],util:1,utilis:4,uunifast:4,valu:[4,5],variou:4,veri:[2,4,5,6],version:[2,3],via:2,view:4,virtual:4,voltag:2,wai:[2,4,6],wait:4,warn:4,warranti:[3,4],wcet:[4,5,6],websit:2,what:1,when:[2,4,5,6],where:[4,5,6],whether:4,which:[4,6],whole:4,whose:3,wide:[4,5],window:[0,4],without:[4,5],worst:[2,4],worst_fit:4,wrap:2,write:[1,2,4],written:0,www:[3,4],xml:0,xsd:0,yang:2,yet:6,yield:4,york:4,your:0,zero:2,zhu:2},titles:["Frequently Asked Questions","SimSo documentation","Introduction","Licenses","Main modules","Using SimSo in script mode","How to write a scheduling policy"],titleterms:{ask:0,avail:2,can:0,complet:6,configur:[4,5],content:[4,5,6],core:4,creat:5,creation:6,defin:6,depend:[2,3],detail:5,document:1,doe:0,download:2,edf:6,exampl:[5,6],explan:6,file:[5,6],first:[2,5],frequent:0,from:5,gener:[0,4],handl:0,heterogen:0,how:6,implement:6,indic:1,initi:6,instal:2,introduct:2,job:4,licens:3,load:5,logger:4,main:4,mode:5,model:[4,5],modul:4,more:5,numpi:3,oper:0,own:0,pack:6,partit:6,partitionedschedul:4,polici:6,processor:[0,4],pyqt:3,question:0,result:4,schedul:[2,4,6],scratch:5,script:5,simpi:3,simso:[0,1,2,3,4,5],simul:5,skeleton:6,sporad:0,step:2,support:0,system:0,tabl:[1,4,5,6],task:[0,4],timer:4,uniform:0,uniprocessor:6,util:4,what:2,work:0,write:6,you:0}})
\ No newline at end of file \ No newline at end of file
...@@ -27,8 +27,8 @@ ...@@ -27,8 +27,8 @@
<link rel="next" title="Main modules" href="modules.html" /> <link rel="next" title="Main modules" href="modules.html" />
<link rel="prev" title="How to write a scheduling policy" href="write_scheduler.html" /> <link rel="prev" title="How to write a scheduling policy" href="write_scheduler.html" />
</head> </head>
<body> <body role="document">
<div class="related"> <div class="related" role="navigation" aria-label="related navigation">
<h3>Navigation</h3> <h3>Navigation</h3>
<ul> <ul>
<li class="right" style="margin-right: 10px"> <li class="right" style="margin-right: 10px">
...@@ -43,13 +43,13 @@ ...@@ -43,13 +43,13 @@
<li class="right" > <li class="right" >
<a href="write_scheduler.html" title="How to write a scheduling policy" <a href="write_scheduler.html" title="How to write a scheduling policy"
accesskey="P">previous</a> |</li> accesskey="P">previous</a> |</li>
<li><a href="index.html">SimSo documentation</a> &raquo;</li> <li class="nav-item nav-item-0"><a href="index.html">SimSo documentation</a> &raquo;</li>
</ul> </ul>
</div> </div>
<div class="document"> <div class="document">
<div class="documentwrapper"> <div class="documentwrapper">
<div class="body"> <div class="body" role="main">
<div class="section" id="using-simso-in-script-mode"> <div class="section" id="using-simso-in-script-mode">
<h1><a class="toc-backref" href="#id1">Using SimSo in script mode</a><a class="headerlink" href="#using-simso-in-script-mode" title="Permalink to this headline"></a></h1> <h1><a class="toc-backref" href="#id1">Using SimSo in script mode</a><a class="headerlink" href="#using-simso-in-script-mode" title="Permalink to this headline"></a></h1>
...@@ -69,11 +69,11 @@ ...@@ -69,11 +69,11 @@
</div> </div>
<div class="section" id="loading-a-configuration-using-a-simulation-file"> <div class="section" id="loading-a-configuration-using-a-simulation-file">
<h2><a class="toc-backref" href="#id2">Loading a configuration using a simulation file</a><a class="headerlink" href="#loading-a-configuration-using-a-simulation-file" title="Permalink to this headline"></a></h2> <h2><a class="toc-backref" href="#id2">Loading a configuration using a simulation file</a><a class="headerlink" href="#loading-a-configuration-using-a-simulation-file" title="Permalink to this headline"></a></h2>
<p>A <a class="reference internal" href="modules.html#module-simso.configuration.Configuration" title="simso.configuration.Configuration"><tt class="xref py py-class docutils literal"><span class="pre">Configuration</span></tt></a> can be initialized with a file passed to its constructor:</p> <p>A <a class="reference internal" href="modules.html#module-simso.configuration.Configuration" title="simso.configuration.Configuration"><code class="xref py py-class docutils literal"><span class="pre">Configuration</span></code></a> can be initialized with a file passed to its constructor:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">configuration</span> <span class="o">=</span> <span class="n">Configuration</span><span class="p">(</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span> <div class="highlight-python"><div class="highlight"><pre><span class="n">configuration</span> <span class="o">=</span> <span class="n">Configuration</span><span class="p">(</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
</pre></div> </pre></div>
</div> </div>
<p>The configuration could also be partial and completed by the script. Finally, the configuration can be checked for correctness using the <tt class="xref py py-meth docutils literal"><span class="pre">check_all</span></tt> method:</p> <p>The configuration could also be partial and completed by the script. Finally, the configuration can be checked for correctness using the <code class="xref py py-meth docutils literal"><span class="pre">check_all</span></code> method:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">configuration</span><span class="o">.</span><span class="n">check_all</span><span class="p">()</span> <div class="highlight-python"><div class="highlight"><pre><span class="n">configuration</span><span class="o">.</span><span class="n">check_all</span><span class="p">()</span>
</pre></div> </pre></div>
</div> </div>
...@@ -81,7 +81,7 @@ ...@@ -81,7 +81,7 @@
</div> </div>
<div class="section" id="creating-a-configuration-from-scratch"> <div class="section" id="creating-a-configuration-from-scratch">
<h2><a class="toc-backref" href="#id3">Creating a configuration from scratch</a><a class="headerlink" href="#creating-a-configuration-from-scratch" title="Permalink to this headline"></a></h2> <h2><a class="toc-backref" href="#id3">Creating a configuration from scratch</a><a class="headerlink" href="#creating-a-configuration-from-scratch" title="Permalink to this headline"></a></h2>
<p>It is also possible to create a new configuration from an empty configuration. This is done by instantiating a <a class="reference internal" href="modules.html#module-simso.configuration.Configuration" title="simso.configuration.Configuration"><tt class="xref py py-class docutils literal"><span class="pre">Configuration</span></tt></a> object without argument. Then, its attributes can be changed:</p> <p>It is also possible to create a new configuration from an empty configuration. This is done by instantiating a <a class="reference internal" href="modules.html#module-simso.configuration.Configuration" title="simso.configuration.Configuration"><code class="xref py py-class docutils literal"><span class="pre">Configuration</span></code></a> object without argument. Then, its attributes can be changed:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">configuration</span> <span class="o">=</span> <span class="n">Configuration</span><span class="p">()</span> <div class="highlight-python"><div class="highlight"><pre><span class="n">configuration</span> <span class="o">=</span> <span class="n">Configuration</span><span class="p">()</span>
<span class="n">configuration</span><span class="o">.</span><span class="n">duration</span> <span class="o">=</span> <span class="mi">100</span> <span class="o">*</span> <span class="n">configuration</span><span class="o">.</span><span class="n">cycles_per_ms</span> <span class="n">configuration</span><span class="o">.</span><span class="n">duration</span> <span class="o">=</span> <span class="mi">100</span> <span class="o">*</span> <span class="n">configuration</span><span class="o">.</span><span class="n">cycles_per_ms</span>
...@@ -107,15 +107,15 @@ ...@@ -107,15 +107,15 @@
</div> </div>
<div class="section" id="creating-the-model"> <div class="section" id="creating-the-model">
<h2><a class="toc-backref" href="#id4">Creating the Model</a><a class="headerlink" href="#creating-the-model" title="Permalink to this headline"></a></h2> <h2><a class="toc-backref" href="#id4">Creating the Model</a><a class="headerlink" href="#creating-the-model" title="Permalink to this headline"></a></h2>
<p>A <a class="reference internal" href="modules.html#module-simso.configuration.Configuration" title="simso.configuration.Configuration"><tt class="xref py py-class docutils literal"><span class="pre">configuration</span></tt></a> is an object grouping every characteristics of the system (tasks, processors, schedulers, etc). Such a configuration can be passed to the <a class="reference internal" href="modules.html#simso.core.Model.Model" title="simso.core.Model.Model"><tt class="xref py py-class docutils literal"><span class="pre">Model</span></tt></a> constructor in order to create the simulation:</p> <p>A <a class="reference internal" href="modules.html#module-simso.configuration.Configuration" title="simso.configuration.Configuration"><code class="xref py py-class docutils literal"><span class="pre">configuration</span></code></a> is an object grouping every characteristics of the system (tasks, processors, schedulers, etc). Such a configuration can be passed to the <a class="reference internal" href="modules.html#simso.core.Model.Model" title="simso.core.Model.Model"><code class="xref py py-class docutils literal"><span class="pre">Model</span></code></a> constructor in order to create the simulation:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">model</span> <span class="o">=</span> <span class="n">Model</span><span class="p">(</span><span class="n">configuration</span><span class="p">)</span> <div class="highlight-python"><div class="highlight"><pre><span class="n">model</span> <span class="o">=</span> <span class="n">Model</span><span class="p">(</span><span class="n">configuration</span><span class="p">)</span>
</pre></div> </pre></div>
</div> </div>
<p>And the simulation can be run with the <a class="reference internal" href="modules.html#simso.core.Model.Model.run_model" title="simso.core.Model.Model.run_model"><tt class="xref py py-meth docutils literal"><span class="pre">run_model</span></tt></a> method:</p> <p>And the simulation can be run with the <a class="reference internal" href="modules.html#simso.core.Model.Model.run_model" title="simso.core.Model.Model.run_model"><code class="xref py py-meth docutils literal"><span class="pre">run_model</span></code></a> method:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">model</span><span class="o">.</span><span class="n">run_model</span><span class="p">()</span> <div class="highlight-python"><div class="highlight"><pre><span class="n">model</span><span class="o">.</span><span class="n">run_model</span><span class="p">()</span>
</pre></div> </pre></div>
</div> </div>
<p>Some basic logs can be get through the <a class="reference internal" href="modules.html#simso.core.Model.Model.logs" title="simso.core.Model.Model.logs"><tt class="xref py py-meth docutils literal"><span class="pre">logs</span></tt></a> attribute:</p> <p>Some basic logs can be get through the <a class="reference internal" href="modules.html#simso.core.Model.Model.logs" title="simso.core.Model.Model.logs"><code class="xref py py-meth docutils literal"><span class="pre">logs</span></code></a> attribute:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="k">for</span> <span class="n">log</span> <span class="ow">in</span> <span class="n">model</span><span class="o">.</span><span class="n">logs</span><span class="p">:</span> <div class="highlight-python"><div class="highlight"><pre><span class="k">for</span> <span class="n">log</span> <span class="ow">in</span> <span class="n">model</span><span class="o">.</span><span class="n">logs</span><span class="p">:</span>
<span class="k">print</span><span class="p">(</span><span class="n">log</span><span class="p">)</span> <span class="k">print</span><span class="p">(</span><span class="n">log</span><span class="p">)</span>
</pre></div> </pre></div>
...@@ -173,7 +173,7 @@ ...@@ -173,7 +173,7 @@
</div> </div>
<div class="section" id="more-details"> <div class="section" id="more-details">
<h2><a class="toc-backref" href="#id6">More details</a><a class="headerlink" href="#more-details" title="Permalink to this headline"></a></h2> <h2><a class="toc-backref" href="#id6">More details</a><a class="headerlink" href="#more-details" title="Permalink to this headline"></a></h2>
<p>It is possible to get more information from the tasks using <a class="reference internal" href="modules.html#simso.core.results.Results" title="simso.core.results.Results"><tt class="xref py py-class docutils literal"><span class="pre">Results</span></tt></a> class. For example we could get the computation time of the jobs:</p> <p>It is possible to get more information from the tasks using <a class="reference internal" href="modules.html#simso.core.results.Results" title="simso.core.results.Results"><code class="xref py py-class docutils literal"><span class="pre">Results</span></code></a> class. For example we could get the computation time of the jobs:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="k">for</span> <span class="n">task</span> <span class="ow">in</span> <span class="n">model</span><span class="o">.</span><span class="n">results</span><span class="o">.</span><span class="n">tasks</span><span class="p">:</span> <div class="highlight-python"><div class="highlight"><pre><span class="k">for</span> <span class="n">task</span> <span class="ow">in</span> <span class="n">model</span><span class="o">.</span><span class="n">results</span><span class="o">.</span><span class="n">tasks</span><span class="p">:</span>
<span class="k">print</span><span class="p">(</span><span class="n">task</span><span class="o">.</span><span class="n">name</span> <span class="o">+</span> <span class="s">&quot;:&quot;</span><span class="p">)</span> <span class="k">print</span><span class="p">(</span><span class="n">task</span><span class="o">.</span><span class="n">name</span> <span class="o">+</span> <span class="s">&quot;:&quot;</span><span class="p">)</span>
<span class="k">for</span> <span class="n">job</span> <span class="ow">in</span> <span class="n">task</span><span class="o">.</span><span class="n">jobs</span><span class="p">:</span> <span class="k">for</span> <span class="n">job</span> <span class="ow">in</span> <span class="n">task</span><span class="o">.</span><span class="n">jobs</span><span class="p">:</span>
...@@ -181,20 +181,20 @@ ...@@ -181,20 +181,20 @@
</pre></div> </pre></div>
</div> </div>
<p>Or the number of preemptions per task:</p> <p>Or the number of preemptions per task:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="k">for</span> <span class="n">task</span> <span class="ow">in</span> <span class="n">model</span><span class="o">.</span><span class="n">results</span><span class="o">.</span><span class="n">task_list</span><span class="p">:</span> <div class="highlight-python"><div class="highlight"><pre><span class="k">for</span> <span class="n">task</span> <span class="ow">in</span> <span class="n">model</span><span class="o">.</span><span class="n">results</span><span class="o">.</span><span class="n">tasks</span><span class="o">.</span><span class="n">values</span><span class="p">():</span>
<span class="k">print</span><span class="p">(</span><span class="s">&quot;</span><span class="si">%s</span><span class="s"> </span><span class="si">%d</span><span class="s">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">task</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="nb">sum</span><span class="p">([</span><span class="n">job</span><span class="o">.</span><span class="n">preemption_count</span> <span class="k">for</span> <span class="n">job</span> <span class="ow">in</span> <span class="n">task</span><span class="o">.</span><span class="n">jobs</span><span class="p">])))</span> <span class="k">print</span><span class="p">(</span><span class="s">&quot;</span><span class="si">%s</span><span class="s"> </span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">task</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">task</span><span class="o">.</span><span class="n">preemption_count</span><span class="p">))</span>
</pre></div> </pre></div>
</div> </div>
<p>You can get all the metrics provided in the <a class="reference internal" href="modules.html#simso.core.results.TaskR" title="simso.core.results.TaskR"><tt class="xref py py-class docutils literal"><span class="pre">TaskR</span></tt></a> and <a class="reference internal" href="modules.html#simso.core.results.JobR" title="simso.core.results.JobR"><tt class="xref py py-class docutils literal"><span class="pre">JobR</span></tt></a> objects. Read the documentation of these classes to know exactly what is directly accessible.</p> <p>You can get all the metrics provided in the <a class="reference internal" href="modules.html#simso.core.results.TaskR" title="simso.core.results.TaskR"><code class="xref py py-class docutils literal"><span class="pre">TaskR</span></code></a> and <a class="reference internal" href="modules.html#simso.core.results.JobR" title="simso.core.results.JobR"><code class="xref py py-class docutils literal"><span class="pre">JobR</span></code></a> objects. Read the documentation of these classes to know exactly what is directly accessible.</p>
<p>It is also possible to get the monitor object from each processors. This is a very detail history of the system. For example, you can count the number of context switches, where a context switch is something that happen when the previous task running on the same processor is different:</p> <p>It is also possible to get the monitor object from each processors. This is a very detail history of the system. For example, you can count the number of context switches, where a context switch is something that happen when the previous task running on the same processor is different:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">cxt</span> <span class="o">=</span> <span class="mi">0</span> <div class="highlight-python"><div class="highlight"><pre><span class="n">cxt</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">for</span> <span class="n">processor</span> <span class="ow">in</span> <span class="n">model</span><span class="o">.</span><span class="n">processors</span><span class="p">:</span> <span class="k">for</span> <span class="n">processor</span> <span class="ow">in</span> <span class="n">model</span><span class="o">.</span><span class="n">processors</span><span class="p">:</span>
<span class="n">prev</span> <span class="o">=</span> <span class="bp">None</span> <span class="n">prev</span> <span class="o">=</span> <span class="bp">None</span>
<span class="k">for</span> <span class="n">evt</span> <span class="ow">in</span> <span class="n">processor</span><span class="o">.</span><span class="n">monitor</span><span class="p">:</span> <span class="k">for</span> <span class="n">evt</span> <span class="ow">in</span> <span class="n">processor</span><span class="o">.</span><span class="n">monitor</span><span class="p">:</span>
<span class="k">if</span> <span class="n">evt</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">event</span> <span class="o">==</span> <span class="n">ProcEvent</span><span class="o">.</span><span class="n">RUN</span><span class="p">:</span> <span class="k">if</span> <span class="n">evt</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">event</span> <span class="o">==</span> <span class="n">ProcEvent</span><span class="o">.</span><span class="n">RUN</span><span class="p">:</span>
<span class="k">if</span> <span class="n">prev</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span> <span class="ow">and</span> <span class="n">prev</span> <span class="o">!=</span> <span class="n">evt</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">identifier</span><span class="p">:</span> <span class="k">if</span> <span class="n">prev</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span> <span class="ow">and</span> <span class="n">prev</span> <span class="o">!=</span> <span class="n">evt</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">task</span><span class="p">:</span>
<span class="n">cxt</span> <span class="o">+=</span> <span class="mi">1</span> <span class="n">cxt</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="n">prev</span> <span class="o">=</span> <span class="n">evt</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">identifier</span> <span class="n">prev</span> <span class="o">=</span> <span class="n">evt</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">task</span>
<span class="k">print</span><span class="p">(</span><span class="s">&quot;Number of context switches (without counting the OS): &quot;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">cxt</span><span class="p">))</span> <span class="k">print</span><span class="p">(</span><span class="s">&quot;Number of context switches (without counting the OS): &quot;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">cxt</span><span class="p">))</span>
</pre></div> </pre></div>
...@@ -207,7 +207,7 @@ ...@@ -207,7 +207,7 @@
</div> </div>
<div class="clearer"></div> <div class="clearer"></div>
</div> </div>
<div class="related"> <div class="related" role="navigation" aria-label="related navigation">
<h3>Navigation</h3> <h3>Navigation</h3>
<ul> <ul>
<li class="right" style="margin-right: 10px"> <li class="right" style="margin-right: 10px">
...@@ -222,10 +222,10 @@ ...@@ -222,10 +222,10 @@
<li class="right" > <li class="right" >
<a href="write_scheduler.html" title="How to write a scheduling policy" <a href="write_scheduler.html" title="How to write a scheduling policy"
>previous</a> |</li> >previous</a> |</li>
<li><a href="index.html">SimSo documentation</a> &raquo;</li> <li class="nav-item nav-item-0"><a href="index.html">SimSo documentation</a> &raquo;</li>
</ul> </ul>
</div> </div>
<div class="footer"> <div class="footer" role="contentinfo">
</div> </div>
</body> </body>
</html> </html>
\ No newline at end of file
...@@ -27,8 +27,8 @@ ...@@ -27,8 +27,8 @@
<link rel="next" title="Using SimSo in script mode" href="text_mode.html" /> <link rel="next" title="Using SimSo in script mode" href="text_mode.html" />
<link rel="prev" title="Frequently Asked Questions" href="faq.html" /> <link rel="prev" title="Frequently Asked Questions" href="faq.html" />
</head> </head>
<body> <body role="document">
<div class="related"> <div class="related" role="navigation" aria-label="related navigation">
<h3>Navigation</h3> <h3>Navigation</h3>
<ul> <ul>
<li class="right" style="margin-right: 10px"> <li class="right" style="margin-right: 10px">
...@@ -43,13 +43,13 @@ ...@@ -43,13 +43,13 @@
<li class="right" > <li class="right" >
<a href="faq.html" title="Frequently Asked Questions" <a href="faq.html" title="Frequently Asked Questions"
accesskey="P">previous</a> |</li> accesskey="P">previous</a> |</li>
<li><a href="index.html">SimSo documentation</a> &raquo;</li> <li class="nav-item nav-item-0"><a href="index.html">SimSo documentation</a> &raquo;</li>
</ul> </ul>
</div> </div>
<div class="document"> <div class="document">
<div class="documentwrapper"> <div class="documentwrapper">
<div class="body"> <div class="body" role="main">
<div class="section" id="how-to-write-a-scheduling-policy"> <div class="section" id="how-to-write-a-scheduling-policy">
<h1><a class="toc-backref" href="#id1">How to write a scheduling policy</a><a class="headerlink" href="#how-to-write-a-scheduling-policy" title="Permalink to this headline"></a></h1> <h1><a class="toc-backref" href="#id1">How to write a scheduling policy</a><a class="headerlink" href="#how-to-write-a-scheduling-policy" title="Permalink to this headline"></a></h1>
...@@ -79,7 +79,7 @@ ...@@ -79,7 +79,7 @@
<p>This example shows how to write an Earliest Deadline First scheduler for a single processor. As a reminder, the Earliest Deadline First prioritizes the tasks with the closest absolute deadline among all the ready tasks. A task is ready when it is activated and not finished.</p> <p>This example shows how to write an Earliest Deadline First scheduler for a single processor. As a reminder, the Earliest Deadline First prioritizes the tasks with the closest absolute deadline among all the ready tasks. A task is ready when it is activated and not finished.</p>
<div class="section" id="creation-of-the-file"> <div class="section" id="creation-of-the-file">
<h3><a class="toc-backref" href="#id3">Creation of the file</a><a class="headerlink" href="#creation-of-the-file" title="Permalink to this headline"></a></h3> <h3><a class="toc-backref" href="#id3">Creation of the file</a><a class="headerlink" href="#creation-of-the-file" title="Permalink to this headline"></a></h3>
<p>A scheduler for SimSo is a Python class that inherits from the <a class="reference internal" href="modules.html#module-simso.core.Scheduler" title="simso.core.Scheduler"><tt class="xref py py-class docutils literal"><span class="pre">simso.core.Scheduler</span></tt></a> class. The first step is to write the skeleton of our scheduler. Create a file named &#8220;EDF_mono.py&#8221; and write the following code:</p> <p>A scheduler for SimSo is a Python class that inherits from the <a class="reference internal" href="modules.html#module-simso.core.Scheduler" title="simso.core.Scheduler"><code class="xref py py-class docutils literal"><span class="pre">simso.core.Scheduler</span></code></a> class. The first step is to write the skeleton of our scheduler. Create a file named &#8220;EDF_mono.py&#8221; and write the following code:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="kn">from</span> <span class="nn">simso.core</span> <span class="kn">import</span> <span class="n">Scheduler</span> <div class="highlight-python"><div class="highlight"><pre><span class="kn">from</span> <span class="nn">simso.core</span> <span class="kn">import</span> <span class="n">Scheduler</span>
<span class="k">class</span> <span class="nc">EDF_mono</span><span class="p">(</span><span class="n">Scheduler</span><span class="p">):</span> <span class="k">class</span> <span class="nc">EDF_mono</span><span class="p">(</span><span class="n">Scheduler</span><span class="p">):</span>
...@@ -100,13 +100,13 @@ ...@@ -100,13 +100,13 @@
</div> </div>
<div class="section" id="explanation-of-the-skeleton"> <div class="section" id="explanation-of-the-skeleton">
<h3><a class="toc-backref" href="#id4">Explanation of the skeleton</a><a class="headerlink" href="#explanation-of-the-skeleton" title="Permalink to this headline"></a></h3> <h3><a class="toc-backref" href="#id4">Explanation of the skeleton</a><a class="headerlink" href="#explanation-of-the-skeleton" title="Permalink to this headline"></a></h3>
<p>The first thing done here is importing the <a class="reference internal" href="modules.html#module-simso.core.Scheduler" title="simso.core.Scheduler"><tt class="xref py py-class docutils literal"><span class="pre">Scheduler</span></tt></a> class. Then we define the <cite>EDF_mono</cite> class as a subclass of the <cite>Scheduler</cite>.</p> <p>The first thing done here is importing the <a class="reference internal" href="modules.html#module-simso.core.Scheduler" title="simso.core.Scheduler"><code class="xref py py-class docutils literal"><span class="pre">Scheduler</span></code></a> class. Then we define the <cite>EDF_mono</cite> class as a subclass of the <cite>Scheduler</cite>.</p>
<p>Four methods are redifined:</p> <p>Four methods are redifined:</p>
<ul class="simple"> <ul class="simple">
<li>The <a class="reference internal" href="modules.html#simso.core.Scheduler.Scheduler.init" title="simso.core.Scheduler.Scheduler.init"><tt class="xref py py-meth docutils literal"><span class="pre">init</span></tt></a> method is called when the simulation is ready to start, this is where the structures used by the scheduler should be initialized. The usual Python constructor is not guaranteed to be called before each simulation run and the <a class="reference internal" href="modules.html#simso.core.Task.Task" title="simso.core.Task.Task"><tt class="xref py py-class docutils literal"><span class="pre">Task</span></tt></a> and <a class="reference internal" href="modules.html#simso.core.Processor.Processor" title="simso.core.Processor.Processor"><tt class="xref py py-class docutils literal"><span class="pre">Processors</span></tt></a> are not instantiated yet when the scheduler is created.</li> <li>The <a class="reference internal" href="modules.html#simso.core.Scheduler.Scheduler.init" title="simso.core.Scheduler.Scheduler.init"><code class="xref py py-meth docutils literal"><span class="pre">init</span></code></a> method is called when the simulation is ready to start, this is where the structures used by the scheduler should be initialized. The usual Python constructor is not guaranteed to be called before each simulation run and the <a class="reference internal" href="modules.html#simso.core.Task.Task" title="simso.core.Task.Task"><code class="xref py py-class docutils literal"><span class="pre">Task</span></code></a> and <a class="reference internal" href="modules.html#simso.core.Processor.Processor" title="simso.core.Processor.Processor"><code class="xref py py-class docutils literal"><span class="pre">Processors</span></code></a> are not instantiated yet when the scheduler is created.</li>
<li>The <a class="reference internal" href="modules.html#simso.core.Scheduler.Scheduler.on_activate" title="simso.core.Scheduler.Scheduler.on_activate"><tt class="xref py py-meth docutils literal"><span class="pre">on_activate</span></tt></a> method is called on task activations.</li> <li>The <a class="reference internal" href="modules.html#simso.core.Scheduler.Scheduler.on_activate" title="simso.core.Scheduler.Scheduler.on_activate"><code class="xref py py-meth docutils literal"><span class="pre">on_activate</span></code></a> method is called on task activations.</li>
<li>The <a class="reference internal" href="modules.html#simso.core.Scheduler.Scheduler.on_terminated" title="simso.core.Scheduler.Scheduler.on_terminated"><tt class="xref py py-meth docutils literal"><span class="pre">on_terminated</span></tt></a> method is called when a job finished its execution.</li> <li>The <a class="reference internal" href="modules.html#simso.core.Scheduler.Scheduler.on_terminated" title="simso.core.Scheduler.Scheduler.on_terminated"><code class="xref py py-meth docutils literal"><span class="pre">on_terminated</span></code></a> method is called when a job finished its execution.</li>
<li>The <a class="reference internal" href="modules.html#simso.core.Scheduler.Scheduler.schedule" title="simso.core.Scheduler.Scheduler.schedule"><tt class="xref py py-meth docutils literal"><span class="pre">schedule</span></tt></a> method is called by the processor when it needs to run the scheduler. This method should not be called directly.</li> <li>The <a class="reference internal" href="modules.html#simso.core.Scheduler.Scheduler.schedule" title="simso.core.Scheduler.Scheduler.schedule"><code class="xref py py-meth docutils literal"><span class="pre">schedule</span></code></a> method is called by the processor when it needs to run the scheduler. This method should not be called directly.</li>
</ul> </ul>
</div> </div>
<div class="section" id="implementation"> <div class="section" id="implementation">
...@@ -140,8 +140,8 @@ ...@@ -140,8 +140,8 @@
<span class="k">return</span> <span class="p">(</span><span class="n">job</span><span class="p">,</span> <span class="n">cpu</span><span class="p">)</span> <span class="k">return</span> <span class="p">(</span><span class="n">job</span><span class="p">,</span> <span class="n">cpu</span><span class="p">)</span>
</pre></div> </pre></div>
</div> </div>
<p>At this point, we are still missing a very important thing: calling the scheduler! This is not done by invoking the <cite>schedule</cite> method. As a reminder, that&#8217;s the processor which is responsible to call the <cite>scheduler</cite>. The reason is that if an overhead must be applied, it is done on the processor running the scheduler. The good way to call the scheduler is by sending a message to the processor using the <a class="reference internal" href="modules.html#simso.core.Processor.Processor.resched" title="simso.core.Processor.Processor.resched"><tt class="xref py py-meth docutils literal"><span class="pre">resched</span></tt></a> method.</p> <p>At this point, we are still missing a very important thing: calling the scheduler! This is not done by invoking the <cite>schedule</cite> method. As a reminder, that&#8217;s the processor which is responsible to call the <cite>scheduler</cite>. The reason is that if an overhead must be applied, it is done on the processor running the scheduler. The good way to call the scheduler is by sending a message to the processor using the <a class="reference internal" href="modules.html#simso.core.Processor.Processor.resched" title="simso.core.Processor.Processor.resched"><code class="xref py py-meth docutils literal"><span class="pre">resched</span></code></a> method.</p>
<p>Any job is affected to a processor. This is the last processor on which the task was running or an arbitrary processor on the first execution. The scheduler can be called indirectly using <tt class="docutils literal"><span class="pre">job.cpu.resched()</span></tt> when a scheduling event occurs. We could also use <tt class="docutils literal"><span class="pre">self.processors[0].resched</span></tt> to run the scheduler on the first (and only) processor of the system.</p> <p>Any job is affected to a processor. This is the last processor on which the task was running or an arbitrary processor on the first execution. The scheduler can be called indirectly using <code class="docutils literal"><span class="pre">job.cpu.resched()</span></code> when a scheduling event occurs. We could also use <code class="docutils literal"><span class="pre">self.processors[0].resched</span></code> to run the scheduler on the first (and only) processor of the system.</p>
<p>This is the full code:</p> <p>This is the full code:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="kn">from</span> <span class="nn">simso.core</span> <span class="kn">import</span> <span class="n">Scheduler</span> <div class="highlight-python"><div class="highlight"><pre><span class="kn">from</span> <span class="nn">simso.core</span> <span class="kn">import</span> <span class="n">Scheduler</span>
...@@ -173,10 +173,10 @@ ...@@ -173,10 +173,10 @@
<div class="section" id="example-2-partitionned-edf"> <div class="section" id="example-2-partitionned-edf">
<h2><a class="toc-backref" href="#id6">Example 2: Partitionned EDF</a><a class="headerlink" href="#example-2-partitionned-edf" title="Permalink to this headline"></a></h2> <h2><a class="toc-backref" href="#id6">Example 2: Partitionned EDF</a><a class="headerlink" href="#example-2-partitionned-edf" title="Permalink to this headline"></a></h2>
<p>The simplest method to handle multiprocessor architectures is to use partitionning. This approach consists in allocating the tasks to the processors and executing a mono-processor scheduler on each processor.</p> <p>The simplest method to handle multiprocessor architectures is to use partitionning. This approach consists in allocating the tasks to the processors and executing a mono-processor scheduler on each processor.</p>
<p>In order to ease the work for the developer of a scheduler, an helping class, named <a class="reference internal" href="modules.html#module-simso.utils.PartitionedScheduler" title="simso.utils.PartitionedScheduler"><tt class="xref py py-class docutils literal"><span class="pre">PartitionedScheduler</span></tt></a>, is provided.</p> <p>In order to ease the work for the developer of a scheduler, an helping class, named <a class="reference internal" href="modules.html#module-simso.utils.PartitionedScheduler" title="simso.utils.PartitionedScheduler"><code class="xref py py-class docutils literal"><span class="pre">PartitionedScheduler</span></code></a>, is provided.</p>
<div class="section" id="initializing-the-scheduler"> <div class="section" id="initializing-the-scheduler">
<h3><a class="toc-backref" href="#id7">Initializing the scheduler</a><a class="headerlink" href="#initializing-the-scheduler" title="Permalink to this headline"></a></h3> <h3><a class="toc-backref" href="#id7">Initializing the scheduler</a><a class="headerlink" href="#initializing-the-scheduler" title="Permalink to this headline"></a></h3>
<p>The <a class="reference internal" href="modules.html#module-simso.utils.PartitionedScheduler" title="simso.utils.PartitionedScheduler"><tt class="xref py py-class docutils literal"><span class="pre">PartitionedScheduler</span></tt></a> is defined in the <cite>simso.utils</cite> module. It is also necessary to load the <a class="reference internal" href="modules.html#simso.core.Scheduler.SchedulerInfo" title="simso.core.Scheduler.SchedulerInfo"><tt class="xref py py-class docutils literal"><span class="pre">SchedulerInfo</span></tt></a> class in order to give to the <cite>PartitionedScheduler &lt;simso.utils.PartitionedScheduler&gt;</cite> the mono-processor scheduler to use. The first thing to do is importing these classes:</p> <p>The <a class="reference internal" href="modules.html#module-simso.utils.PartitionedScheduler" title="simso.utils.PartitionedScheduler"><code class="xref py py-class docutils literal"><span class="pre">PartitionedScheduler</span></code></a> is defined in the <cite>simso.utils</cite> module. It is also necessary to load the <a class="reference internal" href="modules.html#simso.core.Scheduler.SchedulerInfo" title="simso.core.Scheduler.SchedulerInfo"><code class="xref py py-class docutils literal"><span class="pre">SchedulerInfo</span></code></a> class in order to give to the <cite>PartitionedScheduler &lt;simso.utils.PartitionedScheduler&gt;</cite> the mono-processor scheduler to use. The first thing to do is importing these classes:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="kn">from</span> <span class="nn">simso.utils</span> <span class="kn">import</span> <span class="n">PartitionedScheduler</span> <div class="highlight-python"><div class="highlight"><pre><span class="kn">from</span> <span class="nn">simso.utils</span> <span class="kn">import</span> <span class="n">PartitionedScheduler</span>
<span class="kn">from</span> <span class="nn">simso.core.Scheduler</span> <span class="kn">import</span> <span class="n">SchedulerInfo</span> <span class="kn">from</span> <span class="nn">simso.core.Scheduler</span> <span class="kn">import</span> <span class="n">SchedulerInfo</span>
</pre></div> </pre></div>
...@@ -190,7 +190,7 @@ ...@@ -190,7 +190,7 @@
</div> </div>
<div class="section" id="defining-the-packing"> <div class="section" id="defining-the-packing">
<h3><a class="toc-backref" href="#id8">Defining the packing</a><a class="headerlink" href="#defining-the-packing" title="Permalink to this headline"></a></h3> <h3><a class="toc-backref" href="#id8">Defining the packing</a><a class="headerlink" href="#defining-the-packing" title="Permalink to this headline"></a></h3>
<p>A First-Fit bin-packing can be used to affect the tasks to the processors. For that, the <tt class="xref py py-meth docutils literal"><span class="pre">packer()</span></tt> must be overriden:</p> <p>A First-Fit bin-packing can be used to affect the tasks to the processors. For that, the <code class="xref py py-meth docutils literal"><span class="pre">packer()</span></code> must be overriden:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="k">def</span> <span class="nf">packer</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <div class="highlight-python"><div class="highlight"><pre><span class="k">def</span> <span class="nf">packer</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="c"># First Fit</span> <span class="c"># First Fit</span>
<span class="n">cpus</span> <span class="o">=</span> <span class="p">[[</span><span class="n">cpu</span><span class="p">,</span> <span class="mi">0</span><span class="p">]</span> <span class="k">for</span> <span class="n">cpu</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">processors</span><span class="p">]</span> <span class="n">cpus</span> <span class="o">=</span> <span class="p">[[</span><span class="n">cpu</span><span class="p">,</span> <span class="mi">0</span><span class="p">]</span> <span class="k">for</span> <span class="n">cpu</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">processors</span><span class="p">]</span>
...@@ -253,7 +253,7 @@ ...@@ -253,7 +253,7 @@
</div> </div>
<div class="clearer"></div> <div class="clearer"></div>
</div> </div>
<div class="related"> <div class="related" role="navigation" aria-label="related navigation">
<h3>Navigation</h3> <h3>Navigation</h3>
<ul> <ul>
<li class="right" style="margin-right: 10px"> <li class="right" style="margin-right: 10px">
...@@ -268,10 +268,10 @@ ...@@ -268,10 +268,10 @@
<li class="right" > <li class="right" >
<a href="faq.html" title="Frequently Asked Questions" <a href="faq.html" title="Frequently Asked Questions"
>previous</a> |</li> >previous</a> |</li>
<li><a href="index.html">SimSo documentation</a> &raquo;</li> <li class="nav-item nav-item-0"><a href="index.html">SimSo documentation</a> &raquo;</li>
</ul> </ul>
</div> </div>
<div class="footer"> <div class="footer" role="contentinfo">
</div> </div>
</body> </body>
</html> </html>
\ No newline at end of file
...@@ -125,8 +125,8 @@ It is possible to get more information from the tasks using :class:`Results <sim ...@@ -125,8 +125,8 @@ It is possible to get more information from the tasks using :class:`Results <sim
Or the number of preemptions per task:: Or the number of preemptions per task::
for task in model.results.task_list: for task in model.results.tasks.values():
print("%s %d" % (task.name, sum([job.preemption_count for job in task.jobs]))) print("%s %s" % (task.name, task.preemption_count))
You can get all the metrics provided in the :class:`TaskR <simso.core.results.TaskR>` and :class:`JobR <simso.core.results.JobR>` objects. Read the documentation of these classes to know exactly what is directly accessible. You can get all the metrics provided in the :class:`TaskR <simso.core.results.TaskR>` and :class:`JobR <simso.core.results.JobR>` objects. Read the documentation of these classes to know exactly what is directly accessible.
...@@ -137,8 +137,8 @@ It is also possible to get the monitor object from each processors. This is a ve ...@@ -137,8 +137,8 @@ It is also possible to get the monitor object from each processors. This is a ve
prev = None prev = None
for evt in processor.monitor: for evt in processor.monitor:
if evt[1].event == ProcEvent.RUN: if evt[1].event == ProcEvent.RUN:
if prev is not None and prev != evt[1].args.identifier: if prev is not None and prev != evt[1].args.task:
cxt += 1 cxt += 1
prev = evt[1].args.identifier prev = evt[1].args.task
print("Number of context switches (without counting the OS): " + str(cxt)) print("Number of context switches (without counting the OS): " + str(cxt))
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment