==================
category families
==================

category C
category S, NP, N, VP

---

(source_file
  (category_decl
    (identifier))
  (category_decl
    (identifier)
    (identifier)
    (identifier)
    (identifier)))

==================
object declarations
==================

object A, B : {a, b}
object State : FinSet 8
object Img : Real 28 28
object Pair : A * B
object Sum : A + B

---

(source_file
  (object_decl
    (identifier)
    (identifier)
    (enum_set_literal
      (identifier)
      (identifier)))
  (object_decl
    (identifier)
    (discrete_constructor
      (integer)))
  (object_decl
    (identifier)
    (continuous_constructor
      (integer)
      (integer)))
  (object_decl
    (identifier)
    (object_product
      (object_atom
        (identifier))
      (object_atom
        (identifier))))
  (object_decl
    (identifier)
    (object_coproduct
      (object_atom
        (identifier))
      (object_atom
        (identifier)))))

==================
object free constructions
==================

object Cat : FreeResiduated(prims)
object CatDeep : FreeResiduated(prims, depth=3, ops=[app, comp])
object Str : FreeMonoid(tokens, max_length=12)

---

(source_file
  (object_decl
    (identifier)
    (free_residuated_expr
      (identifier)))
  (object_decl
    (identifier)
    (free_residuated_expr
      (identifier)
      (free_residuated_arg
        (integer))
      (free_residuated_arg
        (identifier)
        (identifier))))
  (object_decl
    (identifier)
    (free_monoid_expr
      (identifier)
      (integer))))

==================
morphism families
==================

morphism f : A -> B
morphism enc, dec : A -> B

---

(source_file
  (morphism_decl
    (identifier)
    (object_atom
      (identifier))
    (object_atom
      (identifier)))
  (morphism_decl
    (identifier)
    (identifier)
    (object_atom
      (identifier))
    (object_atom
      (identifier))))

==================
morphism options with signed and scientific numbers
==================

morphism g : A -> B [scale=0.1]
morphism h : A -> B [role=latent, shift=-0.5, jitter=1e-3, lr=2.5e-4]
morphism k : A -> B [frozen, tags=[fast, "exact", -2], seed=mk("a", -1, 0.5)]

---

(source_file
  (morphism_decl
    (identifier)
    (object_atom
      (identifier))
    (object_atom
      (identifier))
    (option_block
      (option_entry
        (identifier)
        (signed_number
          (float)))))
  (morphism_decl
    (identifier)
    (object_atom
      (identifier))
    (object_atom
      (identifier))
    (option_block
      (option_entry
        (identifier)
        (identifier))
      (option_entry
        (identifier)
        (signed_number
          (float)))
      (option_entry
        (identifier)
        (signed_number
          (float)))
      (option_entry
        (identifier)
        (signed_number
          (float)))))
  (morphism_decl
    (identifier)
    (object_atom
      (identifier))
    (object_atom
      (identifier))
    (option_block
      (option_entry
        (identifier))
      (option_entry
        (identifier)
        (option_list
          (identifier)
          (string)
          (signed_number
            (integer))))
      (option_entry
        (identifier)
        (option_call
          (identifier)
          (string)
          (signed_number
            (integer))
          (signed_number
            (float)))))))

==================
morphism constructor options
==================

morphism sigma : P -> Real 1 {low=-1.0, high=1.0}
morphism w : A -> Real 2 {low=.5} [scale=1.]
morphism b : A -> Simplex 10 {temp=t0}

---

(source_file
  (morphism_decl
    (identifier)
    (object_atom
      (identifier))
    (continuous_constructor
      (integer)
      (constructor_options
        (constructor_kwarg
          (identifier)
          (signed_number
            (float)))
        (constructor_kwarg
          (identifier)
          (signed_number
            (float))))))
  (morphism_decl
    (identifier)
    (object_atom
      (identifier))
    (continuous_constructor
      (integer)
      (constructor_options
        (constructor_kwarg
          (identifier)
          (signed_number
            (float)))))
    (option_block
      (option_entry
        (identifier)
        (signed_number
          (float)))))
  (morphism_decl
    (identifier)
    (object_atom
      (identifier))
    (continuous_constructor
      (integer)
      (constructor_options
        (constructor_kwarg
          (identifier)
          (identifier))))))

==================
morphism initializers
==================

morphism m1 : A -> B ~ Normal(0.0, 1.0)
morphism m2 : A -> B [role=kernel] ~ Normal(-2.5e-3, 1.0)
morphism m3 : A -> B ~ identity(A)
morphism m4 : A -> B ~ enc >> dec

---

(source_file
  (morphism_decl
    (identifier)
    (object_atom
      (identifier))
    (object_atom
      (identifier))
    (morphism_init_family
      (identifier)
      (signed_number
        (float))
      (signed_number
        (float))))
  (morphism_decl
    (identifier)
    (object_atom
      (identifier))
    (object_atom
      (identifier))
    (option_block
      (option_entry
        (identifier)
        (identifier)))
    (morphism_init_family
      (identifier)
      (signed_number
        (float))
      (signed_number
        (float))))
  (morphism_decl
    (identifier)
    (object_atom
      (identifier))
    (object_atom
      (identifier))
    (identity_expr
      (identifier)))
  (morphism_decl
    (identifier)
    (object_atom
      (identifier))
    (object_atom
      (identifier))
    (compose_expr
      (expr_ident
        (identifier))
      (expr_ident
        (identifier)))))

==================
multi-line option and enum blocks
==================

morphism wide : A -> B [
    scale = 0.1,
    role = latent,
]
object Big : {
    a,
    b,
}

---

(source_file
  (morphism_decl
    (identifier)
    (object_atom
      (identifier))
    (object_atom
      (identifier))
    (option_block
      (option_entry
        (identifier)
        (signed_number
          (float)))
      (option_entry
        (identifier)
        (identifier))))
  (object_decl
    (identifier)
    (enum_set_literal
      (identifier)
      (identifier))))

==================
bundle declarations
==================

bundle core : [app, comp]
bundle empty : []

---

(source_file
  (bundle_decl
    (identifier)
    (identifier)
    (identifier))
  (bundle_decl
    (identifier)))

==================
contraction declarations
==================

contraction attend (q : Q -> K, kv : K -> V) : Q -> V
contraction fuse (f : A -> B) : A -> B [check=strict]

---

(source_file
  (contraction_decl
    (identifier)
    (contraction_input
      (identifier)
      (object_atom
        (identifier))
      (object_atom
        (identifier)))
    (contraction_input
      (identifier)
      (object_atom
        (identifier))
      (object_atom
        (identifier)))
    (object_atom
      (identifier))
    (object_atom
      (identifier)))
  (contraction_decl
    (identifier)
    (contraction_input
      (identifier)
      (object_atom
        (identifier))
      (object_atom
        (identifier)))
    (object_atom
      (identifier))
    (object_atom
      (identifier))
    (option_block
      (option_entry
        (identifier)
        (identifier)))))

==================
schema declaration
==================

schema pairup (x, y : A, z : B) : A -> A * B

---

(source_file
  (schema_decl
    (identifier)
    (schema_parameter
      (identifier)
      (identifier)
      (object_atom
        (identifier)))
    (schema_parameter
      (identifier)
      (object_atom
        (identifier)))
    (object_atom
      (identifier))
    (object_product
      (object_atom
        (identifier))
      (object_atom
        (identifier)))))

==================
define with and without where
==================

define pipeline = f >> g
define model = enc >> dec where
    define enc = f
    define dec = g

---

(source_file
  (define_decl
    (identifier)
    (compose_expr
      (expr_ident
        (identifier))
      (expr_ident
        (identifier))))
  (define_decl
    (identifier)
    (compose_expr
      (expr_ident
        (identifier))
      (expr_ident
        (identifier)))
    (define_decl
      (identifier)
      (expr_ident
        (identifier)))
    (define_decl
      (identifier)
      (expr_ident
        (identifier)))))

==================
export declarations
==================

export pipeline
export enc >> dec

---

(source_file
  (export_decl
    (expr_ident
      (identifier)))
  (export_decl
    (compose_expr
      (expr_ident
        (identifier))
      (expr_ident
        (identifier)))))

==================
composition declarations
==================

composition plain
composition leveled [level=algebra]
composition custom [level=rule]
    unit = 1.0
    compose(f, g) = f * g

---

(source_file
  (composition_decl
    (identifier))
  (composition_decl
    (identifier)
    (option_block
      (option_entry
        (identifier)
        (identifier))))
  (composition_decl
    (identifier)
    (option_block
      (option_entry
        (identifier)
        (identifier)))
    (composition_rule_entry
      (identifier)
      (let_literal
        (float)))
    (composition_rule_entry
      (identifier)
      (identifier)
      (identifier)
      (let_binop
        (let_var
          (identifier))
        (let_var
          (identifier))))))
