{-# OPTIONS_GHC -fno-warn-redundant-constraints #-}
module Language.Drasil.Expr.Class (
ExprC(..),
frac, recip_,
square, half,
oneHalf, oneThird,
apply1, apply2
) where
import Prelude hiding (sqrt, log, sin, cos, tan, exp)
import Control.Lens ((^.))
import Language.Drasil.Symbol
import Language.Drasil.Expr.Lang
import Language.Drasil.Literal.Lang
import Language.Drasil.Space (DomainDesc(..), RTopology(..), RealInterval)
import Language.Drasil.Classes (IsArgumentName)
import qualified Language.Drasil.ModelExpr.Lang as M
import Language.Drasil.Literal.Class (LiteralC(..))
import Language.Drasil.UID (HasUID(..))
frac :: (ExprC r, LiteralC r) => Integer -> Integer -> r
frac :: Integer -> Integer -> r
frac n :: Integer
n d :: Integer
d = Integer -> r
forall r. LiteralC r => Integer -> r
exactDbl Integer
n r -> r -> r
forall r. ExprC r => r -> r -> r
$/ Integer -> r
forall r. LiteralC r => Integer -> r
exactDbl Integer
d
recip_ :: (ExprC r, LiteralC r) => r -> r
recip_ :: r -> r
recip_ denom :: r
denom = Integer -> r
forall r. LiteralC r => Integer -> r
exactDbl 1 r -> r -> r
forall r. ExprC r => r -> r -> r
$/ r
denom
square :: (ExprC r, LiteralC r) => r -> r
square :: r -> r
square x :: r
x = r
x r -> r -> r
forall r. ExprC r => r -> r -> r
$^ Integer -> r
forall r. LiteralC r => Integer -> r
exactDbl 2
half :: (ExprC r, LiteralC r) => r -> r
half :: r -> r
half x :: r
x = r
x r -> r -> r
forall r. ExprC r => r -> r -> r
$/ Integer -> r
forall r. LiteralC r => Integer -> r
exactDbl 2
oneHalf :: (ExprC r, LiteralC r) => r
oneHalf :: r
oneHalf = Integer -> Integer -> r
forall r. (ExprC r, LiteralC r) => Integer -> Integer -> r
frac 1 2
oneThird :: (ExprC r, LiteralC r) => r
oneThird :: r
oneThird = Integer -> Integer -> r
forall r. (ExprC r, LiteralC r) => Integer -> Integer -> r
frac 1 3
apply1 :: (ExprC r, HasUID f, HasSymbol f, HasUID a, HasSymbol a) => f -> a -> r
apply1 :: f -> a -> r
apply1 f :: f
f a :: a
a = f -> [r] -> r
forall r f. (ExprC r, HasUID f, HasSymbol f) => f -> [r] -> r
apply f
f [a -> r
forall r c. (ExprC r, HasUID c, HasSymbol c) => c -> r
sy a
a]
apply2 :: (ExprC r, HasUID f, HasSymbol f, HasUID a, HasSymbol a, HasUID b, HasSymbol b)
=> f -> a -> b -> r
apply2 :: f -> a -> b -> r
apply2 f :: f
f a :: a
a b :: b
b = f -> [r] -> r
forall r f. (ExprC r, HasUID f, HasSymbol f) => f -> [r] -> r
apply f
f [a -> r
forall r c. (ExprC r, HasUID c, HasSymbol c) => c -> r
sy a
a, b -> r
forall r c. (ExprC r, HasUID c, HasSymbol c) => c -> r
sy b
b]
class ExprC r where
infixr 8 $^
infixl 7 $/
infixr 4 $=
infixr 9 $&&
infixr 9 $||
lit :: Literal -> r
($=), ($!=) :: r -> r -> r
($<), ($>), ($<=), ($>=) :: r -> r -> r
($.) :: r -> r -> r
addI :: r -> r -> r
addRe :: r -> r -> r
mulI :: r -> r -> r
mulRe :: r -> r -> r
($-), ($/), ($^) :: r -> r -> r
($=>), ($<=>) :: r -> r -> r
($&&), ($||) :: r -> r -> r
abs_ :: r -> r
neg :: r -> r
log :: r -> r
ln :: r -> r
sqrt :: r -> r
sin :: r -> r
cos :: r -> r
tan :: r -> r
sec :: r -> r
csc :: r -> r
cot :: r -> r
arcsin :: r -> r
arccos :: r -> r
arctan :: r -> r
exp :: r -> r
dim :: r -> r
norm :: r -> r
negVec :: r -> r
not_ :: r -> r
idx :: r -> r -> r
defint, defsum, defprod :: Symbol -> r -> r -> r -> r
realInterval :: HasUID c => c -> RealInterval r r -> r
euclidean :: [r] -> r
cross :: r -> r -> r
completeCase :: [(r, r)] -> r
incompleteCase :: [(r, r)] -> r
matrix :: [[r]] -> r
m2x2 :: r -> r -> r -> r -> r
vec2D :: r -> r -> r
dgnl2x2 :: r -> r -> r
apply :: (HasUID f, HasSymbol f) => f -> [r] -> r
applyWithNamedArgs :: (HasUID f, HasSymbol f, HasUID a, IsArgumentName a) => f
-> [r] -> [(a, r)] -> r
sy :: (HasUID c, HasSymbol c) => c -> r
instance ExprC Expr where
lit :: Literal -> Expr
lit = Literal -> Expr
Lit
$= :: Expr -> Expr -> Expr
($=) = EqBinOp -> Expr -> Expr -> Expr
EqBinaryOp EqBinOp
Eq
$!= :: Expr -> Expr -> Expr
($!=) = EqBinOp -> Expr -> Expr -> Expr
EqBinaryOp EqBinOp
NEq
$< :: Expr -> Expr -> Expr
($<) = OrdBinOp -> Expr -> Expr -> Expr
OrdBinaryOp OrdBinOp
Lt
$> :: Expr -> Expr -> Expr
($>) = OrdBinOp -> Expr -> Expr -> Expr
OrdBinaryOp OrdBinOp
Gt
$<= :: Expr -> Expr -> Expr
($<=) = OrdBinOp -> Expr -> Expr -> Expr
OrdBinaryOp OrdBinOp
LEq
$>= :: Expr -> Expr -> Expr
($>=) = OrdBinOp -> Expr -> Expr -> Expr
OrdBinaryOp OrdBinOp
GEq
$. :: Expr -> Expr -> Expr
($.) = VVNBinOp -> Expr -> Expr -> Expr
VVNBinaryOp VVNBinOp
Dot
addI :: Expr -> Expr -> Expr
addI l :: Expr
l (Lit (Int 0)) = Expr
l
addI (Lit (Int 0)) r :: Expr
r = Expr
r
addI (AssocA AddI l :: [Expr]
l) (AssocA AddI r :: [Expr]
r) = AssocArithOper -> [Expr] -> Expr
AssocA AssocArithOper
AddI ([Expr]
l [Expr] -> [Expr] -> [Expr]
forall a. [a] -> [a] -> [a]
++ [Expr]
r)
addI (AssocA AddI l :: [Expr]
l) r :: Expr
r = AssocArithOper -> [Expr] -> Expr
AssocA AssocArithOper
AddI ([Expr]
l [Expr] -> [Expr] -> [Expr]
forall a. [a] -> [a] -> [a]
++ [Expr
r])
addI l :: Expr
l (AssocA AddI r :: [Expr]
r) = AssocArithOper -> [Expr] -> Expr
AssocA AssocArithOper
AddI (Expr
l Expr -> [Expr] -> [Expr]
forall a. a -> [a] -> [a]
: [Expr]
r)
addI l :: Expr
l r :: Expr
r = AssocArithOper -> [Expr] -> Expr
AssocA AssocArithOper
AddI [Expr
l, Expr
r]
addRe :: Expr -> Expr -> Expr
addRe l :: Expr
l (Lit (Dbl 0))= Expr
l
addRe (Lit(Dbl 0)) r :: Expr
r = Expr
r
addRe l :: Expr
l (Lit (ExactDbl 0)) = Expr
l
addRe (Lit (ExactDbl 0)) r :: Expr
r = Expr
r
addRe (AssocA AddRe l :: [Expr]
l) (AssocA AddRe r :: [Expr]
r) = AssocArithOper -> [Expr] -> Expr
AssocA AssocArithOper
AddRe ([Expr]
l [Expr] -> [Expr] -> [Expr]
forall a. [a] -> [a] -> [a]
++ [Expr]
r)
addRe (AssocA AddRe l :: [Expr]
l) r :: Expr
r = AssocArithOper -> [Expr] -> Expr
AssocA AssocArithOper
AddRe ([Expr]
l [Expr] -> [Expr] -> [Expr]
forall a. [a] -> [a] -> [a]
++ [Expr
r])
addRe l :: Expr
l (AssocA AddRe r :: [Expr]
r) = AssocArithOper -> [Expr] -> Expr
AssocA AssocArithOper
AddRe (Expr
l Expr -> [Expr] -> [Expr]
forall a. a -> [a] -> [a]
: [Expr]
r)
addRe l :: Expr
l r :: Expr
r = AssocArithOper -> [Expr] -> Expr
AssocA AssocArithOper
AddRe [Expr
l, Expr
r]
mulI :: Expr -> Expr -> Expr
mulI l :: Expr
l (Lit (Int 1)) = Expr
l
mulI (Lit (Int 1)) r :: Expr
r = Expr
r
mulI (AssocA MulI l :: [Expr]
l) (AssocA MulI r :: [Expr]
r) = AssocArithOper -> [Expr] -> Expr
AssocA AssocArithOper
MulI ([Expr]
l [Expr] -> [Expr] -> [Expr]
forall a. [a] -> [a] -> [a]
++ [Expr]
r)
mulI (AssocA MulI l :: [Expr]
l) r :: Expr
r = AssocArithOper -> [Expr] -> Expr
AssocA AssocArithOper
MulI ([Expr]
l [Expr] -> [Expr] -> [Expr]
forall a. [a] -> [a] -> [a]
++ [Expr
r])
mulI l :: Expr
l (AssocA MulI r :: [Expr]
r) = AssocArithOper -> [Expr] -> Expr
AssocA AssocArithOper
MulI (Expr
l Expr -> [Expr] -> [Expr]
forall a. a -> [a] -> [a]
: [Expr]
r)
mulI l :: Expr
l r :: Expr
r = AssocArithOper -> [Expr] -> Expr
AssocA AssocArithOper
MulI [Expr
l, Expr
r]
mulRe :: Expr -> Expr -> Expr
mulRe l :: Expr
l (Lit (Dbl 1)) = Expr
l
mulRe (Lit (Dbl 1)) r :: Expr
r = Expr
r
mulRe l :: Expr
l (Lit (ExactDbl 1)) = Expr
l
mulRe (Lit (ExactDbl 1)) r :: Expr
r = Expr
r
mulRe (AssocA MulRe l :: [Expr]
l) (AssocA MulRe r :: [Expr]
r) = AssocArithOper -> [Expr] -> Expr
AssocA AssocArithOper
MulRe ([Expr]
l [Expr] -> [Expr] -> [Expr]
forall a. [a] -> [a] -> [a]
++ [Expr]
r)
mulRe (AssocA MulRe l :: [Expr]
l) r :: Expr
r = AssocArithOper -> [Expr] -> Expr
AssocA AssocArithOper
MulRe ([Expr]
l [Expr] -> [Expr] -> [Expr]
forall a. [a] -> [a] -> [a]
++ [Expr
r])
mulRe l :: Expr
l (AssocA MulRe r :: [Expr]
r) = AssocArithOper -> [Expr] -> Expr
AssocA AssocArithOper
MulRe (Expr
l Expr -> [Expr] -> [Expr]
forall a. a -> [a] -> [a]
: [Expr]
r)
mulRe l :: Expr
l r :: Expr
r = AssocArithOper -> [Expr] -> Expr
AssocA AssocArithOper
MulRe [Expr
l, Expr
r]
$- :: Expr -> Expr -> Expr
($-) = ArithBinOp -> Expr -> Expr -> Expr
ArithBinaryOp ArithBinOp
Subt
$/ :: Expr -> Expr -> Expr
($/) = ArithBinOp -> Expr -> Expr -> Expr
ArithBinaryOp ArithBinOp
Frac
$^ :: Expr -> Expr -> Expr
($^) = ArithBinOp -> Expr -> Expr -> Expr
ArithBinaryOp ArithBinOp
Pow
$=> :: Expr -> Expr -> Expr
($=>) = BoolBinOp -> Expr -> Expr -> Expr
BoolBinaryOp BoolBinOp
Impl
$<=> :: Expr -> Expr -> Expr
($<=>) = BoolBinOp -> Expr -> Expr -> Expr
BoolBinaryOp BoolBinOp
Iff
a :: Expr
a $&& :: Expr -> Expr -> Expr
$&& b :: Expr
b = AssocBoolOper -> [Expr] -> Expr
AssocB AssocBoolOper
And [Expr
a, Expr
b]
a :: Expr
a $|| :: Expr -> Expr -> Expr
$|| b :: Expr
b = AssocBoolOper -> [Expr] -> Expr
AssocB AssocBoolOper
Or [Expr
a, Expr
b]
abs_ :: Expr -> Expr
abs_ = UFunc -> Expr -> Expr
UnaryOp UFunc
Abs
neg :: Expr -> Expr
neg = UFunc -> Expr -> Expr
UnaryOp UFunc
Neg
log :: Expr -> Expr
log = UFunc -> Expr -> Expr
UnaryOp UFunc
Log
ln :: Expr -> Expr
ln = UFunc -> Expr -> Expr
UnaryOp UFunc
Ln
sqrt :: Expr -> Expr
sqrt = UFunc -> Expr -> Expr
UnaryOp UFunc
Sqrt
sin :: Expr -> Expr
sin = UFunc -> Expr -> Expr
UnaryOp UFunc
Sin
cos :: Expr -> Expr
cos = UFunc -> Expr -> Expr
UnaryOp UFunc
Cos
tan :: Expr -> Expr
tan = UFunc -> Expr -> Expr
UnaryOp UFunc
Tan
sec :: Expr -> Expr
sec = UFunc -> Expr -> Expr
UnaryOp UFunc
Sec
csc :: Expr -> Expr
csc = UFunc -> Expr -> Expr
UnaryOp UFunc
Csc
cot :: Expr -> Expr
cot = UFunc -> Expr -> Expr
UnaryOp UFunc
Cot
arcsin :: Expr -> Expr
arcsin = UFunc -> Expr -> Expr
UnaryOp UFunc
Arcsin
arccos :: Expr -> Expr
arccos = UFunc -> Expr -> Expr
UnaryOp UFunc
Arccos
arctan :: Expr -> Expr
arctan = UFunc -> Expr -> Expr
UnaryOp UFunc
Arctan
exp :: Expr -> Expr
exp = UFunc -> Expr -> Expr
UnaryOp UFunc
Exp
dim :: Expr -> Expr
dim = UFuncVN -> Expr -> Expr
UnaryOpVN UFuncVN
Dim
norm :: Expr -> Expr
norm = UFuncVN -> Expr -> Expr
UnaryOpVN UFuncVN
Norm
negVec :: Expr -> Expr
negVec = UFuncVV -> Expr -> Expr
UnaryOpVV UFuncVV
NegV
not_ :: Expr -> Expr
not_ = UFuncB -> Expr -> Expr
UnaryOpB UFuncB
Not
idx :: Expr -> Expr -> Expr
idx = LABinOp -> Expr -> Expr -> Expr
LABinaryOp LABinOp
Index
defint :: Symbol -> Expr -> Expr -> Expr -> Expr
defint v :: Symbol
v low :: Expr
low high :: Expr
high = AssocArithOper -> DiscreteDomainDesc Expr Expr -> Expr -> Expr
Operator AssocArithOper
AddRe (Symbol -> RTopology -> Expr -> Expr -> DiscreteDomainDesc Expr Expr
forall a b.
Symbol -> RTopology -> a -> b -> DomainDesc 'Discrete a b
BoundedDD Symbol
v RTopology
Continuous Expr
low Expr
high)
defsum :: Symbol -> Expr -> Expr -> Expr -> Expr
defsum v :: Symbol
v low :: Expr
low high :: Expr
high = AssocArithOper -> DiscreteDomainDesc Expr Expr -> Expr -> Expr
Operator AssocArithOper
AddRe (Symbol -> RTopology -> Expr -> Expr -> DiscreteDomainDesc Expr Expr
forall a b.
Symbol -> RTopology -> a -> b -> DomainDesc 'Discrete a b
BoundedDD Symbol
v RTopology
Discrete Expr
low Expr
high)
defprod :: Symbol -> Expr -> Expr -> Expr -> Expr
defprod v :: Symbol
v low :: Expr
low high :: Expr
high = AssocArithOper -> DiscreteDomainDesc Expr Expr -> Expr -> Expr
Operator AssocArithOper
MulRe (Symbol -> RTopology -> Expr -> Expr -> DiscreteDomainDesc Expr Expr
forall a b.
Symbol -> RTopology -> a -> b -> DomainDesc 'Discrete a b
BoundedDD Symbol
v RTopology
Discrete Expr
low Expr
high)
realInterval :: c -> RealInterval Expr Expr -> Expr
realInterval c :: c
c = UID -> RealInterval Expr Expr -> Expr
RealI (c
c c -> Getting UID c UID -> UID
forall s a. s -> Getting a s a -> a
^. Getting UID c UID
forall c. HasUID c => Lens' c UID
uid)
euclidean :: [Expr] -> Expr
euclidean = Expr -> Expr
forall r. ExprC r => r -> r
sqrt (Expr -> Expr) -> ([Expr] -> Expr) -> [Expr] -> Expr
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Expr -> Expr -> Expr) -> [Expr] -> Expr
forall (t :: * -> *) a. Foldable t => (a -> a -> a) -> t a -> a
foldr1 Expr -> Expr -> Expr
forall r. ExprC r => r -> r -> r
addRe ([Expr] -> Expr) -> ([Expr] -> [Expr]) -> [Expr] -> Expr
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Expr -> Expr) -> [Expr] -> [Expr]
forall a b. (a -> b) -> [a] -> [b]
map Expr -> Expr
forall r. (ExprC r, LiteralC r) => r -> r
square
cross :: Expr -> Expr -> Expr
cross = VVVBinOp -> Expr -> Expr -> Expr
VVVBinaryOp VVVBinOp
Cross
completeCase :: [(Expr, Expr)] -> Expr
completeCase = Completeness -> [(Expr, Expr)] -> Expr
Case Completeness
Complete
incompleteCase :: [(Expr, Expr)] -> Expr
incompleteCase = Completeness -> [(Expr, Expr)] -> Expr
Case Completeness
Incomplete
matrix :: [[Expr]] -> Expr
matrix = [[Expr]] -> Expr
Matrix
m2x2 :: Expr -> Expr -> Expr -> Expr -> Expr
m2x2 a :: Expr
a b :: Expr
b c :: Expr
c d :: Expr
d = [[Expr]] -> Expr
forall r. ExprC r => [[r]] -> r
matrix [[Expr
a,Expr
b],[Expr
c,Expr
d]]
vec2D :: Expr -> Expr -> Expr
vec2D a :: Expr
a b :: Expr
b = [[Expr]] -> Expr
forall r. ExprC r => [[r]] -> r
matrix [[Expr
a],[Expr
b]]
dgnl2x2 :: Expr -> Expr -> Expr
dgnl2x2 a :: Expr
a = Expr -> Expr -> Expr -> Expr -> Expr
forall r. ExprC r => r -> r -> r -> r -> r
m2x2 Expr
a (Integer -> Expr
forall r. LiteralC r => Integer -> r
int 0) (Integer -> Expr
forall r. LiteralC r => Integer -> r
int 0)
apply :: f -> [Expr] -> Expr
apply f :: f
f ps :: [Expr]
ps = UID -> [Expr] -> [(UID, Expr)] -> Expr
FCall (f
f f -> Getting UID f UID -> UID
forall s a. s -> Getting a s a -> a
^. Getting UID f UID
forall c. HasUID c => Lens' c UID
uid) [Expr]
ps []
applyWithNamedArgs :: f -> [Expr] -> [(a, Expr)] -> Expr
applyWithNamedArgs f :: f
f ps :: [Expr]
ps ns :: [(a, Expr)]
ns = UID -> [Expr] -> [(UID, Expr)] -> Expr
FCall (f
f f -> Getting UID f UID -> UID
forall s a. s -> Getting a s a -> a
^. Getting UID f UID
forall c. HasUID c => Lens' c UID
uid) [Expr]
ps ([UID] -> [Expr] -> [(UID, Expr)]
forall a b. [a] -> [b] -> [(a, b)]
zip (((a, Expr) -> UID) -> [(a, Expr)] -> [UID]
forall a b. (a -> b) -> [a] -> [b]
map ((a -> Getting UID a UID -> UID
forall s a. s -> Getting a s a -> a
^. Getting UID a UID
forall c. HasUID c => Lens' c UID
uid) (a -> UID) -> ((a, Expr) -> a) -> (a, Expr) -> UID
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a, Expr) -> a
forall a b. (a, b) -> a
fst) [(a, Expr)]
ns)
(((a, Expr) -> Expr) -> [(a, Expr)] -> [Expr]
forall a b. (a -> b) -> [a] -> [b]
map (a, Expr) -> Expr
forall a b. (a, b) -> b
snd [(a, Expr)]
ns))
sy :: c -> Expr
sy x :: c
x = UID -> Expr
C (c
x c -> Getting UID c UID -> UID
forall s a. s -> Getting a s a -> a
^. Getting UID c UID
forall c. HasUID c => Lens' c UID
uid)
instance ExprC M.ModelExpr where
lit :: Literal -> ModelExpr
lit = Literal -> ModelExpr
M.Lit
$= :: ModelExpr -> ModelExpr -> ModelExpr
($=) = EqBinOp -> ModelExpr -> ModelExpr -> ModelExpr
M.EqBinaryOp EqBinOp
M.Eq
$!= :: ModelExpr -> ModelExpr -> ModelExpr
($!=) = EqBinOp -> ModelExpr -> ModelExpr -> ModelExpr
M.EqBinaryOp EqBinOp
M.NEq
$< :: ModelExpr -> ModelExpr -> ModelExpr
($<) = OrdBinOp -> ModelExpr -> ModelExpr -> ModelExpr
M.OrdBinaryOp OrdBinOp
M.Lt
$> :: ModelExpr -> ModelExpr -> ModelExpr
($>) = OrdBinOp -> ModelExpr -> ModelExpr -> ModelExpr
M.OrdBinaryOp OrdBinOp
M.Gt
$<= :: ModelExpr -> ModelExpr -> ModelExpr
($<=) = OrdBinOp -> ModelExpr -> ModelExpr -> ModelExpr
M.OrdBinaryOp OrdBinOp
M.LEq
$>= :: ModelExpr -> ModelExpr -> ModelExpr
($>=) = OrdBinOp -> ModelExpr -> ModelExpr -> ModelExpr
M.OrdBinaryOp OrdBinOp
M.GEq
$. :: ModelExpr -> ModelExpr -> ModelExpr
($.) = VVNBinOp -> ModelExpr -> ModelExpr -> ModelExpr
M.VVNBinaryOp VVNBinOp
M.Dot
addI :: ModelExpr -> ModelExpr -> ModelExpr
addI l :: ModelExpr
l (M.Lit (Int 0)) = ModelExpr
l
addI (M.Lit (Int 0)) r :: ModelExpr
r = ModelExpr
r
addI (M.AssocA M.AddI l :: [ModelExpr]
l) (M.AssocA M.AddI r :: [ModelExpr]
r) = AssocArithOper -> [ModelExpr] -> ModelExpr
M.AssocA AssocArithOper
M.AddI ([ModelExpr]
l [ModelExpr] -> [ModelExpr] -> [ModelExpr]
forall a. [a] -> [a] -> [a]
++ [ModelExpr]
r)
addI (M.AssocA M.AddI l :: [ModelExpr]
l) r :: ModelExpr
r = AssocArithOper -> [ModelExpr] -> ModelExpr
M.AssocA AssocArithOper
M.AddI ([ModelExpr]
l [ModelExpr] -> [ModelExpr] -> [ModelExpr]
forall a. [a] -> [a] -> [a]
++ [ModelExpr
r])
addI l :: ModelExpr
l (M.AssocA M.AddI r :: [ModelExpr]
r) = AssocArithOper -> [ModelExpr] -> ModelExpr
M.AssocA AssocArithOper
M.AddI (ModelExpr
l ModelExpr -> [ModelExpr] -> [ModelExpr]
forall a. a -> [a] -> [a]
: [ModelExpr]
r)
addI l :: ModelExpr
l r :: ModelExpr
r = AssocArithOper -> [ModelExpr] -> ModelExpr
M.AssocA AssocArithOper
M.AddI [ModelExpr
l, ModelExpr
r]
addRe :: ModelExpr -> ModelExpr -> ModelExpr
addRe l :: ModelExpr
l (M.Lit (Dbl 0)) = ModelExpr
l
addRe (M.Lit (Dbl 0)) r :: ModelExpr
r = ModelExpr
r
addRe l :: ModelExpr
l (M.Lit (ExactDbl 0)) = ModelExpr
l
addRe (M.Lit (ExactDbl 0)) r :: ModelExpr
r = ModelExpr
r
addRe (M.AssocA M.AddRe l :: [ModelExpr]
l) (M.AssocA M.AddRe r :: [ModelExpr]
r) = AssocArithOper -> [ModelExpr] -> ModelExpr
M.AssocA AssocArithOper
M.AddRe ([ModelExpr]
l [ModelExpr] -> [ModelExpr] -> [ModelExpr]
forall a. [a] -> [a] -> [a]
++ [ModelExpr]
r)
addRe (M.AssocA M.AddRe l :: [ModelExpr]
l) r :: ModelExpr
r = AssocArithOper -> [ModelExpr] -> ModelExpr
M.AssocA AssocArithOper
M.AddRe ([ModelExpr]
l [ModelExpr] -> [ModelExpr] -> [ModelExpr]
forall a. [a] -> [a] -> [a]
++ [ModelExpr
r])
addRe l :: ModelExpr
l (M.AssocA M.AddRe r :: [ModelExpr]
r) = AssocArithOper -> [ModelExpr] -> ModelExpr
M.AssocA AssocArithOper
M.AddRe (ModelExpr
l ModelExpr -> [ModelExpr] -> [ModelExpr]
forall a. a -> [a] -> [a]
: [ModelExpr]
r)
addRe l :: ModelExpr
l r :: ModelExpr
r = AssocArithOper -> [ModelExpr] -> ModelExpr
M.AssocA AssocArithOper
M.AddRe [ModelExpr
l, ModelExpr
r]
mulI :: ModelExpr -> ModelExpr -> ModelExpr
mulI l :: ModelExpr
l (M.Lit (Int 1)) = ModelExpr
l
mulI (M.Lit (Int 1)) r :: ModelExpr
r = ModelExpr
r
mulI (M.AssocA M.MulI l :: [ModelExpr]
l) (M.AssocA M.MulI r :: [ModelExpr]
r) = AssocArithOper -> [ModelExpr] -> ModelExpr
M.AssocA AssocArithOper
M.MulI ([ModelExpr]
l [ModelExpr] -> [ModelExpr] -> [ModelExpr]
forall a. [a] -> [a] -> [a]
++ [ModelExpr]
r)
mulI (M.AssocA M.MulI l :: [ModelExpr]
l) r :: ModelExpr
r = AssocArithOper -> [ModelExpr] -> ModelExpr
M.AssocA AssocArithOper
M.MulI ([ModelExpr]
l [ModelExpr] -> [ModelExpr] -> [ModelExpr]
forall a. [a] -> [a] -> [a]
++ [ModelExpr
r])
mulI l :: ModelExpr
l (M.AssocA M.MulI r :: [ModelExpr]
r) = AssocArithOper -> [ModelExpr] -> ModelExpr
M.AssocA AssocArithOper
M.MulI (ModelExpr
l ModelExpr -> [ModelExpr] -> [ModelExpr]
forall a. a -> [a] -> [a]
: [ModelExpr]
r)
mulI l :: ModelExpr
l r :: ModelExpr
r = AssocArithOper -> [ModelExpr] -> ModelExpr
M.AssocA AssocArithOper
M.MulI [ModelExpr
l, ModelExpr
r]
mulRe :: ModelExpr -> ModelExpr -> ModelExpr
mulRe l :: ModelExpr
l (M.Lit (Dbl 1)) = ModelExpr
l
mulRe (M.Lit (Dbl 1)) r :: ModelExpr
r = ModelExpr
r
mulRe l :: ModelExpr
l (M.Lit (ExactDbl 1)) = ModelExpr
l
mulRe (M.Lit (ExactDbl 1)) r :: ModelExpr
r = ModelExpr
r
mulRe (M.AssocA M.MulRe l :: [ModelExpr]
l) (M.AssocA M.MulRe r :: [ModelExpr]
r) = AssocArithOper -> [ModelExpr] -> ModelExpr
M.AssocA AssocArithOper
M.MulRe ([ModelExpr]
l [ModelExpr] -> [ModelExpr] -> [ModelExpr]
forall a. [a] -> [a] -> [a]
++ [ModelExpr]
r)
mulRe (M.AssocA M.MulRe l :: [ModelExpr]
l) r :: ModelExpr
r = AssocArithOper -> [ModelExpr] -> ModelExpr
M.AssocA AssocArithOper
M.MulRe ([ModelExpr]
l [ModelExpr] -> [ModelExpr] -> [ModelExpr]
forall a. [a] -> [a] -> [a]
++ [ModelExpr
r])
mulRe l :: ModelExpr
l (M.AssocA M.MulRe r :: [ModelExpr]
r) = AssocArithOper -> [ModelExpr] -> ModelExpr
M.AssocA AssocArithOper
M.MulRe (ModelExpr
l ModelExpr -> [ModelExpr] -> [ModelExpr]
forall a. a -> [a] -> [a]
: [ModelExpr]
r)
mulRe l :: ModelExpr
l r :: ModelExpr
r = AssocArithOper -> [ModelExpr] -> ModelExpr
M.AssocA AssocArithOper
M.MulRe [ModelExpr
l, ModelExpr
r]
$- :: ModelExpr -> ModelExpr -> ModelExpr
($-) = ArithBinOp -> ModelExpr -> ModelExpr -> ModelExpr
M.ArithBinaryOp ArithBinOp
M.Subt
$/ :: ModelExpr -> ModelExpr -> ModelExpr
($/) = ArithBinOp -> ModelExpr -> ModelExpr -> ModelExpr
M.ArithBinaryOp ArithBinOp
M.Frac
$^ :: ModelExpr -> ModelExpr -> ModelExpr
($^) = ArithBinOp -> ModelExpr -> ModelExpr -> ModelExpr
M.ArithBinaryOp ArithBinOp
M.Pow
$=> :: ModelExpr -> ModelExpr -> ModelExpr
($=>) = BoolBinOp -> ModelExpr -> ModelExpr -> ModelExpr
M.BoolBinaryOp BoolBinOp
M.Impl
$<=> :: ModelExpr -> ModelExpr -> ModelExpr
($<=>) = BoolBinOp -> ModelExpr -> ModelExpr -> ModelExpr
M.BoolBinaryOp BoolBinOp
M.Iff
a :: ModelExpr
a $&& :: ModelExpr -> ModelExpr -> ModelExpr
$&& b :: ModelExpr
b = AssocBoolOper -> [ModelExpr] -> ModelExpr
M.AssocB AssocBoolOper
M.And [ModelExpr
a, ModelExpr
b]
a :: ModelExpr
a $|| :: ModelExpr -> ModelExpr -> ModelExpr
$|| b :: ModelExpr
b = AssocBoolOper -> [ModelExpr] -> ModelExpr
M.AssocB AssocBoolOper
M.Or [ModelExpr
a, ModelExpr
b]
abs_ :: ModelExpr -> ModelExpr
abs_ = UFunc -> ModelExpr -> ModelExpr
M.UnaryOp UFunc
M.Abs
neg :: ModelExpr -> ModelExpr
neg = UFunc -> ModelExpr -> ModelExpr
M.UnaryOp UFunc
M.Neg
log :: ModelExpr -> ModelExpr
log = UFunc -> ModelExpr -> ModelExpr
M.UnaryOp UFunc
M.Log
ln :: ModelExpr -> ModelExpr
ln = UFunc -> ModelExpr -> ModelExpr
M.UnaryOp UFunc
M.Ln
sqrt :: ModelExpr -> ModelExpr
sqrt = UFunc -> ModelExpr -> ModelExpr
M.UnaryOp UFunc
M.Sqrt
sin :: ModelExpr -> ModelExpr
sin = UFunc -> ModelExpr -> ModelExpr
M.UnaryOp UFunc
M.Sin
cos :: ModelExpr -> ModelExpr
cos = UFunc -> ModelExpr -> ModelExpr
M.UnaryOp UFunc
M.Cos
tan :: ModelExpr -> ModelExpr
tan = UFunc -> ModelExpr -> ModelExpr
M.UnaryOp UFunc
M.Tan
sec :: ModelExpr -> ModelExpr
sec = UFunc -> ModelExpr -> ModelExpr
M.UnaryOp UFunc
M.Sec
csc :: ModelExpr -> ModelExpr
csc = UFunc -> ModelExpr -> ModelExpr
M.UnaryOp UFunc
M.Csc
cot :: ModelExpr -> ModelExpr
cot = UFunc -> ModelExpr -> ModelExpr
M.UnaryOp UFunc
M.Cot
arcsin :: ModelExpr -> ModelExpr
arcsin = UFunc -> ModelExpr -> ModelExpr
M.UnaryOp UFunc
M.Arcsin
arccos :: ModelExpr -> ModelExpr
arccos = UFunc -> ModelExpr -> ModelExpr
M.UnaryOp UFunc
M.Arccos
arctan :: ModelExpr -> ModelExpr
arctan = UFunc -> ModelExpr -> ModelExpr
M.UnaryOp UFunc
M.Arctan
exp :: ModelExpr -> ModelExpr
exp = UFunc -> ModelExpr -> ModelExpr
M.UnaryOp UFunc
M.Exp
dim :: ModelExpr -> ModelExpr
dim = UFuncVN -> ModelExpr -> ModelExpr
M.UnaryOpVN UFuncVN
M.Dim
norm :: ModelExpr -> ModelExpr
norm = UFuncVN -> ModelExpr -> ModelExpr
M.UnaryOpVN UFuncVN
M.Norm
negVec :: ModelExpr -> ModelExpr
negVec = UFuncVV -> ModelExpr -> ModelExpr
M.UnaryOpVV UFuncVV
M.NegV
not_ :: ModelExpr -> ModelExpr
not_ = UFuncB -> ModelExpr -> ModelExpr
M.UnaryOpB UFuncB
M.Not
idx :: ModelExpr -> ModelExpr -> ModelExpr
idx = LABinOp -> ModelExpr -> ModelExpr -> ModelExpr
M.LABinaryOp LABinOp
M.Index
defint :: Symbol -> ModelExpr -> ModelExpr -> ModelExpr -> ModelExpr
defint v :: Symbol
v low :: ModelExpr
low high :: ModelExpr
high = AssocArithOper
-> DomainDesc 'Discrete ModelExpr ModelExpr
-> ModelExpr
-> ModelExpr
forall (t :: RTopology).
AssocArithOper
-> DomainDesc t ModelExpr ModelExpr -> ModelExpr -> ModelExpr
M.Operator AssocArithOper
M.AddRe (Symbol
-> RTopology
-> ModelExpr
-> ModelExpr
-> DomainDesc 'Discrete ModelExpr ModelExpr
forall a b.
Symbol -> RTopology -> a -> b -> DomainDesc 'Discrete a b
BoundedDD Symbol
v RTopology
Continuous ModelExpr
low ModelExpr
high)
defsum :: Symbol -> ModelExpr -> ModelExpr -> ModelExpr -> ModelExpr
defsum v :: Symbol
v low :: ModelExpr
low high :: ModelExpr
high = AssocArithOper
-> DomainDesc 'Discrete ModelExpr ModelExpr
-> ModelExpr
-> ModelExpr
forall (t :: RTopology).
AssocArithOper
-> DomainDesc t ModelExpr ModelExpr -> ModelExpr -> ModelExpr
M.Operator AssocArithOper
M.AddRe (Symbol
-> RTopology
-> ModelExpr
-> ModelExpr
-> DomainDesc 'Discrete ModelExpr ModelExpr
forall a b.
Symbol -> RTopology -> a -> b -> DomainDesc 'Discrete a b
BoundedDD Symbol
v RTopology
Discrete ModelExpr
low ModelExpr
high)
defprod :: Symbol -> ModelExpr -> ModelExpr -> ModelExpr -> ModelExpr
defprod v :: Symbol
v low :: ModelExpr
low high :: ModelExpr
high = AssocArithOper
-> DomainDesc 'Discrete ModelExpr ModelExpr
-> ModelExpr
-> ModelExpr
forall (t :: RTopology).
AssocArithOper
-> DomainDesc t ModelExpr ModelExpr -> ModelExpr -> ModelExpr
M.Operator AssocArithOper
M.MulRe (Symbol
-> RTopology
-> ModelExpr
-> ModelExpr
-> DomainDesc 'Discrete ModelExpr ModelExpr
forall a b.
Symbol -> RTopology -> a -> b -> DomainDesc 'Discrete a b
BoundedDD Symbol
v RTopology
Discrete ModelExpr
low ModelExpr
high)
realInterval :: c -> RealInterval ModelExpr ModelExpr -> ModelExpr
realInterval c :: c
c = UID -> RealInterval ModelExpr ModelExpr -> ModelExpr
M.RealI (c
c c -> Getting UID c UID -> UID
forall s a. s -> Getting a s a -> a
^. Getting UID c UID
forall c. HasUID c => Lens' c UID
uid)
euclidean :: [ModelExpr] -> ModelExpr
euclidean = ModelExpr -> ModelExpr
forall r. ExprC r => r -> r
sqrt (ModelExpr -> ModelExpr)
-> ([ModelExpr] -> ModelExpr) -> [ModelExpr] -> ModelExpr
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ModelExpr -> ModelExpr -> ModelExpr) -> [ModelExpr] -> ModelExpr
forall (t :: * -> *) a. Foldable t => (a -> a -> a) -> t a -> a
foldr1 ModelExpr -> ModelExpr -> ModelExpr
forall r. ExprC r => r -> r -> r
addRe ([ModelExpr] -> ModelExpr)
-> ([ModelExpr] -> [ModelExpr]) -> [ModelExpr] -> ModelExpr
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ModelExpr -> ModelExpr) -> [ModelExpr] -> [ModelExpr]
forall a b. (a -> b) -> [a] -> [b]
map ModelExpr -> ModelExpr
forall r. (ExprC r, LiteralC r) => r -> r
square
cross :: ModelExpr -> ModelExpr -> ModelExpr
cross = VVVBinOp -> ModelExpr -> ModelExpr -> ModelExpr
M.VVVBinaryOp VVVBinOp
M.Cross
completeCase :: [(ModelExpr, ModelExpr)] -> ModelExpr
completeCase = Completeness -> [(ModelExpr, ModelExpr)] -> ModelExpr
M.Case Completeness
Complete
incompleteCase :: [(ModelExpr, ModelExpr)] -> ModelExpr
incompleteCase = Completeness -> [(ModelExpr, ModelExpr)] -> ModelExpr
M.Case Completeness
Incomplete
matrix :: [[ModelExpr]] -> ModelExpr
matrix = [[ModelExpr]] -> ModelExpr
M.Matrix
m2x2 :: ModelExpr -> ModelExpr -> ModelExpr -> ModelExpr -> ModelExpr
m2x2 a :: ModelExpr
a b :: ModelExpr
b c :: ModelExpr
c d :: ModelExpr
d = [[ModelExpr]] -> ModelExpr
forall r. ExprC r => [[r]] -> r
matrix [[ModelExpr
a,ModelExpr
b],[ModelExpr
c,ModelExpr
d]]
vec2D :: ModelExpr -> ModelExpr -> ModelExpr
vec2D a :: ModelExpr
a b :: ModelExpr
b = [[ModelExpr]] -> ModelExpr
forall r. ExprC r => [[r]] -> r
matrix [[ModelExpr
a],[ModelExpr
b]]
dgnl2x2 :: ModelExpr -> ModelExpr -> ModelExpr
dgnl2x2 a :: ModelExpr
a = ModelExpr -> ModelExpr -> ModelExpr -> ModelExpr -> ModelExpr
forall r. ExprC r => r -> r -> r -> r -> r
m2x2 ModelExpr
a (Integer -> ModelExpr
forall r. LiteralC r => Integer -> r
int 0) (Integer -> ModelExpr
forall r. LiteralC r => Integer -> r
int 0)
apply :: f -> [ModelExpr] -> ModelExpr
apply f :: f
f ps :: [ModelExpr]
ps = UID -> [ModelExpr] -> [(UID, ModelExpr)] -> ModelExpr
M.FCall (f
f f -> Getting UID f UID -> UID
forall s a. s -> Getting a s a -> a
^. Getting UID f UID
forall c. HasUID c => Lens' c UID
uid) [ModelExpr]
ps []
applyWithNamedArgs :: f -> [ModelExpr] -> [(a, ModelExpr)] -> ModelExpr
applyWithNamedArgs f :: f
f ps :: [ModelExpr]
ps ns :: [(a, ModelExpr)]
ns = UID -> [ModelExpr] -> [(UID, ModelExpr)] -> ModelExpr
M.FCall (f
f f -> Getting UID f UID -> UID
forall s a. s -> Getting a s a -> a
^. Getting UID f UID
forall c. HasUID c => Lens' c UID
uid) [ModelExpr]
ps ([UID] -> [ModelExpr] -> [(UID, ModelExpr)]
forall a b. [a] -> [b] -> [(a, b)]
zip (((a, ModelExpr) -> UID) -> [(a, ModelExpr)] -> [UID]
forall a b. (a -> b) -> [a] -> [b]
map ((a -> Getting UID a UID -> UID
forall s a. s -> Getting a s a -> a
^. Getting UID a UID
forall c. HasUID c => Lens' c UID
uid) (a -> UID) -> ((a, ModelExpr) -> a) -> (a, ModelExpr) -> UID
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a, ModelExpr) -> a
forall a b. (a, b) -> a
fst) [(a, ModelExpr)]
ns)
(((a, ModelExpr) -> ModelExpr) -> [(a, ModelExpr)] -> [ModelExpr]
forall a b. (a -> b) -> [a] -> [b]
map (a, ModelExpr) -> ModelExpr
forall a b. (a, b) -> b
snd [(a, ModelExpr)]
ns))
sy :: c -> ModelExpr
sy x :: c
x = UID -> ModelExpr
M.C (c
x c -> Getting UID c UID -> UID
forall s a. s -> Getting a s a -> a
^. Getting UID c UID
forall c. HasUID c => Lens' c UID
uid)