From ceb8ee832a680cb2adfffa2b552489acac4dc913 Mon Sep 17 00:00:00 2001 From: Matthias Urban Date: Fri, 17 Jul 2020 15:55:42 +0200 Subject: [PATCH 01/57] Update to v3.3.9 Fixes #12 --- docs/source/conversion_owl_to_yaml.md | 103 -------------------------- docs/source/included_ontologies.md | 12 +++ docs/source/index.md | 4 +- docs/source/owl_ontologies.md | 53 +++++++++++++ docs/source/working_with_emmo.md | 45 ----------- docs/source/yaml_spec.md | 77 ++++++++++--------- 6 files changed, 107 insertions(+), 187 deletions(-) delete mode 100644 docs/source/conversion_owl_to_yaml.md create mode 100644 docs/source/included_ontologies.md create mode 100644 docs/source/owl_ontologies.md delete mode 100644 docs/source/working_with_emmo.md diff --git a/docs/source/conversion_owl_to_yaml.md b/docs/source/conversion_owl_to_yaml.md deleted file mode 100644 index 18a79b7..0000000 --- a/docs/source/conversion_owl_to_yaml.md +++ /dev/null @@ -1,103 +0,0 @@ -# How to convert an OWL ontology to YAML - -OSP-core requires an ontology in YAML format for installation. -This document explains how an ontology in OWL format can be -converted to YAML. - -## Prerequisites - -- We use owlready2 for the conversion. Therefore, the ontology -must be in one of the following formats: RDF/XML, OWL/XML, NTriples. -- Make sure you ran the reasoner and exported the inferred axioms. -- OSP-core must be installed - -## Conversion - -This section will explain in detail how you can convert an OWL ontology -to YAML. We will use the EMMO as an example. -The document doc/working_with_emmo.md explains how you can get the EMMO. - -1. The script for the conversion is called owl2yml. Call it with the -h option - to print help: - - ```sh - $ owl2yml -h - usage: owl2yml [-h] --namespace NAMESPACE [--conversion_options_file CONVERSION_OPTIONS_FILE] [--version VERSION] [--output-file OUTPUT_FILE] input-file - - Convert an ontology in OWL format to an ontology in YAML format. - - positional arguments: - input-file The path to the input owl file - - optional arguments: - -h, --help show this help message and exit - --namespace NAMESPACE, -n NAMESPACE - The namespace for the resulting YAML file in UPPERCASE - --conversion_options_file CONVERSION_OPTIONS_FILE, -c CONVERSION_OPTIONS_FILE - Path to a file explaining how the ontology should be transformed, s.t. it is compatible with OSP-core - --version VERSION, -v VERSION - The version string for the resulting YAML file - --output-file OUTPUT_FILE, -o OUTPUT_FILE - Where the output file should be saved - ``` - -2. You have to specify the owl input file and the namespace, - with which the entities in the owl file should be accessible in OSP-core: - - ```sh - $ owl2yml -n MY_NAMESPACE path/to/owlfile.owl - ``` - -3. Optionally, you can specify a version string: - - ```sh - $ owl2yml -n MY_NAMESPACE path/to/owlfile.owl -v 0.0.1 - ``` - -4. Optionally, you can specify where the resulting yaml file should be stored: - - ```sh - $ owl2yml -n MY_NAMESPACE ../../owlfile.owl -o result.yml - ``` - -5. It is recommended that you extend the ontology, - such that it is easier to use with OSP-core. - For that you have to create a yaml file in - the following format: - - ```yaml - --- - default_rel: - active_relationships: [list_of_iris] - insert_entities: - VALUE: - subclass_of: - - CUBA.ATTRIBUTE - datatype: FLOAT - update_entities: - NUMBER: - attributes: - - MY_NAMESPACE.VALUE - ``` - - - For EMMO, this file is provided and located in `osp/core/tools/conversion_options/emmo.conversion_options.yml` - - - You can specify a default relationship with the `default_rel` keyword. - You have to provide the IRI of the relationship. - In OSP-core, when you add one CUDS objects to another without specifying a relationship, this relationship will be used. - - - CUDS objects are containers conceptually. - Therefore, you need to specify which relationships encode a containment in a CUDS objects. - We call these relationships `active relationships`. - Let's say you have a relationship `contains` in the ontology. - You want to specify that every cuds object related to cuds object A with `contains` should be in the container of A. - Then `contains` should be marked as an active relationship. - Note that the edge-induced graph of the cuds objects by only considering active relationships must be acyclic at any point in time. - Active relationships must not be symmetric. - See `doc/yaml_spec.md` for more details. - You can specify active relationships with the `active_relationships` keyword. - You need to provide a list of IRIs of relationships that should become an active relationship. - - - If you are not satisfied with your result, you can manually modify the resulting yml file. - You can also use the keywords `insert_entities` or `update_entities` to modify the resulting - yml automatically. diff --git a/docs/source/included_ontologies.md b/docs/source/included_ontologies.md new file mode 100644 index 0000000..7a4d30a --- /dev/null +++ b/docs/source/included_ontologies.md @@ -0,0 +1,12 @@ +emmo, city +--> few words about them + +Install them using: + +`pico install city` + +`pico install emmo` + +otherwise use + +`pico install ` \ No newline at end of file diff --git a/docs/source/index.md b/docs/source/index.md index cfbfe1b..a7f6d62 100644 --- a/docs/source/index.md +++ b/docs/source/index.md @@ -38,9 +38,9 @@ Here you can browse though the general documentation of SimPhoNy. :caption: Ontology :maxdepth: 2 - conversion_owl_to_yaml.md - working_with_emmo.md + included_ontologies.md yaml_spec.md + owl_ontologies.md .. toctree:: :caption: Additional diff --git a/docs/source/owl_ontologies.md b/docs/source/owl_ontologies.md new file mode 100644 index 0000000..16993f7 --- /dev/null +++ b/docs/source/owl_ontologies.md @@ -0,0 +1,53 @@ +To install owl ontologies in osp-core, you have to create a configuration yaml file similar +to the following one: + +```yml +identifier: emmo +ontology_file: https://raw.githubusercontent.com/emmo-repo/EMMO/master/emmo-inferred.owl +reference_by_label: True +namespaces: + mereotopology: http://emmo.info/emmo/top/mereotopology + physical: http://emmo.info/emmo/top/physical + top: http://emmo.info/emmo/top + semiotics: http://emmo.info/emmo/top/semiotics + perceptual: http://emmo.info/emmo/middle/perceptual + reductionistic: http://emmo.info/emmo/middle/reductionistic + holistic: http://emmo.info/emmo/middle/holistic + physicalistic: http://emmo.info/emmo/middle/physicalistic + math: http://emmo.info/emmo/middle/math + properties: http://emmo.info/emmo/middle/properties + materials: http://emmo.info/emmo/middle/materials + metrology: http://emmo.info/emmo/middle/metrology + models: http://emmo.info/emmo/middle/models + manufacturing: http://emmo.info/emmo/middle/manufacturing + isq: http://emmo.info/emmo/middle/isq + siunits: http://emmo.info/emmo/middle/siunits +active_relationships: + - http://emmo.info/emmo/top/mereotopology#EMMO_8c898653_1118_4682_9bbf_6cc334d16a99 + - http://emmo.info/emmo/top/semiotics#EMMO_60577dea_9019_4537_ac41_80b0fb563d41 +default_relationship: http://emmo.info/emmo/top/mereotopology#EMMO_17e27c22_37e1_468c_9dd7_95e137f73e7f +``` + +identifier: Name of the package that contains multiple namespaces. +Will be used for uninstallation: `pico uninstall emmo`. +(In YAML ontologies this package name or identifier is the same as the namespace name). + +ontology_file: Path to the inferred owl ontology (Reasoner must be executed). +Inferred file already given in case of Emmo (Reasoner not yet included in osp-core) +Should be in one of the follwoing file formats: +RDF/XML, N3, NTriples, N-Quads, Turtle, TriX, RDFa and Microdata + +reference by label (default False): Whether the label should be used or the IRI suffix to reference +entity from within osp-core. Must true in case of EMMO, because IRI suffixes are not +human friendly. In this case all labels should be unique and not contain whitespaces. +If False, use dot notation to get by IRI and __getitem__ or `[]` to get by label. +The latter will return a list of all entities with the same label. + +namespaces: mapping from namespace name (used to import the namespace) to iri prefix. +If IRI doesn't end with "/" or "#", "#" will be added. + +active relationships: +List of iris of active relationships. + +default relationship: +the default relationship. \ No newline at end of file diff --git a/docs/source/working_with_emmo.md b/docs/source/working_with_emmo.md deleted file mode 100644 index cdd024c..0000000 --- a/docs/source/working_with_emmo.md +++ /dev/null @@ -1,45 +0,0 @@ -# Working with EMMO using OSP-core - -Follow these steps to use EMMO with OSP-core. - -1. Clone the repo of EMMO: - - ```sh - git clone https://github.com/emmo-repo/EMMO.git - cd EMMO - ``` - -2. Checkout the branch of choice: - - ```sh - git checkout - ``` - -3. Start Protege 5.2.0 with installed FaCT++ reasoner plugin - -4. Open EMMO. For example open (File > Open...) the following file: - - emmo/emmo_all.owl - -5. Run the FaCT++ reasoner (Reasoner > FaCT++ | Reasoner > Start Reasoner) - -6. Export the inferred Axioms (File > Export inferred axioms as ontology) - -7. Convert the resulting owl file to YAML: - - ```sh - owl2yml -n EMMO emmo_inferred.owl -c osp/core/tools/conversion_options/emmo.conversion_options.yml - ``` - -8. Install the resulting YAML file: - - ```sh - pico install ontology.emmo.yml - ``` - -9. Start creating cuds objects. Check the getting-started repository in the SimPhoNy group. - - ```py - >>> from osp.core import emmo - >>> n = emmo.Number(value=1) - >>> ... - ``` diff --git a/docs/source/yaml_spec.md b/docs/source/yaml_spec.md index 188a9ac..389649c 100644 --- a/docs/source/yaml_spec.md +++ b/docs/source/yaml_spec.md @@ -1,11 +1,10 @@ # Description of YAML format Specification -This file describes the ontology format that is used by OSP-core. +This file describes how you can create ontologies using YAML. ## Info -Contact: [Matthias Urban](mailto:matthias.urban@iwm.fraunhofer.de) and [Pablo de Andres](mailto:pablo.de.andres@iwm.fraunhofer.de) from the -Material Informatics team, Fraunhofer IWM. +Contact: [Matthias Urban](mailto:matthias.urban@iwm.fraunhofer.de) and [Pablo de Andres](mailto:pablo.de.andres@iwm.fraunhofer.de) from the Material Informatics team, Fraunhofer IWM. Version: 3.0 pending approval @@ -28,7 +27,7 @@ and constraints on their logically consistent application. (Source: ## Naming of the files -Name any ontolgy `ontology..yml`, where `` should be replaced by a user defined name. +Name any ontolgy `.ontology.yml`, where `` should be replaced by a user defined name. ## Syntax of the .yml ontology @@ -58,7 +57,12 @@ Name any ontolgy `ontology..yml`, where `` should be replaced by a u > Contains individual declarations for ontology entities as a mapping. > Each key of the mapping is the name of an ontology entity. -> The key should be ALL_UPPERCASE, with underscore as separation. +> The key can contain letters, numbers and underscore. +> By convention, they should be in CamelCase. The name of ontology classes +> should start with an uppercase latter, while the name of relationships +> and attributes should start with a lower case letter. +> This key is later used the reference the entity from within osp-core +> in a case sensitive manner. > The value of the mapping is a mapping whose format is detailed in the > [Ontology entities format](#ontology-entities-format). @@ -95,31 +99,30 @@ For attributes, these keys are described in The CUBA namespace contains a set of Common Universal Basic entities, that have special meaning in OSP-core. The CUBA namespace is always installed in OSP-core. -`CUBA.ENTITY` -> The entity is the root of the ontology. It is the only entity which does not have a superclass. -> Every other entity is a subclass of `ENTITY`. +`cuba.Class` +> The root for all ontology classes. Does not have a superclass. -`CUBA.NOTHING` +`cuba.Nothing` > An ontology class, that is not allowed to have individuals. -`CUBA.RELATIONSHIP` -> The root of all relationships. Its direct superclass is `ENTITY`. +`cuba.relationship` +> The root of all relationships. Does not have a superclass. -`CUBA.ATTRIBUTE` -> The root of all attributes. Its direct superclass is `ENTITY`. +`cuba.attribute` +> The root of all attributes. Does not have a superclass. -`CUBA.WRAPPER` +`cuba.Wrapper` > The root of all wrappers. These are the bridge to simulation engines and databases. See the examples in examples/. -`CUBA.ACTIVE_RELATIONSHIP` +`cuba.activeRelationship` > The root of all active relationships. Active relationships express that one cuds object is in the container of another. -`CUBA.PASSIVE_RELATIONSHIP` -> The inverse of `CUBA.ACTIVE_RELATIONSHIP`. +`cuba.passiveRelationship` +> The inverse of `cuba.activeRelationship`. ## Attribute format -Every attribute is a subclass of `ATTRIBUTE`. +Every attribute is a subclass of `cuba.attribute`. The declaration of an attribute is a special case of the declaration of an entity. It must have the keys described in [Ontology entities format](#ontology-entities-format). It can additionally have the following keys: @@ -166,9 +169,9 @@ They can be either: - Requirements on the individual's relationships. For example: ```yaml - CITY.HAS_INHABITANT: + city.hasInhabitant: cardinality: 1+ - range: CITY.CITIZEN + range: city.Citizen exclusive: false ``` @@ -196,8 +199,8 @@ They can be either: ```yaml or: - - CITY.CITY - - CITY.NEIGHBOURHOOD + - city.City + - city.Neighborhood ``` This is the union of all individuals that are a city or a neighbourhood. @@ -209,10 +212,10 @@ The definition of class expressions is recursive. For example: ```yaml or: - - CITY.CITY - - CITY.HAS_PART: + - city.City + - city.hasPart: cardinality: 1+ - range: CITY.NEIGHBOURHOOD + range: city.Neighborhood exclusive: false ``` @@ -229,11 +232,11 @@ It can contain further information: > Each key must correspond to a subclass of `ATTRIBUTE`. For example: > > ```yaml -> ADDRESS: +> Address: > ... > attributes: -> CITY.NAME: "Street" -> CITY.NUMBER: +> city.name: "Street" +> city.number: > ``` > > Here, an address has a name and a number. @@ -246,12 +249,12 @@ It can contain further information: > individuals are allowed that are in the intersection of the class expressions. For example: > > ```yaml -> POPULATED_PLACE: +> PopulatedPlace: > description: > subclass_of: -> - CITY.GEOGRAPHICAL_PLACE -> - CITY.HAS_INHABITANT: -> range: CITY.CITIZEN +> - city.GeographicalPlace +> - city.hasInhabitant: +> range: city.Citizen > cardinality: many > exclusive: true > ``` @@ -265,12 +268,12 @@ It can contain further information: > A list of class expressions who contain the same individuals as the cuds entity. For example: > > ```yaml -> POPULATED_PLACE: +> PopulatedPlace: > description: > equivalent_to: -> - CITY.GEOGRAPHICAL_PLACE -> - CITY.HAS_INHABITANT: -> range: CITY.CITIZEN +> - city.GeographicalPlace +> - city.hasInhabitant: +> range: city.Citizen > cardinality: many > exclusive: true > ``` @@ -279,7 +282,7 @@ It can contain further information: ## Relationship format -Every relationship is a subclass of `RELATIONSHIP`. +Every relationship is a subclass of `cuba.relationship`. The declaration of a relationship is a special case of the declaration of an entity. It must have the keys described in [Ontology entities format](#ontology-entities-format). Furthermore, it can contain the following information: From fa68b25e3effef384d33f36a1ab252c190674ec8 Mon Sep 17 00:00:00 2001 From: Matthias Urban Date: Wed, 5 Aug 2020 17:16:55 +0200 Subject: [PATCH 02/57] updated the ontology documentation --- docs/source/conf.py | 3 + docs/source/getting_started.md | 2 +- docs/source/included_ontologies.md | 58 ++- docs/source/index.md | 10 +- .../quantum-espresso-checkpoint.ipynb | 338 ++++++++++++++++++ docs/source/jupyter/quantum-espresso.ipynb | 43 ++- docs/source/ontology_intro.md | 13 + docs/source/owl.md | 100 +++++- docs/source/owl_ontologies.md | 53 --- docs/source/yaml.md | 28 +- 10 files changed, 548 insertions(+), 100 deletions(-) create mode 100644 docs/source/jupyter/.ipynb_checkpoints/quantum-espresso-checkpoint.ipynb create mode 100644 docs/source/ontology_intro.md delete mode 100644 docs/source/owl_ontologies.md diff --git a/docs/source/conf.py b/docs/source/conf.py index 88bf52c..f61b312 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -75,3 +75,6 @@ def setup(app): # 'enable_auto_doc_ref': True, }, True) app.add_transform(AutoStructify) + + +nbsphinx_allow_errors = True diff --git a/docs/source/getting_started.md b/docs/source/getting_started.md index 0049d08..c2fb587 100644 --- a/docs/source/getting_started.md +++ b/docs/source/getting_started.md @@ -151,7 +151,7 @@ Said ontology must be in a YAML format as defined by [our specification](yaml.md OSP-core can also be used with EMMO (European Materials and Modelling Ontology). -Tools for converting EMMO from the OWL format to YAML are provided. See more [here](working_with_emmo.md). +See more [here](included_ontologies.md). ### Python classes Upon installation of OSP-core, each ontology class (except from attributes and relationships) becomes a python class. diff --git a/docs/source/included_ontologies.md b/docs/source/included_ontologies.md index 7a4d30a..c4cc73f 100644 --- a/docs/source/included_ontologies.md +++ b/docs/source/included_ontologies.md @@ -1,12 +1,56 @@ -emmo, city ---> few words about them +# Included ontologies -Install them using: +## The City ontology -`pico install city` +OSP core currently ships with two ontologies. +The first one, called `city` is a simple example ontology. +You can use it to play around and get familiar with osp-core. +We will also use it a lot in this documentation as an example. -`pico install emmo` +The city ontology provides the concepts to describe people and +buildings in a city. In this graph we show the different entities in the +ontology. We used [Ontology2Dot](#ontology2dot) for that: -otherwise use +![ontology2dot sample image](./_static/img/ontology2dot.png) -`pico install ` \ No newline at end of file +eval_rst +To use the city ontology you have to install it using the tool [Pico](#pico-installs-cuds-ontologies): + +```sh +pico install city +``` + +Take a look at our [examples](jupyter/cuds-api.html) to see how you can build your own city! + +## Working with EMMO using OSP-core + +The second ontology that is ready to be used out of the box is the European +Materials Modelling Ontology, or EMMO in short. This ontology is an effort +to develop an ontology for applied sciences. It is based on physics, +analytical philosophy and information and communication technologies. +Its source code is open and [available on Github](https://github.com/emmo-repo/EMMO). +If you want to develop an emmo compliant ontology, see [the documentation](https://ontology.pages.fraunhofer.de/documentation/latest/). + +You can install EMMO using [Pico](#pico-installs-cuds-ontologies). + +```sh +pico install emmo +``` + +Start creating cuds objects: + +```py +>>> from osp.core.namespaces import math +>>> math.Numerical.attributes +{: None} +>>> x = math.Numerical(hasNumericalData=12) +>>> x + +>>> x.hasNumericalData +12 +``` + +## More ontologies + +To create you own or use an existing ontology, see the upcoming sections. +Contact us, if you want your ontology to be shipped with SimPhoNy. diff --git a/docs/source/index.md b/docs/source/index.md index 23cec4d..e9ca326 100644 --- a/docs/source/index.md +++ b/docs/source/index.md @@ -26,6 +26,8 @@ Here you can browse though the general documentation of SimPhoNy. :caption: Ontology :maxdepth: 2 + ontology_intro.md + included_ontologies.md yaml.md owl.md @@ -47,14 +49,6 @@ Here you can browse though the general documentation of SimPhoNy. jupyter/simlammps.ipynb jupyter/quantum-espresso.ipynb -.. toctree:: - :caption: Ontology - :maxdepth: 2 - - included_ontologies.md - yaml_spec.md - owl_ontologies.md - .. toctree:: :caption: Additional :maxdepth: 2 diff --git a/docs/source/jupyter/.ipynb_checkpoints/quantum-espresso-checkpoint.ipynb b/docs/source/jupyter/.ipynb_checkpoints/quantum-espresso-checkpoint.ipynb new file mode 100644 index 0000000..accde3b --- /dev/null +++ b/docs/source/jupyter/.ipynb_checkpoints/quantum-espresso-checkpoint.ipynb @@ -0,0 +1,338 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Tutorial 06: Quantum Espresso Wrapper\n", + "\n", + "In this tutorial we will go through a simple example of how to use the wrapper for the Quantum Espresso simulation engine. You can find the wrapper [here](https://github.com/simphony/quantum-espresso-wrapper).\n", + "## Background\n", + "This is an example of a slightly different design based upon the input-output functionality of certain simulation engines such as Quantum Espresso and Gromacs.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Let's get hands-on\n", + "### Installation\n", + "To run the local installation of Quantum Espresso, simply run `./install_engine.sh`. This should check for the prerequisites and compile the code for Quantum Espresso for you.\n", + "\n", + "If the script runs into an error finding openmpi-bin or something like that, try running `apt-get update` and try again. \n", + "Once the installation has completed, try running `pw.x` to see if the installation has succeeded. If this does not work, then try adding `export PATH=$PATH:/home/username/qe-6.1/bin/` at the end of `.bashrc` located at your home folder. \n", + " \n", + "Once you have verified that `pw.x` works, install the ontology via `pico install ontology.simlammps.yml`, and make sure to run `python3 setup.py` located in the root of the quantum espresso wrapper folder. \n", + "\n", + "Note that the installation of the ontology requires version 3.4.0 of osp-core to be installed (see [dev branch](https://github.com/simphony/osp-core/tree/v3.4.0-dev))\n", + "\n", + "That should be all needed to use Quantum Espresso!\n", + "\n", + "### Simple example\n", + "\n", + "This is an adaptation of quantum-espresso-wrapper/examples/Simple.py. As usual, we need to import the necessary components:" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "ename": "ModuleNotFoundError", + "evalue": "No module named 'osp.wrappers.quantumespresso.qe_utilsv2'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mModuleNotFoundError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mosp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcore\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnamespaces\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mQE\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mosp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcore\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mutils\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mpretty_print\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m \u001b[0;32mfrom\u001b[0m \u001b[0mosp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwrappers\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mquantumespresso\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mqe_session\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mqeSession\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m~/miniconda3/envs/osp/lib/python3.8/site-packages/quantum_espresso-0.1-py3.8.egg/osp/wrappers/quantumespresso/qe_session.py\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mosp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwrappers\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mquantumespresso\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mqe_engine\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mSimulationEngine\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mosp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwrappers\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mquantumespresso\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mqe_utils\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mqeUtils\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m \u001b[0;32mimport\u001b[0m \u001b[0mosp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwrappers\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mquantumespresso\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mqe_utilsv2\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 6\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mosp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcore\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mutils\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0msimple_search\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mModuleNotFoundError\u001b[0m: No module named 'osp.wrappers.quantumespresso.qe_utilsv2'" + ] + } + ], + "source": [ + "import numpy as np \n", + "\n", + "from osp.core.namespaces import QE\n", + "from osp.core.utils import pretty_print\n", + "from osp.wrappers.quantumespresso.qe_session import qeSession" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we create simulation and its K points, which determine at what points it samples the cell" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "sim = QE.Simulation()\n", + "k = QE.K_POINTS(vector = (7, 7, 7), unit = \"\")\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we create a cell, the element Silicon, a pseudopotential, an atom and the cell parameters. Note that the pseudopotential files should ALWAYS be located inside of a folder named `$PSEUDO_DIR` inside of wherever you are running the simulation." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "SiCell = QE.Cell()\n", + "Si = QE.Element(name = \"Si\")\n", + "SiPseudo = QE.PSEUDOPOTENTIAL(name = \"Si.pbe-n-kjpaw_psl.1.0.0.UPF\")\n", + "Si1 = QE.Atom()\n", + "SiParams = QE.CellParams()\n", + "celldm1 = QE.Celldm1(value = 5.43070, unit = \"au\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we connect these all to each other using the `add` method." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "Si.add(SiPseudo, Si1)\n", + "Si.add(QE.Mass(value = 28.085, unit = \"amu\"))\n", + "SiCell.add(Si1, SiParams)\n", + "Si1.add(QE.Position(vector = (0, 0, 0), unit = \"\"))\n", + "SiCell.add(celldm1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We specify the cell parameters:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "SiParams.add(QE.CellParameterX(vector = (0.5, 0.5, 0), unit = \"\"),\n", + " QE.CellParameterY(vector = (0.5, 0, 0.5), unit = \"\"),\n", + " QE.CellParameterZ(vector = (0, 0.5, 0.5), unit = \"\"))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And then we add everything created so far to the simulation:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "sim.add(SiCell)\n", + "sim.add(Si)\n", + "sim.add(k)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "While we're add it, let's add some variables to the simulation which we can check to see if they have been updated. They will not be taken into account when simulating, so they're there for control purposes.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "sim.add(QE.Pressure(value = 100, unit = \"kbar\"))\n", + "sim.add(QE.StressTensor(tensor2 = np.zeros((3, 3)), unit = \"kbar\"))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's check out what this simulation looks like now with the `pretty_print` function:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "pretty_print(sim)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now, it's time to get the simulation running:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "session = qeSession(root = \"\")\n", + "quantum_espresso_wrapper = QE.QEWrapper(session = session)\n", + "quantum_espresso_wrapper.add(sim)\n", + "print(\"Running calculation...\")\n", + "\n", + "quantum_espresso_wrapper.session._run(prefix = \"si\", command_type = \"pw.x\", calculation_type = \"scf\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now let's check the results of our calculation:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "pretty_print(sim)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As you can see, the original part of the cuds tree is still there, with everything mostly the same. The new parts are:\n", + "\n", + "- The qe.PwOut cuds object. This is the output file of the simulation, in case there is something that the wrapper does not parse but that you would still like to see.\n", + "- The qe.TotalEnergy cuds object. This was parsed from the qe.PwOut file itself.\n", + "- The qe.Force cuds object. This represents the force exerted on the atom(s).\n", + "\n", + "The updated parts are:\n", + "\n", + "- The qe.Pressure cuds object, having changed in value from 100 kbar to 5723.64 kbar.\n", + "- The qe.StressTensor cuds object, which is no longer zero." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's see if we can do better and calculate some bands structures:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "quantum_espresso_wrapper.session._run(prefix = \"si\", command_type = \"pw.x\", calculation_type = \"bands\")\n", + "quantum_espresso_wrapper.session._run(prefix = \"si\", command_type = \"bands.x\", calculation_type = \"\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Although the cuds structure won't have changed much by this, the data is there in the folder.\n", + "\n", + "Now let's try to relax this cell. While it isn't a real cell, we can still perform the calculations to relax it to know what the movement of the atoms would be like if it were a real cell (warning, perform vc-relax type calculations with caution. These examples are designed to be lightweight and non-indicative of real-world applications)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "quantum_espresso_wrapper.session._run(prefix = \"si\", command_type = \"pw.x\", calculation_type = \"relax\", IONS = {'ion_dynamics': \"'bfgs'\"})" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "pretty_print(sim)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In this example, the position hasn't changed. So let's spice things up a little bit and add another atom, and then relax:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "Si2 = QE.Atom()\n", + "Si2.add(QE.Position(vector = (0.25, 0.25, 0.26), unit = \"\"))\n", + "SiCell.add(Si)\n", + "Si.add(Si2)\n", + "pretty_print(sim)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "quantum_espresso_wrapper.session._run(prefix = \"si\", command_type = \"pw.x\", calculation_type = \"relax\", IONS = {'ion_dynamics': \"'bfgs'\"})\n", + "pretty_print(sim)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/docs/source/jupyter/quantum-espresso.ipynb b/docs/source/jupyter/quantum-espresso.ipynb index a412a50..accde3b 100644 --- a/docs/source/jupyter/quantum-espresso.ipynb +++ b/docs/source/jupyter/quantum-espresso.ipynb @@ -5,6 +5,7 @@ "metadata": {}, "source": [ "# Tutorial 06: Quantum Espresso Wrapper\n", + "\n", "In this tutorial we will go through a simple example of how to use the wrapper for the Quantum Espresso simulation engine. You can find the wrapper [here](https://github.com/simphony/quantum-espresso-wrapper).\n", "## Background\n", "This is an example of a slightly different design based upon the input-output functionality of certain simulation engines such as Quantum Espresso and Gromacs.\n" @@ -34,9 +35,22 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, - "outputs": [], + "outputs": [ + { + "ename": "ModuleNotFoundError", + "evalue": "No module named 'osp.wrappers.quantumespresso.qe_utilsv2'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mModuleNotFoundError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mosp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcore\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnamespaces\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mQE\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mosp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcore\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mutils\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mpretty_print\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m \u001b[0;32mfrom\u001b[0m \u001b[0mosp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwrappers\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mquantumespresso\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mqe_session\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mqeSession\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m~/miniconda3/envs/osp/lib/python3.8/site-packages/quantum_espresso-0.1-py3.8.egg/osp/wrappers/quantumespresso/qe_session.py\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mosp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwrappers\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mquantumespresso\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mqe_engine\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mSimulationEngine\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mosp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwrappers\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mquantumespresso\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mqe_utils\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mqeUtils\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m \u001b[0;32mimport\u001b[0m \u001b[0mosp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwrappers\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mquantumespresso\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mqe_utilsv2\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 6\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mosp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcore\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mutils\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0msimple_search\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mModuleNotFoundError\u001b[0m: No module named 'osp.wrappers.quantumespresso.qe_utilsv2'" + ] + } + ], "source": [ "import numpy as np \n", "\n", @@ -299,5 +313,26 @@ "pretty_print(sim)" ] } - ] -} \ No newline at end of file + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/docs/source/ontology_intro.md b/docs/source/ontology_intro.md new file mode 100644 index 0000000..5957b20 --- /dev/null +++ b/docs/source/ontology_intro.md @@ -0,0 +1,13 @@ +# Introduction on ontologies + +What is an ontology? + +An ontology defines a set of representational primitives with which to +model a domain of knowledge or discourse. The representational +primitives are typically classes (or sets), attributes (or properties), +and relationships (or relations among class members). The definitions of +the representational primitives include information about their meaning +and constraints on their logically consistent application. (Source: +) + +TODO extend \ No newline at end of file diff --git a/docs/source/owl.md b/docs/source/owl.md index 1550822..51c3be9 100644 --- a/docs/source/owl.md +++ b/docs/source/owl.md @@ -1,17 +1,95 @@ -# Here comes the information about owl +# How to work with owl ontologies +To install owl ontologies in osp-core, you have to create a configuration yaml file similar +to the following one: -## Working with EMMO using OSP-core +```yaml +identifier: emmo +ontology_file: https://raw.githubusercontent.com/emmo-repo/EMMO/master/emmo-inferred.owl +reference_by_label: True +namespaces: + mereotopology: http://emmo.info/emmo/top/mereotopology + physical: http://emmo.info/emmo/top/physical + top: http://emmo.info/emmo/top + semiotics: http://emmo.info/emmo/top/semiotics + perceptual: http://emmo.info/emmo/middle/perceptual + reductionistic: http://emmo.info/emmo/middle/reductionistic + holistic: http://emmo.info/emmo/middle/holistic + physicalistic: http://emmo.info/emmo/middle/physicalistic + math: http://emmo.info/emmo/middle/math + properties: http://emmo.info/emmo/middle/properties + materials: http://emmo.info/emmo/middle/materials + metrology: http://emmo.info/emmo/middle/metrology + models: http://emmo.info/emmo/middle/models + manufacturing: http://emmo.info/emmo/middle/manufacturing + isq: http://emmo.info/emmo/middle/isq + siunits: http://emmo.info/emmo/middle/siunits +active_relationships: + - http://emmo.info/emmo/top/mereotopology#EMMO_8c898653_1118_4682_9bbf_6cc334d16a99 + - http://emmo.info/emmo/top/semiotics#EMMO_60577dea_9019_4537_ac41_80b0fb563d41 +default_relationship: http://emmo.info/emmo/top/mereotopology#EMMO_17e27c22_37e1_468c_9dd7_95e137f73e7f +``` +## Keywords - ```sh - pico install emmo - ``` +**identifier**: Can be any alphanumerical string. It is the name of the package +that contains multiple namespaces. Will be used for uninstallation: `pico uninstall emmo`. +(In YAML ontologies this package name or identifier is the same as the namespace name). -Start creating cuds objects. Check the getting-started repository in the SimPhoNy group. +**ontology_file**: Path to the inferred owl ontology. That means you should +have executed a reasoner on your ontology, e.g. by using the `Export inferred axioms` +functionality of [Protégé](https://protege.stanford.edu/). +We support all the formats that [RDFLib](https://rdflib.readthedocs.io/) supports: +RDF/XML, N3, NTriples, N-Quads, Turtle, TriX, RDFa and Microdata. - ```py - >>> from osp.core.namespaces import emmo - >>> n = emmo.Number(value=1) - >>> ... - ``` \ No newline at end of file +**reference_by_label** (default False): Whether the label should be used or the IRI suffix to reference +entity from within osp-core. In case of EMMO it is true, because IRI suffixes are not +human friendly. In this case all labels should be unique and not contain whitespaces. +If False, use dot notation to get by IRI square brackets (`__getitem__`) to get by label. +The latter will return a list of all entities with the same label. + +**namespaces**: mapping from namespace name (used to import the namespace) to iri prefix. +If IRI doesn't end with "/" or "#", "#" will be added. + +**active relationships**: +List of iris of active relationships. + +**default relationship**: +The default relationship. + +## Installation + +Name the yaml file as you would any yaml file `.yml`, where `` should be replaced by a user defined name. + +Then you can use pico to install the tool [Pico](#pico-installs-cuds-ontologies) +to install the ontology: + +```sh +pico install +``` + +## Limitations + +At the moment, only the most basic predicates of owl ontologies are used: + +- `RDF.type` to determine the type of the entities. +- `RDFS.label` to get the entities by label. +- `RDFS.isDefinedBy` to get a descriptions for the entities. +- `RDFS.subClassOf` / `RDFS.subPropertyOf` for subclasses. +- `OWL.inverseOf` for inverse relationships. +- `RDFS.range` to determine the datatype of `DataProperties`. These are the supported + datatypes: + - `XSD.boolean` + - `XSD.integer` + - `XSD.float` + - `XSD.string` +- To get the attributes of an owl class, we use + - The `RDFS.domain` of the `DatatypeProperties`, if it is a simple class. + - Restrictions on the ontology classes. + - Furthermore, all DataProperties are considered functional, see [this issue](https://github.com/simphony/osp-core/issues/416). + +No reasoner is included. We plan to include a reasoner in the +future. + +We try to extend this list over time and support more of the +OWL DL standard. diff --git a/docs/source/owl_ontologies.md b/docs/source/owl_ontologies.md deleted file mode 100644 index 16993f7..0000000 --- a/docs/source/owl_ontologies.md +++ /dev/null @@ -1,53 +0,0 @@ -To install owl ontologies in osp-core, you have to create a configuration yaml file similar -to the following one: - -```yml -identifier: emmo -ontology_file: https://raw.githubusercontent.com/emmo-repo/EMMO/master/emmo-inferred.owl -reference_by_label: True -namespaces: - mereotopology: http://emmo.info/emmo/top/mereotopology - physical: http://emmo.info/emmo/top/physical - top: http://emmo.info/emmo/top - semiotics: http://emmo.info/emmo/top/semiotics - perceptual: http://emmo.info/emmo/middle/perceptual - reductionistic: http://emmo.info/emmo/middle/reductionistic - holistic: http://emmo.info/emmo/middle/holistic - physicalistic: http://emmo.info/emmo/middle/physicalistic - math: http://emmo.info/emmo/middle/math - properties: http://emmo.info/emmo/middle/properties - materials: http://emmo.info/emmo/middle/materials - metrology: http://emmo.info/emmo/middle/metrology - models: http://emmo.info/emmo/middle/models - manufacturing: http://emmo.info/emmo/middle/manufacturing - isq: http://emmo.info/emmo/middle/isq - siunits: http://emmo.info/emmo/middle/siunits -active_relationships: - - http://emmo.info/emmo/top/mereotopology#EMMO_8c898653_1118_4682_9bbf_6cc334d16a99 - - http://emmo.info/emmo/top/semiotics#EMMO_60577dea_9019_4537_ac41_80b0fb563d41 -default_relationship: http://emmo.info/emmo/top/mereotopology#EMMO_17e27c22_37e1_468c_9dd7_95e137f73e7f -``` - -identifier: Name of the package that contains multiple namespaces. -Will be used for uninstallation: `pico uninstall emmo`. -(In YAML ontologies this package name or identifier is the same as the namespace name). - -ontology_file: Path to the inferred owl ontology (Reasoner must be executed). -Inferred file already given in case of Emmo (Reasoner not yet included in osp-core) -Should be in one of the follwoing file formats: -RDF/XML, N3, NTriples, N-Quads, Turtle, TriX, RDFa and Microdata - -reference by label (default False): Whether the label should be used or the IRI suffix to reference -entity from within osp-core. Must true in case of EMMO, because IRI suffixes are not -human friendly. In this case all labels should be unique and not contain whitespaces. -If False, use dot notation to get by IRI and __getitem__ or `[]` to get by label. -The latter will return a list of all entities with the same label. - -namespaces: mapping from namespace name (used to import the namespace) to iri prefix. -If IRI doesn't end with "/" or "#", "#" will be added. - -active relationships: -List of iris of active relationships. - -default relationship: -the default relationship. \ No newline at end of file diff --git a/docs/source/yaml.md b/docs/source/yaml.md index 389649c..3aac4bb 100644 --- a/docs/source/yaml.md +++ b/docs/source/yaml.md @@ -2,12 +2,6 @@ This file describes how you can create ontologies using YAML. -## Info - -Contact: [Matthias Urban](mailto:matthias.urban@iwm.fraunhofer.de) and [Pablo de Andres](mailto:pablo.de.andres@iwm.fraunhofer.de) from the Material Informatics team, Fraunhofer IWM. - -Version: 3.0 pending approval - ## Introduction In this file we will give a description of how an Ontology can be @@ -15,19 +9,16 @@ represented in a yaml file format and how to interpret such files. For simplicity reasons in the following we will give examples from the **\* example ontology \*** file which can be found in osp/core/ontology/yml/ontology.city.yml. -What is an ontology? +## Naming of the files and installation -An ontology defines a set of representational primitives with which to -model a domain of knowledge or discourse. The representational -primitives are typically classes (or sets), attributes (or properties), -and relationships (or relations among class members). The definitions of -the representational primitives include information about their meaning -and constraints on their logically consistent application. (Source: -) +Name any ontology `.ontology.yml`, where `` should be replaced by a user defined name. -## Naming of the files +Then you can use pico to install the tool [Pico](#pico-installs-cuds-ontologies) +to install the ontology: -Name any ontolgy `.ontology.yml`, where `` should be replaced by a user defined name. +```sh +pico install +``` ## Syntax of the .yml ontology @@ -315,3 +306,8 @@ Furthermore, it can contain the following information: > - inversefunctional A subclass of a relationship is called a sub-relationship. + +## Limitations + +`Class expressions`, `domain`, `range`, `characteristics`, `equivalent_to`, `disjoint_with` +are currently not parsed by OSP core. From 5a78109ea240e2279626639fdd4e7fb4012a6088 Mon Sep 17 00:00:00 2001 From: Matthias Urban Date: Wed, 5 Aug 2020 19:38:14 +0200 Subject: [PATCH 03/57] updated entity names and imports in markdown files --- docs/source/about.md | 2 +- docs/source/detailed_design.md | 11 ++-- docs/source/getting_started.md | 35 ++++++------- docs/source/utils.md | 83 +++++++++++++++++------------- docs/source/wrapper_development.md | 36 ++++++------- 5 files changed, 89 insertions(+), 78 deletions(-) diff --git a/docs/source/about.md b/docs/source/about.md index 38ac27e..2deefeb 100644 --- a/docs/source/about.md +++ b/docs/source/about.md @@ -44,7 +44,7 @@ These are some of the terms used in the following sections: 1. `individual`: an instance of a class. E.g., an instance of the class 'City' can be used to represent the city of Freiburg in which case it would have the attribute 'name' with the value 'Freiburg'. 1. `relationship`: a type of a way in which one individual relates to another. E.g., 'Has-A' which could use to form the relationship 'Freiburg (City) Has-A Dreisam (River)'. 1. `entity`: a general term that can refer to a class, a relationship, attribute, or an individual. E.g., 'City', 'name', 'Has-A', the Freiburg individual are all entities. - 1. `namespace`: an ontology identifier. E.g., 'CITY_ONTOLOGY' which could be used as a namespace for the ontology that consists of the entities 'City', 'name' and 'Has-A'. + 1. `namespace`: an ontology identifier. E.g., 'city_ontology' which could be used as a namespace for the ontology that consists of the entities 'City', 'name' and 'Has-A'. - Each entity is uniquely identified by its name and the namespace it is contained in. We call \.\ the `qualified entity name`. 1. `CUDS`: Common Universal Data Structure. A data structure that is used to uniformly represent ontology concepts in programming code. - CUDS exposes an API that provides CRUD (Create, Read, Update and Delete) functionalities. diff --git a/docs/source/detailed_design.md b/docs/source/detailed_design.md index f761c24..32c3531 100644 --- a/docs/source/detailed_design.md +++ b/docs/source/detailed_design.md @@ -159,14 +159,13 @@ This CRUD API is defined by 6 methods: ##### Create ```python -from osp.core import SOME_NAMESPACE -# from osp.core import some_namespace # lowercase works as well! +from osp.core.namespaces import some_namespace -ontology_class = SOME_NAMESPACE.ONTOLOGY_CLASS -# ontology_class = some_namespace.MyOntologyClass # CamelCase works as well! -relationship = SOME_NAMESPACE.RELATIONSHIP +ontology_class = some_namespace.OntologyClass -cuds_obj = SOME_NAMESPACE.ONTOLOGY_CLASS() +relationship = some_namespace.relationship + +cuds_obj = some_namespace.OntologyClass() ``` ##### Add diff --git a/docs/source/getting_started.md b/docs/source/getting_started.md index c2fb587..d99b2ae 100644 --- a/docs/source/getting_started.md +++ b/docs/source/getting_started.md @@ -105,52 +105,51 @@ It is independent of any backend and provides the basic ontology based data stru ### Ontology file OSP-core requires an ontology file to create the appropriate CUDS classes. -Said ontology must be in a YAML format as defined by [our specification](yaml.md). +Said ontology must be either in a YAML format as defined by [our specification](yaml.md) +or you can also [use existing owl ontologies](owl.md).
- Ontology sample + YAML Ontology sample ```yaml version: "0.0.1" - namespace: "CUBA" + namespace: "cuba" ontology: - ENTITY: + Class: description: The root of the ontology. subclass_of: [] - NOTHING: + Nothing: description: A class without any individuals. subclass_of: - - CUBA.ENTITY + - cuba.Class ################ - RELATIONSHIP: + relationship: description: The root of all relationships. - subclass_of: - - CUBA.ENTITY + subclass_of: [] - ACTIVE_RELATIONSHIP: + activeRelationship: description: The root of all active relationships. Active relationships express that one cuds object is in the container of another. subclass_of: - - CUBA.RELATIONSHIP + - cuba.relationship ################ - WRAPPER: + Wrapper: description: The root of all wrappers. These are the bridge to simulation engines and databases. subclass_of: - - CUBA.ENTITY + - cuba.Class - ATTRIBUTE: + attribute: description: The root of all attributes. - subclass_of: - - CUBA.ENTITY + subclass_of: [] ```
-OSP-core can also be used with EMMO (European Materials and Modelling Ontology). +OSP-core can be used with EMMO (European Materials and Modelling Ontology) out of the box. See more [here](included_ontologies.md). ### Python classes @@ -159,7 +158,7 @@ Upon installation of OSP-core, each ontology class (except from attributes and r Since each ontology has a namespace, it can be used to import the classes and create cuds objects: ```py -from osp.core import cuba, another_namespace +from osp.core.namespaces import cuba, another_namespace entity = cuba.Entity() other_entity = another_namespace.SomeOtherEntity() diff --git a/docs/source/utils.md b/docs/source/utils.md index 00c6a0d..9bd58f7 100644 --- a/docs/source/utils.md +++ b/docs/source/utils.md @@ -20,44 +20,57 @@ _Usage:_ `pico install |city|cuba` _Behaviour:_ - The ontology file is parsed, and the entities mapped to python objects. - The python classes can be imported via their namespace - `from osp.core import namespace` + `from osp.core.namespaces import namespace` _Example:_ ```console (venv) user@PC:~$ pico install city INFO [osp.core.ontology.installation]: Will install the following namespaces: ['city'] -INFO [osp.core.ontology.parser]: Parsing file city -INFO [osp.core.ontology.installation]: Installation successful! +INFO [osp.core.ontology.yml.yml_parser]: Parsing YAML ontology file /.../osp-core/osp/core/ontology/docs/city.ontology.yml +INFO [osp.core.ontology.yml.yml_parser]: You can now use `from osp.core.namespaces import city`. +INFO [osp.core.ontology.parser]: Loaded 367 ontology triples in total +INFO [osp.core.ontology.installation]: Installation successful ``` ### Pico lists _Usage:_ `pico list` _Behaviour:_ -- The installed namespaces are printed out + +- The installed namespaces and packages are printed out. A package can be +uninstalled and can contain many namespaces. A namespace can be imported in code. _Example:_ ```console -(venv) user@PC:~$ pico list -CUBA -CITY +Packages: + - qe + - city +Namespaces: + - xml + - rdf + - rdfs + - xsd + - cuba + - owl + - qe + - city ``` ### Pico uninstalls -_Usage:_ `pico uninstall |"*"` -Note that to select all the namespaces, `"*"` must be quoted. +_Usage:_ `pico uninstall |"*"` +Note that to select all the packages, `"*"` must be quoted. _Behaviour:_ -- All installed namespaces are uninstalled. -- All namespaces except from the uninstalled one are re-installed. +- All installed packages / namespaces are uninstalled. +- All namespaces except the uninstalled ones are re-installed. _Example:_ ```console -(venv) user@PC:~$ pico uninstall city -INFO [osp.core.ontology.installation]: Uninstalling namespace city. -INFO [osp.core.ontology.installation]: Will install the following namespaces: ['cuba'] -INFO [osp.core.ontology.parser]: Parsing file /some/path/ontology.cuba.yml -INFO [osp.core.ontology.installation]: Uninstallation successful! +INFO [osp.core.ontology.installation]: Will install the following namespaces: ['qe'] +INFO [osp.core.ontology.yml.yml_parser]: Parsing YAML ontology file /home//.osp_ontologies/qe.yml +INFO [osp.core.ontology.yml.yml_parser]: You can now use `from osp.core.namespaces import qe`. +INFO [osp.core.ontology.parser]: Loaded 205 ontology triples in total +INFO [osp.core.ontology.installation]: Uninstallation successful ``` ## Tips and tricks @@ -96,43 +109,43 @@ _Example:_ >>> pretty_print(emmo_town) Cuds object named : uuid: 06b01f5a-e8c1-44a5-962d-ea0c726e97d0 - type: CITY.CITY - superclasses: CITY.CITY, CITY.POPULATED_PLACE, CITY.GEOGRAPHICAL_PLACE, CUBA.ENTITY + type: city.City + superclasses: city.City, city.PopulatedPlace, city.GeographicalPlace, cuba.Entity values: coordinates: [42 42] description: To Be Determined - |_Relationship CITY.HAS_INHABITANT: - | - CITY.CITIZEN cuds object named : + |_Relationship city.hasInhabitant: + | - city.Citizen cuds object named : | . uuid: f1bd9143-6472-4b24-94b5-1c5fc4c6e5b6 | . age: 25 - | - CITY.CITIZEN cuds object named : + | - city.Citizen cuds object named : | . uuid: 3b774c96-1a0c-403b-b0d0-05d6cd38c52c | . age: 25 - | - CITY.CITIZEN cuds object named : + | - city.Citizen cuds object named : | . uuid: 40d2335c-a335-4d07-b142-fb2b9b7581a7 | . age: 25 - | - CITY.CITIZEN cuds object named : + | - city.Citizen cuds object named : | . uuid: a5b9282a-ec10-462d-9aa1-9671d8bbe236 | . age: 25 - | - CITY.CITIZEN cuds object named : + | - city.Citizen cuds object named : | . uuid: c7c87209-660f-4a54-9c37-7e50c3164bc9 | . age: 25 - | - CITY.CITIZEN cuds object named : + | - city.Citizen cuds object named : | uuid: d74cfbae-9699-4998-a1e2-8f495a874ced | age: 25 - |_Relationship CITY.HAS_PART: - - CITY.NEIGHBOURHOOD cuds object named : + |_Relationship city.hasPart: + - city.Neighborhood cuds object named : . uuid: 26c4767d-c0ea-4abb-b7b7-7e8702de5de3 . coordinates: [0 0] - . |_Relationship CITY.HAS_PART: - . - CITY.STREET cuds object named : + . |_Relationship city.hasPart: + . - city.Street cuds object named : . . uuid: 23b0ba0d-1601-4824-b6c7-7eb3fdc05a91 . . coordinates: [0 0] - . - CITY.STREET cuds object named : + . - city.Street cuds object named : . uuid: b69d40d0-b919-4df8-8334-b898e4beda83 . coordinates: [0 0] - - CITY.NEIGHBOURHOOD cuds object named : + - city.Neighborhood cuds object named : uuid: 79a214f6-4eb1-4a3b-8908-306129583da1 coordinates: [0 0] @@ -200,7 +213,7 @@ _Examples:_ queried_name = 'Pablo' search.find_cuds_object(criterion = lambda x: queried_name in x.name, root=city_cuds, - rel=CITY.HAS_INHABITANT, + rel=city.hasInhabitant, find_all=True) ``` @@ -210,7 +223,7 @@ _Examples:_ queried_uid = uuid.uuid4() search.find_cuds_object_by_uid(uid=queried_uid, root=city_cuds, - rel=CITY.DEFAULT_REL) + rel=city.get_default_rel()) ``` - To find all the streets that are part of a city: @@ -218,7 +231,7 @@ _Examples:_ ```py search.find_cuds_objects_by_oclass(oclass=city.Street, root=city_cuds, - rel=CITY.HAS_PART) + rel=city.hasPart) ``` - To find all the inhabitants with an attribute `age` with value `26`: @@ -227,5 +240,5 @@ _Examples:_ search.find_cuds_objects_by_attribute(attribute='age', value=26, root=city_cuds, - rel=CITY.HAS_INHABITANT) + rel=city.hasInhabitant) ``` diff --git a/docs/source/wrapper_development.md b/docs/source/wrapper_development.md index fdee97a..825a16e 100644 --- a/docs/source/wrapper_development.md +++ b/docs/source/wrapper_development.md @@ -11,11 +11,11 @@ of a correct ontology can be done, and should not require major changes in the c These are the requirements for a minimal wrapper ontology: - Should contain an entity representing the wrapper. - Said entity should inherit from (subclass, is_a) `CUBA.WRAPPER`. -- All attributes should subclass `CUBA.ATTRIBUTE`. -- Top level entities should subclass `CUBA.ENTITY` -- Active relationships should subclass `CUBA.ACTIVE_RELATIONSHIP` -- Passive relationships should subclass `CUBA.PASSIVE_RELATIONSHIP` + Said entity should inherit from (subclass, is_a) `cuba.Wrapper`. +- All attributes should subclass `cuba.attribute`. +- Top level entities should subclass `cuba.Entity` +- Active relationships should subclass `cuba.ActiveRelationship` +- Passive relationships should subclass `cuba.PassiveRelationship`
Dummy ontology sample @@ -26,36 +26,36 @@ These are the requirements for a minimal wrapper ontology: author: Parmenides - namespace: SOME_NEW_WRAPPER_ONTOLOGY + namespace: some_new_wrapper_ontology ontology: - A_RELATIONSHIP: + aRelationship: description: "default relationship" subclass_of: - - CUBA.ACTIVE_RELATIONSHIP - inverse: SOME_NEW_WRAPPER_ONTOLOGY.PIHSNOITALER_A + - cuba.activeRelationship + inverse: some_new_wrapper_ontology.pihsnoitalerA default_rel: true - PIHSNOITALER_A: + pihsnoitalerA: description: "inverse of the default relationship" subclass_of: - - CUBA.PASSIVE_RELATIONSHIP - inverse: SOME_NEW_WRAPPER_ONTOLOGY.A_RELATIONSHIP + - cuba.passiveRelationship + inverse: some_new_wrapper_ontology.aRelationship ################ - SOME_NEW_WRAPPER: + SomeNewWrapper: subclass_of: - - CUBA.WRAPPER + - cuba.Wrapper - VALUE: + value: subclass_of: - - CUBA.ATTRIBUTE + - cuba.attribute - SOME_ENTITY: + SomeEntity: subclass_of: - - CUBA.ENTITY + - cuba.Class ```
From 2d15e082e1331f1e15c22dbdda526ff3fa6cfbf1 Mon Sep 17 00:00:00 2001 From: Matthias Urban Date: Thu, 6 Aug 2020 07:31:33 +0200 Subject: [PATCH 04/57] minor --- docs/source/yaml.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/source/yaml.md b/docs/source/yaml.md index 3aac4bb..0179d92 100644 --- a/docs/source/yaml.md +++ b/docs/source/yaml.md @@ -147,7 +147,7 @@ It can additionally have the following keys: > In case a datatype is not specified the default datatype is assumed to > be STRING > -> For example: The datatype of entity NUMBER_OF_OCCURRENCES is INT. +> For example: The datatype of entity numberOfOccurrences is INT. ## Class expressions @@ -220,7 +220,7 @@ It can contain further information: `attributes`: Dict[**\`\`qualified entity name\`\`**, default_value] > Expects a mapping from the **\`\`qualified entity name\`\`** of an attribute to its default. -> Each key must correspond to a subclass of `ATTRIBUTE`. For example: +> Each key must correspond to a subclass of `attribute`. For example: > > ```yaml > Address: @@ -279,10 +279,10 @@ It must have the keys described in [Ontology entities format](#ontology-entities Furthermore, it can contain the following information: `inverse`: **\`\`qualified entity name\`\`** or empty (None) -> If CUDS object A is related to CUDS object B via relationship REL, then B is related -> with A via the inverse of REL. +> If CUDS object A is related to CUDS object B via relationship `rel`, then B is related +> with A via the inverse of `rel`. > -> For example: The inverse of HAS\_PART is IS\_PART\_OF. +> For example: The inverse of `hasPart` is `isPartOf`. > > If no inverse is given, OSP-core will automatically create one. From 8a0578cc5b9d63e3b8999f171585d8f3c66a5fd5 Mon Sep 17 00:00:00 2001 From: Matthias Urban Date: Thu, 6 Aug 2020 08:31:11 +0200 Subject: [PATCH 05/57] updated notebooks --- docs/source/jupyter/cuds-api.ipynb | 132 ++++--- docs/source/jupyter/multiple-wrappers.ipynb | 257 +++++--------- docs/source/jupyter/ontology-interface.ipynb | 342 +++++++------------ docs/source/jupyter/quantum-espresso.ipynb | 19 +- 4 files changed, 281 insertions(+), 469 deletions(-) diff --git a/docs/source/jupyter/cuds-api.ipynb b/docs/source/jupyter/cuds-api.ipynb index 6ac7e5f..9584c2d 100644 --- a/docs/source/jupyter/cuds-api.ipynb +++ b/docs/source/jupyter/cuds-api.ipynb @@ -32,21 +32,46 @@ "metadata": {}, "source": [ "## Let's get hands on\n", - "We start by importing the example namespace from osp-core. It consists of concepts that were automatically generated from the [dummy city ontology](https://gitlab.cc-asp.fraunhofer.de/simphony/osp-core/blob/cuds-3.0/cuds/ontology/ontology.city.yml). There is [another tutorial](#) on the ontology YAML file. However, it is not important for the purposes of this tutorial. " + "We start by importing the example namespace from osp-core. It consists of concepts that were automatically generated from the [dummy city ontology](https://gitlab.cc-asp.fraunhofer.de/simphony/osp-core/blob/cuds-3.0/cuds/ontology/ontology.city.yml). There is [another tutorial](#) on the ontology YAML file. However, it is not important for the purposes of this tutorial.\n", + "\n", + "Before we can start, you have to install the city ontology. Use out tool pico for this:" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": "INFO 2020-08-06 08:03:23,850 [osp.core.ontology.installation]: Will install the following namespaces: ['city']\nINFO 2020-08-06 08:03:23,880 [osp.core.ontology.yml.yml_parser]: Parsing YAML ontology file /mnt/c/Users/urba/Desktop/repos/osp-core/osp/core/ontology/docs/city.ontology.yml\nINFO 2020-08-06 08:03:23,892 [osp.core.ontology.yml.yml_parser]: You can now use `from osp.core.namespaces import city`.\nINFO 2020-08-06 08:03:23,892 [osp.core.ontology.parser]: Loaded 367 ontology triples in total\nINFO 2020-08-06 08:03:23,927 [osp.core.ontology.installation]: Installation successful\n" + } + ], + "source": [ + "!pico install city" + ] + }, + { + "cell_type": "markdown", "metadata": {}, + "source": [ + "Now you can start coding:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "tags": [] + }, "outputs": [], "source": [ - "# If you did not install the CITY ontology (pico install city), you have to execute these commands first:\n", - "# from osp.core import Parser\n", - "# p = Parser()\n", - "# p.parse(\"city\")\n", + "# If you just installed the ontology from within this notebook and this line doesn't work, please restart the kernel and run this cell again.\n", "\n", - "from osp.core import CITY" + "from osp.core.namespaces import city" ] }, { @@ -58,11 +83,11 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ - "c = CITY.CITY(name=\"Freiburg\", coordinates=[47, 7])" + "c = city.City(name=\"Freiburg\", coordinates=[47, 7])" ] }, { @@ -81,9 +106,17 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 4, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": "uid of c: 34ffc443-9287-46de-b2aa-477a57f68a2f\n" + } + ], "source": [ "print(\"uid of c: \" + str(c.uid))" ] @@ -97,15 +130,15 @@ }, { "cell_type": "code", - "execution_count": 4, - "metadata": {}, + "execution_count": 5, + "metadata": { + "tags": [] + }, "outputs": [ { - "name": "stdout", "output_type": "stream", - "text": [ - "type of c: CITY.CITY\n" - ] + "name": "stdout", + "text": "type of c: city.City\n" } ], "source": [ @@ -121,25 +154,23 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 6, "metadata": {}, "outputs": [ { + "output_type": "execute_result", "data": { - "text/plain": [ - "" - ] + "text/plain": "" }, - "execution_count": 5, "metadata": {}, - "output_type": "execute_result" + "execution_count": 6 } ], "source": [ - "p1 = CITY.CITIZEN(name=\"Peter\")\n", - "p2 = CITY.CITIZEN(name=\"Anne\")\n", - "c.add(p1, rel=CITY.HAS_INHABITANT)\n", - "c.add(p2, rel=CITY.HAS_INHABITANT)" + "p1 = city.Citizen(name=\"Peter\")\n", + "p2 = city.Citizen(name=\"Anne\")\n", + "c.add(p1, rel=city.hasInhabitant)\n", + "c.add(p2, rel=city.hasInhabitant)" ] }, { @@ -158,16 +189,15 @@ }, { "cell_type": "code", - "execution_count": 6, - "metadata": {}, + "execution_count": 7, + "metadata": { + "tags": [] + }, "outputs": [ { - "name": "stdout", "output_type": "stream", - "text": [ - "uid: f34cb649-d25a-46fe-8e43-c35e2746f8cf\n", - "uid: 192b50d6-9235-4214-91a8-f0669ac7ac18\n" - ] + "name": "stdout", + "text": "uid: 703ec4ba-e89b-4e79-8985-5b6d31223328\nuid: 088c08f9-7961-4586-b908-23170fb0f059\n" } ], "source": [ @@ -184,15 +214,15 @@ }, { "cell_type": "code", - "execution_count": 7, - "metadata": {}, + "execution_count": 8, + "metadata": { + "tags": [] + }, "outputs": [ { - "name": "stdout", "output_type": "stream", - "text": [ - "CITY.CITIZEN: f34cb649-d25a-46fe-8e43-c35e2746f8cf\n" - ] + "name": "stdout", + "text": "city.Citizen: 703ec4ba-e89b-4e79-8985-5b6d31223328\n" } ], "source": [ @@ -208,19 +238,19 @@ }, { "cell_type": "code", - "execution_count": 8, - "metadata": {}, + "execution_count": 9, + "metadata": { + "tags": [] + }, "outputs": [ { - "name": "stdout", "output_type": "stream", - "text": [ - "[, ]\n" - ] + "name": "stdout", + "text": "[, ]\n" } ], "source": [ - "print(c.get(oclass=CITY.CITIZEN))" + "print(c.get(oclass=city.Citizen))" ] }, { @@ -232,7 +262,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 10, "metadata": {}, "outputs": [], "source": [ @@ -249,12 +279,12 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "for i in range(6):\n", - " c.add(CITY.NEIGHBOURHOOD(name=\"neighbourhood %s\" % i))" + " c.add(city.Neighborhood(name=\"neighbourhood %s\" % i))" ] }, { diff --git a/docs/source/jupyter/multiple-wrappers.ipynb b/docs/source/jupyter/multiple-wrappers.ipynb index ec33b20..1094c44 100644 --- a/docs/source/jupyter/multiple-wrappers.ipynb +++ b/docs/source/jupyter/multiple-wrappers.ipynb @@ -20,21 +20,33 @@ "metadata": {}, "source": [ "## Let's get hands on\n", - "We start by importing the example namespace of osp-core" + "We start by importing the example namespace of osp-core. If you haven't already, you should install the city ontology before:" ] }, { "cell_type": "code", "execution_count": 1, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": "INFO 2020-08-06 08:03:52,130 [osp.core.ontology.installation]: Skipping package city with identifier city, because it is already installed.\nINFO 2020-08-06 08:03:52,131 [osp.core.ontology.installation]: Will install the following namespaces: []\nINFO 2020-08-06 08:03:52,145 [osp.core.ontology.installation]: Installation successful\n" + } + ], + "source": [ + "!pico install city" + ] + }, + { + "cell_type": "code", + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ - "# If you did not install the CITY ontology (pico install city), you have to execute these commands first:\n", - "# from osp.core import Parser\n", - "# p = Parser()\n", - "# p.parse(\"city\")\n", - "\n", - "from osp.core import CITY" + "from osp.core.namespaces import city" ] }, { @@ -46,7 +58,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ @@ -62,7 +74,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ @@ -79,36 +91,30 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ - "try:\n", - " from osp.wrappers.sqlalchemy_wrapper_session import \\\n", - " SqlAlchemyWrapperSession\n", - "except ImportError as e:\n", - " raise ImportError(\"For this example, the SQLAlchemy \"\n", - " \"wrapper for SimPhoNy is required!\") from e" + "from osp.wrappers.sqlalchemy_wrapper_session import \\\n", + " SqlAlchemyWrapperSession" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Next we import a session object, which will provide the context to a simple simulation engine we developed for demonstrational purposes. To install it refer to this [repo](https://gitlab.cc-asp.fraunhofer.de/simphony/wrappers/dummy-simulation-wrapper)." + "Next we import a session object, which will provide the context to a simple simulation engine we developed for demonstrational purposes. It is already included in osp-core." ] }, { "cell_type": "code", - "execution_count": 5, - "metadata": {}, + "execution_count": 6, + "metadata": { + "tags": [] + }, "outputs": [], "source": [ - "try:\n", - " from osp.wrappers.dummy_simulation_wrapper import DummySimWrapperSession\n", - "except ImportError as e:\n", - " raise ImportError(\"For this example, the dummy simulation \"\n", - " \"wrapper for SimPhoNy is required!\") from e" + "from osp.wrappers.simdummy import SimDummySession" ] }, { @@ -122,20 +128,15 @@ }, { "cell_type": "code", - "execution_count": 6, - "metadata": {}, + "execution_count": 7, + "metadata": { + "tags": [] + }, "outputs": [ { - "name": "stdout", "output_type": "stream", - "text": [ - "Input data to connect to Postgres table!\n", - "User: postgres\n", - "Password: ········\n", - "Database name: osp_core\n", - "Host: 127.0.0.1\n", - "Port [5432]: \n" - ] + "name": "stdout", + "text": "Input data to connect to Postgres table!\n" } ], "source": [ @@ -157,33 +158,31 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 8, "metadata": {}, "outputs": [ { + "output_type": "execute_result", "data": { - "text/plain": [ - "" - ] + "text/plain": "" }, - "execution_count": 7, "metadata": {}, - "output_type": "execute_result" + "execution_count": 8 } ], "source": [ - "emmo_town = CITY.CITY(name='EMMO town')\n", + "emmo_town = city.City(name='EMMO town')\n", "\n", - "emmo_town.add(CITY.CITIZEN(name='Emanuele Ghedini'), rel=CITY.HAS_INHABITANT)\n", - "emmo_town.add(CITY.CITIZEN(name='Adham Hashibon'), rel=CITY.HAS_INHABITANT)\n", - "emmo_town.add(CITY.CITIZEN(name='Jesper Friis'),\n", - " CITY.CITIZEN(name='Gerhard Goldbeck'),\n", - " CITY.CITIZEN(name='Georg Schmitz'),\n", - " CITY.CITIZEN(name='Anne de Baas'),\n", - " rel=CITY.HAS_INHABITANT)\n", + "emmo_town.add(city.Citizen(name='Emanuele Ghedini'), rel=city.hasInhabitant)\n", + "emmo_town.add(city.Citizen(name='Adham Hashibon'), rel=city.hasInhabitant)\n", + "emmo_town.add(city.Citizen(name='Jesper Friis'),\n", + " city.Citizen(name='Gerhard Goldbeck'),\n", + " city.Citizen(name='Georg Schmitz'),\n", + " city.Citizen(name='Anne de Baas'),\n", + " rel=city.hasInhabitant)\n", "\n", - "emmo_town.add(CITY.NEIGHBOURHOOD(name=\"Ontology\"))\n", - "emmo_town.add(CITY.NEIGHBOURHOOD(name=\"User cases\"))" + "emmo_town.add(city.Neighborhood(name=\"Ontology\"))\n", + "emmo_town.add(city.Neighborhood(name=\"User cases\"))" ] }, { @@ -195,16 +194,16 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "ontology_uid = None\n", - "for neighbourhood in emmo_town.get(oclass=CITY.NEIGHBOURHOOD):\n", + "for neighbourhood in emmo_town.get(oclass=city.Neighborhood):\n", " if neighbourhood.name == \"Ontology\":\n", " ontology_uid = neighbourhood.uid\n", - " neighbourhood.add(CITY.STREET(name=\"Relationships\"), rel=CITY.HAS_PART)\n", - " neighbourhood.add(CITY.STREET(name=\"Entities\"), rel=CITY.HAS_PART)" + " neighbourhood.add(city.Street(name=\"Relationships\"), rel=city.hasPart)\n", + " neighbourhood.add(city.Street(name=\"Entities\"), rel=city.hasPart)" ] }, { @@ -216,20 +215,20 @@ }, { "cell_type": "code", - "execution_count": 9, - "metadata": {}, + "execution_count": 10, + "metadata": { + "tags": [] + }, "outputs": [ { - "name": "stdout", "output_type": "stream", - "text": [ - "EMMO town is my city!\n" - ] + "name": "stdout", + "text": "EMMO town is my city!\n" } ], "source": [ "onto = emmo_town.get(ontology_uid)\n", - "print(onto.get(rel=CITY.IS_PART_OF)[0].name + ' is my city!')" + "print(onto.get(rel=city.isPartOf)[0].name + ' is my city!')" ] }, { @@ -245,12 +244,12 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "with SqlAlchemyWrapperSession(postgres_url) as session:\n", - " wrapper = CITY.CITY_WRAPPER(session=session)\n", + " wrapper = city.CityWrapper(session=session)\n", " wrapper.add(emmo_town)\n", " session.commit()" ] @@ -270,79 +269,29 @@ }, { "cell_type": "code", - "execution_count": 11, - "metadata": {}, + "execution_count": 12, + "metadata": { + "tags": [] + }, "outputs": [ { - "name": "stdout", "output_type": "stream", - "text": [ - "The database contains the following information about the city:\n", - "- Cuds object named :\n", - " uuid: 3954ba3f-27db-4cff-9453-619d2ee6435f\n", - " type: CITY.CITY\n", - " superclasses: CITY.CITY, CITY.POPULATED_PLACE, CITY.GEOGRAPHICAL_PLACE, CUBA.ENTITY\n", - " values: coordinates: [0. 0.]\n", - " description: \n", - " To Be Determined\n", - "\n", - " |_Relationship CITY.HAS_INHABITANT:\n", - " | - CITY.CITIZEN cuds object named :\n", - " | . uuid: 89deb6b7-eaac-4db1-a573-53beb132a183\n", - " | . age: 25\n", - " | - CITY.CITIZEN cuds object named :\n", - " | . uuid: 121e73f3-35a9-4b49-8b32-6a58fd1375f1\n", - " | . age: 25\n", - " | - CITY.CITIZEN cuds object named :\n", - " | . uuid: d077246d-105d-429f-b041-27dfb170ae31\n", - " | . age: 25\n", - " | - CITY.CITIZEN cuds object named :\n", - " | . uuid: 0c1e5ca6-1279-465c-ab0a-701eee118343\n", - " | . age: 25\n", - " | - CITY.CITIZEN cuds object named :\n", - " | . uuid: 0d7630f0-6965-4ff0-a40b-c1851f354308\n", - " | . age: 25\n", - " | - CITY.CITIZEN cuds object named :\n", - " | uuid: adc48ce9-264a-49cf-813d-377825228c49\n", - " | age: 25\n", - " |_Relationship CITY.HAS_PART:\n", - " - CITY.NEIGHBOURHOOD cuds object named :\n", - " . uuid: d8e6cf00-0747-42c9-8c54-f09a532df7e0\n", - " . coordinates: [0. 0.]\n", - " . |_Relationship CITY.HAS_PART:\n", - " . - CITY.STREET cuds object named :\n", - " . . uuid: a54f76dc-1b2c-4899-9ae3-ca48ddb05811\n", - " . . coordinates: [0. 0.]\n", - " . - CITY.STREET cuds object named :\n", - " . uuid: 092d17b5-37f1-4f54-ad71-d208218a1851\n", - " . coordinates: [0. 0.]\n", - " - CITY.NEIGHBOURHOOD cuds object named :\n", - " uuid: bee623d8-fba2-4106-bfd4-c6a659950966\n", - " coordinates: [0. 0.]\n", - "The city has a new inhabitant:\n", - "- Cuds object named :\n", - " uuid: c8d11136-d88b-4cff-9508-240678947ce2\n", - " type: CITY.CITIZEN\n", - " superclasses: CITY.CITIZEN, CITY.PERSON, CITY.LIVING_BEING, CUBA.ENTITY\n", - " values: age: 32\n", - " description: \n", - " To Be Determined\n", - "\n" - ] + "name": "stdout", + "text": "The database contains the following information about the city:\n- Cuds object named :\n uuid: 96a2f49c-8009-456a-ad69-1cb1dea7f128\n type: city.City\n superclasses: city.City, city.GeographicalPlace, city.PopulatedPlace, cuba.Class\n values: coordinates: [0 0]\n description: \n To Be Determined\n\n |_Relationship city.hasInhabitant:\n | - city.Citizen cuds object named :\n | . uuid: 08e05374-0187-4114-a114-085431aeebde\n | . age: 25\n | - city.Citizen cuds object named :\n | . uuid: a084c4ba-c054-4afd-b194-b4e983743706\n | . age: 25\n | - city.Citizen cuds object named :\n | . uuid: 209926bc-6bcd-466c-a86a-807780e4789c\n | . age: 25\n | - city.Citizen cuds object named :\n | . uuid: 0a0a8488-7400-4f4e-9e44-dbf56782cd3c\n | . age: 25\n | - city.Citizen cuds object named :\n | . uuid: cdfe72ec-fc15-4a14-a516-88b576bf0a27\n | . age: 25\n | - city.Citizen cuds object named :\n | uuid: 4ec1b1af-341f-4aa5-845d-fb3f9c502c9c\n | age: 25\n |_Relationship city.hasPart:\n - city.Neighborhood cuds object named :\n . uuid: e1632cf5-24e3-4afb-b72b-757ef62d5bef\n . coordinates: [0 0]\n . |_Relationship city.hasPart:\n . - city.Street cuds object named :\n . . uuid: 19a6a5a4-c22c-4be7-98c4-c69b3ee613d2\n . . coordinates: [0 0]\n . - city.Street cuds object named :\n . uuid: 681f7441-e711-4375-ab70-074234206faa\n . coordinates: [0 0]\n - city.Neighborhood cuds object named :\n uuid: 574e4a68-92c8-4b0e-b41f-e0341b42b00b\n coordinates: [0 0]\nThe city has a new inhabitant:\n- Cuds object named :\n uuid: 7a263d53-9c4d-47ac-bb31-fa54d7920bcd\n type: city.Citizen\n superclasses: city.Citizen, city.LivingBeing, city.Person, cuba.Class\n values: age: 32\n description: \n To Be Determined\n\n" } ], "source": [ "with SqlAlchemyWrapperSession(postgres_url) as db_session:\n", - " db_wrapper = CITY.CITY_WRAPPER(session=db_session)\n", + " db_wrapper = city.CityWrapper(session=db_session)\n", " db_emmo_town = db_wrapper.get(emmo_town.uid)\n", " print(\"The database contains the following information about the city:\")\n", " pretty_print(db_emmo_town)\n", "\n", " # Working with a Simulation wrapper\n", - " with DummySimWrapperSession() as sim_session:\n", - " sim_wrapper = CITY.CITY_SIM_WRAPPER(num_steps=1,\n", - " session=sim_session)\n", - " new_inhabitant = CITY.PERSON(age=31, name=\"Peter\")\n", + " with SimDummySession() as sim_session:\n", + " sim_wrapper = city.CitySimWrapper(numSteps=1,\n", + " session=sim_session)\n", + " new_inhabitant = city.Person(age=31, name=\"Peter\")\n", " sim_emmo_town, _ = sim_wrapper.add(db_emmo_town, new_inhabitant)\n", " sim_session.run()\n", " print(\"The city has a new inhabitant:\")\n", @@ -362,64 +311,20 @@ }, { "cell_type": "code", - "execution_count": 12, - "metadata": {}, + "execution_count": 13, + "metadata": { + "tags": [] + }, "outputs": [ { - "name": "stdout", "output_type": "stream", - "text": [ - "The database contains the following information about the city:\n", - "- Cuds object named :\n", - " uuid: 3954ba3f-27db-4cff-9453-619d2ee6435f\n", - " type: CITY.CITY\n", - " superclasses: CITY.CITY, CITY.POPULATED_PLACE, CITY.GEOGRAPHICAL_PLACE, CUBA.ENTITY\n", - " values: coordinates: [0. 0.]\n", - " description: \n", - " To Be Determined\n", - "\n", - " |_Relationship CITY.HAS_INHABITANT:\n", - " | - CITY.CITIZEN cuds object named :\n", - " | . uuid: 89deb6b7-eaac-4db1-a573-53beb132a183\n", - " | . age: 25\n", - " | - CITY.CITIZEN cuds object named :\n", - " | . uuid: 121e73f3-35a9-4b49-8b32-6a58fd1375f1\n", - " | . age: 25\n", - " | - CITY.CITIZEN cuds object named :\n", - " | . uuid: d077246d-105d-429f-b041-27dfb170ae31\n", - " | . age: 25\n", - " | - CITY.CITIZEN cuds object named :\n", - " | . uuid: 0c1e5ca6-1279-465c-ab0a-701eee118343\n", - " | . age: 25\n", - " | - CITY.CITIZEN cuds object named :\n", - " | . uuid: 0d7630f0-6965-4ff0-a40b-c1851f354308\n", - " | . age: 25\n", - " | - CITY.CITIZEN cuds object named :\n", - " | . uuid: adc48ce9-264a-49cf-813d-377825228c49\n", - " | . age: 25\n", - " | - CITY.CITIZEN cuds object named :\n", - " | uuid: c8d11136-d88b-4cff-9508-240678947ce2\n", - " | age: 32\n", - " |_Relationship CITY.HAS_PART:\n", - " - CITY.NEIGHBOURHOOD cuds object named :\n", - " . uuid: d8e6cf00-0747-42c9-8c54-f09a532df7e0\n", - " . coordinates: [0. 0.]\n", - " . |_Relationship CITY.HAS_PART:\n", - " . - CITY.STREET cuds object named :\n", - " . . uuid: a54f76dc-1b2c-4899-9ae3-ca48ddb05811\n", - " . . coordinates: [0. 0.]\n", - " . - CITY.STREET cuds object named :\n", - " . uuid: 092d17b5-37f1-4f54-ad71-d208218a1851\n", - " . coordinates: [0. 0.]\n", - " - CITY.NEIGHBOURHOOD cuds object named :\n", - " uuid: bee623d8-fba2-4106-bfd4-c6a659950966\n", - " coordinates: [0. 0.]\n" - ] + "name": "stdout", + "text": "The database contains the following information about the city:\n- Cuds object named :\n uuid: 96a2f49c-8009-456a-ad69-1cb1dea7f128\n type: city.City\n superclasses: city.City, city.GeographicalPlace, city.PopulatedPlace, cuba.Class\n values: coordinates: [0 0]\n description: \n To Be Determined\n\n |_Relationship city.hasInhabitant:\n | - city.Citizen cuds object named :\n | . uuid: 08e05374-0187-4114-a114-085431aeebde\n | . age: 25\n | - city.Citizen cuds object named :\n | . uuid: a084c4ba-c054-4afd-b194-b4e983743706\n | . age: 25\n | - city.Citizen cuds object named :\n | . uuid: 209926bc-6bcd-466c-a86a-807780e4789c\n | . age: 25\n | - city.Citizen cuds object named :\n | . uuid: 0a0a8488-7400-4f4e-9e44-dbf56782cd3c\n | . age: 25\n | - city.Citizen cuds object named :\n | . uuid: cdfe72ec-fc15-4a14-a516-88b576bf0a27\n | . age: 25\n | - city.Citizen cuds object named :\n | . uuid: 4ec1b1af-341f-4aa5-845d-fb3f9c502c9c\n | . age: 25\n | - city.Citizen cuds object named :\n | uuid: 7a263d53-9c4d-47ac-bb31-fa54d7920bcd\n | age: 32\n |_Relationship city.hasPart:\n - city.Neighborhood cuds object named :\n . uuid: e1632cf5-24e3-4afb-b72b-757ef62d5bef\n . coordinates: [0 0]\n . |_Relationship city.hasPart:\n . - city.Street cuds object named :\n . . uuid: 19a6a5a4-c22c-4be7-98c4-c69b3ee613d2\n . . coordinates: [0 0]\n . - city.Street cuds object named :\n . uuid: 681f7441-e711-4375-ab70-074234206faa\n . coordinates: [0 0]\n - city.Neighborhood cuds object named :\n uuid: 574e4a68-92c8-4b0e-b41f-e0341b42b00b\n coordinates: [0 0]\n" } ], "source": [ "with SqlAlchemyWrapperSession(postgres_url) as db_session:\n", - " db_wrapper = CITY.CITY_WRAPPER(session=db_session)\n", + " db_wrapper = city.CityWrapper(session=db_session)\n", " db_emmo_town = db_wrapper.get(emmo_town.uid)\n", " print(\"The database contains the following information about the city:\")\n", " pretty_print(db_emmo_town)" diff --git a/docs/source/jupyter/ontology-interface.ipynb b/docs/source/jupyter/ontology-interface.ipynb index 8dd3bf3..6b9f875 100644 --- a/docs/source/jupyter/ontology-interface.ipynb +++ b/docs/source/jupyter/ontology-interface.ipynb @@ -20,7 +20,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "In the previous tutorial we have discussed the CUDS API. CUDS objects correspond to ontology individuals. In this tutorial we present the API of all other entities: ontology classes, relationships and attributes. These are defined in an ontology file in [YAML format](../yaml.md). With the presented API you can access the entities and navigate within an ontology." + "In the previous tutorial we have discussed the CUDS API. CUDS objects correspond to ontology individuals. In this tutorial we present the API of all other entities: ontology classes, relationships and attributes. These are defined in an ontology file in [YAML](../yaml.md) or [OWL](../owl.md) format. With the presented API you can access the entities and navigate within an ontology." ] }, { @@ -32,15 +32,20 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 2, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": "INFO 2020-08-06 08:16:21,653 [osp.core.ontology.installation]: Skipping package city with identifier city, because it is already installed.\nINFO 2020-08-06 08:16:21,654 [osp.core.ontology.installation]: Will install the following namespaces: []\nINFO 2020-08-06 08:16:21,669 [osp.core.ontology.installation]: Installation successful\n" + } + ], "source": [ - "# If you did not install the CITY ontology\n", - "# you have to execute these commands first:\n", - "from osp.core import Parser\n", - "p = Parser()\n", - "p.parse(\"city\")" + "# Install the ontology\n", + "!pico install city" ] }, { @@ -55,59 +60,65 @@ "---\n", "version: \"0.0.3\"\n", "\n", - "namespace: \"CITY\"\n", + "namespace: \"city\"\n", "\n", "ontology:\n", " ...\n", "```\n", "\n", - "Knowing the name of the namespace, we can import it in python. With the namespace python object we can access the entities within the namespace:" + "Alternatively you can use pico to see the installed namespaces:" ] }, { "cell_type": "code", - "execution_count": 1, - "metadata": {}, + "execution_count": 3, + "metadata": { + "tags": [] + }, "outputs": [ { + "output_type": "stream", "name": "stdout", + "text": "Packages:\n\t- city\n\t- qe\nNamespaces:\n\t- xml\n\t- rdf\n\t- rdfs\n\t- xsd\n\t- cuba\n\t- owl\n\t- qe\n\t- city\n" + } + ], + "source": [ + "!pico list" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Knowing the name of the namespace, we can import it in python. With the namespace python object we can access the entities within the namespace:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "tags": [] + }, + "outputs": [ + { "output_type": "stream", - "text": [ - "\n", - "You can use UPPERCASE and lowercase to access a namespace\n", - "True\n", - "\n", - "You can use the namespace to access its entities\n", - "CITY.LIVING_BEING\n", - "\n", - "You can use UPPERCASE, lowercase or CamelCase to access entities\n", - "True\n", - "\n", - "You can also use index notation\n", - "True\n", - "\n", - "You can access the namespace of an entity\n", - "True\n" - ] + "name": "stderr", + "text": "WARNING 2020-08-06 08:16:25,775 [osp.core]: osp.core.city is deprecated. Use osp.core.namespaces.city instead.\nWARNING 2020-08-06 08:16:25,778 [osp.core]: osp.core.city is deprecated. Use osp.core.namespaces.city instead.\n\nYou can use the namespace to access its entities\ncity.LivingBeing\n\nYou can also use index notation. For owl ontologies, this queries the entities by rdf.label.It returns a list of all entities with the same label\nTrue\n\nYou can access the namespace of an entity\nTrue\n" } ], "source": [ - "from osp.core import city, CITY # This imports the namespace city\n", - "\n", - "print(\"\\nYou can use UPPERCASE and lowercase to access a namespace\")\n", - "print(city is CITY)\n", + "from osp.core import city\n", "\n", "print(\"\\nYou can use the namespace to access its entities\")\n", - "print(city.living_being)\n", - "\n", - "print(\"\\nYou can use UPPERCASE, lowercase or CamelCase to access entities\")\n", - "print(city.living_being is city.LIVING_BEING is city.LivingBeing)\n", + "print(city.LivingBeing)\n", "\n", - "print(\"\\nYou can also use index notation\")\n", - "print(city.living_being is city[\"living_being\"])\n", + "print(\"\\nYou can also use index notation. \"\n", + " \"For owl ontologies, this queries the entities by rdf.label.\"\n", + " \"It returns a list of all entities with the same label\")\n", + "print(city.LivingBeing == city[\"LivingBeing\"][0])\n", "\n", "print(\"\\nYou can access the namespace of an entity\")\n", - "print(city is city.LivingBeing.namespace)" + "print(city is city.LivingBeing.namespace)\n" ] }, { @@ -121,29 +132,15 @@ }, { "cell_type": "code", - "execution_count": 2, - "metadata": {}, + "execution_count": 5, + "metadata": { + "tags": [] + }, "outputs": [ { - "name": "stdout", "output_type": "stream", - "text": [ - "\n", - "You can access the superclasses and the subclasses\n", - "[, ]\n", - "[, , ]\n", - "\n", - "You can access the direct superclasses and subclasses\n", - "[]\n", - "[]\n", - "\n", - "You can access a description of the entities\n", - "A being that lives\n", - "\n", - "You can test if one entity is a subclass / superclass of another\n", - "True\n", - "True\n" - ] + "name": "stdout", + "text": "\nYou can access the superclasses and the subclasses\n{, }\n{, , }\n\nYou can access the direct superclasses and subclasses\n{}\n{}\n\nYou can access a description of the entities\nA being that lives\n\nYou can test if one entity is a subclass / superclass of another\nTrue\nTrue\n" } ], "source": [ @@ -174,26 +171,23 @@ }, { "cell_type": "code", - "execution_count": 3, - "metadata": {}, + "execution_count": 6, + "metadata": { + "tags": [] + }, "outputs": [ { - "name": "stdout", "output_type": "stream", - "text": [ - "\n", - "You can get an entity from a string\n", - "CITY.LIVING_BEING\n", - "True\n" - ] + "name": "stdout", + "text": "\nYou can get an entity with a string\ncity.LivingBeing\nTrue\n" } ], "source": [ - "from osp.core import get_entity # noqa: E402\n", + "from osp.core.namespaces import get_entity # noqa: E402\n", "\n", - "print(\"\\nYou can get an entity from a string\")\n", + "print(\"\\nYou can get an entity with a string\")\n", "print(get_entity(\"city.LivingBeing\"))\n", - "print(get_entity(\"city.LivingBeing\") is city.LivingBeing)" + "print(get_entity(\"city.LivingBeing\") == city.LivingBeing)" ] }, { @@ -207,53 +201,41 @@ }, { "cell_type": "code", - "execution_count": 4, - "metadata": {}, + "execution_count": 7, + "metadata": { + "tags": [] + }, "outputs": [ { - "name": "stdout", "output_type": "stream", - "text": [ - "\n", - "You can test if an entity is a class\n", - "True\n", - "True\n", - "\n", - "You can test if an entity is a relationship\n", - "True\n", - "True\n", - "\n", - "You can test if an entity is an attribute\n", - "True\n", - "True\n" - ] + "name": "stdout", + "text": "\nYou can test if an entity is a class\nTrue\nTrue\n\nYou can test if an entity is a relationship\nTrue\nTrue\n\nYou can test if an entity is a attribute\nTrue\nTrue\n" } ], "source": [ - "# CUBA namespace\n", - "# This is the main namespace that is always available\n", - "from osp.core import cuba # noqa: E402\n", + "from osp.core.namespaces import cuba # noqa: E402\n", "\n", "# These are the classes for the ontology entities\n", "from osp.core.ontology import ( # noqa: F401, E402\n", - " OntologyEntity,\n", - " OntologyClass,\n", - " OntologyRelationship,\n", - " OntologyAttribute\n", + " OntologyEntity,\n", + " OntologyClass,\n", + " OntologyRelationship,\n", + " OntologyAttribute\n", ")\n", "\n", "print(\"\\nYou can test if an entity is a class\")\n", "print(isinstance(city.LivingBeing, OntologyClass))\n", - "print(not city.LivingBeing.is_subclass_of(cuba.Relationship)\n", - " and not city.LivingBeing.is_subclass_of(cuba.Attribute))\n", + "print(not city.LivingBeing.is_subclass_of(cuba.relationship)\n", + " and not city.LivingBeing.is_subclass_of(cuba.attribute))\n", "\n", "print(\"\\nYou can test if an entity is a relationship\")\n", - "print(isinstance(city.HasInhabitant, OntologyRelationship))\n", - "print(city.HasInhabitant.is_subclass_of(cuba.Relationship))\n", + "print(isinstance(city.hasInhabitant, OntologyRelationship))\n", + "print(city.hasInhabitant.is_subclass_of(cuba.relationship))\n", "\n", - "print(\"\\nYou can test if an entity is an attribute\")\n", - "print(isinstance(city.Name, OntologyAttribute))\n", - "print(city.Name.is_subclass_of(cuba.Attribute))\n" + "print(\"\\nYou can test if an entity is a attribute\")\n", + "print(isinstance(city.name, OntologyAttribute))\n", + "print(city.name.is_subclass_of(cuba.attribute))\n", + "\n" ] }, { @@ -267,28 +249,15 @@ }, { "cell_type": "code", - "execution_count": 5, - "metadata": {}, + "execution_count": 8, + "metadata": { + "tags": [] + }, "outputs": [ { - "name": "stdout", "output_type": "stream", - "text": [ - "\n", - "You can get the attributes of an ontology class and their defaults\n", - "{: 'John Smith', : 25}\n", - "\n", - "You can get the non-inherited attributes and their defaults\n", - "{: 'John Smith', : 25}\n", - "\n", - "Further interesting properties:\n", - "\n", - "Subclass of: ['CUBA.ENTITY', 'CITY.IS_CHILD_OF 0-2 CITY.LIVING_BEING']\n", - "\n", - "Equivalent to: []\n", - "\n", - "Disjoint with: []\n" - ] + "name": "stdout", + "text": "\nYou can get the attributes of an ontology class and their defaults\n{: rdflib.term.Literal('25', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#integer')), : rdflib.term.Literal('John Smith')}\n\nYou can get the non-inherited attributes and their defaults\n{}\n{: rdflib.term.Literal('25', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#integer')), : rdflib.term.Literal('John Smith')}\n" } ], "source": [ @@ -296,13 +265,8 @@ "print(city.Citizen.attributes)\n", "\n", "print(\"\\nYou can get the non-inherited attributes and their defaults\")\n", - "print(city.LivingBeing.own_attributes)\n", - "\n", - "print(\"\\nFurther interesting properties:\")\n", - "print(\"\\nSubclass of:\",\n", - " list(map(str, city.LivingBeing.subclass_of_expressions)))\n", - "print(\"\\nEquivalent to:\", city.LivingBeing.equivalent_to_expressions) # empty\n", - "print(\"\\nDisjoint with:\", city.LivingBeing.disjoint_with_expressions) # empty" + "print(city.Citizen.own_attributes)\n", + "print(city.LivingBeing.own_attributes)" ] }, { @@ -316,36 +280,20 @@ }, { "cell_type": "code", - "execution_count": 6, - "metadata": {}, + "execution_count": 9, + "metadata": { + "tags": [] + }, "outputs": [ { - "name": "stdout", "output_type": "stream", - "text": [ - "\n", - "You can get the inverse of a relationship\n", - "CITY.IS_INHABITANT_OF\n", - "\n", - "You can get the characteristics of a relationship\n", - "['transitive']\n", - "\n", - "You can get the domain and range of a relationship\n", - "[]\n", - "[]\n" - ] + "name": "stdout", + "text": "\nYou can get the inverse of a relationship\ncity.INVERSE_OF_hasInhabitant\n" } ], "source": [ "print(\"\\nYou can get the inverse of a relationship\")\n", - "print(city.HasInhabitant.inverse)\n", - "\n", - "print(\"\\nYou can get the characteristics of a relationship\")\n", - "print(city.HasPart.characteristics)\n", - "\n", - "print(\"\\nYou can get the domain and range of a relationship\")\n", - "print(city.HasPart.domain_expressions) # empty\n", - "print(city.HasPart.range_expressions) # empty" + "print(city.hasInhabitant.inverse)" ] }, { @@ -359,36 +307,28 @@ }, { "cell_type": "code", - "execution_count": 7, - "metadata": {}, + "execution_count": 10, + "metadata": { + "tags": [] + }, "outputs": [ { - "name": "stdout", "output_type": "stream", - "text": [ - "\n", - "You can get the argument name of an attribute. The argument name is used when instantiating CUDS objects\n", - "age\n", - "\n", - "You can get the datatype of attributes\n", - "INT\n", - "\n", - "You can use the attribute to convert values to the datatype of the attribute\n", - "10\n" - ] + "name": "stdout", + "text": "\nYou can get the argument name of an attribute. The argument name is used when instantiating CUDS objects\nage\n\nYou can get the datatype of attributes\nhttp://www.w3.org/2001/XMLSchema#integer\n\nYou can use the attribute to convert values to the datatype of the attribute\n10\n" } ], "source": [ "print(\"\\nYou can get the argument name of an attribute. \"\n", " \"The argument name is used when instantiating CUDS objects\")\n", - "print(city.Age.argname)\n", + "print(city.age.argname)\n", "\n", "print(\"\\nYou can get the datatype of attributes\")\n", - "print(city.Age.datatype)\n", + "print(city.age.datatype)\n", "\n", "print(\"\\nYou can use the attribute to convert values \"\n", " \"to the datatype of the attribute\")\n", - "print(city.Age(\"10\"))" + "print(city.age.convert_to_datatype(\"10\"))" ] }, { @@ -402,25 +342,15 @@ }, { "cell_type": "code", - "execution_count": 8, - "metadata": {}, + "execution_count": 11, + "metadata": { + "tags": [] + }, "outputs": [ { - "name": "stdout", "output_type": "stream", - "text": [ - "\n", - "You can instantiate CUDS objects using ontology classes\n", - "CITY.CITIZEN: b42eaaaa-8c05-4769-8362-3494bed82e30\n", - "Take a look at api_example.py for a description of the CUDS API\n", - "\n", - "You can check if a CUDS object is an instace of a ontology class\n", - "True\n", - "True\n", - "\n", - "You can get the ontology class of a CUDS object.\n", - "CITY.CITIZEN\n" - ] + "name": "stdout", + "text": "\nYou can instantiate CUDS objects using ontology classes\ncity.Citizen: 1714a778-5943-4611-af3a-e3b0cb32693d\nTake a look at api_example.py for a description of the CUDS API\n\nYou can check if a CUDS object is an instace of a ontology class\nTrue\nTrue\n\nYou can get the ontology class of a CUDS object.\ncity.Citizen\n" } ], "source": [ @@ -436,46 +366,6 @@ "print(city.Citizen(name=\"Test Person\", age=42).oclass)\n" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Namespace registry\n", - "\n", - "All namespaces are stored in a namespace registry (singleton). With the namespace registry, you can access the individual namespaces, using index or dot notation." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "All namespaces are stored in the namespace registry\n", - "\n", - "\n", - "You can access the namespaces using dot or index notation\n", - "\n", - "\n" - ] - } - ], - "source": [ - "# NAMESPACE_REGISTRY\n", - "from osp.core import ONTOLOGY_NAMESPACE_REGISTRY as namespace_reg # noqa: E402\n", - "\n", - "print(\"\\nAll namespaces are stored in the namespace registry\")\n", - "print(namespace_reg)\n", - "\n", - "print(\"\\nYou can access the namespaces using dot or index notation\")\n", - "print(namespace_reg.city)\n", - "print(namespace_reg[\"city\"])\n" - ] - }, { "cell_type": "code", "execution_count": null, diff --git a/docs/source/jupyter/quantum-espresso.ipynb b/docs/source/jupyter/quantum-espresso.ipynb index accde3b..00d89d7 100644 --- a/docs/source/jupyter/quantum-espresso.ipynb +++ b/docs/source/jupyter/quantum-espresso.ipynb @@ -35,22 +35,9 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "ename": "ModuleNotFoundError", - "evalue": "No module named 'osp.wrappers.quantumespresso.qe_utilsv2'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mModuleNotFoundError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mosp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcore\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnamespaces\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mQE\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mosp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcore\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mutils\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mpretty_print\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m \u001b[0;32mfrom\u001b[0m \u001b[0mosp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwrappers\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mquantumespresso\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mqe_session\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mqeSession\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;32m~/miniconda3/envs/osp/lib/python3.8/site-packages/quantum_espresso-0.1-py3.8.egg/osp/wrappers/quantumespresso/qe_session.py\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mosp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwrappers\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mquantumespresso\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mqe_engine\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mSimulationEngine\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mosp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwrappers\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mquantumespresso\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mqe_utils\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mqeUtils\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m \u001b[0;32mimport\u001b[0m \u001b[0mosp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwrappers\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mquantumespresso\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mqe_utilsv2\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 6\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mosp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcore\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mutils\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0msimple_search\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mModuleNotFoundError\u001b[0m: No module named 'osp.wrappers.quantumespresso.qe_utilsv2'" - ] - } - ], + "outputs": [], "source": [ "import numpy as np \n", "\n", @@ -335,4 +322,4 @@ }, "nbformat": 4, "nbformat_minor": 2 -} +} \ No newline at end of file From e51a3a6631672ce035da7ec50579ad4d3862d8de Mon Sep 17 00:00:00 2001 From: Matthias Urban Date: Thu, 6 Aug 2020 08:31:47 +0200 Subject: [PATCH 06/57] updated notebooks --- docs/source/jupyter/sessions_and_vars.ipynb | 4 ++-- docs/source/jupyter/simlammps.ipynb | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/source/jupyter/sessions_and_vars.ipynb b/docs/source/jupyter/sessions_and_vars.ipynb index be12f5d..12b4ab9 100644 --- a/docs/source/jupyter/sessions_and_vars.ipynb +++ b/docs/source/jupyter/sessions_and_vars.ipynb @@ -16,7 +16,7 @@ "\n", "Here we will try to explain said behaviour with simple illustrative examples.\n", "\n", - "_Note:_ This tutorial is not meant to be run like the others. The session classes and ontology entities are not real implementations. However, the behaviour shown will be the same as that of a real setup." + "**_Note:_ This tutorial is not meant to be run like the others. The session classes and ontology entities are not real implementations. However, the behaviour shown will be the same as that of a real setup.**" ] }, { @@ -33,7 +33,7 @@ "metadata": {}, "outputs": [], "source": [ - "from osp.core import namespace\n", + "from osp.core.namespaces import namespace\n", "from osp.wrappers.wrapper_x import SessionX\n", "from osp.wrappers.wrapper_y import SessionY" ] diff --git a/docs/source/jupyter/simlammps.ipynb b/docs/source/jupyter/simlammps.ipynb index a7a517f..52262a6 100644 --- a/docs/source/jupyter/simlammps.ipynb +++ b/docs/source/jupyter/simlammps.ipynb @@ -40,7 +40,7 @@ "That should be all needed to use simlammps!\n", "\n", "### Simple example\n", - "This is an adaptation of simlammps/examples/simple.py.\n", + "This is an adaptation of simlammps/examples/small.py.\n", "As usual, we start importing the necessary components:" ] }, From 09f1e2ae06745385a934830ca0344ff4ba26b2b6 Mon Sep 17 00:00:00 2001 From: Matthias Urban Date: Thu, 6 Aug 2020 08:43:40 +0200 Subject: [PATCH 07/57] fixed some links --- docs/source/included_ontologies.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/source/included_ontologies.md b/docs/source/included_ontologies.md index c4cc73f..f6b2062 100644 --- a/docs/source/included_ontologies.md +++ b/docs/source/included_ontologies.md @@ -9,18 +9,18 @@ We will also use it a lot in this documentation as an example. The city ontology provides the concepts to describe people and buildings in a city. In this graph we show the different entities in the -ontology. We used [Ontology2Dot](#ontology2dot) for that: +ontology. We used [Ontology2Dot](utils.md#ontology2dot) for that: ![ontology2dot sample image](./_static/img/ontology2dot.png) eval_rst -To use the city ontology you have to install it using the tool [Pico](#pico-installs-cuds-ontologies): +To use the city ontology you have to install it using the tool [Pico](utils.md#pico-installs-cuds-ontologies): ```sh pico install city ``` -Take a look at our [examples](jupyter/cuds-api.html) to see how you can build your own city! +Take a look at our [examples](jupyter/cuds-api.ipynb#Tutorial-01:-CUDS-API) to see how you can build your own city! ## Working with EMMO using OSP-core @@ -31,7 +31,7 @@ analytical philosophy and information and communication technologies. Its source code is open and [available on Github](https://github.com/emmo-repo/EMMO). If you want to develop an emmo compliant ontology, see [the documentation](https://ontology.pages.fraunhofer.de/documentation/latest/). -You can install EMMO using [Pico](#pico-installs-cuds-ontologies). +You can install EMMO using [Pico](utils.md#pico-installs-cuds-ontologies). ```sh pico install emmo From e36ee859b9892304a4cfdc062590c742587de422 Mon Sep 17 00:00:00 2001 From: Matthias Urban Date: Thu, 6 Aug 2020 08:45:00 +0200 Subject: [PATCH 08/57] fixed some links --- docs/source/owl.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/owl.md b/docs/source/owl.md index 51c3be9..e516b09 100644 --- a/docs/source/owl.md +++ b/docs/source/owl.md @@ -61,7 +61,7 @@ The default relationship. Name the yaml file as you would any yaml file `.yml`, where `` should be replaced by a user defined name. -Then you can use pico to install the tool [Pico](#pico-installs-cuds-ontologies) +Then you can use pico to install the tool [Pico](utils.md#pico-installs-cuds-ontologies) to install the ontology: ```sh From e24c1cdc2f994ef2c2838234ed063415810fc7e1 Mon Sep 17 00:00:00 2001 From: Matthias Urban Date: Fri, 7 Aug 2020 13:25:18 +0200 Subject: [PATCH 09/57] update ontology2dot image --- docs/source/_static/img/ontology2dot.png | Bin 223753 -> 222728 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/source/_static/img/ontology2dot.png b/docs/source/_static/img/ontology2dot.png index fefe49b59f128c6e55e97da35be180f8c4ae6ccb..4149025bb34b418d344b9b34f6381d080cbd6e7b 100644 GIT binary patch literal 222728 zcmdqIgw zbH97;z2ErhrrNpYn;4o~yol`_469TPOI*2F)W^x(C!RUSxes^FZG(Y*&2V=f8ZG zg4lcGgzQIIt{Sdd8X{GnV&A(>^`DL?lxh+m1phxBP`ua7kN?w`J-HP%;==#opiVF2 zbb|b^+v>UQ;b*MkzN5yGBGo7)*OXRnnr`IBwWk#K)ZcVup`ya0<$00To*-@)@FL2; z(g!P!vuYLh1GU`964n14MWp-lX>@4qher}^<6{J7lp`|CD)sSQUy!$ZBBbY#BErk9 z)Sben+s|vGqK613r=64dup{{g{?1|q{>Q_`*e3EneJL)O-68V7p60(lp2ZLm2mPm? zE-R>OQvdhg{?GqK$(j8B>89hWxNn6iSXA0r>=-#`XLZ4x@UzBZsc=Zt;+Iy}JofCN zHV6p}To$F7m0UE{X`wctZ1xM(HQ4z$__Te8FX>uQW5n<8A%_Z}y za}jEoO~wSf1b2G5!%_RR7`TrxwcC%Yp#;7=kz&k^dr|*q&AVZ!j$e)W8kx^t3L%Z6 z_Scv-28PO4VHO4=#;31;-SvZ%*sjX)>y+0?Y{qnjw;4`vO=os~pM!l%22T+`LYdQk~p=P-(`>K%RfBJ9ouQrwQ8o<1?% za1hp3rA5Z=%0I`C$5`-Gnx0wkOS%y_d#pvq>-hB%JT;=ivqwI=$BmCKn2=exlxp609@}X2`*j361@JS89UF2yzw@ z97!zfhl7!2Ys@-r-Wl+H3ApxUxR_eJ{(z!IiAM-+ z;n{%-L^id)`x`V`p4{qV{XKZZQ|uNigs8roE`AoJouRAKR(rl3v4pgwHF_+z2@!M<$>5p95QsP~Y)(RvPPM7Dj%{5q~ zvqxy5YhBRMLghqCuXHJA;pLYhV&Fmkp45b6BAr5+siG7r?Ebg6^B?C#P{wY;Rc`&- zLw@_zDMEq=TMTx9uzO^LLyH`u @gSEIbXgNN$PER-tiim~|9G4;T^j^iiPZ13T- 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 M@7sIdSpM*T06@9^ivR!s literal 223753 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

~ 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ⅈOuya5mPscSDu9Aa2Il|0ze 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 From 21068a7c68d64c727edfe168fa9fac53d6b22f67 Mon Sep 17 00:00:00 2001 From: Matthias Urban Date: Wed, 12 Aug 2020 15:42:30 +0200 Subject: [PATCH 10/57] `nbconvert --execute` requires the jupyter_client package: `pip install jupyter_client` Fixes #16 --- requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements.txt b/requirements.txt index c3eae7d..d150ea9 100644 --- a/requirements.txt +++ b/requirements.txt @@ -5,3 +5,4 @@ sphinxcontrib-plantuml nbsphinx sphinx-copybutton ipython +jupyter_client \ No newline at end of file From ba44a3f7b85830d44167167e7a2c4e4c58c41e34 Mon Sep 17 00:00:00 2001 From: Matthias Urban Date: Wed, 12 Aug 2020 16:04:35 +0200 Subject: [PATCH 11/57] updated nbsphinx_kernel_name in conf.py --- docs/source/conf.py | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/source/conf.py b/docs/source/conf.py index f61b312..a9101c7 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -78,3 +78,4 @@ def setup(app): nbsphinx_allow_errors = True +nbsphinx_kernel_name = 'python3.7' From 1fb9f5aab1fda84d9a1bd12be8c9441f6c8dd65f Mon Sep 17 00:00:00 2001 From: Matthias Urban Date: Wed, 12 Aug 2020 16:08:20 +0200 Subject: [PATCH 12/57] one more try --- docs/source/conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/conf.py b/docs/source/conf.py index a9101c7..28781dc 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -78,4 +78,4 @@ def setup(app): nbsphinx_allow_errors = True -nbsphinx_kernel_name = 'python3.7' +nbsphinx_kernel_name = 'python' From 82acd77c824dcc5a8dae5f527a28aceafb9caa3b Mon Sep 17 00:00:00 2001 From: Matthias Urban Date: Wed, 12 Aug 2020 16:31:48 +0200 Subject: [PATCH 13/57] removed metadata --- docs/source/conf.py | 1 - docs/source/jupyter/cuds-api.ipynb | 20 +-------------- docs/source/jupyter/multiple-wrappers.ipynb | 26 +------------------- docs/source/jupyter/ontology-interface.ipynb | 20 +-------------- docs/source/jupyter/quantum-espresso.ipynb | 20 +-------------- docs/source/jupyter/sessions_and_vars.ipynb | 26 +------------------- 6 files changed, 5 insertions(+), 108 deletions(-) diff --git a/docs/source/conf.py b/docs/source/conf.py index 28781dc..f61b312 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -78,4 +78,3 @@ def setup(app): nbsphinx_allow_errors = True -nbsphinx_kernel_name = 'python' diff --git a/docs/source/jupyter/cuds-api.ipynb b/docs/source/jupyter/cuds-api.ipynb index 9584c2d..faabe56 100644 --- a/docs/source/jupyter/cuds-api.ipynb +++ b/docs/source/jupyter/cuds-api.ipynb @@ -295,25 +295,7 @@ "source": [] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.8.0" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 2 } \ No newline at end of file diff --git a/docs/source/jupyter/multiple-wrappers.ipynb b/docs/source/jupyter/multiple-wrappers.ipynb index 1094c44..95f31a2 100644 --- a/docs/source/jupyter/multiple-wrappers.ipynb +++ b/docs/source/jupyter/multiple-wrappers.ipynb @@ -338,31 +338,7 @@ "source": [] } ], - "metadata": { - "file_extension": ".py", - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.8.0" - }, - "mimetype": "text/x-python", - "name": "python", - "npconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": 3 - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 2 } \ No newline at end of file diff --git a/docs/source/jupyter/ontology-interface.ipynb b/docs/source/jupyter/ontology-interface.ipynb index 6b9f875..0033f23 100644 --- a/docs/source/jupyter/ontology-interface.ipynb +++ b/docs/source/jupyter/ontology-interface.ipynb @@ -374,25 +374,7 @@ "source": [] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.8.0" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 2 } \ No newline at end of file diff --git a/docs/source/jupyter/quantum-espresso.ipynb b/docs/source/jupyter/quantum-espresso.ipynb index 00d89d7..ebf9c7a 100644 --- a/docs/source/jupyter/quantum-espresso.ipynb +++ b/docs/source/jupyter/quantum-espresso.ipynb @@ -301,25 +301,7 @@ ] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.8.0" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 2 } \ No newline at end of file diff --git a/docs/source/jupyter/sessions_and_vars.ipynb b/docs/source/jupyter/sessions_and_vars.ipynb index 12b4ab9..b146c41 100644 --- a/docs/source/jupyter/sessions_and_vars.ipynb +++ b/docs/source/jupyter/sessions_and_vars.ipynb @@ -186,31 +186,7 @@ ] } ], - "metadata": { - "file_extension": ".py", - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.5-final" - }, - "mimetype": "text/x-python", - "name": "python", - "npconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": 3 - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 2 } \ No newline at end of file From 8cac6480957db0815a348f8d2a1f42053772535e Mon Sep 17 00:00:00 2001 From: Matthias Urban Date: Wed, 12 Aug 2020 16:35:35 +0200 Subject: [PATCH 14/57] reverted requirements.txt --- requirements.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index d150ea9..c3eae7d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -5,4 +5,3 @@ sphinxcontrib-plantuml nbsphinx sphinx-copybutton ipython -jupyter_client \ No newline at end of file From 9e17802c571e4763a4f6176c1e9f89a40b26a413 Mon Sep 17 00:00:00 2001 From: Matthias Urban Date: Wed, 12 Aug 2020 16:52:44 +0200 Subject: [PATCH 15/57] updated requirements --- requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements.txt b/requirements.txt index c3eae7d..c71c2af 100644 --- a/requirements.txt +++ b/requirements.txt @@ -5,3 +5,4 @@ sphinxcontrib-plantuml nbsphinx sphinx-copybutton ipython +jupyter \ No newline at end of file From e9d960bd03a00df5aa7fc7c468da95fbb8d715f9 Mon Sep 17 00:00:00 2001 From: Matthias Urban Date: Fri, 14 Aug 2020 10:33:01 +0200 Subject: [PATCH 16/57] Add JSON schema of serialized CUDS objects to docs Fixes #21 --- docs/source/about.md | 1 + docs/source/conf.py | 1 + docs/source/index.md | 3 ++- requirements.txt | 4 +++- 4 files changed, 7 insertions(+), 2 deletions(-) diff --git a/docs/source/about.md b/docs/source/about.md index 2deefeb..a8aaadb 100644 --- a/docs/source/about.md +++ b/docs/source/about.md @@ -1,4 +1,5 @@ # About + SimPhoNy is an ontology-based framework that promotes and enables interoperability between any 3rd-party software tool. Its latest version is soon to become an open-source python project. The name ‘SimPhoNy’ stems from the SimPhoNy EU-project in which it was originally developed diff --git a/docs/source/conf.py b/docs/source/conf.py index f61b312..d6522b6 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -27,6 +27,7 @@ 'nbsphinx', # Jupyter 'IPython.sphinxext.ipython_console_highlighting', # Jupyter - Syntax highlight workaround 'sphinx.ext.autosectionlabel', # Auto-generate section labels. + 'sphinx-jsonschema' # Generate JSON schema for serialized CUDS ] master_doc = 'index' diff --git a/docs/source/index.md b/docs/source/index.md index e9ca326..e2d7b89 100644 --- a/docs/source/index.md +++ b/docs/source/index.md @@ -5,7 +5,7 @@ Here you can browse though the general documentation of SimPhoNy. ```eval_rst ============= ========== - SymPhoNy docs OSP-core + SimPhoNy docs OSP-core ============= ========== 2.3.x 3.4.0-beta 2.2.x 3.3.5-beta @@ -54,6 +54,7 @@ Here you can browse though the general documentation of SimPhoNy. :maxdepth: 2 api_ref.md + jsonschema.md links.md ``` diff --git a/requirements.txt b/requirements.txt index c71c2af..1f45bd9 100644 --- a/requirements.txt +++ b/requirements.txt @@ -5,4 +5,6 @@ sphinxcontrib-plantuml nbsphinx sphinx-copybutton ipython -jupyter \ No newline at end of file +jupyter +sphinx-jsonschema + From 3fe5404aa3fdd7c80859bcb0bedd6c675bcdf4a6 Mon Sep 17 00:00:00 2001 From: Matthias Urban Date: Fri, 14 Aug 2020 10:33:21 +0200 Subject: [PATCH 17/57] added missing files --- docs/source/jsonschema.md | 22 +++++ docs/source/openapi/serialized_cuds.json | 102 +++++++++++++++++++++++ 2 files changed, 124 insertions(+) create mode 100644 docs/source/jsonschema.md create mode 100644 docs/source/openapi/serialized_cuds.json diff --git a/docs/source/jsonschema.md b/docs/source/jsonschema.md new file mode 100644 index 0000000..c0a40b0 --- /dev/null +++ b/docs/source/jsonschema.md @@ -0,0 +1,22 @@ + + +# Serialization JSON schema of CUDS objects + +When you serialize a CUDS object using the +[`serialize()` method in the utils module](api_ref.html#osp.core.utils.general.serialize), +you will get a json document as a result. +The method will traverse the hierarchical datastructure +using Depth First Traversal. +Therefore, its result is a json array composed of several flat CUDS objects. + +The following explains the schema of the CUDS serialization: + +```eval_rst +.. jsonschema:: openapi/serialized_cuds.json#/cuds_array +.. jsonschema:: openapi/serialized_cuds.json#/definitions/cuds +.. jsonschema:: openapi/serialized_cuds.json#/definitions/entity +.. jsonschema:: openapi/serialized_cuds.json#/definitions/uuid +.. jsonschema:: openapi/serialized_cuds.json#/definitions/attributes +.. jsonschema:: openapi/serialized_cuds.json#/definitions/relationships + +``` diff --git a/docs/source/openapi/serialized_cuds.json b/docs/source/openapi/serialized_cuds.json new file mode 100644 index 0000000..e18f669 --- /dev/null +++ b/docs/source/openapi/serialized_cuds.json @@ -0,0 +1,102 @@ + { + "cuds_array": { + "title": "Array of flat CUDS objects", + "description": "This schema shows how the method `osp.core.utils.serialize()`\n\nwill serialize a CUDS object to JSON. The result is a flat list,\n\nwhere ich element references its neighbors by UUID.", + "type": "array", + "items": { + "$ref": "#/definitions/cuds" + } + }, + "definitions": { + "cuds": { + "title": "Flat CUDS object", + "description": "A representation of a single non-hierarchical CUDS object", + "type": "object", + "$$target": "#/definitions/cuds", + "properties": { + "uid": { + "$ref": "#/definitions/uuid" + }, + "oclass": { + "$ref": "#/definitions/entity" + }, + "attributes": { + "$ref": "#/definitions/attributes" + }, + "relationships": { + "$ref": "#/definitions/relationships" + } + }, + "required": [ + "uid", + "oclass" + ], + "example": { + "uid": "0ed73819-a095-423f-a444-e7e21e600957", + "oclass": "onto.WaterMolecule", + "attributes": { + "onto.velocity": 7 + }, + "relationships": { + "onto.hasPart": { + "b22fc8f5-2fdf-40f1-955c-96d6e2c278d8": "onto.Oxygen", + "ee901cdc-307e-4ca7-837e-074ba14996d6": "onto.Hydrogen", + "1e8f75f6-29d5-450f-a991-fc0dc2890075": "onto.Hydrogen" + } + } + } + }, + "entity": { + "title": "Name of an ontology entity", + "type": "string", + "description": "An ontology entity", + "format": "oclass", + "example": "onto.SimulationCuds", + "$$target": "#/definitions/entity", + "pattern": "([a-zA-Z])([a-zA-Z]|[0-9]|_)*\\.([a-zA-Z])([a-zA-Z]|[0-9]|_)*" + }, + "uuid": { + "title": "Universal unique identifier", + "type": "string", + "format": "uuid", + "description": "The unique identifier of a CUDS", + "example": "9053ed01-b301-473d-b59d-c184d4e772a1", + "$$target": "#/definitions/uuid" + }, + "attributes": { + "title": "Attributes of the CUDS objects", + "description": "**The key is a `entity`:** A mapping from the **ontology attribute** to its **values**", + "type": "object", + "additionalProperties": true, + "$$target": "#/definitions/attributes", + "example": { + "onto.Foo": 42, + "onto.Bar": [ + 1, + 2, + 3 + ] + } + }, + "relationships": { + "title": "Relationships of the CUDS objects", + "type": "object", + "$$target": "#/definitions/relationships", + "description": "**The key is a `entity`:** A mapping from the **ontology relationship** to the related cuds objects' **UUIDs and ontology classes**.", + "additionalProperties": { + "type": "object", + "description": "**The key is a `uuid`:** A mapping from the **uuid** to the **ontology class** of the related cuds objects", + "additionalProperties": { + "$ref": "#/definitions/entity" + } + }, + "example": { + "onto.hasPart": { + "b22fc8f5-2fdf-40f1-955c-96d6e2c278d8": "onto.Oxygen", + "ee901cdc-307e-4ca7-837e-074ba14996d6": "onto.Hydrogen", + "1e8f75f6-29d5-450f-a991-fc0dc2890075": "onto.Hydrogen" + } + } + } + } + } \ No newline at end of file From 7fd6c0d71133d088b86a73f59cafc15bd8513713 Mon Sep 17 00:00:00 2001 From: Matthias Urban Date: Fri, 14 Aug 2020 11:03:42 +0200 Subject: [PATCH 18/57] Document yaml2camelcase Fixes #25 --- docs/source/yaml.md | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/docs/source/yaml.md b/docs/source/yaml.md index 0179d92..10f6aab 100644 --- a/docs/source/yaml.md +++ b/docs/source/yaml.md @@ -2,6 +2,13 @@ This file describes how you can create ontologies using YAML. +```eval_rst +.. tip:: + If you have an ontology where all entity names are in ALL_UPPERCASE, + you can use the commandline tool `yaml2camelcase` that is shipped with + osp-core to transform it to an ontology with CamelCase entity names. +``` + ## Introduction In this file we will give a description of how an Ontology can be @@ -33,7 +40,7 @@ pico install `namespace`: string > Defines the namespace of the current file. We recommend to use - ALL_UPPERCASE for the namespace name, with underscore as separation. + all_lowercase for the namespace name, with underscore as separation. All entities defined in this file will live in the namespace defined here. `requirements`: List[string] @@ -71,7 +78,7 @@ Every declaration of an ontology entity must have the following keys: > > The subclass keyword expresses an **ontological is-a** > relation. MUST be a list of a fully qualified strings referring to another entity. -> Only the entity `ENTITY` is allowed to have no superclass. See [CUBA namespace](#the-cuba-namespace). +> Only the entity `cuba.entity` is allowed to have no superclass. See [CUBA namespace](#the-cuba-namespace). > > If entity A is a subclass of B and B is subclass of C, > then A is also subclass of C. From 420eeb0715ae3129fa3c17e3ccdff7a7c4e7c823 Mon Sep 17 00:00:00 2001 From: dea Date: Fri, 21 Aug 2020 10:11:41 +0200 Subject: [PATCH 19/57] Updated link to RTD --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1fd3f45..615ffa3 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # SimPhoNy docs -To access the documentation, please visit: https://simphony-docs.readthedocs.io/en/latest/ +To access the documentation, please visit: https://simphony.readthedocs.io/en/latest/ If you find any error or problem with the documentation, please [create an issue](https://github.com/simphony/docs/issues) From 855cb83f963bdcbeed1c0f379cb60e0f1909f93a Mon Sep 17 00:00:00 2001 From: dea Date: Fri, 21 Aug 2020 10:46:53 +0200 Subject: [PATCH 20/57] renamed openapi folder --- docs/source/index.md | 2 +- docs/source/{jsonschema.md => json.md} | 12 ++++++------ .../{openapi => json_schema}/serialized_cuds.json | 0 3 files changed, 7 insertions(+), 7 deletions(-) rename docs/source/{jsonschema.md => json.md} (52%) rename docs/source/{openapi => json_schema}/serialized_cuds.json (100%) diff --git a/docs/source/index.md b/docs/source/index.md index e2d7b89..91907c7 100644 --- a/docs/source/index.md +++ b/docs/source/index.md @@ -54,7 +54,7 @@ Here you can browse though the general documentation of SimPhoNy. :maxdepth: 2 api_ref.md - jsonschema.md + json.md links.md ``` diff --git a/docs/source/jsonschema.md b/docs/source/json.md similarity index 52% rename from docs/source/jsonschema.md rename to docs/source/json.md index c0a40b0..abdfef5 100644 --- a/docs/source/jsonschema.md +++ b/docs/source/json.md @@ -12,11 +12,11 @@ Therefore, its result is a json array composed of several flat CUDS objects. The following explains the schema of the CUDS serialization: ```eval_rst -.. jsonschema:: openapi/serialized_cuds.json#/cuds_array -.. jsonschema:: openapi/serialized_cuds.json#/definitions/cuds -.. jsonschema:: openapi/serialized_cuds.json#/definitions/entity -.. jsonschema:: openapi/serialized_cuds.json#/definitions/uuid -.. jsonschema:: openapi/serialized_cuds.json#/definitions/attributes -.. jsonschema:: openapi/serialized_cuds.json#/definitions/relationships +.. jsonschema:: json_schema/serialized_cuds.json#/cuds_array +.. jsonschema:: json_schema/serialized_cuds.json#/definitions/cuds +.. jsonschema:: json_schema/serialized_cuds.json#/definitions/entity +.. jsonschema:: json_schema/serialized_cuds.json#/definitions/uuid +.. jsonschema:: json_schema/serialized_cuds.json#/definitions/attributes +.. jsonschema:: json_schema/serialized_cuds.json#/definitions/relationships ``` diff --git a/docs/source/openapi/serialized_cuds.json b/docs/source/json_schema/serialized_cuds.json similarity index 100% rename from docs/source/openapi/serialized_cuds.json rename to docs/source/json_schema/serialized_cuds.json From 02643348dc1b58bdb25a3df6835972285493c1c7 Mon Sep 17 00:00:00 2001 From: dea Date: Fri, 21 Aug 2020 12:03:54 +0200 Subject: [PATCH 21/57] added CI action --- .github/workflows/build.yml | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 .github/workflows/build.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..ed27b34 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,21 @@ +name: Test build + +on: pull_request + +jobs: + build: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + - name: Set up Python 3.7 + uses: actions/setup-python@v2 + with: + python-version: 3.7 + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install -r requirements.txt + - name: Lint with flake8 + run: python setup.py install From eae508ec3300fa78b759730c4da1e18d38ef0971 Mon Sep 17 00:00:00 2001 From: dea Date: Fri, 21 Aug 2020 12:07:29 +0200 Subject: [PATCH 22/57] updated CI file --- .github/workflows/{build.yml => ci.yml} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename .github/workflows/{build.yml => ci.yml} (93%) diff --git a/.github/workflows/build.yml b/.github/workflows/ci.yml similarity index 93% rename from .github/workflows/build.yml rename to .github/workflows/ci.yml index ed27b34..84e3490 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/ci.yml @@ -17,5 +17,5 @@ jobs: run: | python -m pip install --upgrade pip pip install -r requirements.txt - - name: Lint with flake8 + - name: Build docs run: python setup.py install From 430ea6a3cd371d4b41ef05d381533be46a84eee6 Mon Sep 17 00:00:00 2001 From: dea Date: Fri, 21 Aug 2020 12:21:46 +0200 Subject: [PATCH 23/57] added wheel to requirements --- requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements.txt b/requirements.txt index 1f45bd9..d7d8ba8 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,4 @@ +wheel git+https://github.com/simphony/osp-core.git#egg=osp-core sphinx recommonmark From 037d1fee70ef11ac0d577d747b39aab7219e0322 Mon Sep 17 00:00:00 2001 From: dea Date: Fri, 21 Aug 2020 12:23:45 +0200 Subject: [PATCH 24/57] moved wheel to CI file --- .github/workflows/ci.yml | 1 + requirements.txt | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 84e3490..7d6ee64 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -16,6 +16,7 @@ jobs: - name: Install dependencies run: | python -m pip install --upgrade pip + pip install wheel pip install -r requirements.txt - name: Build docs run: python setup.py install diff --git a/requirements.txt b/requirements.txt index d7d8ba8..1f45bd9 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,3 @@ -wheel git+https://github.com/simphony/osp-core.git#egg=osp-core sphinx recommonmark From 60ad71135f50b9379178e0c7aa6512af2dcdad84 Mon Sep 17 00:00:00 2001 From: dea Date: Fri, 21 Aug 2020 12:27:29 +0200 Subject: [PATCH 25/57] added rtd theme to req --- requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements.txt b/requirements.txt index 1f45bd9..30c4683 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,7 @@ git+https://github.com/simphony/osp-core.git#egg=osp-core sphinx recommonmark +sphinx_rtd_theme sphinxcontrib-plantuml nbsphinx sphinx-copybutton From 859dc1c6ebd784012476ed81c5f2c6c1d3179bfb Mon Sep 17 00:00:00 2001 From: dea Date: Fri, 21 Aug 2020 12:48:55 +0200 Subject: [PATCH 26/57] added pandoc --- .github/workflows/ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7d6ee64..24ef5bd 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -15,6 +15,7 @@ jobs: python-version: 3.7 - name: Install dependencies run: | + sudo apt-get install pandoc python -m pip install --upgrade pip pip install wheel pip install -r requirements.txt From 1c24eb3c4d4759e8ebc0c8e72e6aa8dcc75ce216 Mon Sep 17 00:00:00 2001 From: dea Date: Fri, 21 Aug 2020 12:53:13 +0200 Subject: [PATCH 27/57] added latexmk --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 24ef5bd..1685dc1 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -15,7 +15,7 @@ jobs: python-version: 3.7 - name: Install dependencies run: | - sudo apt-get install pandoc + sudo apt-get install pandoc latexmk python -m pip install --upgrade pip pip install wheel pip install -r requirements.txt From c8d0cb60b9203dece70135086be524cd949b5069 Mon Sep 17 00:00:00 2001 From: dea Date: Fri, 21 Aug 2020 13:04:02 +0200 Subject: [PATCH 28/57] split dependencies --- .github/workflows/ci.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1685dc1..0f0cf79 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -15,7 +15,8 @@ jobs: python-version: 3.7 - name: Install dependencies run: | - sudo apt-get install pandoc latexmk + sudo apt-get install pandoc latexmk texlive-fonts-recommended + sudo apt-get install texlive-latex-recommended texlive-latex-extra python -m pip install --upgrade pip pip install wheel pip install -r requirements.txt From 5926329bc27b4724bc9abfcdee968b697a796354 Mon Sep 17 00:00:00 2001 From: dea Date: Fri, 21 Aug 2020 13:05:34 +0200 Subject: [PATCH 29/57] split dependencies --- .github/workflows/ci.yml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0f0cf79..e39a2fc 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -13,7 +13,14 @@ jobs: uses: actions/setup-python@v2 with: python-version: 3.7 - - name: Install dependencies + - name: Install OS dependencies + run: > + sudo apt-get install pandoc + latexmk + texlive-fonts-recommended + texlive-latex-recommended + texlive-latex-extra + - name: Install python dependencies run: | sudo apt-get install pandoc latexmk texlive-fonts-recommended sudo apt-get install texlive-latex-recommended texlive-latex-extra From e42361e3a2933b6988334855e9fb3d0363c15db0 Mon Sep 17 00:00:00 2001 From: dea Date: Fri, 21 Aug 2020 14:31:23 +0200 Subject: [PATCH 30/57] conf file for create-issue-branch --- .github/issue-branch.yml | 1 + 1 file changed, 1 insertion(+) create mode 100644 .github/issue-branch.yml diff --git a/.github/issue-branch.yml b/.github/issue-branch.yml new file mode 100644 index 0000000..91a382d --- /dev/null +++ b/.github/issue-branch.yml @@ -0,0 +1 @@ +mode: chatops \ No newline at end of file From f4499e46315a78e60aae4340d544ff74e31f5e05 Mon Sep 17 00:00:00 2001 From: dea Date: Fri, 21 Aug 2020 15:32:29 +0200 Subject: [PATCH 31/57] updated paths --- docs/source/getting_started.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/source/getting_started.md b/docs/source/getting_started.md index d99b2ae..da19593 100644 --- a/docs/source/getting_started.md +++ b/docs/source/getting_started.md @@ -101,12 +101,11 @@ For a full explanation on the architecture and design, go to [detailed design](. [OSP-core](https://gitlab.cc-asp.fraunhofer.de/simphony/osp-core) is the main component of the SimPhoNy framework. It is independent of any backend and provides the basic ontology based data structures for the seamless exchange of data between wrappers. - ### Ontology file OSP-core requires an ontology file to create the appropriate CUDS classes. Said ontology must be either in a YAML format as defined by [our specification](yaml.md) -or you can also [use existing owl ontologies](owl.md). +or [one of the supported owl ontologies](owl.md).

YAML Ontology sample @@ -165,7 +164,8 @@ other_entity = another_namespace.SomeOtherEntity() ``` ### Sessions -The sessions are the interoperability classes that connect to where the data is stored. In the case of wrappers, they take care of keeping consistency between the backends (e.g. databases) and the internal registry. +The sessions are the interoperability classes that connect to where the data is stored. +In the case of wrappers, they take care of keeping consistency between the backends (e.g. databases) and the internal registry. When you add an object to a wrapper, a copy of the object is created in the registry belonging to the session of the wrapper. @@ -264,7 +264,7 @@ we *highly* encourage the use of a [virtual environment](https://docs.python.org First, the repository must be cloned: ```shell -git clone git@gitlab.cc-asp.fraunhofer.de:simphony/osp-core.git +git clone git@github.com:simphony/osp-core.git ``` Once available locally, the project must be installed. The default installation is: @@ -285,7 +285,7 @@ pico install The installation of a wrapper is similar. First, the repository is cloned: ```shell -git clone git@gitlab.cc-asp.fraunhofer.de:simphony/wrappers/.git +git clone git@github.com:simphony/.git cd some-wrapper ``` ### Local wrapper installation @@ -311,7 +311,7 @@ python3 setup.py install ### Wrapper Docker image Some wrappers also provided a [Dockerfile](https://docs.docker.com/engine/reference/builder/) for an automatic installation in a container. -Simply run the `docker_install.sh` script. No need to install OSP-core either. +Simply run the `docker_install.sh` script. There is no need to install OSP-core either. ```shell ./docker_install.sh From 2614081f1f9d02bc40b596176859cad7910fa973 Mon Sep 17 00:00:00 2001 From: dea Date: Mon, 24 Aug 2020 10:34:46 +0200 Subject: [PATCH 32/57] added pico conflict notes --- docs/source/utils.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/docs/source/utils.md b/docs/source/utils.md index 9bd58f7..a0f70e8 100644 --- a/docs/source/utils.md +++ b/docs/source/utils.md @@ -73,6 +73,20 @@ INFO [osp.core.ontology.parser]: Loaded 205 ontology triples in total INFO [osp.core.ontology.installation]: Uninstallation successful ``` +### Conflicts with other "pico" installations +Some Operating Systems might have a pre-existing tool called _pico_. +In most cases, the previous commands should work, but if any problem arises, +you can use the following alternative: + +```shell +python -m osp.core.pico +``` + +For example: +```shell +python -m osp.core.pico install city +``` + ## Tips and tricks The following are some utility functions and shortcuts for working with cuds. For those that are present in the util package, the import is `from osp.core import utils`. From 97733db43b573f668c18b23be1f6854fd185a426 Mon Sep 17 00:00:00 2001 From: dea Date: Mon, 24 Aug 2020 12:53:56 +0200 Subject: [PATCH 33/57] added notes, hints and warning boxes --- docs/source/detailed_design.md | 37 ++++++++++++++++++++++++++-------- docs/source/utils.md | 5 ++++- 2 files changed, 33 insertions(+), 9 deletions(-) diff --git a/docs/source/detailed_design.md b/docs/source/detailed_design.md index 32c3531..9c66e5b 100644 --- a/docs/source/detailed_design.md +++ b/docs/source/detailed_design.md @@ -149,8 +149,12 @@ The actual related objects are kept in the [registry](#registry) Relation3: {uid3: oclass, uid5: oclass}, } ``` -_Note:_ This is an abstraction to show the general structure. -The actual implementation is a bit more complex. + +```eval_rst +.. note:: + This is an abstraction to show the general structure. + The actual implementation is a bit more complex. +``` #### Cuds API The governing idea behind the API design was to simplify as much as possible the usage. @@ -362,12 +366,17 @@ cuds_obj = some_namespace.OntologyClass() ``` First the uids of all the objects to be iterated are gathered, and then they are yielded like a generator + +```eval_rst +.. hint:: + There is also an :code:`is_a` method for checking oclass inheritance. +``` -_Note (I):_ Be aware that the sequence diagrams shown represent simple use cases, -and more complex scenarios are also possible (e.g. adding an object with children). - -_Note (II):_ There is also an `is_a` method for checking oclass inheritance. - +```eval_rst +.. note:: + Be aware that the sequence diagrams shown represent simple use cases, + and more complex scenarios are also possible (e.g. adding an object with children). +``` ## Interoperability layer The interoperability layer takes care of the connection and translation between the semantic and syntactic parts. It also contains the storage of all the objects that share a session. @@ -496,7 +505,11 @@ To simplify and group functionality, we built an inheritance scheme: } @enduml ``` -_Note:_ This is a reduced version and does not represent the entirety of the contained functions. + +```eval_rst +.. note:: + This is a reduced version and does not represent the entirety of the contained functions. +``` The simplest session, called `CoreSession`, is the default one for entities created in a python workspace and has no backend. It just accesses the registry to manage the operations made by users. @@ -507,6 +520,14 @@ This will define which methods have to be implemented and `_engine` as the acces `SimWrapperSession` and `DbWrapperSession` further specify the behaviour of wrappers, defining the methods that trigger an action on the backend (`run` and `commit`, respectively). +```eval_rst +.. note:: + You might have noticed that the semantic layer defines :code:`remove` in the API, + but in the session and registry we use :code:`delete`. The different between them + is conceptual: :code:`remove` is interpreted as detachment i.e. removal of edges, + while :code:`delete` implies the erasure of the note itself. +``` + #### Buffers Session classes under `WrapperSession` share 3 types of buffers, namely `added`, `updated` and `deleted`. The previous buffers are repeated twice, first for the user and then for the engine, diff --git a/docs/source/utils.md b/docs/source/utils.md index a0f70e8..d6acd93 100644 --- a/docs/source/utils.md +++ b/docs/source/utils.md @@ -105,7 +105,10 @@ and another one as a [dot](https://www.graphviz.org/pdf/dotguide.pdf) graph ([cu Another useful dot graph visualisation tool called [ontology2dot](#ontology2dot) is available for ontology YML files. -_Note:_ the graphic visualisation tools that generate a dot file require Graphviz to be installed in the system. +```eval_rst +.. warning:: + The graphic visualisation tools that generate a dot file require Graphviz to be installed in the system. +``` ### Pretty print _Location:_ `from osp.core.utils import pretty_print`. From 2add2400da2d59ded25d9571116b7d7e0150b732 Mon Sep 17 00:00:00 2001 From: dea Date: Tue, 25 Aug 2020 01:35:50 +0200 Subject: [PATCH 34/57] started working on wrapper dev tutorial --- docs/source/jupyter/wrapper_development.ipynb | 329 ++++++++++++++++++ docs/source/wrapper_development.md | 3 +- 2 files changed, 331 insertions(+), 1 deletion(-) create mode 100644 docs/source/jupyter/wrapper_development.ipynb diff --git a/docs/source/jupyter/wrapper_development.ipynb b/docs/source/jupyter/wrapper_development.ipynb new file mode 100644 index 0000000..327bdc3 --- /dev/null +++ b/docs/source/jupyter/wrapper_development.ipynb @@ -0,0 +1,329 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Tutorial 07: Wrapper development\n", + "In this tutorial we will implement a very simple simulation wrapper.\n", + "It can be used to understand which methods need to be implemented, and how.\n", + "The source files used can be found [here](https://github.com/simphony/wrapper-development).\n", + "\n", + "## Background\n", + "Wrappers are the way to extend SimPhoNy to support other back-ends. For an in-depth explanation, you can go to the [wrapper development section](../wrapper_development.md) of the documentation. Here we will explain with more detail the methods that have to be implemented.\n", + "\n", + "## Requirements\n", + "In order to run this code, you need to have the simple_ontology available [here](https://github.com/simphony/wrapper-development/blob/master/osp/wrappers/simple_simulation/simple_ontology.ontology.yml).\n", + "\n", + "Remember, once you have OSP-core installed, and the file locally, you can simply run `pico install `" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Let's get hands on\n", + "### Syntactic layer\n", + "As you know, SimPhoNy consists of 3 layers, with the wrappers being relevant in the last 2 (interoperability and syntactic layers).\n", + "The syntactic layer talks directly to the back-end in a way that it can be understood.\n", + "Since this wrapper aims to be as minimalistic as possible (while still being meaningfull),\n", + "we have created a dummy syntactic layer that emulates talking to a simulation tool.\n", + "\n", + "_Note:_ In order to reduce the amount of code, the docstrings hav been erased. You can refer to the [source file](https://github.com/simphony/wrapper-development/blob/master/osp/wrappers/simple_simulation/simulation_engine.py) for the complete information." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# This is the representation of an atom in the \"engine\"\n", + "class Atom():\n", + "\n", + " def __init__(self, position, velocity):\n", + " self.position = position\n", + " self.velocity = velocity" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# This engine only works with atoms, setting/getting their position and velocities\n", + "class SimulationEngine:\n", + " def __init__(self):\n", + " self.atoms = list()\n", + " print(\"Engine instantiated!\")\n", + "\n", + " def __str__(self):\n", + " return \"Some Engine Connection\"\n", + "\n", + " def run(self, timesteps=1):\n", + " print(\"Now the engine is running\")\n", + " for atom in self.atoms:\n", + " atom.position += atom.velocity * timesteps\n", + "\n", + " def add_atom(self, position, velocity):\n", + " print(\"Add atom %s with position %s and velocity %s\"\n", + " % (len(self.atoms), position, velocity))\n", + " self.atoms.append(Atom(position, velocity))\n", + "\n", + " def update_position(self, idx, position):\n", + " print(\"Update atom %s. Setting position to %s\"\n", + " % (idx, position))\n", + " self.atoms[idx].position = position\n", + "\n", + " def update_velocity(self, idx, velocity):\n", + " print(\"Update atom %s. Setting velocity to %s\"\n", + " % (idx, velocity))\n", + " self.atoms[idx].velocity = velocity\n", + "\n", + " def get_velocity(self, idx):\n", + " return self.atoms[idx].velocity\n", + "\n", + " def get_position(self, idx):\n", + " return self.atoms[idx].position\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Interoperability layer\n", + "Since a lot of 3rd-party tools come with a syntactic layer, the bulk of the work when developping a wrapper for SimPhoNy is here.\n", + "\n", + "We will explain step by step all the code required.\n", + "\n", + "First, we import the parent Simulation Wrapper Session and the namespace (ontology). The engine is not necessary since it is in the previous codebock." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "from osp.core.session import SimWrapperSession\n", + "# from osp.wrappers.simple_simulation import SimulationEngine\n", + "from osp.core.namespaces import simple_ontology " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we will go through each of the methods. \n", + "\n", + "Note that to be able to break the class into multiple blocks, we will use inheritance, to add a method each time.\n", + "In truth, all the definitions should go under one same `class` directive." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The first method is the `__init__`. This method is called when a new object is instantiated.\n", + "Here we will call the `__init__` method of the parent class and initialise the necessary elements.\n", + "\n", + "Most simulation engines will have an internal way to keep track of, for example, particles.\n", + "To make sure that the entities in the semantic layer are properly synched, we usually use a _mapper_.\n", + "This could be anything from a list or dictionary to a more complex and sofisticated data structure." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "class SimpleSimulationSession(SimWrapperSession):\n", + "\n", + " def __init__(self, engine=None, **kwargs):\n", + " super().__init__(engine or SimulationEngine(), **kwargs)\n", + " self.mapper = dict() # maps uuid to index in the backend\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next comes the output to the `str()` method.\n", + "It will be a string returned in `__str__(self)`." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "class SimpleSimulationSession(SimpleSimulationSession):\n", + "\n", + " def __str__(self):\n", + " return \"Simple sample Wrapper Session\"\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "When the `run()` or `commit()` method is called on the session, all the objects that have been added since the last run have to be sent to the back end.\n", + "This is done through `_apply_added(self, root_obj, buffer)`.\n", + "The method should iterate through all the entities in the buffer and trigger different actions depending on which type of entity it is.\n", + "\n", + "Remember that we can check the type using the `is_a` method, or querying for the `oclass` attribute of an entity.\n", + "\n", + "In this example, we will only contact the back end if an atom has been added.\n", + "However, normal wrappers will have a lot more comparisons (`if` and `elif`) to determine which entity it is and act accordingly" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "class SimpleSimulationSession(SimpleSimulationSession):\n", + "\n", + " # OVERRIDE\n", + " def _apply_added(self, root_obj, buffer):\n", + " \"\"\"Adds the added cuds to the engine.\"\"\"\n", + " for obj in buffer.values():\n", + " if obj.is_a(simple_ontology.Atom):\n", + " # Add the atom to the mapper\n", + " self.mapper[obj.uid] = len(self.mapper)\n", + " pos = obj.get(oclass=simple_ontology.Position)[0].value\n", + " vel = obj.get(oclass=simple_ontology.Velocity)[0].value\n", + " self._engine.add_atom(pos, vel)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "class SimpleSimulationSession(SimpleSimulationSession):\n", + "\n", + " # OVERRIDE\n", + " def _apply_updated(self, root_obj, buffer):\n", + " \"\"\"Updates the updated cuds in the engine.\"\"\"\n", + " for obj in buffer.values():\n", + "\n", + " # case 1: we change the velocity\n", + " if obj.is_a(simple_ontology.Velocity):\n", + " atom = obj.get(rel=simple_ontology.isPartOf)[0]\n", + " idx = self.mapper[atom.uid]\n", + " self._engine.update_velocity(idx, obj.value)\n", + "\n", + " # case 2: we change the position\n", + " elif obj.is_a(simple_ontology.Position):\n", + " atom = obj.get(rel=simple_ontology.isPartOf)[0]\n", + " idx = self.mapper[atom.uid]\n", + " self._engine.update_position(idx, obj.value)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Similarly to the previous methods, `_apply_deleted` should remove entities from the engine.\n", + "In this specific case we left it empty to simplify the code (both in the session and the engine classes)." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "class SimpleSimulationSession(SimpleSimulationSession):\n", + " # OVERRIDE\n", + " def _apply_deleted(self, root_obj, buffer):\n", + " \"\"\"Deletes the deleted cuds from the engine.\"\"\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "class SimpleSimulationSession(SimpleSimulationSession):\n", + "\n", + " # OVERRIDE\n", + " def _load_from_backend(self, uids, expired=None):\n", + " \"\"\"Loads the cuds object from the simulation engine\"\"\"\n", + " for uid in uids:\n", + " if uid in self._registry:\n", + " obj = self._registry.get(uid)\n", + "\n", + " # check whether user wants to load a position\n", + " if obj.is_a(simple_ontology.Position):\n", + " atom = obj.get(rel=simple_ontology.isPartOf)[0]\n", + " idx = self.mapper[atom.uid]\n", + " pos = self._engine.get_position(idx)\n", + " obj.value = pos\n", + "\n", + " # check whether user wants to load a velocity\n", + " elif obj.is_a(simple_ontology.Velocity):\n", + " atom = obj.get(rel=simple_ontology.isPartOf)[0]\n", + " idx = self.mapper[atom.uid]\n", + " vel = self._engine.get_velocity(idx)\n", + " obj.value = vel\n", + "\n", + " yield obj" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "class SimpleSimulationSession(SimpleSimulationSession):\n", + "\n", + " # OVERRIDE\n", + " def _run(self, root_cuds_object):\n", + " \"\"\"Call the run command of the engine.\"\"\"\n", + " self._engine.run()\n" + ] + } + ], + "metadata": { + "language_info": { + "name": "python", + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "version": "3.7.5-final" + }, + "orig_nbformat": 2, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "npconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": 3, + "kernelspec": { + "name": "python37564bitvenvvenvbd0fd6573f5f4e40af04d1a32ae4ddbe", + "display_name": "Python 3.7.5 64-bit ('venv': venv)" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} \ No newline at end of file diff --git a/docs/source/wrapper_development.md b/docs/source/wrapper_development.md index 825a16e..0e74b25 100644 --- a/docs/source/wrapper_development.md +++ b/docs/source/wrapper_development.md @@ -1,5 +1,6 @@ # Wrapper development -For an skeleton structure of a wrapper, you can visit the [wrapper development repo](https://gitlab.cc-asp.fraunhofer.de/simphony/wrappers/wrapper-development/). +For an skeleton structure of a wrapper, you can visit the [wrapper development repo](https://github.com/simphony/wrapper-development). +For a tutorial on creating a simple wrapper, there is a [jupyter notebook](jupyter/wrapper_development.ipynb) available. ## Ontology The end goal is to build one, unique and standard ontology with all the relevant entities and relationships. This ontology could use modules where the entities regarding a certain domain are present. From bfd2b5870cf58c8b040dd78dac22b3e4c6ef4d81 Mon Sep 17 00:00:00 2001 From: dea Date: Tue, 25 Aug 2020 03:17:36 +0200 Subject: [PATCH 35/57] Added example code --- docs/source/jupyter/wrapper_development.ipynb | 134 +++++++++++++++--- 1 file changed, 112 insertions(+), 22 deletions(-) diff --git a/docs/source/jupyter/wrapper_development.ipynb b/docs/source/jupyter/wrapper_development.ipynb index 327bdc3..0500c12 100644 --- a/docs/source/jupyter/wrapper_development.ipynb +++ b/docs/source/jupyter/wrapper_development.ipynb @@ -7,15 +7,16 @@ "# Tutorial 07: Wrapper development\n", "In this tutorial we will implement a very simple simulation wrapper.\n", "It can be used to understand which methods need to be implemented, and how.\n", - "The source files used can be found [here](https://github.com/simphony/wrapper-development).\n", + "\n", + "The source files can be found [here](https://github.com/simphony/wrapper-development).\n", "\n", "## Background\n", - "Wrappers are the way to extend SimPhoNy to support other back-ends. For an in-depth explanation, you can go to the [wrapper development section](../wrapper_development.md) of the documentation. Here we will explain with more detail the methods that have to be implemented.\n", + "Wrappers are the way to extend SimPhoNy to support other back-ends. For an in-depth explanation, you can go to the [wrapper development section](../wrapper_development.md) of the documentation. Here we will explain with more detail what has to be implemented.\n", "\n", "## Requirements\n", "In order to run this code, you need to have the simple_ontology available [here](https://github.com/simphony/wrapper-development/blob/master/osp/wrappers/simple_simulation/simple_ontology.ontology.yml).\n", "\n", - "Remember, once you have OSP-core installed, and the file locally, you can simply run `pico install `" + "Remember that once you have OSP-core installed and the ontology file locally, you can simply run `pico install `" ] }, { @@ -26,6 +27,7 @@ "### Syntactic layer\n", "As you know, SimPhoNy consists of 3 layers, with the wrappers being relevant in the last 2 (interoperability and syntactic layers).\n", "The syntactic layer talks directly to the back-end in a way that it can be understood.\n", + "\n", "Since this wrapper aims to be as minimalistic as possible (while still being meaningfull),\n", "we have created a dummy syntactic layer that emulates talking to a simulation tool.\n", "\n", @@ -34,7 +36,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -46,13 +48,21 @@ " self.velocity = velocity" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The engine only works with atoms, setting and getting their position and velocities" + ] + }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ - "# This engine only works with atoms, setting/getting their position and velocities\n", + "\n", + "\n", "class SimulationEngine:\n", " def __init__(self):\n", " self.atoms = list()\n", @@ -95,14 +105,20 @@ "### Interoperability layer\n", "Since a lot of 3rd-party tools come with a syntactic layer, the bulk of the work when developping a wrapper for SimPhoNy is here.\n", "\n", - "We will explain step by step all the code required.\n", - "\n", - "First, we import the parent Simulation Wrapper Session and the namespace (ontology). The engine is not necessary since it is in the previous codebock." + "We will explain step by step all the code required." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "First, we import the parent Simulation Wrapper Session and the namespace (ontology).\n", + "The engine is not necessary since it is in the previous codebock." ] }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ @@ -117,8 +133,8 @@ "source": [ "Next, we will go through each of the methods. \n", "\n", - "Note that to be able to break the class into multiple blocks, we will use inheritance, to add a method each time.\n", - "In truth, all the definitions should go under one same `class` directive." + "_Note:_ to be able to break the class into multiple blocks, we will use inheritance, to add a method each time.\n", + "In truth, all the definitions should go under one same `class` definition." ] }, { @@ -135,7 +151,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ @@ -156,7 +172,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ @@ -171,7 +187,7 @@ "metadata": {}, "source": [ "When the `run()` or `commit()` method is called on the session, all the objects that have been added since the last run have to be sent to the back end.\n", - "This is done through `_apply_added(self, root_obj, buffer)`.\n", + "This is done through `_apply_added`.\n", "The method should iterate through all the entities in the buffer and trigger different actions depending on which type of entity it is.\n", "\n", "Remember that we can check the type using the `is_a` method, or querying for the `oclass` attribute of an entity.\n", @@ -182,7 +198,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ @@ -203,11 +219,13 @@ { "cell_type": "markdown", "metadata": {}, - "source": [] + "source": [ + "Just like `_apply_added` is used to modify the engine with the new objects, `_apply_updated` changes the existing ones." + ] }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ @@ -241,7 +259,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 8, "metadata": {}, "outputs": [], "source": [ @@ -254,11 +272,22 @@ { "cell_type": "markdown", "metadata": {}, - "source": [] + "source": [ + "The previous methods synchronise the engine with the cuds, i.e. the communication is from the semantic layer towards the syntactic.\n", + "The way to update the cuds with the latest information from the engine is `_load_from_backend`.\n", + "\n", + "It is most often called when the user calls the `get` on a cuds object that has potentially been changed by the engine.\n", + "\n", + "When `_load_from_backend` is called for a given cuds object (through its uid), the method should:\n", + " - Check if any of the attributes of the object has changed (like the _value_ for a _position_).\n", + " - Check if any new children cuds objects have been created (like a static _atom_ that gets a new _velocity_ when another bumps into it).\n", + "\n", + "However, it does not have to be recursive and check for more than itself. This is because if the user queries any of the contained elements, that will trigger another call to `_load_from_backend`.\n" + ] }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 9, "metadata": {}, "outputs": [], "source": [ @@ -288,9 +317,18 @@ " yield obj" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The last method that needs to be overridden is `_run`. It simply has to call the `run` method of the engine.\n", + "This could also need to send some information, like the number of steps.\n", + "For that reason, the `root_cuds_object` is available for query." + ] + }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 10, "metadata": {}, "outputs": [], "source": [ @@ -301,6 +339,58 @@ " \"\"\"Call the run command of the engine.\"\"\"\n", " self._engine.run()\n" ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can run an example:" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": "Engine instantiated!\nAdd atom 0 with position [0. 0. 0.] and velocity [0.63000616 0.38951439 0.12717548]\nAdd atom 1 with position [1. 1. 1.] and velocity [0.80816851 0.04562681 0.44983098]\nAdd atom 2 with position [2. 2. 2.] and velocity [0.3849223 0.50767213 0.82963311]\nNow the engine is running\n- Cuds object:\n uuid: a0a97dbe-584d-4764-b085-7b597e323d20\n type: simple_ontology.Material\n superclasses: cuba.Class, simple_ontology.Material\n description: \n To Be Determined\n\n |_Relationship simple_ontology.hasPart:\n - simple_ontology.Atom cuds object:\n . uuid: 221a1793-c54a-4e42-bdeb-08921617fbac\n . |_Relationship simple_ontology.hasPart:\n . - simple_ontology.Position cuds object:\n . . uuid: db17082e-d9d3-4a48-bce1-9402d4315200\n . . unit: m\n . . value: [0.63000616 0.38951439 0.12717548]\n . - simple_ontology.Velocity cuds object:\n . uuid: fc7d778d-b18a-4b60-a6ab-ba855a2c2874\n . value: [0.63000616 0.38951439 0.12717548]\n . unit: m/s\n - simple_ontology.Atom cuds object:\n . uuid: 222df5d0-c0fe-435b-b5e2-0d5f7ebd32a9\n . |_Relationship simple_ontology.hasPart:\n . - simple_ontology.Position cuds object:\n . . uuid: f0eb08c4-88a3-40de-893f-89473cd194e8\n . . value: [1.80816851 1.04562681 1.44983098]\n . . unit: m\n . - simple_ontology.Velocity cuds object:\n . uuid: d3e7b5ce-3409-4a4e-bbdb-13a2addaee1c\n . value: [0.80816851 0.04562681 0.44983098]\n . unit: m/s\n - simple_ontology.Atom cuds object:\n uuid: 13bfe4ee-32e8-4fbe-bad5-f98f46aa297a\n |_Relationship simple_ontology.hasPart:\n - simple_ontology.Position cuds object:\n . uuid: da5c35f0-afe5-4b56-b5fa-631b72ee32ad\n . value: [2.3849223 2.50767213 2.82963311]\n . unit: m\n - simple_ontology.Velocity cuds object:\n uuid: 9b6c2c1c-3e63-4144-b7c9-d6223c0b79f7\n value: [0.3849223 0.50767213 0.82963311]\n unit: m/s\nUpdate atom 0. Setting velocity to [0. 0. 0.]\nUpdate atom 1. Setting velocity to [0. 0. 0.]\nUpdate atom 2. Setting velocity to [0. 0. 0.]\nNow the engine is running\n- Cuds object:\n uuid: a0a97dbe-584d-4764-b085-7b597e323d20\n type: simple_ontology.Material\n superclasses: cuba.Class, simple_ontology.Material\n description: \n To Be Determined\n\n |_Relationship simple_ontology.hasPart:\n - simple_ontology.Atom cuds object:\n . uuid: 221a1793-c54a-4e42-bdeb-08921617fbac\n . |_Relationship simple_ontology.hasPart:\n . - simple_ontology.Position cuds object:\n . . uuid: db17082e-d9d3-4a48-bce1-9402d4315200\n . . unit: m\n . . value: [0.63000616 0.38951439 0.12717548]\n . - simple_ontology.Velocity cuds object:\n . uuid: fc7d778d-b18a-4b60-a6ab-ba855a2c2874\n . value: [0. 0. 0.]\n . unit: m/s\n - simple_ontology.Atom cuds object:\n . uuid: 222df5d0-c0fe-435b-b5e2-0d5f7ebd32a9\n . |_Relationship simple_ontology.hasPart:\n . - simple_ontology.Position cuds object:\n . . uuid: f0eb08c4-88a3-40de-893f-89473cd194e8\n . . value: [1.80816851 1.04562681 1.44983098]\n . . unit: m\n . - simple_ontology.Velocity cuds object:\n . uuid: d3e7b5ce-3409-4a4e-bbdb-13a2addaee1c\n . unit: m/s\n . value: [0. 0. 0.]\n - simple_ontology.Atom cuds object:\n uuid: 13bfe4ee-32e8-4fbe-bad5-f98f46aa297a\n |_Relationship simple_ontology.hasPart:\n - simple_ontology.Position cuds object:\n . uuid: da5c35f0-afe5-4b56-b5fa-631b72ee32ad\n . value: [2.3849223 2.50767213 2.82963311]\n . unit: m\n - simple_ontology.Velocity cuds object:\n uuid: 9b6c2c1c-3e63-4144-b7c9-d6223c0b79f7\n value: [0. 0. 0.]\n unit: m/s\n" + } + ], + "source": [ + "from osp.core.utils import pretty_print\n", + "import numpy as np\n", + "\n", + "m = simple_ontology.Material()\n", + "for i in range(3):\n", + " a = m.add(simple_ontology.Atom())\n", + " a.add(\n", + " simple_ontology.Position(value=[i, i, i], unit=\"m\"),\n", + " simple_ontology.Velocity(value=np.random.random(3), unit=\"m/s\")\n", + " )\n", + "\n", + "# Run a simulation\n", + "with SimpleSimulationSession() as session:\n", + " w = simple_ontology.Wrapper(session=session)\n", + " m = w.add(m)\n", + " w.session.run()\n", + "\n", + " pretty_print(m)\n", + "\n", + " for atom in m.get(rel=simple_ontology.hasPart):\n", + " atom.get(oclass=simple_ontology.Velocity)[0].value = [0, 0, 0]\n", + " w.session.run()\n", + "\n", + " pretty_print(m)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [] } ], "metadata": { From 6b34f247de4e442589e8ba6cf94d99a419248085 Mon Sep 17 00:00:00 2001 From: dea Date: Wed, 26 Aug 2020 15:51:58 +0200 Subject: [PATCH 36/57] Added wrapper_dev tutorial --- docs/source/jupyter/wrapper_development.ipynb | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/docs/source/jupyter/wrapper_development.ipynb b/docs/source/jupyter/wrapper_development.ipynb index 0500c12..39ca0c3 100644 --- a/docs/source/jupyter/wrapper_development.ipynb +++ b/docs/source/jupyter/wrapper_development.ipynb @@ -4,7 +4,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Tutorial 07: Wrapper development\n", + "# Tutorial: Simple Wrapper development\n", "In this tutorial we will implement a very simple simulation wrapper.\n", "It can be used to understand which methods need to be implemented, and how.\n", "\n", @@ -61,8 +61,6 @@ "metadata": {}, "outputs": [], "source": [ - "\n", - "\n", "class SimulationEngine:\n", " def __init__(self):\n", " self.atoms = list()\n", From afc7cd18c599f12aa517afdba04d4bc48ac40344 Mon Sep 17 00:00:00 2001 From: dea Date: Wed, 26 Aug 2020 15:52:13 +0200 Subject: [PATCH 37/57] Reorganised the docs --- docs/source/included_ontologies.md | 2 +- docs/source/index.md | 13 ++++++------ docs/source/jupyter/cuds-api.ipynb | 22 +++++++------------- docs/source/jupyter/multiple-wrappers.ipynb | 2 +- docs/source/jupyter/ontology-interface.ipynb | 2 +- docs/source/jupyter/quantum-espresso.ipynb | 2 +- docs/source/jupyter/sessions_and_vars.ipynb | 2 +- docs/source/jupyter/simlammps.ipynb | 2 +- docs/source/wrapper_development.md | 2 +- 9 files changed, 22 insertions(+), 27 deletions(-) diff --git a/docs/source/included_ontologies.md b/docs/source/included_ontologies.md index f6b2062..2bac5eb 100644 --- a/docs/source/included_ontologies.md +++ b/docs/source/included_ontologies.md @@ -20,7 +20,7 @@ To use the city ontology you have to install it using the tool [Pico](utils.md#p pico install city ``` -Take a look at our [examples](jupyter/cuds-api.ipynb#Tutorial-01:-CUDS-API) to see how you can build your own city! +Take a look at our [examples](jupyter/cuds-api.md) to see how you can build your own city! ## Working with EMMO using OSP-core diff --git a/docs/source/index.md b/docs/source/index.md index 91907c7..1d800ab 100644 --- a/docs/source/index.md +++ b/docs/source/index.md @@ -21,6 +21,8 @@ Here you can browse though the general documentation of SimPhoNy. about.md motivation.md getting_started.md + jupyter/cuds-api.ipynb + jupyter/sessions_and_vars.ipynb .. toctree:: :caption: Ontology @@ -30,25 +32,24 @@ Here you can browse though the general documentation of SimPhoNy. included_ontologies.md yaml.md owl.md + jupyter/ontology-interface.ipynb .. toctree:: :caption: Further information detailed_design.md - wrapper_development.md utils.md .. toctree:: - :caption: DIY - :maxdepth: 2 + :caption: Wrappers - jupyter/cuds-api.ipynb - jupyter/ontology-interface.ipynb - jupyter/sessions_and_vars.ipynb + wrapper_development.md + jupyter/wrapper_development.ipynb jupyter/multiple-wrappers.ipynb jupyter/simlammps.ipynb jupyter/quantum-espresso.ipynb + .. toctree:: :caption: Additional :maxdepth: 2 diff --git a/docs/source/jupyter/cuds-api.ipynb b/docs/source/jupyter/cuds-api.ipynb index faabe56..f4f35e7 100644 --- a/docs/source/jupyter/cuds-api.ipynb +++ b/docs/source/jupyter/cuds-api.ipynb @@ -4,7 +4,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Tutorial 01: CUDS API\n", + "# Tutorial: CUDS API\n", "\n", "This tutorial introduces the CUDS API.\n", "The code given here is based on [this](https://gitlab.cc-asp.fraunhofer.de/simphony/osp-core/blob/master/examples/api_example.py) example." @@ -21,10 +21,12 @@ "Conceptually, we consider CUDS objects as containers. The content of a CUDS object consists of other CUDS objects. This means that a CUDS is a [recursive data structure](https://en.wikipedia.org/wiki/Recursive_data_type). There are various types of relationships between a container and its contained objects. We will see this later on.\n", "\n", "As a data structure, CUDS exposes an API that provides the functionalities *Create*, *Read*, *Update* and *Delete* (or simply [CRUD](https://en.wikipedia.org/wiki/Create,_read,_update_and_delete)).\n", - "Except *Create*, all the other functionalities are supported by the methods `add`, `get`, `remove`, `update` and `iter`, that are defined in the class `Cuds`. Here, we cover all of the methods except `update` since it is used to synchronize between two or more data sources, and in this tutorial we will only use one, that is the data we will create through our python code on the fly. Check out the [wrapper tutorial](./multiple-wrappers.ipynb) to see the `update` method in action.\n", + "Except *Create*, all the other functionalities are supported by the methods `add`, `get`, `remove`, `update` and `iter`, that are defined in the class `Cuds`. Here, we cover all of the methods except `update` since it is used to synchronize between two or more data sources, and in this tutorial we will only use one, that is the data we will create through our python code on the fly. Check out the [wrapper tutorial](multiple-wrappers.ipynb) to see the `update` method in action.\n", "\n", - "Every CUDS object is related to an ontological concept via the ontological `is a` relation. In the python implementation of OSP-core, all ontological concepts are instances of the `OntologyEntity` class. The ontological concept that can be used to *Create* CUDS objects are instances of `OntologyClass`, a subclass of `OntologyEntity`. The ontological\n", - "concepts are organized in namespaces.\n" + "Every CUDS object is related to an ontological concept via the ontological `is a` relation.\n", + "In the python implementation of OSP-core, all ontological concepts are instances of the `OntologyEntity` class.\n", + "The ontological concept that can be used to *Create* CUDS objects are instances of `OntologyClass`, a subclass of `OntologyEntity`.\n", + "The ontological concepts are organized in namespaces." ] }, { @@ -32,7 +34,7 @@ "metadata": {}, "source": [ "## Let's get hands on\n", - "We start by importing the example namespace from osp-core. It consists of concepts that were automatically generated from the [dummy city ontology](https://gitlab.cc-asp.fraunhofer.de/simphony/osp-core/blob/cuds-3.0/cuds/ontology/ontology.city.yml). There is [another tutorial](#) on the ontology YAML file. However, it is not important for the purposes of this tutorial.\n", + "We start by importing the example namespace from osp-core. It consists of concepts that were automatically generated from the [dummy city ontology](https://github.com/simphony/osp-core/blob/master/osp/core/ontology/docs/city.ontology.yml). There is [another tutorial](#) on the ontology YAML file. However, it is not important for the purposes of this tutorial.\n", "\n", "Before we can start, you have to install the city ontology. Use out tool pico for this:" ] @@ -70,7 +72,6 @@ "outputs": [], "source": [ "# If you just installed the ontology from within this notebook and this line doesn't work, please restart the kernel and run this cell again.\n", - "\n", "from osp.core.namespaces import city" ] }, @@ -94,7 +95,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "The variable `c` is assigned with a newly created CUDS object. This object was initialized with a name (Freiburg) and coordinates ([47, 7]). To understand why these two arguments were necessary, we'll have to take a look at the ontology. This will be explained in another tutorial." + "The variable `c` is assigned with a newly created CUDS object. This object was initialized with a name (Freiburg) and coordinates (\\[47, 7\\]). To understand why these two arguments were necessary, we'll have to take a look at the ontology. This will be explained in another tutorial." ] }, { @@ -286,13 +287,6 @@ "for i in range(6):\n", " c.add(city.Neighborhood(name=\"neighbourhood %s\" % i))" ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": {}, diff --git a/docs/source/jupyter/multiple-wrappers.ipynb b/docs/source/jupyter/multiple-wrappers.ipynb index 95f31a2..bd99ac3 100644 --- a/docs/source/jupyter/multiple-wrappers.ipynb +++ b/docs/source/jupyter/multiple-wrappers.ipynb @@ -4,7 +4,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Tutorial 04: Multiple wrappers\n", + "# Tutorial: Multiple wrappers\n", "This tutorial introduces the use of multiple data sources, and shows how can one exchange information between them. The code given here is based on [this example](https://gitlab.cc-asp.fraunhofer.de/simphony/osp-core/blob/master/examples/multiple_wrappers_example.py) and builds on the [introduction on the CUDS API](./cuds-api.ipynb).\n", "\n", "## Background\n", diff --git a/docs/source/jupyter/ontology-interface.ipynb b/docs/source/jupyter/ontology-interface.ipynb index 0033f23..919ce3e 100644 --- a/docs/source/jupyter/ontology-interface.ipynb +++ b/docs/source/jupyter/ontology-interface.ipynb @@ -4,7 +4,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Tutorial 02: Ontology Interface\n", + "# Tutorial: Ontology Interface\n", "\n", "This tutorial introduces the interface to the installed ontologies. The code presented is based on [this example](#). If you want to create your own ontology please refer to [this guide](../yaml.md)." ] diff --git a/docs/source/jupyter/quantum-espresso.ipynb b/docs/source/jupyter/quantum-espresso.ipynb index ebf9c7a..cab5671 100644 --- a/docs/source/jupyter/quantum-espresso.ipynb +++ b/docs/source/jupyter/quantum-espresso.ipynb @@ -4,7 +4,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Tutorial 06: Quantum Espresso Wrapper\n", + "# Tutorial: Quantum Espresso Wrapper\n", "\n", "In this tutorial we will go through a simple example of how to use the wrapper for the Quantum Espresso simulation engine. You can find the wrapper [here](https://github.com/simphony/quantum-espresso-wrapper).\n", "## Background\n", diff --git a/docs/source/jupyter/sessions_and_vars.ipynb b/docs/source/jupyter/sessions_and_vars.ipynb index b146c41..e25193d 100644 --- a/docs/source/jupyter/sessions_and_vars.ipynb +++ b/docs/source/jupyter/sessions_and_vars.ipynb @@ -4,7 +4,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Tutorial 03: Sessions and variables\n", + "# Tutorial: Sessions and variables\n", "In this tutorial we will explain how objects and the variables assigned to them behave with different sessions.\n", "\n", "## Background\n", diff --git a/docs/source/jupyter/simlammps.ipynb b/docs/source/jupyter/simlammps.ipynb index 52262a6..5f19bb3 100644 --- a/docs/source/jupyter/simlammps.ipynb +++ b/docs/source/jupyter/simlammps.ipynb @@ -4,7 +4,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Tutorial 05: Simlammps wrapper\n", + "# Tutorial: Simlammps wrapper\n", "In this tutorial we will go through a simple example of how to use the wrapper for the LAMMPS simulation engine.\n", "You can find the wrapper [here](https://gitlab.cc-asp.fraunhofer.de/simphony/wrappers/simlammps).\n", "\n", diff --git a/docs/source/wrapper_development.md b/docs/source/wrapper_development.md index 0e74b25..578d560 100644 --- a/docs/source/wrapper_development.md +++ b/docs/source/wrapper_development.md @@ -1,6 +1,6 @@ # Wrapper development For an skeleton structure of a wrapper, you can visit the [wrapper development repo](https://github.com/simphony/wrapper-development). -For a tutorial on creating a simple wrapper, there is a [jupyter notebook](jupyter/wrapper_development.ipynb) available. +For a tutorial on creating a simple wrapper, there is a [jupyter notebook](jupyter/wrapper_development.md) available. ## Ontology The end goal is to build one, unique and standard ontology with all the relevant entities and relationships. This ontology could use modules where the entities regarding a certain domain are present. From 2e27fcb8079d55c4c6c757c9d64b41b5b48bf256 Mon Sep 17 00:00:00 2001 From: dea Date: Wed, 26 Aug 2020 16:04:28 +0200 Subject: [PATCH 38/57] Fixed link --- docs/source/jupyter/simlammps.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/jupyter/simlammps.ipynb b/docs/source/jupyter/simlammps.ipynb index 5f19bb3..9d0782a 100644 --- a/docs/source/jupyter/simlammps.ipynb +++ b/docs/source/jupyter/simlammps.ipynb @@ -25,7 +25,7 @@ "Like we explain in the [wrapper development section](../wrapper_development.md#engine-installation), there are two options:\n", "\n", "- Using Docker: run `./docker_install.sh`.\n", - "- Local installation: remember that you must have a compatible version of [osp-core installed](../getting_started#osp-core-installation).\n", + "- Local installation: remember that you must have a compatible version of [osp-core installed](../getting_started.md#osp-core-installation).\n", " \n", " Install the ontology via `pico install ontology.simlammps.yml.`\n", " \n", From e99ad206aee6127ca1ba653e8613a0ab00225316 Mon Sep 17 00:00:00 2001 From: dea Date: Thu, 27 Aug 2020 10:15:47 +0200 Subject: [PATCH 39/57] Reorganised sections --- docs/source/index.md | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/docs/source/index.md b/docs/source/index.md index 1d800ab..ac9fc84 100644 --- a/docs/source/index.md +++ b/docs/source/index.md @@ -15,7 +15,7 @@ Here you can browse though the general documentation of SimPhoNy. ```eval_rst .. toctree:: - :caption: Basics + :caption: Introduction :maxdepth: 2 about.md @@ -23,6 +23,8 @@ Here you can browse though the general documentation of SimPhoNy. getting_started.md jupyter/cuds-api.ipynb jupyter/sessions_and_vars.ipynb + detailed_design.md + utils.md .. toctree:: :caption: Ontology @@ -34,11 +36,6 @@ Here you can browse though the general documentation of SimPhoNy. owl.md jupyter/ontology-interface.ipynb -.. toctree:: - :caption: Further information - - detailed_design.md - utils.md .. toctree:: :caption: Wrappers From 8457202ec32e32dd0f12e572bd57f3581e160e98 Mon Sep 17 00:00:00 2001 From: dea Date: Thu, 27 Aug 2020 10:25:15 +0200 Subject: [PATCH 40/57] Reorganised wrapper section --- docs/source/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/source/index.md b/docs/source/index.md index ac9fc84..3fa80e6 100644 --- a/docs/source/index.md +++ b/docs/source/index.md @@ -40,11 +40,11 @@ Here you can browse though the general documentation of SimPhoNy. .. toctree:: :caption: Wrappers - wrapper_development.md - jupyter/wrapper_development.ipynb jupyter/multiple-wrappers.ipynb jupyter/simlammps.ipynb jupyter/quantum-espresso.ipynb + wrapper_development.md + jupyter/wrapper_development.ipynb .. toctree:: From b76944861588ed7135460e96f3bd9be22a5a3d20 Mon Sep 17 00:00:00 2001 From: Pablo de Andres <9430234+pablo-de-andres@users.noreply.github.com> Date: Thu, 27 Aug 2020 11:42:50 +0200 Subject: [PATCH 41/57] Update pico and installation (#34) * updated pico uninstall all * minor fix * Updated installation notes * Updated links --- docs/source/getting_started.md | 36 +++++++++++++++------ docs/source/included_ontologies.md | 2 +- docs/source/jupyter/cuds-api.ipynb | 4 +-- docs/source/jupyter/multiple-wrappers.ipynb | 18 +++++++---- docs/source/jupyter/quantum-espresso.ipynb | 6 ++-- docs/source/jupyter/simlammps.ipynb | 2 +- docs/source/links.md | 5 +-- docs/source/owl.md | 4 +-- docs/source/utils.md | 9 +++--- docs/source/wrapper_development.md | 8 +++-- docs/source/yaml.md | 4 +-- 11 files changed, 61 insertions(+), 37 deletions(-) diff --git a/docs/source/getting_started.md b/docs/source/getting_started.md index da19593..c85bcf1 100644 --- a/docs/source/getting_started.md +++ b/docs/source/getting_started.md @@ -98,7 +98,7 @@ The abstraction is replaced by specificity when you move towards the backend. For a full explanation on the architecture and design, go to [detailed design](./detailed_design.md). ## OSP-core -[OSP-core](https://gitlab.cc-asp.fraunhofer.de/simphony/osp-core) is the main component of the SimPhoNy framework. +[OSP-core](https://github.com/simphony/osp-core) is the main component of the SimPhoNy framework. It is independent of any backend and provides the basic ontology based data structures for the seamless exchange of data between wrappers. ### Ontology file @@ -251,8 +251,8 @@ For more technical information regarding wrappers, particularly for wrapper deve we recommend visiting [wrapper development](./wrapper_development.md). # Installation -For the installation and usage of the framework, -we *highly* encourage the use of a [virtual environment](https://docs.python.org/3/tutorial/venv.html): +For the installation and usage of the framework Python 3.6 or higher is needed. +We *highly* encourage the use of a [virtual environment](https://docs.python.org/3/tutorial/venv.html): ```shell ~/test$ python3 -m venv SimPhoNy @@ -265,20 +265,38 @@ First, the repository must be cloned: ```shell git clone git@github.com:simphony/osp-core.git +cd osp-core ``` -Once available locally, the project must be installed. The default installation is: +The installation is based on setuptools: -```shell -cd osp-core +```sh +# build and install (recommended) +pip install . + +# alternative python3 setup.py install ``` -After installing OSP-core, you can install an ontology file using -[**pico**](./utils.md#pico-installs-cuds-ontologies): +or: -```shell +```sh +# build for in-place development (recommended) +pip install -e . + +# alternative +python3 setup.py develop +``` + +After installing OSP-core, you can install your ontology namespaces. +We provide the tool [`pico`](./utils.md#pico-installs-cuds-ontologies) +(**p**ico **i**nstalls **c**uds **o**ntologies) for that purpose. + +```sh pico install + +# If you have issues using pico directly, you can use +python -m osp.core.pico install ``` ## Wrapper installation diff --git a/docs/source/included_ontologies.md b/docs/source/included_ontologies.md index 2bac5eb..99214dc 100644 --- a/docs/source/included_ontologies.md +++ b/docs/source/included_ontologies.md @@ -4,7 +4,7 @@ OSP core currently ships with two ontologies. The first one, called `city` is a simple example ontology. -You can use it to play around and get familiar with osp-core. +You can use it to play around and get familiar with OSP-core. We will also use it a lot in this documentation as an example. The city ontology provides the concepts to describe people and diff --git a/docs/source/jupyter/cuds-api.ipynb b/docs/source/jupyter/cuds-api.ipynb index f4f35e7..7eb35a9 100644 --- a/docs/source/jupyter/cuds-api.ipynb +++ b/docs/source/jupyter/cuds-api.ipynb @@ -7,7 +7,7 @@ "# Tutorial: CUDS API\n", "\n", "This tutorial introduces the CUDS API.\n", - "The code given here is based on [this](https://gitlab.cc-asp.fraunhofer.de/simphony/osp-core/blob/master/examples/api_example.py) example." + "The code given here is based on [this](https://github.com/simphony/osp-core/blob/master/examples/api_example.py) example." ] }, { @@ -34,7 +34,7 @@ "metadata": {}, "source": [ "## Let's get hands on\n", - "We start by importing the example namespace from osp-core. It consists of concepts that were automatically generated from the [dummy city ontology](https://github.com/simphony/osp-core/blob/master/osp/core/ontology/docs/city.ontology.yml). There is [another tutorial](#) on the ontology YAML file. However, it is not important for the purposes of this tutorial.\n", + "We start by importing the example namespace from OSP-core. It consists of concepts that were automatically generated from the [dummy city ontology](https://github.com/simphony/osp-core/blob/master/osp/core/ontology/docs/city.ontology.yml). There is [another tutorial](#) on the ontology YAML file. However, it is not important for the purposes of this tutorial.\n", "\n", "Before we can start, you have to install the city ontology. Use out tool pico for this:" ] diff --git a/docs/source/jupyter/multiple-wrappers.ipynb b/docs/source/jupyter/multiple-wrappers.ipynb index bd99ac3..89ba5c2 100644 --- a/docs/source/jupyter/multiple-wrappers.ipynb +++ b/docs/source/jupyter/multiple-wrappers.ipynb @@ -5,14 +5,18 @@ "metadata": {}, "source": [ "# Tutorial: Multiple wrappers\n", - "This tutorial introduces the use of multiple data sources, and shows how can one exchange information between them. The code given here is based on [this example](https://gitlab.cc-asp.fraunhofer.de/simphony/osp-core/blob/master/examples/multiple_wrappers_example.py) and builds on the [introduction on the CUDS API](./cuds-api.ipynb).\n", + "This tutorial introduces the use of multiple data sources, and shows how can one exchange information between them. The code given here is based on [this example](https://github.com/simphony/osp-core/blob/master/examples/multiple_wrappers_example.py) and builds on the [introduction on the CUDS API](./cuds-api.ipynb).\n", "\n", "## Background\n", - "One of the main strengths of CUDS objects is their ability to share information between different underlying data sources interchangeably. Using OSP-core's innerworkings a data source can be represented as a CUDS object. A data source can be in turn a database, a simulation engine, or any other software package, which is able to either generate or store information.\n", + "One of the main strengths of CUDS objects is their ability to share information between different underlying data sources interchangeably.\n", + "Using OSP-core's innerworkings a data source can be represented as a CUDS object.\n", + "A data source can be in turn a database, a simulation engine, or any other software package, which is able to either generate or store information.\n", "\n", - "We refer to a CUDS object, which represents an underlying data source as a **wrapper**, as it wraps around the data source. Wrappers use the CUDS API with the addition to some wrapper-specific methods, which will be discussed later on in this tutorial.\n", + "We refer to a CUDS object, which represents an underlying data source as a **wrapper**, as it wraps around the data source.\n", + "Wrappers use the CUDS API with the addition to some wrapper-specific methods, which will be discussed later on in this tutorial.\n", "\n", - "For a wrapper to be initialized, one needs some context for the underlying data source (e.g. location, credentials, etc.) for this we introduce an object called **session**. Conceptually a session can be thought as an interoperability level, or in simple terms it handles the transition from the user-friendly CUDS API to the more task-specific syntax data sources tend to have." + "For a wrapper to be initialized, one needs some context for the underlying data source (e.g. location, credentials, etc.) for this we introduce an object called **session**.\n", + "Conceptually a session can be thought as an interoperability level, or in simple terms it handles the transition from the user-friendly CUDS API to the more task-specific syntax data sources tend to have." ] }, { @@ -20,7 +24,7 @@ "metadata": {}, "source": [ "## Let's get hands on\n", - "We start by importing the example namespace of osp-core. If you haven't already, you should install the city ontology before:" + "We start by importing the example namespace of OSP-core. If you haven't already, you should install the city ontology before:" ] }, { @@ -103,7 +107,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Next we import a session object, which will provide the context to a simple simulation engine we developed for demonstrational purposes. It is already included in osp-core." + "Next we import a session object, which will provide the context to a simple simulation engine we developed for demonstrational purposes. It is already included in OSP-core." ] }, { @@ -153,7 +157,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "In the next lines we create our small ontology-loving [**EMMO town** example](https://emmc.info/emmo-info/). Please pay a closer attention to the fourth line ([this](https://gitlab.cc-asp.fraunhofer.de/simphony/osp-core/blob/master/examples/multiple_wrappers_example.py#L30) line in the `multiple_wrappers_example.py` file) as there you can see the power of the `add` method and how with one statement one can add multiple `CITIZEN` CUDS objects simultaneously." + "In the next lines we create our small ontology-loving [**EMMO town** example](https://emmc.info/emmo-info/). Please pay a closer attention to the fourth line as there you can see the power of the `add` method and how with one statement one can add multiple `CITIZEN` CUDS objects simultaneously." ] }, { diff --git a/docs/source/jupyter/quantum-espresso.ipynb b/docs/source/jupyter/quantum-espresso.ipynb index cab5671..52c03ef 100644 --- a/docs/source/jupyter/quantum-espresso.ipynb +++ b/docs/source/jupyter/quantum-espresso.ipynb @@ -6,7 +6,9 @@ "source": [ "# Tutorial: Quantum Espresso Wrapper\n", "\n", - "In this tutorial we will go through a simple example of how to use the wrapper for the Quantum Espresso simulation engine. You can find the wrapper [here](https://github.com/simphony/quantum-espresso-wrapper).\n", + "In this tutorial we will go through a simple example of how to use the wrapper for the Quantum Espresso simulation engine.\n", + "You can find the wrapper [here](https://github.com/simphony/quantum-espresso-wrapper).\n", + "\n", "## Background\n", "This is an example of a slightly different design based upon the input-output functionality of certain simulation engines such as Quantum Espresso and Gromacs.\n" ] @@ -24,8 +26,6 @@ " \n", "Once you have verified that `pw.x` works, install the ontology via `pico install ontology.simlammps.yml`, and make sure to run `python3 setup.py` located in the root of the quantum espresso wrapper folder. \n", "\n", - "Note that the installation of the ontology requires version 3.4.0 of osp-core to be installed (see [dev branch](https://github.com/simphony/osp-core/tree/v3.4.0-dev))\n", - "\n", "That should be all needed to use Quantum Espresso!\n", "\n", "### Simple example\n", diff --git a/docs/source/jupyter/simlammps.ipynb b/docs/source/jupyter/simlammps.ipynb index 9d0782a..cc95a1d 100644 --- a/docs/source/jupyter/simlammps.ipynb +++ b/docs/source/jupyter/simlammps.ipynb @@ -25,7 +25,7 @@ "Like we explain in the [wrapper development section](../wrapper_development.md#engine-installation), there are two options:\n", "\n", "- Using Docker: run `./docker_install.sh`.\n", - "- Local installation: remember that you must have a compatible version of [osp-core installed](../getting_started.md#osp-core-installation).\n", + "- Local installation: remember that you must have a compatible version of [OSP-core installed](../getting_started.md#osp-core-installation).\n", " \n", " Install the ontology via `pico install ontology.simlammps.yml.`\n", " \n", diff --git a/docs/source/links.md b/docs/source/links.md index 2ec177f..0bf3262 100644 --- a/docs/source/links.md +++ b/docs/source/links.md @@ -1,8 +1,9 @@ # Related links Here are links to other projects relevant for this documentation. SimPhoNy: -- [SimPhoNy group](https://gitlab.cc-asp.fraunhofer.de/simphony) -- [OSP-core](https://gitlab.cc-asp.fraunhofer.de/simphony/osp-core) +- [GitLab's SimPhoNy group](https://gitlab.cc-asp.fraunhofer.de/simphony) +- [GitHub's SimPhoNy group](https://github.com/simphony) +- [OSP-core](https://github.com/simphony/osp-core) - [wrappers](https://gitlab.cc-asp.fraunhofer.de/simphony/wrappers) - [wrapper development](https://gitlab.cc-asp.fraunhofer.de/simphony/wrappers/wrapper-development/) diff --git a/docs/source/owl.md b/docs/source/owl.md index e516b09..f203926 100644 --- a/docs/source/owl.md +++ b/docs/source/owl.md @@ -1,6 +1,6 @@ # How to work with owl ontologies -To install owl ontologies in osp-core, you have to create a configuration yaml file similar +To install owl ontologies in OSP-core, you have to create a configuration yaml file similar to the following one: ```yaml @@ -43,7 +43,7 @@ We support all the formats that [RDFLib](https://rdflib.readthedocs.io/) support RDF/XML, N3, NTriples, N-Quads, Turtle, TriX, RDFa and Microdata. **reference_by_label** (default False): Whether the label should be used or the IRI suffix to reference -entity from within osp-core. In case of EMMO it is true, because IRI suffixes are not +entity from within OSP-core. In case of EMMO it is true, because IRI suffixes are not human friendly. In this case all labels should be unique and not contain whitespaces. If False, use dot notation to get by IRI square brackets (`__getitem__`) to get by label. The latter will return a list of all entities with the same label. diff --git a/docs/source/utils.md b/docs/source/utils.md index d6acd93..f219ded 100644 --- a/docs/source/utils.md +++ b/docs/source/utils.md @@ -8,8 +8,8 @@ It is a recursive acronym that stands for _Pico Installs Cuds Ontologies_. There are 3 main things that can be done with pico: - Install ontologies. -- List the install ontologies. -- Removed installed ontologies. +- List the installed ontologies. +- Remove installed ontologies. There are different possible levels of log available, and they can be set via `--log-level `. The default value is `INFO`. @@ -36,7 +36,6 @@ INFO [osp.core.ontology.installation]: Installation successful _Usage:_ `pico list` _Behaviour:_ - - The installed namespaces and packages are printed out. A package can be uninstalled and can contain many namespaces. A namespace can be imported in code. @@ -57,8 +56,8 @@ Namespaces: ``` ### Pico uninstalls -_Usage:_ `pico uninstall |"*"` -Note that to select all the packages, `"*"` must be quoted. +_Usage:_ `pico uninstall |all`. +Note that to select all the packages, `all` must be quoted. _Behaviour:_ - All installed packages / namespaces are uninstalled. diff --git a/docs/source/wrapper_development.md b/docs/source/wrapper_development.md index 578d560..68cbf42 100644 --- a/docs/source/wrapper_development.md +++ b/docs/source/wrapper_development.md @@ -215,12 +215,14 @@ The `Dockerfile` for the Container Registry image will be very similar to the on However, here it might be useful to install other libraries like flake8 for style checks. ## Utility functions for wrapper development -We have developed some functions that will probably come in handy when developing a wrapper. You can find them in [osp.core.utils.wrapper_development](https://gitlab.cc-asp.fraunhofer.de/simphony/osp-core/blob/master/osp/core/utils/wrapper_development.py). +We have developed some functions that will probably come in handy when developing a wrapper. +You can find them in [osp.core.utils.wrapper_development](https://github.com/simphony/osp-core/blob/master/osp/core/utils/wrapper_development.py). ## Wrapper Examples Some wrappers we are developing are: - [SQLAlchemy](https://gitlab.cc-asp.fraunhofer.de/simphony/wrappers/sqlalchemy-wrapper) -- [SQLite](https://gitlab.cc-asp.fraunhofer.de/simphony/wrappers/sqlite-wrapper) +- [SQLite](https://github.com/simphony/osp-core/tree/master/osp/wrappers/sqlite) - [SimLammps](https://gitlab.cc-asp.fraunhofer.de/simphony/wrappers/simlammps) - [SimGromacs](https://gitlab.cc-asp.fraunhofer.de/simphony/wrappers/simgromacs) -- [SimOpenFoam](https://gitlab.cc-asp.fraunhofer.de/simphony/wrappers/simopenfoam) \ No newline at end of file +- [SimOpenFoam](https://gitlab.cc-asp.fraunhofer.de/simphony/wrappers/simopenfoam) +- [Quantum Espresso](https://github.com/simphony/quantum-espresso-wrapper) \ No newline at end of file diff --git a/docs/source/yaml.md b/docs/source/yaml.md index 10f6aab..92b79d9 100644 --- a/docs/source/yaml.md +++ b/docs/source/yaml.md @@ -6,7 +6,7 @@ This file describes how you can create ontologies using YAML. .. tip:: If you have an ontology where all entity names are in ALL_UPPERCASE, you can use the commandline tool `yaml2camelcase` that is shipped with - osp-core to transform it to an ontology with CamelCase entity names. + OSP-core to transform it to an ontology with CamelCase entity names. ``` ## Introduction @@ -59,7 +59,7 @@ pico install > By convention, they should be in CamelCase. The name of ontology classes > should start with an uppercase latter, while the name of relationships > and attributes should start with a lower case letter. -> This key is later used the reference the entity from within osp-core +> This key is later used the reference the entity from within OSP-core > in a case sensitive manner. > The value of the mapping is a mapping whose format is detailed in the > [Ontology entities format](#ontology-entities-format). From d818e9a84e3a252094f2e8d6bb87290fe9f5ba79 Mon Sep 17 00:00:00 2001 From: Pablo de Andres <9430234+pablo-de-andres@users.noreply.github.com> Date: Tue, 15 Sep 2020 09:52:17 +0200 Subject: [PATCH 42/57] Added badges (#40) --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 615ffa3..29e99fe 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,6 @@ +## Build Status +**latest** - [![Documentation latest](https://readthedocs.org/projects/simphony/badge/?version=latest)](https://simphony.readthedocs.io/en/latest/?badge=latest) +**dev** - [![Documentation dev](https://readthedocs.org/projects/simphony/badge/?version=dev)](https://simphony.readthedocs.io/en/latest/?badge=dev) # SimPhoNy docs To access the documentation, please visit: https://simphony.readthedocs.io/en/latest/ From 336958aed011c51e55f0a728944b5756ad9bc371 Mon Sep 17 00:00:00 2001 From: dea Date: Wed, 2 Dec 2020 10:51:43 +0100 Subject: [PATCH 43/57] osp-core is open source --- docs/source/about.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/about.md b/docs/source/about.md index a8aaadb..109a348 100644 --- a/docs/source/about.md +++ b/docs/source/about.md @@ -1,7 +1,7 @@ # About SimPhoNy is an ontology-based framework that promotes and enables interoperability between any 3rd-party software tool. -Its latest version is soon to become an open-source python project. +Its [core functionality](https://github.com/simphony/osp-core) is an open-source python project. The name ‘SimPhoNy’ stems from the SimPhoNy EU-project in which it was originally developed (See more details [here](https://www.simphony-project.eu/)). One of SimPhoNy’s main tasks is to convert *opaque* data, meaning data whose semantics are hidden, to *transparent* data, that is data whose semantics is understood and easily accessible. From cdfb14b683e3e608d7b35b1fa69767ceeedaa76f Mon Sep 17 00:00:00 2001 From: dea Date: Wed, 2 Dec 2020 10:55:39 +0100 Subject: [PATCH 44/57] standalone section for installation --- docs/source/getting_started.md | 85 ---------------------------------- docs/source/index.md | 1 + docs/source/installation.md | 84 +++++++++++++++++++++++++++++++++ 3 files changed, 85 insertions(+), 85 deletions(-) create mode 100644 docs/source/installation.md diff --git a/docs/source/getting_started.md b/docs/source/getting_started.md index c85bcf1..81cdfc3 100644 --- a/docs/source/getting_started.md +++ b/docs/source/getting_started.md @@ -249,88 +249,3 @@ we suggest going through the different available [repositories](https://gitlab.c For more technical information regarding wrappers, particularly for wrapper developers, we recommend visiting [wrapper development](./wrapper_development.md). - -# Installation -For the installation and usage of the framework Python 3.6 or higher is needed. -We *highly* encourage the use of a [virtual environment](https://docs.python.org/3/tutorial/venv.html): - -```shell -~/test$ python3 -m venv SimPhoNy -~/test$ source SimPhoNy/bin/activate -(SimPhoNy) ~/test$ -``` - -## OSP-core installation -First, the repository must be cloned: - -```shell -git clone git@github.com:simphony/osp-core.git -cd osp-core -``` - -The installation is based on setuptools: - -```sh -# build and install (recommended) -pip install . - -# alternative -python3 setup.py install -``` - -or: - -```sh -# build for in-place development (recommended) -pip install -e . - -# alternative -python3 setup.py develop -``` - -After installing OSP-core, you can install your ontology namespaces. -We provide the tool [`pico`](./utils.md#pico-installs-cuds-ontologies) -(**p**ico **i**nstalls **c**uds **o**ntologies) for that purpose. - -```sh -pico install - -# If you have issues using pico directly, you can use -python -m osp.core.pico install -``` - -## Wrapper installation -The installation of a wrapper is similar. First, the repository is cloned: - -```shell -git clone git@github.com:simphony/.git -cd some-wrapper -``` -### Local wrapper installation -With OSP-core installed, if the wrapper has its own ontology, it *must* be installed: - -```shell -pico install -``` - -For the wrappers that require the installation of a backend, a `install_engine.sh` script is provided. -It will automatically call `install_engine_requirements.sh`, where the engine specific requirements are installed. - -```shell -./install_engine.sh -``` - -Now the wrapper can be installed: - -```shell -python3 setup.py install -``` - -### Wrapper Docker image -Some wrappers also provided a [Dockerfile](https://docs.docker.com/engine/reference/builder/) -for an automatic installation in a container. -Simply run the `docker_install.sh` script. There is no need to install OSP-core either. - -```shell -./docker_install.sh -``` diff --git a/docs/source/index.md b/docs/source/index.md index 3fa80e6..991fae3 100644 --- a/docs/source/index.md +++ b/docs/source/index.md @@ -21,6 +21,7 @@ Here you can browse though the general documentation of SimPhoNy. about.md motivation.md getting_started.md + installation.md jupyter/cuds-api.ipynb jupyter/sessions_and_vars.ipynb detailed_design.md diff --git a/docs/source/installation.md b/docs/source/installation.md new file mode 100644 index 0000000..be23a58 --- /dev/null +++ b/docs/source/installation.md @@ -0,0 +1,84 @@ +# Installation +For the installation and usage of the framework Python 3.6 or higher is needed. +We *highly* encourage the use of a [virtual environment](https://docs.python.org/3/tutorial/venv.html): + +```shell +~/test$ python3 -m venv SimPhoNy +~/test$ source SimPhoNy/bin/activate +(SimPhoNy) ~/test$ +``` + +## OSP-core installation +First, the repository must be cloned: + +```shell +git clone git@github.com:simphony/osp-core.git +cd osp-core +``` + +The installation is based on setuptools: + +```sh +# build and install (recommended) +pip install . + +# alternative +python3 setup.py install +``` + +or: + +```sh +# build for in-place development (recommended) +pip install -e . + +# alternative +python3 setup.py develop +``` + +After installing OSP-core, you can install your ontology namespaces. +We provide the tool [`pico`](./utils.md#pico-installs-cuds-ontologies) +(**p**ico **i**nstalls **c**uds **o**ntologies) for that purpose. + +```sh +pico install + +# If you have issues using pico directly, you can use +python -m osp.core.pico install +``` + +## Wrapper installation +The installation of a wrapper is similar. First, the repository is cloned: + +```shell +git clone git@github.com:simphony/.git +cd some-wrapper +``` +### Local wrapper installation +With OSP-core installed, if the wrapper has its own ontology, it *must* be installed: + +```shell +pico install +``` + +For the wrappers that require the installation of a backend, a `install_engine.sh` script is provided. +It will automatically call `install_engine_requirements.sh`, where the engine specific requirements are installed. + +```shell +./install_engine.sh +``` + +Now the wrapper can be installed: + +```shell +python3 setup.py install +``` + +### Wrapper Docker image +Some wrappers also provided a [Dockerfile](https://docs.docker.com/engine/reference/builder/) +for an automatic installation in a container. +Simply run the `docker_install.sh` script. There is no need to install OSP-core either. + +```shell +./docker_install.sh +``` From 7cbccf56b2595df30808d15d29c845c2c2597ba4 Mon Sep 17 00:00:00 2001 From: dea Date: Wed, 2 Dec 2020 11:01:35 +0100 Subject: [PATCH 45/57] added conda to installation --- docs/source/installation.md | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/docs/source/installation.md b/docs/source/installation.md index be23a58..37b6fcf 100644 --- a/docs/source/installation.md +++ b/docs/source/installation.md @@ -1,13 +1,22 @@ # Installation For the installation and usage of the framework Python 3.6 or higher is needed. -We *highly* encourage the use of a [virtual environment](https://docs.python.org/3/tutorial/venv.html): +We *highly* encourage the use of a [virtual environment](https://docs.python.org/3/tutorial/venv.html) +or a [conda](https://docs.conda.io/en/latest/) environment: ```shell +# virtual environment ~/test$ python3 -m venv SimPhoNy ~/test$ source SimPhoNy/bin/activate (SimPhoNy) ~/test$ ``` +```shell +# conda +~/test$ conda create -n +~/test$ conda activate +``` + + ## OSP-core installation First, the repository must be cloned: From 8f9552bab22ee6e02d00be22aa1b51ea2fbaef55 Mon Sep 17 00:00:00 2001 From: dea Date: Wed, 2 Dec 2020 11:06:04 +0100 Subject: [PATCH 46/57] removed references to pickle --- docs/source/detailed_design.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/source/detailed_design.md b/docs/source/detailed_design.md index 9c66e5b..12771f0 100644 --- a/docs/source/detailed_design.md +++ b/docs/source/detailed_design.md @@ -112,19 +112,19 @@ For a more general overview, go to [getting started](./getting_started.md#genera The semantic layer is the representation of the classes of the ontology in a programming language. When the user installs an ontology through `pico`, -all ontology classes are saved in a pickle file in the site-packages of the python environment. +all ontology concepts are saved in a graph in `~/.osp_ontologies`. The procedure is as follows: - The `OntologyInstallationManager` receives a list of yml files with ontologies to install. - It instantiates a `Parser`. - The parser goes through the ontologies and creates an `OntologyClass` per entity. - All the oclasses of the same namespace are grouped in an `OntologyNamespace`. -- All the registries are collected in the `NamespaceRegistry`. This object will be pickled. +- All the registries are collected in the `NamespaceRegistry`. -Installing new ontologies loads the pickle and adds new namespaces or modifies the existing ones. +Installing new ontologies loads the graph and adds new namespaces or modifies the existing ones. When a class is instantiated, an individual is created. -The pickled file is read, and an instance of the [Cuds](#cuds) class with the ontology information is created. +The graph is read, and an instance of the [Cuds](#cuds) class with the ontology information is created. Through the Cuds they realise the [Cuds API](#cuds-api) which enables the user to work with them in a generic, simple way. From 2a25e185d81a6692c7dc415fe44986b11b401d07 Mon Sep 17 00:00:00 2001 From: dea Date: Wed, 2 Dec 2020 11:08:27 +0100 Subject: [PATCH 47/57] Fixed typo in tutorial --- docs/source/jupyter/sessions_and_vars.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/jupyter/sessions_and_vars.ipynb b/docs/source/jupyter/sessions_and_vars.ipynb index e25193d..7d03093 100644 --- a/docs/source/jupyter/sessions_and_vars.ipynb +++ b/docs/source/jupyter/sessions_and_vars.ipynb @@ -10,7 +10,7 @@ "## Background\n", "Some use cases of OSP-core, like coupling and linking, require interaction between multiple sessions. Even using just one wrapper usually means working with the default CoreSession initially, and then the wrapper session.\n", "\n", - "When an object from one session is added to a different one, a deepcopy of the object is carried out. This means that both objects are technically the same at that point (same uid, oclas, relationships...), but reside in different memory areas and can theoretically differ in the future. The purpose of this behaviour is to allow selective synching and enable different sessions to have different states of an instance.\n", + "When an object from one session is added to a different one, a deepcopy of the object is carried out. This means that both objects are technically the same at that point (same uid, oclass, relationships...), but reside in different memory areas and can theoretically differ in the future. The purpose of this behaviour is to allow selective synching and enable different sessions to have different states of an instance.\n", "\n", "Variables that point to an object in the origin session will keep pointing to it (and not to the added session) unless explicitedly updated.\n", "\n", From 1576ae736ad767d49938a298536e137f1e950e88 Mon Sep 17 00:00:00 2001 From: dea Date: Wed, 2 Dec 2020 11:10:46 +0100 Subject: [PATCH 48/57] Added note on tutorial download --- docs/source/about.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/source/about.md b/docs/source/about.md index 109a348..8803900 100644 --- a/docs/source/about.md +++ b/docs/source/about.md @@ -9,6 +9,9 @@ One of SimPhoNy’s main tasks is to convert *opaque* data, meaning data whose s This project aims to clarify the purpose and usage of the SimPhoNy platform through simple, short examples. In particular, this guide will try to expose the main concepts and components. +All the tutorials in this documentation are Jupyter notebooks that can be downloaded +by clicking on the "Edit on Github" button on the top right of the page. + _Contact:_ [Pablo de Andres](mailto:pablo.de.andres@iwm.fraunhofer.de), [Matthias Urban](mailto:matthias.urban@iwm.fraunhofer.de) and [Yoav Nahshon](mailto:yoav.nahshon@iwm.fraunhofer.de) from From 0d58753c040f61425df37a3be8cd1b3f9210870f Mon Sep 17 00:00:00 2001 From: dea Date: Wed, 2 Dec 2020 13:56:59 +0100 Subject: [PATCH 49/57] updated cuba.class references --- docs/source/getting_started.md | 79 +++++++++++++------ docs/source/jupyter/multiple-wrappers.ipynb | 47 ++++++++--- docs/source/jupyter/wrapper_development.ipynb | 2 +- docs/source/wrapper_development.md | 2 +- docs/source/yaml.md | 2 +- 5 files changed, 94 insertions(+), 38 deletions(-) diff --git a/docs/source/getting_started.md b/docs/source/getting_started.md index 81cdfc3..4f0d769 100644 --- a/docs/source/getting_started.md +++ b/docs/source/getting_started.md @@ -109,42 +109,77 @@ or [one of the supported owl ontologies](owl.md).
YAML Ontology sample + The following is an excerpt from the `city.ontology.yml` in osp-core. ```yaml - version: "0.0.1" - namespace: "cuba" + --- + version: "0.0.3" + + namespace: "city" ontology: - Class: - description: The root of the ontology. - subclass_of: [] - Nothing: - description: A class without any individuals. + encloses: subclass_of: - - cuba.Class - - ################ + - cuba.activeRelationship + inverse: city.isEnclosedBy - relationship: - description: The root of all relationships. - subclass_of: [] + isEnclosedBy: + subclass_of: + - cuba.passiveRelationship + inverse: city.encloses - activeRelationship: - description: The root of all active relationships. Active relationships express that one cuds object is in the container of another. + hasInhabitant: subclass_of: - - cuba.relationship + - city.encloses ################ - Wrapper: - description: The root of all wrappers. These are the bridge to simulation engines and databases. + CityWrapper: subclass_of: - - cuba.Class + - cuba.Wrapper + - city.hasPart: + range: city.City + cardinality: 1+ + exclusive: false + + ################ - attribute: - description: The root of all attributes. - subclass_of: [] + City: + subclass_of: + - city.PopulatedPlace + - city.hasPart: + range: city.Neighborhood + cardinality: many + exclusive: true + - city.isPartOf: + range: city.CityWrapper + cardinality: 0-1 + exclusive: true + - city.hasMajor: + range: city.Citizen + cardinality: 0-1 + exclusive: true + + Building: + subclass_of: + - city.ArchitecturalStructure + - city.hasPart: + range: city.Address + cardinality: 1 + exclusive: false + - city.hasPart: + range: city.Floor + cardinality: many + exclusive: false + - city.isPartOf: + range: city.Street + cardinality: 1 + exclusive: true + + Citizen: + subclass_of: + - city.Person ```
diff --git a/docs/source/jupyter/multiple-wrappers.ipynb b/docs/source/jupyter/multiple-wrappers.ipynb index 89ba5c2..881309a 100644 --- a/docs/source/jupyter/multiple-wrappers.ipynb +++ b/docs/source/jupyter/multiple-wrappers.ipynb @@ -37,7 +37,13 @@ { "output_type": "stream", "name": "stdout", - "text": "INFO 2020-08-06 08:03:52,130 [osp.core.ontology.installation]: Skipping package city with identifier city, because it is already installed.\nINFO 2020-08-06 08:03:52,131 [osp.core.ontology.installation]: Will install the following namespaces: []\nINFO 2020-08-06 08:03:52,145 [osp.core.ontology.installation]: Installation successful\n" + "text": [ + "INFO 2020-12-02 11:54:26,244 [osp.core.ontology.installation]: Will install the following namespaces: ['city']\n", + "INFO 2020-12-02 11:54:26,280 [osp.core.ontology.yml.yml_parser]: Parsing YAML ontology file /mnt/c/Users/dea/Documents/Projects/simphony/osp-core/osp/core/ontology/docs/city.ontology.yml\n", + "INFO 2020-12-02 11:54:26,331 [osp.core.ontology.yml.yml_parser]: You can now use `from osp.core.namespaces import city`.\n", + "INFO 2020-12-02 11:54:26,333 [osp.core.ontology.parser]: Loaded 403 ontology triples in total\n", + "INFO 2020-12-02 11:54:26,374 [osp.core.ontology.installation]: Installation successful\n" + ] } ], "source": [ @@ -99,8 +105,7 @@ "metadata": {}, "outputs": [], "source": [ - "from osp.wrappers.sqlalchemy_wrapper_session import \\\n", - " SqlAlchemyWrapperSession" + "from osp.wrappers.sqlalchemy import SqlAlchemySession" ] }, { @@ -140,7 +145,9 @@ { "output_type": "stream", "name": "stdout", - "text": "Input data to connect to Postgres table!\n" + "text": [ + "Input data to connect to Postgres table!\n" + ] } ], "source": [ @@ -168,7 +175,9 @@ { "output_type": "execute_result", "data": { - "text/plain": "" + "text/plain": [ + "" + ] }, "metadata": {}, "execution_count": 8 @@ -227,7 +236,9 @@ { "output_type": "stream", "name": "stdout", - "text": "EMMO town is my city!\n" + "text": [ + "EMMO town is my city!\n" + ] } ], "source": [ @@ -248,11 +259,11 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 12, "metadata": {}, "outputs": [], "source": [ - "with SqlAlchemyWrapperSession(postgres_url) as session:\n", + "with SqlAlchemySession(postgres_url) as session:\n", " wrapper = city.CityWrapper(session=session)\n", " wrapper.add(emmo_town)\n", " session.commit()" @@ -281,11 +292,11 @@ { "output_type": "stream", "name": "stdout", - "text": "The database contains the following information about the city:\n- Cuds object named :\n uuid: 96a2f49c-8009-456a-ad69-1cb1dea7f128\n type: city.City\n superclasses: city.City, city.GeographicalPlace, city.PopulatedPlace, cuba.Class\n values: coordinates: [0 0]\n description: \n To Be Determined\n\n |_Relationship city.hasInhabitant:\n | - city.Citizen cuds object named :\n | . uuid: 08e05374-0187-4114-a114-085431aeebde\n | . age: 25\n | - city.Citizen cuds object named :\n | . uuid: a084c4ba-c054-4afd-b194-b4e983743706\n | . age: 25\n | - city.Citizen cuds object named :\n | . uuid: 209926bc-6bcd-466c-a86a-807780e4789c\n | . age: 25\n | - city.Citizen cuds object named :\n | . uuid: 0a0a8488-7400-4f4e-9e44-dbf56782cd3c\n | . age: 25\n | - city.Citizen cuds object named :\n | . uuid: cdfe72ec-fc15-4a14-a516-88b576bf0a27\n | . age: 25\n | - city.Citizen cuds object named :\n | uuid: 4ec1b1af-341f-4aa5-845d-fb3f9c502c9c\n | age: 25\n |_Relationship city.hasPart:\n - city.Neighborhood cuds object named :\n . uuid: e1632cf5-24e3-4afb-b72b-757ef62d5bef\n . coordinates: [0 0]\n . |_Relationship city.hasPart:\n . - city.Street cuds object named :\n . . uuid: 19a6a5a4-c22c-4be7-98c4-c69b3ee613d2\n . . coordinates: [0 0]\n . - city.Street cuds object named :\n . uuid: 681f7441-e711-4375-ab70-074234206faa\n . coordinates: [0 0]\n - city.Neighborhood cuds object named :\n uuid: 574e4a68-92c8-4b0e-b41f-e0341b42b00b\n coordinates: [0 0]\nThe city has a new inhabitant:\n- Cuds object named :\n uuid: 7a263d53-9c4d-47ac-bb31-fa54d7920bcd\n type: city.Citizen\n superclasses: city.Citizen, city.LivingBeing, city.Person, cuba.Class\n values: age: 32\n description: \n To Be Determined\n\n" + "text": "The database contains the following information about the city:\n- Cuds object named :\n uuid: 96a2f49c-8009-456a-ad69-1cb1dea7f128\n type: city.City\n superclasses: city.City, city.GeographicalPlace, city.PopulatedPlace, cuba.Entity\n values: coordinates: [0 0]\n description: \n To Be Determined\n\n |_Relationship city.hasInhabitant:\n | - city.Citizen cuds object named :\n | . uuid: 08e05374-0187-4114-a114-085431aeebde\n | . age: 25\n | - city.Citizen cuds object named :\n | . uuid: a084c4ba-c054-4afd-b194-b4e983743706\n | . age: 25\n | - city.Citizen cuds object named :\n | . uuid: 209926bc-6bcd-466c-a86a-807780e4789c\n | . age: 25\n | - city.Citizen cuds object named :\n | . uuid: 0a0a8488-7400-4f4e-9e44-dbf56782cd3c\n | . age: 25\n | - city.Citizen cuds object named :\n | . uuid: cdfe72ec-fc15-4a14-a516-88b576bf0a27\n | . age: 25\n | - city.Citizen cuds object named :\n | uuid: 4ec1b1af-341f-4aa5-845d-fb3f9c502c9c\n | age: 25\n |_Relationship city.hasPart:\n - city.Neighborhood cuds object named :\n . uuid: e1632cf5-24e3-4afb-b72b-757ef62d5bef\n . coordinates: [0 0]\n . |_Relationship city.hasPart:\n . - city.Street cuds object named :\n . . uuid: 19a6a5a4-c22c-4be7-98c4-c69b3ee613d2\n . . coordinates: [0 0]\n . - city.Street cuds object named :\n . uuid: 681f7441-e711-4375-ab70-074234206faa\n . coordinates: [0 0]\n - city.Neighborhood cuds object named :\n uuid: 574e4a68-92c8-4b0e-b41f-e0341b42b00b\n coordinates: [0 0]\nThe city has a new inhabitant:\n- Cuds object named :\n uuid: 7a263d53-9c4d-47ac-bb31-fa54d7920bcd\n type: city.Citizen\n superclasses: city.Citizen, city.LivingBeing, city.Person, cuba.Entity\n values: age: 32\n description: \n To Be Determined\n\n" } ], "source": [ - "with SqlAlchemyWrapperSession(postgres_url) as db_session:\n", + "with SqlAlchemySession(postgres_url) as db_session:\n", " db_wrapper = city.CityWrapper(session=db_session)\n", " db_emmo_town = db_wrapper.get(emmo_town.uid)\n", " print(\"The database contains the following information about the city:\")\n", @@ -323,11 +334,11 @@ { "output_type": "stream", "name": "stdout", - "text": "The database contains the following information about the city:\n- Cuds object named :\n uuid: 96a2f49c-8009-456a-ad69-1cb1dea7f128\n type: city.City\n superclasses: city.City, city.GeographicalPlace, city.PopulatedPlace, cuba.Class\n values: coordinates: [0 0]\n description: \n To Be Determined\n\n |_Relationship city.hasInhabitant:\n | - city.Citizen cuds object named :\n | . uuid: 08e05374-0187-4114-a114-085431aeebde\n | . age: 25\n | - city.Citizen cuds object named :\n | . uuid: a084c4ba-c054-4afd-b194-b4e983743706\n | . age: 25\n | - city.Citizen cuds object named :\n | . uuid: 209926bc-6bcd-466c-a86a-807780e4789c\n | . age: 25\n | - city.Citizen cuds object named :\n | . uuid: 0a0a8488-7400-4f4e-9e44-dbf56782cd3c\n | . age: 25\n | - city.Citizen cuds object named :\n | . uuid: cdfe72ec-fc15-4a14-a516-88b576bf0a27\n | . age: 25\n | - city.Citizen cuds object named :\n | . uuid: 4ec1b1af-341f-4aa5-845d-fb3f9c502c9c\n | . age: 25\n | - city.Citizen cuds object named :\n | uuid: 7a263d53-9c4d-47ac-bb31-fa54d7920bcd\n | age: 32\n |_Relationship city.hasPart:\n - city.Neighborhood cuds object named :\n . uuid: e1632cf5-24e3-4afb-b72b-757ef62d5bef\n . coordinates: [0 0]\n . |_Relationship city.hasPart:\n . - city.Street cuds object named :\n . . uuid: 19a6a5a4-c22c-4be7-98c4-c69b3ee613d2\n . . coordinates: [0 0]\n . - city.Street cuds object named :\n . uuid: 681f7441-e711-4375-ab70-074234206faa\n . coordinates: [0 0]\n - city.Neighborhood cuds object named :\n uuid: 574e4a68-92c8-4b0e-b41f-e0341b42b00b\n coordinates: [0 0]\n" + "text": "The database contains the following information about the city:\n- Cuds object named :\n uuid: 96a2f49c-8009-456a-ad69-1cb1dea7f128\n type: city.City\n superclasses: city.City, city.GeographicalPlace, city.PopulatedPlace, cuba.Entity\n values: coordinates: [0 0]\n description: \n To Be Determined\n\n |_Relationship city.hasInhabitant:\n | - city.Citizen cuds object named :\n | . uuid: 08e05374-0187-4114-a114-085431aeebde\n | . age: 25\n | - city.Citizen cuds object named :\n | . uuid: a084c4ba-c054-4afd-b194-b4e983743706\n | . age: 25\n | - city.Citizen cuds object named :\n | . uuid: 209926bc-6bcd-466c-a86a-807780e4789c\n | . age: 25\n | - city.Citizen cuds object named :\n | . uuid: 0a0a8488-7400-4f4e-9e44-dbf56782cd3c\n | . age: 25\n | - city.Citizen cuds object named :\n | . uuid: cdfe72ec-fc15-4a14-a516-88b576bf0a27\n | . age: 25\n | - city.Citizen cuds object named :\n | . uuid: 4ec1b1af-341f-4aa5-845d-fb3f9c502c9c\n | . age: 25\n | - city.Citizen cuds object named :\n | uuid: 7a263d53-9c4d-47ac-bb31-fa54d7920bcd\n | age: 32\n |_Relationship city.hasPart:\n - city.Neighborhood cuds object named :\n . uuid: e1632cf5-24e3-4afb-b72b-757ef62d5bef\n . coordinates: [0 0]\n . |_Relationship city.hasPart:\n . - city.Street cuds object named :\n . . uuid: 19a6a5a4-c22c-4be7-98c4-c69b3ee613d2\n . . coordinates: [0 0]\n . - city.Street cuds object named :\n . uuid: 681f7441-e711-4375-ab70-074234206faa\n . coordinates: [0 0]\n - city.Neighborhood cuds object named :\n uuid: 574e4a68-92c8-4b0e-b41f-e0341b42b00b\n coordinates: [0 0]\n" } ], "source": [ - "with SqlAlchemyWrapperSession(postgres_url) as db_session:\n", + "with SqlAlchemySession(postgres_url) as db_session:\n", " db_wrapper = city.CityWrapper(session=db_session)\n", " db_emmo_town = db_wrapper.get(emmo_town.uid)\n", " print(\"The database contains the following information about the city:\")\n", @@ -342,7 +353,17 @@ "source": [] } ], - "metadata": {}, + "metadata": { + "kernelspec": { + "name": "python3", + "display_name": "Python 3.7.5 64-bit", + "metadata": { + "interpreter": { + "hash": "6b8ae71b8e061ba9b211c188436d81117d4fa8435b658f808f738c6c9c6d5c29" + } + } + } + }, "nbformat": 4, "nbformat_minor": 2 } \ No newline at end of file diff --git a/docs/source/jupyter/wrapper_development.ipynb b/docs/source/jupyter/wrapper_development.ipynb index 39ca0c3..53460c3 100644 --- a/docs/source/jupyter/wrapper_development.ipynb +++ b/docs/source/jupyter/wrapper_development.ipynb @@ -355,7 +355,7 @@ { "output_type": "stream", "name": "stdout", - "text": "Engine instantiated!\nAdd atom 0 with position [0. 0. 0.] and velocity [0.63000616 0.38951439 0.12717548]\nAdd atom 1 with position [1. 1. 1.] and velocity [0.80816851 0.04562681 0.44983098]\nAdd atom 2 with position [2. 2. 2.] and velocity [0.3849223 0.50767213 0.82963311]\nNow the engine is running\n- Cuds object:\n uuid: a0a97dbe-584d-4764-b085-7b597e323d20\n type: simple_ontology.Material\n superclasses: cuba.Class, simple_ontology.Material\n description: \n To Be Determined\n\n |_Relationship simple_ontology.hasPart:\n - simple_ontology.Atom cuds object:\n . uuid: 221a1793-c54a-4e42-bdeb-08921617fbac\n . |_Relationship simple_ontology.hasPart:\n . - simple_ontology.Position cuds object:\n . . uuid: db17082e-d9d3-4a48-bce1-9402d4315200\n . . unit: m\n . . value: [0.63000616 0.38951439 0.12717548]\n . - simple_ontology.Velocity cuds object:\n . uuid: fc7d778d-b18a-4b60-a6ab-ba855a2c2874\n . value: [0.63000616 0.38951439 0.12717548]\n . unit: m/s\n - simple_ontology.Atom cuds object:\n . uuid: 222df5d0-c0fe-435b-b5e2-0d5f7ebd32a9\n . |_Relationship simple_ontology.hasPart:\n . - simple_ontology.Position cuds object:\n . . uuid: f0eb08c4-88a3-40de-893f-89473cd194e8\n . . value: [1.80816851 1.04562681 1.44983098]\n . . unit: m\n . - simple_ontology.Velocity cuds object:\n . uuid: d3e7b5ce-3409-4a4e-bbdb-13a2addaee1c\n . value: [0.80816851 0.04562681 0.44983098]\n . unit: m/s\n - simple_ontology.Atom cuds object:\n uuid: 13bfe4ee-32e8-4fbe-bad5-f98f46aa297a\n |_Relationship simple_ontology.hasPart:\n - simple_ontology.Position cuds object:\n . uuid: da5c35f0-afe5-4b56-b5fa-631b72ee32ad\n . value: [2.3849223 2.50767213 2.82963311]\n . unit: m\n - simple_ontology.Velocity cuds object:\n uuid: 9b6c2c1c-3e63-4144-b7c9-d6223c0b79f7\n value: [0.3849223 0.50767213 0.82963311]\n unit: m/s\nUpdate atom 0. Setting velocity to [0. 0. 0.]\nUpdate atom 1. Setting velocity to [0. 0. 0.]\nUpdate atom 2. Setting velocity to [0. 0. 0.]\nNow the engine is running\n- Cuds object:\n uuid: a0a97dbe-584d-4764-b085-7b597e323d20\n type: simple_ontology.Material\n superclasses: cuba.Class, simple_ontology.Material\n description: \n To Be Determined\n\n |_Relationship simple_ontology.hasPart:\n - simple_ontology.Atom cuds object:\n . uuid: 221a1793-c54a-4e42-bdeb-08921617fbac\n . |_Relationship simple_ontology.hasPart:\n . - simple_ontology.Position cuds object:\n . . uuid: db17082e-d9d3-4a48-bce1-9402d4315200\n . . unit: m\n . . value: [0.63000616 0.38951439 0.12717548]\n . - simple_ontology.Velocity cuds object:\n . uuid: fc7d778d-b18a-4b60-a6ab-ba855a2c2874\n . value: [0. 0. 0.]\n . unit: m/s\n - simple_ontology.Atom cuds object:\n . uuid: 222df5d0-c0fe-435b-b5e2-0d5f7ebd32a9\n . |_Relationship simple_ontology.hasPart:\n . - simple_ontology.Position cuds object:\n . . uuid: f0eb08c4-88a3-40de-893f-89473cd194e8\n . . value: [1.80816851 1.04562681 1.44983098]\n . . unit: m\n . - simple_ontology.Velocity cuds object:\n . uuid: d3e7b5ce-3409-4a4e-bbdb-13a2addaee1c\n . unit: m/s\n . value: [0. 0. 0.]\n - simple_ontology.Atom cuds object:\n uuid: 13bfe4ee-32e8-4fbe-bad5-f98f46aa297a\n |_Relationship simple_ontology.hasPart:\n - simple_ontology.Position cuds object:\n . uuid: da5c35f0-afe5-4b56-b5fa-631b72ee32ad\n . value: [2.3849223 2.50767213 2.82963311]\n . unit: m\n - simple_ontology.Velocity cuds object:\n uuid: 9b6c2c1c-3e63-4144-b7c9-d6223c0b79f7\n value: [0. 0. 0.]\n unit: m/s\n" + "text": "Engine instantiated!\nAdd atom 0 with position [0. 0. 0.] and velocity [0.63000616 0.38951439 0.12717548]\nAdd atom 1 with position [1. 1. 1.] and velocity [0.80816851 0.04562681 0.44983098]\nAdd atom 2 with position [2. 2. 2.] and velocity [0.3849223 0.50767213 0.82963311]\nNow the engine is running\n- Cuds object:\n uuid: a0a97dbe-584d-4764-b085-7b597e323d20\n type: simple_ontology.Material\n superclasses: cuba.Entity, simple_ontology.Material\n description: \n To Be Determined\n\n |_Relationship simple_ontology.hasPart:\n - simple_ontology.Atom cuds object:\n . uuid: 221a1793-c54a-4e42-bdeb-08921617fbac\n . |_Relationship simple_ontology.hasPart:\n . - simple_ontology.Position cuds object:\n . . uuid: db17082e-d9d3-4a48-bce1-9402d4315200\n . . unit: m\n . . value: [0.63000616 0.38951439 0.12717548]\n . - simple_ontology.Velocity cuds object:\n . uuid: fc7d778d-b18a-4b60-a6ab-ba855a2c2874\n . value: [0.63000616 0.38951439 0.12717548]\n . unit: m/s\n - simple_ontology.Atom cuds object:\n . uuid: 222df5d0-c0fe-435b-b5e2-0d5f7ebd32a9\n . |_Relationship simple_ontology.hasPart:\n . - simple_ontology.Position cuds object:\n . . uuid: f0eb08c4-88a3-40de-893f-89473cd194e8\n . . value: [1.80816851 1.04562681 1.44983098]\n . . unit: m\n . - simple_ontology.Velocity cuds object:\n . uuid: d3e7b5ce-3409-4a4e-bbdb-13a2addaee1c\n . value: [0.80816851 0.04562681 0.44983098]\n . unit: m/s\n - simple_ontology.Atom cuds object:\n uuid: 13bfe4ee-32e8-4fbe-bad5-f98f46aa297a\n |_Relationship simple_ontology.hasPart:\n - simple_ontology.Position cuds object:\n . uuid: da5c35f0-afe5-4b56-b5fa-631b72ee32ad\n . value: [2.3849223 2.50767213 2.82963311]\n . unit: m\n - simple_ontology.Velocity cuds object:\n uuid: 9b6c2c1c-3e63-4144-b7c9-d6223c0b79f7\n value: [0.3849223 0.50767213 0.82963311]\n unit: m/s\nUpdate atom 0. Setting velocity to [0. 0. 0.]\nUpdate atom 1. Setting velocity to [0. 0. 0.]\nUpdate atom 2. Setting velocity to [0. 0. 0.]\nNow the engine is running\n- Cuds object:\n uuid: a0a97dbe-584d-4764-b085-7b597e323d20\n type: simple_ontology.Material\n superclasses: cuba.Entity, simple_ontology.Material\n description: \n To Be Determined\n\n |_Relationship simple_ontology.hasPart:\n - simple_ontology.Atom cuds object:\n . uuid: 221a1793-c54a-4e42-bdeb-08921617fbac\n . |_Relationship simple_ontology.hasPart:\n . - simple_ontology.Position cuds object:\n . . uuid: db17082e-d9d3-4a48-bce1-9402d4315200\n . . unit: m\n . . value: [0.63000616 0.38951439 0.12717548]\n . - simple_ontology.Velocity cuds object:\n . uuid: fc7d778d-b18a-4b60-a6ab-ba855a2c2874\n . value: [0. 0. 0.]\n . unit: m/s\n - simple_ontology.Atom cuds object:\n . uuid: 222df5d0-c0fe-435b-b5e2-0d5f7ebd32a9\n . |_Relationship simple_ontology.hasPart:\n . - simple_ontology.Position cuds object:\n . . uuid: f0eb08c4-88a3-40de-893f-89473cd194e8\n . . value: [1.80816851 1.04562681 1.44983098]\n . . unit: m\n . - simple_ontology.Velocity cuds object:\n . uuid: d3e7b5ce-3409-4a4e-bbdb-13a2addaee1c\n . unit: m/s\n . value: [0. 0. 0.]\n - simple_ontology.Atom cuds object:\n uuid: 13bfe4ee-32e8-4fbe-bad5-f98f46aa297a\n |_Relationship simple_ontology.hasPart:\n - simple_ontology.Position cuds object:\n . uuid: da5c35f0-afe5-4b56-b5fa-631b72ee32ad\n . value: [2.3849223 2.50767213 2.82963311]\n . unit: m\n - simple_ontology.Velocity cuds object:\n uuid: 9b6c2c1c-3e63-4144-b7c9-d6223c0b79f7\n value: [0. 0. 0.]\n unit: m/s\n" } ], "source": [ diff --git a/docs/source/wrapper_development.md b/docs/source/wrapper_development.md index 68cbf42..37586b3 100644 --- a/docs/source/wrapper_development.md +++ b/docs/source/wrapper_development.md @@ -56,7 +56,7 @@ These are the requirements for a minimal wrapper ontology: SomeEntity: subclass_of: - - cuba.Class + - cuba.Entity ```
diff --git a/docs/source/yaml.md b/docs/source/yaml.md index 92b79d9..4c4c45c 100644 --- a/docs/source/yaml.md +++ b/docs/source/yaml.md @@ -97,7 +97,7 @@ For attributes, these keys are described in The CUBA namespace contains a set of Common Universal Basic entities, that have special meaning in OSP-core. The CUBA namespace is always installed in OSP-core. -`cuba.Class` +`cuba.Entity` > The root for all ontology classes. Does not have a superclass. `cuba.Nothing` From 85dfe6601d09dbf2e574ab0d59d5cbcdbb9af5e8 Mon Sep 17 00:00:00 2001 From: dea Date: Wed, 2 Dec 2020 13:57:10 +0100 Subject: [PATCH 50/57] updated namespace import --- docs/source/jupyter/ontology-interface.ipynb | 74 ++++++++++++++------ 1 file changed, 53 insertions(+), 21 deletions(-) diff --git a/docs/source/jupyter/ontology-interface.ipynb b/docs/source/jupyter/ontology-interface.ipynb index 919ce3e..e3845ed 100644 --- a/docs/source/jupyter/ontology-interface.ipynb +++ b/docs/source/jupyter/ontology-interface.ipynb @@ -32,7 +32,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 1, "metadata": { "tags": [] }, @@ -40,7 +40,13 @@ { "output_type": "stream", "name": "stdout", - "text": "INFO 2020-08-06 08:16:21,653 [osp.core.ontology.installation]: Skipping package city with identifier city, because it is already installed.\nINFO 2020-08-06 08:16:21,654 [osp.core.ontology.installation]: Will install the following namespaces: []\nINFO 2020-08-06 08:16:21,669 [osp.core.ontology.installation]: Installation successful\n" + "text": [ + "INFO 2020-12-02 13:53:47,242 [osp.core.ontology.installation]: Will install the following namespaces: ['city']\n", + "INFO 2020-12-02 13:53:47,288 [osp.core.ontology.yml.yml_parser]: Parsing YAML ontology file /mnt/c/Users/dea/Documents/Projects/simphony/osp-core/osp/core/ontology/docs/city.ontology.yml\n", + "INFO 2020-12-02 13:53:47,357 [osp.core.ontology.yml.yml_parser]: You can now use `from osp.core.namespaces import city`.\n", + "INFO 2020-12-02 13:53:47,358 [osp.core.ontology.parser]: Loaded 403 ontology triples in total\n", + "INFO 2020-12-02 13:53:47,397 [osp.core.ontology.installation]: Installation successful\n" + ] } ], "source": [ @@ -71,7 +77,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 2, "metadata": { "tags": [] }, @@ -79,7 +85,9 @@ { "output_type": "stream", "name": "stdout", - "text": "Packages:\n\t- city\n\t- qe\nNamespaces:\n\t- xml\n\t- rdf\n\t- rdfs\n\t- xsd\n\t- cuba\n\t- owl\n\t- qe\n\t- city\n" + "text": [ + "Packages:\n\t- simlammps_ontology\n\t- city\nNamespaces:\n\t- xml\n\t- rdf\n\t- rdfs\n\t- xsd\n\t- cuba\n\t- ns1\n\t- owl\n\t- simlammps_ontology\n\t- city\n" + ] } ], "source": [ @@ -95,19 +103,21 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 3, "metadata": { "tags": [] }, "outputs": [ { "output_type": "stream", - "name": "stderr", - "text": "WARNING 2020-08-06 08:16:25,775 [osp.core]: osp.core.city is deprecated. Use osp.core.namespaces.city instead.\nWARNING 2020-08-06 08:16:25,778 [osp.core]: osp.core.city is deprecated. Use osp.core.namespaces.city instead.\n\nYou can use the namespace to access its entities\ncity.LivingBeing\n\nYou can also use index notation. For owl ontologies, this queries the entities by rdf.label.It returns a list of all entities with the same label\nTrue\n\nYou can access the namespace of an entity\nTrue\n" + "name": "stdout", + "text": [ + "\nYou can use the namespace to access its entities\ncity.LivingBeing\n\nYou can also use index notation. For owl ontologies, this queries the entities by rdf.label.It returns a list of all entities with the same label\nTrue\n\nYou can access the namespace of an entity\nFalse\n" + ] } ], "source": [ - "from osp.core import city\n", + "from osp.core.namespaces import city\n", "\n", "print(\"\\nYou can use the namespace to access its entities\")\n", "print(city.LivingBeing)\n", @@ -132,7 +142,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 4, "metadata": { "tags": [] }, @@ -140,7 +150,9 @@ { "output_type": "stream", "name": "stdout", - "text": "\nYou can access the superclasses and the subclasses\n{, }\n{, , }\n\nYou can access the direct superclasses and subclasses\n{}\n{}\n\nYou can access a description of the entities\nA being that lives\n\nYou can test if one entity is a subclass / superclass of another\nTrue\nTrue\n" + "text": [ + "\nYou can access the superclasses and the subclasses\n{, }\n{, , }\n\nYou can access the direct superclasses and subclasses\n{}\n{}\n\nYou can access a description of the entities\nA being that lives\n\nYou can test if one entity is a subclass / superclass of another\nTrue\nTrue\n" + ] } ], "source": [ @@ -171,7 +183,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 5, "metadata": { "tags": [] }, @@ -179,7 +191,9 @@ { "output_type": "stream", "name": "stdout", - "text": "\nYou can get an entity with a string\ncity.LivingBeing\nTrue\n" + "text": [ + "\nYou can get an entity with a string\ncity.LivingBeing\nTrue\n" + ] } ], "source": [ @@ -201,7 +215,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 6, "metadata": { "tags": [] }, @@ -209,7 +223,9 @@ { "output_type": "stream", "name": "stdout", - "text": "\nYou can test if an entity is a class\nTrue\nTrue\n\nYou can test if an entity is a relationship\nTrue\nTrue\n\nYou can test if an entity is a attribute\nTrue\nTrue\n" + "text": [ + "\nYou can test if an entity is a class\nTrue\nTrue\n\nYou can test if an entity is a relationship\nTrue\nTrue\n\nYou can test if an entity is a attribute\nTrue\nTrue\n" + ] } ], "source": [ @@ -249,7 +265,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 7, "metadata": { "tags": [] }, @@ -257,7 +273,9 @@ { "output_type": "stream", "name": "stdout", - "text": "\nYou can get the attributes of an ontology class and their defaults\n{: rdflib.term.Literal('25', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#integer')), : rdflib.term.Literal('John Smith')}\n\nYou can get the non-inherited attributes and their defaults\n{}\n{: rdflib.term.Literal('25', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#integer')), : rdflib.term.Literal('John Smith')}\n" + "text": [ + "\nYou can get the attributes of an ontology class and their defaults\n{: (rdflib.term.Literal('John Smith'), False, None), : (rdflib.term.Literal('25', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#integer')), False, None)}\n\nYou can get the non-inherited attributes and their defaults\n{}\n{: (rdflib.term.Literal('John Smith'), False, None), : (rdflib.term.Literal('25', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#integer')), False, None)}\n" + ] } ], "source": [ @@ -280,7 +298,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 8, "metadata": { "tags": [] }, @@ -288,7 +306,9 @@ { "output_type": "stream", "name": "stdout", - "text": "\nYou can get the inverse of a relationship\ncity.INVERSE_OF_hasInhabitant\n" + "text": [ + "\nYou can get the inverse of a relationship\ncity.INVERSE_OF_hasInhabitant\n" + ] } ], "source": [ @@ -307,7 +327,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 9, "metadata": { "tags": [] }, @@ -315,7 +335,9 @@ { "output_type": "stream", "name": "stdout", - "text": "\nYou can get the argument name of an attribute. The argument name is used when instantiating CUDS objects\nage\n\nYou can get the datatype of attributes\nhttp://www.w3.org/2001/XMLSchema#integer\n\nYou can use the attribute to convert values to the datatype of the attribute\n10\n" + "text": [ + "\nYou can get the argument name of an attribute. The argument name is used when instantiating CUDS objects\nage\n\nYou can get the datatype of attributes\nhttp://www.w3.org/2001/XMLSchema#integer\n\nYou can use the attribute to convert values to the datatype of the attribute\n10\n" + ] } ], "source": [ @@ -374,7 +396,17 @@ "source": [] } ], - "metadata": {}, + "metadata": { + "kernelspec": { + "name": "python3", + "display_name": "Python 3.7.5 64-bit", + "metadata": { + "interpreter": { + "hash": "6b8ae71b8e061ba9b211c188436d81117d4fa8435b658f808f738c6c9c6d5c29" + } + } + } + }, "nbformat": 4, "nbformat_minor": 2 } \ No newline at end of file From 69a1213dce15663a36f5d728ede454de6b06c54b Mon Sep 17 00:00:00 2001 From: dea Date: Wed, 2 Dec 2020 14:53:00 +0100 Subject: [PATCH 51/57] updated CI --- .github/workflows/ci.yml | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e39a2fc..7ad7a60 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -14,16 +14,12 @@ jobs: with: python-version: 3.7 - name: Install OS dependencies - run: > - sudo apt-get install pandoc - latexmk - texlive-fonts-recommended - texlive-latex-recommended - texlive-latex-extra + run: | + sudo apt-get update + sudo apt-get install pandoc latexmk + sudo apt-get install texlive-fonts-recommended texlive-latex-recommended texlive-latex-extra - name: Install python dependencies run: | - sudo apt-get install pandoc latexmk texlive-fonts-recommended - sudo apt-get install texlive-latex-recommended texlive-latex-extra python -m pip install --upgrade pip pip install wheel pip install -r requirements.txt From 3a7f39991086e53b047de2c0092c688acf700ee3 Mon Sep 17 00:00:00 2001 From: dea Date: Wed, 2 Dec 2020 14:53:16 +0100 Subject: [PATCH 52/57] updated graph --- docs/source/detailed_design.md | 198 ++++++++++++++++++--------------- 1 file changed, 108 insertions(+), 90 deletions(-) diff --git a/docs/source/detailed_design.md b/docs/source/detailed_design.md index 12771f0..ebc7a63 100644 --- a/docs/source/detailed_design.md +++ b/docs/source/detailed_design.md @@ -6,108 +6,126 @@ For a more general overview, go to [getting started](./getting_started.md#genera ```eval_rst .. uml:: - :caption: Standard design - :align: center - - allow_mixing - actor User - - rectangle SemanticLayer { - - class Cuds { - Session session - UUID uuid - CUBA cuba_key - -- - add() : Cuds - get() : Cuds - remove() : void - update() : void - iter() : Iterator - } - } - - rectangle InteroperabilityLayer { - - class Registry { - } - - abstract class Session { - Registry : registry - -- - store() : void - load() : Cuds - sync() : void - } - - class SomeWrapperSession implements Session { - List added - List updated - List removed - SyntacticLayer syntactic - -- - } - } + :caption: Standard design + :align: center + + allow_mixing + actor User + + circle pico + + rectangle SemanticLayer { + class Cuds { + Session session + UUID uuid + OntologyEntity oclass + -- + add() : Cuds + get() : Cuds + remove() : void + update() : void + iter() : Iterator + } + + abstract class OntologyEntity { + String name + URIRef iri + String tblname + OntologyNamespace namespace + Set direct_superclasses + Set direct_subclasses + Set superclasses + Set subclasses + String description + -- + get_triples() : triple + is_superclass_of() : bool + is_subclass_of() : bool + } + class OntologyClass implements OntologyEntity { + Dict attributes + Dict own_attributes + } + + class OntologyRelationship implements OntologyEntity { + OntologyRelationship inverse + } + + class OntologyAttribute implements OntologyEntity { + URIRef datatype + -- + convert_to_datatype() : Any + convert_to_basic_type() : Any + } + + class OntologyNamespace { + -- + get_iri() : URIRef + get_default_rel() : OntologyRelationship + get() : OntologyEntity + + } + + class NamespaceRegistry { + -- + get() : OntologyNamespace + update_namespaces() : void + from_iri() : OntologyEntity + clear() : Graph + store() : void + load() : void + } + } - rectangle SyntacticLayer { - class SyntacticLayer { + rectangle InteroperabilityLayer { + class Registry { + } + + abstract class Session { + Registry : registry + -- + store() : void + load() : Cuds + sync() : void + } + + class SomeWrapperSession implements Session { + List added + List updated + List removed + SyntacticLayer syntactic + -- + } } - } - database backend + rectangle SyntacticLayer { + class SyntacticLayer { + } + } + database backend - ' ----------------------- - ' ------ RELATIONS ------ - ' ----------------------- - User -> Cuds : interacts_with + ' ----------------------- + ' ------ RELATIONS ------ + ' ----------------------- + User -up-> OntologyClass : interacts_with + Cuds -left> OntologyClass : instance_of + OntologyEntity -> OntologyNamespace : part_of + OntologyNamespace -> NamespaceRegistry : contained_in + OntologyClass -left> OntologyAttribute : has - Cuds -> Session : has_a - Session -> Registry : manages + pico -> NamespaceRegistry : manages - SomeWrapperSession -> SyntacticLayer : manages + Cuds -> Session : has_a + Session -> Registry : manages - SyntacticLayer -> backend : acts_on + SomeWrapperSession -> SyntacticLayer : manages - ' ----------------------- - ' -------- NOTES -------- - ' ----------------------- - note top of Cuds - This will be shallow structure with - the uuids of the contained elements: - { - Relation1: {uid1: cuba_key, uid2: cuba_key}, - Relation2: {uid4: cuba_key}, - Relation3: {uid3: cuba_key, uid5: cuba_key}, - } - end note - - note top of Session - Provides the info requested to Cuds - end note - - note top of SomeWrapperSession - Updates the registry with information - from the backend and vice versa. - end note - - note top of Registry - Flat structure that contains all the - objects accessible through their uid: - { - uid1: object1, - uid2: object2, - uid3: object3, - } - end note + SyntacticLayer -> backend : acts_on - note top of SyntacticLayer - Connects to the engine and - knows its specific API - end note + OntologyRelationship -[hidden]> OntologyAttribute ``` - ## Semantic layer The semantic layer is the representation of the classes of the ontology in a programming language. From 39b695596231eee3947462cfb7d507e47e3b7c9c Mon Sep 17 00:00:00 2001 From: dea Date: Wed, 2 Dec 2020 14:53:27 +0100 Subject: [PATCH 53/57] fixed ref --- docs/source/jupyter/simlammps.ipynb | 2 +- setup.py | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/source/jupyter/simlammps.ipynb b/docs/source/jupyter/simlammps.ipynb index cc95a1d..27b20af 100644 --- a/docs/source/jupyter/simlammps.ipynb +++ b/docs/source/jupyter/simlammps.ipynb @@ -25,7 +25,7 @@ "Like we explain in the [wrapper development section](../wrapper_development.md#engine-installation), there are two options:\n", "\n", "- Using Docker: run `./docker_install.sh`.\n", - "- Local installation: remember that you must have a compatible version of [OSP-core installed](../getting_started.md#osp-core-installation).\n", + "- Local installation: remember that you must have a compatible version of [OSP-core installed](../installation.md#osp-core-installation).\n", " \n", " Install the ontology via `pico install ontology.simlammps.yml.`\n", " \n", diff --git a/setup.py b/setup.py index 3b8e84a..fdc3263 100644 --- a/setup.py +++ b/setup.py @@ -36,6 +36,8 @@ def run(self): 'sphinxcontrib-plantuml', 'nbsphinx', 'sphinx-copybutton', + 'sphinx-jsonschema', + 'sphinx_rtd_theme', 'ipython', ], setup_requires=[ From b75088ac5f4a02e87cd289b18e9e2294756757b6 Mon Sep 17 00:00:00 2001 From: dea Date: Wed, 2 Dec 2020 15:29:25 +0100 Subject: [PATCH 54/57] add vector notes, rename ontologies included --- docs/source/getting_started.md | 2 +- docs/source/index.md | 2 +- .../{included_ontologies.md => ontologies_included.md} | 0 docs/source/yaml.md | 7 +++++++ 4 files changed, 9 insertions(+), 2 deletions(-) rename docs/source/{included_ontologies.md => ontologies_included.md} (100%) diff --git a/docs/source/getting_started.md b/docs/source/getting_started.md index 4f0d769..1212794 100644 --- a/docs/source/getting_started.md +++ b/docs/source/getting_started.md @@ -184,7 +184,7 @@ or [one of the supported owl ontologies](owl.md). OSP-core can be used with EMMO (European Materials and Modelling Ontology) out of the box. -See more [here](included_ontologies.md). +See more [here](ontologies_included.md). ### Python classes Upon installation of OSP-core, each ontology class (except from attributes and relationships) becomes a python class. diff --git a/docs/source/index.md b/docs/source/index.md index 991fae3..550d083 100644 --- a/docs/source/index.md +++ b/docs/source/index.md @@ -32,7 +32,7 @@ Here you can browse though the general documentation of SimPhoNy. :maxdepth: 2 ontology_intro.md - included_ontologies.md + ontologies_included.md yaml.md owl.md jupyter/ontology-interface.ipynb diff --git a/docs/source/included_ontologies.md b/docs/source/ontologies_included.md similarity index 100% rename from docs/source/included_ontologies.md rename to docs/source/ontologies_included.md diff --git a/docs/source/yaml.md b/docs/source/yaml.md index 4c4c45c..6c659b6 100644 --- a/docs/source/yaml.md +++ b/docs/source/yaml.md @@ -144,6 +144,7 @@ It can additionally have the following keys: > characters). > - `VECTOR:datatype:D1:D2:...:Dn`: a vector of the given dimensions > (D1 x D2 x ... x Dn) and the given datatype. +> The dimensions are always fixed. > > For example, a VECTOR:INT:4:2:1 would be: \ > { [(a), (b)], [(c), (d)], [(e), (f)], [(g), (h)] } \ @@ -156,6 +157,12 @@ It can additionally have the following keys: > > For example: The datatype of entity numberOfOccurrences is INT. +> ```eval_rst +>.. note:: +> The implementation of the vectors is experimental and will be updated as soon as +> EMMO has established an appropriate wait of representing them +> ``` + ## Class expressions A class expression describes a subset of individuals. From e8b82bb8ff5d54d677a60be3763df29ee8b246c2 Mon Sep 17 00:00:00 2001 From: dea Date: Wed, 2 Dec 2020 16:56:56 +0100 Subject: [PATCH 55/57] notes on json serialisation --- docs/source/json.md | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/docs/source/json.md b/docs/source/json.md index abdfef5..c5c35f7 100644 --- a/docs/source/json.md +++ b/docs/source/json.md @@ -9,14 +9,8 @@ The method will traverse the hierarchical datastructure using Depth First Traversal. Therefore, its result is a json array composed of several flat CUDS objects. -The following explains the schema of the CUDS serialization: +This array can later be deserialized using the antagonist +[`deserialize`](api_ref.html#osp.core.utils.general.deserialize) -```eval_rst -.. jsonschema:: json_schema/serialized_cuds.json#/cuds_array -.. jsonschema:: json_schema/serialized_cuds.json#/definitions/cuds -.. jsonschema:: json_schema/serialized_cuds.json#/definitions/entity -.. jsonschema:: json_schema/serialized_cuds.json#/definitions/uuid -.. jsonschema:: json_schema/serialized_cuds.json#/definitions/attributes -.. jsonschema:: json_schema/serialized_cuds.json#/definitions/relationships - -``` +The serialization is done via [JSON-LD](https://json-ld.org/), +with the schema used for the [OSP API in Marketplace](https://gitlab.cc-asp.fraunhofer.de/MarketPlace/osp-api) From 607c5fd947bdf92810b2fddbba485664db391b67 Mon Sep 17 00:00:00 2001 From: dea Date: Wed, 2 Dec 2020 17:32:24 +0100 Subject: [PATCH 56/57] added contact section, minor fixes --- docs/source/about.md | 9 ++------- docs/source/contact.md | 8 ++++++++ docs/source/detailed_design.md | 4 ++-- docs/source/index.md | 1 + docs/source/json.md | 6 +++--- docs/source/jupyter/sessions_and_vars.ipynb | 2 +- docs/source/links.md | 1 + docs/source/motivation.md | 4 ++-- docs/source/wrapper_development.md | 2 +- 9 files changed, 21 insertions(+), 16 deletions(-) create mode 100644 docs/source/contact.md diff --git a/docs/source/about.md b/docs/source/about.md index 8803900..32b2f09 100644 --- a/docs/source/about.md +++ b/docs/source/about.md @@ -12,14 +12,9 @@ In particular, this guide will try to expose the main concepts and components. All the tutorials in this documentation are Jupyter notebooks that can be downloaded by clicking on the "Edit on Github" button on the top right of the page. -_Contact:_ [Pablo de Andres](mailto:pablo.de.andres@iwm.fraunhofer.de), -[Matthias Urban](mailto:matthias.urban@iwm.fraunhofer.de) and -[Yoav Nahshon](mailto:yoav.nahshon@iwm.fraunhofer.de) from -the Materials Data Science and Informatics team, Fraunhofer IWM. - # License -BSD 3-Clause -Copyright 2020 SimPhoNy OSP-core developers +BSD 3-Clause +Copyright 2020 SimPhoNy OSP-core developers. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: diff --git a/docs/source/contact.md b/docs/source/contact.md new file mode 100644 index 0000000..4293900 --- /dev/null +++ b/docs/source/contact.md @@ -0,0 +1,8 @@ +# Contact +If you see something wrong, missing, or in need of clarification, you can directly +create an issue in [here](https://github.com/simphony/docs/issues). + +Any other questions, issues or comments can be directed to [Pablo de Andres](mailto:pablo.de.andres@iwm.fraunhofer.de), +[Matthias Urban](mailto:matthias.urban@iwm.fraunhofer.de) and +[Yoav Nahshon](mailto:yoav.nahshon@iwm.fraunhofer.de) +from the Materials Data Science and Informatics team, Fraunhofer IWM. \ No newline at end of file diff --git a/docs/source/detailed_design.md b/docs/source/detailed_design.md index ebc7a63..cdcb7dc 100644 --- a/docs/source/detailed_design.md +++ b/docs/source/detailed_design.md @@ -151,7 +151,7 @@ _Location:_ `osp.core.cuds` It is the base class for all instances. Besides whatever might have been defined in the ontology, they all have 3 basic attributes: - - uid: instance of `uuid.UUID`, it serves to uniquely identify an instance + - uid: instance of `uuid.UUID`, it serves to uniquely identify an instance. - session: this is the link to the interoperability layer. By default all objects are in the `CoreSession`, unless they are in a wrapper. - oclass: indicates the ontology class they originate from. @@ -159,7 +159,7 @@ Besides whatever might have been defined in the ontology, they all have 3 basic #### Cuds structure Each cuds object contains the uids and oclass of the directly related entities, as well as the relationship that connects them. -The actual related objects are kept in the [registry](#registry) +The actual related objects are kept in the [registry](#registry). ``` a_cuds_object := { Relation1: {uid1: oclass, uid2: oclass}, diff --git a/docs/source/index.md b/docs/source/index.md index 550d083..5110152 100644 --- a/docs/source/index.md +++ b/docs/source/index.md @@ -55,5 +55,6 @@ Here you can browse though the general documentation of SimPhoNy. api_ref.md json.md links.md + contact.md ``` diff --git a/docs/source/json.md b/docs/source/json.md index c5c35f7..2f0095e 100644 --- a/docs/source/json.md +++ b/docs/source/json.md @@ -9,8 +9,8 @@ The method will traverse the hierarchical datastructure using Depth First Traversal. Therefore, its result is a json array composed of several flat CUDS objects. -This array can later be deserialized using the antagonist -[`deserialize`](api_ref.html#osp.core.utils.general.deserialize) +This array can later be deserialized using the opposite +[`deserialize`](api_ref.html#osp.core.utils.general.deserialize). The serialization is done via [JSON-LD](https://json-ld.org/), -with the schema used for the [OSP API in Marketplace](https://gitlab.cc-asp.fraunhofer.de/MarketPlace/osp-api) +with the schema used for the [OSP API in Marketplace](https://gitlab.cc-asp.fraunhofer.de/MarketPlace/osp-api). diff --git a/docs/source/jupyter/sessions_and_vars.ipynb b/docs/source/jupyter/sessions_and_vars.ipynb index 7d03093..f7b42eb 100644 --- a/docs/source/jupyter/sessions_and_vars.ipynb +++ b/docs/source/jupyter/sessions_and_vars.ipynb @@ -16,7 +16,7 @@ "\n", "Here we will try to explain said behaviour with simple illustrative examples.\n", "\n", - "**_Note:_ This tutorial is not meant to be run like the others. The session classes and ontology entities are not real implementations. However, the behaviour shown will be the same as that of a real setup.**" + "**Note:** This tutorial is not meant to be run like the others. The session classes and ontology entities are not real implementations. However, the behaviour shown will be the same as that of a real setup." ] }, { diff --git a/docs/source/links.md b/docs/source/links.md index 0bf3262..46335bf 100644 --- a/docs/source/links.md +++ b/docs/source/links.md @@ -1,5 +1,6 @@ # Related links Here are links to other projects relevant for this documentation. + SimPhoNy: - [GitLab's SimPhoNy group](https://gitlab.cc-asp.fraunhofer.de/simphony) - [GitHub's SimPhoNy group](https://github.com/simphony) diff --git a/docs/source/motivation.md b/docs/source/motivation.md index 950fc9f..2493742 100644 --- a/docs/source/motivation.md +++ b/docs/source/motivation.md @@ -55,7 +55,7 @@ Based on how tools communicate with other tools, we can define 3 levels of opera To continue with our language simile, `A` would be a translator that speaks the languages of `B`, `C` and `D`. If `B` wants to talk to `C`, they must first relay the message to `A`, - and `A` will convert it to a format that `C` understands + and `A` will convert it to a format that `C` understands. #### Interoperability ```eval_rst @@ -86,7 +86,7 @@ Interoperability between software tools is one of the most important objectives ### Abstraction and generalisation -Once a certain degree of interoperability has been reached, other interesting concepts and details that arise +Once a certain degree of interoperability has been reached, other interesting concepts and details that arise: #### Semantic vs. syntactic In our day to day life we use a series of sounds, symbols and rules to communicate. In its simplest level, words have a syntactic side, a role in the sentence they make up, and a explicit meaning. diff --git a/docs/source/wrapper_development.md b/docs/source/wrapper_development.md index 37586b3..f41cb33 100644 --- a/docs/source/wrapper_development.md +++ b/docs/source/wrapper_development.md @@ -69,6 +69,7 @@ This allows us to group and clearly define which components should and which one - [Semantic layer](./detailed_design.md#semantic-layer): Requires no work. + As presented in the previous section, only an entity representing the wrapper has to be present in the ontology. - [Interoperability layer](./detailed_design.md#interoperability-layer): - [Session class](./detailed_design.md#session): @@ -94,7 +95,6 @@ This allows us to group and clearly define which components should and which one - [Syntactic layer](./detailed_design.md#syntactic-layer): If none is available, one must be developed. - Only needs an entity representing the wrapper, as presented in the previous section. ## Engine installation Most engines will require some sort of compilation or installation before being able to use them through Python. From dfcdd9abc94ed8303bbdbf74b0c41f1df7d04e9d Mon Sep 17 00:00:00 2001 From: dea Date: Wed, 2 Dec 2020 17:44:41 +0100 Subject: [PATCH 57/57] removed duplicated requirements --- setup.py | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/setup.py b/setup.py index fdc3263..d791c82 100644 --- a/setup.py +++ b/setup.py @@ -29,20 +29,6 @@ def run(self): description='The SimPhoNy documentation', keywords='simphony, documentation, sphinx, cuds, Fraunhofer IWM', long_description=README_TEXT, - install_requires=[ - 'osp-core>=' + OSP_CORE_MIN + ', <' + OSP_CORE_MAX, - 'sphinx', - 'recommonmark', - 'sphinxcontrib-plantuml', - 'nbsphinx', - 'sphinx-copybutton', - 'sphinx-jsonschema', - 'sphinx_rtd_theme', - 'ipython', - ], - setup_requires=[ - 'sphinx', - ], cmdclass={'install': CustomBuild}, command_options={ 'install': {