From 0b936a48d1497ccec011317a7c4563e0d345b794 Mon Sep 17 00:00:00 2001 From: Joeri Exelmans Date: Wed, 23 Jul 2025 16:00:42 +0200 Subject: [PATCH] get rid of outdated examples --- examples/conformance/abstract_assoc.py | 75 ------- examples/conformance/metacircularity.py | 27 --- examples/conformance/woods.py | 200 ------------------ examples/conformance/woods2.py | 133 ------------ examples/geraniums/schedules/schedule.od | 0 examples/petrinet/models/schedules/foo.od | 23 -- .../models/schedules/petrinet3.drawio | 22 +- tutorial/05_advanced_transformation.py | 8 +- 8 files changed, 15 insertions(+), 473 deletions(-) delete mode 100644 examples/conformance/abstract_assoc.py delete mode 100644 examples/conformance/metacircularity.py delete mode 100644 examples/conformance/woods.py delete mode 100644 examples/conformance/woods2.py delete mode 100644 examples/geraniums/schedules/schedule.od delete mode 100644 examples/petrinet/models/schedules/foo.od diff --git a/examples/conformance/abstract_assoc.py b/examples/conformance/abstract_assoc.py deleted file mode 100644 index 27d4c7c..0000000 --- a/examples/conformance/abstract_assoc.py +++ /dev/null @@ -1,75 +0,0 @@ -from state.devstate import DevState -from bootstrap.scd import bootstrap_scd -from framework.conformance import Conformance, render_conformance_check_result -from concrete_syntax.textual_od import parser, renderer -from concrete_syntax.common import indent -from concrete_syntax.plantuml import renderer as plantuml -from util.prompt import yes_no, pause - -state = DevState() -scd_mmm = bootstrap_scd(state) - - -mm_cs = """ - BaseA:Class { - abstract = True; - } - BaseB:Class { - abstract = True; - } - baseAssoc:Association (BaseA -> BaseB) { - abstract = True; - target_lower_cardinality = 1; - target_upper_cardinality = 2; # A has 1..2 B - } - A:Class - B:Class - assoc:Association (A -> B) { - # we can further restrict cardinality from baseAssoc: - target_upper_cardinality = 1; - - # relaxing cardinalities or constraints can be done (meaning: it will still be a valid meta-model), but will have no effect: for any instance of a type, the constraints defined on the type and its supertypes will be checked. - } - :Inheritance (A -> BaseA) - :Inheritance (B -> BaseB) - :Inheritance (assoc -> baseAssoc) -""" - -print() -print("Parsing meta-model...") -mm = parser.parse_od( - state, - m_text=mm_cs, # the string of text to parse - mm=scd_mmm, # the meta-model of class diagrams (= our meta-meta-model) -) -print("OK") - -print("Is our meta-model a valid class diagram?") -conf = Conformance(state, mm, scd_mmm) -print(render_conformance_check_result(conf.check_nominal())) - -m_cs = """ - a0:A - b0:B - b1:B - - # error: assoc (A -> B) must have tgt card 0..1 (and we have 2 instead) - :assoc (a0 -> b0) - :assoc (a0 -> b1) - - # error: baseAssoc (A -> B) must have tgt card 1..2 (and we have 0 instead) - a1:A -""" - -print() -print("Parsing model...") -m = parser.parse_od( - state, - m_text=m_cs, - mm=mm, # this time, the meta-model is the previous model we parsed -) -print("OK") - -print("Is our model a valid woods-diagram?") -conf = Conformance(state, m, mm) -print(render_conformance_check_result(conf.check_nominal())) diff --git a/examples/conformance/metacircularity.py b/examples/conformance/metacircularity.py deleted file mode 100644 index c591ee0..0000000 --- a/examples/conformance/metacircularity.py +++ /dev/null @@ -1,27 +0,0 @@ -from state.devstate import DevState -from bootstrap.scd import bootstrap_scd -from services.scd import SCD -from concrete_syntax.plantuml import renderer as plantuml - -def main(): - state = DevState() - root = state.read_root() # id: 0 - - scd_mm_id = bootstrap_scd(state) - - uml = "" - - # Render SCD Meta-Model as Object Diagram - uml += plantuml.render_package("Object Diagram", plantuml.render_object_diagram(state, scd_mm_id, scd_mm_id, prefix_ids="od_")) - - # Render SCD Meta-Model as Class Diagram - uml += plantuml.render_package("Class Diagram", plantuml.render_class_diagram(state, scd_mm_id, prefix_ids="cd_")) - - # Render conformance - uml += plantuml.render_trace_conformance(state, scd_mm_id, scd_mm_id, prefix_inst_ids="od_", prefix_type_ids="cd_") - - print(uml) - - -if __name__ == "__main__": - main() \ No newline at end of file diff --git a/examples/conformance/woods.py b/examples/conformance/woods.py deleted file mode 100644 index 591eb91..0000000 --- a/examples/conformance/woods.py +++ /dev/null @@ -1,200 +0,0 @@ -from state.devstate import DevState -from bootstrap.scd import bootstrap_scd -from framework.conformance import Conformance, render_conformance_check_result -from concrete_syntax.textual_od import parser, renderer -from concrete_syntax.common import indent -from concrete_syntax.plantuml import renderer as plantuml -from concrete_syntax.plantuml.make_url import make_url -from util.prompt import yes_no, pause - -state = DevState() - -print("Loading meta-meta-model...") -scd_mmm = bootstrap_scd(state) -print("OK") - -print("Is our meta-meta-model a valid class diagram?") -conf = Conformance(state, scd_mmm, scd_mmm) -print(render_conformance_check_result(conf.check_nominal())) - -# If you are curious, you can serialize the meta-meta-model: -# print("--------------") -# print(indent( -# renderer.render_od(state, -# m_id=scd_mmm, -# mm_id=scd_mmm), -# 4)) -# print("--------------") - - -# Change this: -woods_mm_cs = """ - Animal:Class { - # The class Animal is an abstract class: - abstract = True; - } - - # A class without attributes - # The `abstract` attribute shown above is optional (default: False) - Bear:Class - - # Inheritance between two Classes is expressed as follows: - :Inheritance (Bear -> Animal) # meaning: Bear is an Animal - - Man:Class { - # We can define lower and upper cardinalities on Classes - # (if unspecified, the lower-card is 0, and upper-card is infinity) - - lower_cardinality = 1; # there must be at least one Man in every model - upper_cardinality = 2; # there must be at most two Men in every model - - constraint = ``` - # Python code - # the last statement must be a boolean expression - - # When conformance checking, this code will be run for every Man-object. - # The variable 'this' refers to the current Man-object. - - # Every man weighs at least '20' - # (the attribute 'weight' is added further down) - get_value(get_slot(this, "weight")) > 20 - ```; - } - # Note that we can only declare the inheritance link after having declared both Man and Animal: We can only refer to earlier objects - :Inheritance (Man -> Animal) # Man is also an Animal - - - # BTW, we could also give the Inheritance-link a name, for instance: - # man_is_animal:Inheritance (Man -> Animal) - # - # Likewise, Classes, Associations, ... can also be nameless, for instance: - # :Class { ... } - # :Association (Man -> Man) { ... } - # However, we typically want to give names to classes and associations, because we want to refer to them later. - - - # We now add an attribute to 'Man' - # Attributes are not that different from Associations: both are represented by links - Man_weight:AttributeLink (Man -> Integer) { - name = "weight"; # mandatory! - optional = False; # <- meaning: every Man *must* have a weight - - # We can also define constraints on attributes - constraint = ``` - # Python code - # Here, 'this' refers to the LINK that connects a Man-object to an Integer - tgt = get_target(this) # <- we get the target of the LINK (an Integer-object) - weight = get_value(tgt) # <- get the Integer-value (e.g., 80) - weight > 20 - ```; - } - - # Create an Association from Man to Animal - afraidOf:Association (Man -> Animal) { - # An association has the following (optional) attributes: - # - source_lower_cardinality (default: 0) - # - source_upper_cardinality (default: infinity) - # - target_lower_cardinality (default: 0) - # - target_upper_cardinality (default: infinity) - - # Every Man is afraid of at least one Animal: - target_lower_cardinality = 1; - - # No more than 6 Men are afraid of the same Animal: - source_upper_cardinality = 6; - } - - # Create a GlobalConstraint - total_weight_small_enough:GlobalConstraint { - # Note: for GlobalConstraints, there is no 'this'-variable - constraint = ``` - # Python code - # compute sum of all weights - total_weight = 0 - for man_name, man_id in get_all_instances("Man"): - total_weight += get_value(get_slot(man_id, "weight")) - - # as usual, the last statement is a boolean expression that we think should be satisfied - total_weight < 85 - ```; - } -""" - -print() -print("Parsing 'woods' meta-model...") -woods_mm = parser.parse_od( - state, - m_text=woods_mm_cs, # the string of text to parse - mm=scd_mmm, # the meta-model of class diagrams (= our meta-meta-model) -) -print("OK") - -# As a double-check, you can serialize the parsed model: -# print("--------------") -# print(indent( -# renderer.render_od(state, -# m_id=woods_mm, -# mm_id=scd_mmm), -# 4)) -# print("--------------") - -print("Is our 'woods' meta-model a valid class diagram?") -conf = Conformance(state, woods_mm, scd_mmm) -print(render_conformance_check_result(conf.check_nominal())) - -# Change this: -woods_m_cs = """ - george:Man { - weight = 15; - } - billy:Man { - weight = 100; - } - bear1:Bear - bear2:Bear - :afraidOf (george -> bear1) - :afraidOf (george -> bear2) - :afraidOf (billy -> george) -""" - -print() -print("Parsing 'woods' model...") -woods_m = parser.parse_od( - state, - m_text=woods_m_cs, - mm=woods_mm, # this time, the meta-model is the previous model we parsed -) -print("OK") - -# As a double-check, you can serialize the parsed model: -# print("--------------") -# print(indent( -# renderer.render_od(state, -# m_id=woods_m, -# mm_id=woods_mm), -# 4)) -# print("--------------") - -print("Is our model a valid woods-diagram?") -conf = Conformance(state, woods_m, woods_mm) -print(render_conformance_check_result(conf.check_nominal())) - - -print() -print("==================================") -if yes_no("Print PlantUML?"): - print_mm = yes_no(" ▸ Print meta-model?") - print_m = yes_no(" ▸ Print model?") - print_conf = print_mm and print_m and yes_no(" ▸ Print conformance links?") - - uml = "" - if print_mm: - uml += plantuml.render_package("Meta-model", plantuml.render_class_diagram(state, woods_mm)) - if print_m: - uml += plantuml.render_package("Model", plantuml.render_object_diagram(state, woods_m, woods_mm)) - if print_conf: - uml += plantuml.render_trace_conformance(state, woods_m, woods_mm) - - print("==================================") - print(make_url(uml)) - print("==================================") diff --git a/examples/conformance/woods2.py b/examples/conformance/woods2.py deleted file mode 100644 index 656cddb..0000000 --- a/examples/conformance/woods2.py +++ /dev/null @@ -1,133 +0,0 @@ -from state.devstate import DevState -from bootstrap.scd import bootstrap_scd -from framework.conformance import Conformance, render_conformance_check_result -from concrete_syntax.textual_cd import parser as parser_cd -from concrete_syntax.textual_od import parser as parser_od -from concrete_syntax.textual_od import renderer as renderer_od -from concrete_syntax.common import indent -from concrete_syntax.plantuml import renderer as plantuml -from util.prompt import yes_no, pause - -state = DevState() - -print("Loading meta-meta-model...") -scd_mmm = bootstrap_scd(state) -print("OK") - -print("Is our meta-meta-model a valid class diagram?") -conf = Conformance(state, scd_mmm, scd_mmm) -print(render_conformance_check_result(conf.check_nominal())) - -# If you are curious, you can serialize the meta-meta-model: -# print("--------------") -# print(indent( -# renderer.render_od(state, -# m_id=scd_mmm, -# mm_id=scd_mmm), -# 4)) -# print("--------------") - - -# Change this: -woods_mm_cs = """ - abstract class Animal - - class Bear (Animal) # Bear inherits Animal - - class Man [1..2] (Animal) { - Integer weight `get_value(get_target(this)) > 20`; # <- constraint in context of attribute-link - - `get_value(get_slot(this, "weight")) > 20` # <- constraint in context of Man-object - } - - association afraidOf [0..6] Man -> Animal [1..2] - - global total_weight_small_enough ``` - total_weight = 0 - for man_name, man_id in get_all_instances("Man"): - total_weight += get_value(get_slot(man_id, "weight")) - total_weight < 85 - ``` -""" - -print() -print("Parsing 'woods' meta-model...") -woods_mm = parser_cd.parse_cd( - state, - m_text=woods_mm_cs, # the string of text to parse -) -print("OK") - -# We can serialize the class diagram to our object diagram syntax -# (because the class diagram IS also an object diagram): -print("--------------") -print(indent( - renderer_od.render_od(state, - m_id=woods_mm, - mm_id=scd_mmm), - 4)) -print("--------------") - -print("Is our 'woods' meta-model a valid class diagram?") -conf = Conformance(state, woods_mm, scd_mmm) -print(render_conformance_check_result(conf.check_nominal())) - -# Change this: -woods_m_cs = """ - george:Man { - weight = 15; - } - billy:Man { - weight = 100; - } - bear1:Bear - bear2:Bear - :afraidOf (george -> bear1) - :afraidOf (george -> bear2) -""" - -print() -print("Parsing 'woods' model...") -woods_m = parser_od.parse_od( - state, - m_text=woods_m_cs, - mm=woods_mm, # this time, the meta-model is the previous model we parsed -) -print("OK") - -# As a double-check, you can serialize the parsed model: -# print("--------------") -# print(indent( -# renderer.render_od(state, -# m_id=woods_m, -# mm_id=woods_mm), -# 4)) -# print("--------------") - -print("Is our model a valid woods-diagram?") -conf = Conformance(state, woods_m, woods_mm) -print(render_conformance_check_result(conf.check_nominal())) - - -print() -print("==================================") -if yes_no("Print PlantUML?"): - print_mm = yes_no(" ▸ Print meta-model?") - print_m = yes_no(" ▸ Print model?") - print_conf = print_mm and print_m and yes_no(" ▸ Print conformance links?") - - uml = "" - if print_mm: - uml += plantuml.render_package("Meta-model", plantuml.render_class_diagram(state, woods_mm)) - if print_m: - uml += plantuml.render_package("Model", plantuml.render_object_diagram(state, woods_m, woods_mm)) - if print_conf: - uml += plantuml.render_trace_conformance(state, woods_m, woods_mm) - - print("==================================") - print(uml) - print("==================================") - print("Go to either:") - print(" ▸ https://www.plantuml.com/plantuml/uml") - print(" ▸ https://mstro.duckdns.org/plantuml/uml") - print("and paste the above string.") diff --git a/examples/geraniums/schedules/schedule.od b/examples/geraniums/schedules/schedule.od deleted file mode 100644 index e69de29..0000000 diff --git a/examples/petrinet/models/schedules/foo.od b/examples/petrinet/models/schedules/foo.od deleted file mode 100644 index 7acc7a8..0000000 --- a/examples/petrinet/models/schedules/foo.od +++ /dev/null @@ -1,23 +0,0 @@ -start:Start { - ports_exec = `["F","FF"]`; -} -end:End { - ports_exec = `["F"]`; -} - -p1:Print{ - custom = "Foo"; -} - -p2:Print{ - custom = "FooFoo"; -} - -p3:Print{ - custom = "FooFooFoo"; -} - -:Conn_exec (start -> p1) {from="F";to="in";} -:Conn_exec (p1 -> end) {from="out";to="F";} -:Conn_exec (start -> p2) {from="FF";to="in";} -:Conn_exec (p2 -> end) {from="out";to="F";} diff --git a/examples/petrinet/models/schedules/petrinet3.drawio b/examples/petrinet/models/schedules/petrinet3.drawio index 4e701fe..a20ee2c 100644 --- a/examples/petrinet/models/schedules/petrinet3.drawio +++ b/examples/petrinet/models/schedules/petrinet3.drawio @@ -1,6 +1,6 @@ - + - + @@ -70,7 +70,7 @@ - + @@ -111,7 +111,7 @@ - + @@ -185,7 +185,7 @@ - + @@ -218,10 +218,10 @@ - + - + @@ -231,7 +231,7 @@ - + @@ -239,13 +239,13 @@ - + - + - + diff --git a/tutorial/05_advanced_transformation.py b/tutorial/05_advanced_transformation.py index f420b0e..7428535 100644 --- a/tutorial/05_advanced_transformation.py +++ b/tutorial/05_advanced_transformation.py @@ -187,16 +187,16 @@ def show_petri_net(m): return f""" t1 t2 t3 ┌─┐ p1 ┌─┐ p2 ┌─┐ - │ │ --- │ │ --- │ │ + │ │ │ │ │ │ │ ├─────► ( {p1} )─────►│ │─────► ( {p2} )─────►│ │ - └─┘ --- └─┘ --- └─┘ + └─┘ └─┘ └─┘ ▲ │ ▲ │ │ │ │ │ │ │ │ │ │ │ │ │ - │ --- │ │ --- │ + │ │ │ │ └───────( {cp1} )◄──────┘ └──────( {cp2} )◄───────┘ - --- --- + cp1 cp2 """ # Let's see if it works: