Module Analysis_and_optimization.Mir_utils

val var_declarations : ('a, 'b) Middle.Stmt.t -> string Std.Set.Poly.t
val num_expr_value : Middle.Expr.Typed.t -> (float * string) option
type bound_values = {
  1. lower : [ `None | `Nonlit | `Lit of float ];
  2. upper : [ `None | `Nonlit | `Lit of float ];
}
val chop_dist_name : string -> string Std.Option.t
val top_var_declarations : Middle.Stmt.Located.t -> string Std.Set.Poly.t
val function_names : Middle.Program.Typed.t -> string Std.Set.Poly.t
val data_set : ?exclude_transformed:bool -> ?exclude_ints:bool -> Middle.Program.Typed.t -> string Std.Set.Poly.t
val parameter_set : ?include_transformed:bool -> Middle.Program.Typed.t -> (string * Middle.Expr.Typed.t Middle.Transformation.t * Middle.Location_span.t) Std.Set.Poly.t
val parameter_names_set : ?include_transformed:bool -> Middle.Program.Typed.t -> string Std.Set.Poly.t
val fold_expr : take_expr:('c -> Middle.Expr.Typed.t -> 'c) -> init:'c -> Middle.Expr.Typed.t -> 'c
val fold_stmts : take_expr:('c -> Middle.Expr.Typed.t -> 'c) -> take_stmt:('c -> Middle.Stmt.Located.t -> 'c) -> init:'c -> Middle.Stmt.Located.t Std.List.t -> 'c
val fwd_traverse_statement : ('e, 'a) Middle.Stmt.Pattern.t -> init:'f -> f:('f -> 'a -> 'f * 'c) -> 'f * ('e, 'c) Middle.Stmt.Pattern.t

A traversal that simultaneously accumulates a state (type 'f) and replaces the substatement values from ('a to 'c). Traversal is done in-order but ignores branching, e.g., and if's then block is followed by the else block rather than branching.

val vexpr_of_expr_exn : Middle.Expr.Typed.t -> Dataflow_types.vexpr

Take a LHS expression from a general expression, throwing an exception if it can't be a LHS expression.

The set of variables in an expression, including inside an index. For use in RHS sets, not LHS assignment sets, except in a target term.

The set of variables in an index. For use in RHS sets, not LHS assignment sets, except in a target term

val expr_var_names_set : Middle.Expr.Typed.t -> string Std.Set.Poly.t

Return the names of the variables in an expression.

The set of variables that can affect the value or behavior of the expression, i.e. rhs. Using Set.Poly instead of ExprSet so that 'e can be polymorphic, it usually doesn't matter if there's duplication.

The set of variables in an expression, including inside an index. For use in RHS sets, not LHS assignment sets, except in a target term.

The set of variable names in an expression, including inside an index. For use in RHS sets, not LHS assignment sets, except in a target term.

val expr_assigned_var : Middle.Expr.Typed.t -> Dataflow_types.vexpr

The variable being assigned to when the expression is the LHS

val summation_terms : Middle.Expr.Typed.t -> Middle.Expr.Typed.t list

The list of terms in expression separated by a +

Substitute variables in an expression according to the provided Map.

Substitute variables occurring at the top level in statements according to the provided Map.

Substitute variables occurring anywhere in a statement according to the provided Map.

Substitute subexpressions occurring anywhere in a statement according to the provided Map.

Substitute subexpressions in an expression according to the provided Map, trying to match on larger subexpressions before smaller ones.

Substitute subexpressions occurring at the top level in statements according to the provided Map.

val expr_depth : Middle.Expr.Typed.t -> int

Calculate how deeply nested an expression is.

val update_expr_ad_levels : string Std.Set.Poly.t -> Middle.Expr.Typed.t -> Middle.Expr.Typed.t

Recompute all AD-levels in the metadata of an expression from the bottom up, making the variables in the first argument autodiffable

val cleanup_empty_stmts : ('e, 's) Middle.Stmt.t list -> ('e, 's) Middle.Stmt.t list