Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
xml_script [2011/04/22 19:14]
hermann created
xml_script [2026/07/22 20:27] (current)
hermann
Line 1: Line 1:
-===== XML Script =====+====== EGOML Script ​======
  
-Model can be saved as a XML document. The resulting file uses the extension "​.xml"​.+===== Overview =====
  
-Using the XML format ​is possible to write incomplete script having functors whose input and output ports are not completely boundThis allows saving models in the first development stages.+Any model can be saved as an EGOML document. The resulting file uses the extension "​.egoml"​ (the old extension "​.xml" ​is still supported for backward compatibility)See [[basic_data_flow|Basic Data Flow]] for the execution model shared by EGOML and [[ego_script|EGO Script]]; this page covers the XML notation specifically.
  
-The XML document ​is written according to the following DTD ((A good introduction to the DTD description syntax can be found at http://skew.org/xml/tutorial.)):+The EGOML file is an XML document written according to the following DTD; see [[https://www.w3schools.com/xml/xml_dtd_intro.asp|w3schools'​ DTD tutorial]] for a good introduction to the DTD description syntax:
  
 <code dtd> <code dtd>
 <?xml version="​1.0"?>​ <?xml version="​1.0"?>​
 <​!DOCTYPE script [ <​!DOCTYPE script [
-    ​<​!ELEMENT script (property*, functor*, containerfunctor*)>​+  ​<​!ELEMENT script (property*, functor*, containerfunctor*)
 +  
 +  <​!ELEMENT functor (property*, inputport*, outputport*)>​ 
 +    <​!ATTLIST functor 
 +      name   ​CDATA ​ #​REQUIRED>​ 
 +  
 +  <​!ELEMENT containerfunctor (property*, inputport*, outputport*,​ internalinputport*,​ internaloutputport*,​ (functor|containerfunctor)*)>​ 
 +    <​!ATTLIST containerfunctor 
 +      name   ​CDATA ​ #​REQUIRED>​ 
 +  
 +  <​!ELEMENT property EMPTY> 
 +    <​!ATTLIST property 
 +      key  CDATA  #REQUIRED 
 +      value  CDATA  #​REQUIRED>​ 
 +  
 +  <​!ELEMENT inputport (#​PCDATA)>​ 
 +    <​!ATTLIST inputport 
 +      name   ​CDATA ​ #REQUIRED 
 +      peerid IDREFS #​IMPLIED>​ 
 +  <​!ELEMENT outputport EMPTY> 
 +    <​!ATTLIST outputport 
 +      name   ​CDATA ​ #REQUIRED 
 +      id   ​ID ​  #​REQUIRED>​ 
 +   <​!ELEMENT internalinputport EMPTY> 
 +    <​!ATTLIST internalinputport 
 +      name   ​CDATA ​ #REQUIRED 
 +      peerid IDREFS #​IMPLIED>​ 
 +  <​!ELEMENT internaloutputport EMPTY> 
 +    <​!ATTLIST internaloutputport 
 +      name   ​CDATA ​ #REQUIRED 
 +      id   ​ID ​  #​REQUIRED>​ 
 +]> 
 +</code>
  
-    <​!ELEMENT functor (property*, inputport*, outputport*)>​ +==== Elements ====
-        <​!ATTLIST functor +
-            name   ​CDATA ​ #​REQUIRED>​+
  
-    <​!ELEMENT containerfunctor (property*, inputport*, outputport*,​ internalinputport*,​ internaloutputport*, ​functor*)> +Each element in the DTD corresponds directly to a piece of the underlying ​functor ​graph described in [[basic_data_flow|Basic Data Flow]]:
-        <​!ATTLIST containerfunctor +
-            name   ​CDATA ​ #​REQUIRED>​+
  
-    <​!ELEMENT property EMPTY> +  * ''​script''​ is the model as a whole — the root element, holding the model'​s own properties plus every top-level functor and container. 
-        <​!ATTLIST property +  * ''​functor''​ is a single functor call, identified by its ''​name''​ attribute (such as ''​LoadMap''​). It holds its own properties, its input ports, and its output ports. 
-            ​key ​   CDATA  #REQUIRED +  ​* ''​containerfunctor''​ is a functor that also holds nested functors and containers — the same element type can nest inside itself, since containers can be placed inside other containers. 
-            value  ​CDATA  #​REQUIRED>​+  * ''​property''​ attaches metadata to whatever element contains it, as a ''​key''/''​value''​ pair. Keys are always written fully expanded — there is no property alias as in the [[ego_script|EGO Script]] format. 
 +  * ''​inputport''​ and ''​outputport''​ are a functor'​s connection points. An ''​outputport''​ declares an ''​id'';​ an ''​inputport''​ elsewhere in the document references that ''​id''​ through its own ''​peerid''​ attribute to form a connection — the XML equivalent of two functors sharing a variable name in EGO Script. 
 +  * ''​internalinputport''​ and ''​internaloutputport''​ work the same way, but connect a container to the functors nested inside it, rather than connecting two ordinary functors to each other.
  
-    ​<!ELEMENT ​inputport ​(#PCDATA)+The DTD defines no equivalent of EGO Script'​s abbreviated calculator syntax. Every functor in the Calculate family — ''​CalculateMap'',​ ''​CalculateLookupTableValues'',​ and the others — is represented the same way as any other container: its operands are connected through explicit ''​NumberMap''/''​NumberTable''/''​NumberValue''​ hook functors, as shown in the ''​CalculateMap''​ example below. See [[ego_script#​calculator_functor_shorthand|Calculator functor shorthand]] for the two syntactic forms EGO Script provides for this same underlying structure. 
-        <!ATTLIST ​inputport + 
-            name   CDATA  #REQUIRED +==== Example ==== 
-            ​peerid IDREFS #IMPLIED+ 
-    <!ELEMENT outputport EMPTY+Below is an example of an EGOML script used to load a map, calculate an image convolution,​ and save the result: 
-        <!ATTLIST outputport + 
-            name   CDATA  #REQUIRED +<code xml> 
-            id     ID     #​REQUIRED+<?xml version="​1.0"​ standalone="​yes"​ ?>  
-     ​<!ELEMENT internalinputport EMPTY+<​script>​ 
-        <!ATTLIST internalinputport +  <​property key="​dff.charset"​ value="​UTF-8"​ />  
-            name   CDATA  #REQUIRED +  <​property key="​dff.date"​ value="​2026-Jul-21 14:​32:​07"​ />  
-            peerid ​IDREFS #IMPLIED+  <​property key="​dff.version"​ value="​8.12.0.20260626"​ />  
-    <!ELEMENT internaloutputport EMPTY+  <​property key="​metadata.author"​ value="​Dinamica EGO Team" />  
-        <!ATTLIST internaloutputport +  <​property key="​metadata.description"​ value="​This is an example of map algebra expression written in Dinamica’s Calculate Map functor. This functor also performs contextual image operation, such as edge detection filters using nbConvol expression."​ />  
-            name   CDATA  #REQUIRED +  <​property key="​metadata.organization"​ value="​CSR / UFMG" />  
-            ​id ​    ​ID ​    #​REQUIRED+  <​property key="​metadata.showproperties"​ value="​yes"​ />  
-]>+  <​property key="​metadata.title"​ value="​Apply Edge Detection Convolution Easier"​ />  
 +  <functor name="​LoadMap">​ 
 +    <​property key="​dff.functor.alias"​ value="​Input Map" />  
 +    ​<​inputport ​name="​filename">"​C:/​Desenvolvimento/​Centro-De-Sensoriamento-Remoto/​lesson1/​amazon_states.tif"</​inputport>  
 +    <​inputport ​name="​nullValue">​.none</​inputport> ​ 
 +    <​inputport ​name="​storageMode">​.default</​inputport> ​ 
 +    <​inputport name="​suffixDigits">​0</​inputport>  
 +    <inputport name="​firstWindowCoordinateX">​.none</​inputport>  
 +    <inputport name="​firstWindowCoordinateY">​.none</​inputport> ​ 
 +    <​inputport ​name="​secondWindowCoordinateX">​.none</​inputport> ​ 
 +    <​inputport name="​secondWindowCoordinateY">​.none</​inputport>​  
 +    <​inputport name="​step">​.none</​inputport>​  
 +    <​inputport name="​workdir">​.none</​inputport>​  
 +    <​outputport name="​map" ​id="​v1"​ />  
 +  </functor
 +  <functor name="​LookupTable">​ 
 +    <​inputport ​name="​constant">​[ "​Key"​ "​Value",​ 1 1 .. 4 1, 5 -8, 6 1 .. 9 1 ]</​inputport>​  
 +    <​outputport name="​object"​ id="​v2"​ />  
 +  </​functor>​ 
 +  <​functor name="​SaveMap">​ 
 +    <​inputport name="​map" ​peerid="​v3"​ />  
 +    <inputport name="​filename">"​C:/​Desenvolvimento/​Centro-De-Sensoriamento-Remoto/​dinamica/​Release/​output.ers"</​inputport>  
 +    <inputport name="​suffixDigits">​0</​inputport> ​ 
 +    <​inputport ​name="​step">​.none</​inputport>​  
 +    <​inputport name="​useCompression">​.yes</​inputport>​  
 +    <​inputport name="​workdir">​.none</​inputport>​  
 +    <​inputport name="​ignoreCostlySparseCategories">​.yes</​inputport>​  
 +  </​functor>​ 
 +  <​containerfunctor name="​CalculateMap"​
 +    <​property key="​dff.functor.alias"​ value="​Edge Map" />  
 +    <​property key="​dff.functor.comment"​ value="​Image convolution in Dinamica EGO" />  
 +    <​inputport name="​expression">​[ nbConvol(i1,​ t1, 3, 3) ]</​inputport>​  
 +    <​inputport name="​cellType">​.int32</​inputport>​  
 +    <​inputport name="​nullValue">​0</​inputport>​  
 +    <​inputport name="​resultIsSparse">​.no</​inputport>​  
 +    <​inputport name="​resultFormat">​.none</​inputport>​  
 +    <​outputport name="​result"​ id="​v3"​ />  
 +    <functor name="​NumberMap">​ 
 +      <​inputport name="​map"​ peerid="​v1"​ />  
 +      <​inputport name="​mapNumber">​1</​inputport>​  
 +    </​functor>​ 
 +    <functor name="​NumberTable">​ 
 +      <​inputport name="​table"​ peerid="​v2"​ />  
 +      <​inputport name="​tableNumber">​1</​inputport>​  
 +    </​functor>​ 
 +  </​containerfunctor>​ 
 +</script>
 </​code>​ </​code>​
  
-The resulting document ​is not formated ​using tabsspaces or newlinesThose characters are written only when they are inside the definition contentnot in the content boundaries.+The same model, expressed in EGO Script: 
 + 
 +<​code>​ 
 +@charset = UTF-8 
 +@date = 2026-Jul-21 14:32:07 
 +@version = 8.12.0.20260626 
 +@author = Dinamica EGO Team 
 +@description = This is an example of map algebra expression written in Dinamica’s Calculate Map functor. This functor also performs contextual image operation, such as edge detection filters ​using nbConvol expression. 
 +@organization = CSR / UFMG 
 +@showproperties = yes 
 +@title = Apply Edge Detection Convolution Easier 
 +Script {{ 
 +    inputMap := LoadMap "​C:/​Desenvolvimento/​Centro-De-Sensoriamento-Remoto/​lesson1/​amazon_states.tif"​ .none .default 0 .none .none .none .none .none .none; 
 + 
 +    lookupTable0 := LookupTable [ 
 +        "​Key"​ "​Value"​, 
 +        1 1 .. 4 1, 
 +        5 -8, 
 +        6 1 .. 9 1 
 +    ]; 
 + 
 +    // Image convolution ​in Dinamica EGO 
 +    edgeMap := # [ 
 +        nbConvol(#​inputMap,​ %lookupTable0,​ 3, 3) 
 +    ] .int32 0 .no .none; 
 + 
 +    SaveMap edgeMap "​C:/​Desenvolvimento/​Centro-De-Sensoriamento-Remoto/​dinamica/​Release/​output.ers"​ 0 .none .yes .none .yes; 
 +}}; 
 +</​code>​