From 8fce9ca1e10b89d9cdd16c8ea16c1f74b2829936 Mon Sep 17 00:00:00 2001 From: Chris Rackauckas Date: Sat, 27 Jul 2019 10:08:04 -0400 Subject: [PATCH] move indices to subscripts --- README.md | 19 +++++++++---------- src/utils.jl | 4 +++- src/variables.jl | 17 ++++++++++++++--- 3 files changed, 26 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 845bae279a..d3f1264441 100644 --- a/README.md +++ b/README.md @@ -118,25 +118,24 @@ The `@variables` and `@parameters` macros support this with the following syntax julia> @variables x[1:3]; julia> x 3-element Array{Operation,1}: - x[1]() - x[2]() - x[3]() + x₁() + x₂() + x₃() # support for arbitrary ranges and tensors julia> @variables y[2:3,1:5:6]; julia> y 2×2 Array{Operation,2}: - y[2,1]() y[2,6]() - y[3,1]() y[3,6]() - + y₂̒₁() y₂̒₆() + y₃̒₁() y₃̒₆() # also works for dependent variables julia> @parameters t; @variables z[1:3](t); julia> z 3-element Array{Operation,1}: - z[1](t()) - z[2](t()) - z[3](t()) + z₁(t()) + z₂(t()) + z₃(t()) ``` ## Core Principles @@ -201,7 +200,7 @@ aliased to the given call, allowing implicit use of dependents for convenience. @parameters t α σ(..) β[1:2] @variables w(..) x(t) y() z(t, α, x) -expr = β[1] * x + y^α + σ(3) * (z - t) - β[2] * w(t - 1) +expr = β₁* x + y^α + σ(3) * (z - t) - β₂ * w(t - 1) ``` Note that `@parameters` and `@variables` implicitly add `()` to values that diff --git a/src/utils.jl b/src/utils.jl index 55036a8e0d..ea95696c9c 100644 --- a/src/utils.jl +++ b/src/utils.jl @@ -97,7 +97,9 @@ $(SIGNATURES) Generate `ODESystem`, dependent variables, and parameters from an `ODEProblem`. """ function modelingtoolkitize(prob::DiffEqBase.ODEProblem) - t, = @parameters t; vars = [Variable(Symbol(:x, i))(t) for i in eachindex(prob.u0)]; params = [Variable(Symbol(:α, i); known = true)() for i in eachindex(prob.p)]; + t, = @parameters t; + vars = [Variable(:x, i)(t) for i in eachindex(prob.u0)] + params = [Variable(:α,i; known = true)() for i in eachindex(prob.p)] D, = @derivatives D'~t rhs = [D(var) for var in vars] diff --git a/src/variables.jl b/src/variables.jl index 8d88d8d660..d3de5e68dd 100644 --- a/src/variables.jl +++ b/src/variables.jl @@ -1,5 +1,16 @@ export Variable, @variables, @parameters +const IndexMap = Dict{Int,Char}( + 0 => '₀', + 1 => '₁', + 2 => '₂', + 3 => '₃', + 4 => '₄', + 5 => '₅', + 6 => '₆', + 7 => '₇', + 8 => '₈', + 9 => '₉') """ $(TYPEDEF) @@ -20,7 +31,7 @@ struct Variable <: Function Variable(name; known = false) = new(name, known) end function Variable(name, indices...; known = false) - var_name = Symbol("$name[$(join(indices, ","))]") + var_name = Symbol("$(name)$(join(getindex.((IndexMap,),indices), "̒"))") Variable(var_name; known=known) end @@ -113,7 +124,7 @@ end function _construct_var(var_name, known, call_args) if call_args === nothing :(Variable($(Meta.quot(var_name)); known = $known)()) - elseif call_args[end] == :.. + elseif !isempty(call_args) && call_args[end] == :.. :(Variable($(Meta.quot(var_name)); known = $known)) else :(Variable($(Meta.quot(var_name)); known = $known)($(call_args...))) @@ -123,7 +134,7 @@ end function _construct_var(var_name, known, call_args, ind) if call_args === nothing :(Variable($(Meta.quot(var_name)), $ind...; known = $known)()) - elseif call_args[end] == :.. + elseif !isempty(call_args) && call_args[end] == :.. :(Variable($(Meta.quot(var_name)), $ind...; known = $known)) else :(Variable($(Meta.quot(var_name)), $ind...; known = $known)($(call_args...)))