Bladeren bron

FEAT - Updated oml version to OML2.+

marcioantfilho 6 maanden geleden
commit
838e1941ec
100 gewijzigde bestanden met toevoegingen van 5905 en 0 verwijderingen
  1. 23 0
      .editorconfig
  2. 42 0
      .gitignore
  3. 94 0
      .gitlab-ci.yml
  4. 674 0
      LICENSE
  5. 156 0
      README.md
  6. 1 0
      docs/design/uml_owl_overview.drawio
  7. 1 0
      docs/diagrams/activity_diagram.drawio
  8. 1 0
      docs/diagrams/adapters.drawio
  9. 1 0
      docs/diagrams/ftg_pm_example.drawio
  10. 1 0
      docs/diagrams/ftg_pm_pt_example.drawio
  11. 1 0
      docs/diagrams/low_level_trace.drawio
  12. 765 0
      docs/diagrams/possible_rough_system_design.drawio
  13. 1 0
      docs/diagrams/possible_rough_system_design_extra.drawio
  14. 1 0
      docs/diagrams/simple_car.drawio
  15. 1 0
      docs/diagrams/timed_pt.drawio
  16. 1 0
      docs/diagrams/use_case_1.drawio
  17. 1 0
      docs/diagrams/use_case_2.drawio
  18. 1 0
      docs/diagrams/use_case_3.drawio
  19. 1 0
      docs/diagrams/use_case_3_v2.drawio
  20. 1 0
      docs/diagrams/versioning.drawio
  21. 53 0
      docs/federation_example.md
  22. 41 0
      docs/fuseki/config.ttl
  23. BIN
      docs/fuseki_federated_query.png
  24. 19 0
      docs/models/system/README.md
  25. 1 0
      docs/models/system/system.drawio
  26. BIN
      docs/strategy workflow 2.jpg
  27. BIN
      docs/strategy workflow.jpg
  28. BIN
      docs/virtual data.xopp
  29. BIN
      docs/wiki/context_menu.webm
  30. BIN
      docs/wiki/csv_selection.png
  31. BIN
      docs/wiki/drawio_interface.png
  32. BIN
      docs/wiki/enact.png
  33. BIN
      docs/wiki/model_saving.webm
  34. BIN
      docs/wiki/open.png
  35. BIN
      docs/wiki/plugin.png
  36. BIN
      docs/wiki/save.png
  37. BIN
      docs/wiki/shapes.png
  38. 25 0
      ontology/README.md
  39. 24 0
      ontology/car_oml_demo/.fuseki.ttl
  40. 293 0
      ontology/car_oml_demo/build.gradle
  41. 5 0
      ontology/car_oml_demo/catalog.xml
  42. 5 0
      ontology/car_oml_demo/src/oml/ontology.rys.one/project/description/bundle.oml
  43. 26 0
      ontology/car_oml_demo/src/oml/ontology.rys.one/project/description/cars.oml
  44. 7 0
      ontology/car_oml_demo/src/oml/ontology.rys.one/project/vocabulary/bundle.oml
  45. 73 0
      ontology/car_oml_demo/src/oml/ontology.rys.one/project/vocabulary/car.oml
  46. 124 0
      ontology/car_oml_demo/src/shacl/example.ttl
  47. 162 0
      ontology/car_oml_demo/src/shacl/validation.ttl
  48. 7 0
      ontology/car_oml_demo/src/sparql/cars.sparql
  49. 7 0
      ontology/car_oml_demo/src/sparql/compositions.sparql
  50. 7 0
      ontology/car_oml_demo/src/sparql/whichwinter.sparql
  51. 24 0
      ontology/car_simple/.fuseki.ttl
  52. 40 0
      ontology/car_simple/.project
  53. 238 0
      ontology/car_simple/build.gradle
  54. 5 0
      ontology/car_simple/catalog.xml
  55. 9 0
      ontology/car_simple/src/oml/ua.be/simple_car/description/bundle.oml
  56. 43 0
      ontology/car_simple/src/oml/ua.be/simple_car/description/definitions.oml
  57. 56 0
      ontology/car_simple/src/oml/ua.be/simple_car/description/requirements.oml
  58. 97 0
      ontology/car_simple/src/oml/ua.be/simple_car/description/structuralModels.oml
  59. 11 0
      ontology/car_simple/src/oml/ua.be/simple_car/description/systems.oml
  60. 101 0
      ontology/car_simple/src/oml/ua.be/simple_car/description/traces.oml
  61. 113 0
      ontology/car_simple/src/oml/ua.be/simple_car/description/workflows.oml
  62. 102 0
      ontology/car_simple/src/shacl/shacl.ttl
  63. 33 0
      ontology/car_simple/src/sparql/query.ttl
  64. 24 0
      ontology/cdf/.fuseki.ttl
  65. 40 0
      ontology/cdf/.project
  66. 7 0
      ontology/cdf/README.md
  67. 5 0
      ontology/cdf/catalog.xml
  68. 8 0
      ontology/cdf/src/oml/flandersmake.be/cdf/description/bundle.oml
  69. 856 0
      ontology/cdf/src/oml/flandersmake.be/cdf/description/my_drawio.oml
  70. 43 0
      ontology/cdf/src/oml/flandersmake.be/cdf/description/my_ftg.oml
  71. 38 0
      ontology/cdf/src/oml/flandersmake.be/cdf/description/my_pm.oml
  72. 57 0
      ontology/cdf/src/oml/flandersmake.be/cdf/description/my_pm2.oml
  73. 47 0
      ontology/cdf/src/oml/flandersmake.be/cdf/description/my_statechart.oml
  74. 199 0
      ontology/cdf/src/oml/flandersmake.be/cdf/description/my_xopp.oml
  75. 34 0
      ontology/cdf/src/oml/flandersmake.be/cdf/vocabulary/acyclic.oml
  76. 12 0
      ontology/cdf/src/oml/flandersmake.be/cdf/vocabulary/bundle.oml
  77. 59 0
      ontology/cdf/src/oml/flandersmake.be/cdf/vocabulary/class_diagram.oml
  78. 25 0
      ontology/cdf/src/oml/flandersmake.be/cdf/vocabulary/dict.oml
  79. 229 0
      ontology/cdf/src/oml/flandersmake.be/cdf/vocabulary/drawio.oml
  80. 40 0
      ontology/cdf/src/oml/flandersmake.be/cdf/vocabulary/ftg.oml
  81. 15 0
      ontology/cdf/src/oml/flandersmake.be/cdf/vocabulary/immutable.oml
  82. 37 0
      ontology/cdf/src/oml/flandersmake.be/cdf/vocabulary/object_diagram.oml
  83. 40 0
      ontology/cdf/src/oml/flandersmake.be/cdf/vocabulary/ordered.oml
  84. 119 0
      ontology/cdf/src/oml/flandersmake.be/cdf/vocabulary/pm.oml
  85. 79 0
      ontology/cdf/src/oml/flandersmake.be/cdf/vocabulary/pt.oml
  86. 78 0
      ontology/cdf/src/oml/flandersmake.be/cdf/vocabulary/statechart.oml
  87. 16 0
      ontology/cdf/src/oml/flandersmake.be/cdf/vocabulary/versioned.oml
  88. 137 0
      ontology/cdf/src/oml/flandersmake.be/cdf/vocabulary/xopp.oml
  89. 7 0
      ontology/cdf/src/sparql/GetAncestors.sparql
  90. 12 0
      ontology/cdf/src/sparql/GetFields.sparql
  91. 8 0
      ontology/cdf/src/sparql/GetFormalisms.sparql
  92. 9 0
      ontology/cdf/src/sparql/GetInputsOfT1.sparql
  93. 6 0
      ontology/cdf/src/sparql/GetLinks.sparql
  94. 8 0
      ontology/cdf/src/sparql/GetModels.sparql
  95. 6 0
      ontology/cdf/src/sparql/GetObjects.sparql
  96. 10 0
      ontology/cdf/src/sparql/GetObjectsOfPM12.sparql
  97. 6 0
      ontology/cdf/src/sparql/GetTransitions.sparql
  98. 24 0
      ontology/drivetrain/.fuseki.ttl
  99. 46 0
      ontology/drivetrain/.project
  100. 0 0
      ontology/drivetrain/README.md

+ 23 - 0
.editorconfig

@@ -0,0 +1,23 @@
+root = true
+
+[*]
+charset = utf-8
+end_of_line = lf
+insert_final_newline = true
+trim_trailing_whitespace = true
+
+[*.{py,rst,ini,oml,gradle}]
+indent_style = space
+indent_size = 4
+
+[*.{html,css,scss,json,yml,svg,xml,ttl}]
+indent_style = space
+indent_size = 2
+max_line_length = 140
+
+[*.md]
+trim_trailing_whitespace = false
+
+[*.project]
+indent_style = space
+indent_size = 2

+ 42 - 0
.gitignore

@@ -0,0 +1,42 @@
+# Eclipse cruft
+*.jar
+*.war
+*.ear
+*.class
+
+.metadata
+bin
+tmp
+*.tmp
+*.bak
+*.swp
+.classpath
+.settings
+.loadpath
+.externalToolBuilders
+*.launch
+.gradle
+build
+local.properties
+
+# Arek cruft
+tasks.py
+
+# Fuseki - everything except .fuseki/run/shiro.ini:
+**/.fuseki/webapp/
+**/.fuseki/run/backups/
+**/.fuseki/run/configuration/
+**/.fuseki/run/databases/
+**/.fuseki/run/logs/
+**/.fuseki/run/system/
+**/.fuseki/run/system_files/
+**/.fuseki/run/templates/
+**/.fuseki/run/config.ttl
+fuseki.log
+fuseki.pid
+
+# JetBrains
+.idea
+
+# Apple
+/.DS_Store

+ 94 - 0
.gitlab-ci.yml

@@ -0,0 +1,94 @@
+image: docker:23.0.5
+
+variables:
+  DOCKER_DRIVER: overlay2
+  DOCKER_TLS_CERTDIR: "/certs"
+  DOCKER_HOST: tcp://docker:2376
+  OUTLIERS_DOCKER_SHA: $CI_REGISTRY_IMAGE/outliers:$CI_COMMIT_SHA
+  OUTLIERS_DOCKER_BRANCH: $CI_REGISTRY_IMAGE/outliers:$CI_COMMIT_REF_NAME
+  OUTLIERS_DOCKER_TAG: $CI_REGISTRY_IMAGE/outliers:$CI_COMMIT_TAG
+  OUTLIERS_DOCKER_LATEST: $CI_REGISTRY_IMAGE/outliers:latest
+
+services:
+  - docker:23.0.5-dind
+
+stages:
+  - build
+  - release
+
+before_script:
+  - docker info
+  - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
+
+build-outliers:
+  stage: build
+  script:
+    - docker pull $OUTLIERS_DOCKER_BRANCH || true
+    - docker build --cache-from $OUTLIERS_DOCKER_BRANCH -f ./tools/typeOperations/Dockerfile --tag $OUTLIERS_DOCKER_BRANCH ./tools/typeOperations
+    - docker push $OUTLIERS_DOCKER_BRANCH
+  rules:
+    - if: $CI_COMMIT_TAG || $CI_COMMIT_BRANCH == "main"
+    - if: $CI_PIPELINE_SOURCE == "push" || $CI_COMMIT_BRANCH == "dev"
+      when: manual
+      allow_failure: true
+
+build-tagged-outliers:
+  stage: build
+  script:
+    # Create container tagged as 'latest'
+    - docker pull $OUTLIERS_DOCKER_BRANCH || true
+    - docker tag $OUTLIERS_DOCKER_BRANCH $OUTLIERS_DOCKER_LATEST
+    - docker push $OUTLIERS_DOCKER_LATEST
+    # Create image tagged with tag
+    - docker tag $OUTLIERS_DOCKER_BRANCH $OUTLIERS_DOCKER_TAG
+    - docker push $OUTLIERS_DOCKER_TAG
+  rules:
+    - if: $CI_COMMIT_TAG
+    - if: $CI_PIPELINE_SOURCE == "push" || $CI_COMMIT_BRANCH == "dev"
+      when: manual
+      allow_failure: true
+
+build-ontology:
+  image: gradle:8.1.1
+  stage: build
+  before_script:
+    - ''
+  script:
+    - TOP="$(pwd)"
+    - GRADLE_USER_HOME="$(pwd)/.gradle"
+    - export GRADLE_USER_HOME
+    - echo $TOP
+    - echo $GRADLE_USER_HOME
+    - apt-get update && apt-get -y install python3-pip && rm -rf /var/lib/apt/lists/*
+    - python3 -m pip install bikeshed pyshacl
+    - cd examples/oml/SystemDesignOntology2Layers
+    - gradle build
+    #- gradle startFuseki
+    #- gradle owlQuery
+    #- gradle owlReason
+    #- gradle owlShacl
+    #- gradle generateDocs
+    #- gradle stopFuseki
+    #- gradle publishToMavenLocal
+    #- gradle publish
+    #- cd $TOP/examples/oml/Drivetrain
+    #- gradle build
+    #- gradle publishToMavenLocal
+    #- gradle publish
+  cache:
+    key: "$CI_COMMIT_REF_NAME"
+    policy: push
+    paths:
+      - examples/oml/SystemDesignOntology2Layers/build
+      #- examples/oml/Drivetrain/build
+      - .gradle
+  artifacts:
+    paths:
+      - examples/oml/SystemDesignOntology2Layers/build
+      #- examples/oml/Drivetrain/build
+      - ~/.m2
+  rules:
+    - if: $CI_COMMIT_BRANCH == "main"
+    - if: $CI_PIPELINE_SOURCE == "push" || $CI_COMMIT_BRANCH == "dev"
+      when: manual
+      allow_failure: true

+ 674 - 0
LICENSE

@@ -0,0 +1,674 @@
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<https://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<https://www.gnu.org/licenses/why-not-lgpl.html>.

+ 156 - 0
README.md

@@ -0,0 +1,156 @@
+# Digital Twin Design
+
+Design documents and prototypes for traceable digital twin representations.
+
+The project follows a simple structure.
+
+    .
+    ├── docs       
+    │   ├── design         Overall design of the digital twin, high level diagrams.
+    │   ├── diagrams       
+    │   └── models         
+    ├── examples           
+    │   └── oml            
+    └── tools              Utilities aimed to aid in the design of ontologies.
+        ├── oml-generators 
+        └── draw           Draw.io plugins for writing FTG+PM++ and UML models.
+
+## Diagrams
+
+The diagrams used throughout this project are either [diagrams.net][drawio] files or [sprotty][sprotty] images.
+To create the FTG+PM++ diagrams [a plugin][ftgpm-plugin] is required. We host [a version with the plugin pre-installed][draw-rys].
+
+## OML Subprojects
+
+There are four projects under the `examples/oml` group. These are all [opencaesar OML][oml] DSL ontologies.
+Each project presents a gradle build file. Using these build files you can convert the OML into OWL and even run a Fuseki endpoint.
+The fuseki endpoint listens at `http://localhost:3030/`.
+
+## Concepts
+
+### Traceability
+
+| Concept                | Explanation                                                         |
+|------------------------|---------------------------------------------------------------------|
+|Horizontal Traceability | Traceability between the FTG, the PM, and the PT.                   |
+|Vertical Traceability   | Traceability between versions of artifacts.                         |
+|Federation              | Orchestration + adaptation.                                         |
+|Orchestration           | Sending data/requests to the correct endpoint.                      |
+|Adaptation              | Converting heterogeneous files to their ontological representation. |
+
+NOTE: Add some information about services.
+
+### Drivetrain
+
+- [Use case 1][use-case-1]: Update drivetrain model with increasing complexity.
+- [Use case 2][use-case-2]: Calibrate drivetrain sensors.
+- [Use case 3][use-case-3]: Measuring data and checking for outliers.
+
+### Federation
+
+We aim to provide transparent federation. Not only for data queries but also services.
+The data can be quite large. We want to allow the user to query this data and perform any neccessary operations without impacting the KG.
+This prevents us from ingesting all the data. Some of it will need to be accessed on demand.
+One negative is that this prevents reasoning on the data instances but this is not the main purpose of the data.
+The reasoning should still be possible on the larger group of types.
+
+One possible way of achieving this is by using virtual data.
+Operations can be applied to this data by encoding them into the models.
+The data itself is never ingested into the KG.
+
+#### Orchestration
+
+A query which requires data from two sources:
+
+                        /------ endpoint A
+    query ----- fuseki <
+                        \------ endpoint B
+
+Some ideas for implementing this are:
+
+1. Create a mapper on the ontology level with a service which gets called to federate the data.
+2. Add fuseki modules which act like middleware and grab the needed resources.
+3. Use the included ARQ functionality.
+
+#### ARQ
+
+Fuseki uses ARQ which allows us to create queries which depend on other SPARQL endpoints.
+
+        PREFIX owl: <http://www.w3.org/2002/07/owl#>
+        PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
+
+        SELECT DISTINCT ?class ?label
+        WHERE {
+          ?class a owl:Class.
+          SERVICE <https://fuseki.rys.app/labels> { 
+            ?class rdfs:label ? label 
+          }
+        }
+
+The [federation example readme][federation-readme] goes into more detail on this concept.
+
+#### Adaptation
+
+Adaptation confers data ingestion. The data is stored in heterogeneous formats.
+For convenience’s sake we'll use CSV as an example of one such a data format.
+To solve this problem a translation layer needs to be put in place.
+Options include converting the CSV to rdf/owl using RML.
+This however, poses another problem. The ontology is designed using the OML domain specific language.
+We will lose traceability between the OML and the instances. 
+There is also the problem of properly splitting the data and still being able to refer to it using OML concepts.
+
+A few possible solutions exist.
+For one, we can create a custom mapper and create OML directly from CSVs. 
+This has the benefit of creating these instances on the same level as the types.
+This approach however does not scale and needs to be performed on the whole CSV. 
+We cannot stream only the part of the data which is required for a query.
+
+Another option is to keep using RML and adapt the ontology.
+RML already addresses remote file access and a new version is in the works which should support the generic ontology structure which we currently use.
+A streaming version of the RML mapper is available. We've yet to test this.
+
+### CRUD
+
+Moving the dataset into the database can be done in a few ways.
+
+1. Through the GUI.
+2. By performing create operations on the endpoint.
+3. Through file operations.
+
+When using Fuseki we have access to services to read and write to the database.
+This makes it possible to query and update using SPARQL or the Graph Store Protocol.
+
+SPARQL queries such as this one which selects all the available classes can be used.
+
+    PREFIX owl: <http://www.w3.org/2002/07/owl#>
+    PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
+    
+    SELECT DISTINCT ?class ?label ?description
+    WHERE {
+      ?class a owl:Class.
+      OPTIONAL { ?class rdfs:label ?label }
+      OPTIONAL { ?class rdfs:comment ?description }
+    }
+    LIMIT 25
+
+## Setting up the project
+
+You need a few things to get the project working.
+I am lazy so this is what I did:
+
+    curl -s "https://get.sdkman.io" | bash 
+    sdk install gradle 8.0.1
+    cd "examples/omlSystemDesignOntology2Layers" && gradle clean && gradle build && gradle publishToMavenLocal
+    cd "examples/Drivetrain" && gradle clean && gradle build && gradle publishToMavenLocal
+
+Your mileage may vary.
+
+[oml]: http://www.opencaesar.io/oml/
+[drawio]: https://app.diagrams.net/
+[sprotty]: https://projects.eclipse.org/projects/ecd.sprotty
+[ftgpm-plugin]: https://msdl.uantwerpen.be/git/jexelmans/drawio/raw/master/src/main/webapp/myPlugins/ftgpm.js
+[draw-rys]: https://draw.rys.app/
+[use-case-1]: ./docs/diagrams/use_case_1.drawio
+[use-case-2]: ./docs/diagrams/use_case_2.drawio
+[use-case-3]: ./docs/diagrams/use_case_3.drawio
+[federation-readme]: ./docs/federation_example.md

File diff suppressed because it is too large
+ 1 - 0
docs/design/uml_owl_overview.drawio


File diff suppressed because it is too large
+ 1 - 0
docs/diagrams/activity_diagram.drawio


File diff suppressed because it is too large
+ 1 - 0
docs/diagrams/adapters.drawio


File diff suppressed because it is too large
+ 1 - 0
docs/diagrams/ftg_pm_example.drawio


File diff suppressed because it is too large
+ 1 - 0
docs/diagrams/ftg_pm_pt_example.drawio


File diff suppressed because it is too large
+ 1 - 0
docs/diagrams/low_level_trace.drawio


+ 765 - 0
docs/diagrams/possible_rough_system_design.drawio

@@ -0,0 +1,765 @@
+<mxfile host="Electron" modified="2022-09-16T13:06:52.339Z" agent="5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/19.0.3 Chrome/102.0.5005.63 Electron/19.0.3 Safari/537.36" etag="5xmkpNPJBKjpA7kd7IVC" compressed="false" version="19.0.3" type="device">
+  <diagram id="C5RBs43oDa-KdzZeNtuy" name="Page-1">
+    <mxGraphModel dx="3197" dy="1442" grid="0" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
+      <root>
+        <mxCell id="WIyWlLk6GJQsqaUBKTNV-0" />
+        <mxCell id="WIyWlLk6GJQsqaUBKTNV-1" parent="WIyWlLk6GJQsqaUBKTNV-0" />
+        <mxCell id="Zwut1nPrnqomn3oBaotf-125" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=openThin;endFill=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="zkfFHV4jXpPFQw0GAbJ--0" target="Zwut1nPrnqomn3oBaotf-94" edge="1">
+          <mxGeometry relative="1" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-128" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=openThin;endFill=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="zkfFHV4jXpPFQw0GAbJ--0" target="Zwut1nPrnqomn3oBaotf-115" edge="1">
+          <mxGeometry relative="1" as="geometry" />
+        </mxCell>
+        <mxCell id="zkfFHV4jXpPFQw0GAbJ--0" value="Activity" style="swimlane;fontStyle=0;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
+          <mxGeometry x="220" y="120" width="160" height="164" as="geometry">
+            <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="zkfFHV4jXpPFQw0GAbJ--1" value="description" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="zkfFHV4jXpPFQw0GAbJ--0" vertex="1">
+          <mxGeometry y="26" width="160" height="26" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-124" value="duration" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="zkfFHV4jXpPFQw0GAbJ--0" vertex="1">
+          <mxGeometry y="52" width="160" height="26" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-126" value="startTime" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="zkfFHV4jXpPFQw0GAbJ--0" vertex="1">
+          <mxGeometry y="78" width="160" height="26" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-127" value="stopTime" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="zkfFHV4jXpPFQw0GAbJ--0" vertex="1">
+          <mxGeometry y="104" width="160" height="26" as="geometry" />
+        </mxCell>
+        <mxCell id="zkfFHV4jXpPFQw0GAbJ--4" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" parent="zkfFHV4jXpPFQw0GAbJ--0" vertex="1">
+          <mxGeometry y="130" width="160" height="8" as="geometry" />
+        </mxCell>
+        <mxCell id="zkfFHV4jXpPFQw0GAbJ--5" value="validate" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="zkfFHV4jXpPFQw0GAbJ--0" vertex="1">
+          <mxGeometry y="138" width="160" height="26" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-129" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=openThin;endFill=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="zkfFHV4jXpPFQw0GAbJ--17" target="zkfFHV4jXpPFQw0GAbJ--0" edge="1">
+          <mxGeometry relative="1" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-177" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=open;endFill=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="zkfFHV4jXpPFQw0GAbJ--17" target="Zwut1nPrnqomn3oBaotf-111" edge="1">
+          <mxGeometry relative="1" as="geometry" />
+        </mxCell>
+        <mxCell id="zkfFHV4jXpPFQw0GAbJ--17" value="Artefact" style="swimlane;fontStyle=0;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
+          <mxGeometry x="508" y="120" width="160" height="216" as="geometry">
+            <mxRectangle x="550" y="140" width="160" height="26" as="alternateBounds" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="zkfFHV4jXpPFQw0GAbJ--21" value="description" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" parent="zkfFHV4jXpPFQw0GAbJ--17" vertex="1">
+          <mxGeometry y="26" width="160" height="26" as="geometry" />
+        </mxCell>
+        <mxCell id="zkfFHV4jXpPFQw0GAbJ--23" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" parent="zkfFHV4jXpPFQw0GAbJ--17" vertex="1">
+          <mxGeometry y="52" width="160" height="8" as="geometry" />
+        </mxCell>
+        <mxCell id="zkfFHV4jXpPFQw0GAbJ--25" value="version" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="zkfFHV4jXpPFQw0GAbJ--17" vertex="1">
+          <mxGeometry y="60" width="160" height="26" as="geometry" />
+        </mxCell>
+        <mxCell id="zkfFHV4jXpPFQw0GAbJ--26" value="" style="endArrow=openThin;shadow=0;strokeWidth=1;rounded=0;endFill=0;edgeStyle=elbowEdgeStyle;elbow=vertical;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="zkfFHV4jXpPFQw0GAbJ--0" target="zkfFHV4jXpPFQw0GAbJ--17" edge="1">
+          <mxGeometry x="0.5" y="41" relative="1" as="geometry">
+            <mxPoint x="380" y="192" as="sourcePoint" />
+            <mxPoint x="540" y="192" as="targetPoint" />
+            <mxPoint x="-40" y="32" as="offset" />
+            <Array as="points">
+              <mxPoint x="444" y="187" />
+            </Array>
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-131" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="Zwut1nPrnqomn3oBaotf-1" target="zkfFHV4jXpPFQw0GAbJ--0" edge="1">
+          <mxGeometry relative="1" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-1" value="Artificial Data Generator" style="swimlane;fontStyle=0;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
+          <mxGeometry x="147" y="618" width="160" height="138" as="geometry">
+            <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-4" value="description" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" parent="Zwut1nPrnqomn3oBaotf-1" vertex="1">
+          <mxGeometry y="26" width="160" height="26" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-5" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" parent="Zwut1nPrnqomn3oBaotf-1" vertex="1">
+          <mxGeometry y="52" width="160" height="8" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-6" value=" " style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="Zwut1nPrnqomn3oBaotf-1" vertex="1">
+          <mxGeometry y="60" width="160" height="26" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-132" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="Zwut1nPrnqomn3oBaotf-11" target="zkfFHV4jXpPFQw0GAbJ--0" edge="1">
+          <mxGeometry relative="1" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-11" value="Artificial Sensor Data" style="swimlane;fontStyle=0;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
+          <mxGeometry x="317" y="618" width="160" height="138" as="geometry">
+            <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-12" value="description" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" parent="Zwut1nPrnqomn3oBaotf-11" vertex="1">
+          <mxGeometry y="26" width="160" height="26" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-13" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" parent="Zwut1nPrnqomn3oBaotf-11" vertex="1">
+          <mxGeometry y="52" width="160" height="8" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-14" value=" " style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="Zwut1nPrnqomn3oBaotf-11" vertex="1">
+          <mxGeometry y="60" width="160" height="26" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-133" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="Zwut1nPrnqomn3oBaotf-15" target="zkfFHV4jXpPFQw0GAbJ--17" edge="1">
+          <mxGeometry relative="1" as="geometry">
+            <Array as="points">
+              <mxPoint x="917" y="383" />
+              <mxPoint x="588" y="383" />
+            </Array>
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-15" value="Assumption" style="swimlane;fontStyle=0;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
+          <mxGeometry x="837" y="431" width="160" height="138" as="geometry">
+            <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-16" value="description" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" parent="Zwut1nPrnqomn3oBaotf-15" vertex="1">
+          <mxGeometry y="26" width="160" height="26" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-17" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" parent="Zwut1nPrnqomn3oBaotf-15" vertex="1">
+          <mxGeometry y="52" width="160" height="8" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-18" value=" " style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="Zwut1nPrnqomn3oBaotf-15" vertex="1">
+          <mxGeometry y="60" width="160" height="26" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-134" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="Zwut1nPrnqomn3oBaotf-19" target="zkfFHV4jXpPFQw0GAbJ--17" edge="1">
+          <mxGeometry relative="1" as="geometry">
+            <Array as="points">
+              <mxPoint x="1104" y="383" />
+              <mxPoint x="588" y="383" />
+            </Array>
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-19" value="Calibrated Model Parameters" style="swimlane;fontStyle=0;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
+          <mxGeometry x="1024" y="431" width="160" height="138" as="geometry">
+            <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-20" value="description" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" parent="Zwut1nPrnqomn3oBaotf-19" vertex="1">
+          <mxGeometry y="26" width="160" height="26" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-21" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" parent="Zwut1nPrnqomn3oBaotf-19" vertex="1">
+          <mxGeometry y="52" width="160" height="8" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-22" value=" " style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="Zwut1nPrnqomn3oBaotf-19" vertex="1">
+          <mxGeometry y="60" width="160" height="26" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-135" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="Zwut1nPrnqomn3oBaotf-27" target="zkfFHV4jXpPFQw0GAbJ--17" edge="1">
+          <mxGeometry relative="1" as="geometry">
+            <Array as="points">
+              <mxPoint x="1291" y="384" />
+              <mxPoint x="1039" y="384" />
+              <mxPoint x="1039" y="382" />
+              <mxPoint x="588" y="382" />
+            </Array>
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-27" value="Calibration Function" style="swimlane;fontStyle=0;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
+          <mxGeometry x="1211" y="433" width="160" height="138" as="geometry">
+            <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-28" value="description" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" parent="Zwut1nPrnqomn3oBaotf-27" vertex="1">
+          <mxGeometry y="26" width="160" height="26" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-29" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" parent="Zwut1nPrnqomn3oBaotf-27" vertex="1">
+          <mxGeometry y="52" width="160" height="8" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-30" value=" " style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="Zwut1nPrnqomn3oBaotf-27" vertex="1">
+          <mxGeometry y="60" width="160" height="26" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-136" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="Zwut1nPrnqomn3oBaotf-31" target="zkfFHV4jXpPFQw0GAbJ--0" edge="1">
+          <mxGeometry relative="1" as="geometry">
+            <Array as="points">
+              <mxPoint x="33" y="451" />
+              <mxPoint x="300" y="451" />
+            </Array>
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-31" value="Drafting" style="swimlane;fontStyle=0;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
+          <mxGeometry x="-47" y="618" width="160" height="138" as="geometry">
+            <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-32" value="description" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" parent="Zwut1nPrnqomn3oBaotf-31" vertex="1">
+          <mxGeometry y="26" width="160" height="26" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-33" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" parent="Zwut1nPrnqomn3oBaotf-31" vertex="1">
+          <mxGeometry y="52" width="160" height="8" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-34" value=" " style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="Zwut1nPrnqomn3oBaotf-31" vertex="1">
+          <mxGeometry y="60" width="160" height="26" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-137" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="Zwut1nPrnqomn3oBaotf-35" target="zkfFHV4jXpPFQw0GAbJ--0" edge="1">
+          <mxGeometry relative="1" as="geometry">
+            <Array as="points">
+              <mxPoint x="580" y="451" />
+              <mxPoint x="300" y="451" />
+            </Array>
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-35" value="Drive Train Setup" style="swimlane;fontStyle=0;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
+          <mxGeometry x="500" y="618" width="160" height="138" as="geometry">
+            <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-36" value="description" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" parent="Zwut1nPrnqomn3oBaotf-35" vertex="1">
+          <mxGeometry y="26" width="160" height="26" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-37" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" parent="Zwut1nPrnqomn3oBaotf-35" vertex="1">
+          <mxGeometry y="52" width="160" height="8" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-38" value=" " style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="Zwut1nPrnqomn3oBaotf-35" vertex="1">
+          <mxGeometry y="60" width="160" height="26" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-139" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="Zwut1nPrnqomn3oBaotf-39" target="zkfFHV4jXpPFQw0GAbJ--0" edge="1">
+          <mxGeometry relative="1" as="geometry">
+            <Array as="points">
+              <mxPoint x="-149" y="450" />
+              <mxPoint x="300" y="450" />
+            </Array>
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-39" value="Experiment" style="swimlane;fontStyle=0;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
+          <mxGeometry x="-229" y="618" width="160" height="138" as="geometry">
+            <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-40" value="description" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" parent="Zwut1nPrnqomn3oBaotf-39" vertex="1">
+          <mxGeometry y="26" width="160" height="26" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-41" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" parent="Zwut1nPrnqomn3oBaotf-39" vertex="1">
+          <mxGeometry y="52" width="160" height="8" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-42" value=" " style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="Zwut1nPrnqomn3oBaotf-39" vertex="1">
+          <mxGeometry y="60" width="160" height="26" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-141" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="Zwut1nPrnqomn3oBaotf-43" target="zkfFHV4jXpPFQw0GAbJ--17" edge="1">
+          <mxGeometry relative="1" as="geometry">
+            <Array as="points">
+              <mxPoint x="1481" y="383" />
+              <mxPoint x="588" y="383" />
+            </Array>
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-43" value="Generate Virtual Sensor" style="swimlane;fontStyle=0;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
+          <mxGeometry x="1401" y="431" width="160" height="138" as="geometry">
+            <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-44" value="description" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" parent="Zwut1nPrnqomn3oBaotf-43" vertex="1">
+          <mxGeometry y="26" width="160" height="26" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-45" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" parent="Zwut1nPrnqomn3oBaotf-43" vertex="1">
+          <mxGeometry y="52" width="160" height="8" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-46" value=" " style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="Zwut1nPrnqomn3oBaotf-43" vertex="1">
+          <mxGeometry y="60" width="160" height="26" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-140" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="Zwut1nPrnqomn3oBaotf-47" target="Zwut1nPrnqomn3oBaotf-51" edge="1">
+          <mxGeometry relative="1" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-47" value="Matlab Model" style="swimlane;fontStyle=0;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
+          <mxGeometry x="1666" y="665" width="160" height="138" as="geometry">
+            <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-48" value="description" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" parent="Zwut1nPrnqomn3oBaotf-47" vertex="1">
+          <mxGeometry y="26" width="160" height="26" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-49" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" parent="Zwut1nPrnqomn3oBaotf-47" vertex="1">
+          <mxGeometry y="52" width="160" height="8" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-50" value=" " style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="Zwut1nPrnqomn3oBaotf-47" vertex="1">
+          <mxGeometry y="60" width="160" height="26" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-143" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=open;endFill=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="Zwut1nPrnqomn3oBaotf-51" target="Zwut1nPrnqomn3oBaotf-95" edge="1">
+          <mxGeometry relative="1" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-146" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="Zwut1nPrnqomn3oBaotf-51" target="zkfFHV4jXpPFQw0GAbJ--17" edge="1">
+          <mxGeometry relative="1" as="geometry">
+            <Array as="points">
+              <mxPoint x="1885" y="383" />
+              <mxPoint x="588" y="383" />
+            </Array>
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-51" value="Model" style="swimlane;fontStyle=0;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
+          <mxGeometry x="1805" y="434" width="160" height="138" as="geometry">
+            <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-52" value="description" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" parent="Zwut1nPrnqomn3oBaotf-51" vertex="1">
+          <mxGeometry y="26" width="160" height="26" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-53" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" parent="Zwut1nPrnqomn3oBaotf-51" vertex="1">
+          <mxGeometry y="52" width="160" height="8" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-54" value=" " style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="Zwut1nPrnqomn3oBaotf-51" vertex="1">
+          <mxGeometry y="60" width="160" height="26" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-145" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="Zwut1nPrnqomn3oBaotf-55" target="zkfFHV4jXpPFQw0GAbJ--17" edge="1">
+          <mxGeometry relative="1" as="geometry">
+            <Array as="points">
+              <mxPoint x="1683" y="382" />
+              <mxPoint x="588" y="382" />
+            </Array>
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-55" value="Model Accuracy" style="swimlane;fontStyle=0;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
+          <mxGeometry x="1603" y="431" width="160" height="138" as="geometry">
+            <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-56" value="description" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" parent="Zwut1nPrnqomn3oBaotf-55" vertex="1">
+          <mxGeometry y="26" width="160" height="26" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-57" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" parent="Zwut1nPrnqomn3oBaotf-55" vertex="1">
+          <mxGeometry y="52" width="160" height="8" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-58" value=" " style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="Zwut1nPrnqomn3oBaotf-55" vertex="1">
+          <mxGeometry y="60" width="160" height="26" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-148" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="Zwut1nPrnqomn3oBaotf-59" target="zkfFHV4jXpPFQw0GAbJ--17" edge="1">
+          <mxGeometry relative="1" as="geometry">
+            <Array as="points">
+              <mxPoint x="2639" y="384" />
+              <mxPoint x="2518" y="384" />
+              <mxPoint x="2518" y="381" />
+              <mxPoint x="588" y="381" />
+            </Array>
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-59" value="Model Analysis" style="swimlane;fontStyle=0;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
+          <mxGeometry x="2559" y="433" width="160" height="138" as="geometry">
+            <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-60" value="description" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" parent="Zwut1nPrnqomn3oBaotf-59" vertex="1">
+          <mxGeometry y="26" width="160" height="26" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-61" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" parent="Zwut1nPrnqomn3oBaotf-59" vertex="1">
+          <mxGeometry y="52" width="160" height="8" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-62" value=" " style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="Zwut1nPrnqomn3oBaotf-59" vertex="1">
+          <mxGeometry y="60" width="160" height="26" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-149" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="Zwut1nPrnqomn3oBaotf-63" target="zkfFHV4jXpPFQw0GAbJ--17" edge="1">
+          <mxGeometry relative="1" as="geometry">
+            <Array as="points">
+              <mxPoint x="2833" y="384" />
+              <mxPoint x="588" y="384" />
+            </Array>
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-63" value="Model Calibration" style="swimlane;fontStyle=0;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
+          <mxGeometry x="2753" y="428" width="160" height="138" as="geometry">
+            <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-64" value="description" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" parent="Zwut1nPrnqomn3oBaotf-63" vertex="1">
+          <mxGeometry y="26" width="160" height="26" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-65" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" parent="Zwut1nPrnqomn3oBaotf-63" vertex="1">
+          <mxGeometry y="52" width="160" height="8" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-66" value=" " style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="Zwut1nPrnqomn3oBaotf-63" vertex="1">
+          <mxGeometry y="60" width="160" height="26" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-147" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="Zwut1nPrnqomn3oBaotf-67" target="zkfFHV4jXpPFQw0GAbJ--17" edge="1">
+          <mxGeometry relative="1" as="geometry">
+            <Array as="points">
+              <mxPoint x="2330" y="381" />
+              <mxPoint x="588" y="381" />
+            </Array>
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-67" value="Model Equation" style="swimlane;fontStyle=0;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
+          <mxGeometry x="2218" y="431" width="160" height="138" as="geometry">
+            <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-68" value="description" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" parent="Zwut1nPrnqomn3oBaotf-67" vertex="1">
+          <mxGeometry y="26" width="160" height="26" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-69" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" parent="Zwut1nPrnqomn3oBaotf-67" vertex="1">
+          <mxGeometry y="52" width="160" height="8" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-70" value=" " style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="Zwut1nPrnqomn3oBaotf-67" vertex="1">
+          <mxGeometry y="60" width="160" height="26" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-150" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="Zwut1nPrnqomn3oBaotf-71" target="zkfFHV4jXpPFQw0GAbJ--17" edge="1">
+          <mxGeometry relative="1" as="geometry">
+            <Array as="points">
+              <mxPoint x="3034" y="384" />
+              <mxPoint x="588" y="384" />
+            </Array>
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-71" value="Model Implementation" style="swimlane;fontStyle=0;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
+          <mxGeometry x="2954" y="428" width="160" height="138" as="geometry">
+            <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-72" value="description" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" parent="Zwut1nPrnqomn3oBaotf-71" vertex="1">
+          <mxGeometry y="26" width="160" height="26" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-73" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" parent="Zwut1nPrnqomn3oBaotf-71" vertex="1">
+          <mxGeometry y="52" width="160" height="8" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-74" value=" " style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="Zwut1nPrnqomn3oBaotf-71" vertex="1">
+          <mxGeometry y="60" width="160" height="26" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-155" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=open;endFill=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="Zwut1nPrnqomn3oBaotf-75" target="Zwut1nPrnqomn3oBaotf-151" edge="1">
+          <mxGeometry relative="1" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-75" value="Parameter" style="swimlane;fontStyle=0;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
+          <mxGeometry x="2046" y="665" width="160" height="138" as="geometry">
+            <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-159" value="description" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" parent="Zwut1nPrnqomn3oBaotf-75" vertex="1">
+          <mxGeometry y="26" width="160" height="26" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-76" value="identifier" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" parent="Zwut1nPrnqomn3oBaotf-75" vertex="1">
+          <mxGeometry y="52" width="160" height="26" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-77" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" parent="Zwut1nPrnqomn3oBaotf-75" vertex="1">
+          <mxGeometry y="78" width="160" height="8" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-78" value=" " style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="Zwut1nPrnqomn3oBaotf-75" vertex="1">
+          <mxGeometry y="86" width="160" height="26" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-79" value="Property" style="swimlane;fontStyle=0;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
+          <mxGeometry x="990" y="618" width="160" height="138" as="geometry">
+            <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-161" value="description" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" parent="Zwut1nPrnqomn3oBaotf-79" vertex="1">
+          <mxGeometry y="26" width="160" height="26" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-162" value="identifier" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" parent="Zwut1nPrnqomn3oBaotf-79" vertex="1">
+          <mxGeometry y="52" width="160" height="26" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-80" value="value" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" parent="Zwut1nPrnqomn3oBaotf-79" vertex="1">
+          <mxGeometry y="78" width="160" height="26" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-81" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" parent="Zwut1nPrnqomn3oBaotf-79" vertex="1">
+          <mxGeometry y="104" width="160" height="8" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-82" value=" " style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="Zwut1nPrnqomn3oBaotf-79" vertex="1">
+          <mxGeometry y="112" width="160" height="26" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-175" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=open;endFill=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="Zwut1nPrnqomn3oBaotf-83" target="zkfFHV4jXpPFQw0GAbJ--0" edge="1">
+          <mxGeometry relative="1" as="geometry">
+            <Array as="points">
+              <mxPoint x="790" y="450" />
+              <mxPoint x="422" y="450" />
+              <mxPoint x="422" y="219" />
+            </Array>
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-83" value="Property Of Interest" style="swimlane;fontStyle=0;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
+          <mxGeometry x="710" y="618" width="160" height="138" as="geometry">
+            <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-84" value="description" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" parent="Zwut1nPrnqomn3oBaotf-83" vertex="1">
+          <mxGeometry y="26" width="160" height="26" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-85" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" parent="Zwut1nPrnqomn3oBaotf-83" vertex="1">
+          <mxGeometry y="52" width="160" height="8" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-86" value=" " style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="Zwut1nPrnqomn3oBaotf-83" vertex="1">
+          <mxGeometry y="60" width="160" height="26" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-165" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=open;endFill=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="Zwut1nPrnqomn3oBaotf-87" target="zkfFHV4jXpPFQw0GAbJ--17" edge="1">
+          <mxGeometry relative="1" as="geometry">
+            <Array as="points">
+              <mxPoint x="3253" y="382" />
+              <mxPoint x="3132" y="382" />
+              <mxPoint x="588" y="383" />
+            </Array>
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-87" value="Requirements" style="swimlane;fontStyle=0;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
+          <mxGeometry x="3173" y="428" width="160" height="138" as="geometry">
+            <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-88" value="description" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" parent="Zwut1nPrnqomn3oBaotf-87" vertex="1">
+          <mxGeometry y="26" width="160" height="26" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-89" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" parent="Zwut1nPrnqomn3oBaotf-87" vertex="1">
+          <mxGeometry y="52" width="160" height="8" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-90" value="location" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="Zwut1nPrnqomn3oBaotf-87" vertex="1">
+          <mxGeometry y="60" width="160" height="26" as="geometry" />
+        </mxCell>
+        <mxCell id="GI5TVdWRda2QXH3PsH1w-6" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=open;endFill=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="Zwut1nPrnqomn3oBaotf-91" target="GI5TVdWRda2QXH3PsH1w-0" edge="1">
+          <mxGeometry relative="1" as="geometry">
+            <Array as="points">
+              <mxPoint x="-202" y="149" />
+              <mxPoint x="-202" y="264" />
+            </Array>
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-91" value="Resource" style="swimlane;fontStyle=0;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
+          <mxGeometry x="-169" y="58" width="160" height="138" as="geometry">
+            <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-166" value="description" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" parent="Zwut1nPrnqomn3oBaotf-91" vertex="1">
+          <mxGeometry y="26" width="160" height="26" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-92" value="location" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" parent="Zwut1nPrnqomn3oBaotf-91" vertex="1">
+          <mxGeometry y="52" width="160" height="26" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-93" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" parent="Zwut1nPrnqomn3oBaotf-91" vertex="1">
+          <mxGeometry y="78" width="160" height="8" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-94" value=" " style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="Zwut1nPrnqomn3oBaotf-91" vertex="1">
+          <mxGeometry y="86" width="160" height="26" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-160" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=open;endFill=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="Zwut1nPrnqomn3oBaotf-95" target="Zwut1nPrnqomn3oBaotf-75" edge="1">
+          <mxGeometry relative="1" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-167" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="Zwut1nPrnqomn3oBaotf-95" target="Zwut1nPrnqomn3oBaotf-91" edge="1">
+          <mxGeometry relative="1" as="geometry">
+            <Array as="points">
+              <mxPoint x="2123" y="31" />
+              <mxPoint x="-89" y="31" />
+            </Array>
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-95" value="Script" style="swimlane;fontStyle=0;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
+          <mxGeometry x="2043" y="431" width="160" height="138" as="geometry">
+            <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-96" value="description" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" parent="Zwut1nPrnqomn3oBaotf-95" vertex="1">
+          <mxGeometry y="26" width="160" height="26" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-97" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" parent="Zwut1nPrnqomn3oBaotf-95" vertex="1">
+          <mxGeometry y="52" width="160" height="8" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-98" value=" " style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="Zwut1nPrnqomn3oBaotf-95" vertex="1">
+          <mxGeometry y="60" width="160" height="26" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-170" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="Zwut1nPrnqomn3oBaotf-99" target="Zwut1nPrnqomn3oBaotf-91" edge="1">
+          <mxGeometry relative="1" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-99" value="Sensor" style="swimlane;fontStyle=0;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
+          <mxGeometry x="-389" y="58" width="160" height="138" as="geometry">
+            <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-168" value="description" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" parent="Zwut1nPrnqomn3oBaotf-99" vertex="1">
+          <mxGeometry y="26" width="160" height="26" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-100" value="model" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" parent="Zwut1nPrnqomn3oBaotf-99" vertex="1">
+          <mxGeometry y="52" width="160" height="26" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-101" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" parent="Zwut1nPrnqomn3oBaotf-99" vertex="1">
+          <mxGeometry y="78" width="160" height="8" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-102" value=" " style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="Zwut1nPrnqomn3oBaotf-99" vertex="1">
+          <mxGeometry y="86" width="160" height="26" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-171" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=open;endFill=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="Zwut1nPrnqomn3oBaotf-103" target="Zwut1nPrnqomn3oBaotf-151" edge="1">
+          <mxGeometry relative="1" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-172" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=open;endFill=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="Zwut1nPrnqomn3oBaotf-103" target="zkfFHV4jXpPFQw0GAbJ--17" edge="1">
+          <mxGeometry relative="1" as="geometry">
+            <Array as="points">
+              <mxPoint x="2472" y="380" />
+              <mxPoint x="588" y="380" />
+            </Array>
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-103" value="Sensor Data" style="swimlane;fontStyle=0;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
+          <mxGeometry x="2392" y="428" width="160" height="138" as="geometry">
+            <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-104" value="description" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" parent="Zwut1nPrnqomn3oBaotf-103" vertex="1">
+          <mxGeometry y="26" width="160" height="26" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-105" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" parent="Zwut1nPrnqomn3oBaotf-103" vertex="1">
+          <mxGeometry y="52" width="160" height="8" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-106" value=" " style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="Zwut1nPrnqomn3oBaotf-103" vertex="1">
+          <mxGeometry y="60" width="160" height="26" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-173" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="Zwut1nPrnqomn3oBaotf-107" target="Zwut1nPrnqomn3oBaotf-51" edge="1">
+          <mxGeometry relative="1" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-107" value="Simulink Model" style="swimlane;fontStyle=0;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
+          <mxGeometry x="1856" y="668" width="160" height="138" as="geometry">
+            <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-108" value="description" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" parent="Zwut1nPrnqomn3oBaotf-107" vertex="1">
+          <mxGeometry y="26" width="160" height="26" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-109" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" parent="Zwut1nPrnqomn3oBaotf-107" vertex="1">
+          <mxGeometry y="52" width="160" height="8" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-110" value=" " style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="Zwut1nPrnqomn3oBaotf-107" vertex="1">
+          <mxGeometry y="60" width="160" height="26" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-111" value="Storage" style="swimlane;fontStyle=0;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
+          <mxGeometry x="807" y="154" width="160" height="138" as="geometry">
+            <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-176" value="description" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" parent="Zwut1nPrnqomn3oBaotf-111" vertex="1">
+          <mxGeometry y="26" width="160" height="26" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-112" value="location" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" parent="Zwut1nPrnqomn3oBaotf-111" vertex="1">
+          <mxGeometry y="52" width="160" height="26" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-178" value="storedOn" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" parent="Zwut1nPrnqomn3oBaotf-111" vertex="1">
+          <mxGeometry y="78" width="160" height="26" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-113" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" parent="Zwut1nPrnqomn3oBaotf-111" vertex="1">
+          <mxGeometry y="104" width="160" height="8" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-114" value=" " style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="Zwut1nPrnqomn3oBaotf-111" vertex="1">
+          <mxGeometry y="112" width="160" height="26" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-179" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="Zwut1nPrnqomn3oBaotf-115" target="Zwut1nPrnqomn3oBaotf-91" edge="1">
+          <mxGeometry relative="1" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-115" value="Tool" style="swimlane;fontStyle=0;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
+          <mxGeometry x="-169" y="221" width="160" height="138" as="geometry">
+            <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-116" value="description" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" parent="Zwut1nPrnqomn3oBaotf-115" vertex="1">
+          <mxGeometry y="26" width="160" height="26" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-117" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" parent="Zwut1nPrnqomn3oBaotf-115" vertex="1">
+          <mxGeometry y="52" width="160" height="8" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-118" value=" " style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="Zwut1nPrnqomn3oBaotf-115" vertex="1">
+          <mxGeometry y="60" width="160" height="26" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-174" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="Zwut1nPrnqomn3oBaotf-119" target="Zwut1nPrnqomn3oBaotf-79" edge="1">
+          <mxGeometry relative="1" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-119" value="Unbalanced" style="swimlane;fontStyle=0;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
+          <mxGeometry x="988" y="800" width="160" height="138" as="geometry">
+            <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-120" value="value" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" parent="Zwut1nPrnqomn3oBaotf-119" vertex="1">
+          <mxGeometry y="26" width="160" height="26" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-123" value="description" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" parent="Zwut1nPrnqomn3oBaotf-119" vertex="1">
+          <mxGeometry y="52" width="160" height="26" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-121" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" parent="Zwut1nPrnqomn3oBaotf-119" vertex="1">
+          <mxGeometry y="78" width="160" height="8" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-122" value=" " style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="Zwut1nPrnqomn3oBaotf-119" vertex="1">
+          <mxGeometry y="86" width="160" height="26" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-151" value="Quantity" style="swimlane;fontStyle=0;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
+          <mxGeometry x="2258" y="661" width="160" height="138" as="geometry">
+            <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-153" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" parent="Zwut1nPrnqomn3oBaotf-151" vertex="1">
+          <mxGeometry y="26" width="160" height="8" as="geometry" />
+        </mxCell>
+        <mxCell id="Zwut1nPrnqomn3oBaotf-164" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=open;endFill=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="Zwut1nPrnqomn3oBaotf-86" target="Zwut1nPrnqomn3oBaotf-79" edge="1">
+          <mxGeometry relative="1" as="geometry" />
+        </mxCell>
+        <mxCell id="GI5TVdWRda2QXH3PsH1w-0" value="Datasheet" style="swimlane;fontStyle=0;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
+          <mxGeometry x="-389" y="221" width="160" height="86" as="geometry">
+            <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="GI5TVdWRda2QXH3PsH1w-3" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" parent="GI5TVdWRda2QXH3PsH1w-0" vertex="1">
+          <mxGeometry y="26" width="160" height="8" as="geometry" />
+        </mxCell>
+        <mxCell id="GI5TVdWRda2QXH3PsH1w-5" value=" " style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="GI5TVdWRda2QXH3PsH1w-0" vertex="1">
+          <mxGeometry y="34" width="160" height="26" as="geometry" />
+        </mxCell>
+        <mxCell id="GI5TVdWRda2QXH3PsH1w-4" value=" " style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="GI5TVdWRda2QXH3PsH1w-0" vertex="1">
+          <mxGeometry y="60" width="160" height="26" as="geometry" />
+        </mxCell>
+        <mxCell id="NRciPwFFEhwHQF7nzfJH-0" value="Torque" style="swimlane;fontStyle=0;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
+          <mxGeometry x="2258" y="889" width="160" height="138" as="geometry">
+            <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="NRciPwFFEhwHQF7nzfJH-1" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" parent="NRciPwFFEhwHQF7nzfJH-0" vertex="1">
+          <mxGeometry y="26" width="160" height="8" as="geometry" />
+        </mxCell>
+        <mxCell id="NRciPwFFEhwHQF7nzfJH-2" value="HBMT40B" style="swimlane;fontStyle=0;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
+          <mxGeometry x="113" y="1125" width="160" height="138" as="geometry">
+            <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="NRciPwFFEhwHQF7nzfJH-3" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" parent="NRciPwFFEhwHQF7nzfJH-2" vertex="1">
+          <mxGeometry y="26" width="160" height="8" as="geometry" />
+        </mxCell>
+        <mxCell id="NRciPwFFEhwHQF7nzfJH-4" value="Drive Train Setup" style="swimlane;fontStyle=4;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
+          <mxGeometry x="442" y="792" width="292" height="138" as="geometry">
+            <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="NRciPwFFEhwHQF7nzfJH-5" value="description =  Back to back induction machines." style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" parent="NRciPwFFEhwHQF7nzfJH-4" vertex="1">
+          <mxGeometry y="26" width="292" height="26" as="geometry" />
+        </mxCell>
+        <mxCell id="NRciPwFFEhwHQF7nzfJH-6" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" parent="NRciPwFFEhwHQF7nzfJH-4" vertex="1">
+          <mxGeometry y="52" width="292" height="8" as="geometry" />
+        </mxCell>
+        <mxCell id="NRciPwFFEhwHQF7nzfJH-7" value=" " style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="NRciPwFFEhwHQF7nzfJH-4" vertex="1">
+          <mxGeometry y="60" width="292" height="26" as="geometry" />
+        </mxCell>
+        <mxCell id="NRciPwFFEhwHQF7nzfJH-12" value="Coupling" style="swimlane;fontStyle=0;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
+          <mxGeometry x="502" y="948" width="160" height="138" as="geometry">
+            <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="NRciPwFFEhwHQF7nzfJH-13" value="description" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" parent="NRciPwFFEhwHQF7nzfJH-12" vertex="1">
+          <mxGeometry y="26" width="160" height="26" as="geometry" />
+        </mxCell>
+        <mxCell id="NRciPwFFEhwHQF7nzfJH-14" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" parent="NRciPwFFEhwHQF7nzfJH-12" vertex="1">
+          <mxGeometry y="52" width="160" height="8" as="geometry" />
+        </mxCell>
+        <mxCell id="NRciPwFFEhwHQF7nzfJH-15" value=" " style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="NRciPwFFEhwHQF7nzfJH-12" vertex="1">
+          <mxGeometry y="60" width="160" height="26" as="geometry" />
+        </mxCell>
+        <mxCell id="NRciPwFFEhwHQF7nzfJH-16" value="FlexiCoupling" style="swimlane;fontStyle=0;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
+          <mxGeometry x="309" y="1125" width="160" height="138" as="geometry">
+            <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="NRciPwFFEhwHQF7nzfJH-17" value="description" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" parent="NRciPwFFEhwHQF7nzfJH-16" vertex="1">
+          <mxGeometry y="26" width="160" height="26" as="geometry" />
+        </mxCell>
+        <mxCell id="NRciPwFFEhwHQF7nzfJH-18" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" parent="NRciPwFFEhwHQF7nzfJH-16" vertex="1">
+          <mxGeometry y="52" width="160" height="8" as="geometry" />
+        </mxCell>
+        <mxCell id="NRciPwFFEhwHQF7nzfJH-19" value=" " style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="NRciPwFFEhwHQF7nzfJH-16" vertex="1">
+          <mxGeometry y="60" width="160" height="26" as="geometry" />
+        </mxCell>
+        <mxCell id="NRciPwFFEhwHQF7nzfJH-21" value="Sampling Frequency" style="swimlane;fontStyle=0;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
+          <mxGeometry x="-98" y="1125" width="160" height="138" as="geometry">
+            <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="NRciPwFFEhwHQF7nzfJH-22" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" parent="NRciPwFFEhwHQF7nzfJH-21" vertex="1">
+          <mxGeometry y="26" width="160" height="8" as="geometry" />
+        </mxCell>
+        <mxCell id="NRciPwFFEhwHQF7nzfJH-23" value="16KHz" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
+          <mxGeometry x="-67" y="1329" width="46" height="18" as="geometry" />
+        </mxCell>
+        <mxCell id="NRciPwFFEhwHQF7nzfJH-24" value="4KHz" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
+          <mxGeometry x="-60" y="1347" width="39" height="18" as="geometry" />
+        </mxCell>
+      </root>
+    </mxGraphModel>
+  </diagram>
+</mxfile>

File diff suppressed because it is too large
+ 1 - 0
docs/diagrams/possible_rough_system_design_extra.drawio


File diff suppressed because it is too large
+ 1 - 0
docs/diagrams/simple_car.drawio


File diff suppressed because it is too large
+ 1 - 0
docs/diagrams/timed_pt.drawio


File diff suppressed because it is too large
+ 1 - 0
docs/diagrams/use_case_1.drawio


File diff suppressed because it is too large
+ 1 - 0
docs/diagrams/use_case_2.drawio


File diff suppressed because it is too large
+ 1 - 0
docs/diagrams/use_case_3.drawio


File diff suppressed because it is too large
+ 1 - 0
docs/diagrams/use_case_3_v2.drawio


File diff suppressed because it is too large
+ 1 - 0
docs/diagrams/versioning.drawio


+ 53 - 0
docs/federation_example.md

@@ -0,0 +1,53 @@
+# Concept for a federated example
+
+### Local:
+
+- User client (Rosetta, Code, Terminal, ...)
+
+### Remote_0:
+ 
+- Fuseki instance (First and main SPARQL endpoint)
+
+### Remote_1:
+
+- Custom service SPARQL endpoint
+
+### Remote_2:
+
+- Heterogeneous data source vault (tabular)
+
+### Remote_3:
+
+- Heterogeneous data source (other)
+
+## Example fuseki query
+
+![Drag Racing](fuseki_federated_query.png)
+
+Here we have the fuseki GUI as the client (**Local**).
+The Fuseki server is running at localhost:3030 (**Remote_0**).
+We then use a custom SPARQL endpoint to get outliers (**Remote_1**).
+This data is gathered from an API (**Remote_2**).
+We don't use the optional **Remote_3**.
+
+## Visual
+
+```mermaid
+sequenceDiagram
+    Local->>+Remote_0: SPARQL Query
+    Note over Local,Remote_0: TODO INSERT Query
+    opt Remote data
+        Remote_0->>+Remote_1: SPARQL Data SubQuery
+        opt API call
+            Remote_1->>+Remote_2: Outlier service call
+            Remote_2-->>-Remote_1: Outlier data
+        end
+        Remote_1-->>-Remote_0: SubQuery Data
+    end
+    opt Remote data
+        Remote_0->>+Remote_3: SPARQL Data SubQuery
+        Remote_3-->>-Remote_0: SubQuery Data
+    end
+    Remote_0-->>-Local: Query Data
+    Note over Remote_0,Local: TODO INSERT Data
+```

+ 41 - 0
docs/fuseki/config.ttl

@@ -0,0 +1,41 @@
+@prefix :        <#> .
+@prefix fuseki:  <http://jena.apache.org/fuseki#> .
+@prefix rdf:     <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
+@prefix rdfs:    <http://www.w3.org/2000/01/rdf-schema#> .
+@prefix ja:      <http://jena.hpl.hp.com/2005/11/Assembler#> .
+
+[] rdf:type fuseki:Server ;
+  fuseki:services (
+    :service
+  )
+  .
+
+## TODO Maybe make this a union dataset?
+:service rdf:type fuseki:Service ;
+  rdfs:label  "Generic dataset" ;
+  fuseki:name "dataset" ;
+  fuseki:endpoint [ fuseki:operation fuseki:query ;  fuseki:name "sparql"] ;
+    fuseki:endpoint [ fuseki:operation fuseki:update ; fuseki:name "sparql" ] ;
+  fuseki:endpoint [ fuseki:operation fuseki:gsp-rw ; fuseki:name "gsp" ] ;
+  fuseki:endpoint [ fuseki:operation fuseki:shacl ;  fuseki:name "shacl" ] ;
+  fuseki:endpoint [ fuseki:operation fuseki:patch ;  fuseki:name "patch" ] ;
+  ## TODO This is a custom action service
+  ##fuseki:endpoint [ fuseki:operation fuseki:service ; fuseki:name "service" ] ;
+  fuseki:dataset <#dataset> ;
+  .
+
+<#dataset> rdf:type ja:MemoryDataset 
+  ja:context [ ja:cxtName "arq:queryTimeout" ; ja:cxtValue "10000,60000" ] ;
+  ## ja:data "individuals.ttl";
+  ## ja:defaultGraph :model_inf ;
+  .
+
+##:model_inf a ja:InfModel ;
+##  ja:baseModel :baseModel ;
+##  ja:reasoner [
+##    ja:reasonerURL <http://jena.hpl.hp.com/2003/OWLFBRuleReasoner>
+##    ##ja:reasonerURL <http://jena.hpl.hp.com/2003/RDFSExptRuleReasoner>
+##  ] .
+
+##:baseModel a ja:MemoryModel ;
+##  ja:content [ja:externalContent <file:data/classes.ttl> ] ;

BIN
docs/fuseki_federated_query.png


+ 19 - 0
docs/models/system/README.md

@@ -0,0 +1,19 @@
+# System Meta Model Class Diagrams
+
+## TODO
+- Class Diagrams (draw.io) for meta-models:
+  - Architecture
+  - Relations between IO levels
+  - Experiment
+  - View
+  - Abstraction
+
+## Next steps
+- Describe how the diagrams are connected.
+- Perform queries which extract data.
+- Perform link with instances.
+- Figure out how to code class diagrams into ontology and how to query this.
+
+## References:
+- https://pubs.opengroup.org/architecture/archimate3-doc/chap14.html
+- http://msdl.uantwerpen.be/people/hv/teaching/MoSIS/lectures/presentation.ModellingSimulationFoundations.MoSIS.pdf

File diff suppressed because it is too large
+ 1 - 0
docs/models/system/system.drawio


BIN
docs/strategy workflow 2.jpg


BIN
docs/strategy workflow.jpg


BIN
docs/virtual data.xopp


BIN
docs/wiki/context_menu.webm


BIN
docs/wiki/csv_selection.png


BIN
docs/wiki/drawio_interface.png


BIN
docs/wiki/enact.png


BIN
docs/wiki/model_saving.webm


BIN
docs/wiki/open.png


BIN
docs/wiki/plugin.png


BIN
docs/wiki/save.png


BIN
docs/wiki/shapes.png


+ 25 - 0
ontology/README.md

@@ -0,0 +1,25 @@
+# OML Ontologies
+
+    .
+    ├── car_oml_demo : [OML1]
+    ├── car_simple   : [OML1]
+    ├── cdf          : [OML1]
+    ├── drivetrain   : [OML1]
+    └── system       : [OML2]
+
+## Notes
+
+- OML2 Needs java class format version 61 to compile.
+  This corresponds to java 17.
+
+- The oml core ontology uses OML2 from version 6.0.0 onward.
+
+- The metrology ontology uses OML2 from version 4.0.0 onward.
+
+### OML -> OML2 syntax changes
+
+- `ri` becomes `relation instance`.
+- `ci` becomes `concept instance`.
+
+- `:>` becomes `<`. Its position now depends on the type it succeeds.
+- `enumerated scalar` becomes `scalar` and gains the `oneOf` keyword.

+ 24 - 0
ontology/car_oml_demo/.fuseki.ttl

@@ -0,0 +1,24 @@
+@prefix fuseki:  <http://jena.apache.org/fuseki#> .
+@prefix rdf:     <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
+@prefix rdfs:    <http://www.w3.org/2000/01/rdf-schema#> .
+@prefix tdb:     <http://jena.hpl.hp.com/2008/tdb#> .
+@prefix ja:      <http://jena.hpl.hp.com/2005/11/Assembler#> .
+@prefix :        <#> .
+
+[] rdf:type fuseki:Server .
+
+<#service> rdf:type fuseki:Service ;
+    rdfs:label          "Car" ;												# Human readable label for dataset
+    fuseki:name         "car" ;												# Name of the dataset in the endpoint url
+    fuseki:serviceReadWriteGraphStore "data" ;											# SPARQL Graph store protocol (read and write)
+    fuseki:endpoint 	[ fuseki:operation fuseki:query ;	fuseki:name "sparql"  ] ;	# SPARQL query service
+    fuseki:endpoint 	[ fuseki:operation fuseki:shacl ;	fuseki:name "shacl" ] ;		# SHACL query service
+    fuseki:dataset      <#dataset> .
+
+## In memory TDB with union graph.
+<#dataset> rdf:type   tdb:DatasetTDB ;
+  tdb:location "--mem--" ;
+  # Query timeout on this dataset (1s, 1000 milliseconds)
+  ja:context [ ja:cxtName "arq:queryTimeout" ; ja:cxtValue "1000" ] ;
+  # Make the default graph be the union of all named graphs.
+  tdb:unionDefaultGraph true .

+ 293 - 0
ontology/car_oml_demo/build.gradle

@@ -0,0 +1,293 @@
+/* 
+ * The Maven coordinates for the project artifact
+ */
+ext.title = 'Car Example'
+description = 'This is a car example'
+group = 'one.rys.ontology'
+version = '1.0.0'
+
+/* 
+ * The Gradle plugins 
+ */
+apply plugin: 'maven-publish'
+
+/* 
+ * The Gradle task dependencies 
+ */
+buildscript {
+	repositories {
+		mavenLocal()
+		mavenCentral()
+	}
+	dependencies {
+		classpath 'io.opencaesar.owl:owl-fuseki-gradle:+'
+        classpath 'io.opencaesar.owl:owl-shacl-fuseki-gradle:+'
+        classpath 'io.opencaesar.owl:owl-query-gradle:+'
+        classpath 'io.opencaesar.owl:owl-load-gradle:+'
+        classpath 'io.opencaesar.owl:owl-reason-gradle:+'
+        classpath 'io.opencaesar.oml:oml-bikeshed-gradle:1.+'
+        classpath 'io.opencaesar.oml:oml-merge-gradle:1.+'
+        classpath 'io.opencaesar.adapters:oml2owl-gradle:1.+'
+	}
+}
+
+/*
+ * Bikeshed folder
+ */
+ext {
+	bikeshed = 'build/bikeshed'
+}
+
+/*
+ * Dataset-specific variables
+ */
+ext.dataset = [
+    // Name of dataset (matches one used in .fuseki.ttl file)
+    name: 'car',
+    // Root ontology IRI of the dataset
+    rootOntologyIri: 'http://ontology.rys.one/project/vocabulary/bundle',
+]
+
+/*
+ * The repositories to look up OML dependencies in
+ */
+repositories {
+    mavenLocal()
+    mavenCentral()
+}
+
+/*
+ * The configuration of OML dependencies
+ */
+configurations {
+    oml
+}
+
+/*
+ * Dependency versions
+ */
+ext { 
+    coreVersion = '+'
+}
+
+/*
+ * The OML dependencies
+ */
+dependencies {
+    oml "io.opencaesar.ontologies:core-vocabularies:$coreVersion"
+}
+
+/*
+ * A task to extract and merge the OML dependencies
+ */
+task downloadDependencies(type:io.opencaesar.oml.merge.OmlMergeTask) {
+    inputZipPaths = configurations.oml.files
+    outputCatalogFolder = file('build/oml')
+}
+
+/*
+ * A task to extract and merge the OML dependencies
+ */
+task omlDependencies(type:io.opencaesar.oml.merge.OmlMergeTask, group:"oml") {
+    inputZipPaths = configurations.oml.files
+    outputCatalogFolder = file('build/oml')
+}
+
+/*
+ * A task to generate Bikeshed specification for the OML catalog
+ */
+task omlToBikeshed(type: io.opencaesar.oml.bikeshed.Oml2BikeshedTask, dependsOn: downloadDependencies) {
+    // OML catalog
+    inputCatalogPath = file('catalog.xml')
+    // OML catalog title
+    inputCatalogTitle = project.title
+    // OML catalog version
+    inputCatalogVersion = project.version
+    // Input Ontology Iri
+    rootOntologyIri = 'http://ontology.rys.one/project/vocabulary/bundle'
+    // OWL folder
+    outputFolderPath = file("$bikeshed")
+    // Publish URL
+    publishUrl = 'https://git.rys.one/dtdesign/car-example'
+}
+
+/*
+ * A task to generate the model documentation in HTML
+ */
+import org.gradle.internal.os.OperatingSystem
+task generateDocs(dependsOn: omlToBikeshed) {
+	inputs.files(fileTree("$bikeshed").include('**/*.bs'))
+	outputs.files(fileTree("$bikeshed").include('**/*.html'))
+    doLast {
+        if (OperatingSystem.current().isWindows()) {
+            exec { commandLine "$bikeshed/publish.bat" }
+        } else {
+            exec { commandLine "$bikeshed/publish.sh" }
+        }
+    }
+}
+
+/*
+ * A task to convert the OML catalog to OWL catalog
+ */
+task omlToOwl(type:io.opencaesar.oml2owl.Oml2OwlTask, group:"oml", dependsOn: omlDependencies) {
+    // OML catalog
+    inputCatalogPath = file('catalog.xml')
+    // OWL catalog
+    outputCatalogPath = file('build/owl/catalog.xml')
+}
+
+/*
+ * A task to run the Openllet reasoner on the OWL catalog
+ */
+task owlReason(type:io.opencaesar.owl.reason.OwlReasonTask, group:"oml", dependsOn: omlToOwl) {
+    // OWL catalog
+    catalogPath = file('build/owl/catalog.xml')
+    // Input ontology IRI to reason on
+    inputOntologyIri = "$dataset.rootOntologyIri".toString()
+    // Entailment statements to generate and the ontologies to persist them in
+    specs = [
+        "$dataset.rootOntologyIri/classes = ALL_SUBCLASS".toString(),
+        "$dataset.rootOntologyIri/properties = INVERSE_PROPERTY | ALL_SUBPROPERTY".toString(),
+        "$dataset.rootOntologyIri/individuals = ALL_INSTANCE | DATA_PROPERTY_VALUE | OBJECT_PROPERTY_VALUE | SAME_AS".toString()
+    ]
+    // Junit error report
+    reportPath = file('build/reports/reasoning.xml')
+}
+
+/*
+ * Start the headless Fuseki server
+ */
+task startFuseki(type: io.opencaesar.owl.fuseki.StartFusekiTask, group:"oml") {
+    configurationPath = file('.fuseki.ttl')
+    outputFolderPath = file('.fuseki')
+    webUI = true
+}
+
+/*
+ * Stop the headless Fuseki server
+ */
+task stopFuseki(type: io.opencaesar.owl.fuseki.StopFusekiTask, group:"oml") {
+    outputFolderPath = file('.fuseki')
+}
+
+/*
+ * A task to load an OWL catalog to a Fuseki dataset endpoint
+ */
+task owlLoad(type:io.opencaesar.owl.load.OwlLoadTask, group:"oml", dependsOn: owlReason) {
+    catalogPath = file('build/owl/catalog.xml')
+    endpointURL = "http://localhost:3030/$dataset.name".toString()
+    fileExtensions = ['owl', 'ttl']
+    iris = [
+        "$dataset.rootOntologyIri/classes".toString(),
+        "$dataset.rootOntologyIri/properties".toString(),
+        "$dataset.rootOntologyIri/individuals".toString()
+    ]
+}
+
+/*
+ * A task to run a set of SPARQL queries on a Fuseki dataset endpoint
+ */
+task owlQuery(type:io.opencaesar.owl.query.OwlQueryTask, group:"oml", dependsOn: owlLoad) {
+    endpointURL = "http://localhost:3030/$dataset.name".toString()
+    queryPath = file('src/sparql')
+    resultPath = file('build/results')
+    format = 'json'
+}
+
+/*
+ * A task to run a set of SHACL validation rules on a Fuseki dataset endpoint
+ */
+task owlShacl(type:io.opencaesar.owl.shacl.fuseki.OwlShaclFusekiTask, group:"oml", dependsOn: owlLoad) {
+    endpointURL = "http://localhost:3030/$dataset.name".toString()
+    queryPath = file('src/shacl')
+    resultPath = file('build/reports')
+}
+
+/*
+ * A task to build the project, which executes several tasks together
+ */
+task build(group: "oml") {
+    dependsOn owlReason
+}
+
+/*
+ * A task to delete the build artifacts
+ */
+task clean(type: Delete, group: "oml") {
+	delete 'build'
+}
+
+/*
+ * Publish artifact to maven
+ */
+task omlZip(type: Zip, group:"oml") {
+    from file('src/oml')
+    include "**/*.oml"
+    destinationDirectory = file('build/libs')
+    archiveBaseName = project.name
+    archiveVersion = project.version
+}
+
+def pomConfig = {
+    licenses {
+        license {
+            name "The Apache Software License, Version 2.0"
+            url "http://www.apache.org/licenses/LICENSE-2.0.txt"
+            distribution "repo"
+        }
+    }
+    developers {
+        developer {
+            id "arrys"
+            name "Arkadiusz Michał Ryś"
+            email "Arkadiusz.Michal.Rys@gmail.com"
+        }
+    }
+    scm {
+        url 'https://git.rys.one/dtdesign/car-example'
+    }
+}
+
+publishing {
+    publications {
+        maven(MavenPublication) {
+            groupId project.group
+            artifactId project.name
+            version project.version
+            artifact omlZip
+            pom {
+                packaging = 'zip'
+                withXml {
+                    def root = asNode()
+                    if (configurations.find { it.name == 'oml' }) {
+                        def dependencies = root.appendNode('dependencies')
+                        configurations.oml.resolvedConfiguration.resolvedArtifacts.each {
+                            def dependency = dependencies.appendNode('dependency')
+                            dependency.appendNode('groupId', it.moduleVersion.id.group)
+                            dependency.appendNode('artifactId', it.moduleVersion.id.name)
+                            dependency.appendNode('version', it.moduleVersion.id.version)
+                            if (it.classifier != null) {
+                                dependency.appendNode('classifier', it.classifier)
+                                dependency.appendNode('type', it.extension)
+                            }
+                        }
+                    }
+                    root.appendNode('name', project.ext.title)
+                    root.appendNode('description', project.description)
+                    root.appendNode('url', 'https://git.rys.one/dtdesign/car-example')
+                    root.children().last() + pomConfig
+                }
+            }
+        }
+    }
+}
+
+/*
+ * Integration with the Eclipse IDE
+ */ 
+apply plugin: 'eclipse'
+
+eclipse {
+    synchronizationTasks omlDependencies
+}

+ 5 - 0
ontology/car_oml_demo/catalog.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0"?>
+<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog" prefer="public">
+	<rewriteURI uriStartString="http://ontology.rys.one/project/" rewritePrefix="src/oml/ontology.rys.one/project/"/>
+	<rewriteURI uriStartString="http://" rewritePrefix="build/oml/"/>
+</catalog>

+ 5 - 0
ontology/car_oml_demo/src/oml/ontology.rys.one/project/description/bundle.oml

@@ -0,0 +1,5 @@
+description bundle <http://ontology.rys.one/project/description/bundle#> as description-bundle {
+	//uses <http://purl.org/dc/elements/1.1/> as dc	
+	uses <http://ontology.rys.one/project/vocabulary/bundle#>
+	includes <http://ontology.rys.one/project/description/cars#>
+}

+ 26 - 0
ontology/car_oml_demo/src/oml/ontology.rys.one/project/description/cars.oml

@@ -0,0 +1,26 @@
+description <http://ontology.rys.one/project/description/cars#> as cars {
+	//uses <http://purl.org/dc/elements/1.1/> as dc
+	uses <http://ontology.rys.one/project/vocabulary/car#> as car
+	
+	ci tire1  : car:WinterTire []
+	ci wheel1 : car:Wheel [car:hasMass 1.0 car:hasTire tire1]
+	ci wheel2 : car:Wheel [car:hasMass 1.0]
+	ci wheel3 : car:Wheel [car:hasMass 1.0]
+	ci wheel4 : car:Wheel [car:hasMass 1.0]
+	ci model1 : car:Model [car:hasModelName "CAR"]
+	ci car1 : car:Car [
+		car:hasVin "1"
+		car:hasModel model1
+		car:hasWheel wheel1
+		car:hasWheel wheel2
+		car:hasWheel wheel3
+		car:hasWheel wheel4
+	]
+	
+	//ri hasWheel1 : car:HasWheel [from car1 to wheel1]
+	//ri hasWheel2 : car:HasWheel [from car1 to wheel2]
+	//ri hasWheel3 : car:HasWheel [from car1 to wheel3]
+	//ri hasWheel4 : car:HasWheel [from car1 to wheel4]
+	//ri hasModel1 : car:HasModel [from car1 to model1]
+	//ri hasTire1 : car:HasTire [from wheel1 to tire1]
+}

+ 7 - 0
ontology/car_oml_demo/src/oml/ontology.rys.one/project/vocabulary/bundle.oml

@@ -0,0 +1,7 @@
+//@dc:title "Simple car ontology"
+//@dc:creator "Arkadiusz Michał Ryś"
+//@dc:rights "Copyright 2022"
+vocabulary bundle <http://ontology.rys.one/project/vocabulary/bundle#> as vocabulary-bundle {
+    //includes <http://purl.org/dc/elements/1.1/> as dc
+    includes <http://ontology.rys.one/project/vocabulary/car#>
+}

+ 73 - 0
ontology/car_oml_demo/src/oml/ontology.rys.one/project/vocabulary/car.oml

@@ -0,0 +1,73 @@
+vocabulary <http://ontology.rys.one/project/vocabulary/car#> as car {
+	extends <http://www.w3.org/2001/XMLSchema#> as xsd
+    //extends <http://purl.org/dc/elements/1.1/> as dc
+    extends <http://www.w3.org/2000/01/rdf-schema#> as rdfs
+    
+    @rdfs:comment "The class of vehicles that are uniquely identified by a vehicle identification number."
+    aspect Vehicle [
+    	key hasVin
+    ]
+    aspect VPart []
+    concept Car :> Vehicle []
+    concept Model []
+    concept Wheel :> VPart []
+    concept Tire :> VPart []
+	
+    scalar property hasVin [
+    	domain Vehicle
+    	range xsd:string
+    	functional
+    ]
+    
+    scalar property hasModelName [
+    	domain Model
+    	range xsd:string
+    ]
+    
+    //scalar property hasManufacturer [
+    //	domain Vehicle
+    //	range xsd:string
+    //]
+    
+    scalar property hasMass [
+    	domain Wheel
+    	range xsd:decimal
+    ]
+	
+	enumerated scalar TireType [
+        "Winter",
+        "Summer",
+        "All-Season"
+    ]
+	
+	scalar property hasTireType [
+	    domain Tire
+		range TireType
+		functional
+	]
+	
+	concept WinterTire :> Tire [
+	    restricts scalar property hasTireType to "Winter"
+	]
+	    
+    relation entity HasModel [
+    	from Car
+    	to Model
+    	forward hasModel
+    	reverse isModelOfCar
+    ]
+
+    relation entity HasWheel [
+    	from Car
+    	to Wheel
+    	forward hasWheel
+    	reverse isWheelOnCar
+    ]
+	
+	relation entity HasTire [
+    	from Wheel
+    	to Tire
+    	forward hasTire
+    	reverse isTireOnWheel
+    ]
+}

+ 124 - 0
ontology/car_oml_demo/src/shacl/example.ttl

@@ -0,0 +1,124 @@
+@prefix sh: <http://www.w3.org/ns/shacl#> .
+@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
+@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
+@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
+@prefix owl: <http://www.w3.org/2002/07/owl#> .
+@prefix metrology: <http://iupac.org/metrology#> .
+
+# The namespace for metrology shacl shapes.
+@prefix metrology-shapes: <http://iupac.org/metrology/metrology-shapes#> .
+
+# The following defines `metrology-shapes` as the ontology for sh:declare prefixes to be added to each SPARQL query.
+metrology-shapes:
+	a owl:Ontology ;
+	owl:imports sh: ;
+	sh:declare [
+		sh:prefix "metrology" ;
+		sh:namespace "http://iupac.org/metrology#"^^xsd:anyURI ;
+	] ;
+	sh:declare [
+		sh:prefix "owl" ;
+		sh:namespace "http://www.w3.org/2002/07/owl#"^^xsd:anyURI ;
+	] ;
+	sh:declare [
+		sh:prefix "rdf" ;
+		sh:namespace "http://www.w3.org/1999/02/22-rdf-syntax-ns#"^^xsd:anyURI ;
+	] .
+	
+metrology-shapes:Every-Quantity-characterizes-some-Object
+  a sh:NodeShape ;
+  sh:targetClass metrology:Quantity ;
+  sh:sparql [
+    a sh:SPARQLConstraint ;
+    sh:message "{$this}, a metrology:Quantity, must be a quantity for some metrology:Object." ;
+    sh:prefixes metrology-shapes: ;
+    sh:select """
+      SELECT DISTINCT $this
+      WHERE {
+        $this rdf:type metrology:Quantity .
+        FILTER NOT EXISTS {
+          $this metrology:isQuantityOf ?o .
+          ?o rdf:type metrology:Object .
+        }
+      }
+    """ ;
+  ] ;
+  sh:closed false .
+
+metrology-shapes:Every-QuantityValue-has-Number
+  a sh:NodeShape ;
+  sh:targetClass metrology:QuantityValue ;
+  sh:sparql [
+    a sh:SPARQLConstraint ;
+    sh:message "{$this}, a metrology:QuantityValue, must have a number via metrology:hasDoubleNumber." ;
+    sh:prefixes metrology-shapes: ;
+    sh:select """
+      SELECT DISTINCT $this
+      WHERE {
+        $this rdf:type metrology:QuantityValue .
+        FILTER NOT EXISTS {
+          $this metrology:hasDoubleNumber ?value .
+        }
+      }
+    """ ;
+  ] ;
+  sh:closed false .
+
+metrology-shapes:Every-QuantityValue-has-Reference
+  a sh:NodeShape ;
+  sh:targetClass metrology:QuantityValue ;
+  sh:sparql [
+    a sh:SPARQLConstraint ;
+    sh:message "{$this}, a metrology:QuantityValue, must have a number via metrology:hasReference." ;
+    sh:prefixes metrology-shapes: ;
+    sh:select """
+      SELECT DISTINCT $this
+      WHERE {
+        $this rdf:type metrology:QuantityValue .
+        FILTER NOT EXISTS {
+          $this metrology:hasReference ?ref .
+        }
+      }
+    """ ;
+  ] ;
+  sh:closed false .
+
+metrology-shapes:Every-UnitaryQuantity-has-UnitaryKindOfQuantity
+  a sh:NodeShape ;
+  sh:targetClass metrology:UnitaryQuantity ;
+  sh:sparql [
+    a sh:SPARQLConstraint ;
+    sh:message "{$this}, a metrology:UnitaryQuantity, must have a metrology:UnitaryKindOfQuantity." ;
+    sh:prefixes metrology-shapes: ;
+    sh:select """
+      SELECT DISTINCT $this
+      WHERE {
+        $this rdf:type metrology:UnitaryQuantity .
+        FILTER NOT EXISTS {
+          $this metrology:hasKindOfQuantity ?qk .
+          ?qk rdf:type metrology:UnitaryKindOfQuantity .
+        }
+      }
+    """ ;
+  ] ;
+  sh:closed false .
+
+metrology-shapes:Every-UnitaryQuantity-hasMagnitude-UnitaryQuantityValue
+  a sh:NodeShape ;
+  sh:targetClass metrology:UnitaryQuantity ;
+  sh:sparql [
+    a sh:SPARQLConstraint ;
+    sh:message "{$this}, a metrology:UnitaryQuantity, must have a magnitue of a metrology:UnitaryQuantityValue." ;
+    sh:prefixes metrology-shapes: ;
+    sh:select """
+      SELECT DISTINCT $this
+      WHERE {
+        $this rdf:type metrology:UnitaryQuantity .
+        FILTER NOT EXISTS {
+          $this metrology:hasMagnitude ?uqv .
+          ?uqv rdf:type metrology:UnitaryQuantityValue .
+        }
+      }
+    """ ;
+  ] ;
+  sh:closed false .

+ 162 - 0
ontology/car_oml_demo/src/shacl/validation.ttl

@@ -0,0 +1,162 @@
+@prefix sh:   <http://www.w3.org/ns/shacl#> .
+@prefix rdf:  <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
+@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
+@prefix xsd:  <http://www.w3.org/2001/XMLSchema#> .
+@prefix owl:  <http://www.w3.org/2002/07/owl#> .
+
+@prefix car:        <http://ontology.rys.one/project/vocabulary/car#> .
+@prefix car-shapes: <http://ontology.rys.one/project/vocabulary/car-shapes#> .
+
+
+# SHACL-SPARQL supports writing SPARQL by separating two parts:
+# 1) the SPARQL prologue corresponding to instances of sh:declare individuals available in the sh:prefixes ontology.
+#    See: https://www.w3.org/TR/sparql11-query/#rPrologue 
+# 2) the SPARQL query statement: select or ask. 
+#    See: https://www.w3.org/TR/sparql11-query/#rSelectQuery
+#    See: https://www.w3.org/TR/sparql11-query/#rAskQuery
+
+# The following defines `car-shapes` as the ontology for sh:declare prefixes to be added to each SPARQL query.
+car-shapes:
+  a owl:Ontology ;
+  owl:imports sh: ;
+  sh:declare [
+    sh:prefix "car" ;
+    sh:namespace "http://ontology.rys.one/project/vocabulary/car#"^^xsd:anyURI ;
+  ] ;
+  sh:declare [
+    sh:prefix "rdf" ;
+    sh:namespace "http://www.w3.org/1999/02/22-rdf-syntax-ns#"^^xsd:anyURI ;
+  ] .
+  
+# -------------------------------------------------------------
+# Constraint 1 (SHACL-CORE): A car:Car must car:hasModel some (1) car:Model.
+# -------------------------------------------------------------
+
+car-shapes:Car_HasModel_some_Model_shacl
+  a sh:NodeShape ;
+  sh:targetClass car:Car ;
+  sh:property [
+    sh:path car:hasModel ;
+    sh:class car:Model ;
+    #sh:nodeKind sh:IRI ;
+    sh:minCount 1 ;
+	sh:maxCount 1 ;
+  ] ;
+  sh:closed false .
+  
+car-shapes:Wheel_has_mass_shacl
+  a sh:NodeShape ;
+  sh:targetClass car:Wheel ;
+  sh:property [
+    sh:path car:hasMass ;
+    #sh:class xsd:decimal ;
+    #sh:nodeKind sh:IRI ;
+    sh:minCount 1 ;
+	sh:maxCount 1 ;
+  ] ;
+  sh:closed false .
+  
+# -------------------------------------------------------------
+# Constraint 1 (SHACL-SPARQL): A car:Car must car:hasModel some car:Model.
+# -------------------------------------------------------------
+
+car-shapes:Car_HasModel_some_Model_sparql
+  a sh:NodeShape ;
+  sh:targetClass car:Car ;
+  sh:sparql [
+    a sh:SPARQLConstraint ;
+    sh:message "{$this}, a car:Car, must have a model of some car:Model." ;
+    sh:prefixes car-shapes: ;
+    sh:select """
+      SELECT DISTINCT $this ?model
+      WHERE {
+        $this rdf:type car:Car .
+        FILTER NOT EXISTS { 
+          $this car:hasModel ?model .
+          ?model rdf:type car:Model .
+        }
+      }
+      """ ;
+  ] ;
+  sh:closed false .
+  
+  
+# -------------------------------------------------------------
+# Constraint 2 (SHACL-CORE): A car:Wheel must be car:isWheelOnCar exactly 1 car:Car.
+# -------------------------------------------------------------
+
+#car-shapes:Wheel_is_wheel_on_car_by_one_Car_shacl
+#  a sh:NodeShape ;
+#  sh:targetClass car:Wheel ;
+#  sh:property [
+#    sh:path car:isWheelOnCar ;
+#    sh:class car:Car ;
+#    sh:nodeKind sh:IRI ;
+#    sh:minCount 1 ;
+#    sh:maxCount 1 ;
+#  ] ;
+#  sh:closed false .
+
+
+car-shapes:Test_shacl
+  a sh:NodeShape ;
+  sh:targetClass car:Car ;
+  sh:property [
+    sh:path car:hasModel ;
+    sh:class car:Model ;
+    #sh:nodeKind sh:IRI ;
+    sh:minCount 1 ;
+	sh:maxCount 1 ;
+  ] ;
+  sh:closed false .
+  
+
+# -------------------------------------------------------------
+# Constraint 2 (SHACL-SPARQL): A car:Wheel must be car:isWheelOnCar exactly 1 car:Car.
+# -------------------------------------------------------------
+  
+#car-shapes:Wheel_is_wheel_on_car_by_one_Car_sparql
+#  a sh:NodeShape ;
+#  sh:targetClass car:Wheel ;
+#  sh:sparql [
+#    a sh:SPARQLConstraint ;
+#    sh:message "{$this}, an car:Wheel, must be on exactly 1 car:Car instead of {?c}." ;
+#    sh:prefixes car-shapes: ;
+#    sh:select """
+#      SELECT DISTINCT $this (COUNT(?woc) AS ?c)
+#      WHERE {
+#        $this rdf:type car:Wheel .
+#        OPTIONAL {
+#          $this car:isWheelOnCar ?woc .
+#        }
+#      }
+#      GROUP BY $this
+#      HAVING (COUNT(?woc) != 1)
+#      """ ;
+#  ] ;
+#  sh:closed false .
+
+# -------------------------------------------------------------
+# Constraint 3 (SHACL-SPARQL): A car:Car must have n car:Wheel with a total mass equal to 4.0.
+# -------------------------------------------------------------
+
+car-shapes:Wheels_have_4.0_mass 
+  a sh:NodeShape ;
+  sh:targetClass car:Car ;
+  sh:property [
+    sh:path ( car:hasWheel car:hasMass ) ;
+    sh:severity sh:Warning ;
+    sh:sparql [
+      a sh:SPARQLConstraint ;
+      sh:message "Total car:Wheel mass should sum to 4.0." ;
+      sh:prefixes car: ;
+      sh:select """
+        SELECT $this (sum(?mass) as ?value) {
+          $this $PATH ?mass .
+        }
+        GROUP BY $this
+        HAVING (sum(?mass) != 4.0)
+        """
+    ]
+  ] ;
+  sh:closed false .

+ 7 - 0
ontology/car_oml_demo/src/sparql/cars.sparql

@@ -0,0 +1,7 @@
+PREFIX car:  <http://ontology.rys.one/project/vocabulary/car#>
+PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
+
+SELECT ?car
+WHERE {
+	?car a car:Car
+}

+ 7 - 0
ontology/car_oml_demo/src/sparql/compositions.sparql

@@ -0,0 +1,7 @@
+PREFIX car:  <http://ontology.rys.one/project/vocabulary/car#>
+PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
+
+SELECT ?car ?wheel
+WHERE {
+	?car car:hasWheel ?wheel .
+}

+ 7 - 0
ontology/car_oml_demo/src/sparql/whichwinter.sparql

@@ -0,0 +1,7 @@
+PREFIX car:  <http://ontology.rys.one/project/vocabulary/car#>
+PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
+
+SELECT DISTINCT ?wheel
+WHERE {
+    ?wheel car:hasTire [car:hasTireType "Winter"]
+}

+ 24 - 0
ontology/car_simple/.fuseki.ttl

@@ -0,0 +1,24 @@
+@prefix fuseki:  <http://jena.apache.org/fuseki#> .
+@prefix rdf:     <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
+@prefix rdfs:    <http://www.w3.org/2000/01/rdf-schema#> .
+@prefix tdb:     <http://jena.hpl.hp.com/2008/tdb#> .
+@prefix ja:      <http://jena.hpl.hp.com/2005/11/Assembler#> .
+@prefix :        <#> .
+
+[] rdf:type fuseki:Server .
+
+<#service> rdf:type fuseki:Service ;
+    rdfs:label          "Simple car" ;												# Human readable label for dataset
+    fuseki:name         "simple_car" ;												# Name of the dataset in the endpoint url
+    fuseki:serviceReadWriteGraphStore "data" ;											# SPARQL Graph store protocol (read and write)
+    fuseki:endpoint 	[ fuseki:operation fuseki:query ;	fuseki:name "sparql"  ] ;	# SPARQL query service
+    fuseki:endpoint 	[ fuseki:operation fuseki:shacl ;	fuseki:name "shacl" ] ;		# SHACL query service
+    fuseki:dataset      <#dataset> .
+
+## In memory TDB with union graph.
+<#dataset> rdf:type   tdb:DatasetTDB ;
+  tdb:location "--mem--" ;
+  # Query timeout on this dataset (1s, 1000 milliseconds)
+  ja:context [ ja:cxtName "arq:queryTimeout" ; ja:cxtValue "1000" ] ;
+  # Make the default graph be the union of all named graphs.
+  tdb:unionDefaultGraph true .

+ 40 - 0
ontology/car_simple/.project

@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>simple_car</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.buildship.core.gradleprojectbuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.xtext.ui.shared.xtextBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>io.opencaesar.rosetta.oml.ui.builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>io.opencaesar.rosetta.oml.ui.nature</nature>
+		<nature>org.eclipse.xtext.ui.shared.xtextNature</nature>
+		<nature>org.eclipse.buildship.core.gradleprojectnature</nature>
+	</natures>
+	<filteredResources>
+		<filter>
+			<id>1685229357230</id>
+			<name></name>
+			<type>30</type>
+			<matcher>
+				<id>org.eclipse.core.resources.regexFilterMatcher</id>
+				<arguments>node_modules|\.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__</arguments>
+			</matcher>
+		</filter>
+	</filteredResources>
+</projectDescription>

+ 238 - 0
ontology/car_simple/build.gradle

@@ -0,0 +1,238 @@
+/* 
+ * The Maven coordinates for the project artifact
+ */
+ext.title = 'Simple car'
+description = 'This is an example of a simple car'
+group = 'be.ua'
+version = '1.0.0'
+
+/* 
+ * The Gradle plugins 
+ */
+apply plugin: 'maven-publish'
+
+/* 
+ * The Gradle task dependencies 
+ */
+buildscript {
+	repositories {
+		mavenLocal()
+		mavenCentral()
+	}
+	dependencies {
+        classpath 'io.opencaesar.owl:owl-fuseki-gradle:+'
+        classpath 'io.opencaesar.owl:owl-query-gradle:+'
+        classpath 'io.opencaesar.owl:owl-load-gradle:+'
+        classpath 'io.opencaesar.owl:owl-reason-gradle:+'
+        classpath 'io.opencaesar.oml:oml-merge-gradle:+'
+        classpath 'io.opencaesar.adapters:oml2owl-gradle:+'
+	}
+}
+
+/*
+ * Dataset-specific variables
+ */
+ext.dataset = [
+    // Name of dataset (matches one used in .fuseki.ttl file)
+    name: 'simple_car',
+    // Root ontology IRI of the dataset
+    rootOntologyIri: 'http://ua.be/simple_car/description/bundle',
+]
+
+/*
+ * The repositories to look up OML dependencies in
+ */
+repositories {
+    mavenLocal()
+    mavenCentral()
+}
+
+/*
+ * The configuration of OML dependencies
+ */
+configurations {
+    oml
+}
+
+/*
+ * Dependency versions
+ */
+ext { 
+    coreVersion = '+'
+}
+
+/*
+ * The OML dependencies
+ */
+dependencies {
+    oml "io.opencaesar.ontologies:core-vocabularies:$coreVersion"
+    oml "be.ua:SystemDesignOntology2Layers:1.0.0"
+}
+
+/*
+ * A task to extract and merge the OML dependencies
+ */
+task omlDependencies(type:io.opencaesar.oml.merge.OmlMergeTask, group:"oml") {
+    inputZipPaths = configurations.oml.files
+    outputCatalogFolder = file('build/oml')
+}
+
+/*
+ * A task to convert the OML catalog to OWL catalog
+ */
+task omlToOwl(type:io.opencaesar.oml2owl.Oml2OwlTask, group:"oml", dependsOn: omlDependencies) {
+    // OML catalog
+    inputCatalogPath = file('catalog.xml')
+    // OWL catalog
+    outputCatalogPath = file('build/owl/catalog.xml')
+}
+
+/*
+ * A task to run the Openllet reasoner on the OWL catalog
+ */
+task owlReason(type:io.opencaesar.owl.reason.OwlReasonTask, group:"oml", dependsOn: omlToOwl) {
+    // OWL catalog
+    catalogPath = file('build/owl/catalog.xml')
+    // Input ontology IRI to reason on
+    inputOntologyIri = "$dataset.rootOntologyIri".toString()
+    // Entailment statements to generate and the ontologies to persist them in
+    specs = [
+        "$dataset.rootOntologyIri/classes = ALL_SUBCLASS".toString(),
+        "$dataset.rootOntologyIri/properties = INVERSE_PROPERTY | ALL_SUBPROPERTY".toString(),
+        "$dataset.rootOntologyIri/individuals = ALL_INSTANCE | DATA_PROPERTY_VALUE | OBJECT_PROPERTY_VALUE | SAME_AS".toString()
+    ]
+    // Junit error report
+    reportPath = file('build/reports/reasoning.xml')
+}
+
+/*
+ * Start the headless Fuseki server
+ */
+task startFuseki(type: io.opencaesar.owl.fuseki.StartFusekiTask, group:"oml") {
+    configurationPath = file('.fuseki.ttl')
+    outputFolderPath = file('.fuseki')
+    webUI = true
+}
+
+/*
+ * Stop the headless Fuseki server
+ */
+task stopFuseki(type: io.opencaesar.owl.fuseki.StopFusekiTask, group:"oml") {
+    outputFolderPath = file('.fuseki')
+}
+
+/*
+ * A task to load an OWL catalog to a Fuseki dataset endpoint
+ */
+task owlLoad(type:io.opencaesar.owl.load.OwlLoadTask, group:"oml", dependsOn: owlReason) {
+    catalogPath = file('build/owl/catalog.xml')
+    endpointURL = "http://localhost:3030/$dataset.name".toString()
+    fileExtensions = ['owl', 'ttl']
+    iris = [
+        "$dataset.rootOntologyIri/classes".toString(),
+        "$dataset.rootOntologyIri/properties".toString(),
+        "$dataset.rootOntologyIri/individuals".toString()
+    ]
+}
+
+/*
+ * A task to run a set of SPARQL queries on a Fuseki dataset endpoint
+ */
+task owlQuery(type:io.opencaesar.owl.query.OwlQueryTask, group:"oml", dependsOn: owlLoad) {
+    endpointURL = "http://localhost:3030/$dataset.name".toString()
+    queryPath = file('src/sparql')
+    resultPath = file('build/results')
+    format = 'json'
+}
+
+/*
+ * A task to build the project, which executes several tasks together
+ */
+task build(group: "oml") {
+    dependsOn owlReason
+}
+
+/*
+ * A task to delete the build artifacts
+ */
+task clean(type: Delete, group: "oml") {
+	delete 'build'
+}
+
+/*
+ * Publish artifact to maven
+ */
+task omlZip(type: Zip, group:"oml") {
+    from file('src/oml')
+    include "**/*.oml"
+    destinationDirectory = file('build/libs')
+    archiveBaseName = project.name
+    archiveVersion = project.version
+}
+
+def pomConfig = {
+    licenses {
+        license {
+            name "The Apache Software License, Version 2.0"
+            url "http://www.apache.org/licenses/LICENSE-2.0.txt"
+            distribution "repo"
+        }
+    }
+    developers {
+        developer {
+            id "uantwerp"
+            name "University of Antwerp"
+            email ""
+        }
+    }
+    scm {
+        url 'https://msdl.uantwerpen.be/git/lucasalbertins/DTDesign/'
+    }
+}
+
+publishing {
+    publications {
+        maven(MavenPublication) {
+            groupId project.group
+            artifactId project.name
+            version project.version
+            artifact omlZip
+            pom {
+                packaging = 'zip'
+                withXml {
+                    def root = asNode()
+                    if (configurations.find { it.name == 'oml' }) {
+                        def dependencies = root.appendNode('dependencies')
+                        configurations.oml.resolvedConfiguration.resolvedArtifacts.each {
+                            def dependency = dependencies.appendNode('dependency')
+                            dependency.appendNode('groupId', it.moduleVersion.id.group)
+                            dependency.appendNode('artifactId', it.moduleVersion.id.name)
+                            dependency.appendNode('version', it.moduleVersion.id.version)
+                            if (it.classifier != null) {
+                                dependency.appendNode('classifier', it.classifier)
+                                dependency.appendNode('type', it.extension)
+                            }
+                        }
+                    }
+                    root.appendNode('name', project.ext.title)
+                    root.appendNode('description', project.description)
+                    root.appendNode('url', 'https://msdl.uantwerpen.be/git/lucasalbertins/DTDesign/')
+                    root.children().last() + pomConfig
+                }
+            }
+        }
+    }
+}
+
+tasks.named('wrapper') {
+   gradleVersion = '6.5.1' //version required
+}
+
+/*
+ * Integration with the Eclipse IDE
+ */ 
+apply plugin: 'eclipse'
+
+eclipse {
+    synchronizationTasks omlDependencies
+}

+ 5 - 0
ontology/car_simple/catalog.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0"?>
+<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog" prefer="public">
+	<rewriteURI uriStartString="http://ua.be/simple_car/" rewritePrefix="src/oml/ua.be/simple_car/"/>
+	<rewriteURI uriStartString="http://" rewritePrefix="build/oml/"/>
+</catalog>

+ 9 - 0
ontology/car_simple/src/oml/ua.be/simple_car/description/bundle.oml

@@ -0,0 +1,9 @@
+description bundle <http://ua.be/simple_car/description/bundle#> as ^bundle {
+	uses <http://ua.be/sdo2l/vocabulary/bundle#>
+	includes <http://ua.be/simple_car/description/definitions#>
+	includes <http://ua.be/simple_car/description/requirements#>
+	includes <http://ua.be/simple_car/description/structuralModels#>
+	includes <http://ua.be/simple_car/description/systems#>
+	includes <http://ua.be/simple_car/description/traces#>
+    includes <http://ua.be/simple_car/description/workflows#>
+}

+ 43 - 0
ontology/car_simple/src/oml/ua.be/simple_car/description/definitions.oml

@@ -0,0 +1,43 @@
+description <http://ua.be/simple_car/description/definitions#> as definitions {
+	uses <http://ua.be/sdo2l/vocabulary/base#> as base
+	uses <http://ua.be/sdo2l/vocabulary/ftg#> as ftg
+
+	ci requirementList-def : ftg:Formalism [
+		base:hasName "Requirement List"
+	]
+
+	ci structural-model-def : ftg:Formalism [
+		base:hasName "Structural Model"
+	]
+
+	ci shacl-property-def : ftg:Formalism [
+		base:hasName "SHACL Property"
+	]
+
+	ci violation-report-def : ftg:Formalism [
+		base:hasName "Violation Report"
+	]
+
+	ci requirement-elicitation-act-def : ftg:Transformation [
+		base:hasName "Requirement Elicitation"
+		ftg:outputs requirementList-def
+	]
+
+	ci property-design-act-def : ftg:Transformation [
+		base:hasName "Property Design"
+		ftg:outputs requirementList-def
+	]
+
+	ci architectural-design-act-def : ftg:Transformation [
+		base:hasName "Architectural Design"
+		ftg:isInputtedBy requirementList-def
+		ftg:outputs structural-model-def
+	]
+
+	ci property-verification-act-def : ftg:Transformation [
+		base:hasName "Property Verification"
+		ftg:isInputtedBy requirementList-def
+		ftg:isInputtedBy shacl-property-def
+		ftg:outputs violation-report-def
+	]
+}

+ 56 - 0
ontology/car_simple/src/oml/ua.be/simple_car/description/requirements.oml

@@ -0,0 +1,56 @@
+description <http://ua.be/simple_car/description/requirements#> as requirements {
+	uses <http://ua.be/sdo2l/vocabulary/base#> as base
+	uses <http://ua.be/sdo2l/vocabulary/requirement#> as req
+	extends <http://ua.be/simple_car/description/systems#> as systems
+
+	ci reqlist-car-system : req:RequirementList [
+		base:hasIdentifier "RL-01"
+		base:hasCanonicalName "CarSystemRequirementList"
+		base:hasDescription "The requirement list of the car system"
+		base:hasVersion "0"
+		//traces:relatesTo workflows:reqList-usage
+	]
+
+	ci req01 : req:Requirement [
+		base:hasIdentifier "REQ-01"
+		base:hasCanonicalName "Req 01 - Number of wheels"
+		base:hasDescription "A car has 4 wheels"
+		req:describes systems:car-system
+	]
+
+	ci req02 : req:Requirement [
+		base:hasIdentifier "REQ-02"
+		base:hasCanonicalName "Req 02 - Wheels' weight mass"
+		base:hasDescription "The wheels have a mass between 1 and 2 kilogrammes."
+		req:describes systems:car-system
+	]
+
+	ci req03 : req:Requirement [
+		base:hasIdentifier "REQ-03"
+		base:hasCanonicalName "Req 03 - Car body mass"
+		base:hasDescription "The car body has a mass between 2 and 3 tonne (1 tonne is 1000 kg)."
+		req:describes systems:car-system
+	]
+
+	ci req04 : req:Requirement [
+		base:hasIdentifier "REQ-04"
+		base:hasCanonicalName "Req 04 - Wheels' weight deviation"
+		base:hasDescription "Static Safety Requirement: The wheels should be balanced i.e. the weight of each wheel should not deviate more than 5% from the average of the 4 wheels mass."
+		req:describes systems:car-system
+	]
+
+	ci req05 : req:Requirement [
+		base:hasIdentifier "REQ-05"
+		base:hasCanonicalName "Req 05 - Fuel consumption during climbing"
+		base:hasDescription "Simulation-based Requirement.: From the hill-climb simulation, the car climbing a 100 ft slope at 45 degree should not consume more than 50 ml of fuel."
+		req:describes systems:car-system
+	]
+
+	ref ci reqlist-car-system [
+		req:groups req01
+		req:groups req02
+		req:groups req03
+		req:groups req04
+		req:groups req05
+	]
+}

+ 97 - 0
ontology/car_simple/src/oml/ua.be/simple_car/description/structuralModels.oml

@@ -0,0 +1,97 @@
+description <http://ua.be/simple_car/description/structuralModels#> as components {
+	uses <http://ua.be/sdo2l/vocabulary/base#> as base
+	uses <http://www.w3.org/2001/XMLSchema#> as xsd
+	uses <http://ua.be/sdo2l/vocabulary/component#> as comp
+	uses <http://bipm.org/jcgm/vim4#> as vim4
+	extends <http://iso.org/iso-80000-4.1#> as iso-80000-4.1
+	
+	ci car-structural-model : comp:StructuralModel [
+		base:hasIdentifier "str-01"
+		base:hasCanonicalName "CarModel"
+		base:hasDescription "The structural model of a simple car with four wheels."
+		base:hasVersion "0"
+	]
+		
+	ci car-component : comp:CarComponent [
+		base:hasIdentifier "c1"
+		base:hasCanonicalName "car1" 
+	]
+	
+	ci car-massAttribute : comp:Attribute [
+		base:hasIdentifier "c1-mass"
+		base:hasCanonicalName "c1-mass att"
+		vim4:hasDoubleNumber "2000"^^xsd:double
+		vim4:characterizes car-component
+		vim4:unit iso-80000-4.1:kilogram
+	]
+	
+	
+	ci wheel1-component : comp:WheelComponent [
+		base:hasIdentifier "w1"
+		base:hasCanonicalName "wheel1" 
+	]
+	
+	ci wheel1-massAttribute : comp:Attribute [
+		base:hasIdentifier "w1-mass"
+		base:hasCanonicalName "w1-mass att"
+		vim4:hasDoubleNumber "1.85"^^xsd:double
+		vim4:characterizes wheel1-component
+		vim4:unit iso-80000-4.1:kilogram
+	]
+	
+	ci wheel2-component : comp:WheelComponent [
+		base:hasIdentifier "w2"
+		base:hasCanonicalName "wheel2"
+	]
+	
+	ci wheel2-massAttribute : comp:Attribute [
+		base:hasIdentifier "w2-mass"
+		base:hasCanonicalName "w2-mass att"
+		vim4:hasDoubleNumber "2.15"^^xsd:double
+		vim4:characterizes wheel2-component
+		vim4:unit iso-80000-4.1:kilogram
+	]
+	
+	ci wheel3-component : comp:WheelComponent [
+		base:hasIdentifier "w3"
+		base:hasCanonicalName "wheel3" 
+	]
+	
+	ci wheel3-massAttribute : comp:Attribute [
+		base:hasIdentifier "w3-mass"
+		base:hasCanonicalName "w3-mass att"
+		vim4:hasDoubleNumber "2.0"^^xsd:double
+		vim4:characterizes wheel3-component
+		vim4:unit iso-80000-4.1:kilogram
+	]
+	
+	ci wheel4-component : comp:WheelComponent [
+		base:hasIdentifier "w4"
+		base:hasCanonicalName "wheel4"
+	]
+	
+	ci wheel4-massAttribute : comp:Attribute [
+		base:hasIdentifier "w4-mass"
+		base:hasCanonicalName "w4-mass att"
+		vim4:hasDoubleNumber "2"^^xsd:double
+		vim4:characterizes wheel4-component
+		vim4:unit iso-80000-4.1:kilogram
+	]
+	
+	ref ci car-component [
+		base:contains wheel1-component
+		base:contains wheel2-component
+		base:contains wheel3-component
+		base:contains wheel4-component
+	]
+	
+	ref ci car-structural-model [
+		comp:specifies car-component
+		comp:specifies wheel1-component
+		comp:specifies wheel2-component
+		comp:specifies wheel3-component
+		comp:specifies wheel4-component	
+	]
+	
+	
+}

+ 11 - 0
ontology/car_simple/src/oml/ua.be/simple_car/description/systems.oml

@@ -0,0 +1,11 @@
+description <http://ua.be/simple_car/description/systems#> as systems {
+	
+	uses <http://ua.be/sdo2l/vocabulary/base#> as base
+	uses <http://ua.be/sdo2l/vocabulary/system#> as system
+
+	ci car-system : system:System [
+		base:hasIdentifier "P-01"
+		base:hasCanonicalName "Car Project"
+	]
+	
+}

+ 101 - 0
ontology/car_simple/src/oml/ua.be/simple_car/description/traces.oml

@@ -0,0 +1,101 @@
+description <http://ua.be/simple_car/description/traces#> as traces {
+	uses <http://ua.be/sdo2l/vocabulary/processtraces#> as traces
+	uses <http://ua.be/sdo2l/vocabulary/base#> as base
+	uses <http://ua.be/sdo2l/vocabulary/shaclproperty#> as sp
+	uses <http://ua.be/sdo2l/vocabulary/violation#> as violation
+	extends <http://ua.be/simple_car/description/workflows#> as wf
+	extends <http://ua.be/simple_car/description/requirements#> as requirements
+	extends <http://ua.be/simple_car/description/structuralModels#> as components
+
+	// Traces
+
+	ci car-trace : traces:Trace [
+		base:hasIdentifier "t01"
+		base:hasCanonicalName "Car System - Trace 01"
+		traces:enacts wf:pm-car-system
+		traces:startedBy staev-req-elicitation
+	]
+
+	// Artifacts and relationships to workflow artifacts
+
+	ci shacl-properties : sp:SHACL-Property [
+		base:hasIdentifier "sp01"
+		base:hasCanonicalName "SHACL property file"
+		sp:hasFilePathname "shacl/shacl.ttl"
+		base:hasVersion "01"
+	]
+
+	ci violations : violation:ViolationReport [
+		base:hasIdentifier "vr01"
+		base:hasCanonicalName "Violation report file"
+		violation:hasFilePathname "build/report/shacl.ttl"
+		base:hasVersion "01"
+	]
+
+	ri reqList-car-relatesTo-reqList-usage : traces:RelatesTo [
+		from requirements:reqlist-car-system
+		to wf:reqList-usage
+	]
+
+	ri carStructuralModel-relatesTo-car-structural-model-usage : traces:RelatesTo [
+		from components:car-structural-model
+		to wf:car-structural-model-usage
+	]
+
+	ri shacl-props-relatesTo-carprops-usage : traces:RelatesTo [
+		from shacl-properties
+		to wf:car-properties-usage
+	]
+
+	ri violation-relatesTo-violationReport-usage : traces:RelatesTo [
+		from violations
+		to wf:violation-report-usage
+	]
+
+	// Events
+
+	ci staev-req-elicitation : traces:StartingEvent [
+		traces:isFollowedBy endev-req-elicitation
+		traces:starts wf:requirement-elicitation-act
+	]
+
+	ci endev-req-elicitation : traces:EndingEvent [
+		traces:provides requirements:reqlist-car-system
+		traces:isFollowedBy staev-arch-design
+		traces:terminates wf:requirement-elicitation-act
+	]
+
+	ci staev-arch-design : traces:StartingEvent [
+		traces:receives requirements:reqlist-car-system
+		traces:isFollowedBy endev-arch-design
+		traces:starts wf:architectural-design-act
+	]
+	ci endev-arch-design : traces:EndingEvent [
+		traces:provides components:car-structural-model
+		traces:isFollowedBy staev-property-design
+		traces:terminates wf:architectural-design-act
+	]
+
+	ci staev-property-design : traces:StartingEvent [
+		traces:starts wf:property-design-act
+		traces:isFollowedBy endev-property-design
+	]
+	ci endev-property-design : traces:EndingEvent [
+		traces:provides shacl-properties
+		traces:terminates wf:property-design-act
+		traces:isFollowedBy staev-ver
+	]
+
+	ci staev-ver : traces:StartingEvent [
+		traces:receives components:car-structural-model
+		traces:receives shacl-properties
+		traces:starts wf:property-verification-act
+		traces:isFollowedBy endev-ver
+	]
+	ci endev-ver : traces:EndingEvent [
+		traces:terminates wf:property-verification-act
+		traces:provides violations
+	]
+
+
+}

+ 113 - 0
ontology/car_simple/src/oml/ua.be/simple_car/description/workflows.oml

@@ -0,0 +1,113 @@
+description <http://ua.be/simple_car/description/workflows#> as workflows {
+	uses <http://ua.be/sdo2l/vocabulary/base#> as base
+	uses <http://ua.be/sdo2l/vocabulary/workflow#> as wf
+	extends <http://ua.be/simple_car/description/definitions#> as defs
+
+
+
+
+	// the car PM
+	ci pm-car-system : wf:Workflow [
+		base:hasIdentifier "pm1"
+		base:hasCanonicalName "PMCarSystem"
+		base:hasDescription "The Process model of the car system."
+	]
+
+
+	// Artifact Usages
+
+	ci reqList-usage : wf:WorkflowArtifact [
+		base:isDefinedBy defs:requirementList-def
+		base:hasUsageName "reqs"
+	]
+
+	ci car-properties-usage : wf:WorkflowArtifact [
+		base:isDefinedBy defs:shacl-property-def
+		base:hasUsageName "carProps"
+	]
+
+	ci car-structural-model-usage : wf:WorkflowArtifact [
+		base:isDefinedBy defs:structural-model-def
+		base:hasUsageName "architecture"
+	]
+
+	ci violation-report-usage : wf:WorkflowArtifact [
+		base:isDefinedBy defs:violation-report-def
+		base:hasUsageName "violations"
+	]
+
+	// Nodes
+
+	ci init-node : wf:InitialNode [
+		base:hasIdentifier "init01"
+		base:hasCanonicalName "Initial Node 01"
+		wf:isFollowedBy requirement-elicitation-act
+	]
+
+	ci requirement-elicitation-act : wf:Activity [
+		base:hasIdentifier "act01"
+		base:hasCanonicalName "Requirement Elicitation"
+		base:isDefinedBy defs:requirement-elicitation-act-def
+		base:hasUsageName "reqElic"
+		wf:outputs reqList-usage
+		wf:isFollowedBy fork-node-01
+	]
+
+	ci fork-node-01 : wf:ForkNode [
+		base:hasIdentifier "fork01"
+		base:hasCanonicalName "ForkNode01"
+		wf:isFollowedBy architectural-design-act
+		wf:isFollowedBy property-design-act
+	]
+
+	ci architectural-design-act : wf:Activity [
+		base:hasIdentifier "act02"
+		base:hasCanonicalName "Architectural Design"
+		base:isDefinedBy defs:architectural-design-act-def
+		base:hasUsageName "archDes"
+		wf:isInputtedBy reqList-usage
+		wf:outputs car-structural-model-usage
+		wf:isFollowedBy join-node-01
+	]
+
+	ci property-design-act : wf:Activity [
+		base:hasIdentifier "act03"
+		base:hasCanonicalName "Property Design"
+		base:isDefinedBy defs:property-design-act-def
+		base:hasUsageName "propDes"
+		wf:isInputtedBy reqList-usage
+		wf:outputs car-properties-usage
+		wf:isFollowedBy join-node-01
+	]
+
+
+	ci join-node-01 : wf:JoinNode [
+		base:hasIdentifier "join01"
+		base:hasCanonicalName "JoinNode01"
+		wf:isFollowedBy property-verification-act
+	]
+
+	ci property-verification-act : wf:Activity [
+		base:hasIdentifier "act04"
+		base:hasCanonicalName "Property Verification"
+		base:isDefinedBy defs:property-verification-act-def
+		base:hasUsageName "ver"
+		wf:isFollowedBy final-node
+	]
+
+	ci final-node : wf:FinalNode [
+		base:hasIdentifier "finalnode01"
+		base:hasCanonicalName "Final Node 01"
+	]
+
+	ref ci pm-car-system [
+		wf:coordinates init-node
+		wf:coordinates requirement-elicitation-act
+		wf:coordinates fork-node-01
+		wf:coordinates architectural-design-act
+		wf:coordinates property-design-act
+		wf:coordinates join-node-01
+		wf:coordinates property-verification-act
+		wf:coordinates final-node
+	]
+}

+ 102 - 0
ontology/car_simple/src/shacl/shacl.ttl

@@ -0,0 +1,102 @@
+@prefix sh: <http://www.w3.org/ns/shacl#> .
+@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
+@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
+@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
+@prefix owl: <http://www.w3.org/2002/07/owl#> .
+@prefix vim4: <http://bipm.org/jcgm/vim4#> .
+
+@prefix comp: <http://ua.be/sdo2l/vocabulary/component#> .
+@prefix base: <http://ua.be/sdo2l/vocabulary/base#> .
+
+# The namespace for fse shacl shapes.
+@prefix comp-shapes: <http://ua.be/sdo2l/vocabulary/component-shapes#> .
+
+# The following defines `fse-shapes` as the ontology for sh:declare prefixes to be added to each SPARQL query.
+comp-shapes:
+	a owl:Ontology ;
+	owl:imports sh: ;
+	sh:declare [
+		sh:prefix "comp" ;
+		sh:namespace "http://ua.be/sdo2l/vocabulary/component#"^^xsd:anyURI ;
+	]  ;
+	sh:declare [
+		sh:prefix "base" ;
+		sh:namespace "http://ua.be/sdo2l/vocabulary/base#"^^xsd:anyURI ;
+	]  ;
+	sh:declare [
+		sh:prefix "rdf" ;
+		sh:namespace "http://www.w3.org/1999/02/22-rdf-syntax-ns#"^^xsd:anyURI ;
+	] ;
+	sh:declare [
+		sh:prefix "vim4" ;
+		sh:namespace "http://bipm.org/jcgm/vim4#"^^xsd:anyURI ;
+	] .
+
+comp-shapes:Car_contains_4_Wheels_shacl
+	a sh:NodeShape ;
+	sh:targetClass comp:CarComponent ;
+	sh:property [
+		sh:path base:contains ;
+		sh:class comp:WheelComponent ;
+		sh:nodeKind sh:IRI ;
+		sh:minCount 4 ;
+		sh:maxCount 4 ;
+	] .
+	
+comp-shapes:Unbalanced_Wheel_Mass
+	a sh:NodeShape ;
+	sh:targetClass comp:Attribute ;
+	sh:property [
+    	sh:path vim4:hasDoubleNumber ;
+    	sh:severity sh:Warning ;
+    	sh:sparql [
+      	a sh:SPARQLConstraint ;
+      	sh:message "Wheel mass difference from the average should be less than 5%" ;
+      	sh:prefixes [
+      		sh:declare [
+				sh:prefix "comp" ;
+				sh:namespace "http://ua.be/sdo2l/vocabulary/component#"^^xsd:anyURI ;
+				] ] ,
+	 		[ sh:declare [
+				sh:prefix "base" ;
+				sh:namespace "http://ua.be/sdo2l/vocabulary/base#"^^xsd:anyURI ;
+			] ]  ,
+			[ sh:declare [
+				sh:prefix "rdf" ;
+				sh:namespace "http://www.w3.org/1999/02/22-rdf-syntax-ns#"^^xsd:anyURI ;
+			] ] ,
+			[ sh:declare [
+				sh:prefix "vim4" ;
+				sh:namespace "http://bipm.org/jcgm/vim4#"^^xsd:anyURI ;
+			] ];
+      	sh:select """
+       		SELECT ?car ?wheel $this ?attMass ?avg
+			WHERE {
+				?car rdf:type comp:CarComponent .
+				?wheel rdf:type comp:WheelComponent .
+				?car base:contains ?wheel .
+				$this rdf:type comp:Attribute .
+				$this vim4:characterizes ?wheel .
+				$this base:hasIdentifier ?attID .
+			    FILTER regex(?attID, "w[0-9]-mass") .
+				$this $PATH ?attMass .
+				{
+				SELECT ?car (avg(?attMass2) as ?avg)
+				WHERE {
+					?car rdf:type comp:CarComponent .
+					?wheel2 rdf:type comp:WheelComponent .
+					?car base:contains ?wheel2 .
+					?attribute2 rdf:type comp:Attribute .
+					?attribute2 vim4:characterizes ?wheel2 .
+					?attribute2 base:hasIdentifier ?attID2 .
+			    	FILTER regex(?attID2, "w[0-9]-mass") .
+					?attribute2 vim4:hasDoubleNumber ?attMass2 .
+				}
+				GROUP BY ?car
+				}
+			}
+			HAVING (abs(?attMass-?avg) >= (?avg*0.05) )
+        	"""
+    	]
+  	] ;
+	sh:closed false .

+ 33 - 0
ontology/car_simple/src/sparql/query.ttl

@@ -0,0 +1,33 @@
+PREFIX rdf:  <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
+PREFIX vim4: <http://bipm.org/jcgm/vim4#>
+PREFIX comp: <http://ua.be/sdo2l/vocabulary/component#>
+PREFIX base: <http://ua.be/sdo2l/vocabulary/base#>
+
+
+SELECT ?car ?wheel ?attribute ?attMass ?avg
+WHERE {
+	?car rdf:type comp:CarComponent .
+	?wheel rdf:type comp:WheelComponent .
+	?car base:contains ?wheel .
+	?attribute rdf:type comp:Attribute .
+	?attribute vim4:characterizes ?wheel .
+	?attribute base:hasIdentifier ?attID .
+    FILTER regex(?attID, "w[0-9]-mass") .
+	?attribute vim4:hasDoubleNumber ?attMass .
+	{
+	SELECT ?car (avg(?attMass2) as ?avg)
+	WHERE {
+		?car rdf:type comp:CarComponent .
+		?wheel2 rdf:type comp:WheelComponent .
+		?car base:contains ?wheel2 .
+		?attribute2 rdf:type comp:Attribute .
+		?attribute2 vim4:characterizes ?wheel2 .
+		?attribute2 base:hasIdentifier ?attID2 .
+    	FILTER regex(?attID2, "w[0-9]-mass") .
+		?attribute2 vim4:hasDoubleNumber ?attMass2 .
+	}
+	GROUP BY ?car
+	}
+}
+HAVING (abs(?attMass-?avg) >= (?avg*0.05) )
+

+ 24 - 0
ontology/cdf/.fuseki.ttl

@@ -0,0 +1,24 @@
+@prefix fuseki:  <http://jena.apache.org/fuseki#> .
+@prefix rdf:     <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
+@prefix rdfs:    <http://www.w3.org/2000/01/rdf-schema#> .
+@prefix tdb:     <http://jena.hpl.hp.com/2008/tdb#> .
+@prefix ja:      <http://jena.hpl.hp.com/2005/11/Assembler#> .
+@prefix :        <#> .
+
+[] rdf:type fuseki:Server .
+
+<#service> rdf:type fuseki:Service ;
+    rdfs:label          "CDF" ;												# Human readable label for dataset
+    fuseki:name         "CDF" ;												# Name of the dataset in the endpoint url
+    fuseki:serviceReadWriteGraphStore "data" ;											# SPARQL Graph store protocol (read and write)
+    fuseki:endpoint 	[ fuseki:operation fuseki:query ;	fuseki:name "sparql"  ] ;	# SPARQL query service
+    fuseki:endpoint 	[ fuseki:operation fuseki:shacl ;	fuseki:name "shacl" ] ;		# SHACL query service
+    fuseki:dataset      <#dataset> .
+
+## In memory TDB with union graph.
+<#dataset> rdf:type   tdb:DatasetTDB ;
+  tdb:location "--mem--" ;
+  # Query timeout on this dataset (1s, 1000 milliseconds)
+  ja:context [ ja:cxtName "arq:queryTimeout" ; ja:cxtValue "1000" ] ;
+  # Make the default graph be the union of all named graphs.
+  tdb:unionDefaultGraph true .

+ 40 - 0
ontology/cdf/.project

@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>CDF</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.buildship.core.gradleprojectbuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.xtext.ui.shared.xtextBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>io.opencaesar.rosetta.oml.ui.builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>io.opencaesar.rosetta.oml.ui.nature</nature>
+		<nature>org.eclipse.xtext.ui.shared.xtextNature</nature>
+		<nature>org.eclipse.buildship.core.gradleprojectnature</nature>
+	</natures>
+	<filteredResources>
+		<filter>
+			<id>1685229357221</id>
+			<name></name>
+			<type>30</type>
+			<matcher>
+				<id>org.eclipse.core.resources.regexFilterMatcher</id>
+				<arguments>node_modules|\.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__</arguments>
+			</matcher>
+		</filter>
+	</filteredResources>
+</projectDescription>

+ 7 - 0
ontology/cdf/README.md

@@ -0,0 +1,7 @@
+# Vocabularies for CDF project
+
+This directory contains a Rosetta project with vocabularies for the Flanders Make CDF traceability-demo (AGV use case).
+
+There are also a bunch of OML descriptions and SPARQL queries to check if the vocabularies are defined correctly.
+
+It is currently developed independently from the vocabularies under sdo2l, although at some point we could merge the two.

+ 5 - 0
ontology/cdf/catalog.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0"?>
+<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog" prefer="public">
+	<rewriteURI uriStartString="http://flandersmake.be/cdf/" rewritePrefix="src/oml/flandersmake.be/cdf/"/>
+	<rewriteURI uriStartString="http://" rewritePrefix="build/oml/"/>
+</catalog>

+ 8 - 0
ontology/cdf/src/oml/flandersmake.be/cdf/description/bundle.oml

@@ -0,0 +1,8 @@
+description bundle <http://flandersmake.be/cdf/description/bundle#> as ^bundle {
+	includes <http://flandersmake.be/cdf/description/my_drawio#>
+	includes <http://flandersmake.be/cdf/description/my_ftg#>
+	includes <http://flandersmake.be/cdf/description/my_statechart#>
+	includes <http://flandersmake.be/cdf/description/my_pm#>
+	includes <http://flandersmake.be/cdf/description/my_pm2#>
+	includes <http://flandersmake.be/cdf/description/my_xopp#>	
+}

File diff suppressed because it is too large
+ 856 - 0
ontology/cdf/src/oml/flandersmake.be/cdf/description/my_drawio.oml


+ 43 - 0
ontology/cdf/src/oml/flandersmake.be/cdf/description/my_ftg.oml

@@ -0,0 +1,43 @@
+description <http://flandersmake.be/cdf/description/my_ftg#> as my_ftg {
+	
+	uses <http://flandersmake.be/cdf/vocabulary/ftg#> as ftg
+	uses <http://flandersmake.be/cdf/vocabulary/immutable#> as immutable
+	
+	// Formalisms
+	ci f1 : ftg:Formalism [
+		immutable:hasUUID "f1"
+	]
+	ci f2 : ftg:Formalism [
+		immutable:hasUUID "f2"
+	]
+	ci f3 : ftg:Formalism [
+		immutable:hasUUID "f3"
+	]	
+	
+	// This is allowed - they are the same individuals:
+	ci f4a : ftg:Formalism [
+		immutable:hasUUID "f4"
+	]
+	ci f4b : ftg:Formalism [
+		immutable:hasUUID "f4"
+	]
+	
+	// Transformation
+	ci t1 : ftg:Transformation [
+		immutable:hasUUID "t1"
+	]
+	// Inputs and outputs
+	ri in_f1 : ftg:Input [
+		from t1 to f1
+		ftg:hasName "in_f1"
+	]
+	ri out_f2 : ftg:Output [
+		from t1 to f2
+		ftg:hasName "out_f2"
+	]
+	ri out_f3 : ftg:Output [
+		from t1 to f3
+		ftg:hasName "out_f3"
+	]
+
+}

+ 38 - 0
ontology/cdf/src/oml/flandersmake.be/cdf/description/my_pm.oml

@@ -0,0 +1,38 @@
+description <http://flandersmake.be/cdf/description/my_pm#> as my_pm {
+	
+	extends <http://flandersmake.be/cdf/description/my_ftg#> as my_ftg
+	
+	uses <http://flandersmake.be/cdf/vocabulary/pm#> as pm
+	uses <http://flandersmake.be/cdf/vocabulary/object_diagram#> as object_diagram
+	uses <http://flandersmake.be/cdf/vocabulary/immutable#> as immutable
+
+	ci start : pm:Start [
+		pm:ctrlTo ctrlIn
+	]
+	
+	ci activity : pm:Activity [
+		pm:hasName "activity"
+		pm:hasPort ctrlIn
+		pm:hasPort ctrlOut
+		pm:isTransformation my_ftg:t1
+	]
+	ci ctrlIn : pm:CtrlInputPort [
+		pm:hasName "c_in"
+	]
+	ci ctrlOut : pm:CtrlOutputPort [
+		pm:hasName "c_out"
+		pm:ctrlTo final
+	]
+	
+	ci final : pm:Final []
+	
+	
+	ci model : pm:Model [
+		immutable:hasUUID "pm1" // this will turn 'model' also in an immutable thing
+		object_diagram:hasObject start
+		object_diagram:hasObject activity
+		object_diagram:hasObject ctrlIn
+		object_diagram:hasObject ctrlOut
+		object_diagram:hasObject final
+	]
+}

+ 57 - 0
ontology/cdf/src/oml/flandersmake.be/cdf/description/my_pm2.oml

@@ -0,0 +1,57 @@
+description <http://flandersmake.be/cdf/description/my_pm2#> as my_pm2 {
+	
+	extends <http://flandersmake.be/cdf/description/my_ftg#> as my_ftg
+	extends <http://flandersmake.be/cdf/description/my_pm#> as my_pm
+	
+	uses <http://flandersmake.be/cdf/vocabulary/pm#> as pm
+	uses <http://flandersmake.be/cdf/vocabulary/object_diagram#> as object_diagram
+	uses <http://flandersmake.be/cdf/vocabulary/immutable#> as immutable
+
+	uses <http://flandersmake.be/cdf/vocabulary/versioned#> as versioned
+
+	ci start : pm:Start [
+		pm:ctrlTo ctrlIn
+	]
+	
+	ci activity : pm:Activity [
+		pm:hasName "activity"
+		pm:hasPort ctrlIn
+		pm:hasPort ctrlOut
+		pm:isTransformation my_ftg:t1
+	]
+	ci ctrlIn : pm:CtrlInputPort [
+		pm:hasName "c_in"
+	]
+	ci ctrlOut : pm:CtrlOutputPort [
+		pm:hasName "c_out"
+		pm:ctrlTo ctrlIn2
+	]
+	
+	ci activity2 : pm:Activity [
+		pm:hasName "activity2"
+		pm:hasPort ctrlIn2
+		pm:hasPort ctrlOut2
+		pm:isTransformation my_ftg:t1
+	]
+	ci ctrlIn2 : pm:CtrlInputPort [
+		pm:hasName "c_in"
+	]
+	ci ctrlOut2 : pm:CtrlOutputPort [
+		pm:hasName "c_out"
+		pm:ctrlTo final
+	]
+	
+	ci final : pm:Final []
+	
+	
+	ci model : pm:Model [
+		immutable:hasUUID "pm2"
+		versioned:hasParent my_pm:model
+		
+		object_diagram:hasObject start
+		object_diagram:hasObject activity
+		object_diagram:hasObject ctrlIn
+		object_diagram:hasObject ctrlOut
+		object_diagram:hasObject final
+	]
+}

+ 47 - 0
ontology/cdf/src/oml/flandersmake.be/cdf/description/my_statechart.oml

@@ -0,0 +1,47 @@
+description <http://flandersmake.be/cdf/description/my_statechart#> as my_statechart {
+	
+	uses <http://flandersmake.be/cdf/vocabulary/statechart#> as statechart
+	uses <http://flandersmake.be/cdf/vocabulary/immutable#> as immutable
+
+	uses <http://flandersmake.be/cdf/vocabulary/object_diagram#> as object_diagram
+	
+	ci default : statechart:AndState [
+		statechart:hasName "default"
+	]
+	
+	ri t : statechart:Transition [
+		from default
+		to default
+		statechart:hasLabel "e"
+	]
+	
+	ci root : statechart:OrState [
+		statechart:hasDefaultState default
+		statechart:hasName "root"
+	]
+	
+	ci sc : statechart:Model [
+		immutable:hasUUID "sc"
+		statechart:hasRoot root
+		
+		object_diagram:hasObject root
+		object_diagram:hasObject default
+		object_diagram:hasObject t
+	]
+	
+	
+	// Illegal: parent-cycle
+	ci s1 : statechart:AndState [
+		statechart:hasName "s1"
+		statechart:hasParent s2
+		
+	]
+	ci s2 : statechart:AndState [
+		statechart:hasName "s2"
+		statechart:hasParent s3
+	]
+	ci s3 : statechart:AndState [
+		statechart:hasName "s3"
+		// statechart:hasParent s1 // ILLEGAL
+	]
+}

File diff suppressed because it is too large
+ 199 - 0
ontology/cdf/src/oml/flandersmake.be/cdf/description/my_xopp.oml


+ 34 - 0
ontology/cdf/src/oml/flandersmake.be/cdf/vocabulary/acyclic.oml

@@ -0,0 +1,34 @@
+vocabulary <http://flandersmake.be/cdf/vocabulary/acyclic#> as acyclic {
+	
+	aspect element []
+	
+	// Add this type as a supertype of any relation to make it acyclic.
+	relation entity Acyclic [
+		from element
+		to element
+		forward acyclicForward
+		irreflexive
+		asymmetric
+	]
+	
+	relation entity derivedTransitiveRelation [
+		from element
+		to element
+		forward transitiveForward
+		irreflexive
+		asymmetric
+		
+		// transitive // Currently ignored by reasoner. See workaround below.
+	]
+	
+	
+	rule DeriveTransitiveRelation [
+		acyclicForward(A, B) -> transitiveForward(A, B)
+	]
+	
+	// Workaround:
+	rule MakeTransitive [
+		// Don't know if this creates unnecessary bloat, compared to the 'transitive'-flag, but it works:
+		transitiveForward(A, B) ^ transitiveForward(B, C) -> transitiveForward(A, C)
+	]
+}

+ 12 - 0
ontology/cdf/src/oml/flandersmake.be/cdf/vocabulary/bundle.oml

@@ -0,0 +1,12 @@
+vocabulary bundle <http://flandersmake.be/cdf/vocabulary/bundle#> as ^bundle {
+	includes <http://flandersmake.be/cdf/vocabulary/acyclic#>
+	includes <http://flandersmake.be/cdf/vocabulary/class_diagram#>	
+	includes <http://flandersmake.be/cdf/vocabulary/drawio#>
+	includes <http://flandersmake.be/cdf/vocabulary/ftg#>
+	includes <http://flandersmake.be/cdf/vocabulary/immutable#>
+	includes <http://flandersmake.be/cdf/vocabulary/object_diagram#>
+	includes <http://flandersmake.be/cdf/vocabulary/pm#>
+	includes <http://flandersmake.be/cdf/vocabulary/pt#>
+	includes <http://flandersmake.be/cdf/vocabulary/statechart#>
+	includes <http://flandersmake.be/cdf/vocabulary/xopp#>
+}

+ 59 - 0
ontology/cdf/src/oml/flandersmake.be/cdf/vocabulary/class_diagram.oml

@@ -0,0 +1,59 @@
+// Currently unused
+// This is an attempt at showing how an instance of a Class Diagram itself can be seen as an object diagram.
+// We could implement a conformance check between such instance and another object diagram, for instance in SHACL.
+// Then, could we create an instance of 'class_diagram' that conforms to itself? I'm not entirely sure.
+// All of this is out-of-scope for CDF.
+vocabulary <http://flandersmake.be/cdf/vocabulary/class_diagram#> as class_diagram {
+
+	extends <http://flandersmake.be/cdf/vocabulary/object_diagram#> as object_diagram
+	extends <http://www.w3.org/2001/XMLSchema#> as xsd
+	
+	// objects that have a name
+	aspect element :> object_diagram:Object [
+		restricts scalar property hasName to exactly 1
+	]
+	
+	scalar property hasName :> object_diagram:hasField [
+		domain element
+		range xsd:string
+		functional
+	]
+	
+	aspect classlike :> element []
+	
+	// A class is an object, with one field (its name):
+	concept Class :> classlike []
+	
+	relation entity HasAttribute :> object_diagram:Link, element [
+		from classlike
+		to Attribute
+		forward hasAttribute
+		reverse isAttributeOf
+		asymmetric
+		irreflexive
+	]
+	
+	// An attribute is an object, with two fields (name, type)
+	concept Attribute :> element [
+		restricts scalar property hasType to exactly 1
+	]
+
+	scalar property hasType :> object_diagram:hasField [
+		domain Attribute
+		range xsd:string // not sure if this will work out - maybe we need a relation to the actual type (=an object) itself
+		functional
+	]
+	
+	// An association is a link, with one field (its name)
+	relation entity Association :> classlike, object_diagram:Link [
+		from Class
+		to Class
+		asymmetric
+		irreflexive
+	]
+
+	// A class diagram is a model (=a set of objects)
+	concept ClassDiagram :> object_diagram:Model [
+		restricts all relation object_diagram:hasObject to element
+	]
+}

+ 25 - 0
ontology/cdf/src/oml/flandersmake.be/cdf/vocabulary/dict.oml

@@ -0,0 +1,25 @@
+// Extension of object_diagram vocabulary
+vocabulary <http://flandersmake.be/cdf/vocabulary/dict#> as dict {
+	
+	extends <http://flandersmake.be/cdf/vocabulary/object_diagram#> as object_diagram
+	extends <http://www.w3.org/2001/XMLSchema#> as xsd
+
+	aspect Object []
+	
+	// In many vocabularies, we want to have "dictionaries" (key-value mappings).
+	// We choose to represent every dictionary entry by an 'Object', that has a 'key' and 'value' field
+	aspect DictEntry :> Object [
+		restricts scalar property hasKey to exactly 1
+		restricts scalar property hasValue to exactly 1
+	]
+	scalar property hasKey :> object_diagram:hasField [
+		domain DictEntry
+		range xsd:string
+		functional
+	]
+	scalar property hasValue :> object_diagram:hasField [
+		domain DictEntry
+		range xsd:string
+		functional
+	]
+}

+ 229 - 0
ontology/cdf/src/oml/flandersmake.be/cdf/vocabulary/drawio.oml

@@ -0,0 +1,229 @@
+// Vocabulary for the Draw.io file format
+vocabulary <http://flandersmake.be/cdf/vocabulary/drawio#> as drawio {
+
+	extends <http://flandersmake.be/cdf/vocabulary/object_diagram#> as object_diagram
+	extends <http://flandersmake.be/cdf/vocabulary/acyclic#> as acyclic
+	extends <http://flandersmake.be/cdf/vocabulary/dict#> as dict
+//	extends <http://flandersmake.be/cdf/vocabulary/ordered#> as ordered
+	extends <http://www.w3.org/2001/XMLSchema#> as xsd
+
+	aspect element :> object_diagram:Object []
+	
+	// Cells and Pages have a GUID generated by drawio.
+	aspect elementWithDrawioId :> element [
+		restricts scalar property hasDrawioId to exactly 1
+	]
+	scalar property hasDrawioId [
+		domain elementWithDrawioId
+		range xsd:string
+		functional
+	]
+
+	// All cells are vertices or edges, except for:
+	//   (1) The root cell of a page
+	//   (2) The cells that represent layers (direct children of the root cell)
+	aspect AbstractCell :> elementWithDrawioId []
+
+	scalar property hasValue [
+		domain Cell
+		range xsd:string
+		functional
+	]
+	
+	relation entity HasParentCell :> acyclic:Acyclic, object_diagram:Link [
+		from AbstractCell
+		to AbstractCell
+		forward hasParent
+		reverse hasChild
+		asymmetric
+		irreflexive
+		functional // all cells have one parent, except for the root cell
+	]
+	
+	relation entity HasProperty :> object_diagram:Link [
+		from AbstractCell
+		to CellProperty
+		forward hasProperty
+		reverse propertyOf
+		asymmetric
+		irreflexive
+		inverse functional
+	]
+	relation entity HasStyleEntry :> object_diagram:Link [
+		from AbstractCell
+		to CellStyleEntry
+		forward hasStyleEntry
+		reverse styleEntryOf
+		asymmetric
+		irreflexive
+		inverse functional
+	]
+	relation entity HasCellAttribute :> object_diagram:Link [
+		from AbstractCell
+		to CellAttribute
+		forward hasCellAttribute
+		reverse attributeOf
+		asymmetric
+		irreflexive
+		inverse functional
+	]
+	
+	concept CellProperty :> dict:DictEntry, element []
+	concept CellStyleEntry :> dict:DictEntry, element []
+	concept CellAttribute :> dict:DictEntry, element []
+	
+	structure Point [
+		restricts scalar property hasX to exactly 1
+		restricts scalar property hasY to exactly 1
+	]
+	scalar property hasX :> object_diagram:hasField [
+		domain Point
+		range xsd:decimal
+		functional
+	]
+	scalar property hasY :> object_diagram:hasField [
+		domain Point
+		range xsd:decimal
+		functional
+	]
+	
+	structure CellGeometry :> Point [
+		restricts scalar property hasWidth to exactly 1
+		restricts scalar property hasHeight to exactly 1
+	]
+	scalar property hasWidth :> object_diagram:hasField [
+		domain CellGeometry
+		range xsd:decimal
+		functional
+	]
+	scalar property hasHeight :> object_diagram:hasField [
+		domain CellGeometry
+		range xsd:decimal
+		functional
+	]
+	
+	// An edge may have an ordered sequence of 'waypoints'
+	// We'll add a 'list index' property to store the order.
+	structure PointListItem :> Point [
+		restricts scalar property hasListIndex to exactly 1
+	]
+	scalar property hasListIndex [
+		domain PointListItem
+		range xsd:nonNegativeInteger
+		functional
+	]
+	
+	structure EdgeGeometry []
+	structured property hasPoint [
+		domain EdgeGeometry
+		range PointListItem
+		// not functional: any number of points allowed
+	]
+	structured property hasSourcePoint [
+		domain EdgeGeometry
+		range Point
+		functional
+	]
+	structured property hasTargetPoint [
+		domain EdgeGeometry
+		range Point
+		functional
+	]
+	
+	concept Cell :> AbstractCell []
+	concept Edge :> AbstractCell []
+	
+	structured property hasCellGeometry [
+		domain Cell
+		range CellGeometry
+		functional
+	]
+	structured property hasEdgeGeometry [
+		domain Edge
+		range EdgeGeometry
+		functional
+	]
+	
+	relation entity EdgeHasSource [
+		from Edge
+		to Cell
+		forward hasSource
+		reverse sourceOf
+		functional
+		asymmetric
+		irreflexive
+	]
+	relation entity EdgeHasTarget [
+		from Edge
+		to Cell
+		forward hasTarget
+		reverse targetOf
+		functional
+		asymmetric
+		irreflexive
+	]
+	
+	concept Page :> elementWithDrawioId [
+		restricts relation ofModel to exactly 1
+		restricts scalar property hasName to exactly 1
+		restricts relation hasRootCell to exactly 1
+	]
+	
+	relation entity HasPageAttribute :> object_diagram:Link [
+		from Page
+		to PageAttribute
+		forward hasPageAttribute
+		reverse ofPage
+		asymmetric
+		irreflexive
+		inverse functional
+	]
+	relation entity HasRootCell :> object_diagram:Link [
+		from Page
+		to Cell
+		forward hasRootCell
+		reverse isRootOf
+		asymmetric
+		irreflexive
+		functional // every page has exactly one root cell
+		inverse functional // a cell can be the root of at most one page
+	]
+	
+	concept PageAttribute :> dict:DictEntry, element []
+	
+	scalar property hasName [
+		domain Page
+		range xsd:string
+		functional
+	]
+	
+	
+	// A Drawio file:
+	concept Model :> object_diagram:Model [
+		restricts all relation object_diagram:hasObject to element
+		restricts scalar property isCompressed to exactly 1
+		restricts scalar property hasDrawioVersion to exactly 1
+	]
+	
+	relation entity HasPage [
+		from Model
+		to Page
+		forward hasPage
+		reverse ofModel
+		inverse functional
+		asymmetric
+		irreflexive
+	]
+
+	scalar property isCompressed [
+		domain Model
+		range xsd:boolean
+		functional
+	]
+	
+	scalar property hasDrawioVersion [
+		domain Model
+		range xsd:string
+		functional
+	]
+}

+ 40 - 0
ontology/cdf/src/oml/flandersmake.be/cdf/vocabulary/ftg.oml

@@ -0,0 +1,40 @@
+vocabulary <http://flandersmake.be/cdf/vocabulary/ftg#> as ftg {
+	
+	extends <http://flandersmake.be/cdf/vocabulary/immutable#> as immutable
+	extends <http://www.w3.org/2001/XMLSchema#> as xsd
+
+	concept Transformation :> immutable:Thing [
+	]
+	
+	concept Formalism :> immutable:Thing [
+	]
+	
+	aspect InputOrOutput [
+		restricts scalar property hasName to exactly 1
+	]
+	
+	scalar property hasName [
+		domain InputOrOutput
+		range xsd:string
+		functional
+	]
+	
+
+	relation entity Input :> InputOrOutput [
+		from Transformation
+		to Formalism
+		forward hasInput
+		reverse isInputOf
+		asymmetric
+		irreflexive
+	]		
+
+	relation entity Output :> InputOrOutput [
+		from Transformation
+		to Formalism
+		forward hasOutput
+		reverse isOutputOf
+		asymmetric
+		irreflexive
+	]
+}

+ 15 - 0
ontology/cdf/src/oml/flandersmake.be/cdf/vocabulary/immutable.oml

@@ -0,0 +1,15 @@
+vocabulary <http://flandersmake.be/cdf/vocabulary/immutable#> as immutable {
+	
+	extends <http://www.w3.org/2001/XMLSchema#> as xsd
+
+	aspect Thing [
+		key hasUUID
+		restricts scalar property hasUUID to exactly 1 
+	]
+	
+	scalar property hasUUID [
+		domain Thing
+		range xsd:string
+		functional
+	]
+}

+ 37 - 0
ontology/cdf/src/oml/flandersmake.be/cdf/vocabulary/object_diagram.oml

@@ -0,0 +1,37 @@
+vocabulary <http://flandersmake.be/cdf/vocabulary/object_diagram#> as object_diagram {
+	
+	extends <http://www.w3.org/2000/01/rdf-schema#> as rdfs
+
+	aspect Object []
+	
+	// Compromise:
+	//  - use attributes only for scalar properties
+	//  - if we want to have a reference to an object as an attribute, use a link instead
+	
+	// Supertype of all scalar properties that we consider to be a 'field' of an object
+	// An object can have any number of fields, hence this property is not functional
+	scalar property hasField [
+		domain Object
+		range rdfs:Literal // e.g., string, float, boolean, ...
+	]
+
+	// A link is also an object, meaning:
+	//   - it can have attributes
+	//   - it can be the source/target of another link
+	relation entity Link :> Object [
+		from Object
+		to Object
+	]
+		
+	aspect Model []
+	
+	relation entity HasObject [
+		from Model
+		to Object
+		forward hasObject
+		reverse inModel
+		inverse functional // every Object can be part of at most one model
+		asymmetric
+		irreflexive
+	]
+}

+ 40 - 0
ontology/cdf/src/oml/flandersmake.be/cdf/vocabulary/ordered.oml

@@ -0,0 +1,40 @@
+vocabulary <http://flandersmake.be/cdf/vocabulary/ordered#> as ordered {
+	
+//	extends <http://flandersmake.be/cdf/vocabulary/acyclic#> as acyclic
+	extends <http://www.w3.org/2001/XMLSchema#> as xsd
+	
+	aspect List []
+	
+	relation entity HasItem [
+		from List
+		to ListItem
+		forward hasItem
+		reverse ofList
+		asymmetric
+		irreflexive
+		inverse functional
+	]
+	
+	aspect ListItem [
+		restricts scalar property hasIndex to exactly 1
+	]
+	
+//	relation entity Next :> acyclic:Acyclic [
+//		from ListItem
+//		to ListItem
+//		forward nextItem
+//		reverse prevItem
+//		asymmetric
+//		irreflexive
+//	]
+	
+//	rule N [
+//		hasItem(L,I1) ^ hasItem(L,I2) ^ hasIndex(I1, IDX1) ^ hasIndex(I2, IDX1+1) -> nextItem(I1, I2)
+//	]
+	
+	scalar property hasIndex [
+		domain ListItem
+		range xsd:nonNegativeInteger
+		functional
+	]
+}

+ 119 - 0
ontology/cdf/src/oml/flandersmake.be/cdf/vocabulary/pm.oml

@@ -0,0 +1,119 @@
+vocabulary <http://flandersmake.be/cdf/vocabulary/pm#> as pm {
+	
+	extends <http://www.w3.org/2001/XMLSchema#> as xsd
+	extends <http://flandersmake.be/cdf/vocabulary/object_diagram#> as object_diagram
+	extends <http://flandersmake.be/cdf/vocabulary/ftg#> as ftg
+
+	aspect CtrlSource []
+	aspect CtrlSink []
+	aspect DataSource []
+	aspect DataSink []
+	
+	relation entity CtrlFlow [
+		from CtrlSource
+		to CtrlSink
+		forward ctrlTo
+		reverse ctrlFrom
+		asymmetric
+		irreflexive
+	]
+	relation entity DataFlow [
+		from DataSource
+		to DataSink
+		forward dataTo
+		reverse dataFrom
+		asymmetric
+		irreflexive
+	]
+	
+	aspect Named [
+		restricts scalar property hasName to exactly 1
+	]
+	scalar property hasName :> object_diagram:hasField [
+		domain Named
+		range xsd:string
+		functional
+	]
+
+	aspect element :> object_diagram:Object []
+	
+	concept Activity :> element, Named [
+		// must have at least one of the following port types:
+		restricts some relation hasPort to CtrlInputPort
+		restricts some relation hasPort to CtrlOutputPort
+	]
+	
+	relation entity IsTransformation [
+		from Activity
+		to ftg:Transformation
+		forward isTransformation
+		reverse occursAsActivity
+		functional
+		asymmetric
+		irreflexive
+	]
+	
+	aspect Port :> element, Named [
+		restricts relation ofActivity to exactly 1
+	]
+	
+	relation entity HasPort :> object_diagram:Link [
+		from Activity
+		to Port
+		forward hasPort
+		reverse ofActivity
+		asymmetric
+		irreflexive
+		inverse functional
+	]
+	
+	// Every port can only have one incoming/outgoing connection
+	concept CtrlOutputPort :> CtrlSource, Port [
+		restricts relation ctrlTo to exactly 1
+	]
+	concept CtrlInputPort :> CtrlSink, Port [
+		restricts relation ctrlFrom to exactly 1
+	]
+	concept DataOutputPort :> DataSource, Port [
+		restricts relation dataTo to exactly 1
+	]
+	concept DataInputPort :> DataSink, Port [
+		restricts relation dataFrom to exactly 1
+	]
+	
+	concept Start :> element, CtrlSource [
+		restricts relation ctrlTo to exactly 1
+	]
+	concept Final :> element, CtrlSink [
+		restricts relation ctrlFrom to exactly 1
+	]
+	
+	concept Artifact :> element, Named, DataSource, DataSink [
+		// an artifact must come from somewhere :)
+		restricts relation dataTo to min 1
+	]
+	
+	relation entity HasType [
+		from Artifact
+		to ftg:Formalism
+		forward hasType
+		reverse occursAsArtifact
+		functional
+		asymmetric
+		irreflexive
+	]
+	
+	concept ForkJoin :> element, CtrlSink, CtrlSource [
+		restricts relation ctrlFrom to min 1
+		restricts relation ctrlTo to min 1
+	]
+	
+	concept Merge :> element, CtrlSink, CtrlSource [
+		// Only one outgoing control flow link:
+		restricts relation ctrlTo to exactly 1
+	]
+	
+	concept Model :> object_diagram:Model [
+		restricts all relation object_diagram:hasObject to element
+	]
+}

+ 79 - 0
ontology/cdf/src/oml/flandersmake.be/cdf/vocabulary/pt.oml

@@ -0,0 +1,79 @@
+vocabulary <http://flandersmake.be/cdf/vocabulary/pt#> as pt {
+	
+	extends <http://flandersmake.be/cdf/vocabulary/acyclic#> as acyclic
+	extends <http://flandersmake.be/cdf/vocabulary/immutable#> as immutable
+	extends <http://flandersmake.be/cdf/vocabulary/ftg#> as ftg
+	extends <http://flandersmake.be/cdf/vocabulary/object_diagram#> as object_diagram
+
+	extends <http://www.w3.org/2001/XMLSchema#> as xsd
+	
+	aspect Event :> immutable:Thing [
+		restricts scalar property hasTimestamp to exactly 1
+	]
+	
+	scalar property hasTimestamp [
+		domain Event
+		range xsd:dateTimeStamp
+		functional
+	]
+	
+	relation entity HappenedAfter :> acyclic:Acyclic [
+		from Event
+		to Event
+		forward happenedAfter
+		reverse happenedBefore
+		asymmetric
+		irreflexive
+	]
+
+	aspect Artifact :> immutable:Thing []
+	
+	// InternalArtifact: All model elements exist as descriptions in the ontology, are checked for consistency with their vocabulary, and can be part of SPARQL queries.
+	concept InternalArtifact :> Artifact, object_diagram:Model []
+	
+	// ExternalArtifact: We only keep the model as an immutable file, that we don't interpret any further. The immutable::UUID property is a URI of the file.
+	concept ExternalArtifact :> Artifact []
+	
+	concept StartEvent :> Event []
+	concept EndEvent :> Event [
+		restricts relation ended to exactly 1
+	]
+	
+	// We use 'past tense' for all relations on events, because they are historical in nature.
+	
+	relation entity Started [
+		from StartEvent
+		to ftg:Transformation
+		forward started
+		reverse wasStartedBy
+		asymmetric
+		irreflexive
+		functional
+	]
+	relation entity Ended [
+		from EndEvent
+		to StartEvent
+		forward ended
+		reverse wasEndedBy
+		asymmetric
+		irreflexive
+		functional
+	]
+
+	relation entity Consumed [
+		from StartEvent
+		to Artifact
+		forward consumed
+		reverse wasConsumedBy
+		asymmetric
+		irreflexive
+	]
+	relation entity Produced [
+		from EndEvent
+		to Artifact
+		forward produced
+		reverse wasProducedBy
+		asymmetric
+		irreflexive
+	]
+}

+ 78 - 0
ontology/cdf/src/oml/flandersmake.be/cdf/vocabulary/statechart.oml

@@ -0,0 +1,78 @@
+vocabulary <http://flandersmake.be/cdf/vocabulary/statechart#> as statechart {
+	
+	extends <http://flandersmake.be/cdf/vocabulary/acyclic#> as acyclic
+	extends <http://flandersmake.be/cdf/vocabulary/object_diagram#> as object_diagram
+	extends <http://www.w3.org/2001/XMLSchema#> as xsd
+	
+	aspect element :> object_diagram:Object []
+	
+	aspect State :> element [
+		restricts scalar property hasName to exactly 1
+	]
+	
+	scalar property hasName :> object_diagram:hasField [
+		domain State
+		range xsd:string
+		functional
+	]
+	
+	concept OrState :> State [
+		restricts relation hasDefaultState to exactly 1
+		restricts relation hasChild to min 1
+	]
+	
+	relation entity DefaultState :> object_diagram:Link [
+		from OrState
+		to State
+		forward hasDefaultState
+		reverse isDefaultStateOf
+		functional
+		asymmetric
+		irreflexive
+	]
+
+	rule DefaultStateIsChild [
+		OrState(P) ^ hasDefaultState(P,C) -> hasChild(P,C)
+	]
+
+	
+	concept AndState :> State []
+	
+	relation entity Parent :> object_diagram:Link, acyclic:Acyclic [
+		from State
+		to State
+		forward hasParent
+		reverse hasChild
+		functional
+		asymmetric
+		irreflexive
+	]
+		
+	relation entity Transition :> object_diagram:Link, element [
+		from State
+		to State
+		
+		restricts scalar property hasLabel to exactly 1
+	]
+	
+	scalar property hasLabel :> object_diagram:hasField [
+		domain Transition
+		range xsd:string
+		functional
+	]
+	
+	concept Model :> object_diagram:Model, object_diagram:Object [
+		restricts relation hasRoot to exactly 1
+		restricts all relation object_diagram:hasObject to element
+	]
+	
+	relation entity Root :> object_diagram:Link [
+		from Model
+		to OrState
+		forward hasRoot
+		reverse rootOf
+		functional
+		asymmetric
+		irreflexive
+	]
+}

+ 16 - 0
ontology/cdf/src/oml/flandersmake.be/cdf/vocabulary/versioned.oml

@@ -0,0 +1,16 @@
+vocabulary <http://flandersmake.be/cdf/vocabulary/versioned#> as versioned {
+
+	extends <http://flandersmake.be/cdf/vocabulary/acyclic#> as acyclic
+	extends <http://flandersmake.be/cdf/vocabulary/immutable#> as immutable
+
+	aspect Versioned :> immutable:Thing []
+	
+	relation entity HasParent :> acyclic:Acyclic [
+		from Versioned
+		to Versioned
+		forward hasParent
+		reverse isParentOf
+		asymmetric
+		irreflexive
+	]
+}

+ 137 - 0
ontology/cdf/src/oml/flandersmake.be/cdf/vocabulary/xopp.oml

@@ -0,0 +1,137 @@
+// Vocabulary for the Xournal++ file format
+vocabulary <http://flandersmake.be/cdf/vocabulary/xopp#> as xopp {
+
+	extends <http://flandersmake.be/cdf/vocabulary/object_diagram#> as object_diagram
+	extends <http://flandersmake.be/cdf/vocabulary/dict#> as dict
+	extends <http://www.w3.org/2001/XMLSchema#> as xsd
+
+	aspect element :> object_diagram:Object []
+	
+	aspect LayerElement :> element [
+		restricts relation inLayer to exactly 1
+		restricts scalar property hasText to exactly 1
+	]
+	scalar property hasText :> object_diagram:hasField [
+		domain LayerElement
+		range xsd:string
+		functional
+	]
+
+	relation entity HasXMLAttribute :> object_diagram:Link [
+		from LayerElement
+		to XMLAttribute
+		forward hasAttribute
+		reverse ofLayerElement
+		inverse functional
+	]
+	
+	concept XMLAttribute :> element, dict:DictEntry [
+		restricts relation ofLayerElement to exactly 1
+	]
+	
+	concept Text :> LayerElement []
+	concept Stroke :> LayerElement []
+	
+	concept Layer :> element [
+		restricts relation inPage to exactly 1
+	]
+	
+	relation entity HasLayerElement :> object_diagram:Link [
+		from Layer
+		to LayerElement
+		forward hasElement
+		reverse inLayer
+		inverse functional
+		asymmetric
+		irreflexive
+	]
+	
+	concept Page :> element [
+		restricts relation inFile to exactly 1
+		restricts scalar property hasWidth to exactly 1
+		restricts scalar property hasHeight to exactly 1
+		restricts scalar property hasBackgroundType to exactly 1
+		restricts scalar property hasBackgroundColor to exactly 1
+		restricts scalar property hasBackgroundStyle to exactly 1
+	]
+
+	scalar property hasWidth :> object_diagram:hasField [
+		domain Page
+		range xsd:decimal
+		functional
+	]
+	scalar property hasHeight :> object_diagram:hasField [
+		domain Page
+		range xsd:decimal
+		functional
+	]
+	scalar property hasBackgroundType :> object_diagram:hasField [
+		domain Page
+		range xsd:string
+		functional
+	]
+	scalar property hasBackgroundColor :> object_diagram:hasField [
+		domain Page
+		range xsd:string
+		functional
+	]
+	scalar property hasBackgroundStyle :> object_diagram:hasField [
+		domain Page
+		range xsd:string
+		functional
+	]
+	relation entity HasLayer :> object_diagram:Link [
+		from Page
+		to Layer
+		forward hasLayer
+		reverse inPage
+		inverse functional
+		asymmetric
+		irreflexive
+	]
+	
+	concept File :> element [
+		restricts relation hasPage to min 1
+		
+		restricts scalar property hasCreator to exactly 1
+		restricts scalar property hasFileVersion to exactly 1
+		restricts scalar property hasTitle to exactly 1
+	]
+	
+	scalar property hasCreator :> object_diagram:hasField [
+		domain File
+		range xsd:string
+		functional
+	]
+	scalar property hasFileVersion :> object_diagram:hasField [
+		domain File
+		range xsd:integer
+		functional
+	]
+	scalar property hasTitle :> object_diagram:hasField [
+		domain File
+		range xsd:string
+		functional
+	]
+	scalar property hasPreview :> object_diagram:hasField [
+		domain File
+//		range xsd:base64Binary // PNG-encoded // Doesn't seem to be working, workaround below
+		range xsd:string // Workaround
+		functional
+	]	
+	
+	relation entity HasPage :> object_diagram:Link [
+		from File
+		to Page
+		forward hasPage
+		reverse inFile
+		asymmetric
+		irreflexive
+		inverse functional
+	]
+	
+	// A Xournal++ file:
+	concept Model :> object_diagram:Model [
+		restricts all relation object_diagram:hasObject to element
+	]
+}

+ 7 - 0
ontology/cdf/src/sparql/GetAncestors.sparql

@@ -0,0 +1,7 @@
+PREFIX statechart: <http://flandersmake.be/cdf/vocabulary/statechart#>
+
+SELECT ?child ?parent
+WHERE {
+	?child statechart:hasAncestor ?parent . 
+	?child statechart:hasName "s1" .
+}

+ 12 - 0
ontology/cdf/src/sparql/GetFields.sparql

@@ -0,0 +1,12 @@
+# Get all fields of all objects
+
+PREFIX object_diagram: <http://flandersmake.be/cdf/vocabulary/object_diagram#>
+
+SELECT ?object ?fieldType ?fieldValue
+WHERE {
+	?object object_diagram:hasField ?fieldValue .
+	?object ?fieldType ?fieldValue .
+	
+	# We're only interested in the more concrete property:
+	FILTER(?fieldType != object_diagram:hasField)
+}

+ 8 - 0
ontology/cdf/src/sparql/GetFormalisms.sparql

@@ -0,0 +1,8 @@
+PREFIX ftg: <http://flandersmake.be/cdf/vocabulary/ftg#>
+PREFIX immutable: <http://flandersmake.be/cdf/vocabulary/immutable#> 
+
+SELECT DISTINCT ?uuid
+WHERE {
+	?formalism a ftg:Formalism . 
+	?formalism immutable:hasUUID ?uuid . 
+}

+ 9 - 0
ontology/cdf/src/sparql/GetInputsOfT1.sparql

@@ -0,0 +1,9 @@
+PREFIX ftg: <http://flandersmake.be/cdf/vocabulary/ftg#>
+PREFIX immutable: <http://flandersmake.be/cdf/vocabulary/immutable#>
+
+SELECT ?formalism
+WHERE {
+	?formalism a ftg:Formalism .
+	?transformation ftg:hasInput ?formalism .
+	?transformation immutable:hasUUID "t1" .
+}

+ 6 - 0
ontology/cdf/src/sparql/GetLinks.sparql

@@ -0,0 +1,6 @@
+PREFIX object_diagram: <http://flandersmake.be/cdf/vocabulary/object_diagram#>
+
+SELECT ?link
+WHERE {
+	?link a object_diagram:Link .
+}

+ 8 - 0
ontology/cdf/src/sparql/GetModels.sparql

@@ -0,0 +1,8 @@
+PREFIX object_diagram: <http://flandersmake.be/cdf/vocabulary/object_diagram#>
+PREFIX immutable: <http://flandersmake.be/cdf/vocabulary/immutable#>
+
+SELECT DISTINCT ?m ?uuid
+WHERE {
+	?m a object_diagram:Model . 
+	?m immutable:hasUUID ?uuid
+}

+ 6 - 0
ontology/cdf/src/sparql/GetObjects.sparql

@@ -0,0 +1,6 @@
+PREFIX object_diagram: <http://flandersmake.be/cdf/vocabulary/object_diagram#>
+
+SELECT ?object
+WHERE {
+	?object a object_diagram:Object .
+}

+ 10 - 0
ontology/cdf/src/sparql/GetObjectsOfPM12.sparql

@@ -0,0 +1,10 @@
+PREFIX object_diagram: <http://flandersmake.be/cdf/vocabulary/object_diagram#>
+PREFIX immutable: <http://flandersmake.be/cdf/vocabulary/immutable#>
+
+SELECT ?elem
+WHERE {
+	?model1 immutable:hasUUID "pm1" .
+	?model2 immutable:hasUUID "pm2" .
+	?model1 object_diagram:hasObject ?elem .
+	?model2 object_diagram:hasObject ?elem .
+} 

+ 6 - 0
ontology/cdf/src/sparql/GetTransitions.sparql

@@ -0,0 +1,6 @@
+PREFIX statechart: <http://flandersmake.be/cdf/vocabulary/statechart#>
+
+SELECT ?t
+WHERE {
+	?t a statechart:Transition . 
+}

+ 24 - 0
ontology/drivetrain/.fuseki.ttl

@@ -0,0 +1,24 @@
+@prefix fuseki:  <http://jena.apache.org/fuseki#> .
+@prefix rdf:     <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
+@prefix rdfs:    <http://www.w3.org/2000/01/rdf-schema#> .
+@prefix tdb:     <http://jena.hpl.hp.com/2008/tdb#> .
+@prefix ja:      <http://jena.hpl.hp.com/2005/11/Assembler#> .
+@prefix :        <#> .
+
+[] rdf:type fuseki:Server .
+
+<#service> rdf:type fuseki:Service ;
+    rdfs:label          "Drivetrain" ;												# Human readable label for dataset
+    fuseki:name         "Drivetrain" ;												# Name of the dataset in the endpoint url
+    fuseki:serviceReadWriteGraphStore "data" ;											# SPARQL Graph store protocol (read and write)
+    fuseki:endpoint 	[ fuseki:operation fuseki:query ;	fuseki:name "sparql"  ] ;	# SPARQL query service
+    fuseki:endpoint 	[ fuseki:operation fuseki:shacl ;	fuseki:name "shacl" ] ;		# SHACL query service
+    fuseki:dataset      <#dataset> .
+
+## In memory TDB with union graph.
+<#dataset> rdf:type   tdb:DatasetTDB ;
+  tdb:location "--mem--" ;
+  # Query timeout on this dataset (1s, 1000 milliseconds)
+  ja:context [ ja:cxtName "arq:queryTimeout" ; ja:cxtValue "1000" ] ;
+  # Make the default graph be the union of all named graphs.
+  tdb:unionDefaultGraph true .

+ 46 - 0
ontology/drivetrain/.project

@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>Drivetrain</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.buildship.core.gradleprojectbuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.xtext.ui.shared.xtextBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>io.opencaesar.rosetta.oml.ui.builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.eclipse.buildship.core.gradleprojectnature</nature>
+		<nature>io.opencaesar.rosetta.oml.ui.nature</nature>
+		<nature>org.eclipse.xtext.ui.shared.xtextNature</nature>
+	</natures>
+	<filteredResources>
+		<filter>
+			<id>1685229357223</id>
+			<name></name>
+			<type>30</type>
+			<matcher>
+				<id>org.eclipse.core.resources.regexFilterMatcher</id>
+				<arguments>node_modules|\.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__</arguments>
+			</matcher>
+		</filter>
+	</filteredResources>
+</projectDescription>

+ 0 - 0
ontology/drivetrain/README.md


Some files were not shown because too many files changed in this diff