JuliaReach / SpaceExParser.jl

Parser for the SpaceEx modeling language in Julia
https://juliareach.github.io/SpaceExParser.jl/
MIT License
7 stars 1 forks source link

Add writer for AffineContinuousSystem and constrained systems #48

Closed schillic closed 3 years ago

schillic commented 3 years ago
julia> A = rand(3, 3); B = rand(3, 2); C = [A B; zeros(2, 5)];
julia> Sl = @system(x' = A*x); Sa = @system(x' = A*x + B*u); Sh = @system(x' = C*x);

julia> writesxmodel("lin.xml", Sl)
julia> writesxmodel("aff.xml", Sa)
julia> writesxmodel("hom.xml", Sh; dictionary=Dict(4 => "u1", 5 => "u2"))

This produces the following files:

<?xml version="1.0" encoding="iso-8859-1"?>
<sspaceex xmlns="http://www-verimag.imag.fr/xml-namespaces/sspaceex" version="0.2" math="SpaceEx">
  <component id="system">
    <param name="x1" type="real" d1="1" d2="1" local="false" dynamics="any" controlled="true" />
    <param name="x2" type="real" d1="1" d2="1" local="false" dynamics="any" controlled="true" />
    <param name="x3" type="real" d1="1" d2="1" local="false" dynamics="any" controlled="true" />
    <location id="1" name="loc1">
      <flow>x1' == 0.43915837231750565 * x1 + 0.4483286897984664 * x2 + 0.324024477623972 * x3 &amp; x2' == 0.6620589735895763 * x1 + 0.889096391101649 * x2 + 0.5049932014226675 * x3 &amp; x3' == 0.1600827251934187 * x1 + 0.023744951662370006 * x2 + 0.8950919706099034 * x3</flow>
    </location>
  </component>
</sspaceex>

<?xml version="1.0" encoding="iso-8859-1"?>
<sspaceex xmlns="http://www-verimag.imag.fr/xml-namespaces/sspaceex" version="0.2" math="SpaceEx">
  <component id="system">
    <param name="x1" type="real" d1="1" d2="1" local="false" dynamics="any" controlled="true" />
    <param name="x2" type="real" d1="1" d2="1" local="false" dynamics="any" controlled="true" />
    <param name="x3" type="real" d1="1" d2="1" local="false" dynamics="any" controlled="true" />
    <param name="u1" type="real" d1="1" d2="1" local="false" dynamics="any" controlled="false" />
    <param name="u2" type="real" d1="1" d2="1" local="false" dynamics="any" controlled="false" />
    <location id="1" name="loc1">
      <flow>x1' == 0.43915837231750565 * x1 + 0.4483286897984664 * x2 + 0.324024477623972 * x3 + 0.8344829421914501 * u1 + 0.590081877236857 * u2 &amp; x2' == 0.6620589735895763 * x1 + 0.889096391101649 * x2 + 0.5049932014226675 * x3 + 0.614399745872499 * u1 + 0.8570267876205178 * u2 &amp; x3' == 0.1600827251934187 * x1 + 0.023744951662370006 * x2 + 0.8950919706099034 * x3 + 0.1347363087333333 * u1 + 0.22919774161141104 * u2</flow>
    </location>
  </component>
</sspaceex>

<?xml version="1.0" encoding="iso-8859-1"?>
<sspaceex xmlns="http://www-verimag.imag.fr/xml-namespaces/sspaceex" version="0.2" math="SpaceEx">
  <component id="system">
    <param name="x1" type="real" d1="1" d2="1" local="false" dynamics="any" controlled="true" />
    <param name="x2" type="real" d1="1" d2="1" local="false" dynamics="any" controlled="true" />
    <param name="x3" type="real" d1="1" d2="1" local="false" dynamics="any" controlled="true" />
    <param name="u1" type="real" d1="1" d2="1" local="false" dynamics="any" controlled="true" />
    <param name="u2" type="real" d1="1" d2="1" local="false" dynamics="any" controlled="true" />
    <location id="1" name="loc1">
      <flow>x1' == 0.43915837231750565 * x1 + 0.4483286897984664 * x2 + 0.324024477623972 * x3 + 0.8344829421914501 * u1 + 0.590081877236857 * u2 &amp; x2' == 0.6620589735895763 * x1 + 0.889096391101649 * x2 + 0.5049932014226675 * x3 + 0.614399745872499 * u1 + 0.8570267876205178 * u2 &amp; x3' == 0.1600827251934187 * x1 + 0.023744951662370006 * x2 + 0.8950919706099034 * x3 + 0.1347363087333333 * u1 + 0.22919774161141104 * u2 &amp; u1' == 0 &amp; u2' == 0</flow>
    </location>
  </component>
</sspaceex>
schillic commented 3 years ago

Constrained system

X = Universe(3)
U = Hyperrectangle(zeros(3), [1., 2, 3])
Sac = @system(x' = A*x + B*u, x ∈ X, u ∈ U);
writesxmodel("con.xml", Sac)

This produces the following file:

<?xml version="1.0" encoding="iso-8859-1"?>
<sspaceex xmlns="http://www-verimag.imag.fr/xml-namespaces/sspaceex" version="0.2" math="SpaceEx">
  <component id="system">
    <param name="x1" type="real" d1="1" d2="1" local="false" dynamics="any" controlled="true" />
    <param name="x2" type="real" d1="1" d2="1" local="false" dynamics="any" controlled="true" />
    <param name="x3" type="real" d1="1" d2="1" local="false" dynamics="any" controlled="true" />
    <param name="u1" type="real" d1="1" d2="1" local="false" dynamics="any" controlled="false" />
    <param name="u2" type="real" d1="1" d2="1" local="false" dynamics="any" controlled="false" />
    <location id="1" name="loc1">
      <invariant>-1.0 &lt;= u1 &amp; u1 &lt;= 1.0 &amp; -2.0 &lt;= u2 &amp; u2 &lt;= 2.0 &amp; -3.0 &lt;= u3 &amp; u3 &lt;= 3.0</invariant>
      <flow>x1' == 0.6942384573505016 * x1 + 0.1838563789076808 * x2 + 0.4021073043133112 * x3 + 0.46201051629653267 * u1 + 0.9849117809204242 * u2 &amp; x2' == 0.7246808221584864 * x1 + 0.460800874480783 * x2 + 0.6807311151289637 * x3 + 0.7944961625931493 * u1 + 0.8774415867742318 * u2 &amp; x3' == 0.35257957729639955 * x1 + 0.620671811847733 * x2 + 0.9424425367343121 * x3 + 0.64989625674327 * u1 + 0.721660380368695 * u2</flow>
    </location>
  </component>
</sspaceex>