blob: 1d3ab04b84ef900acf3f9fb892075c903b0f049c [file] [log] [blame]
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="generator" content="Asciidoctor 2.0.12">
<meta name="author" content="Copyright (c) 2010, 2021 Contributors to the Eclipse Foundation">
<link rel="icon" type="image/png" href="favicon.png">
<title>Chi documentation (Incubation)</title>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700">
<style>
/* Asciidoctor default stylesheet | MIT License | https://asciidoctor.org */
/* Uncomment @import statement to use as custom stylesheet */
/*@import "https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700";*/
article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}
audio,video{display:inline-block}
audio:not([controls]){display:none;height:0}
html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}
a{background:none}
a:focus{outline:thin dotted}
a:active,a:hover{outline:0}
h1{font-size:2em;margin:.67em 0}
abbr[title]{border-bottom:1px dotted}
b,strong{font-weight:bold}
dfn{font-style:italic}
hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}
mark{background:#ff0;color:#000}
code,kbd,pre,samp{font-family:monospace;font-size:1em}
pre{white-space:pre-wrap}
q{quotes:"\201C" "\201D" "\2018" "\2019"}
small{font-size:80%}
sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}
sup{top:-.5em}
sub{bottom:-.25em}
img{border:0}
svg:not(:root){overflow:hidden}
figure{margin:0}
fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}
legend{border:0;padding:0}
button,input,select,textarea{font-family:inherit;font-size:100%;margin:0}
button,input{line-height:normal}
button,select{text-transform:none}
button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}
button[disabled],html input[disabled]{cursor:default}
input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}
button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}
textarea{overflow:auto;vertical-align:top}
table{border-collapse:collapse;border-spacing:0}
*,*::before,*::after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}
html,body{font-size:100%}
body{background:#fff;color:rgba(0,0,0,.8);padding:0;margin:0;font-family:"Noto Serif","DejaVu Serif",serif;font-weight:400;font-style:normal;line-height:1;position:relative;cursor:auto;tab-size:4;word-wrap:anywhere;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased}
a:hover{cursor:pointer}
img,object,embed{max-width:100%;height:auto}
object,embed{height:100%}
img{-ms-interpolation-mode:bicubic}
.left{float:left!important}
.right{float:right!important}
.text-left{text-align:left!important}
.text-right{text-align:right!important}
.text-center{text-align:center!important}
.text-justify{text-align:justify!important}
.hide{display:none}
img,object,svg{display:inline-block;vertical-align:middle}
textarea{height:auto;min-height:50px}
select{width:100%}
.subheader,.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{line-height:1.45;color:#7a2518;font-weight:400;margin-top:0;margin-bottom:.25em}
div,dl,dt,dd,ul,ol,li,h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6,pre,form,p,blockquote,th,td{margin:0;padding:0}
a{color:#2156a5;text-decoration:underline;line-height:inherit}
a:hover,a:focus{color:#1d4b8f}
a img{border:0}
p{font-family:inherit;font-weight:400;font-size:1em;line-height:1.6;margin-bottom:1.25em;text-rendering:optimizeLegibility}
p aside{font-size:.875em;line-height:1.35;font-style:italic}
h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{font-family:"Open Sans","DejaVu Sans",sans-serif;font-weight:300;font-style:normal;color:#ba3925;text-rendering:optimizeLegibility;margin-top:1em;margin-bottom:.5em;line-height:1.0125em}
h1 small,h2 small,h3 small,#toctitle small,.sidebarblock>.content>.title small,h4 small,h5 small,h6 small{font-size:60%;color:#e99b8f;line-height:0}
h1{font-size:2.125em}
h2{font-size:1.6875em}
h3,#toctitle,.sidebarblock>.content>.title{font-size:1.375em}
h4,h5{font-size:1.125em}
h6{font-size:1em}
hr{border:solid #dddddf;border-width:1px 0 0;clear:both;margin:1.25em 0 1.1875em;height:0}
em,i{font-style:italic;line-height:inherit}
strong,b{font-weight:bold;line-height:inherit}
small{font-size:60%;line-height:inherit}
code{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;font-weight:400;color:rgba(0,0,0,.9)}
ul,ol,dl{font-size:1em;line-height:1.6;margin-bottom:1.25em;list-style-position:outside;font-family:inherit}
ul,ol{margin-left:1.5em}
ul li ul,ul li ol{margin-left:1.25em;margin-bottom:0;font-size:1em}
ul.square li ul,ul.circle li ul,ul.disc li ul{list-style:inherit}
ul.square{list-style-type:square}
ul.circle{list-style-type:circle}
ul.disc{list-style-type:disc}
ol li ul,ol li ol{margin-left:1.25em;margin-bottom:0}
dl dt{margin-bottom:.3125em;font-weight:bold}
dl dd{margin-bottom:1.25em}
abbr,acronym{text-transform:uppercase;font-size:90%;color:rgba(0,0,0,.8);border-bottom:1px dotted #ddd;cursor:help}
abbr{text-transform:none}
blockquote{margin:0 0 1.25em;padding:.5625em 1.25em 0 1.1875em;border-left:1px solid #ddd}
blockquote cite{display:block;font-size:.9375em;color:rgba(0,0,0,.6)}
blockquote cite::before{content:"\2014 \0020"}
blockquote cite a,blockquote cite a:visited{color:rgba(0,0,0,.6)}
blockquote,blockquote p{line-height:1.6;color:rgba(0,0,0,.85)}
@media screen and (min-width:768px){h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2}
h1{font-size:2.75em}
h2{font-size:2.3125em}
h3,#toctitle,.sidebarblock>.content>.title{font-size:1.6875em}
h4{font-size:1.4375em}}
table{background:#fff;margin-bottom:1.25em;border:solid 1px #dedede;word-wrap:normal}
table thead,table tfoot{background:#f7f8f7}
table thead tr th,table thead tr td,table tfoot tr th,table tfoot tr td{padding:.5em .625em .625em;font-size:inherit;color:rgba(0,0,0,.8);text-align:left}
table tr th,table tr td{padding:.5625em .625em;font-size:inherit;color:rgba(0,0,0,.8)}
table tr.even,table tr.alt{background:#f8f8f7}
table thead tr th,table tfoot tr th,table tbody tr td,table tr td,table tfoot tr td{line-height:1.6}
h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2;word-spacing:-.05em}
h1 strong,h2 strong,h3 strong,#toctitle strong,.sidebarblock>.content>.title strong,h4 strong,h5 strong,h6 strong{font-weight:400}
.center{margin-left:auto;margin-right:auto}
.stretch{width:100%}
.clearfix::before,.clearfix::after,.float-group::before,.float-group::after{content:" ";display:table}
.clearfix::after,.float-group::after{clear:both}
:not(pre).nobreak{word-wrap:normal}
:not(pre).nowrap{white-space:nowrap}
:not(pre).pre-wrap{white-space:pre-wrap}
:not(pre):not([class^=L])>code{font-size:.9375em;font-style:normal!important;letter-spacing:0;padding:.1em .5ex;word-spacing:-.15em;background:#f7f7f8;-webkit-border-radius:4px;border-radius:4px;line-height:1.45;text-rendering:optimizeSpeed}
pre{color:rgba(0,0,0,.9);font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;line-height:1.45;text-rendering:optimizeSpeed}
pre code,pre pre{color:inherit;font-size:inherit;line-height:inherit}
pre>code{display:block}
pre.nowrap,pre.nowrap pre{white-space:pre;word-wrap:normal}
em em{font-style:normal}
strong strong{font-weight:400}
.keyseq{color:rgba(51,51,51,.8)}
kbd{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;display:inline-block;color:rgba(0,0,0,.8);font-size:.65em;line-height:1.45;background:#f7f7f7;border:1px solid #ccc;-webkit-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,.2),0 0 0 .1em white inset;box-shadow:0 1px 0 rgba(0,0,0,.2),0 0 0 .1em #fff inset;margin:0 .15em;padding:.2em .5em;vertical-align:middle;position:relative;top:-.1em;white-space:nowrap}
.keyseq kbd:first-child{margin-left:0}
.keyseq kbd:last-child{margin-right:0}
.menuseq,.menuref{color:#000}
.menuseq b:not(.caret),.menuref{font-weight:inherit}
.menuseq{word-spacing:-.02em}
.menuseq b.caret{font-size:1.25em;line-height:.8}
.menuseq i.caret{font-weight:bold;text-align:center;width:.45em}
b.button::before,b.button::after{position:relative;top:-1px;font-weight:400}
b.button::before{content:"[";padding:0 3px 0 2px}
b.button::after{content:"]";padding:0 2px 0 3px}
p a>code:hover{color:rgba(0,0,0,.9)}
#header,#content,#footnotes,#footer{width:100%;margin-left:auto;margin-right:auto;margin-top:0;margin-bottom:0;max-width:62.5em;*zoom:1;position:relative;padding-left:.9375em;padding-right:.9375em}
#header::before,#header::after,#content::before,#content::after,#footnotes::before,#footnotes::after,#footer::before,#footer::after{content:" ";display:table}
#header::after,#content::after,#footnotes::after,#footer::after{clear:both}
#content{margin-top:1.25em}
#content::before{content:none}
#header>h1:first-child{color:rgba(0,0,0,.85);margin-top:2.25rem;margin-bottom:0}
#header>h1:first-child+#toc{margin-top:8px;border-top:1px solid #dddddf}
#header>h1:only-child,body.toc2 #header>h1:nth-last-child(2){border-bottom:1px solid #dddddf;padding-bottom:8px}
#header .details{border-bottom:1px solid #dddddf;line-height:1.45;padding-top:.25em;padding-bottom:.25em;padding-left:.25em;color:rgba(0,0,0,.6);display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-flow:row wrap;-webkit-flex-flow:row wrap;flex-flow:row wrap}
#header .details span:first-child{margin-left:-.125em}
#header .details span.email a{color:rgba(0,0,0,.85)}
#header .details br{display:none}
#header .details br+span::before{content:"\00a0\2013\00a0"}
#header .details br+span.author::before{content:"\00a0\22c5\00a0";color:rgba(0,0,0,.85)}
#header .details br+span#revremark::before{content:"\00a0|\00a0"}
#header #revnumber{text-transform:capitalize}
#header #revnumber::after{content:"\00a0"}
#content>h1:first-child:not([class]){color:rgba(0,0,0,.85);border-bottom:1px solid #dddddf;padding-bottom:8px;margin-top:0;padding-top:1rem;margin-bottom:1.25rem}
#toc{border-bottom:1px solid #e7e7e9;padding-bottom:.5em}
#toc>ul{margin-left:.125em}
#toc ul.sectlevel0>li>a{font-style:italic}
#toc ul.sectlevel0 ul.sectlevel1{margin:.5em 0}
#toc ul{font-family:"Open Sans","DejaVu Sans",sans-serif;list-style-type:none}
#toc li{line-height:1.3334;margin-top:.3334em}
#toc a{text-decoration:none}
#toc a:active{text-decoration:underline}
#toctitle{color:#7a2518;font-size:1.2em}
@media screen and (min-width:768px){#toctitle{font-size:1.375em}
body.toc2{padding-left:15em;padding-right:0}
#toc.toc2{margin-top:0!important;background:#f8f8f7;position:fixed;width:15em;left:0;top:0;border-right:1px solid #e7e7e9;border-top-width:0!important;border-bottom-width:0!important;z-index:1000;padding:1.25em 1em;height:100%;overflow:auto}
#toc.toc2 #toctitle{margin-top:0;margin-bottom:.8rem;font-size:1.2em}
#toc.toc2>ul{font-size:.9em;margin-bottom:0}
#toc.toc2 ul ul{margin-left:0;padding-left:1em}
#toc.toc2 ul.sectlevel0 ul.sectlevel1{padding-left:0;margin-top:.5em;margin-bottom:.5em}
body.toc2.toc-right{padding-left:0;padding-right:15em}
body.toc2.toc-right #toc.toc2{border-right-width:0;border-left:1px solid #e7e7e9;left:auto;right:0}}
@media screen and (min-width:1280px){body.toc2{padding-left:20em;padding-right:0}
#toc.toc2{width:20em}
#toc.toc2 #toctitle{font-size:1.375em}
#toc.toc2>ul{font-size:.95em}
#toc.toc2 ul ul{padding-left:1.25em}
body.toc2.toc-right{padding-left:0;padding-right:20em}}
#content #toc{border-style:solid;border-width:1px;border-color:#e0e0dc;margin-bottom:1.25em;padding:1.25em;background:#f8f8f7;-webkit-border-radius:4px;border-radius:4px}
#content #toc>:first-child{margin-top:0}
#content #toc>:last-child{margin-bottom:0}
#footer{max-width:none;background:rgba(0,0,0,.8);padding:1.25em}
#footer-text{color:rgba(255,255,255,.8);line-height:1.44}
#content{margin-bottom:.625em}
.sect1{padding-bottom:.625em}
@media screen and (min-width:768px){#content{margin-bottom:1.25em}
.sect1{padding-bottom:1.25em}}
.sect1:last-child{padding-bottom:0}
.sect1+.sect1{border-top:1px solid #e7e7e9}
#content h1>a.anchor,h2>a.anchor,h3>a.anchor,#toctitle>a.anchor,.sidebarblock>.content>.title>a.anchor,h4>a.anchor,h5>a.anchor,h6>a.anchor{position:absolute;z-index:1001;width:1.5ex;margin-left:-1.5ex;display:block;text-decoration:none!important;visibility:hidden;text-align:center;font-weight:400}
#content h1>a.anchor::before,h2>a.anchor::before,h3>a.anchor::before,#toctitle>a.anchor::before,.sidebarblock>.content>.title>a.anchor::before,h4>a.anchor::before,h5>a.anchor::before,h6>a.anchor::before{content:"\00A7";font-size:.85em;display:block;padding-top:.1em}
#content h1:hover>a.anchor,#content h1>a.anchor:hover,h2:hover>a.anchor,h2>a.anchor:hover,h3:hover>a.anchor,#toctitle:hover>a.anchor,.sidebarblock>.content>.title:hover>a.anchor,h3>a.anchor:hover,#toctitle>a.anchor:hover,.sidebarblock>.content>.title>a.anchor:hover,h4:hover>a.anchor,h4>a.anchor:hover,h5:hover>a.anchor,h5>a.anchor:hover,h6:hover>a.anchor,h6>a.anchor:hover{visibility:visible}
#content h1>a.link,h2>a.link,h3>a.link,#toctitle>a.link,.sidebarblock>.content>.title>a.link,h4>a.link,h5>a.link,h6>a.link{color:#ba3925;text-decoration:none}
#content h1>a.link:hover,h2>a.link:hover,h3>a.link:hover,#toctitle>a.link:hover,.sidebarblock>.content>.title>a.link:hover,h4>a.link:hover,h5>a.link:hover,h6>a.link:hover{color:#a53221}
details,.audioblock,.imageblock,.literalblock,.listingblock,.stemblock,.videoblock{margin-bottom:1.25em}
details>summary:first-of-type{cursor:pointer;display:list-item;outline:none;margin-bottom:.75em}
.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{text-rendering:optimizeLegibility;text-align:left;font-family:"Noto Serif","DejaVu Serif",serif;font-size:1rem;font-style:italic}
table.tableblock.fit-content>caption.title{white-space:nowrap;width:0}
.paragraph.lead>p,#preamble>.sectionbody>[class="paragraph"]:first-of-type p{font-size:1.21875em;line-height:1.6;color:rgba(0,0,0,.85)}
table.tableblock #preamble>.sectionbody>[class="paragraph"]:first-of-type p{font-size:inherit}
.admonitionblock>table{border-collapse:separate;border:0;background:none;width:100%}
.admonitionblock>table td.icon{text-align:center;width:80px}
.admonitionblock>table td.icon img{max-width:none}
.admonitionblock>table td.icon .title{font-weight:bold;font-family:"Open Sans","DejaVu Sans",sans-serif;text-transform:uppercase}
.admonitionblock>table td.content{padding-left:1.125em;padding-right:1.25em;border-left:1px solid #dddddf;color:rgba(0,0,0,.6);word-wrap:anywhere}
.admonitionblock>table td.content>:last-child>:last-child{margin-bottom:0}
.exampleblock>.content{border-style:solid;border-width:1px;border-color:#e6e6e6;margin-bottom:1.25em;padding:1.25em;background:#fff;-webkit-border-radius:4px;border-radius:4px}
.exampleblock>.content>:first-child{margin-top:0}
.exampleblock>.content>:last-child{margin-bottom:0}
.sidebarblock{border-style:solid;border-width:1px;border-color:#dbdbd6;margin-bottom:1.25em;padding:1.25em;background:#f3f3f2;-webkit-border-radius:4px;border-radius:4px}
.sidebarblock>:first-child{margin-top:0}
.sidebarblock>:last-child{margin-bottom:0}
.sidebarblock>.content>.title{color:#7a2518;margin-top:0;text-align:center}
.exampleblock>.content>:last-child>:last-child,.exampleblock>.content .olist>ol>li:last-child>:last-child,.exampleblock>.content .ulist>ul>li:last-child>:last-child,.exampleblock>.content .qlist>ol>li:last-child>:last-child,.sidebarblock>.content>:last-child>:last-child,.sidebarblock>.content .olist>ol>li:last-child>:last-child,.sidebarblock>.content .ulist>ul>li:last-child>:last-child,.sidebarblock>.content .qlist>ol>li:last-child>:last-child{margin-bottom:0}
.literalblock pre,.listingblock>.content>pre{-webkit-border-radius:4px;border-radius:4px;overflow-x:auto;padding:1em;font-size:.8125em}
@media screen and (min-width:768px){.literalblock pre,.listingblock>.content>pre{font-size:.90625em}}
@media screen and (min-width:1280px){.literalblock pre,.listingblock>.content>pre{font-size:1em}}
.literalblock pre,.listingblock>.content>pre:not(.highlight),.listingblock>.content>pre[class="highlight"],.listingblock>.content>pre[class^="highlight "]{background:#f7f7f8}
.literalblock.output pre{color:#f7f7f8;background:rgba(0,0,0,.9)}
.listingblock>.content{position:relative}
.listingblock code[data-lang]::before{display:none;content:attr(data-lang);position:absolute;font-size:.75em;top:.425rem;right:.5rem;line-height:1;text-transform:uppercase;color:inherit;opacity:.5}
.listingblock:hover code[data-lang]::before{display:block}
.listingblock.terminal pre .command::before{content:attr(data-prompt);padding-right:.5em;color:inherit;opacity:.5}
.listingblock.terminal pre .command:not([data-prompt])::before{content:"$"}
.listingblock pre.highlightjs{padding:0}
.listingblock pre.highlightjs>code{padding:1em;-webkit-border-radius:4px;border-radius:4px}
.listingblock pre.prettyprint{border-width:0}
.prettyprint{background:#f7f7f8}
pre.prettyprint .linenums{line-height:1.45;margin-left:2em}
pre.prettyprint li{background:none;list-style-type:inherit;padding-left:0}
pre.prettyprint li code[data-lang]::before{opacity:1}
pre.prettyprint li:not(:first-child) code[data-lang]::before{display:none}
table.linenotable{border-collapse:separate;border:0;margin-bottom:0;background:none}
table.linenotable td[class]{color:inherit;vertical-align:top;padding:0;line-height:inherit;white-space:normal}
table.linenotable td.code{padding-left:.75em}
table.linenotable td.linenos{border-right:1px solid currentColor;opacity:.35;padding-right:.5em}
pre.pygments .lineno{border-right:1px solid currentColor;opacity:.35;display:inline-block;margin-right:.75em}
pre.pygments .lineno::before{content:"";margin-right:-.125em}
.quoteblock{margin:0 1em 1.25em 1.5em;display:table}
.quoteblock:not(.excerpt)>.title{margin-left:-1.5em;margin-bottom:.75em}
.quoteblock blockquote,.quoteblock p{color:rgba(0,0,0,.85);font-size:1.15rem;line-height:1.75;word-spacing:.1em;letter-spacing:0;font-style:italic;text-align:justify}
.quoteblock blockquote{margin:0;padding:0;border:0}
.quoteblock blockquote::before{content:"\201c";float:left;font-size:2.75em;font-weight:bold;line-height:.6em;margin-left:-.6em;color:#7a2518;text-shadow:0 1px 2px rgba(0,0,0,.1)}
.quoteblock blockquote>.paragraph:last-child p{margin-bottom:0}
.quoteblock .attribution{margin-top:.75em;margin-right:.5ex;text-align:right}
.verseblock{margin:0 1em 1.25em}
.verseblock pre{font-family:"Open Sans","DejaVu Sans",sans;font-size:1.15rem;color:rgba(0,0,0,.85);font-weight:300;text-rendering:optimizeLegibility}
.verseblock pre strong{font-weight:400}
.verseblock .attribution{margin-top:1.25rem;margin-left:.5ex}
.quoteblock .attribution,.verseblock .attribution{font-size:.9375em;line-height:1.45;font-style:italic}
.quoteblock .attribution br,.verseblock .attribution br{display:none}
.quoteblock .attribution cite,.verseblock .attribution cite{display:block;letter-spacing:-.025em;color:rgba(0,0,0,.6)}
.quoteblock.abstract blockquote::before,.quoteblock.excerpt blockquote::before,.quoteblock .quoteblock blockquote::before{display:none}
.quoteblock.abstract blockquote,.quoteblock.abstract p,.quoteblock.excerpt blockquote,.quoteblock.excerpt p,.quoteblock .quoteblock blockquote,.quoteblock .quoteblock p{line-height:1.6;word-spacing:0}
.quoteblock.abstract{margin:0 1em 1.25em;display:block}
.quoteblock.abstract>.title{margin:0 0 .375em;font-size:1.15em;text-align:center}
.quoteblock.excerpt>blockquote,.quoteblock .quoteblock{padding:0 0 .25em 1em;border-left:.25em solid #dddddf}
.quoteblock.excerpt,.quoteblock .quoteblock{margin-left:0}
.quoteblock.excerpt blockquote,.quoteblock.excerpt p,.quoteblock .quoteblock blockquote,.quoteblock .quoteblock p{color:inherit;font-size:1.0625rem}
.quoteblock.excerpt .attribution,.quoteblock .quoteblock .attribution{color:inherit;text-align:left;margin-right:0}
p.tableblock:last-child{margin-bottom:0}
td.tableblock>.content{margin-bottom:1.25em;word-wrap:anywhere}
td.tableblock>.content>:last-child{margin-bottom:-1.25em}
table.tableblock,th.tableblock,td.tableblock{border:0 solid #dedede}
table.grid-all>*>tr>*{border-width:1px}
table.grid-cols>*>tr>*{border-width:0 1px}
table.grid-rows>*>tr>*{border-width:1px 0}
table.frame-all{border-width:1px}
table.frame-ends{border-width:1px 0}
table.frame-sides{border-width:0 1px}
table.frame-none>colgroup+*>:first-child>*,table.frame-sides>colgroup+*>:first-child>*{border-top-width:0}
table.frame-none>:last-child>:last-child>*,table.frame-sides>:last-child>:last-child>*{border-bottom-width:0}
table.frame-none>*>tr>:first-child,table.frame-ends>*>tr>:first-child{border-left-width:0}
table.frame-none>*>tr>:last-child,table.frame-ends>*>tr>:last-child{border-right-width:0}
table.stripes-all tr,table.stripes-odd tr:nth-of-type(odd),table.stripes-even tr:nth-of-type(even),table.stripes-hover tr:hover{background:#f8f8f7}
th.halign-left,td.halign-left{text-align:left}
th.halign-right,td.halign-right{text-align:right}
th.halign-center,td.halign-center{text-align:center}
th.valign-top,td.valign-top{vertical-align:top}
th.valign-bottom,td.valign-bottom{vertical-align:bottom}
th.valign-middle,td.valign-middle{vertical-align:middle}
table thead th,table tfoot th{font-weight:bold}
tbody tr th{background:#f7f8f7}
tbody tr th,tbody tr th p,tfoot tr th,tfoot tr th p{color:rgba(0,0,0,.8);font-weight:bold}
p.tableblock>code:only-child{background:none;padding:0}
p.tableblock{font-size:1em}
ol{margin-left:1.75em}
ul li ol{margin-left:1.5em}
dl dd{margin-left:1.125em}
dl dd:last-child,dl dd:last-child>:last-child{margin-bottom:0}
ol>li p,ul>li p,ul dd,ol dd,.olist .olist,.ulist .ulist,.ulist .olist,.olist .ulist{margin-bottom:.625em}
ul.checklist,ul.none,ol.none,ul.no-bullet,ol.no-bullet,ol.unnumbered,ul.unstyled,ol.unstyled{list-style-type:none}
ul.no-bullet,ol.no-bullet,ol.unnumbered{margin-left:.625em}
ul.unstyled,ol.unstyled{margin-left:0}
ul.checklist{margin-left:.625em}
ul.checklist li>p:first-child>.fa-square-o:first-child,ul.checklist li>p:first-child>.fa-check-square-o:first-child{width:1.25em;font-size:.8em;position:relative;bottom:.125em}
ul.checklist li>p:first-child>input[type="checkbox"]:first-child{margin-right:.25em}
ul.inline{display:-ms-flexbox;display:-webkit-box;display:flex;-ms-flex-flow:row wrap;-webkit-flex-flow:row wrap;flex-flow:row wrap;list-style:none;margin:0 0 .625em -1.25em}
ul.inline>li{margin-left:1.25em}
.unstyled dl dt{font-weight:400;font-style:normal}
ol.arabic{list-style-type:decimal}
ol.decimal{list-style-type:decimal-leading-zero}
ol.loweralpha{list-style-type:lower-alpha}
ol.upperalpha{list-style-type:upper-alpha}
ol.lowerroman{list-style-type:lower-roman}
ol.upperroman{list-style-type:upper-roman}
ol.lowergreek{list-style-type:lower-greek}
.hdlist>table,.colist>table{border:0;background:none}
.hdlist>table>tbody>tr,.colist>table>tbody>tr{background:none}
td.hdlist1,td.hdlist2{vertical-align:top;padding:0 .625em}
td.hdlist1{font-weight:bold;padding-bottom:1.25em}
td.hdlist2{word-wrap:anywhere}
.literalblock+.colist,.listingblock+.colist{margin-top:-.5em}
.colist td:not([class]):first-child{padding:.4em .75em 0;line-height:1;vertical-align:top}
.colist td:not([class]):first-child img{max-width:none}
.colist td:not([class]):last-child{padding:.25em 0}
.thumb,.th{line-height:0;display:inline-block;border:solid 4px #fff;-webkit-box-shadow:0 0 0 1px #ddd;box-shadow:0 0 0 1px #ddd}
.imageblock.left{margin:.25em .625em 1.25em 0}
.imageblock.right{margin:.25em 0 1.25em .625em}
.imageblock>.title{margin-bottom:0}
.imageblock.thumb,.imageblock.th{border-width:6px}
.imageblock.thumb>.title,.imageblock.th>.title{padding:0 .125em}
.image.left,.image.right{margin-top:.25em;margin-bottom:.25em;display:inline-block;line-height:0}
.image.left{margin-right:.625em}
.image.right{margin-left:.625em}
a.image{text-decoration:none;display:inline-block}
a.image object{pointer-events:none}
sup.footnote,sup.footnoteref{font-size:.875em;position:static;vertical-align:super}
sup.footnote a,sup.footnoteref a{text-decoration:none}
sup.footnote a:active,sup.footnoteref a:active{text-decoration:underline}
#footnotes{padding-top:.75em;padding-bottom:.75em;margin-bottom:.625em}
#footnotes hr{width:20%;min-width:6.25em;margin:-.25em 0 .75em;border-width:1px 0 0}
#footnotes .footnote{padding:0 .375em 0 .225em;line-height:1.3334;font-size:.875em;margin-left:1.2em;margin-bottom:.2em}
#footnotes .footnote a:first-of-type{font-weight:bold;text-decoration:none;margin-left:-1.05em}
#footnotes .footnote:last-of-type{margin-bottom:0}
#content #footnotes{margin-top:-.625em;margin-bottom:0;padding:.75em 0}
.gist .file-data>table{border:0;background:#fff;width:100%;margin-bottom:0}
.gist .file-data>table td.line-data{width:99%}
div.unbreakable{page-break-inside:avoid}
.big{font-size:larger}
.small{font-size:smaller}
.underline{text-decoration:underline}
.overline{text-decoration:overline}
.line-through{text-decoration:line-through}
.aqua{color:#00bfbf}
.aqua-background{background:#00fafa}
.black{color:#000}
.black-background{background:#000}
.blue{color:#0000bf}
.blue-background{background:#0000fa}
.fuchsia{color:#bf00bf}
.fuchsia-background{background:#fa00fa}
.gray{color:#606060}
.gray-background{background:#7d7d7d}
.green{color:#006000}
.green-background{background:#007d00}
.lime{color:#00bf00}
.lime-background{background:#00fa00}
.maroon{color:#600000}
.maroon-background{background:#7d0000}
.navy{color:#000060}
.navy-background{background:#00007d}
.olive{color:#606000}
.olive-background{background:#7d7d00}
.purple{color:#600060}
.purple-background{background:#7d007d}
.red{color:#bf0000}
.red-background{background:#fa0000}
.silver{color:#909090}
.silver-background{background:#bcbcbc}
.teal{color:#006060}
.teal-background{background:#007d7d}
.white{color:#bfbfbf}
.white-background{background:#fafafa}
.yellow{color:#bfbf00}
.yellow-background{background:#fafa00}
span.icon>.fa{cursor:default}
a span.icon>.fa{cursor:inherit}
.admonitionblock td.icon [class^="fa icon-"]{font-size:2.5em;text-shadow:1px 1px 2px rgba(0,0,0,.5);cursor:default}
.admonitionblock td.icon .icon-note::before{content:"\f05a";color:#19407c}
.admonitionblock td.icon .icon-tip::before{content:"\f0eb";text-shadow:1px 1px 2px rgba(155,155,0,.8);color:#111}
.admonitionblock td.icon .icon-warning::before{content:"\f071";color:#bf6900}
.admonitionblock td.icon .icon-caution::before{content:"\f06d";color:#bf3400}
.admonitionblock td.icon .icon-important::before{content:"\f06a";color:#bf0000}
.conum[data-value]{display:inline-block;color:#fff!important;background:rgba(0,0,0,.8);-webkit-border-radius:50%;border-radius:50%;text-align:center;font-size:.75em;width:1.67em;height:1.67em;line-height:1.67em;font-family:"Open Sans","DejaVu Sans",sans-serif;font-style:normal;font-weight:bold}
.conum[data-value] *{color:#fff!important}
.conum[data-value]+b{display:none}
.conum[data-value]::after{content:attr(data-value)}
pre .conum[data-value]{position:relative;top:-.125em}
b.conum *{color:inherit!important}
.conum:not([data-value]):empty{display:none}
dt,th.tableblock,td.content,div.footnote{text-rendering:optimizeLegibility}
h1,h2,p,td.content,span.alt{letter-spacing:-.01em}
p strong,td.content strong,div.footnote strong{letter-spacing:-.005em}
p,blockquote,dt,td.content,span.alt{font-size:1.0625rem}
p{margin-bottom:1.25rem}
.sidebarblock p,.sidebarblock dt,.sidebarblock td.content,p.tableblock{font-size:1em}
.exampleblock>.content{background:#fffef7;border-color:#e0e0dc;-webkit-box-shadow:0 1px 4px #e0e0dc;box-shadow:0 1px 4px #e0e0dc}
.print-only{display:none!important}
@page{margin:1.25cm .75cm}
@media print{*{-webkit-box-shadow:none!important;box-shadow:none!important;text-shadow:none!important}
html{font-size:80%}
a{color:inherit!important;text-decoration:underline!important}
a.bare,a[href^="#"],a[href^="mailto:"]{text-decoration:none!important}
a[href^="http:"]:not(.bare)::after,a[href^="https:"]:not(.bare)::after{content:"(" attr(href) ")";display:inline-block;font-size:.875em;padding-left:.25em}
abbr[title]::after{content:" (" attr(title) ")"}
pre,blockquote,tr,img,object,svg{page-break-inside:avoid}
thead{display:table-header-group}
svg{max-width:100%}
p,blockquote,dt,td.content{font-size:1em;orphans:3;widows:3}
h2,h3,#toctitle,.sidebarblock>.content>.title{page-break-after:avoid}
#header,#content,#footnotes,#footer{max-width:none}
#toc,.sidebarblock,.exampleblock>.content{background:none!important}
#toc{border-bottom:1px solid #dddddf!important;padding-bottom:0!important}
body.book #header{text-align:center}
body.book #header>h1:first-child{border:0!important;margin:2.5em 0 1em}
body.book #header .details{border:0!important;display:block;padding:0!important}
body.book #header .details span:first-child{margin-left:0!important}
body.book #header .details br{display:block}
body.book #header .details br+span::before{content:none!important}
body.book #toc{border:0!important;text-align:left!important;padding:0!important;margin:0!important}
body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-break-before:always}
.listingblock code[data-lang]::before{display:block}
#footer{padding:0 .9375em}
.hide-on-print{display:none!important}
.print-only{display:block!important}
.hide-for-print{display:none!important}
.show-for-print{display:inherit!important}}
@media print,amzn-kf8{#header>h1:first-child{margin-top:1.25rem}
.sect1{padding:0!important}
.sect1+.sect1{border:0}
#footer{background:none}
#footer-text{color:rgba(0,0,0,.6);font-size:.9em}}
@media amzn-kf8{#header,#content,#footnotes,#footer{padding:0}}
</style>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
<!--
Copyright (c) 2010, 2021 Contributors to the Eclipse Foundation
See the NOTICE file(s) distributed with this work for additional
information regarding copyright ownership.
This program and the accompanying materials are made available under the terms
of the MIT License which is available at https://opensource.org/licenses/MIT
SPDX-License-Identifier: MIT
-->
<style>
.menu, .submenu, .menuitem, .menuref {
background-color: Menu;
}
.button {
border: 1px solid ButtonFace;
/*
Styling too similar to a real button is considered bad practice, see https://github.com/asciidoctor/asciidoctor/issues/1881#issuecomment-250702085
border: 2px outset ButtonFace;
background-color: ButtonFace;
*/
padding-left: 0.5ex;
padding-right: 0.5ex;
font-weight: normal;
font-family: "Segoe UI","Open Sans","DejaVu Sans",sans-serif;
white-space: nowrap;
}
.button:before {
content: none !important;
}
.button:after {
content: none !important;
}
#footer-text, #footer-text a {
color: rgba(255,255,255,.8)
}
</style>
</head>
<body class="book toc2 toc-left">
<div id="header">
<h1>Chi documentation (Incubation)</h1>
<div class="details">
<span id="author" class="author">Copyright (c) 2010, 2021 Contributors to the Eclipse Foundation</span><br>
<span id="revnumber">version v0.2-RC1</span>
</div>
<div id="toc" class="toc2">
<div id="toctitle">Table of Contents</div>
<ul class="sectlevel1">
<li><a href="#tut-chapter-chi-tutorial">Chi Tutorial</a>
<ul class="sectlevel2">
<li><a href="#tut-chapter-introduction">Introduction</a></li>
<li><a href="#tut-chapter-data-types">Data types</a></li>
<li><a href="#tut-chapter-statements">Statements</a></li>
<li><a href="#tut-chapter-functions">Functions</a></li>
<li><a href="#tut-chapter-input-and-output">Input and output</a></li>
<li><a href="#tut-chapter-stochastic-behavior">Modeling stochastic behavior</a></li>
<li><a href="#tut-chapter-processes">Processes</a></li>
<li><a href="#tut-chapter-channels">Channels</a></li>
<li><a href="#tut-chapter-buffers">Buffers</a></li>
<li><a href="#tut-chapter-servers-with-time">Servers with time</a></li>
<li><a href="#tut-chapter-conveyors">Conveyors</a></li>
<li><a href="#tut-chapter-simulation-and-experiments">Simulations and experiments</a></li>
<li><a href="#tut-chapter-svg-visualization">SVG visualization</a></li>
<li><a href="#tut-chapter-svg-example">SVG visualization example</a></li>
</ul>
</li>
<li><a href="#ref-chapter-reference-manual">Chi Reference Manual</a>
<ul class="sectlevel2">
<li><a href="#ref-chapter-global-definitions">Global definitions</a></li>
<li><a href="#ref-chapter-statements">Statements</a></li>
<li><a href="#ref-chapter-expressions">Expressions</a></li>
<li><a href="#ref-chapter-standard-library">Standard library functions</a></li>
<li><a href="#ref-chapter-distributions">Distributions</a></li>
<li><a href="#ref-chapter-types">Types</a></li>
<li><a href="#ref-chapter-lexical-syntax">Lexical syntax</a></li>
<li><a href="#ref-chapter-migration">Model migration</a></li>
<li><a href="#ref-chapter-svg-visualization">SVG visualization</a></li>
</ul>
</li>
<li><a href="#tool-chapter-tool-manual">Chi Tool Manual</a>
<ul class="sectlevel2">
<li><a href="#tool-chapter-software-operation">Software operation</a></li>
<li><a href="#tool-chapter-command-line">Command line options</a></li>
</ul>
</li>
<li><a href="#release-notes-chapter-index">Chi release notes</a>
<ul class="sectlevel2">
<li><a href="#version-0-2">Version 0.2</a></li>
<li><a href="#version-0-1">Version 0.1</a></li>
</ul>
</li>
<li><a href="#legal-chapter-index">Legal</a></li>
</ul>
</div>
</div>
<div id="content">
<div id="preamble">
<div class="sectionbody">
<div class="paragraph">
<p>Chi is a modeling language for describing and analyzing performance of discrete event systems by means of simulation.
It uses a process-based view, and uses synchronous point-to-point communication between processes.
A process is written as an imperative program, with a syntax much inspired by the well-known Python language.</p>
</div>
<div class="paragraph">
<p>Chi is one of the tools of the Eclipse ESCET&#8482; project.
Visit the <a href="https://eclipse.org/escet">project website</a> for downloads, installation instructions, source code, general tool usage information, information on how to contribute, and more.</p>
</div>
<div class="admonitionblock warning">
<table>
<tr>
<td class="icon">
<i class="fa icon-warning" title="Warning"></i>
</td>
<td class="content">
<div class="paragraph">
<p>The Eclipse ESCET project, including the Chi language and toolset, is currently in the <a href="https://wiki.eclipse.org/Development_Resources/Process_Guidelines/What_is_Incubation">Incubation Phase</a>.</p>
</div>
<div class="paragraph">
<p><span class="image"><img src="./eclipse-incubation.png" alt="eclipse incubation" width="300"></span></p>
</div>
</td>
</tr>
</table>
</div>
<div class="admonitionblock tip">
<table>
<tr>
<td class="icon">
<i class="fa icon-tip" title="Tip"></i>
</td>
<td class="content">
You can <a href="eclipse-escet-incubation-chi-manual.pdf">download this manual</a> as a PDF as well.
</td>
</tr>
</table>
</div>
<div class="dlist">
<dl>
<dt class="hdlist1">Tutorial</dt>
<dd>
<p>The <a href="#tut-chapter-chi-tutorial">Chi Tutorial</a> teaches the Chi language, and its use in modeling and simulating systems to answer your performance questions.</p>
<div class="paragraph">
<p>Some interesting topics are:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Basics (<a href="#tut-chapter-data-types">Data types</a>, <a href="#tut-chapter-statements">Statements</a>, <a href="#tut-chapter-stochastic-behavior">Modeling stochastic behavior</a>)</p>
</li>
<li>
<p>Programming (<a href="#tut-chapter-processes">Processes</a>, <a href="#tut-chapter-channels">Channels</a>)</p>
</li>
<li>
<p>Modeling (<a href="#tut-chapter-buffers">Buffers</a>, <a href="#tut-chapter-servers-with-time">Servers with time</a>, <a href="#tut-chapter-conveyors">Conveyors</a>)</p>
</li>
</ul>
</div>
</dd>
<dt class="hdlist1">Reference manual</dt>
<dd>
<p>The <a href="#ref-chapter-reference-manual">Chi Reference Manual</a> describes the Chi language in full detail, for example the top level language elements or all statements.
It also contains a list with all standard library functions and a list with all distribution functions.</p>
<div class="paragraph">
<p>Some interesting topics are:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><a href="#ref-chapter-global-definitions">Global definitions</a> (Top level language elements)</p>
</li>
<li>
<p><a href="#ref-chapter-standard-library">Standard library functions</a> (Standard library functions)</p>
</li>
<li>
<p><a href="#ref-chapter-distributions">Distributions</a> (Available distributions)</p>
</li>
</ul>
</div>
</dd>
<dt class="hdlist1">Tool manual</dt>
<dd>
<p>The <a href="#tool-chapter-tool-manual">Tool manual</a> describes the Chi simulator software.
Use of the software to create and simulate Chi programs is also explained.</p>
</dd>
<dt class="hdlist1">Release notes</dt>
<dd>
<p>The <a href="#release-notes-chapter-index">Release notes</a> provides information on all Chi releases.</p>
</dd>
<dt class="hdlist1">Legal</dt>
<dd>
<p>See <a href="#legal-chapter-index">Legal</a> for copyright and licensing information.</p>
</dd>
</dl>
</div>
</div>
</div>
<div class="sect1">
<h2 id="tut-chapter-chi-tutorial">Chi Tutorial</h2>
<div class="sectionbody">
<div class="paragraph">
<p>This manual explains using the Chi modeling language.</p>
</div>
<div class="paragraph">
<p><em>Topics</em></p>
</div>
<div class="ulist">
<ul>
<li>
<p><a href="#tut-chapter-introduction">Introduction</a> (global description of the aims of the language)</p>
</li>
<li>
<p><em>Basics</em>: Elementary knowledge needed for writing and understanding Chi programs.
<em>Start here to learn the language!</em></p>
<div class="ulist">
<ul>
<li>
<p><a href="#tut-chapter-data-types">Data types</a> (explanation of all kinds of data and their operations)</p>
</li>
<li>
<p><a href="#tut-chapter-statements">Statements</a> (available process statements)</p>
</li>
<li>
<p><a href="#tut-chapter-functions">Functions</a> (how to use functions)</p>
</li>
<li>
<p><a href="#tut-chapter-input-and-output">Input and output</a> (reading/writing files, displaying output)</p>
</li>
</ul>
</div>
</li>
<li>
<p><em>Programming</em>: How to specify parallel executing processes using the Chi language.</p>
<div class="ulist">
<ul>
<li>
<p><a href="#tut-chapter-stochastic-behavior">Modeling stochastic behavior</a> (how to model varying behavior)</p>
</li>
<li>
<p><a href="#tut-chapter-processes">Processes</a> (creating and running processes)</p>
</li>
<li>
<p><a href="#tut-chapter-channels">Channels</a> (connecting processes with each other)</p>
</li>
</ul>
</div>
</li>
<li>
<p><em>Modeling</em>: Modeling a real system with Chi.</p>
<div class="ulist">
<ul>
<li>
<p><a href="#tut-chapter-buffers">Buffers</a> (modeling temporary storage of items)</p>
</li>
<li>
<p><a href="#tut-chapter-servers-with-time">Servers</a> (modeling machines)</p>
</li>
<li>
<p><a href="#tut-chapter-conveyors">Conveyors</a> (modeling conveyor belts)</p>
</li>
<li>
<p><a href="#tut-chapter-simulation-and-experiments">Experiments</a> (performing simulation experiments)</p>
</li>
</ul>
</div>
</li>
<li>
<p><em>Visualization</em>: Making an animated graphical display of a system with the Chi simulator.</p>
<div class="ulist">
<ul>
<li>
<p><a href="#tut-chapter-svg-visualization">SVG visualization</a> (how to attach an SVG visualization)</p>
</li>
<li>
<p><a href="#tut-chapter-svg-example">SVG example</a> (an SVG example)</p>
</li>
</ul>
</div>
</li>
</ul>
</div>
<div class="sect2">
<h3 id="tut-chapter-introduction">Introduction</h3>
<div class="paragraph">
<p>The topic is modeling of the operation of (manufacturing) systems, e.g. semiconductor factories, assembly and packaging lines, car manufacturing plants, steel foundries, metal processing shops, beer breweries, health care systems, warehouses, order-picking systems.
For a proper functioning of these systems, these systems are controlled by operators and electronic devices, e.g. computers.</p>
</div>
<div class="paragraph">
<p>During the design process, engineers make use of (analytical) mathematical models, e.g. algebra and probability theory, to get answers about the operation of the system.
For complex systems, (numerical) mathematical models are used, and computers perform simulation experiments, to analyze the operation of the system.
Simulation studies give answers to questions like:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>What is the throughput of the system?</p>
</li>
<li>
<p>What is the effect of set-up time in a machine?</p>
</li>
<li>
<p>How will the batch size of an order influence the flow time of the product-items?</p>
</li>
<li>
<p>What is the effect of more surgeons in a hospital?</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>
The operation of a system can be described, e.g. in terms of or operating processes.</p>
</div>
<div class="paragraph">
<p>An example of a system with parallel operating processes is a manufacturing line, with a number of manufacturing machines, where product-items go from machine to machine.
A surgery room in a hospital is a system where patients are treated by teams using medical equipment and sterile materials.
A biological system can be described by a number of parallel processes, where, e.g. processes transform sugars into water and carbon-dioxide producing energy.
In all these examples, processes operate in parallel to complete a task, and to achieve a goal.
Concurrency is the dominant aspect in these type of systems, and as a consequence this holds too for their models.</p>
</div>
<div class="paragraph">
<p>The operating behavior of parallel processes can be described by different formalisms, e.g. automata, Petri-nets or parallel processes.
This text uses the programming language Chi, which is an instance of a parallel processes formalism.</p>
</div>
<div class="paragraph">
<p>A system is abstracted into a model, with cooperating processes, where processes are connected to each other via channels.
The channels are used for exchanging material and information.
Models of the above mentioned examples consist of a number of concurrent processes connected by channels, denoting the flow of products, patients or personnel.</p>
</div>
<div class="paragraph">
<p>In Chi, communication takes place in a synchronous manner.
This means that communication between a sending process, and a receiving process takes place only when both processes are able to communicate.
Processes and channels can dynamically be altered.
To model times, like inter-arrival times and server processing times, the language has a notation of time.</p>
</div>
<div class="paragraph">
<p>The rationale behind the language is that models for the analysis of a system should be</p>
</div>
<div class="ulist">
<ul>
<li>
<p>formal (exactly one interpretation, every reader attaches the same meaning to the model),</p>
</li>
<li>
<p>easily writable (write the essence of the system in a compact way),</p>
</li>
<li>
<p>easily readable (non-experts should be able to understand the model),</p>
</li>
<li>
<p>and easily extensible (adding more details in one part should not affect other parts).</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>Verification of the models to investigate the properties of the model should be relatively effortless.
(A model has to preserve some properties of the real system otherwise results from the simulation study have no relation with the system being modeled.
The language must allow this verification to take place in a simple manner.)</p>
</div>
<div class="paragraph">
<p>Experiments should be performed in an straightforward manner.
(Minimizing the effort in doing simulation studies, in particular for large systems, makes the language useful.)</p>
</div>
<div class="paragraph">
<p>Finally, the used models should be usable for the supervisory (logic) control of the systems (simulation studies often provide answers on how to control a system in a better way, these answers should also work for the modeled system).</p>
</div>
<div class="sect3">
<h4 id="tut-chi-in-a-nutshell">Chi in a nutshell</h4>
<div class="paragraph">
<p>During the past decades, the ancestors of Chi have been used with success, for the analysis of a variety of (industrial) systems.
Based on this experience, the language Chi has been completely redesigned, keeping the strong points of the previous versions, while making it more powerful for advanced users, and easier to access for non-experts.</p>
</div>
<div class="paragraph">
<p>Its features are:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>A system (and its control) is modeled as a collection of parallel running processes, communicating with each other using channels.</p>
</li>
<li>
<p>Processes do not share data with other processes and channels are synchronous (sending and receiving is always done together at the same time), making reasoning about process behavior easier.</p>
</li>
<li>
<p>Processes and channels are dynamic, new processes can be created as needed, and communication channels can be created or rerouted.</p>
</li>
<li>
<p>Variables can have elementary values such as <em>boolean</em>, <em>integer</em> or <em>real</em> numbers, to high level structured collections of data like <em>lists</em>, <em>sets</em> and <em>dictionaries</em> to model the data of the system.
If desired, processes and channels can also be part of that data.</p>
</li>
<li>
<p>A small generic set of statements to describe algorithms, assignment, <em>if</em>, <em>while</em>, and <em>for</em> statements.
This set is relatively easy to explain to non-experts, allowing them to understand the model, and participate in the discussions.</p>
</li>
<li>
<p>Tutorials and manuals demonstrate use of the language for effective modeling of system processes.
More detailed modeling of the processes, or custom tailoring them to the real situation, has no inherent limits.</p>
</li>
<li>
<p>Time and (quasi-) random number generation distributions are available for modeling behavior of the system in time.</p>
</li>
<li>
<p>Likewise, measurements to derive performance indicators of the modeled system are integrated in the model.
Tutorials and manuals show basic use.
The integration allows for custom solutions to obtain the needed data in the wanted form.</p>
</li>
<li>
<p>Input and output facilities from and to the file system exists to support large simulation experiments.</p>
</li>
</ul>
</div>
</div>
<div class="sect3">
<h4 id="tut-exercises">Exercises</h4>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Install the Chi programming environment at your computer.</p>
</li>
<li>
<p>Test your first program.</p>
<div class="olist loweralpha">
<ol class="loweralpha" type="a">
<li>
<p>Construct the following program in a project in your workspace:</p>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">model M():
writeln("It works!")
end</code></pre>
</div>
</div>
</li>
<li>
<p>Compile, and simulate the model as explained in the tool manual (in <a href="#tool-compile-and-simulate">Compile and simulate</a>).</p>
</li>
<li>
<p>Try to explain the result.</p>
</li>
</ol>
</div>
</li>
<li>
<p>Test a program with model parameters.</p>
<div class="olist loweralpha">
<ol class="loweralpha" type="a">
<li>
<p>Construct the following program in the same manner:</p>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">model M(string s):
write("%s\n")
end</code></pre>
</div>
</div>
</li>
<li>
<p>Simulate the model, where you have to set the <em>Model instance</em> text to <code>M("OOPS")</code> in the dialog box of the simulator.</p>
</li>
<li>
<p>Try to explain the result.</p>
</li>
</ol>
</div>
</li>
</ol>
</div>
<div class="paragraph">
<p></p>
</div>
</div>
</div>
<div class="sect2">
<h3 id="tut-chapter-data-types">Data types</h3>
<div class="paragraph">
<p>The language is a statically typed language, which means that all variables and values in a model have a single fixed type.
All variables must be declared in the program.
The declaration of a variable consists of the type, and the name, of the variable.
The following fragment shows the declaration of two elementary data types, integer variable <code>i</code> and real variable <code>r</code>:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">...
int i;
real r;
...</code></pre>
</div>
</div>
<div class="paragraph">
<p>The ellipsis (<code>...</code>) denotes that non-relevant information is left out from the fragment.
The syntax for the declaration of variables is similar to the language <em>C</em>.
All declared variables are initialized, variables <code>i</code> and <code>r</code> are both initialized to zero.</p>
</div>
<div class="paragraph">
<p>An expression, consisting of operators, e.g. plus (<code>+</code>), times (<code>*</code>), and operands, e.g. <code>i</code> and <code>r</code>, is used to calculate a new value.
The new value can be assigned to a variable by using an <em>assignment</em> statement.
An example with four variables, two expressions and assignment statements is:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">...
int i = 2, j;
real r = 1.50, s;
j = 2 * i + 1;
s = r / 2;
...</code></pre>
</div>
</div>
<div class="paragraph">
<p>The value of variable <code>j</code> becomes <code>5</code>, and the value of <code>s</code> becomes <code>0.75</code>.
Statements are described in <a href="#tut-chapter-statements">Statements</a>.</p>
</div>
<div class="paragraph">
<p>Data types are categorized in five different groups: <em>elementary</em> types, <em>tuple</em> types, <em>container</em> types, <em>custom</em> types, and <em>distribution</em> types.
Elementary types are types such as Boolean, integer, real or string.
Tuple types contain at least one element, where each element can be of different type.
In other languages tuple types are called records (Pascal) or structures (C).
Variables with a container type (a list, set, or dictionary) contain many elements, where each element is of the same type.
Custom types are created by the user to enhance the readability of the model.
Distributions types are types used for the generation of distributions from (pseudo-) random numbers.
They are covered in <a href="#tut-chapter-stochastic-behavior">Modeling stochastic behavior</a>.</p>
</div>
<div class="sect3">
<h4 id="tut-elementary-types">Elementary types</h4>
<div class="paragraph">
<p>The elementary data types are Booleans, numbers and strings.
The language provides the elementary data types:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><code>bool</code> for booleans, with values <code>false</code> and <code>true</code>.</p>
</li>
<li>
<p><code>enum</code> for enumeration types, for example <code>enum FlagColors = {red, white, blue}</code>,</p>
</li>
<li>
<p><code>int</code> for integers, e.g. <code>-7</code>, <code>20</code>, <code>0</code>.</p>
</li>
<li>
<p><code>real</code> for reals, e.g. <code>3.14</code>, <code>7.0e9</code>.</p>
</li>
<li>
<p><code>string</code> for text strings, e.g. <code>"Hello"</code>, <code>"world"</code>.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>
</p>
</div>
<div class="sect4">
<h5 id="tut-booleans">Booleans</h5>
<div class="paragraph">
<p>A boolean value has two possible values, the truth values.
These truth values are <code>false</code> and <code>true</code>.
The value <code>false</code> means that a property is not fulfilled.
A value <code>true</code> means the presence of a property.
Boolean variables are initialized with the value <code>false</code>.</p>
</div>
<div class="paragraph">
<p>In mathematics, various symbols are used for unary and binary boolean operators.
These operators are also present in Chi.
The most commonly used boolean operators are <code>not</code>, <code>and</code>, and <code>or</code>.
The names of the operators, the symbols in mathematics and the symbols in the language are presented in <a href="#tut-table-boolsymbols">Table with boolean symbols</a>.</p>
</div>
<table id="tut-table-boolsymbols" class="tableblock frame-all grid-all stretch">
<caption class="title">Table 1. Table with boolean symbols</caption>
<colgroup>
<col style="width: 33.3333%;">
<col style="width: 33.3333%;">
<col style="width: 33.3334%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top">Operator</th>
<th class="tableblock halign-left valign-top">Math</th>
<th class="tableblock halign-left valign-top">Chi</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">boolean not</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">¬</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>not</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">boolean and</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">∧</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>and</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">boolean or</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">∨</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>or</code></p></td>
</tr>
</tbody>
</table>
<div class="paragraph">
<p>Examples of boolean expressions are the following.
If <code>z</code> equals <code>true</code>, then the value of <code>(not z)</code> equals <code>false</code>.
If <code>s</code> equals <code>false</code>, and <code>t</code> equals <code>true</code>, then the value of the expression <code>(s or t)</code> becomes <code>true</code>.</p>
</div>
<div class="paragraph">
<p>
The result of the unary <code>not</code>, the binary <code>and</code> and <code>or</code> operators, for two variables <code>p</code> and <code>q</code> is given in <a href="#tut-table-truthtable">Truth table for <code>not</code>, <code>and</code> and <code>or</code> operators</a>.</p>
</div>
<table id="tut-table-truthtable" class="tableblock frame-all grid-all stretch">
<caption class="title">Table 2. Truth table for <code>not</code>, <code>and</code> and <code>or</code> operators</caption>
<colgroup>
<col style="width: 20%;">
<col style="width: 20%;">
<col style="width: 20%;">
<col style="width: 20%;">
<col style="width: 20%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top"><code>p</code></th>
<th class="tableblock halign-left valign-top"><code>q</code></th>
<th class="tableblock halign-left valign-top"><code>not p</code></th>
<th class="tableblock halign-left valign-top"><code>p and q</code></th>
<th class="tableblock halign-left valign-top"><code>p or q</code></th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>false</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>false</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>true</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>false</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>false</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>false</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>true</code></p></td>
<td class="tableblock halign-left valign-top"></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>false</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>true</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>true</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>false</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>false</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>false</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>true</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>true</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>true</code></p></td>
<td class="tableblock halign-left valign-top"></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>true</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>true</code></p></td>
</tr>
</tbody>
</table>
<div class="paragraph">
<p>If <code>p = true</code> and <code>q = false</code>, we find for <code>p or q</code> the value <code>true</code> (third line in <a href="#tut-table-truthtable">Truth table for <code>not</code>, <code>and</code> and <code>or</code> operators</a>).</p>
</div>
<div class="paragraph">
<p>
</p>
</div>
</div>
<div class="sect4">
<h5 id="tut-enumerations">Enumerations</h5>
<div class="paragraph">
<p>Often there are several variants of entities, like types of products, available resources, available machine types, and so on.</p>
</div>
<div class="paragraph">
<p>One way of coding them is give each a unique number, which results in code with a lot of small numbers that are not actually numbers, but refer to one variant.</p>
</div>
<div class="paragraph">
<p>Another way is to give each variant a name (which often already exists), and use those names instead.</p>
</div>
<div class="paragraph">
<p>For example, to model a traffic light:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">enum TrafficColor = {RED, ORANGE, GREEN};
TrafficColor light = RED;</code></pre>
</div>
</div>
<div class="paragraph">
<p>The <code>enum TrafficColor</code> line lists the available traffic colors.
With this definition, a new type <code>TrafficColor</code> is created, which you can use like any other type.
The line <code>TrafficColor light = RED;</code> creates a new variable called <code>light</code> and initializes it to the value <code>RED</code>.</p>
</div>
<div class="paragraph">
<p>
</p>
</div>
</div>
<div class="sect4">
<h5 id="tut-numbers">Numbers</h5>
<div class="paragraph">
<p>In the language, two types of numbers are available: integer numbers and real numbers.
Integer numbers are whole numbers, denoted by type <code>int</code> e.g. <code>3</code>, <code>-10</code>, <code>0</code>.
Real numbers are used to present numbers with a fraction, denoted by type <code>real</code>.
E.g. <code>3.14</code>, <code>2.7e6</code> (the scientific notation for 2.7 million).
Note that real numbers <em>must</em> either have a fraction or use the scientific notation, to let the computer know you mean a real number (instead of an integer number).
Integer variables are initialized with <code>0</code>.
Real variables are initialized with <code>0.0</code>.</p>
</div>
<div class="paragraph">
<p>
For numbers, the normal arithmetic operators are defined.
Expressions can be constructed with these operators.
The arithmetic operators for numbers are listed in <a href="#tut-table-aritoper">The arithmetic operators</a>.</p>
</div>
<table id="tut-table-aritoper" class="tableblock frame-all grid-all stretch">
<caption class="title">Table 3. The arithmetic operators</caption>
<colgroup>
<col style="width: 33.3333%;">
<col style="width: 33.3333%;">
<col style="width: 33.3334%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top">Operator name</th>
<th class="tableblock halign-left valign-top">Notation</th>
<th class="tableblock halign-left valign-top">Comment</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">unary plus</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>+ x</code></p></td>
<td class="tableblock halign-left valign-top"></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">unary minus</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>- x</code></p></td>
<td class="tableblock halign-left valign-top"></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">raising to the power</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>x ^ y</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Always a <code>real</code> result.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">multiplication</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>x * y</code></p></td>
<td class="tableblock halign-left valign-top"></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">real division</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>x / y</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Always a <code>real</code> result.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">division</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>x div y</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">For <code>int</code> only.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">modulo</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>x mod y</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">For <code>int</code> only.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">addition</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>x + y</code></p></td>
<td class="tableblock halign-left valign-top"></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">subtraction</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>x - y</code></p></td>
<td class="tableblock halign-left valign-top"></td>
</tr>
</tbody>
</table>
<div class="paragraph">
<p>The priority of the operators is given from high to low.
The unary operators have the strongest binding, and the <code>+</code> and <code>-</code> the weakest binding.
So, <code>-3^2</code> is read as <code>(-3)^2</code> and not <code>-(3^2)</code>, because the priority rules say that the unary operator binds stronger than the raising to the power operator.
Binding in expressions can be changed by the use of parentheses.</p>
</div>
<div class="paragraph">
<p>The integer division, denoted by <code>div</code>, gives the biggest integral number smaller or equal to <code>x / y</code>.
The integer remainder, denoted by <code>mod</code>, gives the remainder after division <code>x - y * (x div y)</code>.
So, <code>7 div 3</code> gives <code>2</code> and <code>-7 div 3</code> gives <code>-3</code>, <code>7 mod 3</code> gives <code>1</code> and <code>-7 mod 3</code> gives <code>2</code>.</p>
</div>
<div class="paragraph">
<p>The rule for the result of an operation is as follows.
The real division and raising to the power operations always produce a value of type <code>real</code>.
Otherwise, if both operands (thus <code>x</code> and <code>y</code>) are of type <code>int</code>, the result of the operation is of type <code>int</code>.
If one of the operands is of type <code>real</code>, the result of the operation is of type <code>real</code>.</p>
</div>
<div class="paragraph">
<p>
Conversion functions exist to convert a real into an integer.
The function <code>ceil</code> converts a real to the smallest integer value not less than the real, the function <code>floor</code> gives the biggest integer value smaller than or equal to the real, and the function <code>round</code> rounds the real to the nearest integer value (or up, if it ends on <code>.5</code>).</p>
</div>
<div class="paragraph">
<p>
Between two numbers a relational operation can be defined.
If for example variable <code>x</code> is smaller than variable <code>y</code>, the expression <code>x &lt; y</code> equals <code>true</code>.
The relational operators, with well-known semantics, are listed in <a href="#tut-table-reloper">The relational operators</a>.</p>
</div>
<table id="tut-table-reloper" class="tableblock frame-all grid-all stretch">
<caption class="title">Table 4. The relational operators</caption>
<colgroup>
<col style="width: 50%;">
<col style="width: 50%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top">Name</th>
<th class="tableblock halign-left valign-top">Operator</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">less than</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>x &lt; y</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">at most</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>x &lt;= y</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">equals</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>x == y</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">differs from</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>x != y</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">at least</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>x &gt;= y</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">greater than</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>x &gt; y</code></p></td>
</tr>
</tbody>
</table>
<div class="paragraph">
<p>
</p>
</div>
</div>
<div class="sect4">
<h5 id="tut-strings">Strings</h5>
<div class="paragraph">
<p>Variables of type string contains a sequence of characters.
A string is enclosed by double quotes.
An example is <code>"Manufacturing line"</code>.
Strings can be composed from different strings.
The concatenation operator (<code>+</code>) adds one string to another, for example <code>"One" + " " + "string"</code> gives <code>"One string"</code>.
Moreover the relational operators (<code>&lt;</code>, <code>&lt;=</code>, <code>==</code>, <code>!=</code> <code>&gt;=</code>, and <code>&gt;</code>) can be used to compare strings alphabetically, e.g. <code>"a" &lt; "aa" &lt; "ab" &lt; "b"</code>.
String variables are initialized with the empty string <code>""</code>.</p>
</div>
<div class="paragraph">
<p>
</p>
</div>
</div>
</div>
<div class="sect3">
<h4 id="tut-tuple-types">Tuple types</h4>
<div class="paragraph">
<p>
Tuple types are used for keeping several (related) kinds of data together in one variable, e.g. the name and the age of a person.
A tuple variable consists of a number of fields inside the tuple, where the types of these fields may be different.
The number of fields is fixed.
One operator, the projection operator denoted by a dot (<code>.</code>), is defined for tuples.
It selects a field in the tuple for reading or assigning.</p>
</div>
<div class="sect4">
<h5 id="tut-notation">Notation</h5>
<div class="paragraph">
<p>A type <code>person</code> is a tuple with two fields, a 'name' field of type <code>string</code>, and an 'age' field of type <code>int</code>, is denoted by:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">type person = tuple(string name; int age)</code></pre>
</div>
</div>
</div>
<div class="sect4">
<h5 id="tut-operator">Operator</h5>
<div class="paragraph">
<p>A projection operator fetches a field from a tuple.
We define two persons:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">person eva = ("eva" , 29),
adam = ("adam", 27);</code></pre>
</div>
</div>
<div class="paragraph">
<p>And we can speak of <code>eva.name</code> and <code>adam.age</code>, denoting the name of <code>eva</code> (<code>"eva"</code>) and the age of <code>adam</code> (<code>27</code>).
We can assign a field in a tuple to another variable:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">ae = eva.age;
eva.age = eva.age + 1;</code></pre>
</div>
</div>
<div class="paragraph">
<p>This means that the age of <code>eva</code> is assigned tot variable <code>ae</code>, and the new age of <code>eva</code> becomes <code>eva.age + 1</code>.</p>
</div>
<div class="paragraph">
<p>By using a multi assignment statement all values of a tuple can be copied into separate variables:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">string name;
int age;
name, age = eva</code></pre>
</div>
</div>
<div class="paragraph">
<p>This assignment copies the name of <code>eva</code> into variable <code>name</code> of type <code>string</code> and her age into <code>age</code> of type <code>int</code>.</p>
</div>
</div>
</div>
<div class="sect3">
<h4 id="tut-container-types">Container types</h4>
<div class="paragraph">
<p>Lists, sets and dictionaries are container types.
A variable of this type contains zero or more identical elements.
Elements can be added or removed in variables of these types.
Variables of a container type are initialized with zero elements.</p>
</div>
<div class="paragraph">
<p>Sets are unordered collections of elements.
Each element value either exists in a set, or it does not exist in a set.
Each element value is unique, duplicate elements are silently discarded.
A list is an ordered collection of elements, that is, there is a first and a last element (in a non-empty list).
A list also allows duplicate element values.
Dictionaries are unordered and have no duplicate value, just like sets, but you can associate a value (of a different type) with each element value.</p>
</div>
<div class="paragraph">
<p>
Lists are denoted by a pair of (square) brackets.
For example, <code>[7, 8, 3]</code> is a list with three integer elements.
Since a list is ordered, <code>[8, 7, 3]</code> is a different list.
With empty lists, the computer has to know the type of the elements, e.g. <code>&lt;int&gt;[]</code> is an empty list with integer elements.
The prefix <code>&lt;int&gt;</code> is required in this case.</p>
</div>
<div class="paragraph">
<p>
Sets are denoted by a pair of (curly) braces, e.g. <code>{7, 8, 3}</code> is a set with three integer elements.
As with lists, for an empty set a prefix is required, for example <code>&lt;string&gt;{}</code> is an empty set with strings.
A set is an unordered collection of elements.
The set <code>{7, 8, 3}</code> is a set with three integer numbers.
Since order of the elements does not matter, the same set can also be written as <code>{8, 3, 7}</code> (or in one of the four other orders).
In addition, each element in a set is unique, the set <code>{8, 7, 8, 3}</code> is equal to the set <code>{7, 8, 3}</code>.
For readability, elements in a set are normally written in increasing order, for example <code>{3, 7, 8}</code>.</p>
</div>
<div class="paragraph">
<p>
Dictionaries are denoted by a pair of (curly) braces, whereby an element value consists of two parts, a 'key' and a 'value' part.
The two parts separated by a colon (<code>:</code>).
For example <code>{"jim" : 32, "john" : 34}</code> is a dictionary with two elements.
The first element has <code>"jim"</code> as key part and <code>32</code> as value part, the second element has <code>"john"</code> as key part and <code>34</code> as value part.
The key parts of the elements work like a set, they are unordered and duplicates are silently discarded.
A value part is associated with its key part.
In this example, the key part is the name of a person, while the value part keeps the age of that person.
Empty dictionaries are written with a type prefix just like lists and sets, e.g. <code>&lt;string:int&gt;{}</code>.</p>
</div>
<div class="paragraph">
<p>Container types have some built-in functions in common (Functions are described in <a href="#tut-chapter-functions">Functions</a>):</p>
</div>
<div class="paragraph">
<p>
</p>
</div>
<div class="ulist">
<ul>
<li>
<p>The function <code>size</code> gives the number of elements in a variable, for example <code>size([7, 8, 3])</code> yields 3; <code>size({7, 8})</code> results in 2; <code>size({"jim":32})</code> gives 1 (an element consists of two parts).</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>
</p>
</div>
<div class="ulist">
<ul>
<li>
<p>The function <code>empty</code> yields <code>true</code> if there are no elements in variable.
E.g. <code>empty(&lt;string&gt;{})</code> with an empty set of type <code>string</code> is true.
(Here the type <code>string</code> is needed to determine the type of the elements of the empty set.)</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>
</p>
</div>
<div class="ulist">
<ul>
<li>
<p>The function <code>pop</code> extracts a value from the provided collection and returns a tuple with that value, and the collection minus the value.</p>
<div class="paragraph">
<p>
For lists, the first element of the list becomes the first field of the tuple.
The second field of the tuple becomes the list minus the first list element.
For example:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">pop([7, 8, 3]) -&gt; (7, [8, 3])</code></pre>
</div>
</div>
<div class="paragraph">
<p>The <code>-&gt;</code> above denotes 'yields'.
The value of the list is split into a 'head' (the first element) and a 'tail' (the remaining elements).</p>
</div>
<div class="paragraph">
<p>
For sets, the first field of the tuple becomes the value of an arbitrary element from the set.
The second field of the tuple becomes the original set minus the arbitrary element.
For example, a <code>pop</code> on the set <code>{8, 7, 3}</code> has three possible answers:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">pop({8, 7, 3}) -&gt; (7, {3, 8}) or
pop({8, 7, 3}) -&gt; (3, {7, 8}) or
pop({8, 7, 3}) -&gt; (8, {3, 7})</code></pre>
</div>
</div>
<div class="paragraph">
<p>
Performing a <code>pop</code> on a dictionary follows the same pattern as above, except 'a value from the collection' are actually a key item and a value item.
In this case, the <code>pop</code> function gives a three-tuple as result.
The first field of the tuple becomes the key of the extracted element, the second field of the tuple becomes the value of the element, and the third field of the tuple contains the dictionary except for the extracted element.
Examples:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">pop({"a" : 32, "b" : 34}) -&gt; ("a", 32, {"b" : 34}) or
pop({"a" : 32, "b" : 34}) -&gt; ("b", 34, {"a" : 32})</code></pre>
</div>
</div>
</li>
</ul>
</div>
<div class="paragraph">
<p>
</p>
</div>
<div class="sect4">
<h5 id="tut-lists">Lists</h5>
<div class="paragraph">
<p>A list is an ordered collection of elements of the same type.
They are useful to model anything where duplicate values may occur or where order of the values is significant.
Examples are waiting customers in a shop, process steps in a recipe, or products stored in a warehouse.
Various operations are defined for lists.</p>
</div>
<div class="paragraph">
<p>An element can be fetched by <em>indexing</em>.
This indexing operation does not change the content of the variable.
The first element of a list has index <code>0</code>.
The last element of a list has index <code>size(xs) - 1</code>.
A negative index, say <code>m</code>, starts from the back of the list, or equivalently, at offset <code>size(xs) + m</code> from the front.
You cannot index non-existing elements.
Some examples, with <code>xs = [7, 8, 3, 5, 9]</code> are:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">xs[0] -&gt; 7
xs[3] -&gt; 5
xs[5] -&gt; ERROR (there is no element at position 5)
xs[-1] -&gt; xs[5 - 1] -&gt; xs[4] -&gt; 9
xs[-2] -&gt; xs[5 - 2] -&gt; xs[3] -&gt; 5</code></pre>
</div>
</div>
<div class="paragraph">
<p>
In <a href="#tut-figure-list-with-indices">A list with indices</a> the list with indices is visualized.
A common name for the first element of a list (i.e., <code>x[0]</code>) is the <em>head</em> of a list.
Similarly, the last element of a list (<code>xs[-1]</code>) is also known as <em>head right</em>.</p>
</div>
<div id="tut-figure-list-with-indices" class="imageblock">
<div class="content">
<img src="./tutorial/pictures/list_with_indices.png" alt="list with indices">
</div>
<div class="title">Figure 1. A list with indices</div>
</div>
<div class="paragraph">
<p>A part of a list can be fetched by <em>slicing</em>.
The slicing operation does not change the content of the list, it copies a contiguous sequence of a list.
The result of a slice operation is again a list, even if the slice contains just one element.</p>
</div>
<div class="paragraph">
<p>Slicing is denoted by <code>xs[i:j]</code>.
The slice of <code>xs[i:j]</code> is defined as the sequence of elements with index <code>k</code> such that <code>i &lt;= k &lt; j</code>.
Note the upper bound <code>j</code> is noninclusive.
If <code>i</code> is omitted use <code>0</code>.
If <code>j</code> is omitted use <code>size(xs)</code>.
If <code>i</code> is greater than or equal to <code>j</code>, the slice is empty.
If <code>i</code> or <code>j</code> is negative, the index is relative to the end of the list: <code>size(xs) + i</code> or <code>size(xs) + j</code> is substituted.
Some examples with <code>xs = [7, 8, 3, 5, 9]</code>:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">xs[1:3] -&gt; [8, 3]
xs[:2] -&gt; [7, 8]
xs[1:] -&gt; [8, 3, 5, 9]
xs[:-1] -&gt; [7, 8, 3, 5]
xs[:-3] -&gt; [7, 8]</code></pre>
</div>
</div>
<div class="paragraph">
<p>
The list of all but the first elements (<code>xs[1:]</code>) is often called <em>tail</em> and <code>xs[:-1]</code> is also known as <em>tail right</em>.
In <a href="#tut-figure-list-with-slices">A list with indices and slices</a> the slicing operator is visualized.</p>
</div>
<div id="tut-figure-list-with-slices" class="imageblock">
<div class="content">
<img src="./tutorial/pictures/list_with_slices.png" alt="list with slices">
</div>
<div class="title">Figure 2. A list with indices and slices</div>
</div>
<div class="paragraph">
<p>
Two lists can be 'glued' together into a new list.
The glue-ing or concatenation of a list with elements <code>7</code>, <code>8</code>, <code>3</code> and a list with elements <code>5</code>, and <code>9</code> is denoted by:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">[7, 8, 3] + [5, 9] -&gt; [7, 8, 3, 5, 9]</code></pre>
</div>
</div>
<div class="paragraph">
<p>An element can be added to a list at the rear or at the front.
The action is performed by transforming the element into a list and then concatenate these two lists.
In the next example the value <code>5</code> is added to the rear, respectively the front, of a list:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">[7, 8, 3] + [5] -&gt; [7, 8, 3, 5]
[5] + [7, 8, 3] -&gt; [5, 7, 8, 3]</code></pre>
</div>
</div>
<div class="paragraph">
<p>
Elements also can be removed from a list.
The <code>del</code> function removes by position, e.g. <code>del(xs, 2)</code> returns the list <code>xs</code> without its third element (since positions start at index 0).
Removing a value by value can be performed by the subtraction operator <code>-</code>.
For instance, consider the following subtractions:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">[1, 4, 2, 4, 5] - [2] -&gt; [1, 4, 4, 5]
[1, 4, 2, 4, 5] - [4] -&gt; [1, 2, 4, 5]
[1, 4, 2, 4, 5] - [8] -&gt; [1, 4, 2, 4, 5]</code></pre>
</div>
</div>
<div class="paragraph">
<p>Every element in the list at the right is searched in the list at the left, and if found, the <em>first</em> occurrence is removed.
In the first example, element <code>2</code> is removed.
In the second example, only the first value <code>4</code> is removed and the second value (at position 3) is kept.
In the third example, nothing is removed, since value <code>8</code> is not in the list at the left.</p>
</div>
<div class="paragraph">
<p>When the list at the right is longer than one element, the operation is repeated.
For example, consider <code>xs - ys</code>, whereby <code>xs = [1, 2, 3, 4, 5]</code> and <code>ys = [6, 4, 2, 3]</code>.
The result is computed as follows:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi"> [1, 2, 3, 4, 5] - [6, 4, 2, 3]
-&gt; ([1, 2, 3, 4, 5] - [6]) - [4, 2, 3]
-&gt; [1, 2, 3, 4, 5] - [4, 2, 3]
-&gt; ([1, 2, 3, 4, 5] - [4]) - [2, 3]
-&gt; [1, 2, 3, 5] - [2, 3]
-&gt; ([1, 2, 3, 5] - [2]) - [3]
-&gt; [1, 3, 5] - [3]
-&gt; [1,5]</code></pre>
</div>
</div>
<div class="paragraph">
<p>Lists have two relational operators, the equal operator and the not-equal operator.
The equal operator (<code>==</code>) compares two lists.
If the lists have the same number of elements and all the elements are pair-wise the same, the result of the operation is <code>true</code>, otherwise <code>false</code>.
The not-equal operator (<code>!=</code>) does the same check, but with an opposite result.
Some examples, with <code>xs = [7, 8, 3]</code>:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">xs == [7, 8, 3] -&gt; true
xs == [7, 7, 7] -&gt; false</code></pre>
</div>
</div>
<div class="paragraph">
<p>The membership operator (<code>in</code>) checks if an element is in a list.
Some examples, with <code>xs = [7, 8, 3]</code>:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">6 in xs -&gt; false
7 in xs -&gt; true
8 in xs -&gt; true</code></pre>
</div>
</div>
</div>
<div class="sect4">
<h5 id="tut-initialization">Initialization</h5>
<div class="paragraph">
<p>A list variable is initialized with a list with zero elements, for example in:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">list int xs;</code></pre>
</div>
</div>
<div class="paragraph">
<p>The initial value of <code>xs</code> equals <code>&lt;int&gt;[]</code>.</p>
</div>
<div class="paragraph">
<p>A list can be initialized with a number, denoting the number of elements in the list:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">list(2) int ys</code></pre>
</div>
</div>
<div class="paragraph">
<p>This declaration creates a list with <code>2</code> elements, whereby each element of type <code>int</code> is initialized.
The initial value of <code>ys</code> equals <code>[0, 0]</code>.
Another example with a list of lists:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">list(4) list(2) int zm</code></pre>
</div>
</div>
<div class="paragraph">
<p>This declaration initializes variable <code>zm</code> with the value <code>[ [0, 0], [0, 0], [0, 0], [0, 0] ]</code>.</p>
</div>
<div class="paragraph">
<p>
</p>
</div>
</div>
<div class="sect4">
<h5 id="tut-sets">Sets</h5>
<div class="paragraph">
<p>Set operators for union, intersection and difference are present.
<a href="#tut-table-set-operations">Table with set operations</a> gives the name, the mathematical notation and the notation in the Chi language.</p>
</div>
<table id="tut-table-set-operations" class="tableblock frame-all grid-all stretch">
<caption class="title">Table 5. Table with set operations</caption>
<colgroup>
<col style="width: 33.3333%;">
<col style="width: 33.3333%;">
<col style="width: 33.3334%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top">Operator</th>
<th class="tableblock halign-left valign-top">Math</th>
<th class="tableblock halign-left valign-top">Chi</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">set union</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">∪</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>+</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">set intersection</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">∩</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>*</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">set difference</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">∖</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>-</code></p></td>
</tr>
</tbody>
</table>
<div class="paragraph">
<p>The union of two sets merges the values of both sets into one, that is, the result is the collection of values that appear in at least one of the arguments of the union operation.
Some examples:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">{3, 7, 8} + {5, 9} -&gt; {3, 5, 7, 8, 9}</code></pre>
</div>
</div>
<div class="paragraph">
<p>All permutations with the elements <code>3</code>, <code>5</code>, <code>7</code>, <code>8</code> and <code>9</code> are correct (sets have no order, all permutations are equivalent).
To keep sets readable the elements are sorted in increasing order in this tutorial.</p>
</div>
<div class="paragraph">
<p>Values that occur in both arguments, appear only one time in the result (sets silently discard duplicate elements).
For example:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">{3, 7, 8} + {7, 9} -&gt; {3, 7, 8, 9}</code></pre>
</div>
</div>
<div class="paragraph">
<p>The intersection of two sets gives a set with the common elements, that is, all values that occur in <em>both</em> arguments.
Some examples:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">{3, 7, 8} * {5, 9} -&gt; &lt;int&gt;{} # no common element
{3, 7, 8} * {7, 9} -&gt; {7} # only 7 in common</code></pre>
</div>
</div>
<div class="paragraph">
<p>Set difference works much like subtraction on lists, except elements occur at most one time (and have no order).
The operation computes 'remaining elements'.
The result is a new set containing all values from the first set which are not in the second set.
Some examples:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">{3, 7, 8} - {5, 9} -&gt; {3, 7, 8}
{3, 7, 8} - {7, 9} -&gt; {3, 9}</code></pre>
</div>
</div>
<div class="paragraph">
<p>The membership operator <code>in</code> works on sets too:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">3 in {3, 7, 8} -&gt; true
9 in {3, 7, 8} -&gt; false</code></pre>
</div>
</div>
<div class="paragraph">
<p>
</p>
</div>
</div>
<div class="sect4">
<h5 id="tut-dictionaries">Dictionaries</h5>
<div class="paragraph">
<p>Elements of dictionaries are stored according to a key, while lists elements are ordered by a (relative) position, and set elements are not ordered at all.
A dictionary can grow and shrink by adding or removing elements respectively, like a list or a set.
An element of a dictionary is accessed by the key of the element.</p>
</div>
<div class="paragraph">
<p>The dictionary variable <code>d</code> of type <code>dict(string : int)</code> is given by:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">dict (string : int) d =
{"jim" : 32,
"john" : 34,
"adam" : 25}</code></pre>
</div>
</div>
<div class="paragraph">
<p>Retrieving values of the dictionary by using the key:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">d["john"] -&gt; 34
d["adam"] -&gt; 25</code></pre>
</div>
</div>
<div class="paragraph">
<p>Using a non-existing key to retrieve a value results in a error message.</p>
</div>
<div class="paragraph">
<p>A new value can be assigned to the variable by selecting the key of the element:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">d["john"] = 35</code></pre>
</div>
</div>
<div class="paragraph">
<p>This assignment changes the value of the <code>"john"</code> item to <code>35</code>.
The assignment can also be used to add new items:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">d["lisa"] = 19</code></pre>
</div>
</div>
<div class="paragraph">
<p>Membership testing of keys in dictionaries can be done with the <code>in</code> operator:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">"jim" in d -&gt; true
"peter" in d -&gt; false</code></pre>
</div>
</div>
<div class="paragraph">
<p>Merging two dictionaries is done by adding them together.
The value of the second dictionary is used when a key exists in both dictionaries:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">{1 : 1, 2 : 2} + {1 : 5, 3 : 3} -&gt; {1 : 5, 2 : 2, 3 : 3}</code></pre>
</div>
</div>
<div class="paragraph">
<p>The left dictionary is copied, and updated with each item of the right dictionary.</p>
</div>
<div class="paragraph">
<p>Removing elements can be done with subtraction, based on key values.
Lists and sets can also be used to denote which keys should be removed.
A few examples for <code>p</code> is <code>{1 : 1, 2 : 2}</code>:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">p - {1 : 3, 5 : 5} -&gt; {2 : 2}
p - {1, 7} -&gt; {2 : 2}
p - [2, 8] -&gt; {1 : 1}</code></pre>
</div>
</div>
<div class="paragraph">
<p>Subtracting keys that do not exist in the left dictionary is allowed and has no effect.</p>
</div>
<div class="paragraph">
<p></p>
</div>
</div>
</div>
<div class="sect3">
<h4 id="tut-custom-types">Custom types</h4>
<div class="paragraph">
<p>To structure data the language allows the creation of new types.
The definition can only be done at global level, that is, outside any <code>proc</code>, <code>func</code>, <code>model</code>, or <code>xper</code> definition.</p>
</div>
<div class="paragraph">
<p>Types can be used as alias for elementary data types to increase readability, for example a variable of type <code>item</code>:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">type item = real;</code></pre>
</div>
</div>
<div class="paragraph">
<p>Variables of type <code>item</code> are, e.g.:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">item box, product;
box = 4.0; product = 120.5;</code></pre>
</div>
</div>
<div class="paragraph">
<p>This definition creates the possibility to speak about an item.</p>
</div>
<div class="paragraph">
<p>Types also can be used to make combinations of other data types, e.g. a recipe:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">type step = tuple(string name; real process_time),
recipe = tuple(int id; list step steps);</code></pre>
</div>
</div>
<div class="paragraph">
<p>A type <code>step</code> is defined by a <code>tuple</code> with two fields, a field with <code>name</code> of type <code>string</code>, denoting the name of the step, and a field with <code>process_time</code> of type <code>real</code>, denoting the duration of the (processing) step.
The <code>step</code> definition is used in the type <code>recipe</code>.
Type <code>recipe</code> is defined by a <code>tuple</code> with two fields, an <code>id</code> of type <code>int</code>, denoting the identification number, and a field <code>steps</code> of type <code>list step</code>, denoting a list of single steps.
Variables of type recipe are, e.g.:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">recipe plate, bread;
plate = (34, [("s", 10.8), ("w", 13.7), ("s", 25.6)]);
bread = (90, [("flour", 16.3), ("yeast", 6.9)]);</code></pre>
</div>
</div>
</div>
<div class="sect3">
<h4 id="tut-exercises-2">Exercises</h4>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Exercises for integer numbers.
What is the result of the following expressions:</p>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">-5 ^ 3
-5 * 3
5 mod 3</code></pre>
</div>
</div>
</li>
<li>
<p>Exercises for tuples.
Given are tuple type <code>box</code> and variable <code>x</code> of type <code>box</code>:</p>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">type box = tuple(string name; real weight);
box x = ("White", 12.5);</code></pre>
</div>
</div>
<div class="paragraph">
<p>What is the result of the following expressions:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">x.name
x.real
x</code></pre>
</div>
</div>
</li>
<li>
<p>Exercises for lists.
Given is the list <code>xs = [0,1,2,3,4,5,6]</code>.
Determine the outcome of:</p>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">xs[0]
xs[1:]
size(xs)
xs + [3]
[4,5] + xs
xs - [2,2,3]
xs - xs[2:]
xs[0] + (xs[1:])[0]</code></pre>
</div>
</div>
</li>
</ol>
</div>
</div>
</div>
<div class="sect2">
<h3 id="tut-chapter-statements">Statements</h3>
<div class="paragraph">
<p>There are several kinds of statements, such as assignment statements, choice statements (select and if statements), and loop statements (while and for statements).</p>
</div>
<div class="paragraph">
<p>Semicolons are required after statements, except at the end of a sequence (that is, just before an <code>end</code> keyword and after the last statement) or after the keyword <code>end</code>.
In this text semicolons are omitted before <code>end</code>.</p>
</div>
<div class="paragraph">
<p>
</p>
</div>
<div class="sect3">
<h4 id="tut-the-assignment-statement">The assignment statement</h4>
<div class="paragraph">
<p>An <em>assignment</em> statement is used to assign values to variables.
An example:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">y = x + 10</code></pre>
</div>
</div>
<div class="paragraph">
<p>This assignment consists of a name of the variable (<code>y</code>), an assignment symbol (<code>=</code>), and an expression (<code>x + 10</code>) yielding a value.
For example, when <code>x</code> is <code>2</code>, the value of the expression is <code>12</code>.
Execution of this statement copies the value to the <code>y</code> variable, immediately after executing the assignment, the value of the <code>y</code> variable is <code>10</code> larger than the value of the <code>x</code> variable at this point of the program.
The value of the <code>y</code> variable will not change until the next assignment to <code>y</code>, for example, performing the assignment <code>x = 7</code> has no effect on the value of the <code>y</code> variable.</p>
</div>
<div class="paragraph">
<p>An example with two assignment statements:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">i = 2;
j = j + 1</code></pre>
</div>
</div>
<div class="paragraph">
<p>The values of <code>i</code> becomes 2, and the value of <code>j</code> is incremented.
Independent assignments can also be combined in a multi-assignment, for example:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">i, j = 2, j + 1</code></pre>
</div>
</div>
<div class="paragraph">
<p>The result is the same as the above described example, the first value goes into the first variable, the second value into the second variable, etc.</p>
</div>
<div class="paragraph">
<p>In an assignment statement, first all expression values are computed before any assignment is actually done.
In the following example the values of <code>x</code> and <code>y</code> are swapped:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">x, y = y, x;</code></pre>
</div>
</div>
<div class="paragraph">
<p>
</p>
</div>
</div>
<div class="sect3">
<h4 id="tut-the-if-statement">The <code>if</code> statement</h4>
<div class="paragraph">
<p>The <em>if</em> statement is used to express decisions.
An example:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">if x &lt; 0:
y = -x
end</code></pre>
</div>
</div>
<div class="paragraph">
<p>If the value of <code>x</code> is negative, assign its negated value to <code>y</code>.
Otherwise, do nothing (skip the <code>y = -x</code> assignment statement).</p>
</div>
<div class="paragraph">
<p>To perform a different statement when the decision fails, an <code>if</code>-statement with an <code>else</code> alternative can be used.
It has the following form.
An example:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">if a &gt; 0:
c = a
else:
c = b
end</code></pre>
</div>
</div>
<div class="paragraph">
<p>If <code>a</code> is positive, variable <code>c</code> gets the value of <code>a</code>, otherwise it gets the value of <code>b</code>.</p>
</div>
<div class="paragraph">
<p>In some cases more alternatives must be tested.
One way of writing it is by nesting an <code>if</code>-statement in the <code>else</code> alternative of the previous <code>if</code>-statement, like:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">if i &lt; 0:
writeln("i &lt; 0")
else:
if i == 0:
writeln("i = 0")
else:
if i &gt; 0 and i &lt; 10:
writeln("0 &lt; i &lt; 10")
else:
# i must be greater or equal 10
writeln("i &gt;= 10")
end
end
end</code></pre>
</div>
</div>
<div class="paragraph">
<p>This tests <code>i &lt; 0</code>.
If it fails, the <code>else</code> is chosen, which contains a second <code>if</code>-statement with the <code>i == 0</code> test.
If that test also fails, the third condition <code>i &gt; 0 and i &lt; 10</code> is tested, and one of the <code>writeln</code> statements is chosen.</p>
</div>
<div class="paragraph">
<p>The above can be written more compactly by combining an <code>else</code>-part and the <code>if</code>-statement that follows, into an <code>elif</code> part.
Each <code>elif</code> part consists of a boolean expression, and a statement list.
Using <code>elif</code> parts results in:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">if i &lt; 0:
writeln("i &lt; 0")
elif i == 0:
writeln("i = 0")
elif i &gt; 0 and i &lt; 10:
writeln("0 &lt; i &lt; 10")
else:
# i must be greater or equal 10
writeln("i &gt;= 10")
end</code></pre>
</div>
</div>
<div class="paragraph">
<p>Each alternative starts at the same column, instead of having increasing indentation.
The execution of this combined statement is still the same, an alternative is only tested when the conditions of all previous alternatives fail.</p>
</div>
<div class="paragraph">
<p>
Note that the line <code># i must be greater or equal 10</code> is a comment to clarify when the alternative is chosen.
It is not executed by the simulator.
You can write comments either at a line by itself like above, or behind program code.
It is often useful to clarify the meaning of variables, give a more detailed explanation of parameters, or add a line of text describing what the purpose of a block of code is from a birds-eye view.</p>
</div>
<div class="paragraph">
<p>
</p>
</div>
</div>
<div class="sect3">
<h4 id="tut-the-while-statement">The <code>while</code> statement</h4>
<div class="paragraph">
<p>The <em>while</em> statement is used for repetitive execution of the same statements, a so-called <em>loop</em>.
A fragment that calculates the sum of <code>10</code> integers, <code>10, 9, 8, ..., 3, 2, 1</code>, is:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">int i = 10, sum;
while i &gt; 0:
sum = sum + i; i = i - 1
end</code></pre>
</div>
</div>
<div class="paragraph">
<p>Each iteration of a <code>while</code> statement starts with evaluating its condition (<code>i &gt; 0</code> above).
When it holds, the statements inside the while (the <code>sum = sum + i; i = i - 1</code> assignments) are executed (which adds <code>i</code> to the sum and decrements <code>i</code>).
At the end of the statements, the <code>while</code> is executed again by evaluating the condition again.
If it still holds, the next iteration of the loop starts by executing the assignment statements again, etc.
When the condition fails (<code>i</code> is equal to <code>0</code>), the <code>while</code> statement ends, and execution continues with the statement following <code>end</code>.</p>
</div>
<div class="paragraph">
<p>A fragment with an infinite loop is:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">while true:
i = i + 1;
...
end</code></pre>
</div>
</div>
<div class="paragraph">
<p>The condition in this fragments always holds, resulting in <code>i</code> getting incremented 'forever'.
Such loops are very useful to model things you switch on but never off, e.g. processes in a factory.</p>
</div>
<div class="paragraph">
<p>A fragment to calculate <code>z = x ^ y</code>, where <code>z</code> and <code>x</code> are of type <code>real</code>, and <code>y</code> is of type <code>integer</code> with a non-negative value, showing the use of two <code>while</code> loops, is:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">real x; int y; real z = 1;
while y &gt; 0:
while y mod 2 == 0:
y = y div 2; x = x * x
end;
y = y - 1; z = x * z
end</code></pre>
</div>
</div>
<div class="paragraph">
<p>A fragment to calculate the greatest common divisor (GCD) of two integer numbers <code>j</code> and <code>k</code>, showing the use of <code>if</code> and <code>while</code> statements, is:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">while j != k:
if j &gt; k:
j = j - k
else:
k = k - j
end
end</code></pre>
</div>
</div>
<div class="paragraph">
<p>The symbol <code>!=</code> stands for 'differs from' ('not equal').</p>
</div>
<div class="paragraph">
<p>
</p>
</div>
</div>
<div class="sect3">
<h4 id="tut-for-statement">The <code>for</code> statement</h4>
<div class="paragraph">
<p>The while statement is useful for looping until a condition fails.
The <em>for</em> statement is used for iterating over a collection of values.
A fragment with the calculation of the sum of <code>10</code> integers:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">int sum;
for i in range(1, 11):
sum = sum + i
end</code></pre>
</div>
</div>
<div class="paragraph">
<p>
The result of the expression <code>range(1, 11)</code> is a list whose items are consecutive integers from <code>1</code> (included) up to <code>11</code> (excluded): <code>[1, 2, 3, ..., 9, 10]</code>.</p>
</div>
<div class="paragraph">
<p>The following example illustrates the use of the for statement in relation with container-type variables.
Another way of calculating the sum of a list of integer numbers:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">list int xs = [1, 2, 3, 5, 7, 11, 13];
int sum;
for x in xs:
sum = sum + x
end</code></pre>
</div>
</div>
<div class="paragraph">
<p>This statement iterates over the elements of list <code>xs</code>.
This is particularly useful when the value of <code>xs</code> may change before the <code>for</code> statement.</p>
</div>
</div>
<div class="sect3">
<h4 id="tut-notes">Notes</h4>
<div class="paragraph">
<p>In this chapter the most used statements are described.
Below are a few other statements that may be useful some times:</p>
</div>
<div class="paragraph">
<p>
. Inside loop statements, the <em>break</em> and <em>continue</em> statements are allowed.
The <code>break</code> statements allows 'breaking out of a loop', that is, abort a while or a for statement.
The <code>continue</code> statement aborts execution of the statements in a loop.
It 'jumps' to the start of the next iteration.</p>
</div>
<div class="paragraph">
<p>
. A rarely used statement is the <code>pass</code> statement.
It&#8217;s like an <code>x = x</code> assignment statement, but more clearly expresses 'nothing is done here'.</p>
</div>
</div>
<div class="sect3">
<h4 id="tut-exercises-3">Exercises</h4>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Study the Chi specification below and explain why, though it works, it is not an elegant way of modeling the selection.
Make a suggestion for a shorter, more elegant version of:</p>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">model M():
int i = 3;
if (i &lt; 0) == true:
write("%d is a negative number\n", i);
elif (i &lt;= 0) == false:
write("%d is a positive number\n", i);
end
end</code></pre>
</div>
</div>
</li>
<li>
<p>Construct a list with the squares of the integers 1 to 10.</p>
<div class="olist loweralpha">
<ol class="loweralpha" type="a">
<li>
<p>using a <code>for</code> statement, and</p>
</li>
<li>
<p>using a <code>while</code> statement.</p>
</li>
</ol>
</div>
</li>
<li>
<p>Write a program that</p>
<div class="olist loweralpha">
<ol class="loweralpha" type="a">
<li>
<p>Makes a list with the first 50 prime numbers.</p>
</li>
<li>
<p>Extend the program with computing the sum of the first 7 prime numbers.</p>
</li>
<li>
<p>Extend the program with computing the sum of the last 11 prime numbers.</p>
</li>
</ol>
</div>
</li>
</ol>
</div>
<div class="paragraph">
<p></p>
</div>
</div>
</div>
<div class="sect2">
<h3 id="tut-chapter-functions">Functions</h3>
<div class="paragraph">
<p>In a model, computations must be performed to process the information that is sent around.
Short and simple calculations are written as assignments between the other statements, but for longer computations or computations that are needed at several places in the model, a more encapsulated environment is useful, a <em>function</em>.
In addition, the language comes with a number of built-in functions, such as <code>size</code> or <code>empty</code> on container types.
An example:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">func real mean(list int xs):
int sum;
for x in xs:
sum = sum + x
end;
return sum / size(xs)
end</code></pre>
</div>
</div>
<div class="paragraph">
<p>The <code>func</code> keyword indicates it is a function.
The name of the function is just before the opening parenthesis, in this example <code>mean</code>.
Between the parentheses, the input values (the <em>formal parameters</em>) are listed.
In this example, there is one input value, namely <code>list int</code> which is a list of integers.
Parameter name <code>xs</code> is used to refer to the input value in the body of the function.
Between <code>func</code> and the name of the function is the type of the computation result, in this case, a <code>real</code> value.
In other words, this <code>mean</code> function takes a list of integers as input, and produces a <code>real</code> value as result.</p>
</div>
<div class="paragraph">
<p>
The colon at the end of the first line indicates the start of the computation.
Below it are new variable declarations (<code>int sum</code>), and statements to compute the value, the <em>function algorithm</em>.
The <code>return</code> statement denotes the end of the function algorithm.
The value of the expression behind it is the result of the calculation.
This example computes and returns the mean value of the integers of the list.</p>
</div>
<div class="paragraph">
<p>Use of a function (<em>application</em> of a function) is done by using its name, followed by the values to be used as input (the <em>actual parameters</em>).
The above function can be used like:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">m = mean([1, 3, 5, 7, 9])</code></pre>
</div>
</div>
<div class="paragraph">
<p>The actual parameter of this function application is <code>[1, 3, 5, 7, 9]</code>.
The function result is <code>(1 + 3 + 5 + 7 + 9)/5</code> (which is <code>5.0</code>), and variable <code>m</code> becomes <code>5.0</code>.</p>
</div>
<div class="paragraph">
<p>
A function is a mathematical function: the result of a function is the same for the same values of input parameters.
A function has no <em>side-effect</em>, and it cannot access variables outside the body.
For example, it cannot access <code>time</code> (explained in <a href="#tut-servers-with-time">Servers with time</a>) directly, it has to be passed in through the parameter list.</p>
</div>
<div class="paragraph">
<p>A function that calculates the sign of a real number, is:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">func int sign(real r):
if r &lt; 0:
return -1
elif r = 0:
return 0
end;
return 1
end</code></pre>
</div>
</div>
<div class="paragraph">
<p>The sign function returns:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>if <code>r</code> is smaller than zero, the value minus one;</p>
</li>
<li>
<p>if <code>r</code> equals zero, the value zero; and</p>
</li>
<li>
<p>if <code>r</code> is greater than zero, the value one.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>The computation in a function ends when it encounters a <code>return</code> statement.
The <code>return 1</code> at the end is therefore only executed when both <code>if</code> conditions are false.</p>
</div>
<div class="paragraph">
<p>
</p>
</div>
<div class="sect3">
<h4 id="tut-sorted-lists">Sorted lists</h4>
<div class="paragraph">
<p>The language allows <em>recursive</em> functions as well as <em>higher-order</em> functions.
Explaining them in detail is beyond the scope of this tutorial, but these functions are useful for making and maintaining sorted lists.
Such a sorted list is useful for easily getting the smallest (or largest) item from a collection, for example the order with the nearest deadline.</p>
</div>
<div class="paragraph">
<p>To sort a list, the first notion that has to be defined is the desired order, by making a function of the following form:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">func bool decreasing(int x, y):
return x &gt;= y
end</code></pre>
</div>
</div>
<div class="paragraph">
<p>The function is called <em>predicate function</em>.
It takes two values from the list (two integers in this case), and produces a boolean value, indicating whether the parameters are in the right order.
In this case, the function returns <code>true</code> when the first parameter is larger or equal than the second parameter, that is, larger values must be before smaller values (for equal values, the order does not matter).
This results in a list with decreasing values.</p>
</div>
<div class="paragraph">
<p>The requirements on <em>any</em> predicate function <code>f</code> are:</p>
</div>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>If <code>x != y</code>, either <code>f(x, y)</code> must hold or <code>f(y, x)</code> must hold, but not both.
(Unequal values must have a unique order.)</p>
</li>
<li>
<p>If <code>x == y</code>, both <code>f(x, y)</code> and <code>f(y, x)</code> must hold.
(Equal values can be placed in arbitrary order.)</p>
</li>
<li>
<p>For values <code>x</code>, <code>y</code>, and <code>z</code>, if <code>f(x, y)</code> holds and <code>f(y, z)</code> holds (that is <code>x &gt;= y</code> and <code>y &gt;= z</code>), then <code>f(x, z)</code> must also hold (that is, <code>x &gt;= z</code> should also be true).</p>
</li>
</ol>
</div>
<div class="paragraph">
<p>(The order between <code>x</code> and <code>z</code> must be stable, even when you compare with an intermediate value <code>y</code> between <code>x</code> and <code>z</code>.)</p>
</div>
<div class="paragraph">
<p>These requirements hold for functions that test on <code>&lt;=</code> or <code>&gt;=</code> between two values, like above.</p>
</div>
<div class="paragraph">
<p>If you do not provide a proper predicate function, the result may not be sorted as you expect, or the simulator may abort when it fails to find a proper sorting order.</p>
</div>
<div class="paragraph">
<p>
</p>
</div>
<div class="sect4">
<h5 id="tut-sort">Sort</h5>
<div class="paragraph">
<p>The first use of such a predicate function is for sorting a list.
For example list <code>[3, 8, 7]</code> is sorted decreasingly (larger numbers before smaller numbers) with the following statement:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">ys = sort([3, 8, 7], decreasing)</code></pre>
</div>
</div>
<div class="paragraph">
<p>Sorting is done with the <em>sort</em> function, it takes two parameters, the list to sort, and the predicate <em>function</em>.
(There are no parentheses <code>()</code> behind <code>decreasing</code>!) The value of list <code>ys</code> becomes <code>[8, 7, 3]</code>.</p>
</div>
<div class="paragraph">
<p>Another sorting example is a list of type <code>tuple(int number, real slack)</code>, where field <code>number</code> denotes the number of an item, and field <code>slack</code> denotes the slack time of the item.
The list should be sorted in ascending order of the slack time.
The type of the item is:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">type item = tuple(int number, real slack);</code></pre>
</div>
</div>
<div class="paragraph">
<p>The predicate function <code>spred</code> is defined by:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">func bool spred(item x, y):
return x.slack &lt;= y.slack
end</code></pre>
</div>
</div>
<div class="paragraph">
<p>Function <code>spred</code> returns <code>true</code> if the two elements are in increasing order in the list, otherwise <code>false</code>.
Note, the parameters of the function are of type <code>item</code>.
Given a variable <code>ps</code> equal to <code>[(7, 21.6), (5, 10.3), (3, 35.8)]</code>.
The statement denoting the sorting is:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">qs = sort(ps, spred)</code></pre>
</div>
</div>
<div class="paragraph">
<p>variable <code>qs</code> becomes <code>[(5, 10.3), (7, 21.6), (3, 35.8)]</code>.</p>
</div>
<div class="paragraph">
<p>
</p>
</div>
</div>
<div class="sect4">
<h5 id="tut-insert">Insert</h5>
<div class="paragraph">
<p>Adding a new value to a sorted list is the second use of higher-order functions.
The simplest approach would be to add the new value to the head or rear of the list, and sort the list again, but sorting an almost sorted list is very expensive.
It is much faster to find the right position in the already sorted list, and insert the new value at that point.
This function also exists, and is named <code>insert</code>.
An example is (assume <code>xs</code> initially contains <code>[3,8]</code>):</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">xs = insert(xs, 7, increasing)</code></pre>
</div>
</div>
<div class="paragraph">
<p>where <code>increasing</code> is:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">func bool increasing(int x, y):
return x &lt;= y
end</code></pre>
</div>
</div>
<div class="paragraph">
<p>The <code>insert</code> call assigns the result <code>[3,7,8]</code> as new value to <code>xs</code>, <code>7</code> is inserted in the list.</p>
</div>
</div>
</div>
</div>
<div class="sect2">
<h3 id="tut-chapter-input-and-output">Input and output</h3>
<div class="paragraph">
<p>A model communicates with the outside world, e.g. screen and files, by the use of read statements for input of data, and write statements for output of data.</p>
</div>
<div class="paragraph">
<p>
</p>
</div>
<div class="sect3">
<h4 id="tut-the-read-function">The <code>read</code> function</h4>
<div class="paragraph">
<p>Data can be read from the command line or from a file by <em>read</em> functions.
A read function requires a type value for each parameter to be read.
An example:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">int i; string s;
i = read(int);
s = read(string);</code></pre>
</div>
</div>
<div class="paragraph">
<p>Two values, an integer value and a string value are read from the command line.
On the command line the two values are typed:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-console" data-lang="console">1 "This is a string"</code></pre>
</div>
</div>
<div class="paragraph">
<p>Variable <code>i</code> becomes <code>1</code>, and string <code>s</code> becomes <code>"This is a string"</code>.
The double quotes are required!
Parameter values are separated by a space or a tabular stop.
Putting each value on a separate line also works.</p>
</div>
<div class="paragraph">
<p>
</p>
</div>
</div>
<div class="sect3">
<h4 id="tut-reading-from-file">Reading from a file</h4>
<div class="paragraph">
<p>Data also can be read from files.
An example fragment:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">type row = tuple(string name; list int numbers);
file f;
int i;
list row rows;
f = open("data_file.txt", "r");
i = read(f, int);
rows = read(f, list row);
close(f)</code></pre>
</div>
</div>
<div class="paragraph">
<p>Before a file can be used, the file has to be declared, <em>and</em> the file has to be opened by statement <code>open</code>.
Statement <code>open</code> has two parameters, the first parameter denotes the file name (as a string), and the second parameter describes the way the file is used.
In this case, the file is opened in a read-only mode, denoted by string "r".</p>
</div>
<div class="paragraph">
<p>Reading values works in the same way as before, except you cannot add new text in the file while reading it.
Instead, the file is processed sequentially from begin to end, with values separated from each other by white space (spaces, tabs, and new-lines).
You can read values of different types from the same file, as long as the value in the file matches with the type that you ask.
For example, the above Chi program could read the following data from <code>data_file.txt</code>:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-console" data-lang="console">21
[("abc", [7,21]),
("def", [8,31,47])]</code></pre>
</div>
</div>
<div class="paragraph">
<p>After enough values have been read, the file should be closed with the statement <code>close</code>, with one parameter, the variable of the file.
If a file is still open after an experiment, the file is closed automatically before the program quits.</p>
</div>
</div>
<div class="sect3">
<h4 id="tut-advanced-file-reading">Advanced reading from a file</h4>
<div class="paragraph">
<p>When reading from a file, the <code>eof</code> and <code>eol</code> functions can be used to obtain information about the white space around the values.</p>
</div>
<div class="ulist">
<ul>
<li>
<p>The <code>eof</code> (end of file) function returns <code>true</code> if you have read the last value (that is, there are no more values to read).</p>
</li>
<li>
<p>The <code>eol</code> (end of line) function returns <code>true</code> if there are no more values at the current line.
In particular, the <code>eol</code> function returns <code>true</code> when the end of the file has been reached.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>These functions can be used to customize reading of more complicated values.
As an example, you may want to read the same <code>list row</code> value as above, but without having all the comma&#8217;s, quotes, parentheses, and brackets of the literal value <code>[("abc", [7,21]), ("def", [8,31,47])]</code>.
Instead, imagine having a file <code>clean_data.txt</code> with the following layout:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-console" data-lang="console">abc 7 21
def 8 31 47</code></pre>
</div>
</div>
<div class="paragraph">
<p>Each line is one row.
It starts with a one-word string, followed by a list of integer numbers.
By using the <code>eof</code> and <code>eol</code> functions, you can read this file in the following way:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">file f;
list row rows;
string name;
list int xs;
f = open("clean_data.txt", "r");
while not eof(f):
name = read(f, string);
xs = &lt;int&gt;[];
while not eol(f): # Next value is at the same line.
xs = xs + [read(f, int)];
end
rows = rows + [(name, xs)];
end
close(f);</code></pre>
</div>
</div>
<div class="paragraph">
<p>Each line is processed individually, where <code>eol</code> is used to find out whether the last value of a line has been read.
The reading loop terminates when <code>eof</code> returns <code>true</code>.</p>
</div>
<div class="paragraph">
<p>Note that <code>eol</code> returns whether the current line has no more values.
It does not tell you how many lines down the next value is.
For example, an empty line inserted between the <code>abc 7 21</code> line and the <code>def 8 31 47</code> line is skipped silently.
If you want that information, you can use the <code>newlines</code> function instead.</p>
</div>
<div class="paragraph">
<p>
</p>
</div>
</div>
<div class="sect3">
<h4 id="tut-the-write-statement">The <code>write</code> statement</h4>
<div class="paragraph">
<p>The <em>write</em> statement is used for for output of data to the screen of the computer.
Data can also be written to a file.</p>
</div>
<div class="paragraph">
<p>The first argument of <code>write</code> (or the second argument if you write to a file, see below) Is called the <em>format string</em>.
It is a template of the text to write, with 'holes' at the point where a data value is to be written.</p>
</div>
<div class="paragraph">
<p>Behind the format string, the data values to write are listed.
The first value is written in the first 'hole', the second value in the second 'hole' and so on.
The holes are also called <em>place holders</em>.
A place holder starts with <code>%</code> optionally followed by numbers or some punctuation (its meaning is explained below).
A place holder ends with a <em>format specifier</em>, a single letter like <code>s</code> or <code>f</code>.
An example:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">int i = 5;
write("i equals %s", i)</code></pre>
</div>
</div>
<div class="paragraph">
<p>In this example the text <code>i equals 5</code> is written to the screen by the <code>write</code> statement.
The <code>"i equals %s"</code> format string defines what output is written.
All 'normal' characters are copied as-is.
The <code>%s</code> place holder is not copied.
Instead the first data value (in this case <code>i</code>) is inserted.</p>
</div>
<div class="paragraph">
<p>The <code>s</code> in the place holder is the format specifier.
It means 'print as string'.
The <code>%s</code> is a general purpose format specifier, it works with almost every type of data.
For example:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">list dict(int:real) xs = [{1 : 5.3}];
write("%s", xs)</code></pre>
</div>
</div>
<div class="paragraph">
<p>will output the contents of <code>xs</code> (<code>{1 : 5.3}</code>).</p>
</div>
<div class="paragraph">
<p>In general, this works nicely, but for numeric values a little more control over the output is often useful.
To this end, there are also format specifiers <code>d</code> for integer numbers, and <code>f</code> for real numbers.
An example:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">int i = 5;
real r = 3.14;
write("%4d/%8.2f", i, r)</code></pre>
</div>
</div>
<div class="paragraph">
<p>This fragment has the effect that the values of <code>i</code> and <code>r</code> are written to the screen as follows:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-console" data-lang="console"> 5/ 3.14</code></pre>
</div>
</div>
<div class="paragraph">
<p>The value of <code>i</code> is written in <code>d</code> format (as <code>int</code> value), and the value of <code>r</code> is written in <code>f</code> format (as <code>real</code> value).
The symbols <code>d</code> and <code>f</code> originate respectively from 'decimal', and 'floating point' numbers.
The numbers <code>4</code> respectively <code>8.2</code> denote that the integer value is written four positions wide (that is, 3 spaces and a <code>5</code> character), and that the real value is written eight positions wide, with two characters after the decimal point (that is, 4 spaces and the text <code>3.14</code>).</p>
</div>
<div class="paragraph">
<p>A list of format specifiers is given in <a href="#tut-table-format-specifiers">Format specifiers</a>.</p>
</div>
<table id="tut-table-format-specifiers" class="tableblock frame-all grid-all stretch">
<caption class="title">Table 6. Format specifiers</caption>
<colgroup>
<col style="width: 50%;">
<col style="width: 50%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top">Format specifier</th>
<th class="tableblock halign-left valign-top">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>%b</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">boolean value (outputs <code>false</code> or <code>true</code>)</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>%d</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">integer</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>%10d</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">integer, at least ten characters wide</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>%f</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">real</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>%10f</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">real, at least ten characters wide</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>%.4f</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">real, four characters after the decimal point</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>%10.4f</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">real, at least ten characters wide with four characters after the decimal point</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>%s</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">character string <code>s</code>, can also write other types of data</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>%%</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">the character <code>%</code></p></td>
</tr>
</tbody>
</table>
<div class="paragraph">
<p>Finally, there are also a few special character sequences called <em>escape sequence</em> which allow to write characters like horizontal tab (which means 'jump to next tab position in the output'), or newline (which means 'go to the next line in the output') in a string.
An escape sequence consists of two characters.
First a backslash character <code>\</code>, followed by a second character.
The escape sequence are presented in <a href="#tut-table-escape-sequences">Escape sequences in strings</a>.</p>
</div>
<table id="tut-table-escape-sequences" class="tableblock frame-all grid-all stretch">
<caption class="title">Table 7. Escape sequences in strings</caption>
<colgroup>
<col style="width: 50%;">
<col style="width: 50%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top">Sequence</th>
<th class="tableblock halign-left valign-top">Meaning</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>\n</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">new line</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>\t</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">horizontal tab</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>\"</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">the character <code>"</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>\\</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">the character <code>\</code></p></td>
</tr>
</tbody>
</table>
<div class="paragraph">
<p>An example is:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">int i = 5, j = 10;
real r = 3.14;
write("%6d\t%d\n\t%.2f\n", i, j, r)</code></pre>
</div>
</div>
<div class="paragraph">
<p>The result looks like:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-console" data-lang="console"> 5 10
3.14</code></pre>
</div>
</div>
<div class="paragraph">
<p>The value of <code>j</code> is written at the tab position, the output goes to the next line again at the first tab position, and outputs the value of <code>r</code>.</p>
</div>
<div class="paragraph">
<p>
</p>
</div>
</div>
<div class="sect3">
<h4 id="tut-writing-to-file">Writing to a file</h4>
<div class="paragraph">
<p>Data can be written to a file, analog to the read function.
A file has to be defined first, and opened for writing before the file can be used.
An example:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">file f;
int i;
f = open("output_file", "w");
write(f, "%s", i); write(f, "%8.2f", r);
close(f)</code></pre>
</div>
</div>
<div class="paragraph">
<p>A file, in this case <code>"output_file"</code> is used in write-only mode, denoted by the character <code>"w"</code>.
Opening a file for writing destroys its old contents (if the file already exists).
In the write statement, the first parameter must be the file, and the second parameter must be the format string.</p>
</div>
<div class="paragraph">
<p>After all data has been written, the file is closed by statement <code>close</code>.
If the file is still open after execution of the program, the file is closed automatically.</p>
</div>
</div>
</div>
<div class="sect2">
<h3 id="tut-chapter-stochastic-behavior">Modeling stochastic behavior</h3>
<div class="paragraph">
<p>
Many processes in the world vary a little bit each time they are performed.
Setup of machines goes a bit faster or slower, patients taking their medicine takes longer this morning, more products are delivered today, or the quality of the manufactured product degrades due to a tired operator.
Modeling such variations is often done with stochastic distributions.
A distribution has a mean value and a known shape of variation.
By matching the means and the variation shape with data from the system being modeled, an accurate model of the system can be obtained.
The language has many stochastic distributions available, this chapter explains how to use them to model a system, and lists a few commonly used distributions.
The full list is available in the reference manual at <a href="#ref-chapter-distributions">Distributions</a>.</p>
</div>
<div class="paragraph">
<p>The following fragment illustrates the use of the random distribution to model a dice.
Each value of the six-sided dice is equally likely to appear.
Every value having the same probability of appearing is a property of the integer uniform distribution, in this case using interval <code>[1, 7)</code> (inclusive on the left side, exclusive on the right side).
The model is:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">dist int dice = uniform(1,7);
int x, y;
x = sample dice;
y = sample dice;
writeln("x=%d, y=%d", x, y);</code></pre>
</div>
</div>
<div class="paragraph">
<p>The variable <code>dice</code> is an integer distribution, meaning that values drawn from the distribution are integer numbers.
It is assigned an uniform distribution.
A throw of a dice is simulated with the <em>operator</em> <code>sample</code>.
Each time <code>sample</code> is used, a new sample value is obtained from the distribution.
In the fragment the dice is thrown twice, and the values are assigned to the variables <code>x</code>, and <code>y</code>.</p>
</div>
<div class="sect3">
<h4 id="tut-distributions">Distributions</h4>
<div class="paragraph">
<p>The language provides <em>constant</em>, <em>discrete</em> and <em>continuous</em> distributions.
A discrete distribution is a distribution where only specific values can be drawn, for example throwing a dice gives an integer number.
A continuous distribution is a distribution where a value from a continuous range can be drawn, for example assembling a product takes a positive amount of time.
The constant distributions are discrete distributions that always return the same value.
They are useful during the development of the model (see below).</p>
</div>
<div class="paragraph">
<p>
</p>
</div>
<div class="sect4">
<h5 id="tut-constant-distributions">Constant distributions</h5>
<div class="paragraph">
<p>When developing a model with stochastic behavior, it is hard to verify whether the model behaves correctly, since the stochastic results make it difficult to predict the outcome of experiments.
As a result, errors in the model may not be noticed, they hide in the noise of the stochastic results.
One solution is to first write a model without stochastic behavior, verify that model, and then extend the model with stochastic sampling.
Extending the model with stochastic behavior is however an invasive change that may introduce new errors.
These errors are again hard to find due to the difficulties to predict the outcome of an experiment.
The constant distributions aim to narrow the gap by reducing the amount of changes that need to be done after verification.</p>
</div>
<div class="paragraph">
<p>With constant distributions, a stochastic model with sampling of distributions is developed, but the stochastic behavior is eliminated by temporarily using constant distributions.
The model performs stochastic sampling of values, but with predictable outcome, and thus with predictable experimental results, making verification easier.
After verifying the model, the constant distributions are replaced with the distributions that fit the mean value and variation pattern of the modeled system, giving a model with stochastic behavior.
Changing the used distributions is however much less invasive, making it less likely to introduce new errors at this stage in the development of the model.</p>
</div>
<div class="paragraph">
<p>Constant distributions produce the same value <code>v</code> with every call of <code>sample</code>.
There is one constant distribution for each type of sample value:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><code>constant(bool v)</code>, a <code>bool</code> distribution.</p>
</li>
<li>
<p><code>constant(int v)</code>, an <code>int</code> distribution.</p>
</li>
<li>
<p><code>constant(real v)</code>, a <code>real</code> distribution.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>An example with a constant distribution is:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">dist int u = constant(7);</code></pre>
</div>
</div>
<div class="paragraph">
<p>This distribution returns the integer value <code>7</code> with each <code>sample u</code> operation.</p>
</div>
<div class="paragraph">
<p>
</p>
</div>
</div>
<div class="sect4">
<h5 id="tut-discrete-distributions">Discrete distributions</h5>
<div class="paragraph">
<p>Discrete distributions return values from a finite fixed set of possible values as answer.
In Chi, there is one distribution that returns a boolean when sampled, and there are several discrete distributions that return an integer number.</p>
</div>
<div class="ulist">
<ul>
<li>
<p><code>dist</code> <code>bool</code> <strong>bernoulli</strong><code>(real p)</code></p>
<div class="paragraph">
<p>Outcome of an experiment with chance <code>p</code> <code>(0 &lt;= p &lt;= 1)</code>.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="./reference-manual/distribution_plots/bernoulli.svg" alt="bernoulli">
</div>
</div>
<div class="hdlist">
<table>
<tr>
<td class="hdlist1">
Range
</td>
<td class="hdlist2">
<p><code>{false, true}</code></p>
</td>
</tr>
<tr>
<td class="hdlist1">
Mean
</td>
<td class="hdlist2">
<p><code>p</code> (where <code>false</code> is interpreted as <code>0</code>, and <code>true</code> is interpreted as <code>1</code>)</p>
</td>
</tr>
<tr>
<td class="hdlist1">
Variance
</td>
<td class="hdlist2">
<p><code>1 - p</code> (where <code>false</code> is interpreted as <code>0</code>, and <code>true</code> is interpreted as <code>1</code>)</p>
</td>
</tr>
<tr>
<td class="hdlist1">
See also
</td>
<td class="hdlist2">
<p>Bernoulli(p), <a href="#law-tut">[law-tut]</a>, page 302</p>
</td>
</tr>
</table>
</div>
</li>
<li>
<p><code>dist</code> <code>int</code> <strong>uniform</strong><code>(int a, b)</code></p>
<div class="paragraph">
<p>Integer uniform distribution from <code>a</code> to <code>b</code> excluding the upper bound.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="./reference-manual/distribution_plots/disc_uni.svg" alt="disc uni">
</div>
</div>
<div class="hdlist">
<table>
<tr>
<td class="hdlist1">
Range
</td>
<td class="hdlist2">
<p><code>{a, a+1, ..., b-1}</code></p>
</td>
</tr>
<tr>
<td class="hdlist1">
Mean
</td>
<td class="hdlist2">
<p><code>(a + b - 1) / 2</code></p>
</td>
</tr>
<tr>
<td class="hdlist1">
Variance
</td>
<td class="hdlist2">
<p><code>((b - a)\^2 - 1) / 12</code></p>
</td>
</tr>
<tr>
<td class="hdlist1">
See also
</td>
<td class="hdlist2">
<p>DU(a, b - 1), <a href="#law-tut">[law-tut]</a>, page 303</p>
</td>
</tr>
</table>
</div>
</li>
</ul>
</div>
<div class="paragraph">
<p>
</p>
</div>
</div>
<div class="sect4">
<h5 id="tut-continuous-distributions">Continuous distributions</h5>
<div class="paragraph">
<p>Continuous distributions return a value from a continuous range.</p>
</div>
<div class="ulist">
<ul>
<li>
<p><code>dist</code> <code>real</code> <strong>uniform</strong><code>(real a, b)</code></p>
<div class="paragraph">
<p>Real uniform distribution from <code>a</code> to <code>b</code>, excluding the upper bound.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="./reference-manual/distribution_plots/cont_uni.svg" alt="cont uni">
</div>
</div>
<div class="hdlist">
<table>
<tr>
<td class="hdlist1">
Range
</td>
<td class="hdlist2">
<p><code>[a, b)</code></p>
</td>
</tr>
<tr>
<td class="hdlist1">
Mean
</td>
<td class="hdlist2">
<p><code>(a + b) / 2</code></p>
</td>
</tr>
<tr>
<td class="hdlist1">
Variance
</td>
<td class="hdlist2">
<p><code>(b - a)^2 / 12</code></p>
</td>
</tr>
<tr>
<td class="hdlist1">
See also
</td>
<td class="hdlist2">
<p>U(a,b), <a href="#law-tut">[law-tut]</a>, page 282, except that distribution has an
inclusive upper bound.</p>
</td>
</tr>
</table>
</div>
</li>
<li>
<p><code>dist</code> <code>real</code> <strong>gamma</strong><code>(real a, b)</code></p>
<div class="paragraph">
<p>Gamma distribution, with shape parameter <code>a &gt; 0</code> and scale parameter <code>b &gt; 0</code>.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="./reference-manual/distribution_plots/gamma.svg" alt="gamma">
</div>
</div>
<div class="hdlist">
<table>
<tr>
<td class="hdlist1">
Mean
</td>
<td class="hdlist2">
<p><code>a * b</code></p>
</td>
</tr>
<tr>
<td class="hdlist1">
Variance
</td>
<td class="hdlist2">
<p><code>a * b^2</code></p>
</td>
</tr>
</table>
</div>
</li>
</ul>
</div>
</div>
<div class="sect4">
<h5 id="tut-references">References</h5>
<div class="ulist bibliography">
<ul class="bibliography">
<li>
<p><a id="law-tut"></a>[law-tut] Simulation Modeling &amp; Analysis, fourth edition, by Averill M. Law, publisher McGraw-Hill, International Edition, 2007, ISBN 978-007-125519-6</p>
</li>
</ul>
</div>
</div>
</div>
<div class="sect3">
<h4 id="tut-simulating-stochastic-behavior">Simulating stochastic behavior</h4>
<div class="paragraph">
<p>In this chapter, the mathematical notion of stochastic distribution is used to describe how to model stochastic behavior.
Simulating a model with stochastic behavior at a computer is however not stochastic at all.
Computer systems are deterministic machines, and have no notion of varying results.</p>
</div>
<div class="paragraph">
<p>A (pseudo-)random number generator is used to create stochastic results instead.
It starts with an initial <em>seed</em>, an integer number (you can give one at the start of the simulation).
From this seed, a function creates a stream of 'random' values.
When looking at the values there does not seem to be any pattern.
It is not truly random however.
Using the same seed again gives exactly the same stream of numbers.
This is the reason to call the function a <em>pseudo</em>-random number generator (a true random number generator would never produce the exact same stream of numbers).
A sample of a distribution uses one or more numbers from the stream to compute its value.
The value of the initial seed thus decides the value of all samples drawn in the simulation.
By default, a different seed is used each time you run a simulation (leading to slightly different results each time).
You can also explicitly state what seed you want to use when running a model, see <a href="#tool-compile-and-simulate">Compile and simulate</a>.
At the end of the simulation, the used initial seed of that simulation is printed for reference purposes.</p>
</div>
<div class="paragraph">
<p>While doing a stochastic simulation study, performing several experiments with the same initial seed invalidates the results, as it is equivalent to copying the outcome of a single experiment a number of times.
On the other hand, when looking for the cause of a bug in the model, performing the exact same experiment is useful as outcomes of previous experiments should match exactly.</p>
</div>
</div>
<div class="sect3">
<h4 id="tut-exercises-4">Exercises</h4>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>According to the Chi reference manual, for a <code>gamma</code> distribution with parameters <code>(a, b)</code>, the mean equals <code>a * b</code>.</p>
<div class="olist loweralpha">
<ol class="loweralpha" type="a">
<li>
<p>Use a Chi specification to verify whether this is true for at least 3 different pairs of <code>a</code> and <code>b</code>.</p>
</li>
<li>
<p>How many samples from the distribution are approximately required to determine the mean up to three decimals accurate?</p>
</li>
</ol>
</div>
</li>
<li>
<p>Estimate the mean μ and variance σ<sup>2</sup> of a triangular distribution <code>triangle(1.0, 2.0, 5.0)</code> by simulating 1000 samples.
Recall that the variance σ<sup>2</sup> of <em>n</em> samples can be calculated by a function like:</p>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">func real variance(list real samples, real avg):
real v;
for x in samples:
v = v + (x - avg)^2;
end
return v / (size(samples) - 1)
end</code></pre>
</div>
</div>
</li>
<li>
<p>We would like to build a small game, called <em>Higher or Lower</em>.
The computer picks a random integer number between 1 and 14.
The player then has to predict whether the next number will be higher or lower.
The computer picks the next random number and compares the new number with the previous one.
If the player guesses right his score is doubled.
If the player guesses wrong, he looses all and the game is over.
Try the following specification:</p>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">model HoL():
dist int u = uniform(1, 15);
int sc = 1;
bool c = true;
int new, oldval;
string s;
new = sample u;
write("Your score is %d\n", sc);
write("The computer drew %d\n", new);
while c:
writeln("(h)igher or (l)ower:\n");
s = read(string);
oldval = new;
new = sample u;
write("The computer drew %d\n", new);
if new == oldval:
c = false;
else:
c = (new &gt; oldval) == (s == "h");
end;
if c:
sc = 2 * sc;
else:
sc = 0;
end;
write("Your score is %d\n", sc)
end;
write("GAME OVER...\n")
end</code></pre>
</div>
</div>
<div class="olist loweralpha">
<ol class="loweralpha" type="a">
<li>
<p>What is the begin score?</p>
</li>
<li>
<p>What is the maximum end score?</p>
</li>
<li>
<p>What happens, when the drawn sample is equal to the previous drawn sample?</p>
</li>
<li>
<p>Extend this game specification with the possibility to stop.</p>
</li>
</ol>
</div>
</li>
</ol>
</div>
</div>
</div>
<div class="sect2">
<h3 id="tut-chapter-processes">Processes</h3>
<div class="paragraph">
<p>
The language has been designed for modeling and analyzing systems with many components, all working together to obtain the total system behavior.
Each component exhibits behavior over time.
Sometimes they are busy making internal decisions, sometimes they interact with other components.
The language uses a <em>process</em> to model the behavior of a component (the primary interest are the actions of the component rather than its physical representation).
This leads to models with many processes working in <em>parallel</em> (also known as <em>concurrent</em> processes), interacting with each other.</p>
</div>
<div class="paragraph">
<p>Another characteristic of these systems is that the parallelism happens at different scales at the same time, and each scale can be considered to be a collection of co-operating parallel working processes.
For example, a factory can be seen as a single component, it accepts supplies and delivers products.
However, within a factory, you can have several parallel operating production lines, and a line consists of several parallel operating machines.
A machine again consists of parallel operating parts.
In the other direction, a factory is a small element in a supply chain.
Each supply chain is an element in a (distribution) network.
Depending on the area that needs to be analyzed, and the level of detail, some scales are precisely modeled, while others either fall outside the scope of the system or are modeled in an abstract way.</p>
</div>
<div class="paragraph">
<p>In all these systems, the interaction between processes is not random, they understand each other and exchange information.
In other words, they <em>communicate</em> with each other.
The Chi language uses <em>channels</em> to model the communication.
A channel connects a sending process to a receiving process, allowing the sender to pass messages to the receiver.
This chapter discusses parallel operating processes only, communication between processes using channels is discussed in <a href="#tut-chapter-channels">Channels</a>.</p>
</div>
<div class="paragraph">
<p>As discussed above, a process can be seen as a single component with behavior over time, or as a wrapper around many processes that work at a smaller scale.
The Chi language supports both kinds of processes.
The former is modeled with the statements explained in previous chapters and communication that will be explained in <a href="#tut-chapter-channels">Channels</a>.
The latter (a process as a wrapper around many smaller-scale processes) is supported with the <code>run</code> statement.</p>
</div>
<div class="sect3">
<h4 id="tut-a-single-process">A single process</h4>
<div class="paragraph">
<p>The simplest form of processes is a model with one process:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">proc P():
write("Hello. I am a process.")
end
model M():
run P()
end</code></pre>
</div>
</div>
<div class="paragraph">
<p>Similar to a model, a process definition is denoted by the keyword <code>proc</code> (<code>proc</code> means process and does not mean procedure!), followed by the name of the process, here <code>P</code>, followed by an empty pair of parentheses <code>()</code>, meaning that the process has no parameters.
Process <code>P</code> contains one statement, a <code>write</code> statement to output text to the screen.
Model <code>M</code> contains one statement, a <code>run</code> statement to run a process.
When simulating this model, the output is:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-console" data-lang="console">Hello. I am a process.</code></pre>
</div>
</div>
<div class="paragraph">
<p>
A <code>run</code> statement constructs a process from the process definition (it <em>instantiates</em> a process definition) for each of its arguments, and they start running.
This means that the statements inside each process are executed.
The <code>run</code> statement waits until the statements in its created processes are finished, before it ends itself.</p>
</div>
<div class="paragraph">
<p>To demonstrate, below is an example of a model with two processes:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">proc P(int i):
write("I am process. %d.\n", i)
end
model M():
run P(1), P(2)
end</code></pre>
</div>
</div>
<div class="paragraph">
<p>This model instantiates and runs two processes, <code>P(1)</code> and <code>P(2)</code>.
The processes are running at the same time.
Both processes can perform a <code>write</code> statement.
One of them goes first, but there is no way to decide beforehand which one.
(It may always be the same choice, it may be different on Wednesday, etc, you just don&#8217;t know.) The output of the model is therefore either:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-console" data-lang="console">I am process 1.
I am process 2.</code></pre>
</div>
</div>
<div class="paragraph">
<p>or:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-console" data-lang="console">I am process 2.
I am process 1.</code></pre>
</div>
</div>
<div class="paragraph">
<p>After the two processes have finished their activities, the <code>run</code> statement in the model finishes, and the simulation ends.</p>
</div>
<div class="paragraph">
<p>
An important property of statements is that they are executed <em>atomically</em>.
It means that execution of the statement of one process cannot be interrupted by the execution of a statement of another process.</p>
</div>
</div>
<div class="sect3">
<h4 id="tut-a-process-in-a-process">A process in a process</h4>
<div class="paragraph">
<p>The view of a process being a wrapper around many other processes is supported by allowing to use the <code>run</code> statement inside a process as well.
An example:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">proc P():
while true:
write("Hello. I am a process.\n")
end
end
proc DoubleP():
run P(), P()
end
model M():
run DoubleP()
end</code></pre>
</div>
</div>
<div class="paragraph">
<p>The model instantiates and runs one process <code>DoubleP</code>.
Process <code>DoubleP</code> instantiates and runs two processes <code>P</code>.
The relevance becomes clear in models with a lot of processes.
The concept of 'a process in a process' is very useful in keeping the model structured.</p>
</div>
<div class="paragraph">
<p>
</p>
</div>
</div>
<div class="sect3">
<h4 id="tut-many-processes">Many processes</h4>
<div class="paragraph">
<p>Some models consist of many identical processes at a single level.
The language has an <code>unwind</code> statement to reduce the amount of program text.
A model with e.g. ten identical processes, and a different parameter value, is:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">model MRun():
run P(0), P(1), P(2), P(3), P(4),
P(5), P(6), P(7), P(8), P(9)
end</code></pre>
</div>
</div>
<div class="paragraph">
<p>An easier way to write this model is by applying the <code>unwind</code> statement inside <code>run</code> with the same effect:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">model MP():
run unwind j in range(10):
P(j)
end
end</code></pre>
</div>
</div>
<div class="paragraph">
<p>The <code>unwind</code> works like a <code>for</code> statement (see <a href="#tut-for-statement">The <code>for</code> statement</a>), except the <code>unwind</code> expands all values at the same time instead of iterating over them one at a time.</p>
</div>
</div>
</div>
<div class="sect2">
<h3 id="tut-chapter-channels">Channels</h3>
<div class="paragraph">
<p>
In <a href="#tut-chapter-processes">Processes</a> processes have been introduced.
This chapter describes channels, denoted by the type <code>chan</code>.
A channel connects two processes and is used for the transfer of data or just signals.
One process is the sending process, the other process is the receiving process.
Communication between the processes takes place instantly when both processes are willing to communicate, this is called <em>synchronous</em> communication.</p>
</div>
<div class="sect3">
<h4 id="tut-a-channel">A channel</h4>
<div class="paragraph">
<p>The following example shows the sending of an integer value between two processes via a channel.
<a href="#tut-figure-producer-consumer">A producer and a consumer</a> shows the two processes <code>P</code> and <code>C</code>, connected by channel variable <code>a</code>.</p>
</div>
<div id="tut-figure-producer-consumer" class="imageblock">
<div class="content">
<img src="./tutorial/pictures/producer_consumer.png" alt="producer consumer">
</div>
<div class="title">Figure 3. A producer and a consumer</div>
</div>
<div class="paragraph">
<p>Processes are denoted by circles, and channels are denoted by directed arrows in the figure.
The arrow denotes the direction of communication.
Process <code>P</code> is the sender or producer, process <code>C</code> is the receiver or consumer.</p>
</div>
<div class="paragraph">
<p>In this case, the producer sends a finite stream of integer values (5 numbers) to the consumer.
The consumer receives these values and writes them to the screen.
The model is:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">proc P(chan! int a):
for i in range(5):
a!i
end
end
proc C(chan? int b):
int x;
while true:
b?x;
write("%d\n",x)
end
end
model M():
chan int a;
run P(a), C(a)
end</code></pre>
</div>
</div>
<div class="paragraph">
<p>The model instantiates processes <code>P</code> and <code>C</code>.
The two processes are connected to each other via channel variable <code>a</code> which is given as actual parameter in the <code>run</code> statement.
This value is copied into the local formal parameter <code>a</code> in process <code>P</code> and in formal parameter <code>b</code> inside process <code>C</code>.</p>
</div>
<div class="paragraph">
<p>Process <code>P</code> can send a value of type <code>int</code> via the actual channel parameter <code>a</code> to process <code>C</code>.
In this case <code>P</code> first tries to send the value <code>0</code>.
Process <code>C</code> tries to receive a value of type <code>int</code> via the actual channel parameter <code>a</code>.
Both processes can communicate, so the communication occurs and the value <code>0</code> is sent to process <code>C</code>.
The received value is assigned in process <code>C</code> to variable <code>x</code>.
The value of <code>x</code> is printed and the cycle starts again.
This model writes the sequence <code>0, 1, 2, 3, 4</code> to the screen.</p>
</div>
</div>
<div class="sect3">
<h4 id="tut-synchronization-channels">Synchronization channels</h4>
<div class="paragraph">
<p>Above, process <code>P</code> constructs the numbers and sends them to process <code>C</code>.
However, since it is known that the number sequence starts at <code>0</code> and increments by one each time, there is no actual need to transfer a number.
Process <code>C</code> could also construct the number by itself after getting a signal (a 'go ahead') from process <code>P</code>.
Such signals are called synchronization signals, transfered by means of a synchronization channel.
The signal does not carry any data, it just synchronizes a send and a receive between different processes.
(Since there is no actual data transfered, the notion of sender and receiver is ambiguous.
However, in modeling there is often a notion of 'initiator' process that can be conveniently expressed with sending.)</p>
</div>
<div class="paragraph">
<p>The following example shows the use of synchronization signals between processes <code>P</code> and <code>C</code>.
The connecting channel 'transfers' values of type <code>void</code>.
The type <code>void</code> means that 'non-values' are sent and received; the type <code>void</code> is only allowed in combination with channels.
The iconic model is given in the previous figure, <a href="#tut-figure-producer-consumer">A producer and a consumer</a>.
The model is:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">proc P(chan! void a):
for i in range(5):
a! # No data is being sent
end
end
proc C(chan? void b):
int i;
while true:
b?; # Nothing is being received
write("%d\n", i);
i = i + 1
end
end
model M():
chan void a;
run P(a), C(a)
end</code></pre>
</div>
</div>
<div class="paragraph">
<p>Process <code>P</code> sends a signal (and no value is sent), and process <code>C</code> receives a signal (without a value).
The signal is used by process <code>C</code> to write the value of <code>i</code> and to increment variable <code>i</code>.
The effect of the model is identical to the previous example: the numbers <code>0, 1, 2, 3, 4</code> appear on the screen.</p>
</div>
</div>
<div class="sect3">
<h4 id="tut-two-channels">Two channels</h4>
<div class="paragraph">
<p>A process can have more than one channel, allowing interaction with several other processes.</p>
</div>
<div class="paragraph">
<p>The next example shows two channel variables, <code>a</code> and <code>b</code>, and three processes, generator <code>G</code>, server <code>S</code> and exit <code>E</code>.
The iconic model is given in <a href="#tut-figure-generator-server-exit">A generator, a server and an exit</a>.</p>
</div>
<div id="tut-figure-generator-server-exit" class="imageblock">
<div class="content">
<img src="./tutorial/pictures/generator_server_exit.png" alt="generator server exit">
</div>
<div class="title">Figure 4. A generator, a server and an exit</div>
</div>
<div class="paragraph">
<p>Process <code>G</code> is connected via channel variable <code>a</code> to process <code>S</code> and process <code>S</code> is connected via channel variable <code>b</code> to process <code>E</code>.
The model is:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">proc G(chan! int a):
for x in range(5):
a!x
end
end
proc S(chan? int a; chan! int b):
int x;
while true:
a?x; x = 2 * x; b!x
end
end
proc E(chan int a):
int x;
while true:
a?x;
write("E %d\n", x)
end
end
model M():
chan int a,b;
run G(a), S(a,b), E(b)
end</code></pre>
</div>
</div>
<div class="paragraph">
<p>The model contains two channel variables <code>a</code> and <code>b</code>.
The processes are connected to each other in model <code>M</code>.
The processes are instantiated and run where the formal parameters are replaced by the actual parameters.
Process <code>G</code> sends a stream of integer values <code>0, 1, 2, 3, 4</code> to another process via channel <code>a</code>.
Process <code>S</code> receives a value via channel <code>a</code>, assigns this value to variable <code>x</code>, doubles the value of the variable, and sends the value of the variable via <code>b</code> to another process.
Process <code>E</code> receives a value via channel <code>b</code>, assigns this value to the variable <code>x</code>, and prints this value.
The result of the model is given by:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-console" data-lang="console">E 0
E 2
E 4
E 6
E 8</code></pre>
</div>
</div>
<div class="paragraph">
<p>After printing this five lines, process <code>G</code> stops, process <code>S</code> is blocked, as well as process <code>E</code>, the model gets blocked, and the model ends.</p>
</div>
</div>
<div class="sect3">
<h4 id="tut-more-senders-or-receivers">More senders or receivers</h4>
<div class="paragraph">
<p>Channels send a message (or a signal in case of synchronization channels) from one sender to one receiver.
It is however allowed to give the same channel to several sender or receiver processes.
The channel selects a sender and a receiver before each communication.</p>
</div>
<div class="paragraph">
<p>The following example gives an illustration, see <a href="#tut-figure-generator-2servers-exit">A generator, two servers and an exit</a>.</p>
</div>
<div id="tut-figure-generator-2servers-exit" class="imageblock">
<div class="content">
<img src="./tutorial/pictures/generator_2servers_exit.png" alt="generator 2servers exit">
</div>
<div class="title">Figure 5. A generator, two servers and an exit</div>
</div>
<div class="paragraph">
<p>Suppose that only <code>G</code> and <code>S0</code> want to communicate.
The channel can select a sender (namely <code>G</code>) and a receiver (process <code>S0</code>), and let both processes communicate with each other.
When sender <code>G</code>, and both receivers (<code>S0</code> and <code>S1</code>), want to communicate, the channel selects a sender (<code>G</code> as it is the only sender available to the channel), and a receiver (either process <code>S0</code> or process <code>S1</code>), and it lets the selected processes communicate with each other.
This selection process is non-deterministic; a choice is made, but it is unknown how the selection takes place and it cannot be influenced.
Note that a non-deterministic choice is different from a random choice.
In the latter case, there are known probabilities of selecting a process.</p>
</div>
<div class="paragraph">
<p>Sharing a channel in this way allows to send data to receiving processes where the receiving party is not relevant (either server process will do).
This way of communication is different from <em>broadcasting</em>, where both servers receive the same data value.
Broadcasting is not supported by the Chi language.</p>
</div>
<div class="paragraph">
<p>In case of two senders, <code>S0</code> and <code>S1</code>, and one receiver <code>E</code> the selection process is the same.
If one of the two servers <code>S</code> can communicate with exit <code>E</code>, communication between that server and the exit takes place.
If both servers can communicate, a non-deterministic choice is made.</p>
</div>
<div class="paragraph">
<p>Having several senders and several receivers for a single channel is also handled in the same manner.
A non-deterministic choice is made for the sending process and a non-deterministic choice is made for the receiving process before each communication.</p>
</div>
<div class="paragraph">
<p>To communicate with several other processes but without non-determinism, unique channels must be used.</p>
</div>
</div>
<div class="sect3">
<h4 id="tut-notes-2">Notes</h4>
<div class="ulist">
<ul>
<li>
<p>The direction in channels, denoted by <code>?</code> or <code>!</code>, may be omitted.
By leaving it out, the semantics of the parameters becomes less clear (the direction of communication has to be derived from the process code).
</p>
</li>
<li>
<p>There are a several ways to name channels:
</p>
<div class="olist loweralpha">
<ol class="loweralpha" type="a">
<li>
<p>Start naming formal channel parameters in each new process with <code>a</code>, <code>b</code>, etc.
The actual names follow from the figure.
This convention is followed in this chapter.
For small models this convention is easy and works well, for complicated models this convention can be error-prone.
</p>
</li>
<li>
<p>Use the actual names of the channel parameters in the figures as formal names in the processes.
Start naming in figures with <code>a</code>, <code>b</code>, etc.
This convention works well, if both figure and code are at hand during the design process.
If many processes have sub-processes, this convention does not really work.</p>
</li>
<li>
<p>Use unique names for the channel parameters for the whole model, and for all sub-systems, for example a channel between processes <code>A</code> and <code>B</code> is named <code>a2b</code> (the lower-case name of the sending process, followed by <code>2</code>, denoting 'to', and the lower-case name of the receiving process).</p>
<div class="paragraph">
<p>In this case the formal and actual parameters can be in most cases the same.
If many identical processes are used, this convention does not really work.</p>
</div>
</li>
</ol>
</div>
</li>
</ul>
</div>
<div class="paragraph">
<p>In the text all three conventions are used, depending on the structure of the model.</p>
</div>
</div>
<div class="sect3">
<h4 id="tut-exercises-5">Exercises</h4>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Given is the specification of process <code>P</code> and model <code>PP</code>:</p>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">proc P(chan int a, b):
int x;
while true:
a?x;
x = x + 1;
write("%d\n", x);
b!x
end
end
model PP():
chan int a, b;
run P(a,b), P(b,a)
end</code></pre>
</div>
</div>
<div class="olist loweralpha">
<ol class="loweralpha" type="a">
<li>
<p>Study this specification.</p>
</li>
<li>
<p>Why does the model terminate immediately?</p>
</li>
</ol>
</div>
</li>
<li>
<p>Six children have been given the assignment to perform a series of calculations on the numbers <code>0, 1, 2, 3, ..., 9</code>, namely add 2, multiply by 3, multiply by 2, and add 6 subsequently.
They decide to split up the calculations and to operate in parallel.
They sit down at a table next to each other.
The first child, the reader <code>R</code>, reads the numbers <code>0, 1, 2, 3, ..., 9</code> one by one to the first calculating child <code>C1</code>.
Child <code>C1</code> adds 2 and tells the result to its right neighbour, child <code>C2</code>.
After telling the result to child <code>C2</code>, child <code>C1</code> is able to start calculating on the next number the reader <code>R</code> tells him.
Children <code>C2</code>, <code>C3</code>, and <code>C4</code> are analogous to child <code>C1</code>; they each perform a different calculation on a number they hear and tell the result to their right neighbor.
At the end of the table the writer <code>W</code> writes every result he hears down on paper.
Figure <a href="#tut-figure-sixchilds">Six children working in parallel</a> shows a schematic drawing of the children at the table.</p>
<div id="tut-figure-sixchilds" class="imageblock">
<div class="content">
<img src="./tutorial/pictures/sixchilds.png" alt="sixchilds">
</div>
<div class="title">Figure 6. Six children working in parallel</div>
</div>
<div class="olist loweralpha">
<ol class="loweralpha" type="a">
<li>
<p>Finish the specification for the reading child <code>R</code>, that reads the numbers 0 till 9 one by one:</p>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">proc R(...):
int i;
while i &lt; 10:
...;
...
end
end</code></pre>
</div>
</div>
</li>
<li>
<p>Specify the parameterized process <code>Cadd</code> that represents the children <code>C1</code> and <code>C4</code>, who perform an addition.</p>
</li>
<li>
<p>Specify the parameterized process <code>Cmul</code> that represents the children <code>C2</code> and <code>C3</code>, who perform a multiplication.</p>
</li>
<li>
<p>Specify the process <code>W</code> representing the writing child.
Write each result to the screen separated by a new line.</p>
</li>
<li>
<p>Make a graphical representation of the model <code>SixChildren</code> that is composed of the six children.</p>
</li>
<li>
<p>Specify the model <code>SixChildren</code>.
Simulate the model.</p>
</li>
</ol>
</div>
</li>
</ol>
</div>
<div class="paragraph">
<p></p>
</div>
</div>
</div>
<div class="sect2">
<h3 id="tut-chapter-buffers">Buffers</h3>
<div class="paragraph">
<p>In the previous chapter, a production system was discussed that passes values from one process to the next using channels, in a synchronous manner.
(Sender and receiver perform the communication at exactly the same moment in time, and the communication is instantaneous.) In many systems however, processes do not use synchronous communication, they use <em>asynchronous</em> communication instead.
Values (products, packets, messages, simple tokens, and so on) are sent, temporarily stored in a buffer, and then received.</p>
</div>
<div class="paragraph">
<p>In fact, the decoupling of sending and receiving is very important, it allows compensating temporarily differences between the number of items that are sent and received.
(Under the assumption that the receiver is fast enough to keep up with the sender in general, otherwise the buffer will grow forever or overflow.)</p>
</div>
<div class="paragraph">
<p>For example, consider the exchange of items from a producer process <code>P</code> to a consumer process <code>C</code> as shown in <a href="#tut-figure-pc2">A producer and a consumer</a>.</p>
</div>
<div id="tut-figure-pc2" class="imageblock">
<div class="content">
<img src="./tutorial/pictures/producer_consumer.png" alt="producer consumer">
</div>
<div class="title">Figure 7. A producer and a consumer</div>
</div>
<div class="paragraph">
<p>In the unbuffered situation, both processes communicate at the same time.
This means that when one process is (temporarily) faster than the other, it has to wait for the other process before communication can take place.
With a buffer in-between, the producer can give its item to the buffer, and continue with its work.
Likewise, the consumer can pick up a new item from the buffer at any later time (if the buffer has items).</p>
</div>
<div class="paragraph">
<p>In Chi, buffers are not modeled as channels, they are modeled as additional processes instead.
The result is shown in <a href="#tut-figure-pbc">A producer and a consumer, with an additional buffer process</a>.</p>
</div>
<div id="tut-figure-pbc" class="imageblock">
<div class="content">
<img src="./tutorial/pictures/buffered_producer_consumer.png" alt="buffered producer consumer">
</div>
<div class="title">Figure 8. A producer and a consumer, with an additional buffer process</div>
</div>
<div class="paragraph">
<p>The producer sends its items synchronously (using channel <code>a</code>) to the buffer process.
The buffer process keeps the item until it is needed.
The consumer gets an item synchronously (using channel <code>b</code>) from the buffer when it needs a new item (and one is available).</p>
</div>
<div class="paragraph">
<p>In manufacturing networks, buffers, in combination with servers, play a prominent role, for buffering items in the network.
Various buffer types exist in these networks: buffers can have a finite or infinite capacity, they have a input/output discipline, for example a first-out queuing discipline or a priority-based discipline.
Buffers can store different kinds of items, for example, product-items, information-items, or a combination of both.
Buffers may also have sorting facilities, etc.</p>
</div>
<div class="paragraph">
<p>In this chapter some buffer types are described, and with the presented concepts numerous types of buffer can be designed by the engineer.
First a simple buffer process with one buffer position is presented, followed by more advanced buffer models.
The producer and consumer processes are not discussed in this chapter.</p>
</div>
<div class="sect3">
<h4 id="tut-a-one-place-buffer">A one-place buffer</h4>
<div class="paragraph">
<p>A buffer usually has a receiving channel and a sending channel, for receiving and sending items.
A buffer, buffer <code>B1</code>, is presented in <a href="#tut-figure-oneplacebuffer">A <code>1</code>-place buffer</a>.</p>
</div>
<div id="tut-figure-oneplacebuffer" class="imageblock">
<div class="content">
<img src="./tutorial/pictures/one_place_buffer.png" alt="one place buffer">
</div>
<div class="title">Figure 9. A <code>1</code>-place buffer</div>
</div>
<div class="paragraph">
<p>The simplest buffer is a one-place buffer, for buffering precisely one item.
A one-place buffer can be defined by:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">proc B1(chan? item a; chan! item b):
item x;
while true:
a?x; b!x
end
end</code></pre>
</div>
</div>
<div class="paragraph">
<p>where <code>a</code> and <code>b</code> are the receiving and sending channels.
Item <code>x</code> is buffered in the process.
A buffer receives an item, stores the item, and sends the item to the next process, if the next process is willing to receive the item.
The buffer is not willing to receive a second item, as long as the first item is still in the buffer.</p>
</div>
<div class="paragraph">
<p>A two-place buffer can be created, by using the one-place buffer process twice.
A two-place buffer is depicted in <a href="#tut-figure-twoplacebuffer">A <code>2</code>-place buffer</a>.</p>
</div>
<div id="tut-figure-twoplacebuffer" class="imageblock">
<div class="content">
<img src="./tutorial/pictures/two_place_buffer.png" alt="two place buffer">
</div>
<div class="title">Figure 10. A <code>2</code>-place buffer</div>
</div>
<div class="paragraph">
<p>A two-place buffer is defined by:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">proc B2(chan? item a; chan! item b):
chan item c;
run B1(a, c), B1(c, b)
end</code></pre>
</div>
</div>
<div class="paragraph">
<p>where two processes <code>B1</code> buffer maximal two items.
If each process <code>B1</code> contains an item, a third item has to wait in front of process <code>B2</code>.
This procedure can be extended to create even larger buffers.
Another, more preferable manner however, is to describe a buffer in a single process by using a <em>select</em> statement and a list for storage of the items.
Such a buffer is discussed in the next section.</p>
</div>
</div>
<div class="sect3">
<h4 id="tut-a-single-process-buffer">A single process buffer</h4>
<div class="paragraph">
<p>An informal description of the process of a buffer, with an arbitrary number of stored items, is the following:</p>
</div>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>If the buffer has space for an item, <em>and</em> can receive an item from another process via channel <code>a</code>, the buffer process receives that item, and stores the item in the buffer.</p>
</li>
<li>
<p>If the buffer contains at least one item, <em>and</em> the buffer can send that item to another process via channel <code>b</code>, the buffer process sends that item, and removes that item from the buffer.</p>
</li>
<li>
<p>If the buffer can both send and receive a value, the buffer process selects one of the two possibilities (in a non-deterministic manner).</p>
</li>
<li>
<p>If the buffer cannot receive an item, and cannot send an item, the buffer process waits.</p>
</li>
</ol>
</div>
<div class="paragraph">
<p>Next to the sending and receiving of items (to and from the buffer process) is the question of how to order the stored items.
A common form is the <em>first-in first-out</em> (fifo) queuing discipline.
Items that enter the buffer first (first-in) also leave first (first-out), the order of items is preserved by the buffer process.</p>
</div>
<div class="paragraph">
<p>In the model of the buffer, an (ordered) list of type <code>item</code> is used for storing the received items.
New item <code>x</code> is added at the rear of list <code>xs</code> by the statement:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">xs = xs + [x]</code></pre>
</div>
</div>
<div class="paragraph">
<p>The first item of the list is sent, and then deleted with:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">xs = xs[1:]</code></pre>
</div>
</div>
<div class="paragraph">
<p>An alternative solution is to swap the function of the rear and the front, which can be useful some times.</p>
</div>
<div class="paragraph">
<p>The statement to monitor several channels at the same time is the <code>select</code> statement.
The syntax of the <code>select</code> statement, with two alternatives, is:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">select
boolean_expression_1, communication statement_1:
statement_list_1
alt
boolean_expression_2, communication statement_2:
statement_list_2
...
end</code></pre>
</div>
</div>
<div class="paragraph">
<p>There has to be at least one alternative in a select statement.
The statement waits, until for one of the alternatives the <code>boolean_expression</code> holds <em>and</em> communication using the <code>communication statement</code> is possible.
(When there are several such alternatives, one of them is non-deterministically chosen.) For the selected alternative, the communication statement is executed, followed by the statements in the <code>statement_list</code> of the alternative.</p>
</div>
<div class="paragraph">
<p>The above syntax is the most generic form, the <code>boolean_expression</code> may be omitted when it always holds, or the <code>communication statement</code> may be omitted when there is no need to communicate.
The <code>,</code> also disappears then.
(Omitting both the boolean expression and the communication statement is not allowed.) Similarly, when the <code>statement_list</code> is empty or just <code>pass</code>, it may be omitted (together with the <code>:</code> in front of it).</p>
</div>
<div class="paragraph">
<p>The description (in words) of the core of the buffer, from the start of this section, is translated in code, by using a <code>select</code> statement:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">select
size(xs) &lt; N, a?x:
xs = xs + [x]
alt
size(xs) &gt; 0, b!xs[0]:
xs = xs[1:]
end</code></pre>
</div>
</div>
<div class="paragraph">
<p>In the first alternative, it is stated that, if the buffer is not full, and the buffer can receive an item, an item is received, and that item is added to the rear of the list.
In the second alternative, it is stated that, if the buffer contains at least one item, and the buffer can send an item, the first item in the list is sent, and the list is updated.
Please keep in mind that both the condition must hold and the communication must be possible <em>at the same moment</em>.</p>
</div>
<div class="paragraph">
<p>The complete description of the buffer is:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">proc B(chan? item a; chan! item b):
list item xs; item x;
while true:
select
size(xs) &lt; N, a?x:
xs = xs + [x]
alt
size(xs) &gt; 0, b!xs[0]:
xs = xs[1:]
end
end
end</code></pre>
</div>
</div>
<div class="paragraph">
<p>Instead of boolean expression <code>size(xs) &gt; 0</code>, expression <code>not empty(xs)</code> can be used, where <code>empty</code> is a function yielding <code>true</code> if the list is empty, otherwise <code>false</code>.
In case the capacity of the buffer is infinite, expression <code>size(xs) &lt; N</code> can be replaced by <code>true</code>, or even omitted (including the comma).</p>
</div>
</div>
<div class="sect3">
<h4 id="tut-infinite-buffer">An infinite buffer</h4>
<div class="paragraph">
<p>A buffer with infinite capacity can be written as:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">proc B(chan? item a; chan! item b):
list item xs; item x;
while true:
select
a?x:
xs = xs + [x]
alt
not empty(xs), b!xs[0]:
xs = xs[1:]
end
end
end</code></pre>
</div>
</div>
<div class="paragraph">
<p>A first-in first-out buffer is also called a <em>queue</em>, while a first-in last-out buffer (<em>lifo</em> buffer), is called a <em>stack</em>.
A description of a lifo buffer is:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">proc B(chan? item a; chan! item b):
list item xs; item x;
while true:
select
a?x:
xs = [x] + xs
alt
not empty(xs), b!xs[0]:
xs = xs[1:]
end
end
end</code></pre>
</div>
</div>
<div class="paragraph">
<p>The buffer puts the last received item at the head of the list, and gets the first item from the list.
An alternative is to put the last item at the rear of the list, and to get the last item from the list.</p>
</div>
</div>
<div class="sect3">
<h4 id="tut-a-token-buffer">A token buffer</h4>
<div class="paragraph">
<p>In the next example, signals are buffered instead of items.
The buffer receives and sends 'empty' items or <em>tokens</em>.
Counter variable <code>w</code> of type <code>int</code> denotes the difference between the number of tokens received and the number of tokens sent.
If the buffer receives a token, counter <code>w</code> is incremented; if the buffer sends a token, counter <code>w</code> is decremented.
If the number of tokens sent is less than the number of tokens received, there are tokens in the buffer, and <code>w &gt; 0</code>.
A receiving channel variable <code>a</code> of type <code>void</code> is defined for receiving tokens.
A sending channel variable <code>b</code> of type <code>void</code> is defined for sending tokens.
The buffer becomes:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">proc B(chan? void a; chan! void b):
int w;
while true:
select
a?:
w = w + 1
alt
w &gt; 0, b!:
w = w - 1
end
end
end</code></pre>
</div>
</div>
<div class="paragraph">
<p>Note that variables of type <code>void</code> do not exist.
Type <code>void</code> only can be used in combination with channels.</p>
</div>
</div>
<div class="sect3">
<h4 id="tut-a-priority-buffer">A priority buffer</h4>
<div class="paragraph">
<p>A buffer for items with different priority is described in this section.
An item has a high priority or a normal priority.
Items with a high priority should leave the buffer first.</p>
</div>
<div class="paragraph">
<p>An item is a tuple with a field <code>prio</code>, denoting the priority, <code>0</code> for high priority, and <code>1</code> for normal priority:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">type item = tuple(...; int prio);</code></pre>
</div>
</div>
<div class="paragraph">
<p>For the storage of items, two lists are used: a list for high priority items and a list for normal priority items.
The two lists are described by a list with size two:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">list(2) list item xs;</code></pre>
</div>
</div>
<div class="paragraph">
<p>Variable <code>xs[0]</code> contains the high priority items, <code>xs[1]</code> the normal priority items.
The first item in the high priority list is denoted by <code>xs[0][0]</code>, etc.</p>
</div>
<div class="paragraph">
<p>In the model the received items are, on the basis of the value of the <code>prio</code>-field in the item, stored in one of the two lists: one list for 'high' items and one list for 'normal' items.
The discipline of the buffer is that items with a high priority leave the buffer first.
The model is:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">proc BPrio(chan? item a; chan! item b):
list(2) list item xs; item x;
while true:
select
a?x:
xs[x.prio] = xs[x.prio] + [x]
alt
not empty(xs[0]), b!xs[0][0]:
xs[0] = xs[0][1:]
alt
empty(xs[0]) and not empty(xs[1]), b!xs[1][0]:
xs[1] = xs[1][1:]
end
end
end</code></pre>
</div>
</div>
<div class="paragraph">
<p>The buffer has two lists <code>xs[0]</code> and <code>xs[1]</code>.
Received items <code>x</code> are stored in <code>xs[x.prio]</code> by the statement <code>xs[x.prio] = xs[x.prio] + [x]</code>.</p>
</div>
<div class="paragraph">
<p>If the list high priority items (<code>xs[0]</code>) is not empty, items with high priority are sent.
The first element in list <code>xs[0]</code> is element <code>xs[0][0]</code>.
If there are no high priority items (list <code>xs[0]</code> is empty), and there are normal priority items (list <code>xs[1]</code> is not empty), the first element of list <code>xs[1]</code>, element <code>xs[1][0]</code>, is sent.</p>
</div>
<div class="paragraph">
<p>Note that the order of the alternatives in the select statement does not matter, every alternative is treated in the same way.</p>
</div>
</div>
<div class="sect3">
<h4 id="tut-buffer-exercises">Exercises</h4>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>To study product flow to and from a factory, a setup as shown in <a href="#tut-figure-controlled-factory">A controlled factory</a> is created.</p>
<div id="tut-figure-controlled-factory" class="imageblock">
<div class="content">
<img src="./tutorial/pictures/controlled_factory.png" alt="controlled factory">
</div>
<div class="title">Figure 11. A controlled factory</div>
</div>
<div class="paragraph">
<p><code>F</code> is the factory being studied, generator <code>G</code> sends products into the factory, and exit process <code>E</code> retrieves finished products.
The factory is tightly controlled by controller <code>C</code> that sends a signal to <code>G</code> or <code>E</code> before a product may be moved.
The model is as follows:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">proc G(chan! int a; chan? void sg):
for i in range(10):
sg?;
a!i;
end
end
proc F(chan? int a; chan! int b):
...
end
proc E(chan? int a; chan? void se):
int x;
while true:
se?;
a?x;
write("E received %d\n", x);
end
end
proc C(chan! void sg, se; int low, high):
int count;
while true:
while count &lt; high:
sg!;
count = count + 1;
end
while count &gt; low:
se!;
count = count - 1;
end
end
end
model M():
chan void sg, se;
chan int gf, fe;
run C(sg, se, 0, 1),
G(gf, sg), F(gf, fe), E(fe, se);
end</code></pre>
</div>
</div>
<div class="paragraph">
<p>The number of products inserted by the generator has been limited to allow for manual inspection of results.</p>
</div>
<div class="olist loweralpha">
<ol class="loweralpha" type="a">
<li>
<p>As a model of the factory, use a FIFO buffer process.
Run the simulation, and check whether all products are received by the exit process.</p>
</li>
<li>
<p>Change the control policy to <code>low = 1</code> and <code>high = 4</code>.
Predict the outcome, and verify with simulation.</p>
</li>
<li>
<p>The employees of the factory propose to stack the products in the factory to reduce the amount of space needed for buffering.
Replace the factory process with a LIFO buffer process, run the experiments again, first with <code>low = 0</code> and <code>high = 1</code> and then with <code>low = 1</code> and <code>high = 4</code>.</p>
</li>
<li>
<p>You will notice that some products stay in the factory forever.
Why does that happen?
How should the policy be changed to ensure all products eventually leave the factory?</p>
</li>
</ol>
</div>
</li>
</ol>
</div>
</div>
</div>
<div class="sect2">
<h3 id="tut-chapter-servers-with-time">Servers with time</h3>
<div class="paragraph">
<p>
A manufacturing line contains machines and/or persons that perform a sequence of tasks, where each machine or person is responsible for a single task.
The term <em>server</em> is used for a machine or a person that performs a task.
Usually the execution of a task takes time, e.g. a drilling process, a welding process, the set-up of a machine.
In this chapter we introduce the concept of <em>time</em>, together with the <em>delay</em> statement.</p>
</div>
<div class="paragraph">
<p>Note that here 'time' means the simulated time inside the model.
For example, assume there are two tasks that have to be performed in sequence in the modeled system.
The first task takes three hours to complete, the second task takes five hours to complete.
These amounts of time are specified in the model (using the delay statement, as will be explained below).
A simulation of the system should report 'It takes eight hours from start of the first task to finish of the second task'.
However, it generally does not take eight hours to compute that result, a computer can calculate the answer much faster.
When an engineer says ''I had to run the system for a year to reach steady-state'', he means that time inside the model has progressed a year.</p>
</div>
<div class="paragraph">
<p>
</p>
</div>
<div class="sect3">
<h4 id="tut-the-clock">The clock</h4>
<div class="paragraph">
<p>The variable <code>time</code> denotes the current time in a model.
It is a <em>global</em> variable, it can be used in every <code>model</code> and <code>proc</code>.
The time is a variable of type <code>real</code>.
Its initial value is <code>0.0</code>.
The variable is updated automatically by the model, it cannot be changed by the user.
The unit of the time is however determined by the user, that is, you define how long 1 time unit of simulated time is in the model.</p>
</div>
<div class="paragraph">
<p>The value of variable <code>time</code> can be retrieved by reading from the <code>time</code> variable:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">t = time</code></pre>
</div>
</div>
<div class="paragraph">
<p>The meaning of this statement is that the current time is copied to variable <code>t</code> of type real.</p>
</div>
<div class="paragraph">
<p>A process delays itself to simulate the processing time of an operation with a <em>delay</em> statement.
The process postpones or suspends its own actions until the delay ends.</p>
</div>
<div class="paragraph">
<p>For example, suppose a system has to perform three actions, each action takes 45 seconds.
The unit of time in the model is one minute (that is, progress of the modeled time by one time unit means a minute of simulated time has passed).
The model looks like:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">proc P():
for i in range(3):
write("i = %d, time = %f\n", i, time);
delay 0.75
end
end
model M():
run P()
end</code></pre>
</div>
</div>
<div class="paragraph">
<p>An action takes 45 seconds, which is <code>0.75</code> time units.
The <code>delay 0.75</code> statement represents performing the action, the process is suspended until 0.75 units of time has passed.</p>
</div>
<div class="paragraph">
<p>The simulation reports:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-console" data-lang="console">i = 0, time = 0.000000
i = 1, time = 0.750000
i = 2, time = 1.500000
All processes finished at time 2.25</code></pre>
</div>
</div>
<div class="paragraph">
<p>The three actions are done in 2.25 time units (2.25 minutes).</p>
</div>
</div>
<div class="sect3">
<h4 id="tut-servers-with-time">Servers with time</h4>
<div class="paragraph">
<p>Adding time to the model allows answering questions about time, often performance questions ('how many products can I make in this situation?').
Two things are needed:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Servers must model use of time to perform their task.</p>
</li>
<li>
<p>The model must perform measurements of how much time passes.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>By extending models of the servers with time, time passes while tasks are being performed.
Time measurements then give non-zero numbers (servers that can perform actions instantly result in all tasks being done in one moment of time, that is 0 time units have passed between start and finish).
Careful analysis of the measurements should yields answers to questions about performance.</p>
</div>
<div class="paragraph">
<p>In this chapter, adding of passing time in a server and how to embed time measurements in the model is explained.
The first case is a small production line with a deterministic server (its task takes a fixed amount of time), while the second case uses stochastic arrivals (the moment of arrival of new items varies), and a stochastic server instead (the duration of the task varies each time).
In both cases, the question is what the flow time of an item is (the amount of time that a single item is in the system), and what the throughput of the entire system is (the number of items the production line can manufacture per time unit).</p>
</div>
<div class="sect4">
<h5 id="tut-servers-deterministic-system">A deterministic system</h5>
<div class="paragraph">
<p>The model of a deterministic system consists of a deterministic generator, a deterministic server, and an exit process.
The line is depicted in <a href="#tut-figure2-generator-server-exit">Generator <code>G</code>, server <code>S</code>, and exit <code>E</code></a>.</p>
</div>
<div id="tut-figure2-generator-server-exit" class="imageblock">
<div class="content">
<img src="./tutorial/pictures/generator_server_exit.png" alt="generator server exit">
</div>
<div class="title">Figure 12. Generator <code>G</code>, server <code>S</code>, and exit <code>E</code></div>
</div>
<div class="paragraph">
<p>Generator process <code>G</code> sends items, with constant inter-arrival time <code>ta</code>, via channel <code>a</code>, to server process <code>S</code>.
The server processes items with constant processing time <code>ts</code>, and sends items, via channel <code>b</code>, to exit process <code>E</code>.</p>
</div>
<div class="paragraph">
<p>An item contains a real value, denoting the creation time of the item, for calculating the throughput of the system and flow time (or sojourn time) of an item in the system.
The generator process creates an item (and sets its creation time), the exit process <code>E</code> writes the measurements (the moment in time when the item arrives in the exit process, and its creation time) to the output.
From these measurements, throughput and flow time can be calculated.</p>
</div>
<div class="paragraph">
<p>Model <code>M</code> describes the system:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">type item = real;
model M(real ta, ts; int N):
chan item a, b;
run G(a, ta),
S(a, b, ts),
E(b, N)
end</code></pre>
</div>
</div>
<div class="paragraph">
<p>The <code>item</code> is a real number for storing the creation time.
Parameter <code>ta</code> denotes the inter-arrival time, and is used in generator <code>G</code>.
Parameter <code>ts</code> denotes the server processing time, and is used in server <code>S</code>.
Parameter <code>N</code> denotes the number of items that must flow through the system to get a good measurement.</p>
</div>
<div class="paragraph">
<p>Generator <code>G</code> has two parameters, channel <code>a</code>, and inter-arrival time <code>ta</code>.
The description of process <code>G</code> is given by:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">proc G(chan! item a; real ta):
while true:
a!time; delay ta
end
end</code></pre>
</div>
</div>
<div class="paragraph">
<p>Process <code>G</code> sends an item, with the current time, and delays for <code>ta</code>, before sending the next item to server process <code>S</code>.</p>
</div>
<div class="paragraph">
<p>Server <code>S</code> has three parameters, receiving channel <code>a</code>, sending channel <code>b</code>, and server processing time <code>ts</code>:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">proc S(chan? item a; chan! item b; real ts):
item x;
while true:
a?x; delay ts; b!x
end
end</code></pre>
</div>
</div>
<div class="paragraph">
<p>The process receives an item from process <code>G</code>, processes the item during <code>ts</code> time units, and sends the item to exit process <code>E</code>.</p>
</div>
<div class="paragraph">
<p>Exit <code>E</code> has two parameters, receiving channel <code>a</code> and the length of the experiment <code>N</code>:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">proc E(chan item a; int N):
item x;
for i in range(N):
a?x; write("%f, %f\n", time, time - x)
end
end</code></pre>
</div>
</div>
<div class="paragraph">
<p>The process writes current time <code>time</code> and item flow time <code>time - x</code> to the screen for each received item.
Analysis of the measurements will show that the system throughput equals <code>1 / ta</code>, and that the item flow time equals <code>ts</code> (if <code>ta &gt;= ts</code>).</p>
</div>
</div>
<div class="sect4">
<h5 id="tut-stochastic-system">A stochastic system</h5>
<div class="paragraph">
<p>In the next model, the generator produces items with an exponential inter-arrival time, and the server processes items with an exponential server processing time.
To compensate for the variations in time of the generator and the server, a buffer process has been added.
The model is depicted in <a href="#tut-figure-MM1">Generator <code>G</code>, buffer <code>B</code>, server <code>S</code>, and exit <code>E</code></a>.</p>
</div>
<div id="tut-figure-MM1" class="imageblock">
<div class="content">
<img src="./tutorial/pictures/generator_buffer_server_exit.png" alt="generator buffer server exit">
</div>
<div class="title">Figure 13. Generator <code>G</code>, buffer <code>B</code>, server <code>S</code>, and exit <code>E</code></div>
</div>
<div class="paragraph">
<p>Type <code>item</code> is the same as in the previous situation.
The model runs the additional buffer process:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">model M(real ta, ts; int N):
chan item a, b, c;
run G(a, ta),
B(a, b),
S(b, c, ts),
E(c, N)
end</code></pre>
</div>
</div>
<div class="paragraph">
<p>Generator <code>G</code> has two parameters, channel variable <code>a</code>, and variable <code>ta</code>, denoting the mean inter-arrival time.
An <code>exponential</code> distribution is used for deciding the inter-arrival time of new items:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">proc G(chan item a; real ta):
dist real u = exponential(ta);
while true:
a!time; delay sample u
end
end</code></pre>
</div>
</div>
<div class="paragraph">
<p>The process sends a new item to the buffer, and delays <code>sample u</code> time units.
Buffer process <code>B</code> is a fifo buffer with infinite capacity, as described at <a href="#tut-infinite-buffer">An infinite buffer</a>.
Server <code>S</code> has three parameters, channel variables <code>a</code> and <code>b</code>, for receiving and sending items, and a variable for the average processing time <code>ts</code>:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">proc S(chan item a, b; real ts):
dist real u = exponential(ts);
item x;
while true:
a?x; delay sample u; b!x
end
end</code></pre>
</div>
</div>
<div class="paragraph">
<p>An <code>exponential</code> distribution is used for deciding the processing time.
The process receives an item from process <code>G</code>, processes the item during <code>sample u</code> time units, and sends the item to exit process <code>E</code>.</p>
</div>
<div class="paragraph">
<p>Exit process <code>E</code> is the same as previously, see <a href="#tut-servers-deterministic-system">A deterministic system</a>.
In this case the throughput of the system also equals <code>1 / ta</code>, and the <em>mean flow</em> can be obtained by doing an experiment and analysis of the resulting measurements (for <code>ta &gt; ts</code>).</p>
</div>
<div class="paragraph">
<p>
</p>
</div>
</div>
</div>
<div class="sect3">
<h4 id="tut-two-servers">Two servers</h4>
<div class="paragraph">
<p>In this section two different types of systems are shown: a serial and a parallel system.
In a serial system the servers are positioned after each other, in a parallel system the servers are operating in parallel.
Both systems use a stochastic generator, and stochastic servers.</p>
</div>
<div class="sect4">
<h5 id="tut-serial-system">Serial system</h5>
<div class="paragraph">
<p>The next model describes a <em>serial</em> system, where an item is processed by one server, followed by another server.
The generator and the servers are decoupled by buffers.
The model is depicted in <a href="#tut-figure-tandem">A generator, two buffers, two servers, and an exit</a>.</p>
</div>
<div id="tut-figure-tandem" class="imageblock">
<div class="content">
<img src="./tutorial/pictures/generator_2buffers_2servers_exit.png" alt="generator 2buffers 2servers exit">
</div>
<div class="title">Figure 14. A generator, two buffers, two servers, and an exit</div>
</div>
<div class="paragraph">
<p>The model can be described by:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">model M(real ta, ts; int N):
chan item a, b, c, d, e;
run G(a, ta),
B(a, b), S(b, c, ts),
B(c, d), S(d, e, ts),
E(e, N)
end</code></pre>
</div>
</div>
<div class="paragraph">
<p>The various processes are equal to those described previously in <a href="#tut-stochastic-system">A stochastic system</a>.</p>
</div>
</div>
<div class="sect4">
<h5 id="tut-parallel-systems">Parallel systems</h5>
<div class="paragraph">
<p>In a parallel system the servers are operating in parallel.
Having several servers in parallel is useful for enlarging the processing capacity of the task being done, or for reducing the effect of break downs of servers (when a server breaks down, the other server continues with the task for other items).
<a href="#tut-figure-two-parallel-servers">A model with two parallel servers</a> depicts the system.</p>
</div>
<div id="tut-figure-two-parallel-servers" class="imageblock">
<div class="content">
<img src="./tutorial/pictures/two_parallel_servers.png" alt="two parallel servers">
</div>
<div class="title">Figure 15. A model with two parallel servers</div>
</div>
<div class="paragraph">
<p>Generator process <code>G</code> sends items via <code>a</code> to buffer process <code>B</code>, and process <code>B</code> sends the items in a first-in first-out manner to the servers <code>S</code>.
Both servers send the processed items to the exit process <code>E</code> via channel <code>c</code>.
The inter-arrival time and the two process times are assumed to be stochastic, and exponentially distributed.
Items can pass each other, due to differences in processing time between the two servers.</p>
</div>
<div class="paragraph">
<p>If a server is free, and the buffer is not empty, an item is sent to a server.
If both servers are free, one server will get the item, but which one cannot be determined beforehand.
(How long a server has been idle is not taken into account.) The model is described by:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">model M(real ta, ts; int N):
chan item a, b, c;
run G(a, ta),
B(a, b),
S(b, c, ts), S(b, c, ts),
E(c, N)
end</code></pre>
</div>
</div>
<div class="paragraph">
<p>To control which server gets the next item, each server must have its own channel from the buffer.
In addition, the buffer has to know when the server can receive a new item.
The latter is done with a 'request' channel, denoting that a server is free and needs a new item.
The server sends its own identity as request, the requests are administrated in the buffer.
The model is depicted in <a href="#tut-figure-two-parallel-requesting-servers">A model with two parallel requesting servers</a>.</p>
</div>
<div id="tut-figure-two-parallel-requesting-servers" class="imageblock">
<div class="content">
<img src="./tutorial/pictures/two_parallel_requesting_servers.png" alt="two parallel requesting servers">
</div>
<div class="title">Figure 16. A model with two parallel requesting servers</div>
</div>
<div class="paragraph">
<p>In this model, the servers 'pull' an item through the line.
The model is:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">model M(real ta, ts; int N):
chan item a; list(2) chan item b; chan item c;
chan int r;
run G(a, ta),
B(a, b, r),
unwind j in range(2):
S(b[j], c, r, ts, j)
end,
E(c, N)
end</code></pre>
</div>
</div>
<div class="paragraph">
<p>In this model, an <code>unwind</code> statement is used for the initialization and running of the two servers.
Via channel <code>r</code> an integer value, <code>0</code> or <code>1</code>, is sent to the buffer.</p>
</div>
<div class="paragraph">
<p>The items received from generator <code>G</code> are stored in list <code>xs</code>, the requests received from the servers are stored in list <code>ys</code>.
The items and requests are removed form their respective lists in a first-in first-out manner.
Process <code>B</code> is defined by:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">proc B(chan? item a; list chan! item b; chan? int r):
list item xs; item x;
list int ys; int y;
while true:
select
a?x:
xs = xs + [x]
alt
r?y:
ys = ys + [y]
alt
not empty(xs) and not empty(ys), b[ys[0]]!xs[0]:
xs = xs[1:]; ys = ys[1:]
end
end
end</code></pre>
</div>
</div>
<div class="paragraph">
<p>If, there is an item present, <em>and</em> there is a server demanding for an item, the process sends the first item to the longest waiting server.
The longest waiting server is denoted by variable <code>ys[0]</code>.
The head of the item list is denoted by <code>xs[0]</code>.
Assume the value of <code>ys[0]</code> equals <code>1</code>, then the expression <code>b[ys[0]]!xs[0]</code>, equals <code>b[1]!xs[0]</code>, indicates that the first item of list <code>xs</code>, equals <code>xs[0]</code>, is sent to server <code>1</code>.</p>
</div>
<div class="paragraph">
<p>The server first sends a request via channel <code>r</code> to the buffer, and waits for an item.
The item is processed, and sent to exit process <code>E</code>:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">proc S(chan? item b; chan! item c; chan! int r; real ts; int k):
dist real u = exponential(ts);
item x;
while true:
r!k;
b?x;
delay sample u;
c!x
end
end</code></pre>
</div>
</div>
</div>
</div>
<div class="sect3">
<h4 id="tut-assembly">Assembly</h4>
<div class="paragraph">
<p>In assembly systems, components are assembled into bigger components.
These bigger components are assembled into even bigger components.
In this way, products are built, e.g. tables, chairs, computers, or cars.
In this section some simple assembly processes are described.
These systems illustrate how assembling can be performed: in industry these assembly processes are often more complicated.</p>
</div>
<div class="paragraph">
<p>An assembly work station for two components is shown in <a href="#tut-figure-assembly-two-components">Assembly for two components</a>.</p>
</div>
<div id="tut-figure-assembly-two-components" class="imageblock">
<div class="content">
<img src="./tutorial/pictures/assembly_two_components.png" alt="assembly two components">
</div>
<div class="title">Figure 17. Assembly for two components</div>
</div>
<div class="paragraph">
<p>The assembly process server <code>S</code> is preceded by buffers.
The server receives an item from each buffer <code>B</code>, before starting assembly.
The received items are assembled into one new item, a list of its (sub-)items.
The description of the assembly server is:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">proc S(list chan? item c, chan! list item b):
list(2) item v;
while true:
select
c[0]?v[0]: c[1]?v[1]
alt
c[1]?v[1]: c[0]?v[0]
end
b!v
end
end</code></pre>
</div>
</div>
<div class="paragraph">
<p>The process takes a list of channels <code>c</code> to receive items from the preceding buffers.
The output channel <code>b</code> is used to send the assembled component away to the next process.</p>
</div>
<div class="paragraph">
<p>First, the assembly process receives an item from both buffers.
All buffers are queried at the same time, since it is unknown which buffer has components available.
If the first buffer reacts first, and sends an item, it is received with channel <code>c[0]</code> and stored in <code>v[0]</code> in the first alternative.
The next step is then to receive the second component from the second buffer, and store it (<code>c[1]?v[1]</code>).
The second alternative does the same, but with the channels and stored items swapped.</p>
</div>
<div class="paragraph">
<p>When both components have been received, the assembled product is sent away.</p>
</div>
<div class="paragraph">
<p>A generalized assembly work station for <code>n</code> components is depicted in <a href="#tut-figure-assembly-n-components">Assembly for <code>n</code> components, with <code>m = n - 1</code></a>.</p>
</div>
<div id="tut-figure-assembly-n-components" class="imageblock">
<div class="content">
<img src="./tutorial/pictures/assembly_n_components.png" alt="assembly n components">
</div>
<div class="title">Figure 18. Assembly for <code>n</code> components, with <code>m = n - 1</code></div>
</div>
<div class="paragraph">
<p>The entire work station (the combined buffer processes and the assembly server process) is described by:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">proc W(list chan? item a; chan! list item b):
list(size(a)) chan item c;
run unwind i in range(size(a)):
B(a[i], c[i])
end,
S(c,b)
end</code></pre>
</div>
</div>
<div class="paragraph">
<p>The size of the list of channels <code>a</code> is determined during initialization of the workstation.
This size is used for the generation of the process buffers, and the accompanying channels.</p>
</div>
<div class="paragraph">
<p>The assembly server process works in the same way as before, except for a generic <code>n</code> components, it is impossible to write a select statement explicitly.
Instead, an <em>unwind</em> is used to unfold the alternatives:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">proc S(list chan? item c, chan! list item b):
list(size(c)) item v;
list int rec;
while true:
rec = range(size(c));
while not empty(rec):
select
unwind i in rec
c[i]?v[i]: rec = rec - [i]
end
end
end;
delay ...;
b!v
end
end</code></pre>
</div>
</div>
<div class="paragraph">
<p>The received components are again in <code>v</code>.
Item <code>v[i]</code> is received from channel <code>c[i]</code>.
The indices of the channels that have not provided an item are in the list <code>rec</code>.
Initially, it contains all channels <code>0</code> &#8230;&#8203; <code>size(c)</code>, that is, <code>range(size(c))</code>.
While <code>rec</code> still has a channel index to monitor, the <code>unwind i in rec</code> unfolds all alternatives that are in the list.
For example, if <code>rec</code> contains <code>[0, 1, 5]</code>, the <code>select unwind i in rec ... end</code> is equivalent to:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">select
c[0]?v[0]: rec = rec - [0]
alt
c[1]?v[1]: rec = rec - [1]
alt
c[5]?v[5]: rec = rec - [5]
end</code></pre>
</div>
</div>
<div class="paragraph">
<p>After receiving an item, the index of the channel is removed from <code>rec</code> to prevent receiving a second item from the same channel.
When all items have been received, the assembly process starts (modeled with a <code>delay</code>, followed by sending the assembled component away with <code>b!v</code>.</p>
</div>
<div class="paragraph">
<p>In practical situations these assembly processes are performed in a more cascading manner.
Two or three components are 'glued' together in one assemble process, followed in the next process by another assembly process.</p>
</div>
</div>
<div class="sect3">
<h4 id="tut-exercises-6">Exercises</h4>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>To understand how time and time units relate to each other, change the time unit of the model in <a href="#tut-the-clock">The clock</a>.</p>
<div class="olist loweralpha">
<ol class="loweralpha" type="a">
<li>
<p>Change the model to using time units of one second (that is, one time unit means one second of simulated time).</p>
</li>
<li>
<p>Predict the resulting throughput and flow time for a deterministic case like in <a href="#tut-servers-with-time">Servers with time</a>, with <code>ta = 4</code> and <code>ts = 5</code>.
Verify the prediction with an experiment, and explain the result.</p>
</li>
</ol>
</div>
</li>
<li>
<p>Extend the model <a href="#tut-figure-controlled-factory">A controlled factory</a> in <a href="#tut-buffer-exercises">Buffer exercises</a> with a single deterministic server taking <code>4.0</code> time units to model the production capacity of the factory.
Increase the number of products inserted by the generator, and measure the average flow time for</p>
<div class="olist loweralpha">
<ol class="loweralpha" type="a">
<li>
<p>A FIFO buffer with control policy <code>low = 0</code> and <code>high = 1</code>.</p>
</li>
<li>
<p>A FIFO buffer with control policy <code>low = 1</code> and <code>high = 4</code>.</p>
</li>
<li>
<p>A <em>LIFO</em> buffer with control policy <code>low = 1</code> and <code>high = 4</code>.</p>
</li>
</ol>
</div>
</li>
</ol>
</div>
<div class="paragraph">
<p></p>
</div>
</div>
</div>
<div class="sect2">
<h3 id="tut-chapter-conveyors">Conveyors</h3>
<div class="paragraph">
<p>A conveyor is a long belt on which items are placed at the starting point of the conveyor.
The items leave the conveyor at the end point, after traveling a certain period of time on the conveyor.
The number of items traveling on the conveyor varies, while each item stays the same amount of time on the conveyor.
It works like a buffer that provides output based on item arrival time instead of based on demand from the next process.</p>
</div>
<div class="paragraph">
<p>
</p>
</div>
<div class="sect3">
<h4 id="tut-using-timers">Timers</h4>
<div class="paragraph">
<p>
To model a conveyor, you have to wait until a particular point in time.
The Chi language has timers to signal such a time-out.
The timer is started by assigning it a value.
From that moment, it automatically decrements when time progresses in the model, until it reaches zero.
The function <code>ready</code> gives the boolean value <code>true</code> if the timer is ready.
The amount of time left can be obtained by reading from the variable.
An example:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">proc P():
timer t;
delay 10.0;
t = timer(5.0); # Get a time-out at time = 15.0
for i in range(7):
write("%f %f %b\n, time, real(t), ready(t));
delay 1.0
end
end
model M():
run P()
end</code></pre>
</div>
</div>
<div class="paragraph">
<p>Initially, <code>time</code> equals <code>0.0</code>.
The first action of process <code>P</code> is to delay the time for <code>10.0</code> time units.
Now the value of <code>time</code> equals <code>10.0</code>.
Nothing happens to timer <code>t</code> as it was already zero.
At time <code>10</code> timer <code>t</code> is started with the value <code>5.0</code>.
The output of the program is:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-console" data-lang="console">10.0 5.0 false
11.0 4.0 false
12.0 3.0 false
13.0 2.0 false
14.0 1.0 false
15.0 0.0 true
16.0 0.0 true</code></pre>
</div>
</div>
<div class="paragraph">
<p>Timer <code>t</code> decrements as time progresses, and it is <code>ready</code> at <code>10.0 + 5.0</code> units.
A process can have more timers active at the same moment.</p>
</div>
</div>
<div class="sect3">
<h4 id="tut-a-conveyor">A conveyor</h4>
<div class="paragraph">
<p>A conveyor is schematically depicted in <a href="#tut-figure-conveyor">A conveyor with three items</a>.</p>
</div>
<div id="tut-figure-conveyor" class="imageblock">
<div class="content">
<img src="./tutorial/pictures/conveyor_3items.png" alt="conveyor 3items">
</div>
<div class="title">Figure 19. A conveyor with three items</div>
</div>
<div class="paragraph">
<p>Three items are placed on the conveyor.
For simplicity, assume the conveyor is <code>60.0</code> meter long and has a speed of <code>1</code> meter per second.
An item thus stays on the conveyor for <code>60.0</code> seconds.</p>
</div>
<div class="paragraph">
<p>Item <code>0</code> has been placed on the conveyor <code>50.0</code> seconds ago, and will leave the conveyor <code>10.0</code> second from now.
In the same way, item <code>1</code> will leave <code>30.0</code> seconds from now, and <code>2</code> leaves after <code>45.0</code> seconds.
Each item has a <em>yellow sticker</em> with the time that the item leaves the conveyor.
Based on this idea, tuple type <code>conv_item</code> has been defined, consisting of a field <code>item</code>, denoting the received item, and a timer field <code>t</code>, with the remaining time until the item leaves the conveyor:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">type conv_item = tuple(item x; timer t);
proc T(chan? item a; chan! item b; real convey_time):
list conv_item xst; item x;
while true:
select
a?x:
xst = xst + [(x, timer(convey_time))]
alt
not empty(xst) and ready(xst[0].t), b!xst[0].x:
xst = xst[1:]
end
end
end</code></pre>
</div>
</div>
<div class="paragraph">
<p>The conveyor always accepts new items from channel <code>a</code>, and adds the item with the yellow sticker to the list.
If the conveyor is not empty, and the timer has expired for the first item in the list, it is sent (without sticker) to the next process.
The conveyor sends items to a process that is always willing to a receive an item, this implies that the conveyor is never blocked.
Blocking implies that the items nevertheless are transported to the end of the conveyor.</p>
</div>
<div class="paragraph">
<p>
</p>
</div>
</div>
<div class="sect3">
<h4 id="tut-a-priority-conveyor">A priority conveyor</h4>
<div class="paragraph">
<p>In this example, items are placed on a conveyor, where the time of an item on the conveyor varies between items.
Items arriving at the conveyor process, get inserted in the list with waiting items, in ascending order of their remaining time on the conveyor.
The field <code>tt</code> in the item denotes the traveling time of the item on the conveyor:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">type item = tuple(...; real tt; ...),
conv_item = tuple(item x; timer t);</code></pre>
</div>
</div>
<div class="paragraph">
<p>The predicate function <code>pred</code> is defined by:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">func bool pred(conv_item x, y):
return real(x.t) &lt;= real(y.t)
end</code></pre>
</div>
</div>
<div class="paragraph">
<p>The conveyor process becomes:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">proc T(chan? item a; chan! item b):
list conv_item xst; item x;
while true:
select
a?x:
xst = insert(xst, (x, timer(x.tt)), pred)
alt
not empty(xst) and ready(xst[0].t), b!xst[0].item:
xst = xst[1:]
end
end
end</code></pre>
</div>
</div>
<div class="paragraph">
<p>The conveyor process works like before, except the new item is inserted in the list according to its remaining time, instead of at the rear of the list.</p>
</div>
</div>
<div class="sect3">
<h4 id="tut-exercises-7">Exercises</h4>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Model the system as shown in <a href="#tut-figure-conveyor-system">A conveyor system</a> where <code>T</code> is a conveyor process with a capacity of <em>at most</em> three products and exponentially distributed conveying times with an average of <code>4.0</code>.</p>
<div class="paragraph">
<p>Compute the average flow time of products in the system.</p>
</div>
<div id="tut-figure-conveyor-system" class="imageblock">
<div class="content">
<img src="./tutorial/pictures/conveyor_system.png" alt="conveyor system">
</div>
<div class="title">Figure 20. A conveyor system</div>
</div>
</li>
<li>
<p>Model the system as shown in <a href="#tut-figure-three-parallel-servers">A system with three parallel servers</a> with exponentially distributed server processing times with an average of <code>4.0</code>.</p>
<div id="tut-figure-three-parallel-servers" class="imageblock">
<div class="content">
<img src="./tutorial/pictures/three_parallel_servers.png" alt="three parallel servers">
</div>
<div class="title">Figure 21. A system with three parallel servers</div>
</div>
<div class="olist loweralpha">
<ol class="loweralpha" type="a">
<li>
<p>Compute the average flow time of products in the system.</p>
</li>
<li>
<p>Are there differences in behavior between both systems?
Why (not)?</p>
</li>
</ol>
</div>
</li>
</ol>
</div>
</div>
</div>
<div class="sect2">
<h3 id="tut-chapter-simulation-and-experiments">Simulations and experiments</h3>
<div class="paragraph">
<p>So far, attention has focused on the Chi language, and how to use it for modeling a discrete-event system.</p>
</div>
<div class="paragraph">
<p>In this chapter, the focus shifts to performing simulations, in particular for systems with infinite behavior.
Also, how to perform multiple model simulations is explained.</p>
</div>
<div class="sect3">
<h4 id="tut-simulating-finite-systems">Simulating finite systems</h4>
<div class="paragraph">
<p>For systems that have simple cyclic behavior, the simulation can be 'exhaustive', for example:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">proc G(chan! real a):
a!time
end
proc M(chan? real a, chan! real b):
real x;
a?x; delay 5.0; b!x
end
proc E(chan? real a):
real x;
a?x;
writeln("Flow time: %.2f", time - x);
end
model M():
chan real gm, me;
run G(gm), M(gm, me), E(me);
end</code></pre>
</div>
</div>
<div class="paragraph">
<p>This simulation sends a single product through the line, prints the flow time, and exits.
(All processes end, which makes that the <code>run</code> statement and the model end as well.)</p>
</div>
<div class="paragraph">
<p>In this case, the answer is even obvious without running the simulation.</p>
</div>
</div>
<div class="sect3">
<h4 id="tut-exit">Simulating infinite systems</h4>
<div class="paragraph">
<p>For other systems, it is much harder to decide when enough has been simulated.
Typically, a process (<code>E</code> in the example below), collects values of the property of interest (for example flow time of products), until it has collected enough samples to draw a conclusion, and compute the resulting value.</p>
</div>
<div class="paragraph">
<p>After doing so, the problem arises to let all processes know the simulation should be stopped.
This can be programmed in the model (such as adding channels to signal termination of the simulation to all processes).
A simpler alternative is to use the <code>exit</code> statement, in the following way:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">proc real E(chan? real a, int N):
real total, x;
for n in range(N):
a?x;
total = total + time - x;
end;
exit total / N
end
model real M(... int N):
...
run ..., E(..., N);
end</code></pre>
</div>
</div>
<div class="paragraph">
<p>In process <code>E</code>, the average flow time is calculated and given as argument of the <code>exit</code> statement.
At the moment this statement is executed, the model and all processes are killed, and the computed value becomes the exit value (the result) of the simulation.
The <code>real</code> type before the name <code>E</code> denotes that the process may perform an <code>exit</code> statement returning a real value.
The model runs the <code>E</code> process, so it may also give an exit value as result.
These types are called <em>exit type</em>.
Exit values are printed to the screen by the simulator when it ends the model simulation.</p>
</div>
<div class="paragraph">
<p>Another option is to use <code>write</code> to output the computed value, and use <code>exit</code> without argument.
In that case, the exit value is of type <code>void</code>.</p>
</div>
</div>
<div class="sect3">
<h4 id="tut-experiment">Simulating several scenarios</h4>
<div class="paragraph">
<p>The above works nicely for single model simulations.
The model is started one time, and it derives a result for a single scenario.</p>
</div>
<div class="paragraph">
<p>Often however, you want to perform several model simulations.
This can be the exact same scenario when the model has stochastic behavior, or it can be with different parameter values each time (to investigate system behavior under different circumstances).
In such cases, you can use an experiment, like below:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">xper X():
real v;
int n;
for n in range(5, 10):
v = M(n);
write("%2d: %.2f\n", n, v)
end
end</code></pre>
</div>
</div>
<div class="paragraph">
<p>The experiment <code>X</code> looks just like a function, except that it has no <code>return</code> statement.
It can however 'call' a model like a function.
In the example above <code>M(n)</code> starts a simulation with model <code>M</code> and the given value for <code>n</code>.
When the model exits by means of the <code>exit</code> statement (this is required!), the computed exit value of the (model) simulation is assigned to variable <code>v</code>.
In the experiment, this value can be used for post-processing, or in this case, get printed as result value in a table.</p>
</div>
</div>
</div>
<div class="sect2">
<h3 id="tut-chapter-svg-visualization">SVG visualization</h3>
<div class="paragraph">
<p>A Chi simulation often produces large amounts of textual output that you have to process in order to understand the simulation result.
Also for people unfamiliar with the details of the simulated system, results are hard to understand.
A possible solution is to add a visualization of the system to the simulator, that displays how the system behaves over time.
Generally, it looses some of the details, but it makes globally checking, and explaining of the simulation much easier.</p>
</div>
<div class="paragraph">
<p></p>
</div>
<div class="sect3">
<h4 id="tut-the-svg-file-format">The SVG file format</h4>
<div class="paragraph">
<p>
The <a href="http://www.w3.org/TR/SVG11/">Scalable Vector Graphics</a> (SVG) file format is a widely used, royalty-free standard for two-dimensional vector graphics, developed by the <a href="http://www.w3.org/">World Wide Web Consortium</a> (W3C).
SVG images consist of three types of objects: vector graphic shapes (rectangles, circles, etc.), raster images, and text.
The benefit of vector images formats over raster image formats, is that raster images are created with a fixed size, while vector images contain a description of the image and can be rendered at any size without loss of quality.</p>
</div>
<div class="paragraph">
<p>
SVG image files are stored in an <a href="http://en.wikipedia.org/wiki/XML">XML</a>-based file format.
This means that they can be edited with any text editor.
However, it is often more convenient to edit them with a drawing program that supports vector graphics, such as <a href="http://www.adobe.com/products/illustrator.html">Adobe Illustrator</a> or <a href="https://inkscape.org/">Inkscape</a>.
Most modern web browsers also support display of SVG images.</p>
</div>
</div>
<div class="sect3">
<h4 id="tut-visualization">Visualization</h4>
<div class="paragraph">
<p>An SVG file has a tree structure; (graphical) elements are drawn in the same order as they appear in the file.
Elements further down in the file are thus drawn on top of earlier elements.
Also, each element has a position and size.
They may have other properties like a color or a gradient as well.
There are also 'administrative' elements, that can group, scale, or rotate parts of the tree.
The website of Jakob Jenkov has a very nice <a href="http://tutorials.jenkov.com/svg">SVG Tutorial</a>.</p>
</div>
<div class="paragraph">
<p>The SVG visualization by the Chi simulator exploits this structure.
You access the elements, and literally change the value of their properties or copy part of the tree.
The <a href="http://xmlgraphics.apache.org/batik/">Apache Batik SVG Toolkit</a> used for drawing the SVG image at the screen notices the changes, and updates the displayed image.</p>
</div>
<div class="paragraph">
<p>By updating the SVG tree every time when the state of the simulation changes, you can display how a system evolves over time as an animated image.</p>
</div>
</div>
</div>
<div class="sect2">
<h3 id="tut-chapter-svg-example">SVG visualization example</h3>
<div class="paragraph">
<p>To illustrate how to make an SVG visualization, a simple generator, buffer, server, buffer, server, exit (GBSBSE) process line is used.
Below the generator and exit process definitions, and the model:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">proc G(chan! real to; real ptime):
int n = 0;
while n &lt; 100:
to!time; delay ptime; n = n + 1
end
end
proc E(chan? real from):
real x;
while true:
from?x
end
end
model M():
list(3) chan real c;
list(2) chan real bs;
run G(c[0], 1.1),
B(0, c[0], bs[0], 3),
S(0, bs[0], c[1], 1.0, exponential(10.0), exponential(4.0)),
B(1, c[1], bs[1], 3),
S(1, bs[1], c[2], 0.9, exponential(10.0), exponential(4.0)),
E(c[2]);
end</code></pre>
</div>
</div>
<div class="paragraph">
<p>This system should be visualized, where the number of items in each buffer should be displayed, and the state of each server (waiting for input, processing, or waiting for output) should also be shown.
The <a href="./tutorial/gbse.svg">gbse.svg</a> SVG file was made for this purpose, which looks like</p>
</div>
<div class="imageblock">
<div class="content">
<img src="./tutorial/sbb.png" alt="sbb">
</div>
</div>
<div class="paragraph">
<p>in an editor.
The black rectangle represents the displayed area when the visualization is running.
It has two light-green rectangles in it, representing the first and second buffer.
The darker green rectangles inside will vary in height to show the number of items in each buffer.</p>
</div>
<div class="paragraph">
<p>The circle at the left of the displayed area is never displayed in the visualization.
However, each server makes a copy of it, and places it at an appropriate position in the display.
While for two servers, one could just as well perform the copying beforehand, as was done with the buffer graphics, but the copying technique demonstrates how to scale visualizations for displaying a larger number of items without a lot of effort.</p>
</div>
<div class="sect3">
<h4 id="tut-buffer-visualization">Buffer visualization</h4>
<div class="paragraph">
<p>The left darker green rectangle has an <code>id</code> with value <code>buf0</code>, while the right rectangle has an <code>id</code> containing <code>buf1</code>.
Through the <code>id</code>, you can access the properties, in this case, the height, for example <code>attr buf0.height = 50</code>.
This will set the <code>height</code> property of the SVG element named <code>buf0</code> to <code>50</code>.</p>
</div>
<div class="paragraph">
<p>The SVG visualization is not in the Chi model itself, it is an external entity.
You access it by opening a 'file', and writing the commands such as above, as lines of text.
The code of the buffer is shown below.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">proc B(int num; chan? real from; chan! real to; int cap):
list real xs;
real x;
file f = open("SVG:gbse.svg", "w");
while true:
select size(xs) &gt; 0, to!xs[0]:
xs = xs[1:];
alt size(xs) &lt; cap, from?x:
xs = xs + [x]
end
writeln(f, "attr buf%d.height = %d", num, size(xs) * 50);
end
close(f);
end</code></pre>
</div>
</div>
<div class="paragraph">
<p>It is a normal finite buffer process, except for three additional lines.
The first change is the <code>file f = open("SVG:gbse.svg", "w");</code> line.
It creates a connection to the SVG visualization due to the <code>SVG:</code> prefix of the file name.
<code>gbse.svg</code> is the name of the <code>.svg</code> file described above.
The 'file' should be opened for writing (since you will be sending commands to it).</p>
</div>
<div class="paragraph">
<p>The second line is the <code>writeln(f, "attr buf%d.height = %d", num, size(xs) * 50);</code> line, which constructs a line of text to set the height of the darker green rectangle to a value proportional to the number of elements in the buffer.
There is however a <a href="#svg-vertical-trickery">vertical coordinate trick</a> needed to make it all work.</p>
</div>
<div class="paragraph">
<p>The third line is the <code>close(f);</code> line at the end of the process.
It closes the connection to the SVG visualization.</p>
</div>
<div class="paragraph">
<p></p>
</div>
</div>
<div class="sect3">
<h4 id="svg-vertical-trickery">Vertical coordinates trickery</h4>
<div class="paragraph">
<p>In SVG, the vertical coordinates run from the top of the screen to the bottom.
If you just draw a rectangle, its base position <code>(x,y)</code> is at the top-left corner, with <code>width</code> going to the right of the screen, and <code>height</code> towards the bottom.
In other words, if you change the height of a simple SVG rectangle by a program like the buffer process, the rectangle will grow downwards instead of upwards!</p>
</div>
<div class="paragraph">
<p>To make it grow upwards instead, you can</p>
</div>
<div class="ulist">
<ul>
<li>
<p>change both the <code>height</code> and the <code>y</code> coordinate of the rectangle at the same time (you move the top of the rectangle in opposite direction with its growth in height, so it looks like the rectangle grows upwards), or</p>
</li>
<li>
<p>flip the coordinate system of the rectangle by inserting a '180 degrees rotation' transformation around the rectangle (you tell SVG to draw the rectangle 'upside down', thus if you make it higher, it grows downwards, but the flipped coordinate displays it as growth upwards.</p>
</li>
</ul>
</div>
</div>
<div class="sect3">
<h4 id="tut-server-process">Server process</h4>
<div class="paragraph">
<p>The server process code looks as follows (ignore all the <code>writeln</code> lines for now).</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">proc S(int num; chan? real from; chan! real to; real ptime; dist real up, down):
real event, x;
file f = open("SVG:gbse.svg", "w");
writeln(f, "copy server, , _x%d", num);
writeln(f, "absmove s_x%d (%d, 325)", num, num*420+150);
while true:
event = time + sample up;
# Up; process items.
while event &gt; time:
writeln(f, "attr s_x%d.fill=yellow", num);
from?x;
writeln(f, "attr s_x%d.fill=green", num);
delay ptime;
writeln(f, "attr s_x%d.fill=magenta", num);
to!x;
end
# Down; repair machine.
writeln(f, "attr s_x%d.fill=red", num);
delay sample down;
end
close(f);
end</code></pre>
</div>
</div>
<div class="paragraph">
<p>The server runs forever, starting with sampling how long it will be up (<code>event = time + sample up</code>).
Until it has reached that time (<code>while event &gt; time:</code>), it cycles through getting a product, processing it for <code>uptime</code> time units, and sending the product out again.
After a few cycles, it has reached the <code>event</code> time, goes down, and waits for repair (<code>delay sample down;</code>).
Once the machine is repaired it starts again.
Visualization of the servers is discussed below.</p>
</div>
</div>
<div class="sect3">
<h4 id="tut-visualizing-the-server">Visualizing the server</h4>
<div class="paragraph">
<p>A server is to be visualized with a circle that changes color depending on what the server is doing.
Yellow means it is waiting for a product, green means processing, magenta means it is waiting to pass the finished product to the next station, and red means the machine is down.
After repairing, it will continue processing.</p>
</div>
<div class="paragraph">
<p>As with the buffer process, the SVG visualization first opens a file connection to the visualizer and the SVG file with the <code>file f = open("SVG:gbse.svg", "w");</code> line.
The filename of the <code>.svg</code> file must be the same as with the buffer process (the visualizer can only show one SVG file at a time).</p>
</div>
<div class="paragraph">
<p>To display server state in the SVG visualization, we need a circle (called <em>arc</em> in SVG) named <code>s_0</code> and <code>s_1</code> (for server 0 and server 1), positioned behind its buffer.
If there are not too many servers, and their number is fixed, one could simply add those arcs to the SVG file and be done with it.
However, if you have a lot of servers, or you don&#8217;t know in advance how many you will have, you cannot add them beforehand, you need to construct the SVG elements 'on the fly'.</p>
</div>
</div>
<div class="sect3">
<h4 id="tut-copying-svg-elements">Copying SVG elements</h4>
<div class="paragraph">
<p>For showing the server states, arcs named <code>s_0</code> and <code>s_1</code> are required in SVG, which are created by copying and moving an SVG element.
In this case, a server is represented by just one SVG element, so you can copy and move that one element.
In general however, you want to copy several elements at the same time (for example you might want to copy graphical elements to display a work station, a server with its buffer).</p>
</div>
<div class="paragraph">
<p>SVG has group elements, where you can put any number of (graphical) elements inside.
When you copy a group, you copy its entire contents.
The <code>gbse.svg</code> file as a group called <code>server</code>, containing an arc element called <code>s</code>.
The server group is copied and moved, which causes the arc element to be copied and moved as well.</p>
</div>
<div class="paragraph">
<p>Inside an SVG file, each element must have a unique <code>id</code>, that is, each element must have a unique name.
When making a copy, the copied elements must thus also be given a new name.
The entire operation is performed with sending a <code>copy [node], [prefix], [suffix]</code> command to the SVG visualizer.
It takes the element named <code>[node]</code>, and makes a full copy of it (all elements inside it are also copied).
For each copied element the <code>[prefix]</code> is added in front of its <code>id</code> name, and the <code>[suffix]</code> is added behind it.</p>
</div>
<div class="paragraph">
<p>The <code>writeln(f, "copy server, , _x%d", num);</code> line in the Chi simulation performs the copy operation for the servers.
It takes the <code>server</code> group element (which contains an <code>s</code> arc element), and adds nothing in front of the names (there is no text between the first and the second comma).
It appends the names with <code>_x0</code> for the first server, and <code>_x1</code> for the second server.
The result is thus a copy of the <code>server</code> group, called <code>server_x0</code> or <code>server_x1</code>, containing an arc <code>s_x0</code> respectively <code>s_x1</code>.</p>
</div>
<div class="paragraph">
<p>Note that the copy command performs copying, and nothing else.
Since the copied element is exactly at the same position as the original, you don&#8217;t see copies.
This is however fixed by a move command explained next.</p>
</div>
</div>
<div class="sect3">
<h4 id="tut-moving-svg-elements">Moving SVG elements</h4>
<div class="paragraph">
<p>You often want to position an SVG element at some point in the display.
The simplest way to do that is to change its <code>x</code> and <code>y</code> attributes, much like the <code>height</code> attribute of the buffer rectangle was modified.
Another solution is to perform a relative move, using transform/translate.</p>
</div>
<div class="paragraph">
<p>This works, until you add a transformation element that changes the coordinate system.
Sometimes you do this consciously, for example adding a 'flip' transformation to fix the vertical coordinates.
At other times the SVG editor may insert one, for example when you rotate or scale some part of the drawing.</p>
</div>
<div class="paragraph">
<p>The Chi SVG visualizer has a <code>absmove [node] ([xpos], [ypos])</code> command to handle this case.
It computes a transformation to get the top-left corner of the element named <code>[node]</code> at position (<code>[xpos]</code>, <code>[ypos]</code>).
Keep in mind that the vertical coordinate starts at the top, and goes down.</p>
</div>
<div class="paragraph">
<p>There are limitations to this command, in some case it may fail (see the <a href="#ref-chapter-svg-visualization">reference manual</a> for details about the command).
It is recommended to use this command one time on an element to move it to a known base position.
Once it is at a known position, change the <code>x</code> and <code>y</code> coordinates of a child element (to avoid disturbing the base position), to move relative to that base position.
Another solution is to perform a relative move, using transform/translate.</p>
</div>
<div class="paragraph">
<p>In the Chi simulation, the <code>writeln(f, "absmove s_x%d (%d, 325)", num, num*420+150);</code> line moves the copied <code>s_x0</code> and <code>s_x1</code> arcs to the right position in the display.</p>
</div>
<div class="paragraph">
<p>With the arcs in the right position in the display, the servers can display their activities by changing the color of the <code>fill</code> attribute.</p>
</div>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="ref-chapter-reference-manual">Chi Reference Manual</h2>
<div class="sectionbody">
<div class="paragraph">
<p>This manual explains the allowed Chi language constructs and their semantics.
Topics discussed here are:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><a href="#ref-chapter-global-definitions">Global definitions</a></p>
</li>
<li>
<p><a href="#ref-chapter-statements">Statements</a></p>
</li>
<li>
<p><a href="#ref-chapter-expressions">Expressions</a></p>
</li>
<li>
<p><a href="#ref-chapter-standard-library">Standard library functions</a></p>
</li>
<li>
<p><a href="#ref-chapter-distributions">Distributions</a></p>
</li>
<li>
<p><a href="#ref-chapter-types">Types</a></p>
</li>
<li>
<p><a href="#ref-chapter-lexical-syntax">Lexical syntax</a></p>
</li>
<li>
<p><a href="#ref-chapter-migration">Model migration</a></p>
</li>
<li>
<p><a href="#ref-chapter-svg-visualization">SVG visualization</a></p>
</li>
</ul>
</div>
<div class="sect2">
<h3 id="ref-chapter-global-definitions">Global definitions</h3>
<div class="paragraph">
<p>At global level, a Chi program is a sequence of definitions, as shown in the following diagram.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="./reference-manual/rail_diagrams/program.png" alt="program">
</div>
</div>
<div class="paragraph">
<p>Each of the definitions is explained below.
The syntax diagram suggests that a <code>;</code> separator is obligatory between definitions.
The implementation is more liberal, you may omit the separator when a definition ends with the <code>end</code> keyword.
Also, it is allowed to use a separator after the last definition.</p>
</div>
<div class="paragraph">
<p>The name of each global definition has to be unique.</p>
</div>
<div class="paragraph">
<p>
</p>
</div>
<div class="sect3">
<h4 id="ref-enum-definitions">Enumeration definitions</h4>
<div class="paragraph">
<p>With enumerations, you create a new enumeration type containing a number of names (called enumeration values).
The syntax is given below.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="./reference-manual/rail_diagrams/enumdef.png" alt="enumdef">
</div>
</div>
<div class="paragraph">
<p>The enumeration definitions start with the keyword <code>enum</code>, followed by a sequence of definitions separated with a <code>,</code>.
Each definition associates an enumeration type name with a set of enumeration value names.
For example:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">enum FlagColours = {red, white, blue},
MachineState = {idle, heating, processing};</code></pre>
</div>
</div>
<div class="paragraph">
<p>The enumeration type names act as normal types, and the enumeration values are its values.
The values have to be unique words.</p>
</div>
<div class="paragraph">
<p>For example, you can create a variable, and compare values like:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">MachineState state = idle;
...
while state != processing:
...
end</code></pre>
</div>
</div>
<div class="paragraph">
<p>Note that enumeration values have no order, you cannot increment or decrement variables with an enumeration type, and you can only compare values with equality and inequality.</p>
</div>
<div class="paragraph">
<p>
</p>
</div>
</div>
<div class="sect3">
<h4 id="ref-type-definitions">Type definitions</h4>
<div class="paragraph">
<p>Type definitions allow you to assign a name to a type.
By using a name instead of the type itself, readability of the program increases.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="./reference-manual/rail_diagrams/typedef.png" alt="typedef">
</div>
</div>
<div class="paragraph">
<p>A type definition starts with the keyword <code>type</code>, followed by a number of 'assignments' that associate a type name with a type, separated with a <code>,</code>.
For further details about type names and types, see <a href="#ref-chapter-types">Types</a>.</p>
</div>
<div class="paragraph">
<p>An example:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">type lot = real,
batch = list lot;</code></pre>
</div>
</div>
<div class="paragraph">
<p>Here a <code>lot</code> type name is introduced that is implemented with a real number, and a <code>batch</code> type name is created, which is a list of <code>lot</code>.</p>
</div>
<div class="paragraph">
<p>These type names can be used at every place where you can use a type, for example in variable declarations:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">batch xs;
lot x;</code></pre>
</div>
</div>
<div class="paragraph">
<p>Note that you cannot define use a type name in its own definition.</p>
</div>
<div class="paragraph">
<p>
</p>
</div>
</div>
<div class="sect3">
<h4 id="ref-constant-definitions">Constant definitions</h4>
<div class="paragraph">
<p>Constant definitions allow you to give a name to a fixed value to enhance readability.
It also makes it easier to change a value between different experiments.
For example, if you have a constant named <code>speed</code>, and you want to investigate how its value affects performance, you only have to change value in the constant definition, instead of finding and changing numbers in the entire program.</p>
</div>
<div class="paragraph">
<p>The syntax of constant definitions is as follows.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="./reference-manual/rail_diagrams/constantdef.png" alt="constantdef">
</div>
</div>
<div class="paragraph">
<p>An example:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">const real speed = 4.8,
dict(string : list int) recipes = { "short" : [1,4,8],
"long" : [1,1,2,3,4,5] };</code></pre>
</div>
</div>
<div class="paragraph">
<p>Here, a <code>speed</code> real value is defined, and <code>recipes</code> value, a dictionary of string to numbers.
The constant names can be used at every point where you can use an expression.
See the <a href="#ref-chapter-expressions">Expressions</a> section for details about expressions.</p>
</div>
<div class="paragraph">
<p>Note that you cannot use a constant name in its own definition.</p>
</div>
<div class="paragraph">
<p>
</p>
</div>
</div>
<div class="sect3">
<h4 id="ref-process-definitions">Process definitions</h4>
<div class="paragraph">
<p>A process is an entity that shows behavior over time.
A process definition is a template for such a process.
It is defined as follows.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="./reference-manual/rail_diagrams/procdef.png" alt="procdef">
</div>
</div>
<div class="paragraph">
<p>The definition starts with the keyword <code>proc</code> optionally followed by an exit type.
The name of the process definition, and its formal parameters concludes the header.
In the body, the behavior is described using statements.</p>
</div>
<div class="paragraph">
<p>Formal parameters are further explained in <a href="#ref-formal-parameters">Formal parameters</a>, statements are explained in the <a href="#ref-chapter-statements">Statements</a> section.</p>
</div>
<div class="paragraph">
<p>For example:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">proc P():
writeln("Hello");
delay 15;
writeln("Finished")
end</code></pre>
</div>
</div>
<div class="paragraph">
<p>In the example, a process definition with the name <code>P</code> is defined, without parameters, that outputs a line of text when starting, and another line of text 15 time units later (and then finishes execution).</p>
</div>
<div class="paragraph">
<p>Creating and running a process is done with <a href="#ref-sub-process-statements">Sub-process statements</a> (<code>start</code> or <code>run</code>) from another process or from a model.</p>
</div>
<div class="paragraph">
<p>If a process definition has no exit type specified, it may not use the <code>exit</code> statement, nor may it start other processes that have an exit type (see also <a href="#ref-sub-process-statements">Sub-process statements</a>).
Process definitions that have an exit type may use the <code>exit</code> statement directly (see <a href="#ref-exit-statement">Exit statement</a> for details on the statement), and it may start other processes without exit type, or with the same exit type.</p>
</div>
<div class="paragraph">
<p>Since values returned by the <code>exit</code> statement may get printed onto the output, you may only use exit types that are printable.
These are all the 'normal' data values, from simple booleans to lists, sets, and dictionaries of data values, but not channels, files, etc.</p>
</div>
<div class="paragraph">
<p>
</p>
</div>
</div>
<div class="sect3">
<h4 id="ref-model-definitions">Model definitions</h4>
<div class="paragraph">
<p>A model behaves like a process, the only difference is that a model is run as first process.
It is the 'starting point' of a simulation.
As such, a model can only take data values which you can write down as literal value.
For example, giving it a channel or a process instance is not allowed.</p>
</div>
<div class="paragraph">
<p>Like the process, a model also has a definition.
It is defined below.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="./reference-manual/rail_diagrams/modeldef.png" alt="modeldef">
</div>
</div>
<div class="paragraph">
<p>The syntax is exactly the same as process definitions explained in <a href="#ref-process-definitions">Process definitions</a>, except it starts with a <code>model</code> keyword instead.
A model can be started directly in the simulator (see <a href="#tool-chapter-software-operation">Software operation</a>), or as part of an experiment, explained in <a href="#tut-experiment">Simulating several scenarios</a>, and <a href="#ref-xper-definitions">Experiment definitions</a>.
If the model definition has no exit type, it may not use the <code>exit</code> statement directly, nor may it start other processes that have an exit type.
If an exit type is specified, the model may use the <code>exit</code> statement to end the model simulation (see <a href="#ref-sub-process-statements">Sub-process statements</a> for details), and it may start other processes, either without exit type, or with a matching exit type.</p>
</div>
<div class="paragraph">
<p>
</p>
</div>
</div>
<div class="sect3">
<h4 id="ref-function-definitions">Function definitions</h4>
<div class="paragraph">
<p>In programs, computations are executed to make decisions.
These computations can be long and complex.
A function definition attaches a name to a computation, so it can be moved to a separate place in the file.</p>
</div>
<div class="paragraph">
<p>Another common pattern is that the same computation is needed at several places in the program.
Rather than duplicating it (which creates consistency problems when updating the computation), write it in a function definition, and call it by name when needed.</p>
</div>
<div class="paragraph">
<p>The syntax of a function definition is as follows.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="./reference-manual/rail_diagrams/funcdef.png" alt="funcdef">
</div>
</div>
<div class="paragraph">
<p>In the syntax, the only thing that changes compared with the syntax in <a href="#ref-process-definitions">Process definitions</a> or <a href="#ref-model-definitions">Model definitions</a> is the additional <code>Type</code> node that defines the type resulting from the computation.</p>
</div>
<div class="paragraph">
<p>However, since a function represents a computation (that is, calculation of an output value from input values) rather than having behavior over time, the <code>Body</code> part has additional restrictions.</p>
</div>
<div class="ulist">
<ul>
<li>
<p>A computation is performed instantly, no time passes.
This means that you cannot delay or wait in a function.</p>
</li>
<li>
<p>A computation outputs a result.
You cannot have a function that has no result.</p>
</li>
<li>
<p>A computation is repeatable.
That means if you run the same computation again with the same input values, you get the same result <em>every time</em>.
Also in the environment of the function, there should be no changes.
This idea is known as <em>mathematical functions</em>.</p>
<div class="paragraph">
<p>A consequence of having mathematical functions is that you cannot interact with 'outside'.
No querying of the current time, no communication, no select statement, and no use of distributions.</p>
</div>
<div class="paragraph">
<p>Technically, this would also imply no input/output, but for practical reasons this restriction has been lifted.
However, as a general rule, avoid using it.</p>
</div>
</li>
</ul>
</div>
<div class="paragraph">
<p>
</p>
</div>
</div>
<div class="sect3">
<h4 id="ref-xper-definitions">Experiment definitions</h4>
<div class="paragraph">
<p>An experiment can execute one or more model simulations, collect their exit values, and combine them into a experiment result.
Its syntax is shown below.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="./reference-manual/rail_diagrams/xperdef.png" alt="xperdef">
</div>
</div>
<div class="paragraph">
<p>An experiment definition has some function-like restrictions, like not being able to use sub-process statements, no communication, and no use of time.
On the other hand, it does not return a value, and it can start model simulations that have a non-void exit type (<a href="#ref-void-type">Void type</a> discusses the void type).</p>
</div>
<div class="paragraph">
<p>The definition is very similar to other definitions.
It starts with an <code>xper</code> keyword, followed by the name of the definition.
The name can be used to start an experiment with the simulator (see <a href="#tool-chapter-software-operation">Software operation</a> for details on starting the simulator).
If formal parameters are specified with the experiment definition (see <a href="#ref-formal-parameters">Formal parameters</a> below), the experiment can be parameterized with values.
Like models, an experiment can only take data values which you can write down as literal value.
For example, giving it a channel or a process instance is not allowed.</p>
</div>
<div class="paragraph">
<p>The body of an experiment is just like the body of a <a href="#ref-function-definitions">Function definitions</a> (no interaction with processes or time).
Unlike a function, an experiment never returns a value with the <a href="#ref-return-statement">Return statement</a>.</p>
</div>
<div class="paragraph">
<p>The primary goal of an <code>xper</code> is to allow you to run one or more model simulations that give an exit value.
For this purpose, you can 'call' a model like a function, for example:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">xper X():
real total;
int n;
while n &lt; 10:
total = total + M();
n = n + 1
end
writeln("Average is %.2f", total / 10);
end
model real M():
dist real d = exponential(7.5);
exit sample d;
end</code></pre>
</div>
</div>
<div class="paragraph">
<p>The model above is very short to keep the example compact.
In practice it will be larger, start several concurrent processes, and do a lengthy simulation before it decides what the answer should be.
The experiment <code>X</code> makes ten calls to the model.
Each call causes the model to be run, until the model or one of its processes executes the <code>exit</code> statement.
At that point, the model and all its processes are killed, and the value supplied with the exit statement becomes the return value of the model call, adding it to <code>total</code>.
After the ten model simulations, the experiment outputs the average value of all model simulations.</p>
</div>
<div class="paragraph">
<p>Note that the called model (or one of its started processes) <strong>must</strong> end with the <code>exit</code> statement, it is an error when the model ends by finishing its last model statement.</p>
</div>
</div>
<div class="sect3">
<h4 id="ref-formal-parameters">Formal parameters</h4>
<div class="paragraph">
<p>Definitions above often take values as parameter to allow customizing their behavior during execution.
The definition of those parameters are called <em>formal parameters</em>.
The syntax of formal parameters is shown below.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="./reference-manual/rail_diagrams/formalparms.png" alt="formalparms">
</div>
</div>
<div class="paragraph">
<p>As you can see, they are just variable declarations (explained in the <a href="#ref-variable-declarations">Local variables</a> section), except you may not add an initial value, since their values are obtained during use of the definition.</p>
</div>
<div class="paragraph">
<p>To a definition, the formal parameters act like variables.
You may use them just like other variables.</p>
</div>
<div class="paragraph">
<p>An example, where <code>int x, y; string rel</code> are the formal parameters of process definition <code>P</code>:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">proc P(int x, y; string rel):
writeln("%d %s %d", x, rel, x-y)
end
...
run P(2, -1, "is less than");</code></pre>
</div>
</div>
<div class="paragraph">
<p>The formal parameters introduce additional variables in the process, that can be just just like any other variable.
Here, they are just printed to the screen.
Elsewhere in the program, the definition gets used (instantiated), and a value is supplied for the additional variables.
Such values are called <em>actual parameters</em>.</p>
</div>
</div>
</div>
<div class="sect2">
<h3 id="ref-chapter-statements">Statements</h3>
<div class="paragraph">
<p>
Statements express how a process or function in a system works.
They define what is done and in which order.
Many statements use data for their decisions, which is stored in local variables.
The combined local variables and statements are called 'body' with the following syntax.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="./reference-manual/rail_diagrams/body.png" alt="body">
</div>
</div>
<div class="paragraph">
<p>Data values available to the process are the global constants (see <a href="#ref-constant-definitions">Constant definitions</a>) and enumeration values (see <a href="#ref-enum-definitions">Enumeration definitions</a>).
The formal parameters of the surrounding process definition (explained in <a href="#ref-process-definitions">Process definitions</a>) or the surrounding function definition (explained in <a href="#ref-function-definitions">Function definitions</a>) are added as well.</p>
</div>
<div class="paragraph">
<p>Data storage that can be modified by the process are the local variables, defined by the <code>VarDefinitions</code> block in the <code>Body</code> diagram above (variable definitions are explained below in <a href="#ref-variable-declarations">Local variables</a>).</p>
</div>
<div class="paragraph">
<p>The data values and the modifiable data storage is used by the statements of the <code>Body</code> in the path after <code>1</code>.
For ease of reference they are grouped by kind of statement as shown in the <code>Statement</code> diagram below.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="./reference-manual/rail_diagrams/statement.png" alt="statement">
</div>
</div>
<div class="ulist">
<ul>
<li>
<p>The <code>AssignmentStatement</code> is used to assign new values to the local variables (and explained further in <a href="#ref-assignment-statement">Assignment statement</a>).</p>
</li>
<li>
<p>The <code>IterativeStatement</code> allows repeated execution of the same statements by means of the <code>for</code> and <code>while</code> statements (further explained in <a href="#ref-iterative-statements">Iterative statements</a>).</p>
</li>
<li>
<p>The <code>ChoiceStatement</code> allows selection on which statement to perform next by means of the <code>if</code> statement (explained in <a href="#ref-choice-statement">Choice statement</a>).</p>
</li>
<li>
<p>The <code>run</code> and <code>start</code> statements of the <code>SubProcessStatement</code> group (explained in <a href="#ref-sub-process-statements">Sub-process statements</a>) start new processes.</p>
</li>
<li>
<p>Communication with other processes using channels is done with send, receive, and <code>select</code> statements in <code>CommunicationStatement</code> (explained in <a href="#ref-communication-statements">Communication statements</a>)</p>
</li>
<li>
<p>Finally, the <code>OtherStatements</code> group contains several different statements (explained further in <a href="#ref-other-statements">Other statements</a>).
The more commonly used statements in that group are the <code>delay</code> statement, the <code>write</code> statement, and the <code>return</code> statement.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>The syntax diagram of <code>Body</code> states that statements are separated from each other with a semicolon (<code>;</code>).
The compiler allows more freedom.
Semicolons may be omitted before and after a <code>end</code> keyword, and a semicolon may be added after the last statement.</p>
</div>
<div class="paragraph">
<p>
</p>
</div>
<div class="sect3">
<h4 id="ref-variable-declarations">Local variables</h4>
<div class="paragraph">
<p>Local variables are introduced in a process or function using the following syntax.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="./reference-manual/rail_diagrams/vardef.png" alt="vardef">
</div>
</div>
<div class="paragraph">
<p>Variable definitions start with a <code>Type</code> node (its syntax if explained in <a href="#ref-chapter-types">Types</a>), followed by a sequence of variable names where each variable may be initialized with a value by means of the <code>= Expression</code> path.
If no value is assigned, the variable gets the default value of the type.
Use a semicolon to terminate the sequence of new variables.</p>
</div>
<div class="paragraph">
<p>Next, another set of variables may be defined by going back to the start of the diagram, and giving another <code>Type</code> node, or the diagram can be ended, and the statements of the process or function can be given.</p>
</div>
<div class="paragraph">
<p>
</p>
</div>
</div>
<div class="sect3">
<h4 id="ref-assignment-statement">Assignment statement</h4>
<div class="paragraph">
<p>An assignment statement assigns one or more values to the local variables.
Its syntax is as follows.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="./reference-manual/rail_diagrams/assignment_statement.png" alt="assignment statement">
</div>
</div>
<div class="paragraph">
<p>The assignment statement computes the value of every <code>Expression</code> at the right.
If there is one expression, its value is also the value to assign.
If there are more expressions, a tuple value is constructed, combining all values into one tuple (see <a href="#ref-tuple-expression">Tuple expression</a> for a discussion of tuple values).</p>
</div>
<div class="paragraph">
<p>
At the left, a number of <code>Addressable</code> blocks define where the computed value is assigned to.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="./reference-manual/rail_diagrams/addressable.png" alt="addressable">
</div>
</div>
<div class="paragraph">
<p>An <code>Addressable</code> is a variable.
If the variable has a tuple type (see <a href="#ref-tuple-type">Tuple type</a>) a field of the tuple may be assigned only using Path 1.
Similarly, if the variable is a list (see <a href="#ref-list-type">List type</a>) or a dictionary (see <a href="#ref-dictionary-type">Dictionary type</a>) assignment is done to one element by using Path 2.
The <code>Expression</code> here is evaluated before <em>any</em> assignment by this statement is performed.
Since selected elements may also have a type that allows selection, element selection can be repeated.</p>
</div>
<div class="paragraph">
<p>After processing the element selections at the left, it is known where values are assigned to.
If there is exactly one addressable at the left, its type must match with the type of the value at the right (which may be a constructed tuple value as explained above).
The value gets copied into the variable (or in its element if one is selected).
If there are several addressable values at the left, the number of values must be equal to the length of the tuple from the expression(s) at the right, and each field of the right tuple must pair-wise match with the type of the addressed element at the left.
In the latter case, all assignments are done at the same moment.</p>
</div>
<div class="paragraph">
<p>For a few examples, a number of variable declarations are needed:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">int x, y;
real r;
list(10) int xs;
tuple(real v; int w) t;
func tuple(real v; int w) (int) f;
... # Initialization of the variables omitted</code></pre>
</div>
</div>
<div class="paragraph">
<p>The variable declarations introduce integer variables <code>x</code> and <code>y</code>, a real number variable <code>r</code>, a list of 10 integers <code>xs</code>, a tuple <code>t</code> with two fields, and a function variable <code>f</code>.</p>
</div>
<div class="paragraph">
<p>For reasons of clarity, initialization of the variables has been omitted.
Also, expressions at the right are simple values.
However, you may use all allowed expression operations explained in the next chapter (<a href="#ref-chapter-expressions">Expressions</a>) to obtain a value to assign.
The first assignments show assignment of values to variables where there is one explicit value for every assigned variable:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">x = 3;
t = f(y);
x, y = 4, 5;
xs[0], t.v = x+x, r;</code></pre>
</div>
</div>
<div class="paragraph">
<p>The first assignment statement assigns 3 to <code>x</code>.
The second assignment assigns the return value of the function call <code>f(y)</code> to tuple <code>t</code>.
The third assignment assigns 4 to <code>x</code> and 5 to <code>y</code> at the same time.
The fourth assignment assigns the value of <code>x+x</code> to the first element of the list <code>xs</code>, and the value of <code>r</code> to the <code>v</code> field of tuple <code>t</code>.</p>
</div>
<div class="paragraph">
<p>The next assignments show combining or splitting of tuples:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">t = r, y;
r, x = t;
r, x = f(y);</code></pre>
</div>
</div>
<div class="paragraph">
<p>The first assignment assigns a new value to every field of tuple <code>t</code> (<code>t.v</code> gets the value of <code>r</code>, while <code>t.w</code> gets the value of <code>y</code>).
This is called <em>packing</em>, it 'packs' the sequence of values into one tuple.
The opposite operation is demonstrated in the second assignment.
The value of each field of <code>t</code> is assigned to a separate variable.
The types of the variables at the left have to pair-wise match with the field types of the tuple at the right.
This assignment is called <em>unpacking</em>, it 'unpacks' a tuple value into its separate elements.
The third assignment does the same as the second assignment, the difference is that the value at the right is obtained from a function call.
The origin of the value is however irrelevant to the assignment statement.</p>
</div>
<div class="paragraph">
<p>To demonstrate the order of evaluation, the following assignment, under the assumption that variable <code>x</code> holds value 3:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">x, xs[x-1] = 7, x+2;</code></pre>
</div>
</div>
<div class="paragraph">
<p>The assignment first computes all values at the right.
Since there are more than one expression, they are combined into a tuple:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">x, xs[x-1] = (7, 5);</code></pre>
</div>
</div>
<div class="paragraph">
<p>Next, the addressable values are calculated:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">x, xs[2] = (7, 5);</code></pre>
</div>
</div>
<div class="paragraph">
<p>Finally the values are assigned, <code>x</code> gets a new value 7, while the third element of <code>xs</code> gets the value of expression <code>x+2</code>.</p>
</div>
<div class="paragraph">
<p>The expressions at the right as well as the expressions to select elements in lists and dictionaries are always evaluated using values from before the assignment.</p>
</div>
<div class="paragraph">
<p>It is forbidden to assign the same variable or selected element more than once:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">x, x = 3, 3 # Error, assigned 'x' twice.
xs[0], xs[1] = 0, 1 # Allowed, different selected elements.
xs[0], xs[x] = 0, 1 # Allowed if x != 0.</code></pre>
</div>
</div>
<div class="paragraph">
<p>
</p>
</div>
</div>
<div class="sect3">
<h4 id="ref-iterative-statements">Iterative statements</h4>
<div class="paragraph">
<p>The iterative statements are shown below.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="./reference-manual/rail_diagrams/iterative_statement.png" alt="iterative statement">
</div>
</div>
<div class="paragraph">
<p>The Chi language has two statements for repeatedly executing a body (a sequence of statements), a <code>while</code> statement and a <code>for</code> statement.
The former is the generic iterative statement, the latter simplifies the common case of iterating over a collection of values.</p>
</div>
<div class="paragraph">
<p>The <code>break</code> and <code>continue</code> statements change the flow of control in the iterative statements.</p>
</div>
<div class="paragraph">
<p>
</p>
</div>
<div class="sect4">
<h5 id="ref-while-loop-statement">While loop statement</h5>
<div class="imageblock">
<div class="content">
<img src="./reference-manual/rail_diagrams/while_statement.png" alt="while statement">
</div>
</div>
<div class="paragraph">
<p>A while loop starts with the keyword <code>while</code> with a boolean condition.
Between the colon and the <code>end</code> keyword, the body of statements is given, which is executed repeatedly.</p>
</div>
<div class="paragraph">
<p>Executing an iterative <code>while</code> statement starts with evaluating the boolean condition.
If it does not hold, the <code>while</code> statement ends (and execution continues with the statement following the while statement).
If the condition holds, the statements in the body are executed from start to end (unless a <code>break</code> or <code>continue</code> statement is executed, as explained below).
After the last statement has been executed, the <code>while</code> statement starts again from the beginning, by evaluating the boolean condition again.</p>
</div>
<div class="paragraph">
<p>As an example, consider the following code:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">int s, i;
while i &lt; 10:
s = s + i
i = i + 1
end</code></pre>
</div>
</div>
<div class="paragraph">
<p>At first, the <code>i &lt; 10</code> condition holds, and the body of the <code>while</code> statement (two assignment statements) is executed.
After the body has finished, <code>i</code> has been incremented, but is still less than <code>10</code>.
The condition again holds, and the body is again executed, etc.
This process continues, until the final statement of the body increments <code>i</code> to <code>10</code>.
The condition does not hold, and execution of the <code>while</code> statement ends.</p>
</div>
<div class="paragraph">
<p>
</p>
</div>
</div>
<div class="sect4">
<h5 id="ref-for-loop-statement">For loop statement</h5>
<div class="imageblock">
<div class="content">
<img src="./reference-manual/rail_diagrams/for_statement.png" alt="for statement">
</div>
</div>
<div class="paragraph">
<p>A common case for iterating is to execute some statements for every value in a collection, for example a list:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">list int xs;
int x;
int i;
while i &lt; size(xs):
x = xs[i]
...
i = i + 1
end</code></pre>
</div>
</div>
<div class="paragraph">
<p>where the <code>...</code> line represents the statements that should be executed for each value <code>x</code> of the list.
This is a very common case.
Chi has a special statement for it, the <code>for</code> statement.
It looks like:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">list int xs;
for x in xs:
...
end</code></pre>
</div>
</div>
<div class="paragraph">
<p>This code performs the same operation, the statements represented with <code>...</code> are executed for each value <code>x</code> from list <code>xs</code>, but it is shorter and easier to write.
The advantages are mainly a reduction in the amount of code that must be written.</p>
</div>
<div class="ulist">
<ul>
<li>
<p>No need to create and update the temporary index variable <code>i</code>.</p>
</li>
<li>
<p>Variable <code>x</code> is declared implicitly, no need to write a full variable declaration for it.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>The behavior is slightly different in some circumstances.</p>
</div>
<div class="ulist">
<ul>
<li>
<p>There is no index variable <code>i</code> that can be accessed afterwards.</p>
</li>
<li>
<p>When the <code>...</code> statements modify the source variable (<code>xs</code> in the example), the <code>while</code> statement above uses the changed value.
The <code>for</code> statement continues to use the original value of the source variable.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>Continuing use of the original source value can be an advantage or a disadvantage, depending on the case.
Using the new value gives more flexibility, keeping the old value makes the <code>for</code> statement more predictable, for example indices in the source variable stay valid.</p>
</div>
<div class="paragraph">
<p>Besides iterating over a list with <code>for</code>, you can also iterate over element values of a set, or over key-value tuples of a dictionary, for example:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">dict(int:int) d = {1:10, 2:20};
for k, v in d:
writeln("%s: %s", k, v);
end</code></pre>
</div>
</div>
<div class="paragraph">
<p>When iterating over a set or a dictionary, the order of the elements is undefined.
In the above example, the first pair is either <code>(1, 10)</code> or <code>(2, 20)</code>.</p>
</div>
<div class="paragraph">
<p>
</p>
</div>
</div>
<div class="sect4">
<h5 id="ref-break-statement">Break statement</h5>
<div class="imageblock">
<div class="content">
<img src="./reference-manual/rail_diagrams/break_statement.png" alt="break statement">
</div>
</div>
<div class="paragraph">
<p>The <code>break</code> statement may only be used inside the body of a loop statement.
When executed, the inner-most loop statement ends immediately, and execution continues with the first statement after the inner-most loop statement.
An example:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi"># Get a slice of the xs list, up-to the position of value x in the list
func get_until(list int xs, int x):
int index;
while index &lt; size(xs):
if xs[index] == x:
break
end;
index = index + 1
end
return xs[:index]
end</code></pre>
</div>
</div>
<div class="paragraph">
<p>In the example, elements of the list <code>xs</code> are inspected until an element with a value equal to <code>x</code> is found.
At that point, the loop ends with the <code>break</code> statement, and the function returns a slice of the list.</p>
</div>
<div class="paragraph">
<p>
</p>
</div>
</div>
<div class="sect4">
<h5 id="ref-continue-statement">Continue statement</h5>
<div class="paragraph">
<p>Another common case when executing the body of an inner-most loop is that the remaining statements of the body should be skipped this time.
It can be expressed with an <code>if</code> statement, but a <code>continue</code> statement is often easier.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="./reference-manual/rail_diagrams/continue_statement.png" alt="continue statement">
</div>
</div>
<div class="paragraph">
<p>The syntax of the continue statement is just <code>continue</code>.
An example to demonstrate its operation:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">int s;
for x in xs:
if x mod 5 == 0:
continue
end
s = s + x
end</code></pre>
</div>
</div>
<div class="paragraph">
<p>The <code>for</code> statement iterates over every value in list <code>xs</code>.
When the value is a multiple of 5 (expressed by the condition <code>x mod 5 == 0</code>), the <code>continue</code> is executed, which skips the remaining statements of the body of the <code>for</code> statement, namely the <code>s = s + x</code> assignment.
The result is that after executing the <code>for</code> statement, variable <code>s</code> contains the sum of all values of the list that are not a multiple of 5.</p>
</div>
<div class="paragraph">
<p>
</p>
</div>
</div>
</div>
<div class="sect3">
<h4 id="ref-choice-statement">Choice statement</h4>
<div class="paragraph">
<p>The choice statement, also known as 'if statement', selects one alternative from a list based on the current value of a boolean expression.
The alternatives are tried in turn, until a boolean expression one an alternative yields true.
The statements of that alternative are executed, and the choice statement ends.
The choice statement also ends when all boolean expressions yield false.
The boolean expression of the <code>else</code> alternative always holds.</p>
</div>
<div class="paragraph">
<p>The syntax of the choice statement is as follows.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="./reference-manual/rail_diagrams/choice_statement.png" alt="choice statement">
</div>
</div>
<div class="paragraph">
<p>Processing starts with evaluating the <code>BooleanExpression</code> behind the <code>if</code>.
If it evaluates to <code>true</code>, the statements behind it are executed, and the choice statement ends.</p>
</div>
<div class="paragraph">
<p>If the boolean expression behind the <code>if</code> does not hold, the sequence <code>elif</code> alternatives is tried.
Starting from the first one, each boolean expression is evaluated.
If it holds, the statements of that alternative are performed, and the choice statement ends.
If the boolean expression does not hold, the next <code>elif</code> alternative is tried.</p>
</div>
<div class="paragraph">
<p>When there are no <code>elif</code> alternatives or when all boolean expressions of the <code>elif</code> alternatives do not hold, and there is an <code>else</code> alternative, the statements behind the <code>else</code> are executed and the choice statement ends.
If there is no <code>else</code> alternative, the choice statement ends without choosing any alternative.</p>
</div>
<div class="paragraph">
<p>An example with just one alternative:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">if x == 1:
x = 2
end</code></pre>
</div>
</div>
<div class="paragraph">
<p>which tests for <code>x == 1</code>.
If it holds, <code>x = 2</code> is performed, else no alternative is chosen.</p>
</div>
<div class="paragraph">
<p>An longer example with several alternatives:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">if x == 1:
y = 5
elif x == 2:
y = 6; x = 6
else:
y = 7
end</code></pre>
</div>
</div>
<div class="paragraph">
<p>This choice statement first tests whether <code>x</code> is equal to <code>1</code>.
If it is, the <code>y = 5</code> statement is executed, and the choice statement finishes.
If the first test fails, the test <code>x == 2</code> is computed.
If it holds, the statements <code>y = 6; x = 6</code> are performed, and the choice statement ends.
If the second test also fails, the <code>y = 7</code> statement is performed.</p>
</div>
<div class="paragraph">
<p>The essential points of this statement are:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>The choice is computed now, you cannot wait for a condition to become true.</p>
</li>
<li>
<p>Each alternative is tried from the top down, until the first expression that yields true.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>The second point also implies that for an alternative to be chosen, the boolean expressions of all previous alternatives have to yield false.</p>
</div>
<div class="paragraph">
<p>In the above example, while executing the <code>y = 7</code> alternative, you know that <code>x</code> is neither <code>1</code> nor <code>2</code>.</p>
</div>
<div class="paragraph">
<p>
</p>
</div>
</div>
<div class="sect3">
<h4 id="ref-sub-process-statements">Sub-process statements</h4>
<div class="paragraph">
<p>The sub-process statements deal with creating and managing of new processes.
The statement may only be used in <a href="#ref-process-definitions">Process definitions</a> and <a href="#ref-model-definitions">Model definitions</a>.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="./reference-manual/rail_diagrams/subprocess_statement.png" alt="subprocess statement">
</div>
</div>
<div class="paragraph">
<p>The <code>RunStartStatement</code> block creates new processes (see <a href="#ref-run-and-start-statements">Run and start statements</a> for details), while the <code>FinishStatement</code> waits for a process to end (further explanation at <a href="#ref-finish-statement">Finish statement</a>).</p>
</div>
<div class="paragraph">
<p>
</p>
</div>
<div class="sect4">
<h5 id="ref-run-and-start-statements">Run and start statements</h5>
<div class="paragraph">
<p>The <code>run</code> and <code>start</code> commands take a sequence of process instance as their argument.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="./reference-manual/rail_diagrams/run_start.png" alt="run start">
</div>
</div>
<div class="paragraph">
<p>Both statements start all instances listed in the sequence.
The <code>start</code> statement ends directly after starting the processes, while the <code>run</code> statement waits until all the started instances have ended.
Using <code>run</code> is generally recommended for creating new processes.</p>
</div>
<div class="paragraph">
<p>
A process instance has the following syntax.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="./reference-manual/rail_diagrams/process_instance.png" alt="process instance">
</div>
</div>
<div class="paragraph">
<p>The elementary process instance is created using Path 1.
It consists of a process name (which must be one of the names of the <a href="#ref-process-definitions">Process definitions</a>), followed by a sequence of actual parameters for the process between parentheses.
The number of actual parameters and their types must match pair-wise with the number and type of the formal parameters of the referenced process definition.
Channel directions of the formal parameters must be a sub-set of the channel directions of the actual parameters.</p>
</div>
<div class="paragraph">
<p>The optional assignment of the process to a process variable (which must be of type <code>inst</code>, see <a href="#ref-inst-type">Instance type</a>) allows for checking whether the started process has ended, or for waiting on that condition in a <code>select</code> statement (explained in <a href="#ref-select-statement">Select statement</a>), or with a <code>finish</code> statement (explained in <a href="#ref-finish-statement">Finish statement</a>).</p>
</div>
<div class="paragraph">
<p>For example:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">chan c;
inst p, q;
run P(18, c), Q(19, c);
start p = P(18, c), q = Q(19, c);</code></pre>
</div>
</div>
<div class="paragraph">
<p>First two processes are completely run, namely the instances <code>P(18, c)</code>, and <code>Q(19, c)</code>.
When both have ended, the <code>start</code> statement is executed, which starts the same processes, and assigned the <code>P</code> process instance to instance variable <code>p</code> and the <code>Q</code> process instance to variable <code>q</code>.
After starting the processes, the <code>start</code> ends.
Unless one of started processes has already ended, in the statement following the <code>start</code>, three processes are running, namely the process that executed the start statement, and the two started process instances referenced by variables <code>p</code> and <code>q</code>.
(There may be more processes of course, created either before the above statements were executed, or the <code>P</code> or <code>Q</code> process may have created more processes.)</p>
</div>
<div class="paragraph">
<p>Path 2 of the <code>ProcessInstance</code> diagram is used to construct many new processes by means of an <code>unwind</code> loop.
Each value in the <code>Expression</code> gets assigned to the iterator variable sequence of <code>VariableName</code> blocks (and this may be done several times as the syntax supports several <code>Expression</code> loops).
For each combination of assignments, the process instances behind the colon are created.
The <code>end</code> keyword denotes the end of the <code>unwind</code>.</p>
</div>
<div class="paragraph">
<p>Typical use of <code>unwind</code> is to start many similar processes, for example:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">list int xs = [1, 2]
run
unwind i in range(5),
j in range(3),
x in xs: P(i, j, x)
end;</code></pre>
</div>
</div>
<div class="paragraph">
<p>This <code>run</code> statement runs 5*3*2 processes: <code>P(0, 0, 1)</code>, <code>P(0, 0, 2)</code>, <code>P(0, 1, 1)</code>, &#8230;&#8203;, <code>P(0, 2, 2)</code>, <code>P(1, 0, 1)</code>, &#8230;&#8203;, <code>P(4, 2, 2)</code>.</p>
</div>
<div class="paragraph">
<p>Both the <code>run</code> and the <code>start</code> statements can always instantiate new processes that have no exit type specified.
(see <a href="#ref-process-definitions">Process definitions</a> for details about exit types in process definitions).
If the definition containing the sub-process statement has an exit type, the statements can also instantiate processes with the same exit type.</p>
</div>
<div class="paragraph">
<p>This requirement ensures that all exit statements in a model simulation give exit values of the same type.</p>
</div>
<div class="paragraph">
<p>
</p>
</div>
</div>
<div class="sect4">
<h5 id="ref-finish-statement">Finish statement</h5>
<div class="paragraph">
<p>The <code>finish</code> statement allows waiting for the end of a process instance.
The statement may only be used in <a href="#ref-process-definitions">Process definitions</a> and <a href="#ref-model-definitions">Model definitions</a>.
Its syntax is as follows.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="./reference-manual/rail_diagrams/finish_statement.png" alt="finish statement">
</div>
</div>
<div class="paragraph">
<p>Each process variable must be of type <code>inst</code> (see <a href="#ref-inst-type">Instance type</a> for details).
The statement ends when all referenced process instances have ended.
For example:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">chan bool c;
inst p, q;
start p = P(18, c), q = Q(19, c);
finish p, q;</code></pre>
</div>
</div>
<div class="paragraph">
<p>During the <code>start</code> statement (see <a href="#ref-run-and-start-statements">Run and start statements</a>), instance variables <code>p</code> and <code>q</code> get a process instance assigned (this may also happen in different <code>start</code> statements).
The <code>finish</code> statement waits until both process instances have ended.</p>
</div>
<div class="paragraph">
<p>
</p>
</div>
</div>
</div>
<div class="sect3">
<h4 id="ref-communication-statements">Communication statements</h4>
<div class="paragraph">
<p>Communication with another process is the only means to forward information from one process to another processes, making it the primary means to create co-operating processes in the modeled system.
The statement may only be used in <a href="#ref-process-definitions">Process definitions</a> and <a href="#ref-model-definitions">Model definitions</a>.</p>
</div>
<div class="paragraph">
<p>All communication is point-to-point (from one sender to one receiver) and synchronous (send and receive occur together).
A communication often exchanges a message (a value), but communication without exchange of data is also possible (like waving 'hi' to someone else, the information being sent is 'I am here', but that information is already implied by the communication itself).
The latter form of communication is called <em>synchronization</em>.</p>
</div>
<div class="paragraph">
<p>Send and receive does not specify the remote process directly, instead a channel is used (see <a href="#ref-channel-type">Channel type</a> and <a href="#ref-channel-expression">Channel expressions</a> sections for more informations about channels and how to create them).
Using a channel increases flexibility, the same channel can be used by several processes (allowing communication with one of them).
Channels can also be created and exchanged during execution, for even more flexibility.</p>
</div>
<div class="paragraph">
<p>Setting up a communication channel between two processes is often done in the following way:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">chan void sync; # Synchronization channel
chan int dch; # Channel with integer number messages
run P(sync, dch), Q(sync, dch);</code></pre>
</div>
</div>
<div class="paragraph">
<p>In a parent process, two channels are created, a synchronization channel <code>sync</code>, and a communication channel with data called <code>dch</code>.
The channel values are given to processes <code>P</code> and <code>Q</code> through their formal parameters.</p>
</div>
<div class="paragraph">
<p>The communication statements are as follows.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="./reference-manual/rail_diagrams/communication_statement.png" alt="communication statement">
</div>
</div>
<div class="paragraph">
<p>The elementary communication statements for sending and receiving at a single channel are the <a href="#ref-send-statement">Send statement</a> and the <a href="#ref-receive-statement">Receive statement</a>.
The <a href="#ref-select-statement">Select statement</a> is used for monitoring several channels and conditions at the same time, until at least one of them becomes available.</p>
</div>
<div class="paragraph">
<p>
</p>
</div>
<div class="sect4">
<h5 id="ref-send-statement">Send statement</h5>
<div class="paragraph">
<p>The send statement send signals or data away through a channel.
The statement may only be used in <a href="#ref-process-definitions">Process definitions</a> and <a href="#ref-model-definitions">Model definitions</a>.
It has the following syntax:</p>
</div>
<div class="imageblock">
<div class="content">
<img src="./reference-manual/rail_diagrams/send_statement.png" alt="send statement">
</div>
</div>
<div class="paragraph">
<p>The statement takes a channel value (derived from <code>ChannelExpression</code>), and waits until another process can receive on the same channel.
When that happens, and the channel is a synchronization channel, a signal 'Communication has occurred' is being sent, if the channel also carries data, the <code>Expression</code> value is computed and sent to the other process.
For example:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">proc P(chan void a, chan! int b):
a!;
b!21;
end</code></pre>
</div>
</div>
<div class="paragraph">
<p>Process <code>P</code> takes two parameters, a synchronization channel locally called <code>a</code> and a outgoing channel called <code>b</code> carrying integer values.
In the process body, it first synchronizes over the channel stored in <code>a</code>, and then sends the value <code>21</code> of the channel stored in <code>b</code>.</p>
</div>
<div class="paragraph">
<p>
</p>
</div>
</div>
<div class="sect4">
<h5 id="ref-receive-statement">Receive statement</h5>
<div class="paragraph">
<p>The receive statement receives signals or data from a channel.
The statement may only be used in <a href="#ref-process-definitions">Process definitions</a> and <a href="#ref-model-definitions">Model definitions</a>.
It has the following syntax:</p>
</div>
<div class="imageblock">
<div class="content">
<img src="./reference-manual/rail_diagrams/receive_statement.png" alt="receive statement">
</div>
</div>
<div class="paragraph">
<p>The statement takes a channel value (derived from the <code>ChannelExpression</code>), and waits until another process can send on the same channel.
For synchronization channels, it receives just a signal that the communication has occurred, for channels carrying data, the data value is received and stored in the variable indicated by <code>Addressable</code>.
For example:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">proc Q(chan void a, chan int b):
int x;
a?;
b?x;
writeln("%s", x);
end</code></pre>
</div>
</div>
<div class="paragraph">
<p>Process <code>Q</code> takes a synchronization channel called <code>a</code> and a data channel for integer values called <code>b</code> as parameters.
The process first waits for a synchronization over channel <code>a</code>, and then waits for receiving an integer value over channel <code>b</code> which is stored in local variable <code>x</code>.</p>
</div>
<div class="paragraph">
<p>
</p>
</div>
</div>
<div class="sect4">
<h5 id="ref-select-statement">Select statement</h5>
<div class="paragraph">
<p>The <a href="#ref-send-statement">Send statement</a> and the <a href="#ref-receive-statement">Receive statement</a> wait for communication over a single channel.
In some cases, it is unknown which channel will be ready first.
Additionally, there may be time-dependent internal activities that must be monitored as well.
The select statement is the general purpose solution for such cases.
The statement may only be used in <a href="#ref-process-definitions">Process definitions</a> and <a href="#ref-model-definitions">Model definitions</a>.</p>
</div>
<div class="paragraph">
<p>It has the following syntax:</p>
</div>
<div class="imageblock">
<div class="content">
<img src="./reference-manual/rail_diagrams/select_statement.png" alt="select statement">
</div>
</div>
<div class="paragraph">
<p>The statement has one or more <code>SelectCondition</code> alternatives that are all monitored.
The first alternative is prefixed with <code>select</code> to denote it is a the start of a select statement, the other alternatives each start with <code>alt</code> (which is an abbreviation of 'alternative').</p>
</div>
<div class="paragraph">
<p>The statement monitors all conditions simultaneously, waiting for at least one to become possible.
At that moment, one of the conditions is selected to be executed, and the select statement ends.</p>
</div>
<div class="paragraph">
<p>The syntax of a <code>SelectCondition</code> is:</p>
</div>
<div class="imageblock">
<div class="content">
<img src="./reference-manual/rail_diagrams/select_condition.png" alt="select condition">
</div>
</div>
<div class="paragraph">
<p>In its simplest form, a <code>SelectCondition</code> is a <code>SelectAlternative</code> (taking Path 1).
At Path 2, the condition is eventually also an <code>SelectAlternative</code>, but prefixed with an <code>unwind</code> construct, and with an additional <code>end</code> keyword at the end to terminate the unwind.</p>
</div>
<div class="paragraph">
<p>The unwind construct allows for a compact notation of a large number of alternatives that must be monitored.
Examples are provided below.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="./reference-manual/rail_diagrams/select_alternative.png" alt="select alternative">
</div>
</div>
<div class="paragraph">
<p>Using Path 1, a <code>SelectAlternative</code> can be a <a href="#ref-send-statement">Send statement</a> or a <a href="#ref-receive-statement">Receive statement</a>, which may optionally have a <code>BooleanExpression</code> condition prefix.
Path 2 allows for a condition without a send or receive statement.</p>
</div>
<div class="paragraph">
<p>The alternative checks the condition and monitors the channel.
If the condition holds <em>and</em> the channel has a communication partner, the alternative can be chosen by the select statement.
(Of course, omitting a condition skips the check, and not specifying a send or receive statement skips monitoring of the channel.) When an alternative is chosen by the select statement, the send or receive statement are performed (if it was present).
If additional statements were given in the alternative using Path 3, they are executed after the communication has occurred (if a send or receive was present).</p>
</div>
<div class="paragraph">
<p>A few examples to demonstrate use of the select statement:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">timer t = timer(5.2);
select
a?
alt
b!7:
writeln("7 sent")
alt
ready(t):
writeln("done")
end</code></pre>
</div>
</div>
<div class="paragraph">
<p>This select waits until it can receive a signal from channel <code>a</code>, it can send value <code>7</code> over channel <code>b</code>, or until <code>ready(t)</code> holds (which happens <code>5.2</code> time units after starting the <code>select</code>, see <a href="#tut-using-timers">Timers</a> for details).
If <code>b!7</code> was selected, the <code>writeln("7 sent")</code> is executed after the communication over channel <code>b</code>.
If the <code>ready(t)</code> alternative is chosen, the <code>writeln("done")</code> is executed.</p>
</div>
<div class="paragraph">
<p>A buffer can be specified with:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">list int xs;
int x;
select
a?x:
xs = xs + [x]
alt
not empty(xs), b!xs[0]:
xs = xs[1:]
end</code></pre>
</div>
</div>
<div class="paragraph">
<p>The select either receives a value through channel <code>a</code>, or it sends the first element of list <code>xs</code> over channel <code>b</code> if the list is not empty (the condition must hold and the channel must be able to send an item at the same time to select the second alternative).</p>
</div>
<div class="paragraph">
<p>After communication has been performed, the first alternative appends the newly received value <code>x</code> to the list (the received value is stored in <code>x</code> before the assignment is executed).
In the second alternative, the assignment statement drops the first element of the list (which just got sent away over channel <code>b</code>).</p>
</div>
<div class="paragraph">
<p>The <code>unwind</code> loop 'unwinds' alternatives, for example:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">list(5) chan int cs;
int x;
select
unwind i, c in enumerate(cs):
c?x:
writeln("Received %s from channel number %d", x, i)
end
end</code></pre>
</div>
</div>
<div class="paragraph">
<p>Here <code>cs</code> is a list of channels, for example <code>list(5) chan int cs</code>.
(See <a href="#ref-list-type">List type</a> for details about lists.) The <code>unwind</code> iterates over the <code>enumerate(cs)</code> (see <a href="#ref-list-expression">List expressions</a> for details about <code>enumerate</code>), assigning the index and the channel to local <code>i</code> and <code>c</code> variables.
The <code>SelectAlternative</code> uses the variables to express the actions to perform (wait for a receive, and output some text saying that a value has been received).</p>
</div>
<div class="paragraph">
<p>The above is equivalent to (if list <code>cs</code> has length 5):</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">select
cs[0]?x:
writeln("Received %s from channel number %d", x, 0)
alt
cs[1]?x:
writeln("Received %s from channel number %d", x, 1)
...
alt
cs[4]?x:
writeln("Received %s from channel number %d", x, 4)</code></pre>
</div>
</div>
<div class="paragraph">
<p>The <code>unwind</code> however works for any length of list <code>cs</code>.
In addition, the <code>unwind</code> allows for nested loops to unfold for example <code>list list bool ds</code>, or to send one of several values over one of several channels.</p>
</div>
</div>
</div>
<div class="sect3">
<h4 id="ref-other-statements">Other statements</h4>
<div class="paragraph">
<p>Finally, there are a number of other useful statements.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="./reference-manual/rail_diagrams/other_statements.png" alt="other statements">
</div>
</div>
<div class="paragraph">
<p>The <a href="#ref-delay-statement">Delay statement</a> waits for the given amount of time units, the <a href="#ref-write-statement">Write statement</a> outputs text to the screen or a file, the <a href="#ref-close-statement">Close statement</a> closes a file, the <a href="#ref-return-statement">Return statement</a> returns a value from a function.
the <a href="#ref-exit-statement">Exit statement</a> ends the execution of all processes, and the <a href="#ref-pass-statement">Pass statement</a> does nothing.</p>
</div>
<div class="paragraph">
<p>
</p>
</div>
<div class="sect4">
<h5 id="ref-delay-statement">Delay statement</h5>
<div class="paragraph">
<p>The <code>delay</code> statement is useful to wait some time.
The statement may only be used in <a href="#ref-process-definitions">Process definitions</a> and <a href="#ref-model-definitions">Model definitions</a>.
It has the following syntax:</p>
</div>
<div class="imageblock">
<div class="content">
<img src="./reference-manual/rail_diagrams/delay_statement.png" alt="delay statement">
</div>
</div>
<div class="paragraph">
<p>The <code>IntegerExpression</code> or <code>RealExpression</code> is evaluated, and is the amount of time that the statement waits.
The value of the expression is computed only at the start, it is not evaluated while waiting.
Changes in its value has thus no effect.
A negative value ends the statement immediately, you cannot go back in time.</p>
</div>
<div class="paragraph">
<p>Examples:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">delay 1.5 # Delay for 1.5 time units.</code></pre>
</div>
</div>
<div class="paragraph">
<p>
</p>
</div>
</div>
<div class="sect4">
<h5 id="ref-write-statement">Write statement</h5>
<div class="paragraph">
<p>The write statement is used to output text to the screen or to a file.
It has the following syntax:</p>
</div>
<div class="imageblock">
<div class="content">
<img src="./reference-manual/rail_diagrams/write_statement.png" alt="write statement">
</div>
</div>
<div class="paragraph">
<p>The <em>format string</em> at 2 is a literal string value (further explained at <a href="#ref-string-expression">String expressions</a>) which defines what gets written.
Its text is copied to the output, except for two types of patterns which are replaced before being copied.
Use of the <code>writeln</code> (write line) keyword causes an additional <code>\n</code> to be written afterwards.</p>
</div>
<div class="paragraph">
<p>The first group of pattern are the back-slash patterns.
They all start with the <code>\</code> character, followed by another character that defines the character written to the output.
The back-slash patterns are listed in the table below.</p>
</div>
<table class="tableblock frame-all grid-all stretch">
<colgroup>
<col style="width: 50%;">
<col style="width: 50%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top">Pattern</th>
<th class="tableblock halign-left valign-top">Replaced by</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>\n</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">The new-line character (U+000A)</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>\t</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">The tab character (U+0009)</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>\"</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">The double-quote character (U+0022)</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>\\</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">The back-slash character (U+005C)</p></td>
</tr>
</tbody>
</table>
<div class="paragraph">
<p>The second group of patterns are the percent patterns.
Each percent pattern starts with a <code>%</code> character.
It is (normally) replaced by the (formatted) value of a corresponding expression listed after the format string (the first expression is used as replacement for the first percent pattern, the second expression for the second pattern, etc).
How the value is formatted depends on the <em>format specifier</em>, the first letter after the percent character.
Between the percent character and the format specifier may be a <em>format definition</em> giving control on how the value is output.</p>
</div>
<div class="paragraph">
<p>The format definition consists of five parts, each part is optional.</p>
</div>
<div class="ulist">
<ul>
<li>
<p>A <code>-</code> character, denoting alignment of the value to the left.
Cannot be combined with a <code>0</code>, and needs a <em>width</em>.</p>
</li>
<li>
<p>A <code>+</code> character, denoting the value with always be printed with a sign, only for formatting decimal integers, and real numbers.</p>
</li>
<li>
<p>A <code>0</code> character, denoting the value will be prefixed with zeros, only for integer numbers.
Cannot be combined with <code>-</code>, and needs a <em>width</em>.</p>
</li>
<li>
<p>A <em>width</em> as decimal number, denoting the minimal amount of space used for the value.
The value will be padded with space (or zeros if the <code>0</code> part has been specified).</p>
</li>
<li>
<p>A <code>.</code> and a <em>precision</em> as decimal number, denoting the number of digits to use for the fraction, only for real numbers.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>The format definition is a single letter, the table below lists them and their function.</p>
</div>
<table class="tableblock frame-all grid-all stretch">
<colgroup>
<col style="width: 50%;">
<col style="width: 50%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top">Definition</th>
<th class="tableblock halign-left valign-top">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>b</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Output boolean value.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>d</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Output integer value as decimal number.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>x</code>, <code>X</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Output integer value as hexadecimal number.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>f</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Output real value as number with a fraction.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>e</code>, <code>E</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Output real value in exponential notation.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>g</code>, <code>G</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Output real value either as <code>f</code> or as <code>e</code> (<code>E</code>) depending on the value</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>s</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Output value as a string (works for every printable value)</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>%</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Output a <code>%</code> character</p></td>
</tr>
</tbody>
</table>
<div class="paragraph">
<p>
</p>
</div>
</div>
<div class="sect4">
<h5 id="ref-close-statement">Close statement</h5>
<div class="imageblock">
<div class="content">
<img src="./reference-manual/rail_diagrams/close_statement.png" alt="close statement">
</div>
</div>
<div class="paragraph">
<p>The <code>close</code> statement takes a value of type <code>file</code> as argument (see <a href="#ref-file-type">File type</a> for details about the file type).
It closes the given file, which means that the file is no longer available for read or write.
In case data was previously written to the file, the <code>close</code> statement ensures that the data ends up in the file itself.</p>
</div>
<div class="paragraph">
<p>Note that a close of a file is global in the system, none of the processes can use the file any longer.</p>
</div>
<div class="paragraph">
<p>In <a href="#tut-reading-from-file">Reading from a file</a> and <a href="#tut-writing-to-file">Writing to a file</a>, use of the close statement is shown.</p>
</div>
<div class="paragraph">
<p></p>
</div>
</div>
<div class="sect4">
<h5 id="ref-return-statement">Return statement</h5>
<div class="paragraph">
<p>The return statement may only be used in a <a href="#ref-function-definitions">Function definitions</a>.
It has the following syntax:</p>
</div>
<div class="imageblock">
<div class="content">
<img src="./reference-manual/rail_diagrams/return_statement.png" alt="return statement">
</div>
</div>
<div class="paragraph">
<p>The statement starts with a <code>return</code> keyword, followed by one or more (comma-separated) expressions that form the value to return to the caller of the function.</p>
</div>
<div class="paragraph">
<p>The value of the expressions are calculated, and combined to a single return value.
The type of the value must match with the return type of the function.
Execution of the function statements stops (even when inside a loop or in an alternative of an <code>if</code> statement), and the computed value is returned to the caller of the function.</p>
</div>
<div class="paragraph">
<p>Examples:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">return 4 # Return integer value 4 to the caller.
return true, 3.7 # Return value of type tuple(bool b; real r).</code></pre>
</div>
</div>
<div class="paragraph">
<p>
</p>
</div>
</div>
<div class="sect4">
<h5 id="ref-exit-statement">Exit statement</h5>
<div class="paragraph">
<p>The <code>exit</code> statement may only be used in <a href="#ref-process-definitions">Process definitions</a> and <a href="#ref-model-definitions">Model definitions</a>.
It has the following syntax:</p>
</div>
<div class="imageblock">
<div class="content">
<img src="./reference-manual/rail_diagrams/exit_statement.png" alt="exit statement">
</div>
</div>
<div class="paragraph">
<p>The exit statement allows for immediately stopping the current model simulation.
The statement may be used in <a href="#ref-process-definitions">Process definitions</a> and <a href="#ref-model-definitions">Model definitions</a>.
If arguments are provided, they become the exit value of the model simulation.
Such values can be processed further in an <a href="#tut-experiment">Simulating several scenarios</a>, see also <a href="#ref-xper-definitions">Experiment definitions</a> on how to run a model in an experiment.</p>
</div>
<div class="paragraph">
<p>The type of the combined arguments must match with the exit type of the process or model that uses the statement.
If no arguments are given, the exit type must be a <code>void</code> type (see also <a href="#ref-void-type">Void type</a>).</p>
</div>
<div class="paragraph">
<p>If an experiment is running, execution continues by returning from the model instantiation call.
Otherwise, the simulation as a whole is terminated.</p>
</div>
<div class="paragraph">
<p>
</p>
</div>
</div>
<div class="sect4">
<h5 id="ref-pass-statement">Pass statement</h5>
<div class="imageblock">
<div class="content">
<img src="./reference-manual/rail_diagrams/pass_statement.png" alt="pass statement">
</div>
</div>
<div class="paragraph">
<p>The <code>pass</code> statement does nothing.
Its purpose is to act as a place holder for a statement at a point where there is nothing useful to do (for example to make an empty process), or to explicitly state nothing is being done at some point:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">if x == 3:
pass
else:
x = x + 1
end</code></pre>
</div>
</div>
<div class="paragraph">
<p>Here, <code>pass</code> is used to explicitly state that nothing is done when <code>x == 3</code>.
Such cases are often a matter of style, usually it is possible to rewrite the code and eliminate the <code>pass</code> statement.</p>
</div>
<div class="paragraph">
<p>
</p>
</div>
</div>
</div>
</div>
<div class="sect2">
<h3 id="ref-chapter-expressions">Expressions</h3>
<div class="paragraph">
<p>Expressions are computations to obtain a value.
The generic syntax of an expression is shown below.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="./reference-manual/rail_diagrams/generic_expression.png" alt="generic expression">
</div>
</div>
<div class="ulist">
<ul>
<li>
<p>As shown in Path 1, a name may be used in an expression.
It must refer to a value that can be used in an expression.
Names are explained further at <a href="#ref-lexical-names">Names</a>.</p>
<div class="paragraph">
<p>The first four entries are quite normal, function names can be used for variables with a function type (see <a href="#ref-function-type">Function type</a>) and process names for variables with a process type (see <a href="#ref-process-type">Process type</a>).
The latter two are mainly useful as actual parameters of functions or processes.</p>
</div>
</li>
<li>
<p>Path 2 states that you can write parentheses around an expression.
Its main use is to force a different order of applying the unary and binary operators (see <a href="#ref-operator-priorities">Operator priorities</a>).
Parentheses may also be used to clarify the meaning of a complicated expression.</p>
</li>
<li>
<p>Path 3 gives access to the other parts of expressions.
<a href="#ref-typed-expression">Typed expressions</a> gives the details about typed expressions.</p>
</li>
</ul>
</div>
<div class="sect3">
<h4 id="ref-typed-expression">Typed expressions</h4>
<div class="imageblock">
<div class="content">
<img src="./reference-manual/rail_diagrams/typed_expression.png" alt="typed expression">
</div>
</div>
<div class="paragraph">
<p>The number of operators in expressions is quite large.
Also, each node has an associated type, and the allowed operators depend heavily on the types of the sub-expressions.
To make expressions easier to access, they have been split.
If possible the (result) type is leading, but in some cases (like the <code>ReadExpression</code> for example) this is not feasible.</p>
</div>
<div class="ulist">
<ul>
<li>
<p>The expressions with a boolean type are denoted by the <code>BooleanExpression</code> block and explained further in <a href="#ref-boolean-expression">Boolean expressions</a>.</p>
</li>
<li>
<p>The expressions with an integer type are denoted by the <code>IntegerExpression</code> block and explained further in <a href="#ref-integer-expression">Integer expressions</a>.</p>
</li>
<li>
<p>The expressions with a real number type are denoted by the <code>RealExpression</code> block and explained further in <a href="#ref-real-expression">Real number expressions</a>.</p>
</li>
<li>
<p>The expressions with a string type are denoted by the <code>StringExpression</code> block and explained further in <a href="#ref-string-expression">String expressions</a>.</p>
</li>
<li>
<p>The expressions with a list type are denoted by the <code>ListExpression</code> block and explained further in <a href="#ref-string-expression">String expressions</a>.</p>
</li>
<li>
<p>The expressions with a set type are denoted by the <code>SetExpression</code> block and explained further in <a href="#ref-set-expression">Set expressions</a>.</p>
</li>
<li>
<p>The expressions with a dictionary type are denoted by the <code>DictionaryExpression</code> block and explained further in <a href="#ref-dictionary-expression">Dictionary expressions</a>.</p>
</li>
<li>
<p>The expressions with a tuple type are denoted by the <code>TupleExpression</code> block and explained further in <a href="#ref-tuple-expression">Tuple expression</a>.</p>
</li>
<li>
<p>The expressions with a file handle type are denoted by the <code>FileExpression</code> block and explained further in <a href="#ref-file-expression">File handle expressions</a>.</p>
</li>
<li>
<p>The function to read values from an external source is shown in the <code>ReadExpression</code> block, and further discussed in <a href="#ref-read-expression">Read expression</a>.</p>
</li>
<li>
<p>The expressions with a timer type are denoted by the <code>TimerExpression</code> block and explained further in <a href="#ref-timer-expression">Timer expressions</a>.</p>
</li>
<li>
<p>The expressions with a channel type are denoted by the <code>ChannelExpression</code> block and explained further in <a href="#ref-channel-expression">Channel expressions</a>.</p>
</li>
<li>
<p>The expressions with a distribution type are denoted by the <code>DistributionExpression</code> block and explained further in <a href="#ref-distribution-expression">Distribution expressions</a>.</p>
</li>
<li>
<p>The expressions with a process type are denoted by the <code>ProcessExpression</code> block and explained further in <a href="#ref-process-expression">Process expressions</a>.</p>
</li>
<li>
<p>The expressions with an instance type are denoted by the <code>InstanceExpression</code> block and explained further in <a href="#ref-instance-expression">Instance expressions</a>.</p>
</li>
<li>
<p>The expressions that convert one type to another are denoted by the <code>CastExpression</code> block, and explained further in <a href="#ref-cast-expression">Cast expressions</a>.</p>
</li>
<li>
<p>The expressions that perform a function call are denoted by the <code>FunctionCallExpression</code> block, and explained further in <a href="#ref-functioncall-expression">Function call expressions</a>.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>
</p>
</div>
</div>
<div class="sect3">
<h4 id="ref-enum-value-expression">Enumeration value</h4>
<div class="paragraph">
<p>Enumeration values may be used as literal value in an expression.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="./reference-manual/rail_diagrams/enum_value.png" alt="enum value">
</div>
</div>
<div class="paragraph">
<p>See <a href="#ref-enum-definitions">Enumeration definitions</a> for a discussion about enumeration definitions and enumeration values.</p>
</div>
<div class="paragraph">
<p>There are two binary operators for enumeration values.</p>
</div>
<table class="tableblock frame-all grid-all stretch">
<colgroup>
<col style="width: 20%;">
<col style="width: 20%;">
<col style="width: 20%;">
<col style="width: 20%;">
<col style="width: 20%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top">Expression</th>
<th class="tableblock halign-left valign-top">Type <strong>lhs</strong></th>
<th class="tableblock halign-left valign-top">Type <strong>rhs</strong></th>
<th class="tableblock halign-left valign-top">Type result</th>
<th class="tableblock halign-left valign-top">Explanation</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>==</code> <strong>rhs</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>E</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>E</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Test for equality</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>!=</code> <strong>rhs</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>E</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>E</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Test for inequality</p></td>
</tr>
</tbody>
</table>
<div class="paragraph">
<p>Two enumeration values from the same enumeration definition <strong>E</strong> can be compared against each other for equality (or in-equality).
Example:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">enum FlagColours = {red, white, blue};
...
bool same = (red == white);</code></pre>
</div>
</div>
<div class="paragraph">
<p>
</p>
</div>
</div>
<div class="sect3">
<h4 id="ref-boolean-expression">Boolean expressions</h4>
<div class="paragraph">
<p>The literal values for the boolean data type are as follows.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="./reference-manual/rail_diagrams/bool_expression.png" alt="bool expression">
</div>
</div>
<div class="paragraph">
<p>The values <code>true</code> and <code>false</code> are also the only available values of the boolean data type.</p>
</div>
<div class="paragraph">
<p>The <code>not</code> operation is the only boolean unary operator.</p>
</div>
<table class="tableblock frame-all grid-all stretch">
<colgroup>
<col style="width: 25%;">
<col style="width: 25%;">
<col style="width: 25%;">
<col style="width: 25%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top">Expression</th>
<th class="tableblock halign-left valign-top">Type <strong>op</strong></th>
<th class="tableblock halign-left valign-top">Type result</th>
<th class="tableblock halign-left valign-top">Explanation</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>not</code> <strong>op</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>op</strong> value is inverted.</p></td>
</tr>
</tbody>
</table>
<div class="paragraph">
<p>The <code>and</code>, the <code>or</code>, and the equality tests are available for boolean values.</p>
</div>
<table class="tableblock frame-all grid-all stretch">
<colgroup>
<col style="width: 20%;">
<col style="width: 20%;">
<col style="width: 20%;">
<col style="width: 20%;">
<col style="width: 20%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top">Expression</th>
<th class="tableblock halign-left valign-top">Type <strong>lhs</strong></th>
<th class="tableblock halign-left valign-top">Type <strong>rhs</strong></th>
<th class="tableblock halign-left valign-top">Type result</th>
<th class="tableblock halign-left valign-top">Explanation</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>and</code> <strong>rhs</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Both operands hold</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>or</code> <strong>rhs</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">At least one operand holds</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>==</code> <strong>rhs</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Test for equality</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>!=</code> <strong>rhs</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Test for inequality</p></td>
</tr>
</tbody>
</table>
<div class="paragraph">
<p>
</p>
</div>
</div>
<div class="sect3">
<h4 id="ref-integer-expression">Integer expressions</h4>
<div class="paragraph">
<p>The syntax of an integer literal number is (at character level) as follows.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="./reference-manual/rail_diagrams/literal_integer_number.png" alt="literal integer number">
</div>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<i class="fa icon-note" title="Note"></i>
</td>
<td class="content">
This diagram works at lexical level (at the level of single characters), white space or comments are not allowed between elements in this diagram.
</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>An integer number is either <code>0</code>, or a sequence of decimal digits, starting with a non-zero digit.</p>
</div>
<div class="paragraph">
<p>There are two unary operators on integer numbers.</p>
</div>
<table class="tableblock frame-all grid-all stretch">
<colgroup>
<col style="width: 25%;">
<col style="width: 25%;">
<col style="width: 25%;">
<col style="width: 25%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top">Expression</th>
<th class="tableblock halign-left valign-top">Type <strong>op</strong></th>
<th class="tableblock halign-left valign-top">Type result</th>
<th class="tableblock halign-left valign-top">Explanation</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>-</code> <strong>op</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>op</strong> value is negated.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>+</code> <strong>op</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>op</strong> value is copied.</p></td>
</tr>
</tbody>
</table>
<div class="paragraph">
<p>With the unary <code>-</code> operation, the sign of the operand gets toggled.
The <code>+</code> unary operation simply copies its argument.</p>
</div>
<div class="paragraph">
<p>There are many binary operations for integer numbers, see the table below.</p>
</div>
<table class="tableblock frame-all grid-all stretch">
<colgroup>
<col style="width: 20%;">
<col style="width: 20%;">
<col style="width: 20%;">
<col style="width: 20%;">
<col style="width: 20%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top">Expression</th>
<th class="tableblock halign-left valign-top">Type <strong>lhs</strong></th>
<th class="tableblock halign-left valign-top">Type <strong>rhs</strong></th>
<th class="tableblock halign-left valign-top">Type result</th>
<th class="tableblock halign-left valign-top">Explanation</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>+</code> <strong>rhs</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Integer addition</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>-</code> <strong>rhs</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Integer subtraction</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>*</code> <strong>rhs</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Integer multiplication</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>/</code> <strong>rhs</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">real</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Real division</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>div</code> <strong>rhs</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Integer divide operation</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>mod</code> <strong>rhs</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Modulo operation</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>^</code> <strong>rhs</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">real</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Power operation</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>&lt;</code> <strong>rhs</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Test for less than</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>&lt;=</code> <strong>rhs</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Test for less or equal</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>==</code> <strong>rhs</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Test for equality</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>!=</code> <strong>rhs</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Test for inequality</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>&gt;=</code> <strong>rhs</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Test for bigger or equal</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>&gt;</code> <strong>rhs</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Test for bigger than</p></td>
</tr>
</tbody>
</table>
<div class="paragraph">
<p>The divide operator <code>/</code> and the power operator <code>^</code> always gives a real result, integer division is performed with <code>div</code>.
The operation always rounds down, that is <strong>a</strong> <code>div</code> <strong>b</strong> == <code>floor</code>(<strong>a</strong> <code>/</code> <strong>b</strong>) for all integer values <strong>a</strong> and <strong>b</strong>.
The <code>mod</code> operation returns the remainder from the <code>div</code>, that is <strong>a</strong> <code>mod</code> <strong>b</strong> == <strong>a</strong> - <strong>b</strong> * (<strong>a</strong> <code>div</code> <strong>b</strong>).
The table below gives examples.
For clarity, the sign of the numbers is explicitly added everywhere.</p>
</div>
<table class="tableblock frame-all grid-all stretch">
<colgroup>
<col style="width: 33.3333%;">
<col style="width: 33.3333%;">
<col style="width: 33.3334%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top">Example</th>
<th class="tableblock halign-left valign-top">Result</th>
<th class="tableblock halign-left valign-top">Explanation</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>+7 div +4</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">+1</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>floor(+7/+4) = floor(+1.75) = +1</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>+7 mod +4</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">+3</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>+7 - +4 * (+7 div +4) = +7 - +4 * +1 = +7 - +4 = +3</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>+7 div -4</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">-2</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>floor(+7/-4) = floor(-1.75) = -2</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>+7 mod -4</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">-1</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>+7 - -4 * (+7 div -4) = +7 - -4 * -2 = +7 - +8 = -1</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>-7 div +4</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">-2</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>floor(-7/+4) = floor(-1.75) = -2</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>-7 mod +4</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">+1</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>-7 - +4 * (-7 div +4) = -7 - +4 * -2 = -7 - -8 = +1</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>-7 div -4</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">+1</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>floor(-7/-4) = floor(+1.75) = +1</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>-7 mod -4</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">-3</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>-7 - -4 * (-7 div -4) = -7 - -4 * +1 = -7 - -4 = -3</code></p></td>
</tr>
</tbody>
</table>
<div class="paragraph">
<p>The Chi simulator uses 32 bit integer variables, which means that only values from -2,147,483,647 to 2,147,483,647 (with an inclusive upper bound) can be used.
Using a value outside the valid range will yield invalid results.
Sometimes such values are detected and reported.</p>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<i class="fa icon-note" title="Note"></i>
</td>
<td class="content">
The technical minimum value for integers is -2,147,483,648, but this number cannot be entered as literal value due to parser limitations.
</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>
</p>
</div>
</div>
<div class="sect3">
<h4 id="ref-real-expression">Real number expressions</h4>
<div class="paragraph">
<p>Real numbers are an important means to express values in the contiguous domain.
The type of a real number expression is a <code>real</code> type, see <a href="#ref-real-type">Real type</a> for more information about the type.
The syntax of real number values is as follows.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="./reference-manual/rail_diagrams/real_number_values.png" alt="real number values">
</div>
</div>
<div class="paragraph">
<p>There are two ways to construct real numbers, by writing a literal real number, or by using <code>time</code> which returns the current time in the model.</p>
</div>
<div class="paragraph">
<p>The syntax of a literal real number (at character level) is as follows.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="./reference-manual/rail_diagrams/lexical_real_number.png" alt="lexical real number">
</div>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<i class="fa icon-note" title="Note"></i>
</td>
<td class="content">
This diagram works at lexical level (at the level of single characters), white space or comments are not allowed between elements in this diagram.
</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>A literal real number starts with one or more digits, and then either a dot or an exponent.
In the former case, an exponent is allowed as well.
Examples:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">3.14
0.314e1
314E-2</code></pre>
</div>
</div>
<div class="paragraph">
<p>A real number <strong>always</strong> has either a dot character, or an exponent notation in the number.</p>
</div>
<div class="paragraph">
<p>Many of the integer operations can also be performed on real numbers.
The unary operators are the same, except for the type of the argument.</p>
</div>
<table class="tableblock frame-all grid-all stretch">
<colgroup>
<col style="width: 25%;">
<col style="width: 25%;">
<col style="width: 25%;">
<col style="width: 25%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top">Expression</th>
<th class="tableblock halign-left valign-top">Type <strong>op</strong></th>
<th class="tableblock halign-left valign-top">Type result</th>
<th class="tableblock halign-left valign-top">Explanation</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>-</code> <strong>op</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">real</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">real</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>op</strong> value is negated.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>+</code> <strong>op</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">real</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">real</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>op</strong> value is copied.</p></td>
</tr>
</tbody>
</table>
<div class="paragraph">
<p>With the unary <code>-</code> operation, the sign of the operand gets toggled.
The <code>+</code> unary operation simply copies its argument.</p>
</div>
<div class="paragraph">
<p>The binary operators on real numbers is almost the same as the binary operators on integer numbers.
Only the <code>div</code> and <code>mod</code> operations are not here.</p>
</div>
<table class="tableblock frame-all grid-all stretch">
<colgroup>
<col style="width: 20%;">
<col style="width: 20%;">
<col style="width: 20%;">
<col style="width: 20%;">
<col style="width: 20%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top">Expression</th>
<th class="tableblock halign-left valign-top">Type <strong>lhs</strong></th>
<th class="tableblock halign-left valign-top">Type <strong>rhs</strong></th>
<th class="tableblock halign-left valign-top">Type result</th>
<th class="tableblock halign-left valign-top">Explanation</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>+</code> <strong>rhs</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">int,real</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">int,real</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">real</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Addition</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>-</code> <strong>rhs</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">int,real</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">int,real</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">real</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Subtraction</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>*</code> <strong>rhs</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">int,real</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">int,real</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">real</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Multiplication</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>/</code> <strong>rhs</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">int,real</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">int,real</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">real</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Real division</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>^</code> <strong>rhs</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">int,real</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">int,real</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">real</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Power operation</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>&lt;</code> <strong>rhs</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">int,real</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">int,real</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Test for less than</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>&lt;=</code> <strong>rhs</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">int,real</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">int,real</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Test for less or equal</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>==</code> <strong>rhs</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">int,real</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">int,real</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Test for equality</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>!=</code> <strong>rhs</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">int,real</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">int,real</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Test for inequality</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>&gt;=</code> <strong>rhs</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">int,real</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">int,real</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Test for bigger or equal</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>&gt;</code> <strong>rhs</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">int,real</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">int,real</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Test for bigger than</p></td>
</tr>
</tbody>
</table>
<div class="paragraph">
<p>With these operations, one of the operands has to be a real number value, while the other operand can be either an integer value or a real number value.</p>
</div>
<div class="paragraph">
<p>The standard library functions for real numbers contain a lot of math functions.
They can be found in <a href="#ref-real-stdlib">Real number functions</a>.</p>
</div>
<div class="paragraph">
<p>The Chi simulator uses <a href="http://en.wikipedia.org/wiki/IEEE_floating_point">64-bit IEEE 754 floating point</a> numbers to represent real number values.
Using a value outside the valid range of this format will yield invalid results.
Sometimes such values are detected and reported.</p>
</div>
<div class="paragraph">
<p>
</p>
</div>
</div>
<div class="sect3">
<h4 id="ref-string-expression">String expressions</h4>
<div class="paragraph">
<p>Strings are sequences of characters.
Their most frequent use is to construct text to output to the screen.
A string literal is defined as follows.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="./reference-manual/rail_diagrams/lexical_string_literal.png" alt="lexical string literal">
</div>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<i class="fa icon-note" title="Note"></i>
</td>
<td class="content">
This diagram works at lexical level (at the level of single characters), white space or comments are not allowed between elements in this diagram.
</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>A string literal starts with a quote character <code>"</code>, and ends with another quote character.
In between, you may have a sequence of characters.
Most characters can be written literally (eg write a <code>a</code> to get an 'a' in the string).
The exceptions are a backslash <code>\</code>, a quote <code>"</code>, a TAB, and a NL (newline) character.
For those characters, write a backslash, followed by <code>\</code>, <code>"</code>, <code>t</code>, or <code>n</code> respectively.
(A TAB character moves the cursor to the next multiple of 8 positions at a line, a NL moves the cursor to the start of the next line.)</p>
</div>
<div class="paragraph">
<p>Strings have the following binary expressions.</p>
</div>
<table class="tableblock frame-all grid-all stretch">
<colgroup>
<col style="width: 20%;">
<col style="width: 20%;">
<col style="width: 20%;">
<col style="width: 20%;">
<col style="width: 20%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top">Expression</th>
<th class="tableblock halign-left valign-top">Type <strong>lhs</strong></th>
<th class="tableblock halign-left valign-top">Type <strong>rhs</strong></th>
<th class="tableblock halign-left valign-top">Type result</th>
<th class="tableblock halign-left valign-top">Explanation</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>+</code> <strong>rhs</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">string</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">string</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">string</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Concatenation</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>[</code> <strong>rhs</strong> <code>]</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">string</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">string</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Element access</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>[</code> <strong>low</strong> <code>:</code> <strong>high</strong> <code>]</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">string</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">int, int</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">string</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Slicing with step <code>1</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>[</code> <strong>low</strong> <code>:</code> <strong>high</strong> <code>:</code> <strong>step</strong> <code>]</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">string</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">int, int, int</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">string</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Slicing</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>&lt;</code> <strong>rhs</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">string</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">string</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Test for less than</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>&lt;=</code> <strong>rhs</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">string</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">string</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Test for less or equal</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>==</code> <strong>rhs</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">string</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">string</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Test for equality</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>!=</code> <strong>rhs</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">string</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">string</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Test for inequality</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>&gt;=</code> <strong>rhs</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">string</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">string</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Test for bigger or equal</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>&gt;</code> <strong>rhs</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">string</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">string</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Test for bigger than</p></td>
</tr>
</tbody>
</table>
<div class="paragraph">
<p>The <strong>concatenation</strong> operator joins two strings (<code>"a" + "bc"</code> gives <code>"abc"</code>).</p>
</div>
<div class="paragraph">
<p>The <strong>element access</strong> and <strong>slicing</strong> operators use numeric indices to denote a character in the string.
First character has index value <code>0</code>, second character has index <code>1</code>, and so on.
Negative indices count from the back of the string, for example index value <code>-1</code> points to the last character of a string.
Unlike lists, both the <strong>element access</strong> and the <strong>slicing</strong> operators return a string.
The former constructs a string with only the indicated character, while the latter constructs a sub-string where the first character is at index <strong>low</strong>, the second character at index <strong>low</strong> + <strong>step</strong>, and so on, until index value <strong>high</strong> is reached or crossed.
That final character is not included in the result (that it, the <strong>high</strong> boundary is excluded from the result).
If <strong>low</strong> is omitted, it is 0, if <strong>high</strong> is omitted, it is the length of the string (<code>size(</code> <strong>lhs</strong> <code>)</code>).
If <strong>step</strong> is omitted, it is <code>1</code>.
A few examples:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">string s = "abcdef";
s[4] # results in "e"
s[2:4] # results in "cd"
s[1::2] # results in "bdf"
s[-1:0:-2] # results in "fdb"
s[-1:-7:-1] # results in "fedcba"
s[:4] # results in "abcd"
s[-1:] # results in "f" (from the last character to the end)</code></pre>
</div>
</div>
<div class="paragraph">
<p>In the comparison operations, strings use lexicographical order.</p>
</div>
<div class="paragraph">
<p>There are also a few standard library functions on strings, see <a href="#ref-string-stdlib">String functions</a> for details.</p>
</div>
<div class="paragraph">
<p>Note that length of the string is not the same as the number of characters needed for writing the string literal, as shown in the following example.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">size("a") # results in 1, string is 1 character long (namely 'a').
size("\n") # results in 1, string contains one NL character.</code></pre>
</div>
</div>
<div class="paragraph">
<p>
</p>
</div>
</div>
<div class="sect3">
<h4 id="ref-list-expression">List expressions</h4>
<div class="paragraph">
<p>Lists are very versatile data structures, the Chi language has a large number of operations and functions for them.</p>
</div>
<div class="paragraph">
<p>The most elementary list expression is a literal list.
It has the following syntax.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="./reference-manual/rail_diagrams/literal_list.png" alt="literal list">
</div>
</div>
<div class="paragraph">
<p>The first line shows the syntax of an empty list.
The <code>Type</code> block denotes the element type of the list, for example <code>&lt;int&gt;[]</code> is an empty list of integer values.</p>
</div>
<div class="paragraph">
<p>The second line shows how to write a non-empty literal list value.
It is a comma-separated sequence of expressions surrounded by square brackets.
The type of all expressions must be the same, and this is also the element type of the list.</p>
</div>
<div class="paragraph">
<p>Some examples:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">list int xs;
list int ys = &lt;int&gt;[];
list int zs = [1, 4, 28];</code></pre>
</div>
</div>
<div class="paragraph">
<p>Variable <code>ys</code> is assigned an empty list with integer element type.
Since an empty list is the default value of a variable, <code>xs</code> has the same value.
Variable <code>zs</code> is initialized with a list holding three elements.</p>
</div>
<div class="paragraph">
<p>Two list values are equal when they have the same number of element values, and each value is pair-wise equal.</p>
</div>
<div class="paragraph">
<p>Lists have no unary operators, the binary operators of lists are shown below.</p>
</div>
<table class="tableblock frame-all grid-all stretch">
<colgroup>
<col style="width: 20%;">
<col style="width: 20%;">
<col style="width: 20%;">
<col style="width: 20%;">
<col style="width: 20%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top">Expression</th>
<th class="tableblock halign-left valign-top">Type <strong>lhs</strong></th>
<th class="tableblock halign-left valign-top">Type <strong>rhs</strong></th>
<th class="tableblock halign-left valign-top">Type result</th>
<th class="tableblock halign-left valign-top">Explanation</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>[</code> <strong>rhs</strong> <code>]</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">list T</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">T</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Element access</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>[</code> <strong>low</strong> <code>:</code> <strong>high</strong> <code>]</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">list T</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">int, int</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">list T</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Slicing with step <code>1</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>[</code> <strong>low</strong> <code>:</code> <strong>high</strong> <code>:</code> <strong>step</strong> <code>]</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">list T</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">int, int, int</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">list T</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Slicing</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>+</code> <strong>rhs</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">list T</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">list T</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">list T</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Concatenation</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>-</code> <strong>rhs</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">list T</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">list T</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">list T</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">List subtraction</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>==</code> <strong>rhs</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">list T</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">list T</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Test for equality</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>!=</code> <strong>rhs</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">list T</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">list T</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Test for inequality</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>in</code> <strong>rhs</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">T</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">list T</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Element test</p></td>
</tr>
</tbody>
</table>
<div class="paragraph">
<p>The <strong>element access</strong> operator '<strong>lhs</strong> <code>[</code> <strong>rhs</strong> <code>]</code> ' indexes with zero-based positions, for example <code>xs[0]</code> retrieves the first element value, <code>xs[1]</code> retrieves the second value, etc.
Negative indices count from the back of the list, <code>xs[-1]</code> retrieves the last element of the list (that is, <code>xs[size(xs)-1]</code>), <code>xs[-2]</code> gets the second to last element, ect.
It is not allowed to index positions that do not exist.
Examples:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">list int xs = [4, 7, 18];
int x;
x = xs[0]; # assigns 4
x = xs[2]; # assigns 18
x = xs[-1]; # assigns 18
x = xs[-2]; # assigns 7
xs[2] # ERROR, OUT OF BOUNDS
xs[-4] # ERROR, OUT OF BOUNDS</code></pre>
</div>
</div>
<div class="paragraph">
<p>The <strong>slicing</strong> operator '<strong>lhs</strong> <code>[</code> <strong>low</strong> <code>:</code> <strong>high</strong> <code>]</code> ' extracts (sub-)lists from the <strong>lhs</strong> source.
The <strong>low</strong> and <strong>high</strong> index expressions may be omitted (and default to <code>0</code> respectively <code>size(</code> <strong>lhs</strong> <code>)</code> in that case).
As with element access, negative indices count from the back of the list.
The result is the list of values starting at index <strong>low</strong>, and up to but not including the index <strong>high</strong>.
If the <strong>low</strong> value is higher or equal to <strong>high</strong>, the resulting list is empty.
For example:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">list int xs = [4, 7, 18];
list int ys;
ys = xs[0:2]; # assigns [4, 7]
ys = xs[:2]; # == xs[0:2]
ys = xs[1:]; # == xs[1:3], assigns [7, 18]
ys = xs[:]; # == xs[0:3] == xs
ys = xs[1:2]; # assigns [7] (note, it is a list!)
ys = xs[0:0]; # assigns &lt;int&gt;[]
ys = xs[2:1]; # assigns &lt;int&gt;[], lower bound too high
ys = xs[0:-1]; # == xs[0:2]</code></pre>
</div>
</div>
<div class="paragraph">
<p>The <strong>slicing</strong> operator with the <strong>step</strong> expression (that is, the expression with the form '<strong>lhs</strong> <code>[</code> <strong>low</strong> <code>:</code> <strong>high</strong> <code>:</code> <strong>step</strong> <code>]</code> ') can also skip elements (with step values other than <code>1</code>) and traverse lists from back to front (with negative step values).
Omitting the <strong>step</strong> expression or using <code>0</code> as its value, uses the step value <code>1</code>.
This extended form does not count from the back of the list for negative indices, since the <strong>high</strong> value may need to be negative with a negative step size.</p>
</div>
<div class="paragraph">
<p>The first element of the result is at '<strong>lhs</strong> [<strong>low</strong> ]'.
The second element is at '<strong>lhs</strong> [<strong>low</strong> + <strong>step</strong> ]', the third element at '<strong>lhs</strong> [<strong>low</strong> + 2 * <strong>step</strong> ]' and so on.
For a positive <strong>step</strong> value, the index of the last element is the highest value less than <strong>high</strong>, for a negative <strong>step</strong> value, the last element is the smallest index bigger than <strong>high</strong> (that is, boundary <strong>high</strong> is excluded from the result).
The (sub-)list is empty when the first value ('<strong>lhs</strong> [ <strong>low</strong> ]') already violates the conditions of the <strong>high</strong> boundary.</p>
</div>
<div class="paragraph">
<p>Examples:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">list int xs = [4, 7, 18];
list int ys;
ys = xs[::2]; # == xs[0:3:2], assigns [4, 18]
ys = xs[::-1]; # == xs[2:-1:-1], assigns [18, 7, 4]</code></pre>
</div>
</div>
<div class="paragraph">
<p>With the latter example, note that the <code>-1</code> end value in <code>xs[2:-1:-1]</code> really means index <code>-1</code>, it is <strong>not</strong> rewritten!</p>
</div>
<div class="paragraph">
<p>The <strong>concatenation</strong> operator <code>+</code> 'glues' two lists together by constructing a new list, copying the value of the <strong>lhs</strong> list, and appending the values of the <strong>rhs</strong>:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">[1, 2] + [3, 4] == [1, 2, 3, 4]
&lt;int&gt;[] + [1] == [1]
[5] + &lt;int&gt;[] == [5]</code></pre>
</div>
</div>
<div class="paragraph">
<p>The <strong>subtraction</strong> operator <code>-</code> subtracts two lists.
It copies the <strong>lhs</strong> list, and each element in the <strong>rhs</strong> list is searched in the copy, and the left-most equal value is deleted.
Searched values that do not exist are silently ignored.
The result of the operation has the same type as the <strong>lhs</strong> list.
Some examples:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">[1, 2, 4, 2] - [4] # results in [1, 2, 2], 4 is removed.
[1, 2, 4, 2] - [6] # results in [1, 2, 4 2], 6 does not exist.
[1, 2, 4, 2] - [1, 4] # results in [2, 2], 1 and 4 are removed.
[1, 2, 4, 2] - [2] # results in [1, 4, 2], first 2 is removed.
[1, 2, 4, 2] - [2, 2] # results in [1, 4].
[1, 2, 4, 2] - [2, 2, 2] # results in [1, 4], no match for the 3rd '2'.</code></pre>
</div>
</div>
<div class="paragraph">
<p>The <strong>element test</strong> operator <code>in</code> tests whether the value <strong>lhs</strong> exists in list <strong>rhs</strong>.
This operation is expensive to compute, if you need this operation frequently, consider using a set instead.
Some examples of the element test operation:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">1 in [1, 2, 3] == true
4 in [1, 2, 3] == false # there is no 4 in [1, 2, 3]
[1] in [[2], [1]] == true
[2, 1] in [[1, 2]] == false # [2, 1] != [1, 2]
&lt;int&gt;[] in &lt;list int&gt;[] == false # empty list contains no values.</code></pre>
</div>
</div>
<div class="paragraph">
<p>There are also standard library functions for lists, see <a href="#ref-list-stdlib">List functions</a> for details.</p>
</div>
<div class="paragraph">
<p>
</p>
</div>
</div>
<div class="sect3">
<h4 id="ref-set-expression">Set expressions</h4>
<div class="paragraph">
<p>Literal sets are written as follows.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="./reference-manual/rail_diagrams/literal_set.png" alt="literal set">
</div>
</div>
<div class="paragraph">
<p>The first line shows the syntax of an empty set.
The <code>Type</code> block denotes the element type of the set, for example <code>&lt;int&gt;{}</code> is an empty set of integer values.</p>
</div>
<div class="paragraph">
<p>The second line shows how to write a non-empty literal set value.
It is a comma-separated sequence of expressions surrounded by curly brackets.
The type of all expressions must be the same, and this is also the element type of the set.
The order of the values in the literal is not relevant, and duplicate values are silently discarded.
For example:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">set real xr = {1.0, 2.5, -31.28, 1.0}</code></pre>
</div>
</div>
<div class="paragraph">
<p>assigns the set <code>{-31.28, 1.0, 2.5}</code> (any permutation of the values is allowed).
By convention, elements are written in increasing order in this document.</p>
</div>
<div class="paragraph">
<p>Two set values are equal when they have the same number of element values contained, and each value of one set is also in the other set.
The order of the elements in a set is not relevant, any permutation is equivalent.</p>
</div>
<div class="paragraph">
<p>Like lists, sets have no unary operators.
They do have binary operators though.
The operators are as follows.</p>
</div>
<table class="tableblock frame-all grid-all stretch">
<colgroup>
<col style="width: 20%;">
<col style="width: 20%;">
<col style="width: 20%;">
<col style="width: 20%;">
<col style="width: 20%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top">Expression</th>
<th class="tableblock halign-left valign-top">Type <strong>lhs</strong></th>
<th class="tableblock halign-left valign-top">Type <strong>rhs</strong></th>
<th class="tableblock halign-left valign-top">Type result</th>
<th class="tableblock halign-left valign-top">Explanation</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>+</code> <strong>rhs</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">set T</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">set T</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">set T</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Set union</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>-</code> <strong>rhs</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">set T</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">set T</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">set T</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Set difference</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>*</code> <strong>rhs</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">set T</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">set T</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">set T</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Set intersection</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>==</code> <strong>rhs</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">set T</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">set T</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Test for equality</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>!=</code> <strong>rhs</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">set T</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">set T</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Test for inequality</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>in</code> <strong>rhs</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">T</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">set T</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Element test</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>sub</code> <strong>rhs</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">set T</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">set T</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Sub-set test</p></td>
</tr>
</tbody>
</table>
<div class="paragraph">
<p>The <strong>union</strong> of two sets means that the <strong>lhs</strong> elements and the <strong>rhs</strong> elements are merged into one set (and duplicates are silently discarded).
<strong>Set difference</strong> makes a copy of the <strong>lhs</strong> set, and removes all elements that are also in the <strong>rhs</strong> operand.
The result of the operation has the same type as the <strong>lhs</strong> set.
<strong>Set intersection</strong> works the other way around, its result is a set with elements that exist both in <strong>lhs</strong> and in <strong>rhs</strong>.
Some examples:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">set int xr = {1, 3, 7};
set int yr;
yr = xr + {1, 2}; # assigns {1, 2, 3, 7}
yr = xs - {1, 2}; # assigns {3, 7}
yr = xs * {1, 2}; # assigns {1}</code></pre>
</div>
</div>
<div class="paragraph">
<p>The <strong>element test</strong> of sets tests whether the value <strong>lhs</strong> is an element in the set <strong>rhs</strong>.
This operation is very fast.
The <strong>sub-set test</strong> does the same for every element value in the <strong>lhs</strong> operand.
It returns <code>true</code> is every value of the left set is also in the right set.
A few examples:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">1 in {1, 3, 7} == true
9 in {1, 3, 7} == false
{1} sub {1, 3, 7} == true
{9} sub {1, 3, 7} == false
{1, 9} sub {1, 3, 7} == false # All elements must be present.
{1, 3, 7} sub {1, 3, 7} == true # All sets are a sub-set of themselves.</code></pre>
</div>
</div>
<div class="paragraph">
<p>There are also standard library functions for sets, see <a href="#ref-set-stdlib">Set functions</a> for details.</p>
</div>
<div class="paragraph">
<p>
</p>
</div>
</div>
<div class="sect3">
<h4 id="ref-dictionary-expression">Dictionary expressions</h4>
<div class="paragraph">
<p>Literal dictionaries are written using the syntax shown below.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="./reference-manual/rail_diagrams/literal_dictionary.png" alt="literal dictionary">
</div>
</div>
<div class="paragraph">
<p>An empty dictionary needs the key and value type prefix, for example <code>&lt;string:int&gt;{}</code> is an empty dictionary with strings as key, and integer numbers as value.
Literal values of such a dictionary are:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">dict(string, int) d; # Initialized with the empty dictionary.
d = {"one": 1, "twenty-three": 23};</code></pre>
</div>
</div>
<div class="paragraph">
<p>The key-value pairs can be put in any order.
Also, the key value must be unique.
Two dictionaries are equal when they have the same number of keys, each key in one dictionary is also in the other dictionary, and the value associated with each key also match pair-wise.</p>
</div>
<div class="paragraph">
<p>The binary operators of dictionaries are as follows.</p>
</div>
<table class="tableblock frame-all grid-all stretch">
<colgroup>
<col style="width: 20%;">
<col style="width: 20%;">
<col style="width: 20%;">
<col style="width: 20%;">
<col style="width: 20%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top">Expression</th>
<th class="tableblock halign-left valign-top">Type <strong>lhs</strong></th>
<th class="tableblock halign-left valign-top">Type <strong>rhs</strong></th>
<th class="tableblock halign-left valign-top">Type result</th>
<th class="tableblock halign-left valign-top">Explanation</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>[</code> <strong>rhs</strong> <code>]</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">dict(K:V)</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">K</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">V</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Element access</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>+</code> <strong>rhs</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">dict(K:V)</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">dict(K:V)</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">dict(K:V)</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Update</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>-</code> <strong>rhs</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">dict(K:V)</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">dict(K:V)</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">dict(K:V)</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Subtraction</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>-</code> <strong>rhs</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">dict(K:V)</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">list K</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">dict(K:V)</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Subtraction</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>-</code> <strong>rhs</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">dict(K:V)</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">set K</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">dict(K:V)</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Subtraction</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>==</code> <strong>rhs</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">dict(K:V)</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">dict(K:V)</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Test for equality</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>!=</code> <strong>rhs</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">dict(K:V)</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">dict(K:V)</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Test for inequality</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>in</code> <strong>rhs</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">K</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">dict(K:V)</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Element test</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>sub</code> <strong>rhs</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">dict(K:V)</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">dict(K:V)</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Sub-set test</p></td>
</tr>
</tbody>
</table>
<div class="paragraph">
<p>The <strong>element access</strong> operator accesses the value of a key.
Querying the value of a non-existing key value is not allowed, however when used at the left side of an assignment, it acts as an adding operation.
A few examples:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">dict(int:bool) d = {1:true, 2:false};
bool b;
b = d[1]; # assigns 'true' (the value of key 1).
d[1] = false; # updates the value of key '1' to 'false'.
d[8] = true; # adds pair 8:true to the dictionary.</code></pre>
</div>
</div>
<div class="paragraph">
<p>The <code>+</code> operation on dictionaries is an <strong>update</strong> operation.
It copies the <strong>lhs</strong> dictionary, and assigns each key-value pair of the <strong>rhs</strong> dictionary to the copy, overwriting values copied from the <strong>lhs</strong>.
For example:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">dict(int:bool) d = {1:true, 2:false};
d + {1:false} # result is {1:false, 2:false}
d + {3:false} # result is {1:true, 2:false, 3:false}</code></pre>
</div>
</div>
<div class="paragraph">
<p>The <strong>subtraction</strong> operator only takes keys into consideration, that is, it makes a copy of the <strong>lhs</strong> dictionary, and removes key-value pairs where the key is also in the <strong>rhs</strong> argument (for subtraction of lists and sets, the elements are used, instead of the keys):</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">dict(int:bool) d = {1:true, 2:false};
d - {1:false} # results in {2:false}, value of '1' is not relevant
d - [1] # results in {2:false}
d - {1} # results in {2:false}</code></pre>
</div>
</div>
<div class="paragraph">
<p>As with list subtraction and set difference, the type of the result is the same as the type of the <strong>lhs</strong> dictionary.</p>
</div>
<div class="paragraph">
<p>The <strong>element test</strong> tests for presence of a key value, and the <strong>sub-set</strong> operation tests whether all keys of the <strong>lhs</strong> value are also in the <strong>rhs</strong> value.
Examples:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">dict(int:bool) d = {1:true, 2:false};
bool b;
b = 2 in d; # assigns 'true', 2 is a key in d.
b = 5 in d; # assigns 'false', 5 is not a key in d.
{1:false} sub d # results in 'true', all keys are in d.</code></pre>
</div>
</div>
<div class="paragraph">
<p>There are also standard library functions for dictionaries, see <a href="#ref-dictionary-stdlib">Dictionary functions</a> for details.</p>
</div>
<div class="paragraph">
<p>
</p>
</div>
</div>
<div class="sect3">
<h4 id="ref-tuple-expression">Tuple expression</h4>
<div class="paragraph">
<p>A tuple expression is a value of a tuple type (explained in <a href="#ref-tuple-type">Tuple type</a>).
A tuple expression literal value is written as shown below.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="./reference-manual/rail_diagrams/literal_tuple.png" alt="literal tuple">
</div>
</div>
<div class="paragraph">
<p>A literal tuple is a comma separated sequence of expressions of length two or longer, surrounded by a pair of parentheses.
The number of expressions and the type of each expression decide the tuple type.
For example:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">type tup = tuple(bool b; real r);
tup t = (true, 3.48);</code></pre>
</div>
</div>
<div class="paragraph">
<p>The type named <code>tup</code> is a tuple type with a boolean field and a real field.
The expression <code>(true, 3.48)</code> constructs the same tuple type, thus it can be assigned to variable <code>t</code>.
Names of the fields are not relevant in this matching, for example variable declaration (and initialization) <code>tuple(bool z; real w) u = t</code> is allowed, since the types of the fields match in a pair-wise manner.</p>
</div>
<div class="paragraph">
<p>A field of a tuple can be accessed both for read and for assignment by the name of the field:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">bool c;
c = t.b; # Read the 'b' field.
t.b = false; # Assign a new value to the 'b' field.</code></pre>
</div>
</div>
<div class="paragraph">
<p>In the latter case, only the assigned field changes, all other fields keep the same value.</p>
</div>
<div class="paragraph">
<p>Tuples can also be packed and unpacked.
Packing is assignment to all fields, while unpacking is reading of all fields into separate variables:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">real q;
t = false, 3.8; # Packing of values into a tuple.
c, q = t; # Unpacking into separate variables.</code></pre>
</div>
</div>
<div class="paragraph">
<p>Packing is very closely related to literal tuples above.
The difference is that packing can be done only like above in an assignment to a tuple value, while a literal tuple works everywhere.</p>
</div>
<div class="paragraph">
<p>Unpacking is very useful when the right side (<code>t</code> in the example) is more complex, for example, the return value of a function call, as in <code>c, q = f();</code>.
In such cases you don&#8217;t need to construct an intermediate tuple variable.</p>
</div>
<div class="paragraph">
<p>Packing and unpacking is also used in multi-assignment statements:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">a, b = 3, 4; # Assign 3 to 'a', and 4 to 'b'.
a, b = b, a; # Swap values of 'a' and 'b'.</code></pre>
</div>
</div>
<div class="paragraph">
<p>The latter works due to the intermediate tuple that is created as part in the assignment.</p>
</div>
<div class="paragraph">
<p>
</p>
</div>
</div>
<div class="sect3">
<h4 id="ref-file-expression">File handle expressions</h4>
<div class="paragraph">
<p>Variables of type <code>file</code> are created using a variable declaration with a <code>file</code> type, see <a href="#ref-file-type">File type</a> for details about the type.</p>
</div>
<div class="paragraph">
<p>You cannot write a literal value for a file type (nor can you read or write values of this type), file values are created by means of the <code>open</code> function in the standard library, see <a href="#ref-file-stdlib">File functions</a>.</p>
</div>
<div class="paragraph">
<p>You can test whether two files are the same with the binary <code>==</code> and <code>!=</code> operators.</p>
</div>
<table class="tableblock frame-all grid-all stretch">
<colgroup>
<col style="width: 20%;">
<col style="width: 20%;">
<col style="width: 20%;">
<col style="width: 20%;">
<col style="width: 20%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top">Expression</th>
<th class="tableblock halign-left valign-top">Type <strong>lhs</strong></th>
<th class="tableblock halign-left valign-top">Type <strong>rhs</strong></th>
<th class="tableblock halign-left valign-top">Type result</th>
<th class="tableblock halign-left valign-top">Explanation</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>==</code> <strong>rhs</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">file</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">file</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Test for equality</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>!=</code> <strong>rhs</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">file</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">file</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Test for inequality</p></td>
</tr>
</tbody>
</table>
<div class="paragraph">
<p>Values of type <code>file</code> are used for writing output to a file using the <a href="#ref-write-statement">Write statement</a>, or for reading values from a file using the <code>read</code> function explained in <a href="#ref-read-expression">Read expression</a>.
After use, a file should be closed with a <code>close</code> statement explained at <a href="#ref-close-statement">Close statement</a>.</p>
</div>
<div class="paragraph">
<p>
</p>
</div>
</div>
<div class="sect3">
<h4 id="ref-read-expression">Read expression</h4>
<div class="paragraph">
<p>The read expression reads a value of a given type from the keyboard or from a file.
It has two forms:</p>
</div>
<div class="dlist">
<dl>
<dt class="hdlist1"><code>T</code> <strong>read</strong>(<code>T</code>)</dt>
<dd>
<p>Read a value of type <code>T</code> from the keyboard.</p>
</dd>
<dt class="hdlist1"><code>T</code> <strong>read</strong>(<code>file f, T</code>)</dt>
<dd>
<p>Read a value of type <code>T</code> from the file opened for reading by file <code>f</code> (see the <code>open</code> function in <a href="#ref-file-stdlib">File functions</a> for details about opening files).</p>
</dd>
</dl>
</div>
<div class="paragraph">
<p>You can read values from types that contain data used for calculation, that is values of types <code>bool</code>, <code>int</code>, <code>real</code>, <code>string</code>, <code>list T</code>, <code>set T</code>, and <code>dict(K:V)</code>.
Types <code>T</code>, <code>K</code>, and <code>V</code> must also be readable types of data (that is, get chosen from the above list of types).</p>
</div>
<div class="paragraph">
<p>Reading a value takes a text (with the same syntax as Chi literal values of the same type), and converts it into a value that can be manipulated in the Chi model.
Values read from the text have to be constant, for example the input <code>time</code> cannot be interpreted as real number with the same value as the current simulation time.</p>
</div>
<div class="paragraph">
<p>
</p>
</div>
</div>
<div class="sect3">
<h4 id="ref-timer-expression">Timer expressions</h4>
<div class="paragraph">
<p>Timers are clocks that count down to 0.
They are used to track the amount of time you still have to wait.
Timers can be stored in data of type <code>timer</code> (see <a href="#ref-timer-type">Timer type</a> for details of the type).</p>
</div>
<div class="paragraph">
<p>The standard library function <code>ready</code> exists to test whether a timer has expired.
See <a href="#ref-timer-stdlib">Timer functions</a> for details.</p>
</div>
<div class="paragraph">
<p>
</p>
</div>
</div>
<div class="sect3">
<h4 id="ref-channel-expression">Channel expressions</h4>
<div class="paragraph">
<p>Channels are used to connect processes with each other.
See the <a href="#ref-channel-type">Channel type</a> for details.</p>
</div>
<div class="paragraph">
<p>Usually, channels are created by variable declarations, as in:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">chan void s;
chan int c, d;</code></pre>
</div>
</div>
<div class="paragraph">
<p>This creates three channels, one synchronization channel <code>s</code>, and two channels (<code>c</code>, and <code>d</code>) communicating integers.</p>
</div>
<div class="paragraph">
<p>There is also a <code>channel</code> function to make new channels:</p>
</div>
<div class="dlist">
<dl>
<dt class="hdlist1"><code>chan T</code> <strong>channel</strong>(<code>T</code>)</dt>
<dd>
<p>Construct a new channel communicating data type <code>T</code>.
When <code>T</code> is <code>void</code>, a synchronization channel is created instead.</p>
</dd>
</dl>
</div>
<div class="paragraph">
<p>The only binary expressions on channels are equality comparison operations.</p>
</div>
<table class="tableblock frame-all grid-all stretch">
<colgroup>
<col style="width: 20%;">
<col style="width: 20%;">
<col style="width: 20%;">
<col style="width: 20%;">
<col style="width: 20%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top">Expression</th>
<th class="tableblock halign-left valign-top">Type <strong>lhs</strong></th>
<th class="tableblock halign-left valign-top">Type <strong>rhs</strong></th>
<th class="tableblock halign-left valign-top">Type result</th>
<th class="tableblock halign-left valign-top">Explanation</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>==</code> <strong>rhs</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">chan T</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">chan T</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Test for equality</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>!=</code> <strong>rhs</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">chan T</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">chan T</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Test for inequality</p></td>
</tr>
</tbody>
</table>
<div class="paragraph">
<p>where <code>T</code> can be either a normal type, or <code>void</code>.
There has to be an overlap between the channel directions (that is, you cannot compare a receive-only channel with a send-only channel).</p>
</div>
<div class="paragraph">
<p>
</p>
</div>
</div>
<div class="sect3">
<h4 id="ref-distribution-expression">Distribution expressions</h4>
<div class="paragraph">
<p>A distribution represents a stochastic distribution for drawing random numbers.
It use a pseudo-random number generator.
See <a href="#tut-chapter-stochastic-behavior">Modeling stochastic behavior</a> for a discussion how random numbers are used.</p>
</div>
<div class="paragraph">
<p>Variables of type distribution (see <a href="#ref-distribution-type">Distribution type</a>) are initialized by using a distribution function from the standard library, see <a href="#ref-chapter-distributions">Distributions</a> for an overview.</p>
</div>
<div class="paragraph">
<p>There is only one operator for variables with a distribution type, as shown below.</p>
</div>
<table class="tableblock frame-all grid-all stretch">
<colgroup>
<col style="width: 25%;">
<col style="width: 25%;">
<col style="width: 25%;">
<col style="width: 25%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top">Expression</th>
<th class="tableblock halign-left valign-top">Type <strong>op</strong></th>
<th class="tableblock halign-left valign-top">Type result</th>
<th class="tableblock halign-left valign-top">Explanation</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>sample</code> <strong>op</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">dist bool</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Sample <strong>op</strong> distribution</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>sample</code> <strong>op</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">dist int</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Sample <strong>op</strong> distribution</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>sample</code> <strong>op</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">dist real</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">real</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Sample <strong>op</strong> distribution</p></td>
</tr>
</tbody>
</table>
<div class="paragraph">
<p>The <code>sample</code> operator draws a random number from a distribution.
For example rolling a dice:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">model Dice():
dist int d = uniform(1, 7);
# Roll the dice 5 times
for i in range(5):
writeln("Rolled %d", sample d);
end
end</code></pre>
</div>
</div>
<div class="paragraph">
<p>
</p>
</div>
</div>
<div class="sect3">
<h4 id="ref-process-expression">Process expressions</h4>
<div class="paragraph">
<p>A process expression refers to a process definition.
It can be used to parameterize the process that is being instantiated, by passing such a value to a <code>run</code> or <code>start</code> statement.
(See <a href="#ref-run-and-start-statements">Run and start statements</a> for details on how to create a new process.)
An example:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">proc A(int x):
writeln("A(%d)", x);
end
proc B(int x):
writeln("B(%d)", x);
end
proc P(proc (int) ab):
run ab(3);
end
model M():
run P(A); # Pass 'proc A' into P.
end</code></pre>
</div>
</div>
<div class="paragraph">
<p>Formal parameter <code>ab</code> of process <code>P</code> is a process variable that refers to a process taking an integer parameter.
The given process definition is instantiated.
Since in the model definition, <code>A</code> is given to process <code>P</code>, the output of the above model is <code>A(3)</code>.</p>
</div>
<div class="paragraph">
<p>
</p>
</div>
</div>
<div class="sect3">
<h4 id="ref-instance-expression">Instance expressions</h4>
<div class="paragraph">
<p>Process instances represent running processes in the model.
Their use is to store a reference to such a running process, to allow testing for finishing.</p>
</div>
<div class="paragraph">
<p>An instance variable is assigned during a <code>start</code> statement.
(See <a href="#ref-run-and-start-statements">Run and start statements</a> for details on how to start a new process.)</p>
</div>
<div class="paragraph">
<p>The instance variable is used to test for termination of the instantiated process, or to wait for it:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">proc Wait():
delay 4.52;
end
model M():
inst w;
start w = Wait();
delay 1.2;
writeln("is Wait finished? %b", finished(w));
# Wait until the process has finished.
finish w;
end</code></pre>
</div>
</div>
<div class="paragraph">
<p><code>Wait</code> is a process that waits a while before terminating.
In the <code>start</code> statement, instance variable <code>w</code> is set up to refer to instantiated process <code>Wait</code>.
After assignment, you can use the variable for testing whether the process has terminated.
In the example, the test result is written to the screen, but this could also be used as a guard in a select statement (See <a href="#ref-select-statement">Select statement</a> for details).</p>
</div>
<div class="paragraph">
<p>The other thing that you can do is to wait for termination of the process by means of the <code>finish</code> statement, see also <a href="#ref-finish-statement">Finish statement</a>.</p>
</div>
</div>
<div class="sect3">
<h4 id="ref-matrix-expression">Matrix expression</h4>
<div class="paragraph">
<p>The syntax of a matrix literal value is as follows.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="./reference-manual/rail_diagrams/literal_matrix.png" alt="literal matrix">
</div>
</div>
<div class="paragraph">
<p>The literal starts with a <code>[</code> symbol, and ends with a <code>]</code> symbol.
In between it has at least two comma-separated lists of real number values, separated with a <code>;</code> symbol.</p>
</div>
<div class="paragraph">
<p>Each comma-separated list of real number values is a row of the matrix.
The number of columns of each row is the same at each row, which means the number of real number values must be the same with each list.
As an example:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">matrix(2, 3) m = [1.0, 2.0, 3.0;
4.0, 5.0, 6.0]</code></pre>
</div>
</div>
<div class="paragraph">
<p><code>m</code> is a matrix with two rows and three columns.
A comma separates two columns from each other, a semicolon separates two rows.</p>
</div>
<div class="paragraph">
<p>The syntax demands at least one semicolon in a literal matrix value, which means you cannot write a matrix literal with a single row directly.
Instead, write a cast expression that converts a list of real numbers to a matrix with a single row.
See <a href="#ref-cast-expression">Cast expressions</a> for an explanation of cast expressions.</p>
</div>
</div>
<div class="sect3">
<h4 id="ref-cast-expression">Cast expressions</h4>
<div class="paragraph">
<p>A cast expression converts a value from one type to another.
The syntax of a cast expression is as follows.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="./reference-manual/rail_diagrams/cast_expression.png" alt="cast expression">
</div>
</div>
<div class="paragraph">
<p>You write the result type, followed by an expression between parentheses.
The value of the expression is converted to the given type.
For example:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">real v = 3.81;
timer t;
t = timer(v); # Convert from real to timer (third entry in the table)</code></pre>
</div>
</div>
<div class="paragraph">
<p>The conversion from a list to a matrix (the first entry in the table) is a special case in the sense that you also need to specify the size of the resulting matrix, as in:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">list real xs = [1, 2, 3];
writeln("matrix with one row and three columns: %s", matrix(1, 3, xs));</code></pre>
</div>
</div>
<div class="paragraph">
<p>The expected number of rows and columns given in the first two arguments must be constant.
When the conversion is performed, the length of the given list must be the same as the number of columns stated in the second argument.</p>
</div>
<div class="paragraph">
<p>The number of available conversions is quite limited, below is a table that lists them.</p>
</div>
<table class="tableblock frame-all grid-all stretch">
<colgroup>
<col style="width: 33.3333%;">
<col style="width: 33.3333%;">
<col style="width: 33.3334%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top">Value type</th>
<th class="tableblock halign-left valign-top">Result type</th>
<th class="tableblock halign-left valign-top">Remarks</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">list</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">matrix</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Conversion of a list to a matrix with one row</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">list</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">set</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Construct a set from a list</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">real</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">timer</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Setting up a timer</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">timer</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">real</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Reading the current value of a timer</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">string</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Parsing a boolean value from a string</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">string</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Parsing an integer number from a string</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">string</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">real</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Parsing a real number from a string</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">string</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Converting a boolean to a string representation</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">string</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Converting an integer to a string representation</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">real</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">string</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Converting a real number to a string representation</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">real</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Widening an integer number to a real number</p></td>
</tr>
</tbody>
</table>
<div class="paragraph">
<p>The first entry exists for creating matrices with one row (which you cannot write syntactically).
The second entry constructs a set from a list of values.
The element type of the list and the resulting set are the same.</p>
</div>
<div class="paragraph">
<p>The pair of conversions between timer type and real number type is for setting and reading timers, see <a href="#tut-using-timers">Timers</a> for their use.</p>
</div>
<div class="paragraph">
<p>The conversions from string to boolean or numeric allows parsing of a string.
The other way around is also possible, although this is usually done as part of a <strong>write</strong> statement (see <a href="#ref-write-statement">Write statement</a> for details).</p>
</div>
<div class="paragraph">
<p>The final entry is for widening an integer to a real number.
The other way around (from a real number to an integer number) does not exist as cast, but there are stdlib functions <strong>ceil</strong>, <strong>floor</strong>, and <strong>round</strong> available instead (explained in <a href="#ref-real-stdlib">Real number functions</a>).</p>
</div>
</div>
<div class="sect3">
<h4 id="ref-functioncall-expression">Function call expressions</h4>
<div class="paragraph">
<p>A function call starts a function to compute its result value from the input parameters.
The syntax is as follows.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="./reference-manual/rail_diagrams/func_call_expression.png" alt="func call expression">
</div>
</div>
<div class="paragraph">
<p>The <code>Expression</code> before the open parenthesis represents the function to call.
Often this is a simple name like <code>size</code> (the name of one of the standard library functions), but you can have more complicated expressions.</p>
</div>
<div class="paragraph">
<p>The sequence of expressions inside the parentheses denote the values of the input parameters of the functions.
Their type has to match with the type stated in the formal parameter at the corresponding position.</p>
</div>
<div class="paragraph">
<p>The result of the function call is a value with the same type as stated in the return type of the function definition.</p>
</div>
</div>
<div class="sect3">
<h4 id="ref-operator-priorities">Operator priorities</h4>
<div class="paragraph">
<p>Operator priorities aim to reduce the number of parentheses needed in expressions.
They do this by make choices in the order of applying operators on their arguments.
For example, <code>1 + 2 * 3</code> can be interpreted as <code>(1 + 2) * 3</code> (if the addition operation is applied first), or as <code>1 + (2 * 3)</code> (if the multiplication operation is performed first).</p>
</div>
<div class="paragraph">
<p>In the following table, the order of applying operators in the Chi language is defined.</p>
</div>
<table class="tableblock frame-all grid-all stretch">
<colgroup>
<col style="width: 50%;">
<col style="width: 50%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top">Priority</th>
<th class="tableblock halign-left valign-top">Operators</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">1</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">(unary) <code>sample</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">2</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">unary <code>+</code>, unary <code>-</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">3</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>^</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">4</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>*</code>, <code>/</code>, <code>div</code>, <code>mod</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">5</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>+</code>, <code>-</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">6</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>&lt;</code>, <code>&lt;=</code>, <code>==</code>, <code>!=</code>, <code>&gt;=</code>, <code>&gt;</code>, <code>in</code>, <code>sub</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">7</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">(unary) <code>not</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">8</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>and</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">9</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>or</code></p></td>
</tr>
</tbody>
</table>
<div class="paragraph">
<p>Operators with a smaller priority number get applied before operators with a higher priority number.
Operators with the same priority get applied from left to right.</p>
</div>
</div>
</div>
<div class="sect2">
<h3 id="ref-chapter-standard-library">Standard library functions</h3>
<div class="paragraph">
<p>
The Chi language has many general purpose functions available.
They are organized by type and kind of use.</p>
</div>
<div class="ulist">
<ul>
<li>
<p><a href="#ref-integer-stdlib">Integer functions</a></p>
</li>
<li>
<p><a href="#ref-real-stdlib">Real number functions</a></p>
</li>
<li>
<p><a href="#ref-string-stdlib">String functions</a></p>
</li>
<li>
<p><a href="#ref-list-stdlib">List functions</a></p>
</li>
<li>
<p><a href="#ref-set-stdlib">Set functions</a></p>
</li>
<li>
<p><a href="#ref-dictionary-stdlib">Dictionary functions</a></p>
</li>
<li>
<p><a href="#ref-chapter-distributions">Distributions</a></p>
</li>
<li>
<p><a href="#ref-timer-stdlib">Timer functions</a></p>
</li>
<li>
<p><a href="#ref-file-stdlib">File functions</a></p>
</li>
<li>
<p><a href="#ref-instance-stdlib">Process instance functions</a></p>
</li>
</ul>
</div>
<div class="paragraph">
<p>
</p>
</div>
<div class="sect3">
<h4 id="ref-integer-stdlib">Integer functions</h4>
<div class="paragraph">
<p>The following standard library functions on integers exist:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><code>int</code> <strong>abs</strong><code>(int val)</code></p>
<div class="paragraph">
<p>Return the absolute value of <code>val</code>.</p>
</div>
</li>
<li>
<p><code>int</code> <strong>sign</strong><code>(int val)</code></p>
<div class="paragraph">
<p>Return <code>-1</code> if val less than zero, <code>1</code> if val more than zero, and <code>0</code> otherwise.</p>
</div>
</li>
<li>
<p><code>int</code> <strong>max</strong><code>(int a, b, ...)</code></p>
<div class="paragraph">
<p>Return the biggest value of the parameters.</p>
</div>
</li>
<li>
<p><code>int</code> <strong>min</strong><code>(int a, b, ...)</code></p>
<div class="paragraph">
<p>Return the smallest value of the parameters.</p>
</div>
</li>
</ul>
</div>
<div class="paragraph">
<p>
</p>
</div>
</div>
<div class="sect3">
<h4 id="ref-real-stdlib">Real number functions</h4>
<div class="paragraph">
<p>The following standard library functions on real numbers exist:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><code>real</code> <strong>abs</strong><code>(real val)</code></p>
<div class="paragraph">
<p>Return the absolute value of <code>val</code>.</p>
</div>
</li>
<li>
<p><code>int</code> <strong>sign</strong><code>(real val)</code></p>
<div class="paragraph">
<p>Return <code>-1</code> if val less than zero, <code>1</code> if val more than zero, and <code>0</code> otherwise.</p>
</div>
</li>
<li>
<p><code>real</code> <strong>max</strong><code>(real a, b, ...)</code></p>
<div class="paragraph">
<p>Return the biggest value of the parameters.
Integer parameters are silently promoted to real.</p>
</div>
</li>
<li>
<p><code>real</code> <strong>min</strong><code>(real a, b, ...)</code></p>
<div class="paragraph">
<p>Return the smallest value of the parameters.
Integer parameters are silently promoted to real.</p>
</div>
</li>
</ul>
</div>
<div class="paragraph">
<p>Conversion from real number to integer can be performed in three different ways.</p>
</div>
<div class="ulist">
<ul>
<li>
<p><code>int</code> <strong>ceil</strong><code>(real val)</code></p>
<div class="paragraph">
<p>Return smallest integer bigger or equal to <code>val</code>.</p>
</div>
</li>
<li>
<p><code>int</code> <strong>floor</strong><code>(real val)</code></p>
<div class="paragraph">
<p>Return biggest integer less or equal to <code>val</code>.</p>
</div>
</li>
<li>
<p><code>int</code> <strong>round</strong><code>(real val)</code></p>
<div class="paragraph">
<p>Round to nearest integer value (up if distance is <code>0.5</code>).</p>
</div>
</li>
</ul>
</div>
<div class="paragraph">
<p>The following power and logarithmic functions exist.</p>
</div>
<div class="ulist">
<ul>
<li>
<p><code>real</code> <strong>sqrt</strong><code>(real val)</code></p>
<div class="paragraph">
<p>Return the square root of <code>val</code> (argument must be non-negative).</p>
</div>
</li>
<li>
<p><code>real</code> <strong>cbrt</strong><code>(real val)</code></p>
<div class="paragraph">
<p>Return the cube root of <code>val</code> (<code>val^(1/3)</code>).</p>
</div>
</li>
<li>
<p><code>real</code> <strong>exp</strong><code>(real x)</code></p>
<div class="paragraph">
<p>Compute <code>e^x</code>.</p>
</div>
</li>
<li>
<p><code>real</code> <strong>ln</strong><code>(real x)</code></p>
<div class="paragraph">
<p>Compute the natural logarithm of <code>x</code>.</p>
</div>
</li>
<li>
<p><code>real</code> <strong>log</strong><code>(real x)</code></p>
<div class="paragraph">
<p>Compute the base-10 logarithm of <code>x</code>.</p>
</div>
</li>
</ul>
</div>
<div class="paragraph">
<p>Finally, there are trigonometric functions available.</p>
</div>
<div class="ulist">
<ul>
<li>
<p><code>real</code> <strong>cos</strong><code>(real a)</code></p>
<div class="paragraph">
<p>Cosine function of angle <code>a</code> (in radians).</p>
</div>
</li>
<li>
<p><code>real</code> <strong>sin</strong><code>(real angle)</code></p>
<div class="paragraph">
<p>Sine function of angle <code>a</code> (in radians).</p>
</div>
</li>
<li>
<p><code>real</code> <strong>tan</strong><code>(real angle)</code></p>
<div class="paragraph">
<p>Tangent function of angle <code>a</code> (in radians).</p>
</div>
</li>
<li>
<p><code>real</code> <strong>acos</strong><code>(real val)</code></p>
<div class="paragraph">
<p>Arc cosine function of value <code>val</code>.</p>
</div>
</li>
<li>
<p><code>real</code> <strong>asin</strong><code>(real val)</code></p>
<div class="paragraph">
<p>Arc sine function of value <code>val</code>.</p>
</div>
</li>
<li>
<p><code>real</code> <strong>atan</strong><code>(real val)</code></p>
<div class="paragraph">
<p>Arc tangent function of value <code>val</code>.</p>
</div>
</li>
<li>
<p><code>real</code> <strong>cosh</strong><code>(real val)</code></p>
<div class="paragraph">
<p>Hyperbolic cosine function of value <code>val</code>.</p>
</div>
</li>
<li>
<p><code>real</code> <strong>sinh</strong><code>(real val)</code></p>
<div class="paragraph">
<p>Hyperbolic sine function of value <code>val</code>.</p>
</div>
</li>
<li>
<p><code>real</code> <strong>tanh</strong><code>(real val)</code></p>
<div class="paragraph">
<p>Hyperbolic tangent function of value <code>val</code>.</p>
</div>
</li>
<li>
<p><code>real</code> <strong>acosh</strong><code>(real val)</code></p>
<div class="paragraph">
<p>Inverse hyperbolic cosine function of value <code>val</code>.</p>
</div>
</li>
<li>
<p><code>real</code> <strong>asinh</strong><code>(real val)</code></p>
<div class="paragraph">
<p>Inverse hyperbolic sine function of value <code>val</code>.</p>
</div>
</li>
<li>
<p><code>real</code> <strong>atanh</strong><code>(real val)</code></p>
<div class="paragraph">
<p>Inverse hyperbolic tangent function of value <code>val</code>.</p>
</div>
</li>
</ul>
</div>
<div class="paragraph">
<p>
</p>
</div>
</div>
<div class="sect3">
<h4 id="ref-string-stdlib">String functions</h4>
<div class="paragraph">
<p>The following string functions exist in the standard library.</p>
</div>
<div class="ulist">
<ul>
<li>
<p><code>int</code> <strong>size</strong><code>(string s)</code></p>
<div class="paragraph">
<p>Get the number of characters in string <code>s</code>.</p>
</div>
</li>
<li>
<p><code>string</code> <strong>max</strong><code>(string a, b, ...)</code></p>
<div class="paragraph">
<p>Return the biggest string of the parameters.</p>
</div>
</li>
<li>
<p><code>string</code> <strong>min</strong><code>(string a, b, ...)</code></p>
<div class="paragraph">
<p>Return the smallest string of the parameters.</p>
</div>
</li>
</ul>
</div>
<div class="paragraph">
<p>
</p>
</div>
</div>
<div class="sect3">
<h4 id="ref-list-stdlib">List functions</h4>
<div class="paragraph">
<p>Getting an element out of list can be done in two ways.</p>
</div>
<div class="ulist">
<ul>
<li>
<p><code>tuple(T value, list T ys)</code> <strong>pop</strong><code>(list T xs)</code></p>
<div class="paragraph">
<p>Get the first element of non-empty list <code>xs</code> (with arbitrary element type <code>T</code>), and return a tuple with the first element and the list without the first element.</p>
</div>
</li>
<li>
<p><code>list T</code> <strong>del</strong><code>(list T xs, int index)</code></p>
<div class="paragraph">
<p>Remove element <code>xs[index]</code> from list <code>xs</code> (with arbitrary type <code>T</code>).
The index position must exist in the list.
Returns a list without the removed element.</p>
</div>
</li>
</ul>
</div>
<div class="paragraph">
<p>For getting information about the number of elements in a list, the following functions are available.</p>
</div>
<div class="ulist">
<ul>
<li>
<p><code>bool</code> <strong>empty</strong><code>(list T xs)</code></p>
<div class="paragraph">
<p>Is list <code>xs</code> empty (for any element type <code>T</code>)?
Returns <code>true</code> when <code>xs</code> contains no elements, and <code>false</code> when it has at least one element.</p>
</div>
</li>
<li>
<p><code>int</code> <strong>size</strong><code>(list T xs)</code></p>
<div class="paragraph">
<p>Get the number of elements in list <code>xs</code> (for any element type <code>T</code>).</p>
</div>
</li>
</ul>
</div>
<div class="paragraph">
<p>List functions mainly useful for using with a <code>for</code> statement (explained in <a href="#ref-for-loop-statement">For loop statement</a>) follow next.</p>
</div>
<div class="ulist">
<ul>
<li>
<p><code>list tuple(int index, T value)</code> <strong>enumerate</strong><code>(list T xs)</code></p>
<div class="paragraph">
<p>Construct a copy of the list <code>xs</code> with arbitrary element type <code>T</code>, with each element replaced by a tuple containing the index of the element as well as the element itself.
For example, <code>enumerate(["a", "b"])</code> results in the list <code>[(0, "a"), (1, "b")]</code>.</p>
</div>
</li>
<li>
<p><code>list int</code> <strong>range</strong><code>(int end)</code></p>
<div class="paragraph">
<p>Construct a list with integer values running from <code>0</code> to (but not including) <code>end</code>.
For example <code>range(3)</code> produces list <code>[0, 1, 2]</code>.</p>
</div>
</li>
<li>
<p><code>list int</code> <strong>range</strong><code>(int start, end)</code></p>
<div class="paragraph">
<p>Construct a list with integer values running from <code>start</code> to (but not including) <code>end</code>.
For example, <code>range(3, 7)</code> produces list <code>[3, 4, 5, 6]</code>.</p>
</div>
</li>
<li>
<p><code>list int</code> <strong>range</strong><code>(int start, end, step)</code></p>
<div class="paragraph">
<p>Construct a list with integer values running from <code>start</code> to (but not including) <code>end</code>, while incrementing the value with step size <code>step</code>.
For example <code>range(3, 8, 2)</code> produces <code>list [3, 5, 7]</code>.
Negative step sizes are also allowed to construct lists with decrementing values, but <code>start</code> has to be larger than <code>end</code> in that case.</p>
</div>
</li>
</ul>
</div>
<div class="paragraph">
<p>For occasionally getting the biggest or smallest element of a list, the <code>min</code> and <code>max</code> functions are available.
These functions take a lot of time, if smallest or biggest values are needed often, it may be better to use a sorted list.</p>
</div>
<div class="ulist">
<ul>
<li>
<p><code>T</code> <strong>min</strong><code>(list T xs)</code></p>
<div class="paragraph">
<p>Return the smallest element value of type <code>T</code> (<code>T</code> must be type int, real, or string) from non-empty list <code>xs</code>.</p>
</div>
</li>
<li>
<p><code>T</code> <strong>max</strong><code>(list T xs)</code></p>
<div class="paragraph">
<p>Return the biggest element value of type <code>T</code> (<code>T</code> must be type int, real, or string) from non-empty list <code>xs</code>.</p>
</div>
</li>
<li>
<p><code>list</code> <code>T</code> <strong>sort</strong><code>(list T xs, func bool pred(T a, b))</code></p>
<div class="paragraph">
<p>Sort list <code>xs</code> such that the predicate function <code>pred</code> holds for every pair of elements in the list, and return the sorted list.</p>
</div>
<div class="paragraph">
<p>The predicate function <code>pred</code> must implement a total ordering on the values.
See also the <a href="#tut-sorted-lists">sorted lists</a> discussion in the tutorial.</p>
</div>
</li>
<li>
<p><code>list</code> <code>T</code> <strong>insert</strong><code>(list T xs, T x, func bool pred(T a, b))</code></p>
<div class="paragraph">
<p>Given an already sorted list <code>xs</code> with respect to predicate function <code>pred</code> (with arbitrary element type <code>T</code>), insert element value <code>x</code> into the list such that the predicate function <code>pred</code> again holds for every pair of elements in the list.
Return the list with the inserted <code>element</code>.</p>
</div>
<div class="paragraph">
<p>The predicate function <code>pred</code> must implement a total ordering on the values.
See also the <a href="#tut-sorted-lists">sorted lists</a> discussion in the tutorial.</p>
</div>
</li>
</ul>
</div>
<div class="paragraph">
<p>
</p>
</div>
</div>
<div class="sect3">
<h4 id="ref-set-stdlib">Set functions</h4>
<div class="paragraph">
<p>Similar to lists, there are two functions for getting an element from a set.</p>
</div>
<div class="ulist">
<ul>
<li>
<p><code>tuple(T val, set T yr)</code> <strong>pop</strong><code>(set T xr)</code></p>
<div class="paragraph">
<p>Get an element of non-empty set <code>xr</code> (with arbitrary element type <code>T</code>), and return a tuple with the retrieved element and the set without the retrieved element.
Note that the order of elements in a set has no meaning, and may change at any moment.</p>
</div>
</li>
<li>
<p><code>list tuple(int index, T val)</code> <strong>enumerate</strong><code>(set T xr)</code></p>
<div class="paragraph">
<p>Construct a list of tuples with position <code>index</code> and element value <code>val</code> from the set <code>xr</code> with arbitrary element type <code>T</code>.
Note that the <code>index</code> has no meaning in the set.</p>
</div>
</li>
</ul>
</div>
<div class="paragraph">
<p>Removing a single element from a set can be done with the function below.</p>
</div>
<div class="ulist">
<ul>
<li>
<p><code>set T</code> <strong>del</strong><code>(set T xr, T value)</code></p>
<div class="paragraph">
<p>Remove from set <code>xr</code> (with arbitrary element type <code>T</code>) element <code>value</code> if it exists in the set.
Returns a set without the (possibly) removed element.</p>
</div>
</li>
</ul>
</div>
<div class="paragraph">
<p>For getting information about the number of elements in a set, the following functions are available.</p>
</div>
<div class="ulist">
<ul>
<li>
<p><code>bool</code> <strong>empty</strong><code>(set T xr)</code></p>
<div class="paragraph">
<p>Is set <code>xr</code> empty (for any element type <code>T</code>)?
Returns <code>true</code> when <code>xr</code> contains no elements, and <code>false</code> when it has at least one element.</p>
</div>
</li>
<li>
<p><code>int</code> <strong>size</strong><code>(set T xr)</code></p>
<div class="paragraph">
<p>Get the number of elements in set <code>xr</code> (for any element type <code>T</code>).</p>
</div>
</li>
</ul>
</div>
<div class="paragraph">
<p>For occasionally getting the biggest or smallest element of a set, the <code>min</code> and <code>max</code> functions are available.
These functions take a lot of time, if smallest or biggest values are needed often, it may be better to make a sorted list.</p>
</div>
<div class="ulist">
<ul>
<li>
<p><code>T</code> <strong>min</strong><code>(set T xr)</code></p>
<div class="paragraph">
<p>Return the smallest element value of type <code>T</code> (<code>T</code> must be type <code>int</code>, <code>real</code>, or <code>string</code>) from non-empty set <code>xr</code>.</p>
</div>
</li>
<li>
<p><code>T</code> <strong>max</strong><code>(set T xr)</code></p>
<div class="paragraph">
<p>Return the biggest element value of type <code>T</code> (<code>T</code> must be type <code>int</code>, <code>real</code>, or <code>string</code>) from non-empty set <code>xr</code>.</p>
</div>
</li>
</ul>
</div>
<div class="paragraph">
<p>
</p>
</div>
</div>
<div class="sect3">
<h4 id="ref-dictionary-stdlib">Dictionary functions</h4>
<div class="paragraph">
<p>Getting a value or a sequence of values from a dictionary can be done with the following functions.</p>
</div>
<div class="ulist">
<ul>
<li>
<p><code>tuple(K key, V val, dict(K:V) e)</code> <strong>pop</strong><code>(dict(K:V) d)</code></p>
<div class="paragraph">
<p>Get a key-value pair from non-empty dictionary <code>d</code> (with arbitrary key type <code>K</code> and arbitrary value type <code>V</code>), and return a tuple with the retrieved key, the retrieved value, and the dictionary without the retrieved element.</p>
</div>
</li>
<li>
<p><code>list tuple(int index, K key, V val)</code> <strong>enumerate</strong><code>(dict(K:V) d)</code></p>
<div class="paragraph">
<p>Construct a list of tuples with position <code>index</code>, key <code>key</code> and value <code>val</code> from dictionary <code>d</code> (with arbitrary key type <code>K</code> and arbitrary value type <code>V</code>).
Note that the <code>index</code> has no meaning in the dictionary.
In combination with a for statement (explained in <a href="#ref-for-loop-statement">For loop statement</a>), it is also possible to iterate over the dictionary directly.</p>
</div>
</li>
<li>
<p><code>list K</code> <strong>dictkeys</strong><code>(dict(K:V) d)</code></p>
<div class="paragraph">
<p>Return the keys of dictionary <code>d</code> (with any key type <code>K</code> and value type <code>V</code>) as a list with element type <code>K</code>.
Since a dictionary has no order, the order of the elements in the resulting list is also undefined.</p>
</div>
</li>
<li>
<p><code>list V</code> <strong>dictvalues</strong><code>(dict(K:V) d)</code></p>
<div class="paragraph">
<p>Return the values of dictionary <code>d</code> (with any key type <code>K</code> and value type <code>V</code>) as a list with element type <code>V</code>.
Since a dictionary has no order, the order of the elements in the resulting list is also undefined.</p>
</div>
</li>
</ul>
</div>
<div class="paragraph">
<p>Removing a single element from a dictionary can be done with the function below.</p>
</div>
<div class="ulist">
<ul>
<li>
<p><code>dict(K:V)</code> <strong>del</strong><code>(dict(K:V) d, K key)</code></p>
<div class="paragraph">
<p>Remove element <code>key</code> from dictionary <code>d</code> (with arbitrary element key type <code>K</code> and arbitrary value type <code>V</code>) if it exists in the dictionary.
Returns a dictionary without the (possibly) removed element.</p>
</div>
</li>
</ul>
</div>
<div class="paragraph">
<p>The number of keys in a dictionary can be queried with the following functions.</p>
</div>
<div class="ulist">
<ul>
<li>
<p><code>bool</code> <strong>empty</strong><code>(dict(K:V) d)</code></p>
<div class="paragraph">
<p>Is dictionary <code>d</code> empty?
(with any key type <code>K</code> and value type <code>V</code>) Returns <code>true</code> when <code>d</code> contains no elements, and <code>false</code> when it has at least one key element.</p>
</div>
</li>
<li>
<p><code>int</code> <strong>size</strong><code>(dict(K:V) d)</code></p>
<div class="paragraph">
<p>Get the number of key elements in dictionary <code>d</code> (with any key type <code>K</code> and value type <code>V</code>).</p>
</div>
</li>
</ul>
</div>
<div class="paragraph">
<p>For occasionally getting the biggest or smallest key value of a dictionary, the <code>min</code> and <code>max</code> functions are available.
These functions take a lot of time, if smallest or biggest keys are needed often, it may be better to use a sorted list.</p>
</div>
<div class="ulist">
<ul>
<li>
<p><code>K</code> <strong>min</strong><code>(dict(K:V) d)</code></p>
<div class="paragraph">
<p>Return the smallest key of type <code>K</code> (<code>K</code> must be type <code>int</code>, <code>real</code>, or <code>string</code>) from non-empty dictionary <code>d</code>.</p>
</div>
</li>
<li>
<p><code>K</code> <strong>max</strong><code>(dict(K:V) d)</code></p>
<div class="paragraph">
<p>Return the biggest key of type <code>K</code> (<code>K</code> must be type <code>int</code>, <code>real</code>, or <code>string</code>) from non-empty dictionary <code>d</code>.</p>
</div>
</li>
</ul>
</div>
<div class="paragraph">
<p>
</p>
</div>
</div>
<div class="sect3">
<h4 id="ref-timer-stdlib">Timer functions</h4>
<div class="ulist">
<ul>
<li>
<p><code>bool</code> <strong>ready</strong><code>(timer t)</code></p>
<div class="paragraph">
<p>Return whether timer <code>t</code> has expired (or was never set).
Returns <code>true</code> if the timer has reached <code>0</code> or was never set, and <code>false</code> if it is still running.</p>
</div>
</li>
</ul>
</div>
<div class="paragraph">
<p>
</p>
</div>
</div>
<div class="sect3">
<h4 id="ref-file-stdlib">File functions</h4>
<div class="ulist">
<ul>
<li>
<p><code>bool</code> <strong>eof</strong><code>(file handle)</code></p>
<div class="paragraph">
<p>For files that are read, this function tests whether the end of the file (EOF) has been reached.
That is, it tests whether you have read the last value in the <code>file</code>.</p>
</div>
<div class="paragraph">
<p>If the call returns <code>true</code>, there are no more values to read.
If it returns <code>false</code>, another value is still available.
For an example of how to use <code>eof</code> and <code>eol</code>, see <a href="#tut-advanced-file-reading">Advanced reading from a file</a>.</p>
</div>
</li>
<li>
<p><code>bool</code> <strong>eol</strong><code>(file handle)</code></p>
<div class="paragraph">
<p>For files that are read, this function tests whether the end of a line (EOL) has been reached.
That is, it tests whether you have read the last value at the current line.</p>
</div>
<div class="paragraph">
<p>If the call returns <code>true</code>, there are no more values to read at this line.
If it returns <code>false</code>, another value can be read.
For an example of how to use <code>eof</code> and <code>eol</code>, see <a href="#tut-advanced-file-reading">Advanced reading from a file</a>.</p>
</div>
<div class="paragraph">
<p>Note that 'the same line' is applied only to the leading white space.
It does not say anything about the number lines that a value itself uses.
For example, you could spread a list or set with numbers over multiple lines.</p>
</div>
</li>
<li>
<p><code>int</code> <strong>newlines</strong><code>(file handle)</code></p>
<div class="paragraph">
<p>For files that are read, this function returns how many lines down the next value can be found.
It returns a negative number if the end of the file has been reached.</p>
</div>
<div class="paragraph">
<p>For example, executing:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">int i;
file f = open("data.txt", "r");
i = read(f, int);
writeln("read %d, eol count is %d", i, newlines(f));
i = read(f, int);
writeln("read %d, eol count is %d", i, newlines(f));
i = read(f, int);
writeln("read %d, eol count is %d", i, newlines(f));
close(f);</code></pre>
</div>
</div>
<div class="paragraph">
<p>where "data.txt" contains:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-console" data-lang="console">123 345
789</code></pre>
</div>
</div>
<div class="paragraph">
<p>produces:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-console" data-lang="console">read 123, eol count is 0
read 345, eol count is 1
read 789, eol count is -1</code></pre>
</div>
</div>
<div class="paragraph">
<p>After reading <code>123</code>, the next integer is at the same line, which is <code>0</code> lines down.
After reading <code>345</code>, the next value is at the next line, which is <code>1</code> line down.
After reading the final value, a negative line count is returned to indicate lack of a next value.</p>
</div>
<div class="paragraph">
<p>Note that 'number of lines down' is applied only to the leading white space.
It does not say anything about the number lines that a value itself uses, a set of list could use several lines.</p>
</div>
</li>
<li>
<p><code>file</code> <strong>open</strong><code>(string filename, string mode)</code></p>
<div class="paragraph">
<p>Open the file with name <code>filename</code> using access mode <code>mode</code>.
When the access mode is <code>"r"</code>, the file should exist and is opened for reading.
When the access mode is <code>"w"</code>, the file is either created or its previous contents is erased.
There is no way to append output to an existing file.</p>
</div>
<div class="paragraph">
<p>Notice that filename is a normal Chi string, which means that the <code>\</code> character needs to be escaped to <code>\\</code>.
(That is, use a string like <code>"mydir\\myfile.txt"</code> to open the file with the name <code>myfile.txt</code> in directory (map) <code>mydir</code>.</p>
</div>
<div class="paragraph">
<p>Alternatively, you may want to use the forward slash <code>/</code> instead as path component separator.</p>
</div>
</li>
</ul>
</div>
<div class="paragraph">
<p>
</p>
</div>
</div>
<div class="sect3">
<h4 id="ref-instance-stdlib">Process instance functions</h4>
<div class="ulist">
<ul>
<li>
<p><code>bool</code> <strong>finished</strong><code>(inst p)</code></p>
<div class="paragraph">
<p>Return whether the process stored by process instance <code>p</code> has finished.
Returns <code>true</code> when the process has finished, and <code>false</code> if it has not ended yet.</p>
</div>
</li>
</ul>
</div>
</div>
</div>
<div class="sect2">
<h3 id="ref-chapter-distributions">Distributions</h3>
<div class="paragraph">
<p>
The Chi language has three kinds of distributions:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><a href="#ref-constant-distributions">Constant distributions</a>, distributions returning always the same value</p>
</li>
<li>
<p><a href="#ref-discrete-distributions">Discrete distributions</a>, distributions returning a boolean or integer value</p>
</li>
<li>
<p><a href="#ref-continuous-distributions">Continuous distributions</a>, distributions returning a real number value</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>The constant distributions are used during creation of the Chi program.
Before adding stochastic behavior, you want to make sure the program itself is correct.
It is much easier to verify correctness without stochastic behavior, but if you have to change the program again after the verification, you may introduce new errors in the process.</p>
</div>
<div class="paragraph">
<p>The constant distributions solve this by allowing you to program with stochastic sampling in the code, but it is not doing anything (since you get the same predictable value on each sample operation).
After verifying correctness of the program, you only need to modify the distributions that you use to get proper stochastic behavior.</p>
</div>
<div class="paragraph">
<p></p>
</div>
<div class="sect3">
<h4 id="ref-constant-distributions">Constant distributions</h4>
<div class="paragraph">
<p>The constant distributions have very predictable samples, which makes them ideal for testing functioning of the program before adding stochastic behavior.</p>
</div>
<div class="ulist">
<ul>
<li>
<p><code>dist</code> <code>bool</code> <strong>constant</strong><code>(bool b)</code></p>
<div class="paragraph">
<p>Distribution always returning <code>b</code>.</p>
</div>
<div class="hdlist">
<table>
<tr>
<td class="hdlist1">
Range
</td>
<td class="hdlist2">
<p><code>b</code></p>
</td>
</tr>
<tr>
<td class="hdlist1">
Mean
</td>
<td class="hdlist2">
<p><code>b</code></p>
</td>
</tr>
<tr>
<td class="hdlist1">
Variance
</td>
<td class="hdlist2">
<p>-</p>
</td>
</tr>
</table>
</div>
</li>
<li>
<p><code>dist</code> <code>int</code> <strong>constant</strong><code>(int i)</code></p>
<div class="paragraph">
<p>Distribution always returning <code>i</code>.</p>
</div>
<div class="hdlist">
<table>
<tr>
<td class="hdlist1">
Range
</td>
<td class="hdlist2">
<p><code>i</code></p>
</td>
</tr>
<tr>
<td class="hdlist1">
Mean
</td>
<td class="hdlist2">
<p><code>i</code></p>
</td>
</tr>
<tr>
<td class="hdlist1">
Variance
</td>
<td class="hdlist2">
<p>-</p>
</td>
</tr>
</table>
</div>
</li>
<li>
<p><code>dist</code> <code>real</code> <strong>constant</strong><code>(real r)</code></p>
<div class="paragraph">
<p>Distribution always returning <code>r</code>.</p>
</div>
<div class="hdlist">
<table>
<tr>
<td class="hdlist1">
Range
</td>
<td class="hdlist2">
<p><code>r</code></p>
</td>
</tr>
<tr>
<td class="hdlist1">
Mean
</td>
<td class="hdlist2">
<p><code>r</code></p>
</td>
</tr>
<tr>
<td class="hdlist1">
Variance
</td>
<td class="hdlist2">
<p>-</p>
</td>
</tr>
</table>
</div>
</li>
</ul>
</div>
<div class="paragraph">
<p>
</p>
</div>
</div>
<div class="sect3">
<h4 id="ref-discrete-distributions">Discrete distributions</h4>
<div class="paragraph">
<p>The discrete distributions return integer or boolean sample values.</p>
</div>
<div class="ulist">
<ul>
<li>
<p><code>dist</code> <code>bool</code> <strong>bernoulli</strong><code>(real p)</code></p>
<div class="paragraph">
<p>Outcome of an experiment with chance <code>p</code> <code>(0 &lt;= p &lt;= 1)</code>.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="./reference-manual/distribution_plots/bernoulli.svg" alt="bernoulli">
</div>
</div>
<div class="hdlist">
<table>
<tr>
<td class="hdlist1">
Range
</td>
<td class="hdlist2">
<p><code>{false, true}</code></p>
</td>
</tr>
<tr>
<td class="hdlist1">
Mean
</td>
<td class="hdlist2">
<p><code>p</code> (where <code>false</code> is interpreted as <code>0</code>, and <code>true</code> is interpreted as <code>1</code>)</p>
</td>
</tr>
<tr>
<td class="hdlist1">
Variance
</td>
<td class="hdlist2">
<p><code>1 - p</code> (where <code>false</code> is interpreted as <code>0</code>, and <code>true</code> is interpreted as <code>1</code>)</p>
</td>
</tr>
<tr>
<td class="hdlist1">
See also
</td>
<td class="hdlist2">
<p>Bernoulli(p), <a href="#law-ref">[law-ref]</a>, page 302</p>
</td>
</tr>
</table>
</div>
</li>
<li>
<p><code>dist</code> <code>int</code> <strong>binomial</strong><code>(int n, real p)</code></p>
<div class="paragraph">
<p>Number of successes when performing <code>n</code> experiments <code>(n &gt; 0)</code> with chance <code>p</code> <code>(0 &lt;= p &lt;= 1)</code>.</p>
</div>
<div class="hdlist">
<table>
<tr>
<td class="hdlist1">
Range
</td>
<td class="hdlist2">
<p><code>{0, 1, ..., n}</code></p>
</td>
</tr>
<tr>
<td class="hdlist1">
Mean
</td>
<td class="hdlist2">
<p><code>n * p</code></p>
</td>
</tr>
<tr>
<td class="hdlist1">
Variance
</td>
<td class="hdlist2">
<p><code>n * p * (1 - p)</code></p>
</td>
</tr>
<tr>
<td class="hdlist1">
See also
</td>
<td class="hdlist2">
<p>bin(n, p), <a href="#law-ref">[law-ref]</a>, page 304</p>
</td>
</tr>
</table>
</div>
</li>
<li>
<p><code>dist</code> <code>int</code> <strong>geometric</strong><code>(real p)</code></p>
<div class="paragraph">
<p>Geometric distribution, number of failures before success for an experiment with chance <code>p</code> <code>(0 &lt; p &lt;= 1)</code>.</p>
</div>
<div class="hdlist">
<table>
<tr>
<td class="hdlist1">
Range
</td>
<td class="hdlist2">
<p><code>{0, 1, ...}</code></p>
</td>
</tr>
<tr>
<td class="hdlist1">
Mean
</td>
<td class="hdlist2">
<p><code>(1 - p) / p</code></p>
</td>
</tr>
<tr>
<td class="hdlist1">
Variance
</td>
<td class="hdlist2">
<p><code>(1 - p) / p^2</code></p>
</td>
</tr>
<tr>
<td class="hdlist1">
See also
</td>
<td class="hdlist2">
<p>geom(p), <a href="#law-ref">[law-ref]</a>, page 305</p>
</td>
</tr>
</table>
</div>
</li>
<li>
<p><code>dist</code> <code>int</code> <strong>poisson</strong><code>(real lambda)</code></p>
<div class="paragraph">
<p>Poisson distribution.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="./reference-manual/distribution_plots/poisson.svg" alt="poisson">
</div>
</div>
<div class="hdlist">
<table>
<tr>
<td class="hdlist1">
Range
</td>
<td class="hdlist2">
<p><code>{0, 1, ...}</code></p>
</td>
</tr>
<tr>
<td class="hdlist1">
Mean
</td>
<td class="hdlist2">
<p><code>lambda</code></p>
</td>
</tr>
<tr>
<td class="hdlist1">
Variance
</td>
<td class="hdlist2">
<p><code>lambda</code></p>
</td>
</tr>
<tr>
<td class="hdlist1">
See also
</td>
<td class="hdlist2">
<p>Poison(lambda), <a href="#law-ref">[law-ref]</a>, page 308</p>
</td>
</tr>
</table>
</div>
</li>
<li>
<p><code>dist</code> <code>int</code> <strong>uniform</strong><code>(int a, b)</code></p>
<div class="paragraph">
<p>Integer uniform distribution from <code>a</code> to <code>b</code> excluding the upper bound.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="./reference-manual/distribution_plots/disc_uni.svg" alt="disc uni">
</div>
</div>
<div class="hdlist">
<table>
<tr>
<td class="hdlist1">
Range
</td>
<td class="hdlist2">
<p><code>{a, a+1, ..., b-1}</code></p>
</td>
</tr>
<tr>
<td class="hdlist1">
Mean
</td>
<td class="hdlist2">
<p><code>(a + b - 1) / 2</code></p>
</td>
</tr>
<tr>
<td class="hdlist1">
Variance
</td>
<td class="hdlist2">
<p><code>((b - a)^2 - 1) / 12</code></p>
</td>
</tr>
<tr>
<td class="hdlist1">
See also
</td>
<td class="hdlist2">
<p>DU(a, b - 1), <a href="#law-ref">[law-ref]</a>, page 303</p>
</td>
</tr>
</table>
</div>
</li>
</ul>
</div>
<div class="paragraph">
<p>
</p>
</div>
</div>
<div class="sect3">
<h4 id="ref-continuous-distributions">Continuous distributions</h4>
<div class="ulist">
<ul>
<li>
<p><code>dist</code> <code>real</code> <strong>beta</strong><code>(real p, q)</code></p>
<div class="paragraph">
<p>Beta distribution with shape parameters <code>p</code> and <code>q</code>, with <code>p &gt; 0</code> and <code>q &gt; 0</code>.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="./reference-manual/distribution_plots/beta.svg" alt="beta">
</div>
</div>
<div class="hdlist">
<table>
<tr>
<td class="hdlist1">
Range
</td>
<td class="hdlist2">
<p><code>[0, 1]</code></p>
</td>
</tr>
<tr>
<td class="hdlist1">
Mean
</td>
<td class="hdlist2">
<p><code>p / (p + q)</code></p>
</td>
</tr>
<tr>
<td class="hdlist1">
Variance
</td>
<td class="hdlist2">
<p><code>p * q / ((p + q)^2 * (p + q + 1))</code></p>
</td>
</tr>
<tr>
<td class="hdlist1">
See also
</td>
<td class="hdlist2">
<p>Beta(p, q), <a href="#law-ref">[law-ref]</a>, page 291</p>
</td>
</tr>
</table>
</div>
</li>
<li>
<p><code>dist</code> <code>real</code> <strong>erlang</strong><code>(double m, int k)</code></p>
<div class="paragraph">
<p>Erlang distribution with <code>k</code> a positive integer and <code>m &gt; 0</code>.
Equivalent to <code>gamma(k, m / k)</code>.</p>
</div>
<div class="hdlist">
<table>
<tr>
<td class="hdlist1">
Mean
</td>
<td class="hdlist2">
<p><code>m</code></p>
</td>
</tr>
<tr>
<td class="hdlist1">
Variance
</td>
<td class="hdlist2">
<p><code>m * m / k</code></p>
</td>
</tr>
<tr>
<td class="hdlist1">
See also
</td>
<td class="hdlist2">
<p>ERL(m, k), <a href="#banks-ref">[banks-ref]</a>, page 153</p>
</td>
</tr>
</table>
</div>
</li>
<li>
<p><code>dist</code> <code>real</code> <strong>exponential</strong><code>(real m)</code></p>
<div class="paragraph">
<p>(Negative) exponential distribution with mean <code>m</code>, with <code>m &gt; 0</code>.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="./reference-manual/distribution_plots/exponential.svg" alt="exponential">
</div>
</div>
<div class="hdlist">
<table>
<tr>
<td class="hdlist1">
Range
</td>
<td class="hdlist2">
<p><code>[0, infinite)</code></p>
</td>
</tr>
<tr>
<td class="hdlist1">
Mean
</td>
<td class="hdlist2">
<p><code>m</code></p>
</td>
</tr>
<tr>
<td class="hdlist1">
Variance
</td>
<td class="hdlist2">
<p><code>m * m</code></p>
</td>
</tr>
<tr>
<td class="hdlist1">
See also
</td>
<td class="hdlist2">
<p>expo(m), <a href="#law-ref">[law-ref]</a>, page 283</p>
</td>
</tr>
</table>
</div>
</li>
<li>
<p><code>dist</code> <code>real</code> <strong>gamma</strong><code>(real a, b)</code></p>
<div class="paragraph">
<p>Gamma distribution, with shape parameter <code>a &gt; 0</code> and scale parameter <code>b &gt; 0</code>.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="./reference-manual/distribution_plots/gamma.svg" alt="gamma">
</div>
</div>
<div class="hdlist">
<table>
<tr>
<td class="hdlist1">
Mean
</td>
<td class="hdlist2">
<p><code>a * b</code></p>
</td>
</tr>
<tr>
<td class="hdlist1">
Variance
</td>
<td class="hdlist2">
<p><code>a * b^2</code></p>
</td>
</tr>
</table>
</div>
</li>
<li>
<p><code>dist</code> <code>real</code> <strong>lognormal</strong><code>(real m, v2)</code></p>
<div class="paragraph">
<p>Log-normal distribution.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="./reference-manual/distribution_plots/lognormal.svg" alt="lognormal">
</div>
</div>
<div class="hdlist">
<table>
<tr>
<td class="hdlist1">
Range
</td>
<td class="hdlist2">
<p><code>[0, infinite)</code></p>
</td>
</tr>
<tr>
<td class="hdlist1">
Mean
</td>
<td class="hdlist2">
<p><code>exp(m + v2/2)</code></p>
</td>
</tr>
<tr>
<td class="hdlist1">
Variance
</td>
<td class="hdlist2">
<p><code>exp(2*m + v2) * (exp(v2) - 1)</code></p>
</td>
</tr>
<tr>
<td class="hdlist1">
See also
</td>
<td class="hdlist2">
<p>N(m, v2), <a href="#law-ref">[law-ref]</a>, page 290</p>
</td>
</tr>
</table>
</div>
</li>
<li>
<p><code>dist</code> <code>real</code> <strong>normal</strong><code>(real m, v2)</code></p>
<div class="paragraph">
<p>Normal distribution.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="./reference-manual/distribution_plots/normal.svg" alt="normal">
</div>
</div>
<div class="hdlist">
<table>
<tr>
<td class="hdlist1">
Range
</td>
<td class="hdlist2">
<p><code>(-infinite, infinite)</code></p>
</td>
</tr>
<tr>
<td class="hdlist1">
Mean
</td>
<td class="hdlist2">
<p><code>m</code></p>
</td>
</tr>
<tr>
<td class="hdlist1">
Variance
</td>
<td class="hdlist2">
<p><code>v2</code></p>
</td>
</tr>
<tr>
<td class="hdlist1">
See also
</td>
<td class="hdlist2">
<p>N(m, v2), <a href="#law-ref">[law-ref]</a>, page 288</p>
</td>
</tr>
</table>
</div>
</li>
<li>
<p><code>dist</code> <code>real</code> <strong>random</strong><code>()</code></p>
<div class="paragraph">
<p>Random number generator.</p>
</div>
<div class="hdlist">
<table>
<tr>
<td class="hdlist1">
Range
</td>
<td class="hdlist2">
<p><code>[0, 1)</code></p>
</td>
</tr>
<tr>
<td class="hdlist1">
Mean
</td>
<td class="hdlist2">
<p><code>0.5</code></p>
</td>
</tr>
<tr>
<td class="hdlist1">
Variance
</td>
<td class="hdlist2">
<p><code>1 / 12</code></p>
</td>
</tr>
</table>
</div>
</li>
<li>
<p><code>dist</code> <code>real</code> <strong>triangle</strong><code>(real a, b, c)</code></p>
<div class="paragraph">
<p>Triangle distribution, with <code>a &lt; b &lt; c</code>.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="./reference-manual/distribution_plots/triangle.svg" alt="triangle">
</div>
</div>
<div class="hdlist">
<table>
<tr>
<td class="hdlist1">
Range
</td>
<td class="hdlist2">
<p><code>[a, c]</code></p>
</td>
</tr>
<tr>
<td class="hdlist1">
Mean
</td>
<td class="hdlist2">
<p><code>(a + b + c) /3</code></p>
</td>
</tr>
<tr>
<td class="hdlist1">
Variance
</td>
<td class="hdlist2">
<p><code>(a^2 + c^2 + b^2 - a*b - a*c - b*c) / 18</code></p>
</td>
</tr>
<tr>
<td class="hdlist1">
See also
</td>
<td class="hdlist2">
<p>Triangle(a, c, b), <a href="#law-ref">[law-ref]</a>, page 300</p>
</td>
</tr>
</table>
</div>
</li>
<li>
<p><code>dist</code> <code>real</code> <strong>uniform</strong><code>(real a, b)</code></p>
<div class="paragraph">
<p>Real uniform distribution from <code>a</code> to <code>b</code>, excluding upper bound.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="./reference-manual/distribution_plots/cont_uni.svg" alt="cont uni">
</div>
</div>
<div class="hdlist">
<table>
<tr>
<td class="hdlist1">
Range
</td>
<td class="hdlist2">
<p><code>[a, b)</code></p>
</td>
</tr>
<tr>
<td class="hdlist1">
Mean
</td>
<td class="hdlist2">
<p><code>(a + b) / 2</code></p>
</td>
</tr>
<tr>
<td class="hdlist1">
Variance
</td>
<td class="hdlist2">
<p><code>(b - a)^2 / 12</code></p>
</td>
</tr>
<tr>
<td class="hdlist1">
See also
</td>
<td class="hdlist2">
<p>U(a,b), <a href="#law-ref">[law-ref]</a>, page 282, except that distribution has an inclusive upper bound.</p>
</td>
</tr>
</table>
</div>
</li>
<li>
<p><code>dist</code> <code>real</code> <strong>weibull</strong><code>(real a, b)</code></p>
<div class="paragraph">
<p>Weibull distribution with shape parameter <code>a</code> and scale parameter <code>b</code>, with <code>a &gt; 0</code> and <code>b &gt; 0</code>.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="./reference-manual/distribution_plots/weibull.svg" alt="weibull">
</div>
</div>
<div class="hdlist">
<table>
<tr>
<td class="hdlist1">
Range
</td>
<td class="hdlist2">
<p><code>[0, infinite)</code></p>
</td>
</tr>
<tr>
<td class="hdlist1">
Mean
</td>
<td class="hdlist2">
<p><code>(b / a) * G(1 / a)</code></p>
</td>
</tr>
<tr>
<td class="hdlist1">
Variance
</td>
<td class="hdlist2">
<p><code>(b^2 / a) * (2 * G(2 / a) - (1 / a) * G(1 / a)^2)</code> with <code>G(x)</code> the Gamma function,
<code>G(x)</code> <code>=</code> integral over <code>t</code> from <code>0</code> to <code>infinity</code>, for <code>t^(x - 1) * exp(-t)</code></p>
</td>
</tr>
<tr>
<td class="hdlist1">
See also
</td>
<td class="hdlist2">
<p>Weibull(a, b), <a href="#law-ref">[law-ref]</a>, page 284</p>
</td>
</tr>
</table>
</div>
</li>
</ul>
</div>
</div>
<div class="sect3">
<h4 id="ref-references">References</h4>
<div class="ulist bibliography">
<ul class="bibliography">
<li>
<p><a id="banks-ref"></a>[banks-ref] Handbook of Simulation, Principles, Methodology, Advances, Applications, and Practice, editor Jerry Banks, publisher John Wiley &amp; Sons, inc, 1998</p>
</li>
<li>
<p><a id="law-ref"></a>[law-ref] Simulation Modeling &amp; Analysis, fourth edition, by Averill M. Law, publisher McGraw-Hill, International Edition, 2007, ISBN 978-007-125519-6</p>
</li>
</ul>
</div>
</div>
</div>
<div class="sect2">
<h3 id="ref-chapter-types">Types</h3>
<div class="paragraph">
<p>
A type defines the set of possible values of an expression or a variable.
Its syntax is defined as follows.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="./reference-manual/rail_diagrams/type.png" alt="type">
</div>
</div>
<div class="ulist">
<ul>
<li>
<p>The <code>ElementaryType</code> block contains types that do not build on other types.
They are explained further in <a href="#ref-elementary-type">Elementary types</a>.</p>
</li>
<li>
<p>The <code>ContainerType</code> block contains types that can store values of a single other type, the 'list', 'set', and 'dictionary' type.
These types are further explained in <a href="#ref-container-type">Container types</a>.</p>
</li>
<li>
<p>The <code>TupleType</code> block describes 'tuples', a type that can hold values of several other types.</p>
</li>
<li>
<p>The <code>ChannelType</code> blocks describes communication channels that connect processes with each other, see <a href="#ref-channel-type">Channel type</a> for more explanation.</p>
</li>
<li>
<p>The <code>DistributionType</code> block contains the stochastic distribution type, explained in <a href="#ref-distribution-type">Distribution type</a>.</p>
</li>
<li>
<p>The <code>FunctionType</code> can hold a function definition.
It allows you to pass a function to a process or another function.
It is further explained in <a href="#ref-function-type">Function type</a>.</p>
</li>
<li>
<p>The <code>ProcessType</code> can hold a process definition.
It allows you to pass a process definition to a another process.
It is further explained in <a href="#ref-process-type">Process type</a>.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>The <code>TypeName</code> is the name of a type defined with a <code>type</code> definition (explained in <a href="#ref-type-definitions">Type definitions</a>).
For example:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">type lot = real;
model M():
lot x;
...
end</code></pre>
</div>
</div>
<div class="paragraph">
<p>The <code>lot x</code> variable declaration (explained in <a href="#ref-variable-declarations">Local variables</a>) uses the type definition of <code>lot</code> at the first line to define the type of variable <code>x</code>.</p>
</div>
<div class="paragraph">
<p>The <code>EnumTypeName</code> is similar, except it uses an enumeration definition (see <a href="#ref-enum-definitions">Enumeration definitions</a>) as type.
For example:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">enum FlagColours = {red, white, blue};
model M():
FlagColours x = white;
...
end</code></pre>
</div>
</div>
<div class="paragraph">
<p>The <code>FlagColours x</code> variable declaration defines that variable <code>x</code> has the type of the enumeration, and can hold its values.</p>
</div>
<div class="paragraph">
<p>
</p>
</div>
<div class="sect3">
<h4 id="ref-elementary-type">Elementary types</h4>
<div class="paragraph">
<p>The elementary types do not depend on other types to define their set of allowed values.
They have the following syntax:</p>
</div>
<div class="imageblock">
<div class="content">
<img src="./reference-manual/rail_diagrams/elementary_type.png" alt="elementary type">
</div>
</div>
<div class="paragraph">
<p>As you can see, they are mostly just a single keyword.
The <code>ConstantExpression</code> nodes in the <code>matrix</code> type line are integer expressions with a fixed (and known) value before execution of the program.
More information about the elementary types is provided below.</p>
</div>
<div class="paragraph">
<p>
</p>
</div>
<div class="sect4">
<h5 id="ref-boolean-type">Boolean type</h5>
<div class="paragraph">
<p>The <code>bool</code> keyword denotes the boolean data type.
The allowed values are <code>false</code> and <code>true</code>.
While it is allowed to store boolean values in other data types, their most frequent use is in expressions of statements that decide what to do, for example, the condition in the <code>while</code>, <code>if</code> or select statement (see <a href="#ref-while-loop-statement">While loop statement</a>, <a href="#ref-choice-statement">Choice statement</a> and <a href="#ref-select-statement">Select statement</a>).
Expressions with booleans are explained in <a href="#ref-boolean-expression">Boolean expressions</a>.</p>
</div>
<div class="paragraph">
<p>
</p>
</div>
</div>
<div class="sect4">
<h5 id="ref-integer-type">Integer type</h5>
<div class="paragraph">
<p>The <code>int</code> keyword denotes the integer data type, integer numbers from <code>2147483647</code> to <code>-2147483648</code> (a standard signed 32 bit number).
Values outside that range give undefined behavior.
Expressions with integers are explained in <a href="#ref-integer-expression">Integer expressions</a>.</p>
</div>
<div class="paragraph">
<p>
</p>
</div>
</div>
<div class="sect4">
<h5 id="ref-real-type">Real type</h5>
<div class="paragraph">
<p>The <code>real</code> keyword denotes the real number data type, real numbers between <code>4.94065645841246544e-324</code> to <code>1.79769313486231570e+308</code> positive or negative (a standard 8 bytes IEEE 754 number).
As normal with floating point numbers in computer systems, many values are missing from the above range.
Expect rounding errors with each calculation.
Expressions with real numbers are explained in <a href="#ref-real-expression">Real number expressions</a>.</p>
</div>
<div class="paragraph">
<p>
</p>
</div>
</div>
<div class="sect4">
<h5 id="ref-string-type">String type</h5>
<div class="paragraph">
<p>The <code>string</code> keyword denotes strings, sequences of characters.
It contains all printable ASCII characters U+0020 to U+007E, and 'tab' (U+0009) and 'new line' (U+000A).
Expressions with strings are explained in <a href="#ref-string-expression">String expressions</a>.</p>
</div>
<div class="paragraph">
<p>
</p>
</div>
</div>
<div class="sect4">
<h5 id="ref-file-type">File type</h5>
<div class="paragraph">
<p>The <code>file</code> keyword denotes a file at the file system of the computer.
It allows reading and writing values of many data types (not all data types can be read or written).
Expressions with files are explained in <a href="#ref-file-expression">File handle expressions</a>.
How to work with files is explained in <a href="#tut-chapter-input-and-output">Input and output</a>.</p>
</div>
<div class="paragraph">
<p>
</p>
</div>
</div>
<div class="sect4">
<h5 id="ref-inst-type">Instance type</h5>
<div class="paragraph">
<p>The <code>inst</code> keyword denotes an instance type, it can store a running process.
Its use is to check whether the stored process has ended.
The <a href="#ref-finish-statement">Finish statement</a> gives more details and provides an example.</p>
</div>
<div class="paragraph">
<p>
</p>
</div>
</div>
<div class="sect4">
<h5 id="ref-timer-type">Timer type</h5>
<div class="paragraph">
<p>The <code>timer</code> keyword denotes a count-down timer.
Variables of this type measure time that has passed since their initialization.
Expressions with timers are given in <a href="#ref-timer-expression">Timer expressions</a>, a tutorial about using timers can be found in <a href="#tut-using-timers">Timers</a>.</p>
</div>
<div class="paragraph">
<p>
</p>
</div>
</div>
<div class="sect4">
<h5 id="ref-matrix-type">Matrix type</h5>
<div class="paragraph">
<p>The <code>matrix</code> type takes two constant expressions that define the number of rows and the number of columns of the matrix.
The main purpose of the data type is to allow temporary storage of matrices so they can be passed on to other software.
The Chi language also has expressions to write literal matrices, see <a href="#ref-matrix-expression">Matrix expression</a> for details.</p>
</div>
<div class="paragraph">
<p>
</p>
</div>
</div>
<div class="sect4">
<h5 id="ref-void-type">Void type</h5>
<div class="paragraph">
<p>The <code>void</code> type denotes that no data is involved.
Values of type <code>void</code> do not exist.
The type is allowed at two places in the Chi specification, namely:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>As data type of synchronization channels.
Further explanation can be found at <a href="#ref-communication-statements">Communication statements</a> and <a href="#ref-channel-type">Channel type</a>.</p>
</li>
<li>
<p>As exit type of <a href="#ref-model-definitions">Model definitions</a> and <a href="#ref-process-definitions">Process definitions</a>, to express that it may return an exit value from an <a href="#ref-exit-statement">Exit statement</a> without arguments.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>
</p>
</div>
</div>
</div>
<div class="sect3">
<h4 id="ref-container-type">Container types</h4>
<div class="paragraph">
<p>The main function of container types is to organize and hold a collection of values of another type (the <em>element type</em>).
The syntax diagram of the container types is as follows.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="./reference-manual/rail_diagrams/container_type.png" alt="container type">
</div>
</div>
<div class="paragraph">
<p>The language has three container types, <em>lists</em> (explained in <a href="#ref-list-type">List type</a>), <em>sets</em> (explained in <a href="#ref-set-type">Set type</a>), and <em>dictionaries</em> (explained in <a href="#ref-dictionary-type">Dictionary type</a>).</p>
</div>
<div class="paragraph">
<p>
</p>
</div>
<div class="sect4">
<h5 id="ref-list-type">List type</h5>
<div class="paragraph">
<p>The list type has an ordered collection of values from its element type as its value.
Duplicate element values are allowed.</p>
</div>
<div class="paragraph">
<p>The syntax of a list type is given below.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="./reference-manual/rail_diagrams/list_type.png" alt="list type">
</div>
</div>
<div class="paragraph">
<p>It starts with the keyword <code>list</code>, optionally followed by a parenthesized (non-negative) integer expression denoting the initial number of element values in the collection, and finally the type of the element values.</p>
</div>
<div class="paragraph">
<p>The default size of the collection is the value of the integer expression, or 0 if there is no such expression.
The value of the elements in the initial list value depends on the type of the elements.</p>
</div>
<div class="paragraph">
<p>A few examples:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">list bool # A list of boolean values, initial value is &lt;bool&gt;[]
list (2) int # A list of integer values, initial value is [0, 0]</code></pre>
</div>
</div>
<div class="paragraph">
<p>For a discussion of operations on values of this type, see <a href="#ref-list-expression">List expressions</a>.</p>
</div>
<div class="paragraph">
<p>
</p>
</div>
</div>
<div class="sect4">
<h5 id="ref-set-type">Set type</h5>
<div class="paragraph">
<p>The set type has an unordered collection of values from its element type as its value.
Duplicate element values are silently discarded.</p>
</div>
<div class="paragraph">
<p>The syntax of the set type is given below.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="./reference-manual/rail_diagrams/set_type.png" alt="set type">
</div>
</div>
<div class="paragraph">
<p>The set type starts with a <code>set</code> keyword, followed by the type of its elements.
Its initial value is the empty set.
An example:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">set real # A set of real numbers, initial value &lt;real&gt;{}.</code></pre>
</div>
</div>
<div class="paragraph">
<p>For a discussion of operations on values of this type, see <a href="#ref-set-expression">Set expressions</a>.</p>
</div>
<div class="paragraph">
<p>
</p>
</div>
</div>
<div class="sect4">
<h5 id="ref-dictionary-type">Dictionary type</h5>
<div class="paragraph">
<p>The dictionary type has an unordered collection of values of its key type, so called keys.
The keys are unique in the collection.
In addition, the dictionary has a value of its value type associated with each key.</p>
</div>
<div class="paragraph">
<p>The syntax of a dictionary type is given below.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="./reference-manual/rail_diagrams/dictionary_type.png" alt="dictionary type">
</div>
</div>
<div class="paragraph">
<p>The syntax starts with a <code>dict</code> keyword, and the key type and value type between parentheses, separated by a colon.
The initial value of a dictionary type is the empty dictionary.
An example:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">dict (bool : int) # A dictionary with boolean keys, and integer values.
# Initial value &lt;bool:int&gt;{}.</code></pre>
</div>
</div>
<div class="paragraph">
<p>For a discussion of operations on values of this type, see <a href="#ref-dictionary-expression">Dictionary expressions</a>.</p>
</div>
<div class="paragraph">
<p>
</p>
</div>
</div>
</div>
<div class="sect3">
<h4 id="ref-tuple-type">Tuple type</h4>
<div class="paragraph">
<p>A tuple contains a fixed number of values of (possibly) different types.
It has the following syntax:</p>
</div>
<div class="imageblock">
<div class="content">
<img src="./reference-manual/rail_diagrams/tuple_type.png" alt="tuple type">
</div>
</div>
<div class="paragraph">
<p>A tuple type starts with the keyword <code>tuple</code>, followed by the list of its fields between parentheses.
Each field has a name and a type.
Sequences of fields with the same type can share their type description, which reduces the amount of text of the tuple type.
Tuple types must have at least two fields.</p>
</div>
<div class="paragraph">
<p>Examples:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-chi" data-lang="chi">tuple(int a, b) # A tuple containing fields 'a' and 'b', both of type int
tuple(int a; int b) # A tuple containing fields 'a' and 'b', both of type int
tuple(lot x; real start) # A tuple with a 'lot' and a 'real' type.</code></pre>
</div>
</div>
<div class="paragraph">
<p>The first two examples are equivalent, the first form is just a bit shorter in notation.
The third example is more common fields of different types that are kept together in the modeled system.
Expressions with tuples are discussed in <a href="#ref-tuple-expression">Tuple expression</a>.</p>
</div>
<div class="paragraph">
<p>
</p>
</div>
</div>
<div class="sect3">
<h4 id="ref-channel-type">Channel type</h4>
<div class="paragraph">
<p>The channel type defines the direction and the type of values transported.
The syntax of the channel type is as follows.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="./reference-manual/rail_diagrams/channel_type.png" alt="channel type">
</div>
</div>
<div class="paragraph">
<p>The <code>chan</code> keyword denotes a channel type is being created.
It may be followed by allowed directions of transport, a <code>!</code> means that sending values is allowed but not for receiving, and a <code>?</code> means that receiving values is allowed and sending is not allowed.
Finally <code>!?</code> means both sending and receiving is allowed.
The latter is also selected when no direction is specified.
The language silently discards allowed directions.
A channel usable for both sending and receiving may be used as a channel for sending only (dropping the ability to receive at that point).
It does not allow adding directions, a receive-only channel cannot be used for sending.
It can also not be used as a channel for sending and receiving, even if then latter is only used for receiving values (that is, sending is never done).</p>
</div>
<div class="paragraph">
<p>The type of data that is transported with a communication is given by the <code>Type</code> block.
Signalling channels (that only synchronize without transporting data) are indicated by the <code>void</code> keyword.
The only expressions available for channels are the equality tests, and a function to create new channels, see <a href="#ref-channel-expression">Channel expressions</a> for details.</p>
</div>
<div class="paragraph">
<p>
</p>
</div>
</div>
<div class="sect3">
<h4 id="ref-distribution-type">Distribution type</h4>
<div class="paragraph">
<p>The distribution type represents a stochastic distribution.
It has the following syntax:</p>
</div>
<div class="imageblock">
<div class="content">
<img src="./reference-manual/rail_diagrams/distribution_type.png" alt="distribution type">
</div>
</div>
<div class="paragraph">
<p>A stochastic distribution allows modeling of random behavior, but with a known chance distribution.
The <code>Type</code> block in the <code>DistributionType</code> diagram defines the type of values drawn.
For a discussion of expressions for the distribution type, see <a href="#ref-distribution-expression">Distribution expressions</a>.</p>
</div>
<div class="paragraph">
<p>
</p>
</div>
</div>
<div class="sect3">
<h4 id="ref-function-type">Function type</h4>
<div class="paragraph">
<p>The function type can hold a function.
Its syntax is as follows.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="./reference-manual/rail_diagrams/function_type.png" alt="function type">
</div>
</div>
<div class="paragraph">
<p>A function type starts with the keyword <code>func</code> followed by the return type of the function and the type of the formal parameters.
The purpose of the function type is to pass functions to processes or other functions, for example, the predicate function in <code>sort</code> and <code>insert</code>, see <a href="#ref-list-stdlib">List functions</a>.</p>
</div>
<div class="paragraph">
<p>
</p>
</div>
</div>
<div class="sect3">
<h4 id="ref-process-type">Process type</h4>
<div class="paragraph">
<p>The process type is similar to the function type (discussed in <a href="#ref-function-type">Function type</a>), except this type can hold a process definition.
It has the following syntax:</p>
</div>
<div class="imageblock">
<div class="content">
<img src="./reference-manual/rail_diagrams/process_type.png" alt="process type">
</div>
</div>
<div class="paragraph">
<p>The type starts with the keyword <code>proc</code> followed by the formal parameters of the process definition to store between parentheses.
Expressions with process types are explained in <a href="#ref-process-expression">Process expressions</a>.</p>
</div>
</div>
</div>
<div class="sect2">
<h3 id="ref-chapter-lexical-syntax">Lexical syntax</h3>
<div class="paragraph">
<p>At the lowest level, a Chi specification file consists of a sequence of characters.
The characters are grouped together to form keywords, names, literal values such as numbers, and symbols such as expression operators like <code>+</code> and statement separator <code>;</code>.
Also comments are recognized at this level.</p>
</div>
<div class="sect3">
<h4 id="ref-whitespace">Whitespace</h4>
<div class="paragraph">
<p>The characters that delimit groups and lines from each other is known as <em>whitespace</em>.
It contains the 'tab' character (U0009), the 'line feed' character (U000A), the 'carriage return' character (U000D), and the 'space' character (U0020).</p>
</div>
</div>
<div class="sect3">
<h4 id="ref-comment">Comment</h4>
<div class="paragraph">
<p>A comment is a line of text intended for annotating the program text.
It can also be used to (temporarily) add or remove statements.
In the latter case, do note that the meaning of the program may change.</p>
</div>
<div class="paragraph">
<p>A line of comment starts with a 'hash' character <code>#</code>, and continues until a 'line feed' character (or the end of the file).
All characters in the comment are ignored by the simulator.</p>
</div>
</div>
<div class="sect3">
<h4 id="ref-lexical-names">Names</h4>
<div class="paragraph">
<p>A name is a word-like group of characters.
It may start with a <code>$</code> prefix.
After the prefix (if one is provided), first a letter (<code>A</code> to <code>Z</code> or <code>a</code> to <code>z</code>) or an 'underscore' character <code>_</code> should be used, optionally followed by more letters, 'underscore' characters, or digits <code>0</code> to <code>9</code>.</p>
</div>
<div class="paragraph">
<p>Some names are special in the sense that the Chi language reserves them for its own use, for example the names <code>model</code> and <code>end</code>.
Keywords are always written using lowercase letters.
In the grammar diagrams, the keywords are shown in a rounded box.
Names starting with a <code>$</code> prefix are never used as keyword.</p>
</div>
<div class="paragraph">
<p>Names not used as keyword can be used to give entities in the Chi program a unique identification.
In the grammar of this reference manual names are split according to the kind of entity that they refer to:</p>
</div>
<div class="dlist">
<dl>
<dt class="hdlist1">ConstantName</dt>
<dd>
<p>Name that refers to a constant value, see <a href="#ref-constant-definitions">Constant definitions</a> for details.</p>
</dd>
<dt class="hdlist1">EnumtypeName</dt>
<dd>
<p>Name that refers to an enum type, see <a href="#ref-enum-definitions">Enumeration definitions</a> for details.</p>
</dd>
<dt class="hdlist1">EnumvalueName</dt>
<dd>
<p>Name that refers to a value within an enum type, see <a href="#ref-enum-value-expression">Enumeration value</a> for details.</p>
</dd>
<dt class="hdlist1">FieldName</dt>
<dd>
<p>Name that refers to a field in a tuple type, see <a href="#ref-tuple-type">Tuple type</a> for more details about tuples.</p>
</dd>
<dt class="hdlist1">FunctionName</dt>
<dd>
<p>Name that refers to a function definition, see <a href="#ref-function-definitions">Function definitions</a> for details.</p>
</dd>
<dt class="hdlist1">ModelName</dt>
<dd>
<p>Name that refers to a model definition, see <a href="#ref-model-definitions">Model definitions</a> for details.</p>
</dd>
<dt class="hdlist1">ProcessName</dt>
<dd>
<p>Name that refers to a process definition, see <a href="#ref-process-definitions">Process definitions</a> for details.</p>
</dd>
<dt class="hdlist1">TypeName</dt>
<dd>
<p>Name that refers to a type, see <a href="#ref-type-definitions">Type definitions</a> for details.</p>
</dd>
<dt class="hdlist1">VariableName</dt>
<dd>
<p>Name that refers to a variable (see <a href="#ref-variable-declarations">Local variables</a>) or formal parameter in a process or function (see <a href="#ref-formal-parameters">Formal parameters</a>).</p>
</dd>
</dl>
</div>
<div class="paragraph">
<p>Names are also shown in a rounded box, but as shown above, start with an uppercase letter and end with <code>Name</code>.</p>
</div>
</div>
</div>
<div class="sect2">
<h3 id="ref-chapter-migration">Model migration</h3>
<div class="paragraph">
<p>There are currently no migrations to upgrade from older versions of Chi.</p>
</div>
</div>
<div class="sect2">
<h3 id="ref-chapter-svg-visualization">SVG visualization</h3>
<div class="paragraph">
<p>The Chi simulator has the possibility to display an SVG file during the simulation.
The model can modify the displayed image depending on the state of the simulated system, thus visualizing the system.</p>
</div>
<div class="paragraph">
<p>Such a visualization is useful for getting a quick global verification, as well as explaining the purpose of the model to people that do not know the detailed ins and outs of the problem being solved.</p>
</div>
<div class="paragraph">
<p>Below are the technical details of the SVG visualization.
The tutorial has a <a href="#tut-chapter-svg-visualization">more gentle introduction</a> into the subject.</p>
</div>
<div class="sect3">
<h4 id="ref-svg-interface">SVG interface</h4>
<div class="paragraph">
<p>The SVG visualization itself is controlled by the simulator.
Normally, it is updated just before a time step is performed.
The simulation can however force an update with the <code>redraw</code> command (see below for details).</p>
</div>
<div class="paragraph">
<p>The simulation accesses the SVG visualization by opening a file for writing with a name like <code>SVG:xyz.svg</code>.
The <code>SVG:</code> prefix redirects the request to the SVG visualizer, the <code>xyz.svg</code> suffix is the name of the SVG file to display.
The file should be available at the file system.</p>
</div>
<div class="paragraph">
<p>Different Chi processes may open the same file at the same time.
The SVG visualizer can only display one SVG file at a time, it is not allowed for processes to open different <code>.svg</code> files.</p>
</div>
</div>
<div class="sect3">
<h4 id="ref-visualization-modification-commands">Visualization modification commands</h4>
<div class="paragraph">
<p>After opening the file, the content of the SVG file can be changed by modifying the nodes.
This is done by writing lines with commands (one command at each line).
Available commands are:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>Copy an element (recursively)</strong></p>
<div class="paragraph">
<p><code>copy [orig-id], [opt-prefix], [op-suffix]</code>, with <code>[orig-id]</code> the id-name of the element to copy, <code>[opt-prefix]</code> an optional prefix that is added to the <code>id</code> of all copied elements, and <code>[opt-suffix]</code> an optional suffix that is added to the <code>id</code> of all copied elements.
Since the <code>id</code> of all elements must be unique, leaving both the prefix and the suffix empty gives an error about duplicate <code>id</code> labels.</p>
</div>
<div class="paragraph">
<p>Note that the element (and its descendants) is only copied, but not moved.
In other words, after copying it is fully obscured by the original element.
The next step is normally an absolute move command or an attribute command to perform a relative translate transformation.</p>
</div>
</li>
<li>
<p><strong>Move an element to an absolute position</strong></p>
<div class="paragraph">
<p><code>absmove [id] ([xpos], [ypos])</code> with <code>[id]</code> the id-name of the element to move, <code>[xpos]</code> the horizontal position to move to, and <code>[ypos]</code> the vertical position to move to.
This operation adds a translation to the <code>transform</code> attribute of the node such that the top-left corner of the bounding rectangle is moved to the provided position.
It also takes the existing transformation into account, and in doing so, will fail if the transformation cannot be reversed.</p>
</div>
<div class="paragraph">
<p>The origin of the coordinate system is at the top-left of the SVG visualization window, with positive X running to the right, and positive Y running down.</p>
</div>
<div class="paragraph">
<p>Avoid using this operation repeatedly on the same element.
Instead move it once to a base position, and perform relative translate transformations on a child element to move it to the desired position.</p>
</div>
</li>
<li>
<p><strong>Change an attribute of an element</strong></p>
<div class="paragraph">
<p><code>attr [id].[atrribute] = [value]</code> with <code>[id]</code> the id-name of the element, <code>[attribute]</code> the name of the attribute of the element to change, and <code>[value]</code> the new value of the attribute.</p>
</div>
<div class="paragraph">
<p>A change overwrites any previous value of the attribute.
Also, names of attributes and syntax of values are not checked.</p>
</div>
</li>
<li>
<p><strong>Change the text of an element</strong></p>
<div class="paragraph">
<p><code>text [id] = [value]</code> with <code>[id]</code> the id-name of the element, and <code>[value]</code> the new text.</p>
</div>
</li>
<li>
<p><strong>Force a redraw of the image</strong></p>
<div class="paragraph">
<p>Normally the program redraws the SVG image when it detects a change in time after making changes in the image by using one of the previous commands.
With this command you can fake a change in time, thus allowing you to also display intermediate states.</p>
</div>
<div class="paragraph">
<p>The command is mostly useful in experiments, where time never changes.</p>
</div>
</li>
</ul>
</div>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="tool-chapter-tool-manual">Chi Tool Manual</h2>
<div class="sectionbody">
<div class="paragraph">
<p>This manual explains how to use the Chi simulation software.
Before using the software however, you need to install it.
The software is part of the Eclipse ESCET software.</p>
</div>
<div class="paragraph">
<p>Once you&#8217;re finished installing, you can start to <a href="#tool-chapter-software-operation">simulate</a> Chi programs.
The easiest way to start simulation is to press the <em>F9</em> key in a Chi text editor, or when a Chi (a file with a <code>.chi</code> extension) is selected in the <em>Project Explorer</em> or <em>Package Explorer</em> tab.</p>
</div>
<div class="paragraph">
<p><em>Topics</em></p>
</div>
<div class="ulist">
<ul>
<li>
<p><a href="#tool-chapter-software-operation">Available operations on a <code>chi</code> file</a></p>
</li>
<li>
<p><a href="#tool-chapter-command-line">Command line options</a></p>
</li>
</ul>
</div>
<div class="sect2">
<h3 id="tool-chapter-software-operation">Software operation</h3>
<div class="paragraph">
<p>The Chi simulator software performs two steps internally:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Type checking of the Chi source file, and building a simulator for it.</p>
</li>
<li>
<p>Running the created simulator.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>Starting with a <code>.chi</code> source file, both steps have to be performed for a simulation.
As this is the common situation, the software normally combines both steps.
If you run many experiments with the same file, it becomes useful to skip the first step.
How to do this is explained in <a href="#tool-compile-or-simulate">Compile only</a>.
In addition, the software can be run from the command line.
In that case, command-line options as explained in <a href="#tool-chapter-command-line">Command line options</a> need to be specified.</p>
</div>
<div class="sect3">
<h4 id="tool-compile-and-simulate">Compile and simulate</h4>
<div class="paragraph">
<p>Normally, you want to simulate a <code>.chi</code> source file.
The Chi simulator software uses two steps internally (first checking the input and building the simulator, then running the just created simulator), but these steps are combined in the dialog.</p>
</div>
<div class="paragraph">
<p>The process starts by selecting the source file you want to use (a file with a <code>.chi</code> extension) in the <em>Project Explorer</em> or <em>Package Explorer</em> tab, and opening the popup menu with the right mouse button from that selection.
Alternatively, open the file in the editor, and use the right mouse button to get a similar popup menu.</p>
</div>
<div class="paragraph">
<p>From the popup menu, select <em>Simulate Chi file</em> entry.
The selection causes the <em>Console</em> view to be opened in Eclipse, and a dialog window pops up to set the simulator options like below.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="./tool-manual/chi_simulator_dialog.png" alt="chi simulator dialog">
</div>
</div>
<div class="paragraph">
<p>The dialog shows the source file being used in the <em>Input file path</em> box.
Below it, in the <em>Instance</em> box, you can enter how to run the model or the experiment of the source file.
The syntax of the input is the same as you would write it in your Chi file.
For example, with a model definition <code>model M(list real xs, int n): ... end</code>, you could write <code>M([1.5, 2.81], 15)</code> as model instantiation.
If you leave the entry empty, the simulator tries to find an experiment without any parameters (for example <code>X()</code>).
If that fails, it tries to find a model without any parameters (typically <code>M()</code>).
If both attempts fail, or the simulator finds more than one such experiment or model, an error is reported.</p>
</div>
<div class="paragraph">
<p>If you want to set an initial seed (see <a href="#tut-simulating-stochastic-behavior">Simulating stochastic behavior</a> for a discussion), you can use the <em>Initial seed value</em> box.
Value <code>0</code> means 'create a new one'.</p>
</div>
<div class="paragraph">
<p>This is all you have to do, select <em>OK</em> at the bottom.
The software performs its two steps, and if no errors are found, it runs the model.</p>
</div>
<div class="sect4">
<h5 id="tool-quick-simulate">Quick simulate</h5>
<div class="paragraph">
<p>For files that do not need any further configuration before they are run, there is a <em>Quick simulate Chi file</em>.
This menu option assumes the default configuration (a parameter-less experiment or model needs to be run with a new seed), skips the dialog (saving you from having to press <em>OK</em>) and immediately proceeds with processing the Chi file.</p>
</div>
<div class="paragraph">
<p>This functionality is also available from the Chi text editor, by pressing the <em>F9</em> key.
Alternatively, you can select a Chi file in the <em>Project Explorer</em> or <em>Package Explorer</em>, and press the <em>F9</em> key.</p>
</div>
</div>
</div>
<div class="sect3">
<h4 id="tool-compile-or-simulate">Compile only</h4>
<div class="paragraph">
<p>The above is convenient for simple experiments, but checking the input and building a simulator each time is tedious if you want to do several experiments with the same source file.
For this reason, each step can be done separately as well.</p>
</div>
<div class="paragraph">
<p>Only building a simulator starts in the same way as above, select a <code>.chi</code> source file from the <em>Project Explorer</em>, the <em>Package Explorer</em> or an editor window, and right-click at it.
Select the <em>Simulate Chi file</em> option from the popup menu.
As the file only gets compiled, the simulator options are of no interest.
Instead switch to the <em>Compiler</em> tab.
It looks like this:</p>
</div>
<div class="imageblock">
<div class="content">
<img src="./tool-manual/chi_compiler_dialog.png" alt="chi compiler dialog">
</div>
</div>
<div class="paragraph">
<p>Most settings are only useful for developers, but at the bottom, check the <em>Write the compiled Java code to a .cchi file</em> box, and click <em>OK</em> at the bottom.
Setting this option causes the simulator software to check the input file, build a simulator, write the constructed simulator to a <code>.cchi</code> file (a compiled Chi file), and quit.
No simulation of the Chi model is performed at this time.</p>
</div>
</div>
<div class="sect3">
<h4 id="tool-simulate-a-compiled-model">Simulate a compiled model</h4>
<div class="paragraph">
<p>You can simulate the Chi model from the <code>.cchi</code> file now, by selecting that file as source file by right-clicking on it.
Select the <em>Simulate Chi file</em> or the <em>Quick simulate Chi file</em> option as before, and proceed with setting the simulator options and running the model as-if you selected a normal <code>.chi</code> file, as explained in <a href="#tool-compile-and-simulate">Compile and simulate</a> above.</p>
</div>
</div>
<div class="sect3">
<h4 id="tool-terminating-a-simulation">Terminating a simulation</h4>
<div class="paragraph">
<p>A simulation ends when:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>The model goes into a deadlock state,</p>
</li>
<li>
<p>An <code>exit</code> statement is performed (see <a href="#tut-exit">experiments</a> in the tutorial),</p>
</li>
<li>
<p>The simulation is terminated by the user, via the console <em>Terminate</em> button (explained below), or</p>
</li>
<li>
<p>A runtime error occurs.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>The simulation can be stopped at any time by using the <em>Terminate</em> button (image::./tool-manual/terminate_button.png[]), located at the upper right corner of the console.
Note however that if the console does not have the focus, this button may not be visible.
If the button is not visible, click somewhere in the console to make the button appear.
If even then the button is still not available, it may still appear if you <em>Maximize</em> the console.
Also note that the button has no effect while the simulator interactively asks for input from the console.
However, once the console input is provided, and <em>ENTER</em> is pressed, the termination request will be processed.</p>
</div>
</div>
</div>
<div class="sect2">
<h3 id="tool-chapter-command-line">Command line options</h3>
<div class="paragraph">
<p>When you run the Chi software from the command line, the interactive dialog as shown in <a href="#tool-chapter-software-operation">Software operation</a> is not shown (at least not by default), and everything has to be specified at the command line instead.</p>
</div>
<div class="paragraph">
<p>The Chi simulator software takes one input file, which is a filename with <code>.chi</code> extension, or a filename with <code>.cchi</code> extension.</p>
</div>
<div class="paragraph">
<p>Below is a list of the available options of such a command line.
Most of them are for advanced uses only, and not of interest to most users.</p>
</div>
<div class="sect3">
<h4 id="tool-simulator-options">Simulator options</h4>
<div class="ulist">
<ul>
<li>
<p><code>--instance=&lt;instance&gt;</code>, <code>-i &lt;instance&gt;</code></p>
<div class="paragraph">
<p>Instantiate the model of the file as given by instance.
Default is instantiation of a model without parameters.</p>
</div>
</li>
</ul>
</div>
</div>
<div class="sect3">
<h4 id="tool-general-application-options">General application options</h4>
<div class="ulist">
<ul>
<li>
<p><code>--help, -h</code></p>
<div class="paragraph">
<p>Prints the help text of the application to the console.</p>
</div>
</li>
<li>
<p><code>--option-dialog=&lt;bool&gt;</code></p>
<div class="paragraph">
<p>Whether to show the option dialog after the command line options have been processed.
Default is <code>off</code>.</p>
</div>
</li>
<li>
<p><code>--output-mode=&lt;outmode&gt;</code>, <code>-m &lt;outmode&gt;</code></p>
<div class="paragraph">
<p>The output mode.
Specify <code>error</code> for errors only; <code>warning</code> for errors and warnings only; <code>normal</code> (default) for errors, warnings, and normal output; or <code>debug</code> for errors, warnings, normal, and debug output.</p>
</div>
</li>
<li>
<p><code>--show-license</code></p>
<div class="paragraph">
<p>Prints the license text of the application to the console.</p>
</div>
</li>
<li>
<p><code>--devmode=&lt;bool&gt;</code></p>
<div class="paragraph">
<p>Whether exceptional situations return limited user friendly information (<code>--devmode=off</code>), or extended developer oriented information (<code>--devmode=on</code>).
Default is user friendly information.</p>
</div>
</li>
</ul>
</div>
</div>
<div class="sect3">
<h4 id="tool-compiler-options">Compiler options</h4>
<div class="ulist">
<ul>
<li>
<p><code>--emf=&lt;bool&gt;</code>, <code>-e &lt;bool&gt;</code></p>
<div class="paragraph">
<p>Whether or not to write the generated EMF model after type checking (default is <code>off</code>).</p>
</div>
</li>
<li>
<p><code>--directory=&lt;dir&gt;</code>, <code>-d &lt;dir&gt;</code></p>
<div class="paragraph">
<p>Output directory for generated Java files.
Output is not written when the option is empty or not provided.</p>
</div>
</li>
<li>
<p><code>--java-compile=&lt;bool&gt;</code>, <code>-c &lt;bool&gt;</code></p>
<div class="paragraph">
<p>Whether or not to perform compilation of the generated Java code (default is <code>on</code>).</p>
</div>
</li>
<li>
<p><code>--jar=&lt;bool&gt;</code>, <code>-j &lt;bool&gt;</code></p>
<div class="paragraph">
<p>Whether or not to write the compiled Java simulator classes (default is <code>off</code>).</p>
</div>
</li>
</ul>
</div>
<div class="paragraph">
<p></p>
</div>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="release-notes-chapter-index">Chi release notes</h2>
<div class="sectionbody">
<div class="paragraph">
<p>The release notes for the releases of Chi and the associated tools, as part of the Eclipse ESCET project, are listed below in reverse chronological order.</p>
</div>
<div class="paragraph">
<p>The release notes may refer to issues, the details for which can be found at the Eclipse ESCET <a href="https://gitlab.eclipse.org/eclipse/escet/escet/-/issues">GitLab issues page</a>.</p>
</div>
<div class="paragraph">
<p>See also the Eclipse ESCET <a href="https://www.eclipse.org/escet/escet/#release-notes-chapter-index">toolkit release notes</a> covering those aspects that are common to the various Eclipse ESCET tools.</p>
</div>
<div class="sect2">
<h3 id="version-0-2">Version 0.2</h3>
<div class="paragraph">
<p>Improvements and fixes:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Chi simulator no longer crashes when using the Eclipse Compiler for Java (ecj) as Java compiler (issue #46).</p>
</li>
</ul>
</div>
</div>
<div class="sect2">
<h3 id="version-0-1">Version 0.1</h3>
<div class="paragraph">
<p>The first release of Chi as part of the Eclipse ESCET project.
This release is based on the initial contribution by the Eindhoven University of Technology (TU/e).</p>
</div>
<div class="paragraph">
<p>Most notable changes compared to the last TU/e release:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>The Chi simulator no longer crashes on code generation.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p></p>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="legal-chapter-index">Legal</h2>
<div class="sectionbody">
<div class="paragraph">
<p>The material in this documentation is Copyright (c) 2010, 2021 Contributors to the Eclipse Foundation.</p>
</div>
<div class="paragraph">
<p>Eclipse ESCET and ESCET are trademarks of the Eclipse Foundation.
Eclipse, and the Eclipse Logo are registered trademarks of the Eclipse Foundation.
Other names may be trademarks of their respective owners.</p>
</div>
<div class="paragraph">
<p><strong>License</strong></p>
</div>
<div class="paragraph">
<p>The Eclipse Foundation makes available all content in this document ("Content").
Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the MIT License.
A copy of the MIT License is available at <a href="https://opensource.org/licenses/MIT" class="bare">https://opensource.org/licenses/MIT</a>.
For purposes of the MIT License, "Software" will mean the Content.</p>
</div>
<div class="paragraph">
<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is being redistributed by another party ("Redistributor") and different terms and conditions may apply to your use of any object code in the Content.
Check the Redistributor&#8217;s license that was provided with the Content.
If no such license exists, contact the Redistributor.
Unless otherwise indicated below, the terms and conditions of the MIT License still apply to any source code in the Content and such source code may be obtained at <a href="http://www.eclipse.org" class="bare">http://www.eclipse.org</a>.</p>
</div>
</div>
</div>
</div>
<script type="text/x-mathjax-config">
MathJax.Hub.Config({
messageStyle: "none",
tex2jax: {
inlineMath: [["\\(", "\\)"]],
displayMath: [["\\[", "\\]"]],
ignoreClass: "nostem|nolatexmath"
},
asciimath2jax: {
delimiters: [["\\$", "\\$"]],
ignoreClass: "nostem|noasciimath"
},
TeX: { equationNumbers: { autoNumber: "none" } }
})
MathJax.Hub.Register.StartupHook("AsciiMath Jax Ready", function () {
MathJax.InputJax.AsciiMath.postfilterHooks.Add(function (data, node) {
if ((node = data.script.parentNode) && (node = node.parentNode) && node.classList.contains("stemblock")) {
data.math.root.display = "block"
}
return data
})
})
</script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.9/MathJax.js?config=TeX-MML-AM_HTMLorMML"></script>
<!--
Copyright (c) 2010, 2021 Contributors to the Eclipse Foundation
See the NOTICE file(s) distributed with this work for additional
information regarding copyright ownership.
This program and the accompanying materials are made available under the terms
of the MIT License which is available at https://opensource.org/licenses/MIT
SPDX-License-Identifier: MIT
-->
<div id="footer">
<div id="footer-text">
<a href="https://www.eclipse.org">Eclipse Home</a>
|
<a href="https://www.eclipse.org/legal/privacy.php">Privacy Policy</a>
|
<a href="https://www.eclipse.org/legal/termsofuse.php">Terms of Use</a>
|
<a href="https://www.eclipse.org/legal/copyright.php">Copyright Agent</a>
|
<a href="https://www.eclipse.org/legal">Eclipse Legal</a>
</div>
</div>
</body>
</html>