Page Menu
Home
Xreate
Search
Configure Global Search
Log In
Docs
Questions
Repository
Issues
Patches
Internal API
Files
F2731375
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Subscribers
None
File Metadata
Details
File Info
Storage
Attached
Created
Sat, Mar 14, 4:44 AM
Size
182 KB
Mime Type
text/x-diff
Expires
Mon, Mar 16, 4:44 AM (1 d, 13 h)
Engine
blob
Format
Raw Data
Handle
244001
Attached To
rXR Xreate
View Options
diff --git a/config/default.json b/config/default.json
index e2db4c2..baf997f 100644
--- a/config/default.json
+++ b/config/default.json
@@ -1,74 +1,74 @@
{
"containers": {
"id": {
"implementations": "containers_impl",
"linkedlist": "linkedlist"
},
"impl": {
"solid": "solid",
"onthefly": "on_the_fly"
}
},
"logging": {
"id": "logging"
},
"function-entry": "entry",
"transcend": {
"bindings" : {
"variable": "bind",
"function": "bind_func",
"scope": "bind_scope",
"function_demand" : "bind_function_demand",
"scope_decision": "bind_scope_decision"
},
"context" : {
"decisions":{
"dependent": "resolution_dependency"
}
},
"nonevalue": "nonevalue",
"ret": {
"symbol": "retv",
"tag": "ret"
}
},
"tests": {
"template": "troubleshooting",
"templates": {
- "troubleshooting":"ASTCorrespondence.Doc_*:Virtualization.Doc_*:Exploitation.Doc_*",
- "documentation":"Modules.Doc_*:Interpretation.Doc_*:AST.Doc_*:Loop.Doc_*:LateReasoning.Doc_*:Latex.Doc_*:Polymorphs.Doc_*:Transcend.Doc_*:ASTCorrespondence.Doc_*:Virtualization.Doc_*:Exploitation.Doc_*",
+ "troubleshooting":"Virtualization.Doc_*:Exploitation.Doc_*:Communication.Doc_*",
+ "documentation":"Modules.Doc_*:Interpretation.Doc_*:AST.Doc_*:Loop.Doc_*:LateReasoning.Doc_*:Latex.Doc_*:Polymorphs.Doc_*:Transcend.Doc_*:ASTCorrespondence.Doc_*:Virtualization.Doc_*:Exploitation.Doc_*:Communication.Doc_*",
"default": "*",
"ast": "AST.*",
"effects": "Effects.*",
"basic": "Attachments.*",
"compilation": "Compilation.*",
"communication": "Communication.*",
"cfa": "CFA.*",
"containers": "Containers.*",
"dfa": "DFA.*",
"diagnostic": "Diagnostic.*",
"dsl": "Association.*:Interpretation.*",
"exploitation": "Exploitation.*",
"ExpressionSerializer": "ExpressionSerializer.*",
"externc": "InterfaceExternC.*",
"loops": "Loop.*",
"latereasoning": "LateReasoning.*",
"latex": "Latex.*",
"modules": "Modules.*",
"polymorphs": "Polymorphs.*",
"intrinsic-query": "Types.SlaveTypes*:Association.TypedQuery*",
"types": "Types.*",
"virtualization": "Virtualization.*",
"vendorsAPI/clang": "ClangAPI.*",
"vendorsAPI/xml2": "libxml2.*"
}
}
}
diff --git a/cpp/tests/effects-communication.cpp b/cpp/tests/effects-communication.cpp
index 652b88b..b9193f7 100644
--- a/cpp/tests/effects-communication.cpp
+++ b/cpp/tests/effects-communication.cpp
@@ -1,73 +1,89 @@
/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/
*
* communication.cpp
*
* Author: pgess <v.melnychenko@xreate.org>
* Created on October 14, 2017, 5:24 PM
*/
#include "xreatemanager.h"
+#include "supplemental/docutils.h"
+
#include "gtest/gtest.h"
+
using namespace xreate;
+using namespace std;
TEST(Communication, ast_Basic1){
FILE* script = fopen("scripts/effects-communication/example1-wr.xreate", "r");
std::unique_ptr<XreateManager> program(XreateManager::prepare(script));
ASSERT_TRUE(true);
fclose(script);
}
TEST(Communication, analysis_Basic1){
FILE* script = fopen("scripts/effects-communication/example1-wr.xreate", "r");
std::unique_ptr<details::tier1::XreateManager> program(details::tier1::XreateManager::prepare(script));
fclose(script);
program->analyse();
ASSERT_TRUE(true);
}
TEST(Communication, full_Basic1){
FILE* script = fopen("scripts/effects-communication/example1-wr.xreate", "r");
std::unique_ptr<XreateManager> program(XreateManager::prepare(script));
fclose(script);
int (*programEntry)() = (int (*)())program->run();
int result = programEntry();
ASSERT_EQ(1, result);
}
TEST(Communication, full_Basic2){
FILE* script = fopen("scripts/effects-communication/example2-wr.xreate", "r");
std::unique_ptr<XreateManager> program(XreateManager::prepare(script));
fclose(script);
int (*programEntry)() = (int (*)())program->run();
int result = programEntry();
ASSERT_EQ(1, result);
}
TEST(Communication, analysis_Weak1){
FILE* script = fopen("scripts/effects-communication/example3-wrwr.xreate", "r");
std::unique_ptr<details::tier1::XreateManager> program(details::tier1::XreateManager::prepare(script));
fclose(script);
program->analyse();
ASSERT_TRUE(true);
}
TEST(Communication, full_Weak1){
FILE* script = fopen("scripts/effects-communication/example3-wrwr.xreate", "r");
std::unique_ptr<XreateManager> program(XreateManager::prepare(script));
fclose(script);
int (*programEntry)(int) = (int (*)(int))program->run();
ASSERT_EQ(1, programEntry(1));
ASSERT_EQ(-1, programEntry(0));
+}
+
+TEST(Communication, Doc_DirImpl){
+ string example = getDocumentationExampleById("documentation/communication.xml", "DirImpl_1");
+ XreateManager* xreate = XreateManager::prepare(move(example));
+ xreate->run();
+}
+
+TEST(Communication, Doc_GuardedImpl){
+ string example = getDocumentationExampleById("documentation/communication.xml", "GuardedImpl_1");
+ XreateManager* xreate = XreateManager::prepare(move(example));
+ xreate->run();
}
\ No newline at end of file
diff --git a/documentation-api/communicaton.graphml b/documentation-api/communicaton.graphml
new file mode 100644
index 0000000..a1a0b9d
--- /dev/null
+++ b/documentation-api/communicaton.graphml
@@ -0,0 +1,447 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:java="http://www.yworks.com/xml/yfiles-common/1.0/java" xmlns:sys="http://www.yworks.com/xml/yfiles-common/markup/primitives/2.0" xmlns:x="http://www.yworks.com/xml/yfiles-common/markup/2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:y="http://www.yworks.com/xml/graphml" xmlns:yed="http://www.yworks.com/xml/yed/3" xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://www.yworks.com/xml/schema/graphml/1.1/ygraphml.xsd">
+ <!--Created by yEd 3.18.1-->
+ <key attr.name="Description" attr.type="string" for="graph" id="d0"/>
+ <key for="port" id="d1" yfiles.type="portgraphics"/>
+ <key for="port" id="d2" yfiles.type="portgeometry"/>
+ <key for="port" id="d3" yfiles.type="portuserdata"/>
+ <key attr.name="url" attr.type="string" for="node" id="d4"/>
+ <key attr.name="description" attr.type="string" for="node" id="d5"/>
+ <key for="node" id="d6" yfiles.type="nodegraphics"/>
+ <key for="graphml" id="d7" yfiles.type="resources"/>
+ <key attr.name="url" attr.type="string" for="edge" id="d8"/>
+ <key attr.name="description" attr.type="string" for="edge" id="d9"/>
+ <key for="edge" id="d10" yfiles.type="edgegraphics"/>
+ <graph edgedefault="directed" id="G">
+ <data key="d0" xml:space="preserve"/>
+ <node id="n0" yfiles.foldertype="group">
+ <data key="d6">
+ <y:TableNode configuration="com.yworks.bpmn.Pool">
+ <y:Geometry height="733.3944424765623" width="558.32296875" x="122.07299804687497" y="-329.4881924765625"/>
+ <y:Fill color="#FFF2BC" color2="#D4D4D4CC" transparent="false"/>
+ <y:BorderStyle color="#000000" type="line" width="1.0"/>
+ <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="20.7578125" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="l" rotationAngle="270.0" textColor="#000000" verticalTextPosition="bottom" visible="true" width="108.208984375" x="4.0" xml:space="preserve" y="312.59272905078114">Communication</y:NodeLabel>
+ <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.40625" horizontalTextPosition="center" iconTextGap="4" modelName="custom" rotationAngle="270.0" textColor="#000000" verticalTextPosition="bottom" visible="true" width="40.0234375" x="33.0" xml:space="preserve" y="62.459843750000005">Output<y:LabelModel><y:RowNodeLabelModel offset="3.0"/></y:LabelModel><y:ModelParameter><y:RowNodeLabelModelParameter horizontalPosition="0.0" id="row_0" inside="true"/></y:ModelParameter></y:NodeLabel>
+ <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.40625" horizontalTextPosition="center" iconTextGap="4" modelName="custom" rotationAngle="270.0" textColor="#000000" verticalTextPosition="bottom" visible="true" width="63.361328125" x="33.0" xml:space="preserve" y="353.204306199219">Processing<y:LabelModel><y:RowNodeLabelModel offset="3.0"/></y:LabelModel><y:ModelParameter><y:RowNodeLabelModelParameter horizontalPosition="0.0" id="row_1" inside="true"/></y:ModelParameter></y:NodeLabel>
+ <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.40625" horizontalTextPosition="center" iconTextGap="4" modelName="custom" rotationAngle="270.0" textColor="#000000" verticalTextPosition="bottom" visible="true" width="30.689453125" x="33.0" xml:space="preserve" y="662.2659024375001">Input<y:LabelModel><y:RowNodeLabelModel offset="3.0"/></y:LabelModel><y:ModelParameter><y:RowNodeLabelModelParameter horizontalPosition="0.0" id="row_2" inside="true"/></y:ModelParameter></y:NodeLabel>
+ <y:StyleProperties>
+ <y:Property name="y.view.tabular.TableNodePainter.ALTERNATE_ROW_STYLE">
+ <y:SimpleStyle fillColor="#474A4340" lineColor="#000000" lineType="line" lineWidth="1.0"/>
+ </y:Property>
+ <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+ <y:Property name="y.view.tabular.TableNodePainter.ALTERNATE_COLUMN_SELECTION_STYLE">
+ <y:SimpleStyle fillColor="#474A4380" lineColor="#000000" lineType="line" lineWidth="3.0"/>
+ </y:Property>
+ <y:Property name="y.view.tabular.TableNodePainter.ALTERNATE_ROW_SELECTION_STYLE">
+ <y:SimpleStyle fillColor="#474A4380" lineColor="#000000" lineType="line" lineWidth="3.0"/>
+ </y:Property>
+ <y:Property class="java.awt.Color" name="POOL_LANE_COLOR_ALTERNATING" value="#ffffff"/>
+ <y:Property class="java.awt.Color" name="POOL_LANE_COLOR_MAIN" value="#ffffcc"/>
+ <y:Property class="java.lang.String" name="POOL_LANE_STYLE" value="LANE_STYLE_ROWS"/>
+ <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+ <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+ <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="POOL_TYPE_LANE"/>
+ <y:Property name="y.view.tabular.TableNodePainter.ALTERNATE_COLUMN_STYLE">
+ <y:SimpleStyle fillColor="#474A4340" lineColor="#000000" lineType="line" lineWidth="1.0"/>
+ </y:Property>
+ </y:StyleProperties>
+ <y:State autoResize="true" closed="false" closedHeight="80.0" closedWidth="100.0"/>
+ <y:Insets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/>
+ <y:BorderInsets bottom="24" bottomF="23.990688476562127" left="27" leftF="27.332735252604124" right="111" rightF="111.0" top="45" topF="45.28800000000001"/>
+ <y:Table autoResizeTable="true" defaultColumnWidth="360.0" defaultMinimumColumnWidth="30.0" defaultMinimumRowHeight="30.0" defaultRowHeight="107.0">
+ <y:DefaultColumnInsets bottom="3.0" left="3.0" right="3.0" top="20.0"/>
+ <y:DefaultRowInsets bottom="3.0" left="20.0" right="3.0" top="3.0"/>
+ <y:Insets bottom="0.0" left="30.0" right="0.0" top="0.0"/>
+ <y:Columns>
+ <y:Column id="column_0" minimumWidth="30.0" width="505.32296875">
+ <y:Insets bottom="3.0" left="3.0" right="3.0" top="20.0"/>
+ </y:Column>
+ </y:Columns>
+ <y:Rows>
+ <y:Row height="124.94312500000001" id="row_0" minimumHeight="50.703125">
+ <y:Insets bottom="3.0" left="20.0" right="3.0" top="3.0"/>
+ </y:Row>
+ <y:Row height="479.88369052343796" id="row_1" minimumHeight="50.703125">
+ <y:Insets bottom="3.0" left="20.0" right="3.0" top="3.0"/>
+ </y:Row>
+ <y:Row height="105.56762695312432" id="row_2" minimumHeight="50.703125">
+ <y:Insets bottom="3.0" left="20.0" right="3.0" top="3.0"/>
+ </y:Row>
+ </y:Rows>
+ </y:Table>
+ </y:TableNode>
+ </data>
+ <graph edgedefault="directed" id="n0:">
+ <node id="n0::n0">
+ <data key="d6">
+ <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+ <y:Geometry height="30.0" width="76.02734375" x="364.83809570312496" y="221.40931152343762"/>
+ <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+ <y:BorderStyle color="#000000" type="line" width="1.0"/>
+ <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.40625" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="66.02734375" x="5.0" xml:space="preserve" y="6.296875">comm_bind<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+ <y:StyleProperties>
+ <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+ <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+ <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+ <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+ <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+ <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+ </y:StyleProperties>
+ </y:GenericNode>
+ </data>
+ </node>
+ <node id="n0::n1">
+ <data key="d6">
+ <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+ <y:Geometry height="30.0" width="102.693359375" x="199.93776454947908" y="221.40931152343762"/>
+ <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+ <y:BorderStyle color="#000000" type="line" width="1.0"/>
+ <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.40625" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="92.693359375" x="5.0" xml:space="preserve" y="6.296875">weak/comm_link<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+ <y:StyleProperties>
+ <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+ <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+ <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+ <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+ <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+ <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+ </y:StyleProperties>
+ </y:GenericNode>
+ </data>
+ </node>
+ <node id="n0::n2">
+ <data key="d6">
+ <y:GenericNode configuration="com.yworks.sbgn.Phenotype">
+ <y:Geometry height="30.0" width="88.68359375" x="268.89078198484657" y="346.50931152343765"/>
+ <y:Fill color="#FFFFFF" transparent="false"/>
+ <y:BorderStyle color="#000000" type="line" width="1.0"/>
+ <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="30.8125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="center" visible="true" width="78.68359375" x="5.0" xml:space="preserve" y="-0.40625">- comm_order
+- comm_alias<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+ </y:GenericNode>
+ </data>
+ </node>
+ <node id="n0::n3">
+ <data key="d6">
+ <y:GenericNode configuration="com.yworks.sbgn.Phenotype">
+ <y:Geometry height="30.0" width="74.673828125" x="365.51485351562496" y="346.50931152343765"/>
+ <y:Fill color="#FFFFFF" transparent="false"/>
+ <y:BorderStyle color="#000000" type="line" width="1.0"/>
+ <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.40625" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="center" visible="true" width="64.673828125" x="5.0" xml:space="preserve" y="6.296875">commop(,,)<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+ </y:GenericNode>
+ </data>
+ </node>
+ <node id="n0::n4">
+ <data key="d6">
+ <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+ <y:Geometry height="30.0" width="70.6953125" x="215.93678798697908" y="115.16931152343761"/>
+ <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+ <y:BorderStyle color="#000000" type="line" width="1.0"/>
+ <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.40625" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="60.6953125" x="5.0" xml:space="preserve" y="6.296875">weak/scan<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+ <y:StyleProperties>
+ <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+ <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+ <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+ <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+ <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+ <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+ </y:StyleProperties>
+ </y:GenericNode>
+ </data>
+ </node>
+ <node id="n0::n5">
+ <data key="d6">
+ <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+ <y:Geometry height="30.0" width="120.04296875" x="446.352998046875" y="-154.9281924765624"/>
+ <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+ <y:BorderStyle color="#000000" type="line" width="1.0"/>
+ <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.40625" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="110.04296875" x="5.0" xml:space="preserve" y="6.296875">comm_reports_type<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+ <y:StyleProperties>
+ <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+ <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+ <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+ <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+ <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+ <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+ </y:StyleProperties>
+ </y:GenericNode>
+ </data>
+ </node>
+ <node id="n0::n6">
+ <data key="d6">
+ <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+ <y:Geometry height="30.0" width="90.6875" x="205.94069423697908" y="8.929311523437605"/>
+ <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+ <y:BorderStyle color="#000000" type="line" width="1.0"/>
+ <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.40625" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="80.6875" x="5.0" xml:space="preserve" y="6.296875">comm_reports<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+ <y:StyleProperties>
+ <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+ <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+ <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+ <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+ <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+ <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+ </y:StyleProperties>
+ </y:GenericNode>
+ </data>
+ </node>
+ <node id="n0::n7">
+ <data key="d6">
+ <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+ <y:Geometry height="30.0" width="72.6875" x="214.94069423697908" y="-64.27068847656238"/>
+ <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+ <y:BorderStyle color="#000000" type="line" width="1.0"/>
+ <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.40625" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="62.6875" x="5.0" xml:space="preserve" y="6.296875">comm_halt<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+ <y:StyleProperties>
+ <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+ <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+ <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+ <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+ <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+ <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+ </y:StyleProperties>
+ </y:GenericNode>
+ </data>
+ </node>
+ <node id="n0::n8">
+ <data key="d6">
+ <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+ <y:Geometry height="30.0" width="75.341796875" x="213.61354579947908" y="-154.9281924765624"/>
+ <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+ <y:BorderStyle color="#000000" type="line" width="1.0"/>
+ <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.40625" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="65.341796875" x="5.0" xml:space="preserve" y="6.296875">comm_impl<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+ <y:StyleProperties>
+ <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+ <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+ <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+ <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+ <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+ <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+ </y:StyleProperties>
+ </y:GenericNode>
+ </data>
+ </node>
+ <node id="n0::n9">
+ <data key="d6">
+ <y:GenericNode configuration="com.yworks.sbgn.PerturbingAgent">
+ <y:Geometry height="40.0" width="103.75742187499998" x="199.4057332994791" y="-264.2001924765625"/>
+ <y:Fill color="#FFFFFF" transparent="false"/>
+ <y:BorderStyle color="#000000" type="line" width="1.0"/>
+ <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.40625" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="center" visible="true" width="67.357421875" x="18.19999999999999" xml:space="preserve" y="11.296875">callguard(..)<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+ </y:GenericNode>
+ </data>
+ </node>
+ </graph>
+ </node>
+ <node id="n1" yfiles.foldertype="group">
+ <data key="d6">
+ <y:ProxyAutoBoundsNode>
+ <y:Realizers active="0">
+ <y:GenericGroupNode configuration="DemoGroup">
+ <y:Geometry height="99.40625" width="93.376953125" x="158.7307927708332" y="444.20306152343767"/>
+ <y:Fill color="#68B0E3" color2="#3C679B" transparent="false"/>
+ <y:BorderStyle color="#000000" type="line" width="1.0"/>
+ <y:NodeLabel alignment="center" autoSizePolicy="content" borderDistance="0.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.40625" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="tl" textColor="#FFFFFF" verticalTextPosition="bottom" visible="true" width="68.716796875" x="0.0" xml:space="preserve" y="0.0">Propagation</y:NodeLabel>
+ <y:State autoResize="true" closed="false" closedHeight="50.0" closedWidth="50.0"/>
+ <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
+ <y:BorderInsets bottom="10" bottomF="10.0" left="0" leftF="0.0" right="0" rightF="0.0" top="12" topF="12.0"/>
+ </y:GenericGroupNode>
+ <y:GenericGroupNode configuration="DemoGroup">
+ <y:Geometry height="50.0" width="50.0" x="122.07299804687489" y="519.1681147499994"/>
+ <y:Fill color="#68B0E3" color2="#3C679B" transparent="false"/>
+ <y:BorderStyle color="#000000" type="line" width="1.0"/>
+ <y:NodeLabel alignment="center" autoSizePolicy="content" borderDistance="0.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.40625" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="tl" textColor="#FFFFFF" verticalTextPosition="bottom" visible="true" width="10.673828125" x="0.0" xml:space="preserve" y="0.0">5</y:NodeLabel>
+ <y:State autoResize="true" closed="true" closedHeight="50.0" closedWidth="50.0"/>
+ <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
+ <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/>
+ </y:GenericGroupNode>
+ </y:Realizers>
+ </y:ProxyAutoBoundsNode>
+ </data>
+ <graph edgedefault="directed" id="n1:">
+ <node id="n1::n0">
+ <data key="d6">
+ <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+ <y:Geometry height="30.0" width="63.376953125" x="173.7307927708332" y="488.60931152343767"/>
+ <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+ <y:BorderStyle color="#000000" type="line" width="1.0"/>
+ <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.40625" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="53.376953125" x="5.0" xml:space="preserve" y="6.296875">dfa_uppy<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+ <y:StyleProperties>
+ <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+ <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+ <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+ <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+ <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+ <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+ </y:StyleProperties>
+ </y:GenericNode>
+ </data>
+ </node>
+ </graph>
+ </node>
+ <edge id="n0::e0" source="n0::n1" target="n0::n2">
+ <data key="d10">
+ <y:PolyLineEdge>
+ <y:Path sx="41.014587522123556" sy="3.5299844765619923" tx="0.0" ty="0.0"/>
+ <y:LineStyle color="#000000" type="line" width="1.0"/>
+ <y:Arrows source="none" target="standard"/>
+ <y:BendStyle smoothed="false"/>
+ </y:PolyLineEdge>
+ </data>
+ </edge>
+ <edge id="e0" source="n0::n1" target="n1::n0">
+ <data key="d10">
+ <y:PolyLineEdge>
+ <y:Path sx="-30.36639023523857" sy="0.0" tx="0.0" ty="0.0"/>
+ <y:LineStyle color="#000000" type="line" width="1.0"/>
+ <y:Arrows source="none" target="standard"/>
+ <y:BendStyle smoothed="false"/>
+ </y:PolyLineEdge>
+ </data>
+ </edge>
+ <edge id="n0::e1" source="n0::n1" target="n0::n1">
+ <data key="d10">
+ <y:PolyLineEdge>
+ <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
+ <y:Point x="274.81661132812496" y="196.40931152343762"/>
+ </y:Path>
+ <y:LineStyle color="#000000" type="line" width="1.0"/>
+ <y:Arrows source="none" target="standard"/>
+ <y:BendStyle smoothed="false"/>
+ </y:PolyLineEdge>
+ </data>
+ </edge>
+ <edge id="n0::e2" source="n0::n0" target="n0::n3">
+ <data key="d10">
+ <y:PolyLineEdge>
+ <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+ <y:LineStyle color="#000000" type="line" width="1.0"/>
+ <y:Arrows source="none" target="standard"/>
+ <y:BendStyle smoothed="false"/>
+ </y:PolyLineEdge>
+ </data>
+ </edge>
+ <edge id="n0::e3" source="n0::n4" target="n0::n0">
+ <data key="d10">
+ <y:PolyLineEdge>
+ <y:Path sx="0.0" sy="0.0" tx="-23.18547949479182" ty="-1.0411967734380028">
+ <y:Point x="379.66628808333314" y="130.1693115234376"/>
+ </y:Path>
+ <y:LineStyle color="#000000" type="line" width="1.0"/>
+ <y:Arrows source="none" target="standard"/>
+ <y:BendStyle smoothed="false"/>
+ </y:PolyLineEdge>
+ </data>
+ </edge>
+ <edge id="n0::e4" source="n0::n4" target="n0::n1">
+ <data key="d10">
+ <y:PolyLineEdge>
+ <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+ <y:LineStyle color="#000000" type="line" width="1.0"/>
+ <y:Arrows source="none" target="standard"/>
+ <y:BendStyle smoothed="false"/>
+ </y:PolyLineEdge>
+ </data>
+ </edge>
+ <edge id="n0::e5" source="n0::n4" target="n0::n4">
+ <data key="d10">
+ <y:PolyLineEdge>
+ <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
+ <y:Point x="274.81661132812496" y="90.16931152343761"/>
+ </y:Path>
+ <y:LineStyle color="#000000" type="line" width="1.0"/>
+ <y:Arrows source="none" target="standard"/>
+ <y:BendStyle smoothed="false"/>
+ </y:PolyLineEdge>
+ </data>
+ </edge>
+ <edge id="n0::e6" source="n0::n6" target="n0::n4">
+ <data key="d10">
+ <y:PolyLineEdge>
+ <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+ <y:LineStyle color="#000000" type="line" width="1.0"/>
+ <y:Arrows source="none" target="standard"/>
+ <y:BendStyle smoothed="false"/>
+ </y:PolyLineEdge>
+ </data>
+ </edge>
+ <edge id="n0::e7" source="n0::n7" target="n0::n6">
+ <data key="d10">
+ <y:PolyLineEdge>
+ <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+ <y:LineStyle color="#000000" type="line" width="1.0"/>
+ <y:Arrows source="none" target="standard"/>
+ <y:BendStyle smoothed="false"/>
+ </y:PolyLineEdge>
+ </data>
+ </edge>
+ <edge id="n0::e8" source="n0::n8" target="n0::n0">
+ <data key="d10">
+ <y:PolyLineEdge>
+ <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
+ <y:Point x="402.85176757812496" y="-139.9281924765624"/>
+ </y:Path>
+ <y:LineStyle color="#000000" type="line" width="1.0"/>
+ <y:Arrows source="none" target="standard"/>
+ <y:BendStyle smoothed="false"/>
+ </y:PolyLineEdge>
+ </data>
+ </edge>
+ <edge id="n0::e9" source="n0::n8" target="n0::n7">
+ <data key="d10">
+ <y:PolyLineEdge>
+ <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+ <y:LineStyle color="#000000" type="line" width="1.0"/>
+ <y:Arrows source="crows_foot_one_mandatory" target="plain"/>
+ <y:BendStyle smoothed="false"/>
+ </y:PolyLineEdge>
+ </data>
+ </edge>
+ <edge id="n0::e10" source="n0::n8" target="n0::n6">
+ <data key="d10">
+ <y:PolyLineEdge>
+ <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
+ <y:Point x="359.52326933333325" y="-139.9281924765624"/>
+ <y:Point x="359.52326933333325" y="23.929311523437605"/>
+ </y:Path>
+ <y:LineStyle color="#000000" type="line" width="1.0"/>
+ <y:Arrows source="none" target="standard"/>
+ <y:BendStyle smoothed="false"/>
+ </y:PolyLineEdge>
+ </data>
+ </edge>
+ <edge id="n0::e11" source="n0::n8" target="n0::n5">
+ <data key="d10">
+ <y:PolyLineEdge>
+ <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+ <y:LineStyle color="#000000" type="line" width="1.0"/>
+ <y:Arrows source="none" target="standard"/>
+ <y:BendStyle smoothed="false"/>
+ </y:PolyLineEdge>
+ </data>
+ </edge>
+ <edge id="n0::e12" source="n0::n8" target="n0::n8">
+ <data key="d10">
+ <y:PolyLineEdge>
+ <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
+ <y:Point x="274.81661132812496" y="-179.9281924765624"/>
+ </y:Path>
+ <y:LineStyle color="#000000" type="line" width="1.0"/>
+ <y:Arrows source="crows_foot_one_mandatory" target="plain"/>
+ <y:BendStyle smoothed="false"/>
+ </y:PolyLineEdge>
+ </data>
+ </edge>
+ <edge id="n0::e13" source="n0::n9" target="n0::n8">
+ <data key="d10">
+ <y:PolyLineEdge>
+ <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+ <y:LineStyle color="#000000" type="line" width="1.0"/>
+ <y:Arrows source="none" target="standard"/>
+ <y:BendStyle smoothed="false"/>
+ </y:PolyLineEdge>
+ </data>
+ </edge>
+ </graph>
+ <data key="d7">
+ <y:Resources/>
+ </data>
+</graphml>
diff --git a/documentation-api/latex.graphml b/documentation-api/latex.graphml
index 96adb5a..c537821 100644
--- a/documentation-api/latex.graphml
+++ b/documentation-api/latex.graphml
@@ -1,819 +1,819 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:java="http://www.yworks.com/xml/yfiles-common/1.0/java" xmlns:sys="http://www.yworks.com/xml/yfiles-common/markup/primitives/2.0" xmlns:x="http://www.yworks.com/xml/yfiles-common/markup/2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:y="http://www.yworks.com/xml/graphml" xmlns:yed="http://www.yworks.com/xml/yed/3" xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://www.yworks.com/xml/schema/graphml/1.1/ygraphml.xsd">
<!--Created by yEd 3.18.1-->
<key attr.name="Description" attr.type="string" for="graph" id="d0"/>
<key for="port" id="d1" yfiles.type="portgraphics"/>
<key for="port" id="d2" yfiles.type="portgeometry"/>
<key for="port" id="d3" yfiles.type="portuserdata"/>
<key attr.name="url" attr.type="string" for="node" id="d4"/>
<key attr.name="description" attr.type="string" for="node" id="d5"/>
<key for="node" id="d6" yfiles.type="nodegraphics"/>
<key for="graphml" id="d7" yfiles.type="resources"/>
<key attr.name="url" attr.type="string" for="edge" id="d8"/>
<key attr.name="description" attr.type="string" for="edge" id="d9"/>
<key for="edge" id="d10" yfiles.type="edgegraphics"/>
<graph edgedefault="directed" id="G">
<data key="d0" xml:space="preserve"/>
<node id="n0" yfiles.foldertype="group">
<data key="d6">
<y:TableNode configuration="YED_TABLE_NODE">
- <y:Geometry height="301.2117579823405" width="799.186140432126" x="180.6552734375001" y="-192.46513398234035"/>
+ <y:Geometry height="301.2117579823405" width="799.186140432126" x="196.79155019287532" y="-192.46513398234035"/>
<y:Fill color="#ECF5FF" color2="#0042F440" transparent="false"/>
<y:BorderStyle color="#000000" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="20.7578125" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="t" textColor="#000000" verticalTextPosition="bottom" visible="true" width="40.6943359375" x="379.245902247313" xml:space="preserve" y="4.0">Latex</y:NodeLabel>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.40625" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="67.36328125" x="136.88742959106293" xml:space="preserve" y="33.0">Compilation<y:LabelModel><y:ColumnNodeLabelModel offset="3.0"/></y:LabelModel><y:ModelParameter><y:ColumnNodeLabelModelParameter id="column_0" inside="true" verticalPosition="0.0"/></y:ModelParameter></y:NodeLabel>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.40625" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="60.6953125" x="652.2944841821259" xml:space="preserve" y="33.0">Transcend<y:LabelModel><y:ColumnNodeLabelModel offset="3.0"/></y:LabelModel><y:ModelParameter><y:ColumnNodeLabelModelParameter id="column_1" inside="true" verticalPosition="0.0"/></y:ModelParameter></y:NodeLabel>
- <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.40625" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="74.7109375" x="416.26267168212587" xml:space="preserve" y="33.0">Interpretation<y:LabelModel><y:ColumnNodeLabelModel offset="3.0"/></y:LabelModel><y:ModelParameter><y:ColumnNodeLabelModelParameter id="column_2" inside="true" verticalPosition="0.0"/></y:ModelParameter></y:NodeLabel>
+ <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.40625" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="74.7109375" x="416.26267168212576" xml:space="preserve" y="33.0">Interpretation<y:LabelModel><y:ColumnNodeLabelModel offset="3.0"/></y:LabelModel><y:ModelParameter><y:ColumnNodeLabelModelParameter id="column_2" inside="true" verticalPosition="0.0"/></y:ModelParameter></y:NodeLabel>
<y:StyleProperties>
<y:Property class="java.awt.Color" name="yed.table.section.color" value="#7192b2"/>
<y:Property class="java.lang.Double" name="yed.table.header.height" value="24.0"/>
<y:Property class="java.awt.Color" name="yed.table.lane.color.main" value="#c4d7ed"/>
<y:Property class="java.awt.Color" name="yed.table.lane.color.alternating" value="#abc8e2"/>
<y:Property class="java.awt.Color" name="yed.table.header.color.alternating" value="#abc8e2"/>
<y:Property class="java.lang.String" name="yed.table.lane.style" value="lane.style.columns"/>
<y:Property class="java.awt.Color" name="yed.table.header.color.main" value="#c4d7ed"/>
</y:StyleProperties>
<y:State autoResize="true" closed="false" closedHeight="80.0" closedWidth="100.0"/>
<y:Insets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/>
<y:BorderInsets bottom="33" bottomF="33.42941839334418" left="0" leftF="0.0" right="106" rightF="106.4960000000001" top="0" topF="0.0"/>
<y:Table autoResizeTable="true" defaultColumnWidth="120.0" defaultMinimumColumnWidth="80.0" defaultMinimumRowHeight="50.0" defaultRowHeight="80.0">
<y:DefaultColumnInsets bottom="0.0" left="0.0" right="0.0" top="24.0"/>
<y:DefaultRowInsets bottom="0.0" left="0.0" right="0.0" top="0.0"/>
<y:Insets bottom="0.0" left="0.0" right="0.0" top="30.0"/>
<y:Columns>
<y:Column id="column_0" minimumWidth="80.0" width="341.13814043212585">
<y:Insets bottom="0.0" left="0.0" right="0.0" top="24.0"/>
</y:Column>
<y:Column id="column_2" minimumWidth="80.0" width="224.95999999999992">
<y:Insets bottom="0.0" left="0.0" right="0.0" top="24.0"/>
</y:Column>
<y:Column id="column_1" minimumWidth="80.0" width="233.0880000000002">
<y:Insets bottom="0.0" left="0.0" right="0.0" top="24.0"/>
</y:Column>
</y:Columns>
<y:Rows>
<y:Row height="247.2117579823405" id="row_0" minimumHeight="50.0">
<y:Insets bottom="0.0" left="0.0" right="0.0" top="0.0"/>
</y:Row>
</y:Rows>
</y:Table>
</y:TableNode>
</data>
<graph edgedefault="directed" id="n0:">
<node id="n0::n0">
<data key="d6">
<y:UMLClassNode>
- <y:Geometry height="43.046875" width="94.88818359375" x="189.2599082031249" y="25.265718750000076"/>
+ <y:Geometry height="43.046875" width="94.88818359375" x="205.3961849585001" y="25.265718750000076"/>
<y:Fill color="#FFCC00" transparent="false"/>
<y:BorderStyle color="#000000" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="13" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="33.046875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="84.88818359375" x="5.0" xml:space="preserve" y="3.0">ExtraArgs
FnInvocation<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
<y:UML clipContent="true" constraint="" hasDetailsColor="false" omitDetails="false" stereotype="" use3DEffect="true">
<y:AttributeLabel xml:space="preserve"/>
<y:MethodLabel xml:space="preserve"/>
</y:UML>
</y:UMLClassNode>
</data>
</node>
<node id="n0::n1">
<data key="d4" xml:space="preserve"/>
<data key="d6">
<y:UMLClassNode>
- <y:Geometry height="57.5703125" width="86.9599609375" x="193.20801953124987" y="-76.87315624999997"/>
+ <y:Geometry height="57.5703125" width="86.9599609375" x="209.34429628662508" y="-76.87315624999997"/>
<y:Fill color="#FFCC00" transparent="false"/>
<y:BorderStyle color="#000000" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="13" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="47.5703125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="76.9599609375" x="5.0" xml:space="preserve" y="3.0">Latex
BruteScope
Dec<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
<y:UML clipContent="true" constraint="" hasDetailsColor="false" omitDetails="false" stereotype="" use3DEffect="true">
<y:AttributeLabel xml:space="preserve"/>
<y:MethodLabel xml:space="preserve"/>
</y:UML>
</y:UMLClassNode>
</data>
</node>
<node id="n0::n2">
<data key="d4" xml:space="preserve"/>
<data key="d6">
<y:UMLClassNode>
- <y:Geometry height="30.0" width="114.39453125" x="180.6552734375001" y="-138.46513398234035"/>
+ <y:Geometry height="30.0" width="114.39453125" x="196.79155019287532" y="-138.46513398234035"/>
<y:Fill color="#CCCCCC" transparent="false"/>
<y:BorderStyle color="#000000" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="13" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="18.5234375" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="104.39453125" x="5.0" xml:space="preserve" y="3.0">ICodeScopeUnit<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="-0.03703090122767855" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
<y:UML clipContent="true" constraint="" hasDetailsColor="false" omitDetails="false" stereotype="" use3DEffect="true">
<y:AttributeLabel xml:space="preserve"/>
<y:MethodLabel xml:space="preserve"/>
</y:UML>
</y:UMLClassNode>
</data>
</node>
<node id="n0::n3">
<data key="d6">
<y:UMLClassNode>
- <y:Geometry height="57.5703125" width="102.82275390625" x="334.36462304687484" y="-77.20915624999992"/>
+ <y:Geometry height="57.5703125" width="102.82275390625" x="350.50089980225005" y="-77.20915624999992"/>
<y:Fill color="#FFCC00" transparent="false"/>
<y:BorderStyle color="#000000" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="13" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="47.5703125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="92.82275390625" x="5.0" xml:space="preserve" y="3.0">Latex
BruteFunction
Dec<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
<y:UML clipContent="true" constraint="" hasDetailsColor="false" omitDetails="false" stereotype="" use3DEffect="true">
<y:AttributeLabel xml:space="preserve"/>
<y:MethodLabel xml:space="preserve"/>
</y:UML>
</y:UMLClassNode>
</data>
</node>
<node id="n0::n4">
<data key="d4" xml:space="preserve"/>
<data key="d6">
<y:UMLClassNode>
- <y:Geometry height="28.0" width="97.75732421875" x="335.14147744262544" y="-137.1598241279998"/>
+ <y:Geometry height="28.0" width="97.75732421875" x="351.27775419800065" y="-137.1598241279998"/>
<y:Fill color="#C0C0C0" transparent="false"/>
<y:BorderStyle color="#000000" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="13" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="18.5234375" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="87.75732421875" x="5.0" xml:space="preserve" y="3.0">IFunctionUnit<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
<y:UML clipContent="true" constraint="" hasDetailsColor="false" omitDetails="false" stereotype="" use3DEffect="true">
<y:AttributeLabel xml:space="preserve"/>
<y:MethodLabel xml:space="preserve"/>
</y:UML>
</y:UMLClassNode>
</data>
</node>
<node id="n0::n5">
<data key="d4" xml:space="preserve"/>
<data key="d6">
<y:UMLClassNode>
- <y:Geometry height="30.0" width="128.12451171875" x="570.5217441406251" y="-126.27999999999997"/>
+ <y:Geometry height="30.0" width="128.12451171875" x="586.6580208960003" y="-126.27999999999997"/>
<y:Fill color="#FFCC00" transparent="false"/>
<y:BorderStyle color="#000000" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="13" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="18.5234375" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="118.12451171875" x="5.0" xml:space="preserve" y="3.0">getSubjectDomain<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
<y:UML clipContent="true" constraint="" hasDetailsColor="false" omitDetails="false" stereotype="" use3DEffect="true">
<y:AttributeLabel xml:space="preserve"/>
<y:MethodLabel xml:space="preserve"/>
</y:UML>
</y:UMLClassNode>
</data>
</node>
<node id="n0::n6">
<data key="d6">
<y:UMLClassNode>
- <y:Geometry height="43.046875" width="51.57177734375" x="820.4941113281249" y="-76.30628124999996"/>
+ <y:Geometry height="43.046875" width="51.57177734375" x="836.6303880835001" y="-76.30628124999996"/>
<y:Fill color="#FFCC00" transparent="false"/>
<y:BorderStyle color="#000000" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="13" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="33.046875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="41.57177734375" x="5.0" xml:space="preserve" y="3.0">Latex
Query<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
<y:UML clipContent="true" constraint="" hasDetailsColor="false" omitDetails="false" stereotype="" use3DEffect="true">
<y:AttributeLabel xml:space="preserve"/>
<y:MethodLabel xml:space="preserve"/>
</y:UML>
</y:UMLClassNode>
</data>
</node>
<node id="n0::n7">
<data key="d4" xml:space="preserve"/>
<data key="d6">
<y:UMLClassNode>
- <y:Geometry height="28.0" width="55.18359375" x="818.161820119626" y="-135.99964825599963"/>
+ <y:Geometry height="28.0" width="55.18359375" x="834.2980968750012" y="-135.99964825599963"/>
<y:Fill color="#C0C0C0" transparent="false"/>
<y:BorderStyle color="#000000" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="13" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="18.5234375" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="45.18359375" x="5.0" xml:space="preserve" y="3.0">IQuery<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
<y:UML clipContent="true" constraint="" hasDetailsColor="false" omitDetails="false" stereotype="" use3DEffect="true">
<y:AttributeLabel xml:space="preserve"/>
<y:MethodLabel xml:space="preserve"/>
</y:UML>
</y:UMLClassNode>
</data>
</node>
<node id="n0::n8">
<data key="d4" xml:space="preserve"/>
<data key="d6">
<y:UMLClassNode>
- <y:Geometry height="30.0" width="114.4072265625" x="580.2603867187496" y="-59.25599999999994"/>
+ <y:Geometry height="30.0" width="114.4072265625" x="596.3966634741248" y="-59.25599999999994"/>
<y:Fill color="#C0C0C0" transparent="false"/>
<y:BorderStyle color="#000000" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="13" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="18.5234375" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="104.4072265625" x="5.0" xml:space="preserve" y="3.0">collapseColumn<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
<y:UML clipContent="true" constraint="" hasDetailsColor="false" omitDetails="false" stereotype="" use3DEffect="true">
<y:AttributeLabel xml:space="preserve"/>
<y:MethodLabel xml:space="preserve"/>
</y:UML>
</y:UMLClassNode>
</data>
</node>
<node id="n0::n9">
<data key="d6">
<y:ShapeNode>
- <y:Geometry height="30.0" width="46.677734375" x="756.9171328125" y="-116.655824128"/>
+ <y:Geometry height="30.0" width="46.677734375" x="773.0534095678752" y="-116.655824128"/>
<y:Fill color="#00FFFF" transparent="false"/>
<y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="30.8125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="36.677734375" x="5.0" xml:space="preserve" y="-0.40625">Latex
Query<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
<y:Shape type="star6"/>
</y:ShapeNode>
</data>
</node>
<node id="n0::n10">
<data key="d6">
<y:UMLClassNode>
- <y:Geometry height="57.5703125" width="86.48447265624998" x="592.3191508036989" y="17.74689310665596"/>
+ <y:Geometry height="57.5703125" width="86.48447265624998" x="608.4554275590741" y="17.74689310665596"/>
<y:Fill color="#C0C0C0" transparent="false"/>
<y:BorderStyle color="#000000" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="13" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="47.5703125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="74.08447265625" x="6.199999999999989" xml:space="preserve" y="3.0">represent
Trans
Expression<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
<y:UML clipContent="true" constraint="" hasDetailsColor="false" omitDetails="false" stereotype="" use3DEffect="true">
<y:AttributeLabel xml:space="preserve"/>
<y:MethodLabel xml:space="preserve"/>
</y:UML>
</y:UMLClassNode>
</data>
</node>
</graph>
</node>
<node id="n1" yfiles.foldertype="group">
<data key="d4" xml:space="preserve"/>
<data key="d6">
<y:ProxyAutoBoundsNode>
<y:Realizers active="0">
<y:GroupNode>
<y:Geometry height="629.5999999999996" width="839.7171093750001" x="181.1570562500006" y="172.33863125000016"/>
<y:Fill color="#CAECFF80" transparent="false"/>
<y:BorderStyle color="#666699" type="dotted" width="1.0"/>
<y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#99CCFF" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="20.7578125" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="t" textColor="#000000" verticalTextPosition="bottom" visible="true" width="839.7171093750001" x="0.0" xml:space="preserve" y="0.0">Latex script</y:NodeLabel>
<y:Shape type="roundrectangle"/>
<y:State closed="false" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/>
<y:NodeBounds considerNodeLabelSize="true"/>
<y:Insets bottom="5" bottomF="5.0" left="5" leftF="5.0" right="5" rightF="5.0" top="5" topF="5.0"/>
<y:BorderInsets bottom="30" bottomF="30.0" left="143" leftF="143.02587890625" right="85" rightF="85.42316406250006" top="61" topF="60.842187499999795"/>
</y:GroupNode>
<y:GroupNode>
<y:Geometry height="50.0" width="102.0" x="181.1570562500006" y="172.33863125000016"/>
<y:Fill color="#CAECFF80" transparent="false"/>
<y:BorderStyle color="#666699" type="dotted" width="1.0"/>
<y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#99CCFF" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="20.7578125" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="t" textColor="#000000" verticalTextPosition="bottom" visible="true" width="102.0" x="0.0" xml:space="preserve" y="0.0">Latex script</y:NodeLabel>
<y:Shape type="roundrectangle"/>
<y:State closed="true" closedHeight="50.0" closedWidth="102.0" innerGraphDisplayEnabled="false"/>
<y:NodeBounds considerNodeLabelSize="true"/>
<y:Insets bottom="5" bottomF="5.0" left="5" leftF="5.0" right="5" rightF="5.0" top="5" topF="5.0"/>
<y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/>
</y:GroupNode>
</y:Realizers>
</y:ProxyAutoBoundsNode>
</data>
<graph edgedefault="directed" id="n1:">
<node id="n1::n0" yfiles.foldertype="group">
<data key="d6">
<y:TableNode configuration="com.yworks.bpmn.Pool">
<y:Geometry height="507.9999999999998" width="601.26806640625" x="329.1829351562506" y="258.93863124999996"/>
<y:Fill color="#FFF2BC" color2="#D4D4D4CC" transparent="false"/>
<y:BorderStyle color="#000000" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="20.7578125" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="l" rotationAngle="270.0" textColor="#000000" verticalTextPosition="bottom" visible="true" width="40.6943359375" x="4.0" xml:space="preserve" y="233.6528320312499">Latex</y:NodeLabel>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.40625" horizontalTextPosition="center" iconTextGap="4" modelName="custom" rotationAngle="270.0" textColor="#000000" verticalTextPosition="bottom" visible="true" width="40.0234375" x="33.0" xml:space="preserve" y="89.50915527343773">Output<y:LabelModel><y:RowNodeLabelModel offset="3.0"/></y:LabelModel><y:ModelParameter><y:RowNodeLabelModelParameter horizontalPosition="0.0" id="row_0" inside="true"/></y:ModelParameter></y:NodeLabel>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.40625" horizontalTextPosition="center" iconTextGap="4" modelName="custom" rotationAngle="270.0" textColor="#000000" verticalTextPosition="bottom" visible="true" width="63.361328125" x="33.0" xml:space="preserve" y="266.50952148437545">Processing<y:LabelModel><y:RowNodeLabelModel offset="3.0"/></y:LabelModel><y:ModelParameter><y:RowNodeLabelModelParameter horizontalPosition="0.0" id="row_1" inside="true"/></y:ModelParameter></y:NodeLabel>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.40625" horizontalTextPosition="center" iconTextGap="4" modelName="custom" rotationAngle="270.0" textColor="#000000" verticalTextPosition="bottom" visible="true" width="30.689453125" x="33.0" xml:space="preserve" y="435.8245849609376">Input<y:LabelModel><y:RowNodeLabelModel offset="3.0"/></y:LabelModel><y:ModelParameter><y:RowNodeLabelModelParameter horizontalPosition="0.0" id="row_2" inside="true"/></y:ModelParameter></y:NodeLabel>
<y:StyleProperties>
<y:Property name="y.view.tabular.TableNodePainter.ALTERNATE_ROW_STYLE">
<y:SimpleStyle fillColor="#474A4340" lineColor="#000000" lineType="line" lineWidth="1.0"/>
</y:Property>
<y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
<y:Property name="y.view.tabular.TableNodePainter.ALTERNATE_COLUMN_SELECTION_STYLE">
<y:SimpleStyle fillColor="#474A4380" lineColor="#000000" lineType="line" lineWidth="3.0"/>
</y:Property>
<y:Property name="y.view.tabular.TableNodePainter.ALTERNATE_ROW_SELECTION_STYLE">
<y:SimpleStyle fillColor="#474A4380" lineColor="#000000" lineType="line" lineWidth="3.0"/>
</y:Property>
<y:Property class="java.awt.Color" name="POOL_LANE_COLOR_ALTERNATING" value="#ffffff"/>
<y:Property class="java.awt.Color" name="POOL_LANE_COLOR_MAIN" value="#ffffcc"/>
<y:Property class="java.lang.String" name="POOL_LANE_STYLE" value="LANE_STYLE_ROWS"/>
<y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
<y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
<y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="POOL_TYPE_LANE"/>
<y:Property name="y.view.tabular.TableNodePainter.ALTERNATE_COLUMN_STYLE">
<y:SimpleStyle fillColor="#474A4340" lineColor="#000000" lineType="line" lineWidth="1.0"/>
</y:Property>
</y:StyleProperties>
<y:State autoResize="true" closed="false" closedHeight="80.0" closedWidth="100.0"/>
<y:Insets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/>
<y:BorderInsets bottom="25" bottomF="25.499999999999886" left="9" leftF="9.34423828125" right="24" rightF="23.56306093749936" top="5" topF="4.938631249999958"/>
<y:Table autoResizeTable="true" defaultColumnWidth="360.0" defaultMinimumColumnWidth="30.0" defaultMinimumRowHeight="30.0" defaultRowHeight="107.0">
<y:DefaultColumnInsets bottom="3.0" left="3.0" right="3.0" top="20.0"/>
<y:DefaultRowInsets bottom="3.0" left="20.0" right="3.0" top="3.0"/>
<y:Insets bottom="0.0" left="30.0" right="0.0" top="0.0"/>
<y:Columns>
<y:Column id="column_0" minimumWidth="30.0" width="548.26806640625">
<y:Insets bottom="3.0" left="3.0" right="3.0" top="20.0"/>
</y:Column>
</y:Columns>
<y:Rows>
<y:Row height="179.04174804687545" id="row_0" minimumHeight="50.703125">
<y:Insets bottom="3.0" left="20.0" right="3.0" top="3.0"/>
</y:Row>
<y:Row height="198.296875" id="row_1" minimumHeight="50.703125">
<y:Insets bottom="3.0" left="20.0" right="3.0" top="3.0"/>
</y:Row>
<y:Row height="107.66137695312432" id="row_2" minimumHeight="50.703125">
<y:Insets bottom="3.0" left="20.0" right="3.0" top="3.0"/>
</y:Row>
</y:Rows>
</y:Table>
</y:TableNode>
</data>
<graph edgedefault="directed" id="n1::n0:">
<node id="n1::n0::n0">
<data key="d6">
<y:GenericNode configuration="com.yworks.bpmn.Artifact.withShadow">
<y:Geometry height="30.0" width="64.021484375" x="543.7902309604715" y="695.9386312499998"/>
<y:Fill color="#FFFFFFE6" transparent="false"/>
<y:BorderStyle color="#000000" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="30.8125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="54.021484375" x="5.0" xml:space="preserve" y="-0.40625">Demand
upstream<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
<y:StyleProperties>
<y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
<y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
<y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
<y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ARTIFACT_TYPE_ANNOTATION"/>
</y:StyleProperties>
</y:GenericNode>
</data>
</node>
<node id="n1::n0::n1">
<data key="d6">
<y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
<y:Geometry height="55.0" width="122.08203125" x="388.5271734375006" y="683.4386312499998"/>
<y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
<y:BorderStyle color="#123EA2" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.40625" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="118.08203125" x="2.0" xml:space="preserve" y="18.796875">latex_scope_demand<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
<y:StyleProperties>
<y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
<y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
<y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
<y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
<y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
<y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
</y:StyleProperties>
</y:GenericNode>
</data>
</node>
<node id="n1::n0::n2">
<data key="d6">
<y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
<y:Geometry height="30.0" width="150.078125" x="620.8816656250006" y="695.9386312499998"/>
<y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
<y:BorderStyle color="#123EA2" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.40625" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="140.078125" x="5.0" xml:space="preserve" y="6.296875">latex_registered_subjects<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
<y:StyleProperties>
<y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
<y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
<y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
<y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
<y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
<y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
</y:StyleProperties>
</y:GenericNode>
</data>
</node>
<node id="n1::n0::n3">
<data key="d6">
<y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
<y:Geometry height="55.0" width="110.7265625" x="394.2049078125006" y="526.9386312499997"/>
<y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
<y:BorderStyle color="#123EA2" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.40625" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="100.7265625" x="5.0" xml:space="preserve" y="18.796875">scope_demand(1)<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
<y:StyleProperties>
<y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
<y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
<y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
<y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
<y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
<y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
</y:StyleProperties>
</y:GenericNode>
</data>
</node>
<node id="n1::n0::n4">
<data key="d6">
<y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
<y:Geometry height="30.0" width="74.046875" x="412.5447515625006" y="395.93863124999996"/>
<y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
<y:BorderStyle color="#123EA2" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.40625" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="64.046875" x="5.0" xml:space="preserve" y="6.296875">fn_demand<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
<y:StyleProperties>
<y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
<y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
<y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
<y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
<y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
<y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
</y:StyleProperties>
</y:GenericNode>
</data>
</node>
<node id="n1::n0::n5">
<data key="d6">
<y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
<y:Geometry height="30.0" width="58.02734375" x="556.4070562500006" y="395.93863124999996"/>
<y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
<y:BorderStyle color="#123EA2" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.40625" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="48.02734375" x="5.0" xml:space="preserve" y="6.296875">decision<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
<y:StyleProperties>
<y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
<y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
<y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
<y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
<y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
<y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
</y:StyleProperties>
</y:GenericNode>
</data>
</node>
<node id="n1::n0::n6">
<data key="d6">
<y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
<y:Geometry height="30.0" width="110.7265625" x="530.0574468750006" y="539.4386312499997"/>
<y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
<y:BorderStyle color="#123EA2" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.40625" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="100.7265625" x="5.0" xml:space="preserve" y="6.296875">scope_demand(2)<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
<y:StyleProperties>
<y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
<y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
<y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
<y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
<y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
<y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
</y:StyleProperties>
</y:GenericNode>
</data>
</node>
<node id="n1::n0::n7">
<data key="d6">
<y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
<y:Geometry height="30.0" width="85.3671875" x="725.9371343750006" y="396.33863124999993"/>
<y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
<y:BorderStyle color="#FF0000" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.40625" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="75.3671875" x="5.0" xml:space="preserve" y="6.296875">late(decision)<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
<y:StyleProperties>
<y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
<y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
<y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
<y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
<y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
<y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
</y:StyleProperties>
</y:GenericNode>
</data>
</node>
<node id="n1::n0::n8">
<data key="d6">
<y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
<y:Geometry height="30.0" width="62.703125" x="737.2691656250006" y="539.4386312499997"/>
<y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
<y:BorderStyle color="#123EA2" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.40625" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="52.703125" x="5.0" xml:space="preserve" y="6.296875">scope_fn<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
<y:StyleProperties>
<y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
<y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
<y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
<y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
<y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
<y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
</y:StyleProperties>
</y:GenericNode>
</data>
</node>
<node id="n1::n0::n9">
<data key="d6">
<y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
<y:Geometry height="30.0" width="122.08203125" x="388.5271734375006" y="283.8772624999999"/>
<y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
<y:BorderStyle color="#123EA2" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.40625" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="112.08203125" x="5.0" xml:space="preserve" y="6.296875">fn_demand_ordered<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
<y:StyleProperties>
<y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
<y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
<y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
<y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
<y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
<y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
</y:StyleProperties>
</y:GenericNode>
</data>
</node>
<node id="n1::n0::n10">
<data key="d6">
<y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
<y:Geometry height="30.0" width="83.99609375" x="819.8918468750012" y="539.8772624999995"/>
<y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
<y:BorderStyle color="#123EA2" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.40625" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="74.03125" x="4.982421875" xml:space="preserve" y="6.296875">latex_symbol<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
<y:StyleProperties>
<y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
<y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
<y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
<y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
<y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
<y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
</y:StyleProperties>
</y:GenericNode>
</data>
</node>
</graph>
</node>
</graph>
</node>
<edge id="n0::e0" source="n0::n1" target="n0::n0">
<data key="d8" xml:space="preserve"/>
<data key="d10">
<y:PolyLineEdge>
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
<y:LineStyle color="#000000" type="dashed" width="1.0"/>
<y:Arrows source="none" target="plain"/>
<y:BendStyle smoothed="false"/>
</y:PolyLineEdge>
</data>
</edge>
<edge id="n0::e1" source="n0::n1" target="n0::n6">
<data key="d8" xml:space="preserve"/>
<data key="d10">
<y:PolyLineEdge>
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
- <y:Point x="574.9961395520005" y="48.36017587200024"/>
+ <y:Point x="591.1324163073757" y="48.36017587200024"/>
</y:Path>
<y:LineStyle color="#000000" type="line" width="1.0"/>
<y:Arrows source="white_diamond" target="none"/>
<y:BendStyle smoothed="false"/>
</y:PolyLineEdge>
</data>
</edge>
<edge id="n0::e2" source="n0::n3" target="n0::n6">
<data key="d8" xml:space="preserve"/>
<data key="d10">
<y:PolyLineEdge>
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
- <y:Point x="647.1881395520005" y="-6.167824127999808"/>
+ <y:Point x="663.3244163073757" y="-6.167824127999808"/>
</y:Path>
<y:LineStyle color="#000000" type="line" width="1.0"/>
<y:Arrows source="white_diamond" target="none"/>
<y:BendStyle smoothed="false"/>
</y:PolyLineEdge>
</data>
</edge>
<edge id="n0::e3" source="n0::n3" target="n0::n5">
<data key="d8" xml:space="preserve"/>
<data key="d10">
<y:PolyLineEdge>
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
<y:LineStyle color="#000000" type="dashed" width="1.0"/>
<y:Arrows source="none" target="plain"/>
<y:BendStyle smoothed="false"/>
</y:PolyLineEdge>
</data>
</edge>
<edge id="n0::e4" source="n0::n1" target="n0::n5">
<data key="d8" xml:space="preserve"/>
<data key="d10">
<y:PolyLineEdge>
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
<y:LineStyle color="#000000" type="dashed" width="1.0"/>
<y:Arrows source="none" target="plain"/>
<y:BendStyle smoothed="false"/>
</y:PolyLineEdge>
</data>
</edge>
<edge id="n0::e5" source="n0::n5" target="n0::n8">
<data key="d8" xml:space="preserve"/>
<data key="d10">
<y:PolyLineEdge>
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
<y:LineStyle color="#000000" type="dashed" width="1.0"/>
<y:Arrows source="none" target="plain"/>
<y:BendStyle smoothed="false"/>
</y:PolyLineEdge>
</data>
</edge>
<edge id="n0::e6" source="n0::n1" target="n0::n2">
<data key="d8" xml:space="preserve"/>
<data key="d10">
<y:PolyLineEdge>
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
<y:LineStyle color="#000000" type="dashed" width="1.0"/>
<y:Arrows source="none" target="white_delta"/>
<y:BendStyle smoothed="false"/>
</y:PolyLineEdge>
</data>
</edge>
<edge id="n0::e7" source="n0::n3" target="n0::n4">
<data key="d8" xml:space="preserve"/>
<data key="d10">
<y:PolyLineEdge>
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
<y:LineStyle color="#000000" type="dashed" width="1.0"/>
<y:Arrows source="none" target="white_delta"/>
<y:BendStyle smoothed="false"/>
</y:PolyLineEdge>
</data>
</edge>
<edge id="n0::e8" source="n0::n6" target="n0::n7">
<data key="d8" xml:space="preserve"/>
<data key="d10">
<y:PolyLineEdge>
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
<y:LineStyle color="#000000" type="dashed" width="1.0"/>
<y:Arrows source="none" target="white_delta"/>
<y:BendStyle smoothed="false"/>
</y:PolyLineEdge>
</data>
</edge>
<edge id="n0::e9" source="n0::n9" target="n0::n6">
<data key="d8" xml:space="preserve"/>
<data key="d10">
<y:PolyLineEdge>
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
<y:LineStyle color="#000000" type="dashed" width="1.0"/>
<y:Arrows source="none" target="plain"/>
<y:BendStyle smoothed="false"/>
</y:PolyLineEdge>
</data>
</edge>
<edge id="n0::e10" source="n0::n1" target="n0::n10">
<data key="d8" xml:space="preserve"/>
<data key="d10">
<y:PolyLineEdge>
<y:Path sx="29.599999999999966" sy="0.0" tx="0.0" ty="17.599999999999994">
- <y:Point x="307.961387131824" y="-46.26795064334408"/>
- <y:Point x="308.6879999999999" y="63.33204935665589"/>
+ <y:Point x="324.0976638871992" y="-46.26795064334408"/>
+ <y:Point x="324.8242767553751" y="63.33204935665589"/>
</y:Path>
<y:LineStyle color="#000000" type="dashed" width="1.0"/>
<y:Arrows source="none" target="plain"/>
<y:BendStyle smoothed="false"/>
</y:PolyLineEdge>
</data>
</edge>
<edge id="n1::e0" source="n1::n0" target="n1::n0::n5">
<data key="d8" xml:space="preserve"/>
<data key="d10">
<y:PolyLineEdge>
<y:Path sx="-13.01307826711736" sy="-170.1693115234376" tx="0.0" ty="0.0"/>
<y:LineStyle color="#000000" type="dashed" width="1.0"/>
<y:Arrows source="none" target="plain"/>
<y:BendStyle smoothed="false"/>
</y:PolyLineEdge>
</data>
</edge>
<edge id="n1::n0::e0" source="n1::n0::n0" target="n1::n0::n1">
<data key="d8" xml:space="preserve"/>
<data key="d10">
<y:PolyLineEdge>
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
<y:LineStyle color="#000000" type="dashed" width="1.0"/>
<y:Arrows source="none" target="plain"/>
<y:BendStyle smoothed="false"/>
</y:PolyLineEdge>
</data>
</edge>
<edge id="n1::n0::e1" source="n1::n0::n3" target="n1::n0::n1">
<data key="d8" xml:space="preserve"/>
<data key="d10">
<y:PolyLineEdge>
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
<y:LineStyle color="#000000" type="dashed" width="1.0"/>
<y:Arrows source="none" target="plain"/>
<y:BendStyle smoothed="false"/>
</y:PolyLineEdge>
</data>
</edge>
<edge id="n1::n0::e2" source="n1::n0::n4" target="n1::n0::n3">
<data key="d8" xml:space="preserve"/>
<data key="d10">
<y:PolyLineEdge>
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
<y:LineStyle color="#000000" type="dashed" width="1.0"/>
<y:Arrows source="none" target="plain"/>
<y:BendStyle smoothed="false"/>
</y:PolyLineEdge>
</data>
</edge>
<edge id="n1::n0::e3" source="n1::n0::n5" target="n1::n0::n4">
<data key="d8" xml:space="preserve"/>
<data key="d10">
<y:PolyLineEdge>
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
<y:LineStyle color="#000000" type="dashed" width="1.0"/>
<y:Arrows source="none" target="plain"/>
<y:BendStyle smoothed="false"/>
</y:PolyLineEdge>
</data>
</edge>
<edge id="n1::n0::e4" source="n1::n0::n5" target="n1::n0::n2">
<data key="d8" xml:space="preserve"/>
<data key="d10">
<y:PolyLineEdge>
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
<y:Point x="695.9207281250006" y="411.93863124999996"/>
</y:Path>
<y:LineStyle color="#000000" type="dashed" width="1.0"/>
<y:Arrows source="none" target="plain"/>
<y:BendStyle smoothed="false"/>
</y:PolyLineEdge>
</data>
</edge>
<edge id="n1::n0::e5" source="n1::n0::n6" target="n1::n0::n4">
<data key="d8" xml:space="preserve"/>
<data key="d10">
<y:PolyLineEdge>
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
<y:LineStyle color="#000000" type="dashed" width="1.0"/>
<y:Arrows source="none" target="plain"/>
<y:BendStyle smoothed="false"/>
</y:PolyLineEdge>
</data>
</edge>
<edge id="n1::n0::e6" source="n1::n0::n6" target="n1::n0::n5">
<data key="d8" xml:space="preserve"/>
<data key="d10">
<y:PolyLineEdge>
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
<y:LineStyle color="#000000" type="dashed" width="1.0"/>
<y:Arrows source="crows_foot_one_mandatory" target="plain"/>
<y:BendStyle smoothed="false"/>
</y:PolyLineEdge>
</data>
</edge>
<edge id="n1::n0::e7" source="n1::n0::n7" target="n1::n0::n8">
<data key="d8" xml:space="preserve"/>
<data key="d10">
<y:PolyLineEdge>
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
<y:LineStyle color="#000000" type="dashed" width="1.0"/>
<y:Arrows source="none" target="plain"/>
<y:BendStyle smoothed="false"/>
</y:PolyLineEdge>
</data>
</edge>
<edge id="n1::e1" source="n1::n0::n7" target="n1::n0">
<data key="d8" xml:space="preserve"/>
<data key="d10">
<y:PolyLineEdge>
<y:Path sx="0.0" sy="0.0" tx="-139.5127241750008" ty="-154.9999999999999">
<y:Point x="768.6207281250006" y="357.93863124999996"/>
</y:Path>
<y:LineStyle color="#000000" type="dashed" width="1.0"/>
<y:Arrows source="none" target="plain"/>
<y:BendStyle smoothed="false"/>
</y:PolyLineEdge>
</data>
</edge>
<edge id="n1::n0::e8" source="n1::n0::n7" target="n1::n0::n2">
<data key="d8" xml:space="preserve"/>
<data key="d10">
<y:PolyLineEdge>
<y:Path sx="0.0" sy="0.0" tx="13.0" ty="0.0">
<y:Point x="708.9207281250006" y="411.33863124999993"/>
</y:Path>
<y:LineStyle color="#000000" type="dashed" width="1.0"/>
<y:Arrows source="none" target="plain"/>
<y:BendStyle smoothed="false"/>
</y:PolyLineEdge>
</data>
</edge>
<edge id="n1::n0::e9" source="n1::n0::n9" target="n1::n0::n4">
<data key="d8" xml:space="preserve"/>
<data key="d10">
<y:PolyLineEdge>
<y:Path sx="-19.0" sy="0.0" tx="-19.0" ty="0.0"/>
<y:LineStyle color="#000000" type="dashed" width="1.0"/>
<y:Arrows source="none" target="plain"/>
<y:BendStyle smoothed="false"/>
</y:PolyLineEdge>
</data>
</edge>
<edge id="n1::n0::e10" source="n1::n0::n9" target="n1::n0::n7">
<data key="d8" xml:space="preserve"/>
<data key="d10">
<y:PolyLineEdge>
<y:Path sx="0.0" sy="0.0" tx="19.0" ty="0.0">
<y:Point x="787.6207281250006" y="298.8772624999999"/>
</y:Path>
<y:LineStyle color="#000000" type="dashed" width="1.0"/>
<y:Arrows source="none" target="plain"/>
<y:BendStyle smoothed="false"/>
</y:PolyLineEdge>
</data>
</edge>
<edge id="n1::n0::e11" source="n1::n0::n4" target="n1::n0::n7">
<data key="d8" xml:space="preserve"/>
<data key="d10">
<y:PolyLineEdge>
<y:Path sx="0.0" sy="0.0" tx="-20.0" ty="0.0">
<y:Point x="460.0" y="410.93863124999996"/>
<y:Point x="460.0" y="357.0"/>
<y:Point x="748.6207281250006" y="357.0"/>
</y:Path>
<y:LineStyle color="#000000" type="dashed" width="1.0"/>
<y:Arrows source="none" target="plain"/>
<y:BendStyle smoothed="false"/>
</y:PolyLineEdge>
</data>
</edge>
</graph>
<data key="d7">
<y:Resources/>
</data>
</graphml>
diff --git a/documentation/Concepts/context.xml b/documentation/Concepts/context.xml
index 8f9fc49..3762cb8 100644
--- a/documentation/Concepts/context.xml
+++ b/documentation/Concepts/context.xml
@@ -1,311 +1,365 @@
<?xml version="1.0" encoding="UTF-8"?>
<chapter version="5.1" xmlns="http://docbook.org/ns/docbook"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:xila="http://www.w3.org/2001/XInclude/local-attributes"
xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:trans="http://docbook.org/ns/transclusion"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:m="http://www.w3.org/1998/Math/MathML"
xmlns:html="http://www.w3.org/1999/xhtml"
xmlns:db="http://docbook.org/ns/docbook">
- <title>Context</title>
+ <?xxe-sn 2ahi4rjnvuo 1?>
- <para>Computer program and its internal states and transitions between them
- can be looked at from two different points of view: control flow and data
- flow. Any information that can be derived from control flow is called
- <emphasis>context</emphasis> in Xreate.</para>
+ <title><?xxe-sn 2ahi4rjnvuo 2?>Context</title>
- <para>Data that can be captured from analysing control flow consists of two
- parts as follows:</para>
+ <para><?xxe-sn 2ahi4rjnvuo 3?>Computer program and its internal states and
+ transitions between them can be looked at from two different points of view:
+ control flow and data flow. Any information that can be derived from control
+ flow is called <emphasis><?xxe-sn 2ahi4rjnvuo 4?>context</emphasis> in
+ Xreate.</para>
+
+ <para><?xxe-sn 2ahi4rjnvuo 5?>Data that can be captured from analysing
+ control flow consists of two parts as follows:</para>
<itemizedlist>
+ <?xxe-sn 2ahi4rjnvuo 6?>
+
<listitem>
- <para>Instantaneous state or current place within the code. It's fully
- determined by current code block as well as hierarchy of all its
- respective parents</para>
+ <?xxe-sn 2ahi4rjnvuo 7?>
+
+ <para><?xxe-sn 2ahi4rjnvuo 8?>Instantaneous state or current place
+ within the code. It's fully determined by current code block as well as
+ hierarchy of all its respective parents</para>
</listitem>
<listitem>
- <para>Historical data determined by all previous visited code
- blocks</para>
+ <?xxe-sn 2ahi4rjnvuo 9?>
+
+ <para><?xxe-sn 2ahi4rjnvuo a?>Historical data determined by all previous
+ visited code blocks</para>
</listitem>
</itemizedlist>
- <para>Xreate allows to express Context and reason about it by employing
- block level annotations. See <link
- xlink:href="/w/transcend#code-blocks-and-context">syntax</link>.</para>
+ <para><?xxe-sn 2ahi4rjnvuo b?>Xreate allows to express Context and reason
+ about it by employing block level annotations. See <link
+ xlink:href="/w/transcend#code-blocks-and-context"><?xxe-sn 2ahi4rjnvuo c?>syntax</link>.</para>
<section>
- <title>Examples of Context Usage: Suggestions and Requirements</title>
+ <?xxe-sn 2ahi4rjnvuo d?>
- <programlisting xml:id="Examples_1">//someStringFn = function:: string {...}
+ <title><?xxe-sn 2ahi4rjnvuo e?>Examples of Context Usage: Suggestions and
+ Requirements</title>
+
+ <programlisting xml:id="Examples_1"><?xxe-sn 2ahi4rjnvuo f?>//someStringFn = function:: string {...}
main = function:: string; entry
{
context:: env(utf8).
someStringFn()
}</programlisting>
- <para>Example shows annotation <code>env(utf8)</code> which conveys some
- information about the block thus distinguishing it from the others. It
- allows compiler to apply specific compilation rules for this block.
- Suppose <code>someStringFn</code> has different specializations for
- different environments. Now it's possible to invoke specialization
- tailored for UTF8 environment.</para>
+ <para><?xxe-sn 2ahi4rjnvuo g?>Example shows annotation <code><?xxe-sn 2ahi4rjnvuo h?>env(utf8)</code>
+ which conveys some information about the block thus distinguishing it from
+ the others. It allows compiler to apply specific compilation rules for
+ this block. Suppose <code><?xxe-sn 2ahi4rjnvuo i?>someStringFn</code> has
+ different specializations for different environments. Now it's possible to
+ invoke specialization tailored for UTF8 environment.</para>
- <para>Different story with the next example. Here we want to stipulate
- context properties:</para>
+ <para><?xxe-sn 2ahi4rjnvuo j?>Different story with the next example. Here
+ we want to stipulate context properties:</para>
- <programlisting xml:id="Examples_2">guard:: safe
+ <programlisting xml:id="Examples_2"><?xxe-sn 2ahi4rjnvuo k?>name - "...."
+guard:: safe
{
crucialOperation = function:: int
{0}
}
main = function:: int; entry
{
context:: env(safe).
crucialOperation()
}</programlisting>
- <para>Function <code>crucialOperation</code> has only one specialization
- <code>safe</code> in the example. If context does not provide required
- environment <code>env(safe)</code>compiler can't find appropriate
- specialization and halts with compilation error. This is a way for
- function to express requirements or <emphasis>contract</emphasis> to a
- context it works within.</para>
+ <para><?xxe-sn 2ahi4rjnvuo l?>Function <code><?xxe-sn 2ahi4rjnvuo m?>crucialOperation</code>
+ has only one specialization <code><?xxe-sn 2ahi4rjnvuo n?>safe</code> in
+ the example. If context does not provide required environment
+ <code><?xxe-sn 2ahi4rjnvuo o?>env(safe)</code>compiler can't find
+ appropriate specialization and halts with compilation error. This is a way
+ for function to express requirements or <emphasis><?xxe-sn 2ahi4rjnvuo p?>contract</emphasis>
+ to a context it works within.</para>
</section>
<section>
- <title>Context Propagation</title>
+ <?xxe-sn 2ahi4rjnvuo q?>
+
+ <title><?xxe-sn 2ahi4rjnvuo r?>Context Propagation</title>
- <para>Context of a particular code block contains not only its own
- annotations but also reflects parent blocks as well as previously executed
- blocks. It's achieved by <emphasis>context propagation</emphasis>.</para>
+ <para><?xxe-sn 2ahi4rjnvuo s?>Context of a particular code block contains
+ not only its own annotations but also reflects parent blocks as well as
+ previously executed blocks. It's achieved by <emphasis><?xxe-sn 2ahi4rjnvuo t?>context
+ propagation</emphasis>.</para>
- <para>Context propagation means that nested blocks
- <emphasis>inherit</emphasis> context of parents. Moreover callee
- function's context inherits caller's one. Example:</para>
+ <para><?xxe-sn 2ahi4rjnvuo u?>Context propagation means that nested blocks
+ <emphasis><?xxe-sn 2ahi4rjnvuo v?>inherit</emphasis> context of parents.
+ Moreover callee function's context inherits caller's one. Example:</para>
- <programlisting xml:id="ContextPropagation1">//requires 'safe' context
+ <programlisting xml:id="ContextPropagation1"><?xxe-sn 2ahi4rjnvuo w?>name = "..."
+//requires 'safe' context
guard:: safe
{
crucialOperation = function(a:: int, b::int):: int
{ 0 }
}
test = function:: int; entry {
//blockA
context:: env(safe).
range = [1..10]:: [int].
loop fold(range->x::int, 0->acc):: int {
//blockB
crucialOperation(x, acc) // In the nested scope env(safe) context still accessible
}
} </programlisting>
- <para>This is example of <emphasis>nested scope context
- propagation</emphasis>. It demonstrates availability of a
- <code>env(safe)</code> annotation in the context of the nested block
- <code>blockB</code> despite being declared in <code>blockA</code>.</para>
+ <para><?xxe-sn 2ahi4rjnvuo x?>This is example of <emphasis><?xxe-sn 2ahi4rjnvuo y?>nested
+ scope context propagation</emphasis>. It demonstrates availability of a
+ <code><?xxe-sn 2ahi4rjnvuo z?>env(safe)</code> annotation in the context
+ of the nested block <code><?xxe-sn 2ahi4rjnvuo 10?>blockB</code> despite
+ being declared in <code><?xxe-sn 2ahi4rjnvuo 11?>blockA</code>.</para>
- <para>More complicated case is <emphasis>inter-function context
+ <para><?xxe-sn 2ahi4rjnvuo 12?>More complicated case is
+ <emphasis><?xxe-sn 2ahi4rjnvuo 13?>inter-function context
propagation</emphasis>. It means context propagates through
"caller/callee" relation: callee inherits caller context. The example
below demonstrates this:</para>
- <programlisting xml:id="ContextPropagation2">toSI = function(x:: int):: int
+ <programlisting xml:id="ContextPropagation2"><?xxe-sn 2ahi4rjnvuo 14?>name = "..."
+toSI = function(x:: int):: int
{ 0 }
calculate = function(x:: int):: int
{
y = toSI(x):: int.
y
}
test = function:: int; entry
{
context:: units(millimeters).
calculate(10)
} </programlisting>
- <para>Suppose <code>calculate()</code>works with values measured in
- different units. It normalizes each value by invoking <code>toSI()</code>
- conversion. One approach is to keep unit information for each variable
- independently. But if we know that entire program or a part of it works
- only with specific unit we can register it in a context,
- <code>units(millimeters)</code>in this example, and
- <code>calculate()</code> and its callees inherit context allowing compiler
- to generate code tailored for specific units only.</para>
-
- <para>Context is determined by reasoning over control flow graph of a
- program during compilation. Let's consider example:</para>
-
- <programlisting xml:id="ContextPropagation3">calcInches = function:: int
+ <para><?xxe-sn 2ahi4rjnvuo 15?>Suppose <code><?xxe-sn 2ahi4rjnvuo 16?>calculate()</code>works
+ with values measured in different units. It normalizes each value by
+ invoking <code><?xxe-sn 2ahi4rjnvuo 17?>toSI()</code> conversion. One
+ approach is to keep unit information for each variable independently. But
+ if we know that entire program or a part of it works only with specific
+ unit we can register it in a context, <code><?xxe-sn 2ahi4rjnvuo 18?>units(millimeters)</code>in
+ this example, and <code><?xxe-sn 2ahi4rjnvuo 19?>calculate()</code> and
+ its callees inherit context allowing compiler to generate code tailored
+ for specific units only.</para>
+
+ <para><?xxe-sn 2ahi4rjnvuo 1a?>Context is determined by reasoning over
+ control flow graph of a program during compilation. Let's consider
+ example:</para>
+
+ <programlisting xml:id="ContextPropagation3"><?xxe-sn 2ahi4rjnvuo 1b?>name = "..."
+calcInches = function:: int
{
context:: precision(accurate); units(inches).
calculate()
}
calcMillis = function:: int
{
context:: precision(accurate); units(millimeters).
calculate()
}
calculate = function:: int
{ 0 }</programlisting>
- <para>Client functions <code>calcInches()</code> and
- <code>calcMillis()</code> each define context with a configuration options
- for a main routine <code>calculate()</code>. Unlike in previous example,
- there are several callers with different context here.</para>
-
- <para>In case with several possible control flow paths each introducing
- different context, only path invariant context annotations could be
- determined at compile time. Obviously, annotations that are the same for
- each possible alternative are part of context in any case. It's
- <code>precision(accurate)</code> in the example above, since both client
- function define it. More formally, statically determined context is a
- conjunction of all possible contexts of a given code block.</para>
-
- <para>However the other annotation <code>units(...)</code> differs from
- path to path and can be determined only during runtime. Late Transcend
- functionality is used for this. Context reasoning employing Late Transcend
- called <emphasis>Late Context</emphasis> or <emphasis>Latex</emphasis> for
- short.</para>
+ <para><?xxe-sn 2ahi4rjnvuo 1c?>Client functions <code><?xxe-sn 2ahi4rjnvuo 1d?>calcInches()</code>
+ and <code><?xxe-sn 2ahi4rjnvuo 1e?>calcMillis()</code> each define context
+ with a configuration options for a main routine <code><?xxe-sn 2ahi4rjnvuo 1f?>calculate()</code>.
+ Unlike in previous example, there are several callers with different
+ context here.</para>
+
+ <para><?xxe-sn 2ahi4rjnvuo 1g?>In case with several possible control flow
+ paths each introducing different context, only path invariant context
+ annotations could be determined at compile time. Obviously, annotations
+ that are the same for each possible alternative are part of context in any
+ case. It's <code><?xxe-sn 2ahi4rjnvuo 1h?>precision(accurate)</code> in
+ the example above, since both client function define it. More formally,
+ statically determined context is a conjunction of all possible contexts of
+ a given code block.</para>
+
+ <para><?xxe-sn 2ahi4rjnvuo 1i?>However the other annotation
+ <code><?xxe-sn 2ahi4rjnvuo 1j?>units(...)</code> differs from path to path
+ and can be determined only during runtime. Late Transcend functionality is
+ used for this. Context reasoning employing Late Transcend called
+ <emphasis><?xxe-sn 2ahi4rjnvuo 1k?>Late Context</emphasis> or
+ <emphasis><?xxe-sn 2ahi4rjnvuo 1l?>Latex</emphasis> for short.</para>
</section>
<section>
- <title>Latex (Late Context)</title>
+ <?xxe-sn 2ahi4rjnvuo 1m?>
+
+ <title><?xxe-sn 2ahi4rjnvuo 1n?>Latex (Late Context)</title>
- <para>Static(compile-time) context reasoning is <emphasis>weak</emphasis>
- since it's able to infer only partial context, consisting of properties
- that are true for all possible paths leading in a CFG to a given block.
- Other part consists of set of possible properties that depends on exact
- path in CFG. Such uncertainty possible to resolve during runtime once it's
- known which path is chosen.</para>
+ <para><?xxe-sn 2ahi4rjnvuo 1o?>Static(compile-time) context reasoning is
+ <emphasis><?xxe-sn 2ahi4rjnvuo 1p?>weak</emphasis> since it's able to
+ infer only partial context, consisting of properties that are true for all
+ possible paths leading in a CFG to a given block. Other part consists of
+ set of possible properties that depends on exact path in CFG. Such
+ uncertainty possible to resolve during runtime once it's known which path
+ is chosen.</para>
- <para>It leads to a necessity of having //late context// - context data
- gathered on relevant occasion at runtime to determine right
- decisions.</para>
+ <para><?xxe-sn 2ahi4rjnvuo 1q?>It leads to a necessity of having //late
+ context// - context data gathered on relevant occasion at runtime to
+ determine right decisions.</para>
- <para>However, for any cases it's crucial to consider //possible
- contexts// that is, contexts valid only under certain conditions.</para>
+ <para><?xxe-sn 2ahi4rjnvuo 1r?>However, for any cases it's crucial to
+ consider //possible contexts// that is, contexts valid only under certain
+ conditions.</para>
- <para>Latex approach can be described as follows:</para>
+ <para><?xxe-sn 2ahi4rjnvuo 1s?>Latex approach can be described as
+ follows:</para>
<itemizedlist>
+ <?xxe-sn 2ahi4rjnvuo 1t?>
+
<listitem>
- <para>All possible alternative contexts for the given scope computed
- during compile time used as input for Latex</para>
+ <?xxe-sn 2ahi4rjnvuo 1u?>
+
+ <para><?xxe-sn 2ahi4rjnvuo 1v?>All possible alternative contexts for
+ the given scope computed during compile time used as input for
+ Latex</para>
</listitem>
<listitem>
- <para>All possible paths are numerated and specific latex parameter
- created to keep data about current path.</para>
+ <?xxe-sn 2ahi4rjnvuo 1w?>
+
+ <para><?xxe-sn 2ahi4rjnvuo 1x?>All possible paths are numerated and
+ specific latex parameter created to keep data about current
+ path.</para>
</listitem>
<listitem>
- <para>Late parameter used as guard for Late Transcend facts context
- consists of.</para>
+ <?xxe-sn 2ahi4rjnvuo 1y?>
+
+ <para><?xxe-sn 2ahi4rjnvuo 1z?>Late parameter used as guard for Late
+ Transcend facts context consists of.</para>
</listitem>
</itemizedlist>
- <para>As of now, to convey late context data latex parameter injected into
- function signature as hidden parameter.</para>
+ <para><?xxe-sn 2ahi4rjnvuo 20?>As of now, to convey late context data
+ latex parameter injected into function signature as hidden
+ parameter.</para>
- <programlisting xml:id="Latex1">import raw ("core/control-context.lp").
+ <programlisting xml:id="Latex1"><?xxe-sn 2ahi4rjnvuo 21?>name = "..."
+import raw ("core/control-context.lp").
compute = function:: int
{ 0 }
computeFast = function:: int {
context:: computation(fast).
compute()
}
computePrecisely = function:: int {
context:: computation(precise).
compute()
}
test = function(cmnd:: int):: int; entry {
context:: arithmetic(iee754).
if (cmnd > 0)::int {computePrecisely()} else {computeFast()}
}</programlisting>
- <para>Static scope</para>
+ <para><?xxe-sn 2ahi4rjnvuo 22?>Static scope</para>
- <para/>
+ <para><?xxe-sn 2ahi4rjnvuo 23?></para>
- <programlisting>import raw ("core/control-context.lp")
+ <programlisting><?xxe-sn 2ahi4rjnvuo 24?>name = "..."
+import raw ("core/control-context.lp")
case context:: computation(fast) {
compute = function:: num {
0
}
}
case context:: computation(precise) {
compute = function:: num {
0
}
}
executeComputation= function:: num {
compute()
}
test = function(cmnd:: num):: num; entry {
if (cmnd > 0)::num {
context:: computation(fast).
executeComputation()
} else {
context:: computation(precise).
executeComputation()
}
}</programlisting>
- <para>To sum up, context consists of two complements parts: on the one
- hand //static(early) context// denotes compile time inferences,</para>
+ <para><?xxe-sn 2ahi4rjnvuo 25?>To sum up, context consists of two
+ complements parts: on the one hand //static(early) context// denotes
+ compile time inferences,</para>
- <para>and on the other hand, //late(dynamic) context// denotes annotations
- decided upon at runtime.</para>
+ <para><?xxe-sn 2ahi4rjnvuo 26?>and on the other hand, //late(dynamic)
+ context// denotes annotations decided upon at runtime.</para>
<note>
- <para>Since it is possible to determine number of possible contexts with
- diffent outcome decisions, it is possible to determine least size for
- late context data enough to identify each possible variant. (In example
- above, since there are only two specializons of `compute`, 1 bit is
- enough to convey late context data)</para>
+ <?xxe-sn 2ahi4rjnvuo 27?>
+
+ <para><?xxe-sn 2ahi4rjnvuo 28?>Since it is possible to determine number
+ of possible contexts with diffent outcome decisions, it is possible to
+ determine least size for late context data enough to identify each
+ possible variant. (In example above, since there are only two
+ specializons of `compute`, 1 bit is enough to convey late context
+ data)</para>
</note>
</section>
<section>
- <title>Remarks on late context implementation</title>
+ <?xxe-sn 2ahi4rjnvuo 29?>
+
+ <title><?xxe-sn 2ahi4rjnvuo 2a?>Remarks on late context
+ implementation</title>
- <para/>
+ <para><?xxe-sn 2ahi4rjnvuo 2b?></para>
- <para>To return to a last example, in order to correcly determine
- `compute`'s context it's necessary:</para>
+ <para><?xxe-sn 2ahi4rjnvuo 2c?>To return to a last example, in order to
+ correcly determine `compute`'s context it's necessary:</para>
- <para>After such transformation signature of `executeComputation` looks
- like `executeComputation(__hidden_context_data__)`,</para>
+ <para><?xxe-sn 2ahi4rjnvuo 2d?>After such transformation signature of
+ `executeComputation` looks like
+ `executeComputation(__hidden_context_data__)`,</para>
- <para>where `hidden_context_data` holds data enough to determine within
- `executeComputation` which one of possible contexts it encountered
- with.</para>
+ <para><?xxe-sn 2ahi4rjnvuo 2e?>where `hidden_context_data` holds data
+ enough to determine within `executeComputation` which one of possible
+ contexts it encountered with.</para>
- <para>Consequently, `executeComputation` decides which specialization of
- `compute` should be called based on `hidden_context_data` value.</para>
+ <para><?xxe-sn 2ahi4rjnvuo 2f?>Consequently, `executeComputation` decides
+ which specialization of `compute` should be called based on
+ `hidden_context_data` value.</para>
- <para>Only at run-time there is enough information for
- `executeComputation` to decide what specialization of `compute` to
- call.</para>
+ <para><?xxe-sn 2ahi4rjnvuo 2g?>Only at run-time there is enough
+ information for `executeComputation` to decide what specialization of
+ `compute` to call.</para>
</section>
</chapter>
diff --git a/documentation/communication.xml b/documentation/communication.xml
new file mode 100644
index 0000000..8c945f9
--- /dev/null
+++ b/documentation/communication.xml
@@ -0,0 +1,440 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<chapter version="5.1" xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xila="http://www.w3.org/2001/XInclude/local-attributes"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:trans="http://docbook.org/ns/transclusion"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns:m="http://www.w3.org/1998/Math/MathML"
+ xmlns:html="http://www.w3.org/1999/xhtml"
+ xmlns:db="http://docbook.org/ns/docbook">
+ <?xxe-sn 29tvny21340 1?>
+
+ <title><?xxe-sn 29tvny21340 2?>Communication</title>
+
+ <para><?xxe-sn 2abbls7nbb4 2?>The chapter discusses safe usage of non-local
+ variables, that is variables accessible by different components or threads
+ with global variables as a particular case.</para>
+
+ <section>
+ <?xxe-sn 29xq7jt0wzk 1?>
+
+ <title><?xxe-sn 29xq7jt0wzk 2?>Syntax</title>
+
+ <para><?xxe-sn 29xq7jt0wzk 3?>Annotations:</para>
+
+ <synopsis><?xxe-sn 2afyauuaxvk d?>SYNTAX:
+**commop(send)** (1)
+**commop(receive)** (2)</synopsis>
+
+ <itemizedlist>
+ <?xxe-sn 2afyauuaxvk e?>
+
+ <listitem>
+ <?xxe-sn 2afyauuaxvk f?>
+
+ <para><?xxe-sn 2afyauuaxvk g?>annotation <code><?xxe-sn 2afyauuaxvk h?>(1)</code>
+ marks <code><?xxe-sn 2afyauuaxvk i?>SEND</code> communication
+ event.</para>
+ </listitem>
+
+ <listitem>
+ <?xxe-sn 2afyauuaxvk j?>
+
+ <para><?xxe-sn 2afyauuaxvk k?>annotation <code><?xxe-sn 2afyauuaxvk l?>(2)</code>
+ marks <code><?xxe-sn 2afyauuaxvk m?>RECEIVE</code> communication
+ event.</para>
+ </listitem>
+ </itemizedlist>
+
+ <para><?xxe-sn 2afyauuaxvk n?>Specializations:</para>
+
+ <synopsis><?xxe-sn 2afyauuaxvk o?>SYNTAX:
+**commDirect**
+**commGuarded**</synopsis>
+
+ <para><?xxe-sn 2afyauuaxvk p?>Communication reasoning able to assign
+ following specializations:</para>
+
+ <itemizedlist>
+ <?xxe-sn 2afyauuaxvk q?>
+
+ <listitem>
+ <?xxe-sn 2afyauuaxvk r?>
+
+ <para><?xxe-sn 2afyauuaxvk s?><code><?xxe-sn 2afyauuaxvk t?>commDirect</code>
+ — specialization is expected to provide direct access to raw
+ variable's content.</para>
+ </listitem>
+
+ <listitem>
+ <?xxe-sn 2afyauuaxvk u?>
+
+ <para><?xxe-sn 2afyauuaxvk v?><code><?xxe-sn 2afyauuaxvk w?>commGaurded</code>
+ — specialization is expected to do internal consistency checks at run
+ time.</para>
+ </listitem>
+ </itemizedlist>
+ </section>
+
+ <section>
+ <?xxe-sn 29tvny21340 3?>
+
+ <title><?xxe-sn 29tvny21340 4?>Background</title>
+
+ <para><?xxe-sn 29tvny21340 5?>One of the major concepts that support
+ writing of safe programs is a notion of <emphasis><?xxe-sn 2abbls7nbb4 1?>immutability</emphasis>.
+ Immutability tremendously simplifies many kinds of analyses; using
+ immutable structures is a practical way to write multithreaded
+ applications and has many other benefits beyond that. However in its most
+ basic form it comes with a price of disastrous, in many cases, memory
+ overhead, since property of immutability stipulates for each change of
+ variable to make an independent copy of it occupying different memory
+ region. Unwise using of immutable structures lead to the situation such
+ that CPU is mostly occupied with unnecessary variables copying to and fro
+ as well as with extensive garbage collection, irrelevant of actual
+ algorithm's complexity at hand. Thus it is one of the central highlights
+ of proper programming language design to provide techniques to overcome
+ the shortcomings by relaxing immutability requirements keeping
+ nevertheless safety benefits. There are many ways to approach the problem,
+ and one such technique, namely <emphasis><?xxe-sn 2abbls7nbb4 3?>communication
+ model</emphasis> is discussed next.</para>
+ </section>
+
+ <section>
+ <?xxe-sn 29xq7jt0wzk 5?>
+
+ <title><?xxe-sn 29xq7jt0wzk 6?>Communication Model</title>
+
+ <para><?xxe-sn 29xq7jt0wzk 7?><emphasis><?xxe-sn 2abizkj6e4g 1?>Communication
+ model</emphasis> is a way to capture and express what's going on with
+ variables in a program as well as to define rules that describe valid
+ operations over variables. Within the framework writing value to a
+ variable is viewed as <emphasis><?xxe-sn 29xq7jt0wzk 8?>sending</emphasis>,
+ and conversely reading variable's value is viewed as <emphasis><?xxe-sn 29xq7jt0wzk 9?>receiving</emphasis>.</para>
+
+ <para><?xxe-sn 2abizkj6e4g 2?>Variables that are accessed from different
+ components or threads are referred to as non-local variables. This chapter
+ is focused on a on-local variables, global variables particularly, since
+ exactly for them it's hard to manually check exhaustively where and how
+ they are used in order to catch any errors. It is natural to view them as
+ the means of interaction between different parts of a program, in other
+ words, interaction between sender and receiver, where sender and receiver
+ are different components. The same terms comprise rules that express valid
+ ways of interacting. The abstraction is named <emphasis><?xxe-sn 29xq7jt0wzk a?>communication
+ model</emphasis> due to similarity with the network communication.</para>
+
+ <para><?xxe-sn 29xq7jt0wzk b?>Reasoning based on working with a
+ <emphasis><?xxe-sn 2abizkj6e4g 3?>communication path</emphasis>, i.e chain
+ of <emphasis><?xxe-sn 29xq7jt0wzk c?>communication events</emphasis>(e.g.
+ sending/receiving) occurred during program execution.</para>
+
+ <para><?xxe-sn 2abizkj6e4g 4?>Let's consider small example:</para>
+
+ <programlisting><?xxe-sn 2abizkj6e4g 5?>a = init():: int; comm(send). //(1)
+b = a + 1 :: int; comm(receive). //(2)</programlisting>
+
+ <para><?xxe-sn 2abizkj6e4g 6?>It shows computing of variable
+ <code><?xxe-sn 2abizkj6e4g 7?>b</code>. Variable <code><?xxe-sn 2abizkj6e4g 8?>b</code>
+ depends on <code><?xxe-sn 2abizkj6e4g 9?>a</code> so <code><?xxe-sn 2abizkj6e4g a?>a</code>
+ is calculated first. Variables <code><?xxe-sn 2abizkj6e4g b?>a</code>,
+ <code><?xxe-sn 2abizkj6e4g c?>b</code> are annotated with <code><?xxe-sn 2abizkj6e4g d?>comm(send)</code>
+ and <code><?xxe-sn 2abizkj6e4g e?>comm(receive)</code>, denoting
+ <emphasis><?xxe-sn 2abizkj6e4g f?>sending</emphasis> and
+ <emphasis><?xxe-sn 2abizkj6e4g g?>receiving</emphasis> events,
+ respectively. Communication path in this case is an ordered list
+ <code><?xxe-sn 2abizkj6e4g h?>{<begin>, SEND, RECEIVE,
+ <end>}</code> where <code><?xxe-sn 2abizkj6e4g i?><begin>,
+ <end></code> — are special events that denote first and last events
+ in the path, respectively.</para>
+
+ <para><?xxe-sn 2abizkj6e4g k?>The gist of using communication model is to
+ ensure that <emphasis><?xxe-sn 2abizkj6e4g l?>every sent value is properly
+ received</emphasis>. It relies on the compiler to gather all possible
+ communication paths in the program as an input for processing. There are
+ two supported modes of reasoning:</para>
+
+ <itemizedlist>
+ <?xxe-sn 29xq7jt0wzk d?>
+
+ <listitem>
+ <?xxe-sn 29xq7jt0wzk e?>
+
+ <para><?xxe-sn 29xq7jt0wzk f?>Validation. In this mode all
+ communication paths are checked against communication rules to confirm
+ that the program is valid. Otherwise compilation error is
+ raised.</para>
+ </listitem>
+
+ <listitem>
+ <?xxe-sn 29xq7jt0wzk g?>
+
+ <para><?xxe-sn 29xq7jt0wzk h?>Planning. In this mode reasoning assigns
+ proper implementation for variables in efforts to ensure
+ validity.</para>
+ </listitem>
+ </itemizedlist>
+ </section>
+
+ <section>
+ <?xxe-sn 29xq7jt0wzk j?>
+
+ <title><?xxe-sn 29xq7jt0wzk k?>Validation</title>
+
+ <para><?xxe-sn 29xq7jt0wzk l?>To perform validation, every communication
+ path is checked against number of communication rules that express which
+ communication path are valid. Default behaviour expressed by "every sent
+ value being properly received" produce next possible cases:</para>
+
+ <itemizedlist>
+ <?xxe-sn 29xq7jt0wzk 1w?>
+
+ <listitem>
+ <?xxe-sn 29xq7jt0wzk 1x?>
+
+ <para><?xxe-sn 29xq7jt0wzk 1y?>Valid. Path that consists of pairs of
+ events <code><?xxe-sn 29xq7jt0wzk 1z?>{SEND, RECEIVE}</code> are
+ <emphasis><?xxe-sn 29xq7jt0wzk 20?>valid</emphasis> meaning that each
+ sent value is properly received.</para>
+ </listitem>
+
+ <listitem>
+ <?xxe-sn 29xq7jt0wzk 21?>
+
+ <para><?xxe-sn 29xq7jt0wzk 22?>Undefined and expired value. Paths that
+ have parts <code><?xxe-sn 2abizkj6e4g m?>{<begin>,
+ RECEIVE}</code> or <code><?xxe-sn 2abizkj6e4g n?>{RECEIVE,
+ RECEIVE}</code> are invalid meaning possibly undefined value is
+ received in the first case or duplication i.e. expired value is used
+ in the second's one.</para>
+ </listitem>
+
+ <listitem>
+ <?xxe-sn 2a3uy8rr2f4 5?>
+
+ <para><?xxe-sn 2a3uy8rr2f4 6?>Lost value. Paths that have parts
+ <code><?xxe-sn 2abizkj6e4g o?>{SEND, SEND}</code> or <code><?xxe-sn 2abizkj6e4g p?>{SEND,
+ <end>}</code> indicate possibly lost change since consequent
+ sender replaces value in the former case and sent value is not used at
+ all in the latter case.</para>
+ </listitem>
+ </itemizedlist>
+
+ <para><?xxe-sn 29xq7jt0wzk 28?>Traditional immutability validation is
+ based on the idea that once valid value is valid as long it is unmodified.
+ In this regards communication model can be viewed as an extension and more
+ expressive tool since it also captures <emphasis><?xxe-sn 2afyauuaxvk 3?>value
+ expiration</emphasis> after it was used as well as <emphasis><?xxe-sn 2afyauuaxvk 4?>value</emphasis>
+ <emphasis><?xxe-sn 2afyauuaxvk 5?>loss</emphasis>, if it was not used at
+ all.</para>
+ </section>
+
+ <section>
+ <?xxe-sn 29xq7jt0wzk 29?>
+
+ <title><?xxe-sn 29xq7jt0wzk 2a?>Planning</title>
+
+ <para><?xxe-sn 2abizkj6e4g s?>Reasoning in the communication model aside
+ of performing validation, also assigns appropriate specialization for
+ sending and receiving operations, as appropriate. At the moment there are
+ two specializations the operations are expected to support:</para>
+
+ <itemizedlist>
+ <?xxe-sn 2abizkj6e4g t?>
+
+ <listitem>
+ <?xxe-sn 2abizkj6e4g u?>
+
+ <para><?xxe-sn 2abizkj6e4g v?>Direct. Direct specialization
+ <code><?xxe-sn 2abizkj6e4g w?>commDirect</code> is expected to provide
+ direct access to variable's value. This specialization is assigned in
+ case of fully statically validated communication path.</para>
+ </listitem>
+
+ <listitem>
+ <?xxe-sn 2abizkj6e4g x?>
+
+ <para><?xxe-sn 2abizkj6e4g y?>Guarded. In case if there are possible
+ communication path inconsistencies that can not be completely ruled
+ out at compile time, checking logic should be embedded into compiled
+ code. Specialization <code><?xxe-sn 2abizkj6e4g z?>commGaurded</code>
+ is expected to hold variable state and check usage consistency.</para>
+ </listitem>
+ </itemizedlist>
+ </section>
+
+ <section>
+ <?xxe-sn 2a3uy8rr2f4 8?>
+
+ <title><?xxe-sn 2a3uy8rr2f4 9?>Planning Horizon</title>
+
+ <para><?xxe-sn 2a3uy8rr2f4 a?>Reasoning implements algorithm that is
+ bounded by the maximal path length it can process. The parameter is called
+ <emphasis><?xxe-sn 2a3uy8rr2f4 b?>planning horizon</emphasis>. Any
+ variable that it can not check due to exceedingly large path's length is
+ assigned default implementation <code><?xxe-sn 2abizkj6e4g 10?>commGaurded</code>
+ that performs necessary checks during runtime. Thus the parameter
+ regulates trade off between static analysis extensiveness and runtime
+ checks overhead.</para>
+ </section>
+
+ <section>
+ <?xxe-sn 2a7t1hxqqyo 1?>
+
+ <title><?xxe-sn 2a7t1hxqqyo 2?>Example: Direct Implementation</title>
+
+ <programlisting xml:id="DirImpl_1"><?xxe-sn 2a7t1hxqqyo 3?>name="tests/effects-communication.cpp: Doc_DirImpl", lines=15
+import raw("scripts/dfa/propagation.lp").
+import raw("scripts/dfa/polymorphism.lp").
+import raw("scripts/effects-communication/communication.lp").
+import raw("scripts/effects-communication/config.lp").
+
+CommDirect = type {
+ value:: int
+}.
+
+guard:: commDirect {
+ init = function::CommDirect
+ {
+ {value = 0}
+ }
+
+ read = function(vault1:: CommDirect):: int
+ {
+ (vault1:: *;commop(receive))["value"]
+ }
+
+ write = function(vault2:: CommDirect, valueNew:: int)::CommDirect
+ {
+ (vault2:: *; dfa_pseudo(vault2)) + {value = valueNew}:: int; commop(send); dfa_uppy(vault2)
+ }
+}
+
+main = function::int; entry {
+ x1 = init()::*; dfa_polym(ret).
+ x2 = write(x1, 1)::*; dfa_polym(arg).
+ val = read(x2)::int; dfa_polym(arg).
+ val
+}</programlisting>
+
+ <para><?xxe-sn 2a7t1hxqqyo 4?>In this example, basic workflow is presented
+ in <code><?xxe-sn 2afyauuaxvk 1?>main</code> — the function
+ <code><?xxe-sn 2a7t1hxqqyo 5?>write(x1, 1)</code> is invoked following by
+ invocation of <code><?xxe-sn 2a7t1hxqqyo 6?>read(x2)</code>. Functions
+ <code><?xxe-sn 2afyauuaxvk 9?>write()</code> and <code><?xxe-sn 2afyauuaxvk a?>read()</code>
+ are annotated with <code><?xxe-sn 2afyauuaxvk b?>commop(send)</code> and
+ <code><?xxe-sn 2afyauuaxvk c?>commop(receive)</code> respectively in order
+ to enable communication reasoning. Analyzer gathers and validates observed
+ communication path and since there is no ambiguity, it's possible to
+ assign specialization <code><?xxe-sn 2a7t1hxqqyo 7?>CommDirect</code>
+ allowing direct access to the variables avoiding any additional overhead.
+ Note, there are no any other specializations defined and if reasoning was
+ not enable to conclude that it is the case the compilation error would be
+ raised.</para>
+ </section>
+
+ <section>
+ <?xxe-sn 2a7t1hxqqyo 9?>
+
+ <title><?xxe-sn 2a7t1hxqqyo a?>Example: Guarded Implementation</title>
+
+ <programlisting xml:id="GuardedImpl_1"><?xxe-sn 2a7t1hxqqyo b?>name="tests/effects-communication.cpp: Doc_GuardedImpl", lines=15
+import raw ("scripts/effects-communication/communication.lp").
+import raw ("scripts/dfa/propagation.lp").
+import raw ("scripts/dfa/polymorphism.lp").
+import raw ("scripts/effects-communication/config.lp").
+
+CommState = type variant{Invalid, Valid, Outdated}.
+
+CommDirect = type {
+ value:: int
+}.
+
+CommGuarded = type {
+ value:: int,
+ state:: CommState
+}.
+
+guard:: commDirect {
+ init=function::CommDirect{
+ {value = 0}
+ }
+
+ read= function(vault1:: CommDirect):: int{
+ (vault1::CommDirect; commop(receive))["value"]
+ }
+
+ write= function(vault2:: CommDirect, valueNew1:: int)::CommDirect{
+ (vault2::CommDirect;dfa_pseudo(vault2)) + {value = valueNew1}:: int; commop(send); dfa_uppy(vault2)
+ }
+}
+
+errorRead = function:: int { -1 }
+
+errorWrite = function:: CommGuarded{
+ {
+ value = -1,
+ state = Invalid()
+ }
+}
+
+guard:: commGuarded{
+ init=function::CommGuarded{
+ {
+ value = 0,
+ state = Invalid()
+ }
+ }
+
+ read=function(vault3:: CommGuarded):: int {
+ switch variant (vault3["state"]->whatever::CommState;commop(receive)):: int
+ case (Invalid) { errorRead() }
+ case (Outdated) { errorRead() }
+ case (Valid) { vault3["value"] }
+ }
+
+ write=function(vault4:: CommGuarded, valueNew2:: int)::CommGuarded{
+ switch variant (vault4["state"]->whatever::CommState;commop(send); dfa_pseudo(vault4))::int
+ case (Invalid) {
+ {value = valueNew2, state = Valid()}:: CommGuarded; dfa_uppy(vault4)
+ }
+
+ case (Outdated) {
+ {value = valueNew2, state = Valid()}:: CommGuarded; dfa_uppy(vault4)
+ }
+
+ case (Valid) { errorWrite():: CommGuarded; dfa_uppy(vault4) }
+ }
+}
+
+main=function(cmd:: num)::int; entry {
+ x1 = init():: *; dfa_polym(ret).
+ x2 = write(x1, 1)::*; dfa_polym(arg).
+
+ x3 = if (cmd > 0)::int {
+ y = read(x2):: int; dfa_polym(arg).
+ y
+
+ } else {
+ z = write(x2, 2)::*; dfa_polym(arg).
+ a = read(z):: int; dfa_polym(arg).
+ a
+ }.
+
+ x3
+}</programlisting>
+
+ <para><?xxe-sn 2a7t1hxqqyo d?>Here example of slightly more complicated
+ workflow. Function <code><?xxe-sn 2afyauuaxvk 2?>main</code> contains
+ branching that depends on argument known at run time only. Analyzer is
+ presented with two possible communication paths and one of them(false
+ branch) leads to a possibly lost value for it contains two consequent
+ <code><?xxe-sn 2afyauuaxvk 6?>SEND</code> events. In this situation the
+ analyzer unable to statically validate correctness and assigns
+ specialization <code><?xxe-sn 2afyauuaxvk 7?>commGuarded</code> to embed
+ checking logic into compiled code as an intermediary layer between
+ variable's content and client's code. Implementation <code><?xxe-sn 2afyauuaxvk 8?>commGuarded</code>
+ along with a variable access also tracks the variable status and returns
+ error if the value is inconsistent. </para>
+ </section>
+</chapter>
diff --git a/documentation/exploitation.xml b/documentation/exploitation.xml
index 43ac71c..984d077 100644
--- a/documentation/exploitation.xml
+++ b/documentation/exploitation.xml
@@ -1,487 +1,488 @@
<?xml version="1.0" encoding="UTF-8"?>
<chapter version="5.1" xmlns="http://docbook.org/ns/docbook"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:xila="http://www.w3.org/2001/XInclude/local-attributes"
xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:trans="http://docbook.org/ns/transclusion"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:m="http://www.w3.org/1998/Math/MathML"
xmlns:html="http://www.w3.org/1999/xhtml"
xmlns:db="http://docbook.org/ns/docbook">
<?xxe-sn 26yv439af40 1?>
<title><?xxe-sn 26yv439af40 2?>Exploitation</title>
<para><?xxe-sn 26yv439af40 6?>This chapter discusses <emphasis><?xxe-sn 26yv439af40 7?>exploiting</emphasis>
external resources, such as files, as a particular instance of a
<emphasis><?xxe-sn 26yv439af40 8?>side effects</emphasis> problem that
inevitably stems from an interaction with the outside world. Unlike <link
xlink:href="/w/virtualization"><?xxe-sn 295bzzou9kw 2?>virtualization</link>,
an another documentation's topic that tackles I/O, exploitation approaches
subject from a different angle — it is concerned with an <emphasis><?xxe-sn 26yv439af40 x?>order
of operations</emphasis>, sequence in which different clients jointly use
the same resource and it deals with corresponding difficulties, e.g. ensures
proper resource initialization before actual usage.</para>
<section>
<?xxe-sn 29je46abuev -wunr7fl0rw8v?>
<title><?xxe-sn 29je46abuev -wunr7fl0rw8u?>Syntax</title>
<section>
<?xxe-sn 29je46abuev -wunr7fl0rw8s?>
<title><?xxe-sn 29je46abuev -wunr7fl0rw8r?>Annotations</title>
<synopsis><?xxe-sn 29je46abuev -wunr7fl0rw8q?>SYNTAX:
**use**(//resource-id//)
**init**(//resource-id//)</synopsis>
<itemizedlist>
<?xxe-sn 29je46abuev -wunr7fl0rw8p?>
<listitem>
<?xxe-sn 29je46abuev -wunr7fl0rw8o?>
<para><?xxe-sn 29je46abuev -wunr7fl0rw8n?><emphasis><?xxe-sn 29je46abuev -wunr7fl0rw8m?>resource-id</emphasis>
— user-defined resource identifier</para>
</listitem>
</itemizedlist>
<para><?xxe-sn 29je46abuev -wunr7fl0rw8l?>Annotates function or code
- block as such that exploits resource <emphasis><?xxe-sn 29je46abuev -wunr7fl0rw8k?>resource-id</emphasis>.
- </para>
+ block as such that exploits resource <emphasis><?xxe-sn 29je46abuev -wunr7fl0rw8k?>resource-id</emphasis>.</para>
</section>
<section>
<?xxe-sn 29je46abuev -wunr7fl0rw8j?>
<title><?xxe-sn 29je46abuev -wunr7fl0rw8i?>Guards</title>
<synopsis><?xxe-sn 29je46abuev -wunr7fl0rw8h?>SYNTAX:
**exploitation(init)**
**exploitation(none)**</synopsis>
<para><?xxe-sn 29je46abuev -wunr7fl0rw8g?>Specializations that are
recognized by exploitation reasoning. Each specialization corresponds to
an initialization strategy:</para>
<itemizedlist>
<?xxe-sn 29je46abuev -wunr7fl0rw8f?>
<listitem>
<?xxe-sn 29je46abuev -wunr7fl0rw8e?>
<para><?xxe-sn 29je46abuev -wunr7fl0rw8d?><code><?xxe-sn 29je46abuev -wunr7fl0rw8a?>exploitation(init)</code>
is expected to perform actual resource initialization.</para>
</listitem>
<listitem>
<?xxe-sn 29je46abuev -wunr7fl0rw8c?>
<para><?xxe-sn 29je46abuev -wunr7fl0rw8b?><code><?xxe-sn 29je46abuev -wunr7fl0rw89?>exploitation(none)</code>
is expected to do nothing as initialization isn't necessary or done
- elsewhere. </para>
+ elsewhere.</para>
</listitem>
</itemizedlist>
</section>
</section>
<section>
<?xxe-sn 26yv439af40 3?>
<title><?xxe-sn 26yv439af40 4?>Background</title>
<para><?xxe-sn 26yv439af40 b?>In software engineering, the idea to avoid
side effects have received considerable traction. Indeed, side effects is
something that is hard to take into account and thus programs that have
side effects are inherently unsafe, thus best coding practices are
rightfully suggest to isolate side effects producing code as much as
possible. It's so called pure functional languages whose philosophy goes
even further and frames side effects as something opposite of "pure", and
everything is built around effectless computations to the point that some
languages' design itself includes side effects producing constructs, such
as I/O, as an afterthought, as something almost unnecessary.</para>
<para><?xxe-sn 26yv439af40 c?>However, in reality the opposite is true,
most applications' sole responsibility is to communicate with "outside
world", reacting to the external events and change "world state"
accordingly. As a consequence, side effects usually are the
<emphasis><?xxe-sn 26yv439af40 d?>only</emphasis> important effects the
program produce and surely deserve first class support from a programming
language and justify efforts to develop approach to alleviate related
safety and performance concerns.</para>
</section>
<section>
<?xxe-sn 26yv439af40 z?>
<title><?xxe-sn 26yv439af40 10?>Exploitation Plan</title>
<para><?xxe-sn 26yv439af40 12?>One complexity of taking side effects into
account is the fact that final result depends on an <emphasis><?xxe-sn 28ivhnywem8 1?>exact
operations order</emphasis>. This harshly impacts both performance and
safety, for many techniques, e.g. caching, parallelization can neither be
automatically performed nor validated since they are based on various
degrees of reordering or deal with possibly undetermined beforehand order
of execution.</para>
<para><?xxe-sn 28ivhnywem8 2?>In this chapter, it is assumed, that final
effects of execution fully defined by <emphasis><?xxe-sn 28ivhnywem8 3?>exploitation
path</emphasis> — for a particular code path that can occur during
execution, it is its part consisting of only relevant code blocks., i.e.
those that deal with an exploited resource. Other code blocks do not
influence exploitation effects and so are excluded from consideration.
Thus reasoning about effects is reduced to considering all possible
exploitation paths, checking do they meet certain requirements that define
valid exploitation and making corrections if needed and possible.</para>
<para><?xxe-sn 26yv439af40 13?>Result of the reasoning is called
<emphasis><?xxe-sn 26yv439af40 14?>exploitation plan</emphasis> —
specification that defines exact order and strategy of using a given
resource in order to comply with imposed requirements.</para>
<para><?xxe-sn 26yv439af40 15?>With all above said, the discussed approach
can be presented as follows:</para>
<itemizedlist>
<?xxe-sn 26yv439af40 16?>
<listitem>
<?xxe-sn 26yv439af40 17?>
<para><?xxe-sn 26yv439af40 18?>Annotations are used to express some
aspects of side effects to enable further reasoning. They indicate
code blocks that deal with resource as well as provide additional
information about how exactly it is exploited, e.g. use, initialize or
deinitialize resource.</para>
</listitem>
<listitem>
<?xxe-sn 28ivhnywem8 4?>
<para><?xxe-sn 28ivhnywem8 5?>Existing code paths, extracted during
source code processing, coupled with relevant annotations is enough to
construct all possible exploitation paths and analyze them. Analysis
determines possible(<emphasis><?xxe-sn 295bzzou9kw 3?>weak</emphasis>)
paths that can occur or not during particular execution as well as
certain paths(<emphasis><?xxe-sn 295bzzou9kw 4?>strong</emphasis>)
that occur always no matter what. Also it checks are exploitation
paths valid against certain rules, e.g. initialization occurs always
before actual usage and is it possible to correct invalid
paths.</para>
</listitem>
<listitem>
<?xxe-sn 28ivhnywem8 6?>
<para><?xxe-sn 28ivhnywem8 7?>Reasoning's result is an exploitation
plan that dictates order and strategy of exploitation is presented in
form of appropriate specialization for polymorphic functions that deal
with resources in order to ensure safe exploitation to the extent
based on provided annotations.</para>
</listitem>
<listitem>
<?xxe-sn 26yv439af40 19?>
<para><?xxe-sn 26yv439af40 1a?>Exploitation related side effects are
viewed as a set of additional restrictions over operations order. Only
subset of possible reorders is still valid w.r.t. side effects.
Transcend's task is to find out refined set of valid orders. Thus
techniques that rely on reordering enjoy additional information to
make safe optimizations.</para>
</listitem>
</itemizedlist>
<para><?xxe-sn 26yv439af40 1b?>... and it serves three major goals:</para>
<itemizedlist>
<?xxe-sn 26yv439af40 1c?>
<listitem>
<?xxe-sn 26yv439af40 1d?>
<para><?xxe-sn 26yv439af40 1e?>Safety. Validates existing exploitation
plan or is it possible to safely exploit given resource at all.
Compiler signals error if a given exploitation plan is invalid, i.e.
does not satisfy requirements w.r.t. side effects as expressed by
annotations.</para>
</listitem>
<listitem>
<?xxe-sn 28j5661y0mv -wunr7fl0rw8v?>
<para><?xxe-sn 28j5661y0mv -wunr7fl0rw8u?>Regression Resilience. When
it comes to using external resources, some spurious dependencies
usually occur between otherwise isolated, independent components of a
program. Sometimes refactoring and other code changes break those
dependencies inevitably introducing regressions. Exploitation catches
this sort of regressions and automatically regenerates exploitation
plan suited for a changed conditions.</para>
</listitem>
<listitem>
<?xxe-sn 26yv439af40 1f?>
<para><?xxe-sn 26yv439af40 1g?>Performance. Generated exploitation
plans are optimal in a sense that they cut off superfluous operations,
for example, removing resource initialization in several places if it
can be done safely in a single one, thus reducing overall
overhead.</para>
</listitem>
</itemizedlist>
</section>
<section>
<?xxe-sn 27ay8x1a5mo 1?>
<title><?xxe-sn 27ay8x1a5mo 2?>Domination Analysis</title>
<para><?xxe-sn 27ay8x1a5mo 3?>When it comes to a reasoning about order of
execution flow and possible code paths, crucial vehicle for that is
<emphasis><?xxe-sn 27ay8x1a5mo 4?>domination analysis</emphasis> producing
<emphasis><?xxe-sn 27ay8x1a5mo 5?>dominator tree</emphasis> as an
output.</para>
<para><?xxe-sn 27ay8x1a5mo 6?>Unlike the usual function-bounded domination
analysis, when separate domination tree is produced for each function
defined in a program, Exploitation requires program bound analysis, that
is to take into account control flow across all functions in a program. It
is computationally intensive task to perform analysis over a whole
program, however it is compensated by the fact that Exploitation only
takes into account code blocks that deal with, or in other words, exploit
external resources. Thus there is no necessity to build full dominator
tree, only the relevant parts are constructed, just enough to make sound
exploitation plan decisions.</para>
</section>
<section>
<?xxe-sn 28h47d43thc i?>
<title><?xxe-sn 28h47d43thc j?>Empty Exploitation Plan. Effect Free
Computations</title>
<para><?xxe-sn 28h47d43thc k?>Validation of exploitation path is done
against some predefined constraints. Depending on complexity of a
constraints, i.e. number of different exploitation events that are seeking
for in each path, reasoning goals categorized into several groups:</para>
<itemizedlist>
<?xxe-sn 28j5661y0mv -wunr7fl0rw8t?>
<listitem>
<?xxe-sn 28j5661y0mv -wunr7fl0rw8s?>
<para><?xxe-sn 28j5661y0mv -wunr7fl0rw8r?>Zero Order Exploitation.
Meaning that all paths are checked in terms is there exploitation at
all or no, is there at least a single exploitation event along the
path.</para>
</listitem>
<listitem>
<?xxe-sn 28j5661y0mv -wunr7fl0rw8q?>
<para><?xxe-sn 28j5661y0mv -wunr7fl0rw8p?>First Order Exploitation.
Deals with a situations when it's enough to check only two different
exploitation event occur in a required order. It can be useful for
example, to check whether all resource uses occur after it is
initialized.</para>
</listitem>
<listitem>
<?xxe-sn 28j5661y0mv -wunr7fl0rw8o?>
<para><?xxe-sn 28j5661y0mv -wunr7fl0rw8n?>Higher Order Exploitation.
Expresses constraints involving several(more than two) exploitation
events and relations between them.</para>
</listitem>
</itemizedlist>
<para><?xxe-sn 28j5661y0mv -wunr7fl0rw8m?><emphasis><?xxe-sn 28j5661y0mv -wunr7fl0rw8l?>Empty
Exploitation</emphasis> is an important instance of zero order constraint.
It useful mechanism for developer to annotate function or part of a
program as effect free in terms of exploitation. Thus, efectless, clean or
pure code can be clearly separated from effectfull part and compiler
raises compilation error in case of accidental mixing or using "wrong"
type of code in non appropriate environment.</para>
</section>
<section>
<?xxe-sn 26yv439af40 u?>
<title><?xxe-sn 26yv439af40 v?>Resource Initialization</title>
<para><?xxe-sn 26yv439af40 w?>One important problem related to an
exploitation order is to ensure that a given resource is properly
initialized before its first usage and additionally it is not initialized
more then once during exploitation session. This is instance of first
order exploitation since in a validation mode it is enough to check
exploitation plan to ensure that every resource usage preceded by resource
initialization at some point in the <emphasis><?xxe-sn 28jw0wb6fpc 1?>past</emphasis>,
i.e. previously in the exploitation path.</para>
<para><?xxe-sn 28jw0wb6fpc 2?>For planning mode, the problem is addressed
as follows:</para>
<itemizedlist>
<?xxe-sn 28jw0wb6fpc 3?>
<listitem>
<?xxe-sn 28jw0wb6fpc 4?>
<para><?xxe-sn 28jw0wb6fpc 5?>Central idea of the algorithm is to
consider candidates for initialization only among code blocks that
<emphasis><?xxe-sn 295bzzou9kw 5?>dominate</emphasis> given usage
site. Obviously, initialization in dominating block precedes usage for
any possible code path.</para>
</listitem>
<listitem>
<?xxe-sn 295bzzou9kw 6?>
<para><?xxe-sn 295bzzou9kw 7?>One or more dominator blocks are chosen
for actual initialization in such way that they are cover all found
usage sites.</para>
</listitem>
<listitem>
<?xxe-sn 295bzzou9kw 8?>
<para><?xxe-sn 295bzzou9kw 9?>For code blocks chosen for
initialization specialization <code><?xxe-sn 295bzzou9kw a?>exploitation(init)</code>
is set, for the rest specialization <code><?xxe-sn 295bzzou9kw b?>exploitation(none)</code>
is used.</para>
</listitem>
</itemizedlist>
<para><?xxe-sn 28h47d43thc 1?>Look at the example below:</para>
<programlisting xml:id="ResourceInit_1"><?xxe-sn 28h47d43thc 2?>name="tests/exploitation.cpp: Doc_ResourceInit_1", lines=15
import raw("scripts/cfa/payload.lp").
import raw("scripts/exploitation/exploitation.lp"). //exploitation reasoning
import raw("scripts/exploitation/test1.assembly.lp").
guard:: exploitation(init)
{
openFile = function(filePrev:: FILE_P):: FILE_P; init(file)
{
fopen("/tmp/test", "w")::FILE_P
}
}
guard:: exploitation(none)
{
openFile = function(filePrev:: FILE_P):: FILE_P
{
filePrev::int
}
}
test = function:: int; entry
{
seq
{ f0 = undef:: FILE_P. f0 }
{
//Scope #1:
f1 = openFile(f0):: FILE_P.
f1
}
{ //Scope #2:
f2 = openFile(f1):: FILE_P.
f2
}
{
//Scope #3:
sizeWritten = fwrite("Attempt to write..", 12, 1, f2):: int; use(file).
sizeWritten
}
{
//Scope #4:
fclose(f2):: int; use(file)
}
{ sizeWritten :: int}
}</programlisting>
<para><?xxe-sn 28h47d43thc 3?>There is the function <code><?xxe-sn 28h47d43thc 4?>test</code>
that executes sequentially next commands: open a file(scopes #1, #2),
write some text(scope #3) and finally, close the file(scope #4). It
represents simple work flow with an external resource.</para>
<para><?xxe-sn 28h47d43thc 7?>In order to connect the code to the
exploitation the functions <code><?xxe-sn 28h47d43thc 5?>fwrite</code> and
<code><?xxe-sn 28h47d43thc 6?>fclose</code> in scopes #3 and #4
respectively are annotated with annotation <code><?xxe-sn 295bzzou9kw c?>use(file)</code>.
This information is used by reasoning to look whether it is possible to
initialize given resource before actual usage as well as where and when
exactly to initialize it. Function <code><?xxe-sn 28h47d43thc 9?>openFile</code>
is annotated as <code><?xxe-sn 28h47d43thc a?>init(file)</code> meaning it
<emphasis><?xxe-sn 28h47d43thc b?>can</emphasis> initialize depending on
chosen strategy. The function is invoked both in scope #1 and scope #2.
Both scopes are executed <emphasis><?xxe-sn 28h47d43thc d?>strictly
before</emphasis> scopes #3, #4. Thus it is indeed possible to initialize
resource before usage. Next task for exploitation is to choose correct
exploitation plan, i.e. to assign strategies for all possible
initialization places in the effort to initialize resource only once.
Here, it means that only one invocation of <code><?xxe-sn 28h47d43thc e?>openFile</code>
is assigned with <code><?xxe-sn 28h47d43thc f?>exploitation(init)</code>
to actually initialize the file. Other one is automatically marked with
<code><?xxe-sn 28h47d43thc g?>exploitation(none)</code> to invoke
different specialization of <code><?xxe-sn 28h47d43thc h?>openFile</code>
that does nothing since the files is already initialized.</para>
</section>
</chapter>
<?xxe-revisions
+#12 2019-02-09T15:16:04Z pgess
#11 2019-02-02T13:07:26Z pgess
+1sPEAAABgYUIAAyBhQgAAAQBc4GFCAA=
+
#10 2019-02-01T17:38:23Z pgess
1sPEAAABgYUKAIFE9icACGZQc28yPz5sZWFziRsTC0MIQ2oTC2OCNgECQ4MkU4s0IwcTC2PCVFMF
MyRTFgEDM4kVEwVDCmMJU4I8EwxThHozgVuDDEOBGoMIMwljVVMMQwVTPBMEAQMTBxMGYw5TbUMP
Yx9TLHMQEwcTChMJUxYAiR6YbxmDNI5ygjqDMb5tjjuLSbZOimemdYERpyObYagAiSKDYoJMhH3i
gWejny2BIIFcqCZl6Q6TG4l51AGZa4N5lkeBJZzSBZdFigWdWA==
-
#9 2019-01-26T14:30:18Z pgess
1sPEAAAB9icAUfYlAAEqIGRz0wATB0OBHVMEQxszCBMFQzRTBTMEYwdjgRgTCAEBY4I9MwpDgVxj
m00Ap2mrJoRxiR2ZGo5OijKLeq8mnUlJhCOBG54rgkGBYw==
#8 2019-01-15T20:23:54Z pgess
1sPEAAAB9ioAhCvvEAAlgiWBWTphc3NvY+KAlENzVW5ld2Jyb2tld2lmb3JzIDh0cmlnZ2MzZWRz
hjUTDkNNEwgjBVMPAQFDQVNUAQVjBCMHMwQTBjMIY4wxUwdDgw5jfwEDUwQzihsBAVMiIwVjgRFD
BFNTYwYzgnoTByMGAQFDix3UEwxDCjMGMwxjBVM2YxozBc0TBkMWEyBjbFMJUyVjDhMIMzdji11T
CEMHMxVTBwEFYwSkY4I8kxZTK2OLHFMYM1EBAjOBEhMRUw0TEEOBPUMdMwSTCDMFUwlDBwEEYxET
CUMMUyAzim8zEUMcYwVTIRMSQxozgV1TEZMLAQFjE2MKEwcBBTMEgwxjC1MGYwQzBjMOQ4EbM4FY
UwkTBGMXAQFTD0MIUw5jTSMEEwtTBwEBUwczGpMIQwgzBVMGAQJjgQYTBTMFkwhjBmMHcwVTCYME
UwQzCUODSwCGSj+FZK15XBNPiyyLPJR1hWWUNYNkpX6MOIMfiRmBCIolnGArgTQQdhKbF60ngxKE
KINihiyoLp1okBUHN4hQjnyjB404oSOUH4lodqw8hHBFO4ZOqxeLbIIllBGGCCpGrHyDDC6HLFip
eZ4Bg3iBQYFqhwi+jEQfpVuYPIl8mXqLN4dsin4bj20rhGeZD0++OQWCBYFdllSWf+JYhH8Oymig
CB+BHoFDok6fa5MkgieFGRKBGqJyzHaLRL41cCiqf69yhAWEe4FAcM5PhGACnnsZgT6gNho=
#7 2019-01-15T13:53:13Z pgess
1sPEAAAB7xAAIuoxAAAQDHPREhMKQwRTQBMJExBjmDgAog2uVjCJF4N4hUU=
#6 2019-01-15T11:27:29Z pgess
1sPEAAAB6jIAF+dpAAAKB3PMJBMJQylTmxMAiReKLbtb
#5 2019-01-15T08:04:19Z pgess
1sPEAAAB520AglrYYQAogTF6RGF0aXNvZmluIGxpbVN0bDo6IEMxakRlLCwsaGxsIEluIHNoYWJ1
dHOjSwEDEwYBAiMEAQJDCmMEYwtDTGMFUyIzBzMGEw9TgyxDDxMFYwYTCSMFIwoTBTMKEwkzJgEG
MwQzC1OCV+ETBQEBQ1pjCVMMM0djBgEBY4EBAQFDJVMxEwZjdxMMQy4BA1MJYxJjFjMgYwQTGwEC
YxkBAUMGAQFjBFMGAQODCZMMgywBATMIMwQBBkMEExL5EwdDC0MHYxJDBQECUwSDCVOGCQEDQ4Na
gwkzKVObEwCRFaoCiCekAopDFIULT3MjmUcbgweMEYRHhjqtBLRjhWyRCoRwkXWCKoEaPYFqh32C
W4EahyZxhydMgQJfnjBHgzSFHYs5rTyVBJE+oEODeJFFjn6SK50Al37CmTiVDYJ8kR9Wi06ZMoMu
EoEUnUCXizOGEJeKLY5K
#4 2019-01-14T13:48:02Z pgess
1sPEAAAB2GUAgSjKVwAOVz0zPz5UdHRlc2hvdWxTcnOVKhMWQ4IsEwzdUwUBAWMEUwdjCGMJIwYB
ATMFAQFjBFMIEx9TNVMEMwRjC1MMUxEBBRMEMwkzgl5TCmMLgyBDIwEBY4FMMw0zBFMXM4pXEwUB
AWOgfQCVTSKDNKlVixtjgU2UA4k+mUicDoljFoQumTyORYVtRoN7HZdigjEdkjOBQiyJVjmVRIRC
gQeCUZlRh2Q=
#3 2018-12-24T11:55:39Z pgess
1sPEAAAByiAAglmxQABBgSBxZmxmbWZucmVzdWxpbmRpdmlkZG8gc28sIGJvZ3VzIGdsb2JpcyBs
bCBsQ0ZHNz8+QS04Pz5mb3J3bzk/PnAvPgpzpUkTCwECQx8BAlMZUyUBAmMpM4EjU4IUYwgBBRMF
Mw4TBhMJQwcBB2MMMwQTC0MgMwYzByMPQyVDCwERYwRDBRMFYwUzBEMJUwQTBAEDEwQzB+LWUw4B
A0MKExBzCwEEUwUzBiMMAQEzCFMKYwQTF3MLAQczBFMHAQFDDTMGExRzCwEEQwSDByMPUwRDBRMF
Qw1TKWOCS3MLAQETCAECAIM0DKp5LlmhW4E7gxWgXIJenROObIhji1uHGoNjOIxDiwt0S5NdhiSN
F4xGlnaRBothlSWICkSYHIYbimyXV4I3g3jJhQKEEIIQi1uDJJ8LhCvJjEOBfINCl0GELsmHL8VC
hTySPYYHhl2NPYcQxAE=
#2 2018-12-24T11:20:18Z pgess
1sPEAAABsUAAErE4AAAHBXOwUxMGQ18AqheGSg==
#1 2018-12-18T16:02:30Z pgess
1sPEAAABsT0AMqdsAAIYEm9sc6JqAQITDEMLQwuDIDODMhMLQ2JDFGMLAJhklUuCMJSIGoM0izSB
dIJQ
?>
\ No newline at end of file
diff --git a/pandoctl b/pandoctl
new file mode 100755
index 0000000..61a06bf
--- /dev/null
+++ b/pandoctl
@@ -0,0 +1,13 @@
+#!/bin/bash
+
+case $1 in
+ convert)
+ Name=$(basename $2)
+ sed -e '/<?xxe-revisions/, /?>/ d' -e 's/<?xxe[^?]*?>//g' $2 | \
+ /opt/pandoc/dist/build/pandoc/pandoc \
+ -f docbook \
+ -t ./documentation-tools/doc-converter/remarkup.lua \
+ -o /tmp/docs/$Name.remarkup
+ ;;
+ *) echo "usage: $0 convert <SOURCE-FILE>";;
+esac
diff --git a/potasscoctl b/potasscoctl
new file mode 100755
index 0000000..366a9e3
--- /dev/null
+++ b/potasscoctl
@@ -0,0 +1,39 @@
+#!/bin/bash
+
+SOLVER=/opt/potassco/clingo/build/debug/clingo
+PLOTTER=/opt/dottoxml/src/dottoxml.py
+DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
+
+solve () {
+ #1 - input file
+ OUTPUT=`$SOLVER -n0 $1`
+ echo $OUTPUT | sed 's/.*Answer: 1 \(.*\) SATISFIABLE.*/\1/;s/\ /\n/g'
+}
+
+graph () {
+# 1 - predicate
+# 2 - path
+# 3 - filename
+# 4 - body
+ FILE_DOT=$2/$3.dot
+ FILE_YED=$2/$3.graphml
+ echo 'digraph xxx {' > $FILE_DOT
+ echo "$4" | sed -n /^$1\(/p | sed -E "s/$1\((.*),(.*)\)/\1 -> \2\;/g" >> $FILE_DOT
+ echo '}' >> $FILE_DOT
+ python $PLOTTER $FILE_DOT $FILE_YED
+}
+case $1 in
+ solve)
+ solve $2
+ ;;
+ graph)
+ SOLUTION=`solve $3`
+ OUTPUT_PATH=$(dirname $3)
+ OUTPUT_NAME=$(basename $3)
+ graph $2 $OUTPUT_PATH $OUTPUT_NAME "$SOLUTION"
+ ;;
+ *)
+ echo "usage: $0 solve <SOURCE-FILE>"
+ echo "usage: $0 graph <PREDICATE> <SOURCE-FILE>"
+ ;;
+esac
diff --git a/scripts/effects-communication/communication.lp b/scripts/effects-communication/communication.lp
index ec62f55..3294291 100644
--- a/scripts/effects-communication/communication.lp
+++ b/scripts/effects-communication/communication.lp
@@ -1,121 +1,120 @@
%INPUT:
% const horizon - Max Depth of communication analysis
% comm_order(Alias)), bind(X, comm_alias(Alias) - to apply additional order constraints
% dfa_uppy from dfa-propagation
% INIT
%===========================================================
comm_bind(end, end).
comm_bind(begin, begin).
comm_bind(X, Op):- bind(X, commop(Op)).
% ORDER
%============================================================
-comm_path(X2, X1) :- bind(X2, comm_order(Alias)); bind(X1, comm_alias(Alias)).
+comm_link(X2, X1) :- bind(X2, comm_order(Alias)); bind(X1, comm_alias(Alias)).
% INHERITS
%============================================================
-comm_path(X, Y) :- dfa_uppy(X, Y).
+comm_link(X, Y) :- dfa_uppy(X, Y).
-comm_path(end, X) :- v(X); #sum{1: weak(comm_path(Smth, X)), v(Smth)}0.
-comm_path(X, begin):- v(X); #sum{1: weak(comm_path(X, Smth)), v(Smth)}0.
+comm_link(end, X) :- v(X); #sum{1: weak(comm_link(Smth, X)), v(Smth)}0.
+comm_link(X, begin):- v(X); #sum{1: weak(comm_link(X, Smth)), v(Smth)}0.
% SCAN
%============================================================
%SOURCE
-scan(X, source(X), length(0)) :- comm_bind(X, write).
+comm_scan(X, source(X), length(0)) :- comm_bind(X, send).
-scan(Z, source(X), length(Length + 1)) :-
- comm_path(Z, Y);
- scan(Y, source(X), length(Length)); Length < horizon;
+comm_scan(Z, source(X), length(Length + 1)) :-
+ comm_link(Z, Y);
+ comm_scan(Y, source(X), length(Length)); Length < horizon;
not comm_bind(Z, _).
-scan(Z, source(X), report(Op)) :-
- comm_path(Z, Y);
- scan(Y, source(X), length(Length)); Length < horizon;
+comm_scan(Z, source(X), report(Op)) :-
+ comm_link(Z, Y);
+ comm_scan(Y, source(X), length(Length)); Length < horizon;
comm_bind(Z, Op).
%SINK
-scan(X, sink(X), length(0)) :- comm_bind(X, read).
+comm_scan(X, sink(X), length(0)) :- comm_bind(X, receive).
-scan(Z, sink(X), length(Length + 1)) :-
- comm_path(Y, Z);
- scan(Y, sink(X), length(Length)); Length < horizon;
+comm_scan(Z, sink(X), length(Length + 1)) :-
+ comm_link(Y, Z);
+ comm_scan(Y, sink(X), length(Length)); Length < horizon;
not comm_bind(Z, _).
-scan(Z, sink(X), report(Op)) :-
- comm_path(Y, Z);
- scan(Y, sink(X), length(Length)); Length < horizon;
+comm_scan(Z, sink(X), report(Op)) :-
+ comm_link(Y, Z);
+ comm_scan(Y, sink(X), length(Length)); Length < horizon;
comm_bind(Z, Op).
% REPORTS
%==============================================================
comm_reports_type(rprtLostEnd; rprtLost; rprtCorruptNull; rprtDup; rprtOutOfReach).
-comm_reports(rprtLostEnd , Source, undef) :- scan(_, source(Source), report(end)).
-comm_reports(rprtLost , Source, Spot) :- scan(Spot, source(Source), report(write)).
-comm_reports(rprtCorruptNull, Sink, undef) :- scan(_, sink(Sink), report(begin)).
-comm_reports(rprtDup , Sink, Spot) :- scan(Spot, sink(Sink), report(read)).
+comm_reports(rprtLostEnd , Source, undef) :- comm_scan(_, source(Source), report(end)).
+comm_reports(rprtLost , Source, Spot) :- comm_scan(Spot, source(Source), report(send)).
+comm_reports(rprtCorruptNull, Sink, undef) :- comm_scan(_, sink(Sink), report(begin)).
+comm_reports(rprtDup , Sink, Spot) :- comm_scan(Spot, sink(Sink), report(receive)).
comm_halt(Source):- comm_reports(rprtLostEnd, Source, undef).
comm_halt(Source):- comm_reports(rprtLost, Source, _).
comm_halt(Sink):- comm_reports(rprtCorruptNull, Sink, undef).
comm_halt(Sink):- comm_reports(rprtDup, Sink, Spot).
% WEAK REPORTS
%=============================================================
-weak(comm_reports(rprtLostEnd , Source)) :- weak(scan(_, source(Source), report(end))).
-weak(comm_reports(rprtLost , Source, Spot)) :- weak(scan(Spot, source(Source), report(write))).
-weak(comm_reports(rprtCorruptNull, Sink)) :- weak(scan(_, sink(Sink), report(begin))).
-weak(comm_reports(rprtDup, Sink, Spot)) :- weak(scan(Spot, sink(Sink), report(read))).
+weak(comm_reports(rprtLostEnd , Source)) :- weak(comm_scan(_, source(Source), report(end))).
+weak(comm_reports(rprtLost , Source, Spot)) :- weak(comm_scan(Spot, source(Source), report(send))).
+weak(comm_reports(rprtCorruptNull, Sink)) :- weak(comm_scan(_, sink(Sink), report(begin))).
+weak(comm_reports(rprtDup, Sink, Spot)) :- weak(comm_scan(Spot, sink(Sink), report(receive))).
-comm_reports(rprtOutOfReach, X, Spot) :- weak(scan(Spot, source(X), length(horizon))).
-comm_reports(rprtOutOfReach, X, Spot) :- weak(scan(Spot, sink(X), length(horizon))).
+comm_reports(rprtOutOfReach, X, Spot) :- weak(comm_scan(Spot, source(X), length(horizon))).
+comm_reports(rprtOutOfReach, X, Spot) :- weak(comm_scan(Spot, sink(X), length(horizon))).
% SOLUTIONS
%=============================================================
-comm_impl(Source, commGuarded):- comm_bind(Source, write);
+comm_impl(Source, commGuarded):- comm_bind(Source, send);
not comm_halt(Source);
1{ weak(comm_reports(Type, Source, _)): comm_reports_type(Type) }.
-comm_impl(Source, commDirect):- comm_bind(Source, write);
+comm_impl(Source, commDirect):- comm_bind(Source, send);
not comm_halt(Source);
not comm_impl(Source, commGuarded).
bind(Source, callguard(commDirect)):- comm_impl(Source, commDirect).
bind(Source, callguard(commGuarded)):- comm_impl(Source, commGuarded).
% WEAK ANALYSIS
%=============================================================
-weak(comm_path(X, Y)) :- weak(dfa_uppy(X, Y)).
-weak(scan(Arg1, Arg2, Arg3)) :- scan(Arg1, Arg2, Arg3).
+weak(comm_link(X, Y)) :- weak(dfa_uppy(X, Y)).
+weak(comm_scan(Arg1, Arg2, Arg3)) :- comm_scan(Arg1, Arg2, Arg3).
-weak(scan(Z, sink(X), length(Length + 1))):-
- weak(comm_path(Y, Z));
- weak(scan(Y, sink(X), length(Length))); Length < horizon;
+weak(comm_scan(Z, sink(X), length(Length + 1))):-
+ weak(comm_link(Y, Z));
+ weak(comm_scan(Y, sink(X), length(Length))); Length < horizon;
not comm_bind(Z, _).
-weak(scan(Z, sink(X), report(Op))):-
- weak(comm_path(Y, Z));
- weak(scan(Y, sink(X), length(Length))); Length < horizon;
+weak(comm_scan(Z, sink(X), report(Op))):-
+ weak(comm_link(Y, Z));
+ weak(comm_scan(Y, sink(X), length(Length))); Length < horizon;
comm_bind(Z, Op).
-
-weak(scan(Z, source(X), length(Length + 1))) :-
- weak(comm_path(Z, Y));
- weak(scan(Y, source(X), length(Length))); Length < horizon;
+weak(comm_scan(Z, source(X), length(Length + 1))) :-
+ weak(comm_link(Z, Y));
+ weak(comm_scan(Y, source(X), length(Length))); Length < horizon;
not comm_bind(Z, _).
-weak(scan(Z, source(X), report(Op))) :-
- weak(comm_path(Z, Y));
- weak(scan(Y, source(X), length(Length))); Length < horizon;
+weak(comm_scan(Z, source(X), report(Op))) :-
+ weak(comm_link(Z, Y));
+ weak(comm_scan(Y, source(X), length(Length))); Length < horizon;
comm_bind(Z, Op).
diff --git a/scripts/effects-communication/example1-wr.xreate b/scripts/effects-communication/example1-wr.xreate
index 6d6dc0c..e1f9401 100644
--- a/scripts/effects-communication/example1-wr.xreate
+++ b/scripts/effects-communication/example1-wr.xreate
@@ -1,41 +1,36 @@
//Only Direct implementatino defined
import raw ("scripts/dfa/propagation.lp").
import raw ("scripts/dfa/polymorphism.lp").
import raw ("scripts/effects-communication/communication.lp").
import raw ("scripts/effects-communication/config.lp").
CommGuard = type variant{Invalid, Valid, Outdated}.
CommDirect = type {
- value:: int
-}.
-
-CommGuarded = type {
- value:: int,
- state:: CommGuard
+ value:: int
}.
guard:: commDirect {
- init=function::CommDirect
- {
- {value = 0}
- }
-
- read= function(vault1:: CommDirect):: int
- {
- (vault1:: *;commop(read))["value"]
- }
-
- write= function(vault2:: CommDirect, valueNew:: int)::CommDirect
- {
- (vault2:: *; dfa_pseudo(vault2)) + {value = valueNew}:: int; commop(write); dfa_uppy(vault2)
- }
+ init = function:: CommDirect
+ {
+ {value = 0}
+ }
+
+ read = function(vault1:: CommDirect):: int
+ {
+ (vault1:: *;commop(receive))["value"]
+ }
+
+ write = function(vault2:: CommDirect, valueNew:: int)::CommDirect
+ {
+ (vault2:: *; dfa_pseudo(vault2)) + {value = valueNew}:: int; commop(send); dfa_uppy(vault2)
+ }
}
main=function::int; entry {
- x1 = init()::*; dfa_polym(ret).
- x2 = write(x1, 1)::*; dfa_polym(arg).
- a = read(x2)::int; dfa_polym(arg).
- a
+ x1 = init()::*; dfa_polym(ret).
+ x2 = write(x1, 1)::*; dfa_polym(arg).
+ a = read(x2)::int; dfa_polym(arg).
+ a
}
diff --git a/scripts/effects-communication/example2-wr.xreate b/scripts/effects-communication/example2-wr.xreate
index 7a53acd..1d59688 100644
--- a/scripts/effects-communication/example2-wr.xreate
+++ b/scripts/effects-communication/example2-wr.xreate
@@ -1,76 +1,76 @@
//Direct and Guarded implementation defined
import raw ("scripts/effects-communication/communication.lp").
import raw ("scripts/dfa/propagation.lp").
import raw ("scripts/dfa/polymorphism.lp").
import raw ("scripts/effects-communication/config.lp").
CommGuard = type variant{Invalid, Valid, Outdated}.
CommDirect = type {
value:: int
}.
CommGuarded = type {
value:: int,
state:: CommGuard
}.
guard:: commDirect {
init=function::CommDirect{
{value = 0}
}
read= function(vault1:: CommDirect):: int{
- (vault1::CommDirect; commop(read))["value"]
+ (vault1::CommDirect; commop(receive))["value"]
}
write= function(vault2:: CommDirect, valueNew:: int)::CommDirect{
- (vault2::CommDirect;dfa_pseudo(vault2)) + {value = valueNew}:: int; commop(write); dfa_uppy(vault2)
+ (vault2::CommDirect;dfa_pseudo(vault2)) + {value = valueNew}:: int; commop(send); dfa_uppy(vault2)
}
}
errorRead = function:: int { -1 }
errorWrite = function:: CommGuarded{
{
value = -1,
state = Invalid()
}
}
guard:: commGuarded{
init=function::CommGuarded{
{
value = 0,
state = Invalid()
}
}
read=function(vault3:: CommGuarded):: int {
- switch variant (vault3::CommGuarded;commop(read)):: int
+ switch variant (vault3::CommGuarded;commop(receive)):: int
case (Invalid) { errorRead() }
case (Outdated) { errorRead() }
case (Valid) { vault3["value"] }
}
write=function(vault4:: CommGuarded, valueNew:: int)::CommGuarded{
switch variant (vault4)::int
case (Invalid) {
{value = valueNew, state = Valid()}
}
case (Outdated) {
{value = valueNew, state = Valid()}
}
case (Valid) { errorWrite() }
}
}
main=function::int; entry {
x1 = init():: *; dfa_polym(ret).
x2 = write(x1, 1)::*; dfa_polym(arg).
a = read(x2):: int; dfa_polym(arg).
a
}
diff --git a/scripts/effects-communication/example3-wrwr.xreate b/scripts/effects-communication/example3-wrwr.xreate
index 39f6f89..773ae0e 100644
--- a/scripts/effects-communication/example3-wrwr.xreate
+++ b/scripts/effects-communication/example3-wrwr.xreate
@@ -1,86 +1,84 @@
-//Direct and Guarded implementation defined
-
import raw ("scripts/effects-communication/communication.lp").
import raw ("scripts/dfa/propagation.lp").
import raw ("scripts/dfa/polymorphism.lp").
import raw ("scripts/effects-communication/config.lp").
-CommGuard = type variant{Invalid, Valid, Outdated}.
+CommState = type variant{Invalid, Valid, Outdated}.
CommDirect = type {
value:: int
}.
CommGuarded = type {
value:: int,
- state:: CommGuard
+ state:: CommState
}.
guard:: commDirect {
init=function::CommDirect{
{value = 0}
}
read= function(vault1:: CommDirect):: int{
- (vault1::CommDirect; commop(read))["value"]
+ (vault1::CommDirect; commop(receive))["value"]
}
write= function(vault2:: CommDirect, valueNew1:: int)::CommDirect{
- (vault2::CommDirect;dfa_pseudo(vault2)) + {value = valueNew1}:: int; commop(write); dfa_uppy(vault2)
+ (vault2::CommDirect;dfa_pseudo(vault2)) + {value = valueNew1}:: int; commop(send); dfa_uppy(vault2)
}
}
errorRead = function:: int { -1 }
errorWrite = function:: CommGuarded{
{
value = -1,
state = Invalid()
}
}
guard:: commGuarded{
init=function::CommGuarded{
{
value = 0,
state = Invalid()
}
}
read=function(vault3:: CommGuarded):: int {
- switch variant (vault3["state"]->whatever::CommGuard;commop(read)):: int
+ switch variant (vault3["state"]->whatever::CommState;commop(receive)):: int
case (Invalid) { errorRead() }
case (Outdated) { errorRead() }
case (Valid) { vault3["value"] }
}
write=function(vault4:: CommGuarded, valueNew2:: int)::CommGuarded{
- switch variant (vault4["state"]->whatever::CommGuard;commop(write); dfa_pseudo(vault4))::int
+ switch variant (vault4["state"]->whatever::CommState;commop(send); dfa_pseudo(vault4))::int
case (Invalid) {
{value = valueNew2, state = Valid()}:: CommGuarded; dfa_uppy(vault4)
}
case (Outdated) {
{value = valueNew2, state = Valid()}:: CommGuarded; dfa_uppy(vault4)
}
case (Valid) { errorWrite():: CommGuarded; dfa_uppy(vault4) }
}
}
main=function(cmd:: num)::int; entry {
x1 = init():: *; dfa_polym(ret).
x2 = write(x1, 1)::*; dfa_polym(arg).
x3 = if (cmd > 0)::int {
y = read(x2):: int; dfa_polym(arg).
y
} else {
z = write(x2, 2)::*; dfa_polym(arg).
a = read(z):: int; dfa_polym(arg).
a
}.
x3
}
Event Timeline
Log In to Comment