/*
* <!--
*
* **************************************************************
* This Java source has been automatically generated.
* MODIFICATIONS TO THIS SOURCE MAY BE OVERWRITTEN - DO NOT MODIFY THIS FILE
* **************************************************************
*
*
* This file (CAL_Optimizer_Transformations_internal.java)
* was generated from CAL module: Cal.Internal.Optimizer_Transformations.
* The constants and methods provided are intended to facilitate accessing the
* Cal.Internal.Optimizer_Transformations module from Java code.
*
* Creation date: Thu Oct 18 09:02:10 PDT 2007
* --!>
*
*/
package org.openquark.cal.internal.module.Cal.Internal;
import org.openquark.cal.compiler.ModuleName;
import org.openquark.cal.compiler.QualifiedName;
import org.openquark.cal.compiler.SourceModel;
/**
* WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
* WARNING WARNING WARNING WARNING WAR
* <p>
* This file is part of the compiler and not to be modified.
* <p>
* ING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
* WARNING WARNING WARNING WARNING
* <p>
* This module contains all functions that perform optimizing transformations of
* expressions. Some of the transformations currently defined are
* <p>
* performFusion
* <p>
* This transformation can decide to create a new function that fuses two other
* functions and in the process eliminates some data constructors.
* <p>
* transform_specialization
* <p>
* This transformation can decide to create a new specialized version of a
* function with more specific types and possible eliminate arguments by
* embeddeding given values.
* <p>
* transform_3_2_2
* <p>
* This transformation performs inlining of values.
* <p>
* There are a number of other transformations defined in the file, see below.
* <p>
* TODO rename all the tranformation so that they have some naming convention
* that is consistent and so they can be easily found.
*
* @author Greg McClement
*/
public final class CAL_Optimizer_Transformations_internal {
public static final ModuleName MODULE_NAME =
ModuleName.make("Cal.Internal.Optimizer_Transformations");
/**
* This inner class (Functions) contains constants
* and methods related to binding to CAL functions in the Cal.Internal.Optimizer_Transformations module.
*/
public static final class Functions {
/**
* Updates the cached type of the let expression with a calculated type.
* @param state (CAL type: <code>Cal.Internal.Optimizer_State.TransformState</code>)
* @param history (CAL type: <code>Cal.Internal.Optimizer_State.TransformHistory</code>)
* @param expression (CAL type: <code>Cal.Internal.Optimizer_Expression.Expression</code>)
* @return (CAL type: <code>(Cal.Internal.Optimizer_State.TransformHistory, Cal.Core.Prelude.Boolean, Cal.Internal.Optimizer_Expression.Expression)</code>)
*/
public static final SourceModel.Expr adjustTypeForLetExpression(SourceModel.Expr state, SourceModel.Expr history, SourceModel.Expr expression) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.adjustTypeForLetExpression), state, history, expression});
}
/**
* Name binding for function: adjustTypeForLetExpression.
* @see #adjustTypeForLetExpression(org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr)
*/
public static final QualifiedName adjustTypeForLetExpression =
QualifiedName.make(
CAL_Optimizer_Transformations_internal.MODULE_NAME,
"adjustTypeForLetExpression");
/**
* Checks if the expression of this Alt has an known kind of value.
* @param alt (CAL type: <code>Cal.Internal.Optimizer_Expression.Alt</code>)
* The Alt to check.
* @param recursiveCallChecker (CAL type: <code>Cal.Internal.Optimizer_Expression.Expression -> Cal.Core.Prelude.Boolean</code>)
* If the value of the inner case is a recursive call to the same function then it can be left unchanged in the body and the embedding will succeed. This is to handle the optimization of Prelude.isNothing (List.find (\x -> x == 1) [1::Int]);
* @return (CAL type: <code>Cal.Core.Prelude.Boolean</code>)
* Returns true iff the alt returns a known kind of value.
*/
public static final SourceModel.Expr altHasExplicitDC(SourceModel.Expr alt, SourceModel.Expr recursiveCallChecker) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.altHasExplicitDC), alt, recursiveCallChecker});
}
/**
* Name binding for function: altHasExplicitDC.
* @see #altHasExplicitDC(org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr)
*/
public static final QualifiedName altHasExplicitDC =
QualifiedName.make(
CAL_Optimizer_Transformations_internal.MODULE_NAME,
"altHasExplicitDC");
/**
* Checks if the atls all return values of a known kind.
* @param alts (CAL type: <code>[Cal.Internal.Optimizer_Expression.Alt]</code>)
* The alternatives to check.
* @param recursiveCallChecker (CAL type: <code>Cal.Internal.Optimizer_Expression.Expression -> Cal.Core.Prelude.Boolean</code>)
* If the value of the inner case is a recursive call to the same function then it can be left unchanged in the body and the embedding will succeed. This is to handle the optimization of Prelude.isNothing (List.find (\x -> x == 1) [1::Int]);
* @return (CAL type: <code>Cal.Core.Prelude.Boolean</code>)
* Returns true iff the alls all return a known kind of value.
*/
public static final SourceModel.Expr altsAllHaveExplicitDC(SourceModel.Expr alts, SourceModel.Expr recursiveCallChecker) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.altsAllHaveExplicitDC), alts, recursiveCallChecker});
}
/**
* Name binding for function: altsAllHaveExplicitDC.
* @see #altsAllHaveExplicitDC(org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr)
*/
public static final QualifiedName altsAllHaveExplicitDC =
QualifiedName.make(
CAL_Optimizer_Transformations_internal.MODULE_NAME,
"altsAllHaveExplicitDC");
/**
* Take the given list of seq'ed expression and the given inner expression and build an expression of
* the form (seq e1 (seq e2 (... )))
* @param state (CAL type: <code>Cal.Internal.Optimizer_State.TransformState</code>)
* @param seqedExprs (CAL type: <code>[Cal.Internal.Optimizer_Expression.Expression]</code>)
* @param functor (CAL type: <code>Cal.Internal.Optimizer_Expression.Expression</code>)
* @param args (CAL type: <code>[Cal.Internal.Optimizer_Expression.Expression]</code>)
* @return (CAL type: <code>Cal.Internal.Optimizer_Expression.Expression</code>)
*/
public static final SourceModel.Expr buildSeq(SourceModel.Expr state, SourceModel.Expr seqedExprs, SourceModel.Expr functor, SourceModel.Expr args) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.buildSeq), state, seqedExprs, functor, args});
}
/**
* Name binding for function: buildSeq.
* @see #buildSeq(org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr)
*/
public static final QualifiedName buildSeq =
QualifiedName.make(
CAL_Optimizer_Transformations_internal.MODULE_NAME,
"buildSeq");
/**
* Helper function to determine if selectStrictArguments will work when
* calling selectStrictArguments.
* @param state (CAL type: <code>Cal.Internal.Optimizer_State.TransformState</code>)
* @param history (CAL type: <code>Cal.Internal.Optimizer_State.TransformHistory</code>)
* @param dc (CAL type: <code>Cal.Internal.Optimizer_Expression.DataCons</code>)
* @param args (CAL type: <code>[Cal.Internal.Optimizer_Expression.Expression]</code>)
* @param counter (CAL type: <code>Cal.Core.Prelude.Int</code>)
* @param answer (CAL type: <code>Cal.Internal.Optimizer_Expression.Expression</code>)
* @return (CAL type: <code>Cal.Core.Prelude.Boolean</code>)
*/
public static final SourceModel.Expr canSelectStrictArguments(SourceModel.Expr state, SourceModel.Expr history, SourceModel.Expr dc, SourceModel.Expr args, SourceModel.Expr counter, SourceModel.Expr answer) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.canSelectStrictArguments), state, history, dc, args, counter, answer});
}
/**
* @see #canSelectStrictArguments(org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr)
* @param state
* @param history
* @param dc
* @param args
* @param counter
* @param answer
* @return the SourceModel.Expr representing an application of canSelectStrictArguments
*/
public static final SourceModel.Expr canSelectStrictArguments(SourceModel.Expr state, SourceModel.Expr history, SourceModel.Expr dc, SourceModel.Expr args, int counter, SourceModel.Expr answer) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.canSelectStrictArguments), state, history, dc, args, SourceModel.Expr.makeIntValue(counter), answer});
}
/**
* Name binding for function: canSelectStrictArguments.
* @see #canSelectStrictArguments(org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr)
*/
public static final QualifiedName canSelectStrictArguments =
QualifiedName.make(
CAL_Optimizer_Transformations_internal.MODULE_NAME,
"canSelectStrictArguments");
/**
* For the function f a1 a2 a3 ... ak look in the body for recursive calls. The
* recursive called will be of the form f a1 a2' ... ai' ... ak . The non-primed
* arguments are constant throughout the call. This means that the values can be
* bound and the arguments removed the caller.
* <p>
* The constVars is a list with the same arity as f.
*
* @param functionName (CAL type: <code>Cal.Internal.Optimizer_Expression.QualifiedName</code>)
* @param typeConstants (CAL type: <code>Cal.Internal.Optimizer_State.JPreludeTypeConstants</code>)
* @param functionArguments (CAL type: <code>[Cal.Internal.Optimizer_Expression.QualifiedName]</code>)
* @param functionBody (CAL type: <code>Cal.Internal.Optimizer_Expression.Expression</code>)
* @return (CAL type: <code>[Cal.Core.Prelude.Boolean]</code>)
*/
public static final SourceModel.Expr constVars(SourceModel.Expr functionName, SourceModel.Expr typeConstants, SourceModel.Expr functionArguments, SourceModel.Expr functionBody) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.constVars), functionName, typeConstants, functionArguments, functionBody});
}
/**
* Name binding for function: constVars.
* @see #constVars(org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr)
*/
public static final QualifiedName constVars =
QualifiedName.make(
CAL_Optimizer_Transformations_internal.MODULE_NAME,
"constVars");
/**
* For any positional pattern make sure that all of the variables are defined. This is to
* make pattern matching more successful in the transformation stage.
* @param state (CAL type: <code>Cal.Internal.Optimizer_State.TransformState</code>)
* @param history (CAL type: <code>Cal.Internal.Optimizer_State.TransformHistory</code>)
* @param alt (CAL type: <code>Cal.Internal.Optimizer_Expression.Alt</code>)
* @return (CAL type: <code>(Cal.Internal.Optimizer_State.TransformHistory, Cal.Core.Prelude.Boolean, Cal.Internal.Optimizer_Expression.Alt)</code>)
*/
public static final SourceModel.Expr defineAllAltVariables(SourceModel.Expr state, SourceModel.Expr history, SourceModel.Expr alt) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.defineAllAltVariables), state, history, alt});
}
/**
* Name binding for function: defineAllAltVariables.
* @see #defineAllAltVariables(org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr)
*/
public static final QualifiedName defineAllAltVariables =
QualifiedName.make(
CAL_Optimizer_Transformations_internal.MODULE_NAME,
"defineAllAltVariables");
/**
* Looks for expression of the form "<DataConstructor> arg1 arg2 ... argk",
* <Literal> or a switch where all the alternative have the former two patterns.
* @param expression (CAL type: <code>Cal.Internal.Optimizer_Expression.Expression</code>)
* The expression to check.
* @param recursiveCallChecker (CAL type: <code>Cal.Internal.Optimizer_Expression.Expression -> Cal.Core.Prelude.Boolean</code>)
* If the value of the inner case is a recursive call to the same function then it can be left unchanged in the body and the embedding will succeed. This is to handle the optimization of Prelude.isNothing (List.find (\x -> x == 1) [1::Int]);
* @return (CAL type: <code>Cal.Core.Prelude.Boolean</code>)
* Returns true iff the expression returns a known kind of value.
*/
public static final SourceModel.Expr expressionIsExplicitDC(SourceModel.Expr expression, SourceModel.Expr recursiveCallChecker) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.expressionIsExplicitDC), expression, recursiveCallChecker});
}
/**
* Name binding for function: expressionIsExplicitDC.
* @see #expressionIsExplicitDC(org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr)
*/
public static final QualifiedName expressionIsExplicitDC =
QualifiedName.make(
CAL_Optimizer_Transformations_internal.MODULE_NAME,
"expressionIsExplicitDC");
/**
* Helper binding method for function: expressionMatchesBoolean.
* @param expectedValue
* @param expression
* @return the SourceModule.expr representing an application of expressionMatchesBoolean
*/
public static final SourceModel.Expr expressionMatchesBoolean(SourceModel.Expr expectedValue, SourceModel.Expr expression) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.expressionMatchesBoolean), expectedValue, expression});
}
/**
* @see #expressionMatchesBoolean(org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr)
* @param expectedValue
* @param expression
* @return the SourceModel.Expr representing an application of expressionMatchesBoolean
*/
public static final SourceModel.Expr expressionMatchesBoolean(boolean expectedValue, SourceModel.Expr expression) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.expressionMatchesBoolean), SourceModel.Expr.makeBooleanValue(expectedValue), expression});
}
/**
* Name binding for function: expressionMatchesBoolean.
* @see #expressionMatchesBoolean(org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr)
*/
public static final QualifiedName expressionMatchesBoolean =
QualifiedName.make(
CAL_Optimizer_Transformations_internal.MODULE_NAME,
"expressionMatchesBoolean");
/**
* Returns true if the expression contains a let/letinlinable expression. TODO
* is this necessary? Bugs arose compiling Format.cal
* @param state (CAL type: <code>Cal.Internal.Optimizer_State.TransformState</code>)
* @param expr (CAL type: <code>Cal.Internal.Optimizer_Expression.Expression</code>)
* @return (CAL type: <code>Cal.Core.Prelude.Boolean</code>)
*/
public static final SourceModel.Expr expression_containsLet(SourceModel.Expr state, SourceModel.Expr expr) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.expression_containsLet), state, expr});
}
/**
* Name binding for function: expression_containsLet.
* @see #expression_containsLet(org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr)
*/
public static final QualifiedName expression_containsLet =
QualifiedName.make(
CAL_Optimizer_Transformations_internal.MODULE_NAME,
"expression_containsLet");
/**
* Returns true if the expression contains a switch expression. TODO is this
* necessary? Bugs arose compiling Format.cal
* @param state (CAL type: <code>Cal.Internal.Optimizer_State.TransformState</code>)
* @param expr (CAL type: <code>Cal.Internal.Optimizer_Expression.Expression</code>)
* @return (CAL type: <code>Cal.Core.Prelude.Boolean</code>)
*/
public static final SourceModel.Expr expression_containsSwitch(SourceModel.Expr state, SourceModel.Expr expr) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.expression_containsSwitch), state, expr});
}
/**
* Name binding for function: expression_containsSwitch.
* @see #expression_containsSwitch(org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr)
*/
public static final QualifiedName expression_containsSwitch =
QualifiedName.make(
CAL_Optimizer_Transformations_internal.MODULE_NAME,
"expression_containsSwitch");
/**
* Search for an alternative in alts with the same functor as alt
* @param alti (CAL type: <code>Cal.Internal.Optimizer_Expression.Alt</code>)
* The alternative to match.
* @param altso (CAL type: <code>[Cal.Internal.Optimizer_Expression.Alt]</code>)
* The list of alternatives to search for a match.
* @return (CAL type: <code>Cal.Internal.Optimizer_Expression.Alt</code>)
* An alternative in altso that has the same functor as alti.
*/
public static final SourceModel.Expr findMatchingAlt(SourceModel.Expr alti, SourceModel.Expr altso) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.findMatchingAlt), alti, altso});
}
/**
* Name binding for function: findMatchingAlt.
* @see #findMatchingAlt(org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr)
*/
public static final QualifiedName findMatchingAlt =
QualifiedName.make(
CAL_Optimizer_Transformations_internal.MODULE_NAME,
"findMatchingAlt");
/**
* TODO Remove this function.
* @param string (CAL type: <code>Cal.Core.Prelude.String</code>)
* @param contains (CAL type: <code>Cal.Core.Prelude.String</code>)
* @return (CAL type: <code>Cal.Core.Prelude.Boolean</code>)
*/
public static final SourceModel.Expr findString(SourceModel.Expr string, SourceModel.Expr contains) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.findString), string, contains});
}
/**
* @see #findString(org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr)
* @param string
* @param contains
* @return the SourceModel.Expr representing an application of findString
*/
public static final SourceModel.Expr findString(java.lang.String string, java.lang.String contains) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.findString), SourceModel.Expr.makeStringValue(string), SourceModel.Expr.makeStringValue(contains)});
}
/**
* Name binding for function: findString.
* @see #findString(org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr)
*/
public static final QualifiedName findString =
QualifiedName.make(
CAL_Optimizer_Transformations_internal.MODULE_NAME,
"findString");
/**
* Helper binding method for function: flattenSeqs.
* @param expr
* @return the SourceModule.expr representing an application of flattenSeqs
*/
public static final SourceModel.Expr flattenSeqs(SourceModel.Expr expr) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.flattenSeqs), expr});
}
/**
* Name binding for function: flattenSeqs.
* @see #flattenSeqs(org.openquark.cal.compiler.SourceModel.Expr)
*/
public static final QualifiedName flattenSeqs =
QualifiedName.make(
CAL_Optimizer_Transformations_internal.MODULE_NAME,
"flattenSeqs");
/**
* Convert straight list of variables to a fieldNameToVarList.
* @param qns (CAL type: <code>[Cal.Core.Prelude.Maybe Cal.Internal.Optimizer_Expression.QualifiedName]</code>)
* @return (CAL type: <code>[(Cal.Internal.Optimizer_Expression.FieldName, Cal.Internal.Optimizer_Expression.QualifiedName)]</code>)
*/
public static final SourceModel.Expr fromVars(SourceModel.Expr qns) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.fromVars), qns});
}
/**
* Name binding for function: fromVars.
* @see #fromVars(org.openquark.cal.compiler.SourceModel.Expr)
*/
public static final QualifiedName fromVars =
QualifiedName.make(
CAL_Optimizer_Transformations_internal.MODULE_NAME,
"fromVars");
/**
* Helper binding method for function: fromVarsHelper.
* @param qns
* @param counter
* @return the SourceModule.expr representing an application of fromVarsHelper
*/
public static final SourceModel.Expr fromVarsHelper(SourceModel.Expr qns, SourceModel.Expr counter) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.fromVarsHelper), qns, counter});
}
/**
* @see #fromVarsHelper(org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr)
* @param qns
* @param counter
* @return the SourceModel.Expr representing an application of fromVarsHelper
*/
public static final SourceModel.Expr fromVarsHelper(SourceModel.Expr qns, int counter) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.fromVarsHelper), qns, SourceModel.Expr.makeIntValue(counter)});
}
/**
* Name binding for function: fromVarsHelper.
* @see #fromVarsHelper(org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr)
*/
public static final QualifiedName fromVarsHelper =
QualifiedName.make(
CAL_Optimizer_Transformations_internal.MODULE_NAME,
"fromVarsHelper");
/**
* Helper binding method for function: functorMatches.
* @param expr
* @param functorName
* @return the SourceModule.expr representing an application of functorMatches
*/
public static final SourceModel.Expr functorMatches(SourceModel.Expr expr, SourceModel.Expr functorName) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.functorMatches), expr, functorName});
}
/**
* Name binding for function: functorMatches.
* @see #functorMatches(org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr)
*/
public static final QualifiedName functorMatches =
QualifiedName.make(
CAL_Optimizer_Transformations_internal.MODULE_NAME,
"functorMatches");
/**
* Try to figure out what data value corresponds to this value. Either the value is
* a data constructor or a literal or the type can be inferred from the context.
* @param state (CAL type: <code>Cal.Internal.Optimizer_State.TransformState</code>)
* @param expr (CAL type: <code>Cal.Internal.Optimizer_Expression.Expression</code>)
* @param functor (CAL type: <code>Cal.Internal.Optimizer_Expression.Expression</code>)
* @param args (CAL type: <code>[Cal.Internal.Optimizer_Expression.Expression]</code>)
* @return (CAL type: <code>(Cal.Internal.Optimizer_Expression.Expression, [Cal.Internal.Optimizer_Expression.Expression], [(Cal.Internal.Optimizer_Expression.FieldName, Cal.Internal.Optimizer_Expression.QualifiedName, Cal.Internal.Optimizer_Type.Type)], Cal.Core.Prelude.Boolean)</code>)
*/
public static final SourceModel.Expr getForm(SourceModel.Expr state, SourceModel.Expr expr, SourceModel.Expr functor, SourceModel.Expr args) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.getForm), state, expr, functor, args});
}
/**
* Name binding for function: getForm.
* @see #getForm(org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr)
*/
public static final QualifiedName getForm =
QualifiedName.make(
CAL_Optimizer_Transformations_internal.MODULE_NAME,
"getForm");
/**
* If onlyConstArgs is set then the specialization will just occur at this point.
* If not onlyConstArgs then we will try specializing and then optimize the result
* to see if the recurive calls are eliminated if so then we will keep this try. See
* note one for the top level function.
* @param state (CAL type: <code>Cal.Internal.Optimizer_State.TransformState</code>)
* @param history (CAL type: <code>Cal.Internal.Optimizer_State.TransformHistory</code>)
* @param onlyUseConstantArgs (CAL type: <code>Cal.Core.Prelude.Boolean</code>)
* @param newFunctionName (CAL type: <code>Cal.Internal.Optimizer_Expression.QualifiedName</code>)
* @param letExprPrime (CAL type: <code>Cal.Internal.Optimizer_Expression.Expression</code>)
* @return (CAL type: <code>Cal.Core.Prelude.Maybe Cal.Internal.Optimizer_Expression.Expression</code>)
*/
public static final SourceModel.Expr getLetExpr(SourceModel.Expr state, SourceModel.Expr history, SourceModel.Expr onlyUseConstantArgs, SourceModel.Expr newFunctionName, SourceModel.Expr letExprPrime) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.getLetExpr), state, history, onlyUseConstantArgs, newFunctionName, letExprPrime});
}
/**
* @see #getLetExpr(org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr)
* @param state
* @param history
* @param onlyUseConstantArgs
* @param newFunctionName
* @param letExprPrime
* @return the SourceModel.Expr representing an application of getLetExpr
*/
public static final SourceModel.Expr getLetExpr(SourceModel.Expr state, SourceModel.Expr history, boolean onlyUseConstantArgs, SourceModel.Expr newFunctionName, SourceModel.Expr letExprPrime) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.getLetExpr), state, history, SourceModel.Expr.makeBooleanValue(onlyUseConstantArgs), newFunctionName, letExprPrime});
}
/**
* Name binding for function: getLetExpr.
* @see #getLetExpr(org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr)
*/
public static final QualifiedName getLetExpr =
QualifiedName.make(
CAL_Optimizer_Transformations_internal.MODULE_NAME,
"getLetExpr");
/**
* Convert the fieldNameToVar list to a straight list of variables.
* @param fnqns (CAL type: <code>[(Cal.Internal.Optimizer_Expression.FieldName, Cal.Internal.Optimizer_Expression.QualifiedName)]</code>)
* @return (CAL type: <code>[Cal.Core.Prelude.Maybe Cal.Internal.Optimizer_Expression.QualifiedName]</code>)
*/
public static final SourceModel.Expr getVars(SourceModel.Expr fnqns) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.getVars), fnqns});
}
/**
* Name binding for function: getVars.
* @see #getVars(org.openquark.cal.compiler.SourceModel.Expr)
*/
public static final QualifiedName getVars =
QualifiedName.make(
CAL_Optimizer_Transformations_internal.MODULE_NAME,
"getVars");
/**
* Helper binding method for function: getVarsHelper.
* @param fnqns
* @param counter
* @return the SourceModule.expr representing an application of getVarsHelper
*/
public static final SourceModel.Expr getVarsHelper(SourceModel.Expr fnqns, SourceModel.Expr counter) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.getVarsHelper), fnqns, counter});
}
/**
* @see #getVarsHelper(org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr)
* @param fnqns
* @param counter
* @return the SourceModel.Expr representing an application of getVarsHelper
*/
public static final SourceModel.Expr getVarsHelper(SourceModel.Expr fnqns, int counter) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.getVarsHelper), fnqns, SourceModel.Expr.makeIntValue(counter)});
}
/**
* Name binding for function: getVarsHelper.
* @see #getVarsHelper(org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr)
*/
public static final QualifiedName getVarsHelper =
QualifiedName.make(
CAL_Optimizer_Transformations_internal.MODULE_NAME,
"getVarsHelper");
/**
* Given a list of arguments passed to this call, inline the arguments that have
* a constant value.
* <p>
* TODO: Make this notice if the inlining is bad in that it can calculate values
* multiple times.
*
* @param state (CAL type: <code>Cal.Internal.Optimizer_State.TransformState</code>)
* The context of the transformation.
* @param history (CAL type: <code>Cal.Internal.Optimizer_State.TransformHistory</code>)
* The history of the current transformation.
* @param wasChanged (CAL type: <code>Cal.Core.Prelude.Boolean</code>)
* An accumulator for keeping track of whether or not the expression was changed.
* @param isConstArgs (CAL type: <code>[Cal.Core.Prelude.Boolean]</code>)
* A list with one entry for each argument. If the argument is
* constant in the recursive call then the corresponding element is True.
* @param actualArguments (CAL type: <code>[Cal.Internal.Optimizer_Expression.Expression]</code>)
* The arguments used by the caller to an instance of this
* function.
* @param actualTypes (CAL type: <code>[Cal.Internal.Optimizer_Type.Type]</code>)
* The types of the actual arguments.
* @param body (CAL type: <code>Cal.Internal.Optimizer_Expression.Expression</code>)
* The body of the function that is being specialized.
* @param unusedArgumentsR (CAL type: <code>[Cal.Internal.Optimizer_Expression.Expression]</code>)
* The arguments that are not used (in reverse order).
* @param unusedTypesR (CAL type: <code>[Cal.Internal.Optimizer_Type.Type]</code>)
* The corresponding type of the arguments unusedArgumentsR.
* @param unusedIsConstArgsR (CAL type: <code>[Cal.Core.Prelude.Boolean]</code>)
* @return (CAL type: <code>(Cal.Internal.Optimizer_State.TransformHistory, Cal.Core.Prelude.Boolean, ([Cal.Internal.Optimizer_Expression.Expression], Cal.Internal.Optimizer_Expression.Expression, [Cal.Internal.Optimizer_Type.Type], [Cal.Core.Prelude.Boolean]))</code>)
*/
public static final SourceModel.Expr inlineConstantArguments(SourceModel.Expr state, SourceModel.Expr history, SourceModel.Expr wasChanged, SourceModel.Expr isConstArgs, SourceModel.Expr actualArguments, SourceModel.Expr actualTypes, SourceModel.Expr body, SourceModel.Expr unusedArgumentsR, SourceModel.Expr unusedTypesR, SourceModel.Expr unusedIsConstArgsR) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.inlineConstantArguments), state, history, wasChanged, isConstArgs, actualArguments, actualTypes, body, unusedArgumentsR, unusedTypesR, unusedIsConstArgsR});
}
/**
* @see #inlineConstantArguments(org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr)
* @param state
* @param history
* @param wasChanged
* @param isConstArgs
* @param actualArguments
* @param actualTypes
* @param body
* @param unusedArgumentsR
* @param unusedTypesR
* @param unusedIsConstArgsR
* @return the SourceModel.Expr representing an application of inlineConstantArguments
*/
public static final SourceModel.Expr inlineConstantArguments(SourceModel.Expr state, SourceModel.Expr history, boolean wasChanged, SourceModel.Expr isConstArgs, SourceModel.Expr actualArguments, SourceModel.Expr actualTypes, SourceModel.Expr body, SourceModel.Expr unusedArgumentsR, SourceModel.Expr unusedTypesR, SourceModel.Expr unusedIsConstArgsR) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.inlineConstantArguments), state, history, SourceModel.Expr.makeBooleanValue(wasChanged), isConstArgs, actualArguments, actualTypes, body, unusedArgumentsR, unusedTypesR, unusedIsConstArgsR});
}
/**
* Name binding for function: inlineConstantArguments.
* @see #inlineConstantArguments(org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr)
*/
public static final QualifiedName inlineConstantArguments =
QualifiedName.make(
CAL_Optimizer_Transformations_internal.MODULE_NAME,
"inlineConstantArguments");
/**
* Inline the given lambda expression iff it is satured and the expression body
* is at least as strict as the function being inlined in the arguments of the
* function being inlined.
* @param functor (CAL type: <code>Cal.Internal.Optimizer_Expression.QualifiedName</code>)
* The name of the variable corresponding to the lambda expression.
* @param expectedArity (CAL type: <code>Cal.Core.Prelude.Int</code>)
* The arguments of the expression corresponding to the let
* var.
* @param hasStrictArguments (CAL type: <code>Cal.Core.Prelude.Boolean</code>)
* Does the lamba expression have strict arguments. If
* so the inlining can only happen if the body is at least as strict for
* the arguments.
* @param forceInlining (CAL type: <code>Cal.Core.Prelude.Boolean</code>)
* Ignore heuristics and inline that lambda expression. This
* is used for fusion currently.
* @param inlinedExpr (CAL type: <code>Cal.Internal.Optimizer_Expression.Expression</code>)
* The expression to inline.
* @param state (CAL type: <code>Cal.Internal.Optimizer_State.TransformState</code>)
* The context of the current expression.
* @param history (CAL type: <code>Cal.Internal.Optimizer_State.TransformHistory</code>)
* The history of the current transformation.
* @param expr (CAL type: <code>Cal.Internal.Optimizer_Expression.Expression</code>)
* The expression to perform the inlining in.
* @return (CAL type: <code>(Cal.Internal.Optimizer_State.TransformHistory, Cal.Core.Prelude.Boolean, Cal.Internal.Optimizer_Expression.Expression)</code>)
* The expression with the inlining performed.
* <p>
* TODO Should this be renaming variables?
*/
public static final SourceModel.Expr inlineLambda(SourceModel.Expr functor, SourceModel.Expr expectedArity, SourceModel.Expr hasStrictArguments, SourceModel.Expr forceInlining, SourceModel.Expr inlinedExpr, SourceModel.Expr state, SourceModel.Expr history, SourceModel.Expr expr) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.inlineLambda), functor, expectedArity, hasStrictArguments, forceInlining, inlinedExpr, state, history, expr});
}
/**
* @see #inlineLambda(org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr)
* @param functor
* @param expectedArity
* @param hasStrictArguments
* @param forceInlining
* @param inlinedExpr
* @param state
* @param history
* @param expr
* @return the SourceModel.Expr representing an application of inlineLambda
*/
public static final SourceModel.Expr inlineLambda(SourceModel.Expr functor, int expectedArity, boolean hasStrictArguments, boolean forceInlining, SourceModel.Expr inlinedExpr, SourceModel.Expr state, SourceModel.Expr history, SourceModel.Expr expr) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.inlineLambda), functor, SourceModel.Expr.makeIntValue(expectedArity), SourceModel.Expr.makeBooleanValue(hasStrictArguments), SourceModel.Expr.makeBooleanValue(forceInlining), inlinedExpr, state, history, expr});
}
/**
* Name binding for function: inlineLambda.
* @see #inlineLambda(org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr)
*/
public static final QualifiedName inlineLambda =
QualifiedName.make(
CAL_Optimizer_Transformations_internal.MODULE_NAME,
"inlineLambda");
/**
* A lambda expression can be safely inlined if for each lambda variable either that variable
* only occurs once in the lambda expression or the value(s) bound to that variable require
* no further computation.
* @param state (CAL type: <code>Cal.Internal.Optimizer_State.TransformState</code>)
* @param functor (CAL type: <code>Cal.Internal.Optimizer_Expression.QualifiedName</code>)
* @param arity (CAL type: <code>Cal.Core.Prelude.Int</code>)
* @param lambdaExpr (CAL type: <code>Cal.Internal.Optimizer_Expression.Expression</code>)
* @param inlineIntoExpr (CAL type: <code>Cal.Internal.Optimizer_Expression.Expression</code>)
* @return (CAL type: <code>Cal.Core.Prelude.Boolean</code>)
*/
public static final SourceModel.Expr inliningSafeForLambda(SourceModel.Expr state, SourceModel.Expr functor, SourceModel.Expr arity, SourceModel.Expr lambdaExpr, SourceModel.Expr inlineIntoExpr) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.inliningSafeForLambda), state, functor, arity, lambdaExpr, inlineIntoExpr});
}
/**
* @see #inliningSafeForLambda(org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr)
* @param state
* @param functor
* @param arity
* @param lambdaExpr
* @param inlineIntoExpr
* @return the SourceModel.Expr representing an application of inliningSafeForLambda
*/
public static final SourceModel.Expr inliningSafeForLambda(SourceModel.Expr state, SourceModel.Expr functor, int arity, SourceModel.Expr lambdaExpr, SourceModel.Expr inlineIntoExpr) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.inliningSafeForLambda), state, functor, SourceModel.Expr.makeIntValue(arity), lambdaExpr, inlineIntoExpr});
}
/**
* Name binding for function: inliningSafeForLambda.
* @see #inliningSafeForLambda(org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr)
*/
public static final QualifiedName inliningSafeForLambda =
QualifiedName.make(
CAL_Optimizer_Transformations_internal.MODULE_NAME,
"inliningSafeForLambda");
/**
* Helper binding method for function: isErrorCall.
* @param expr
* @return the SourceModule.expr representing an application of isErrorCall
*/
public static final SourceModel.Expr isErrorCall(SourceModel.Expr expr) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.isErrorCall), expr});
}
/**
* Name binding for function: isErrorCall.
* @see #isErrorCall(org.openquark.cal.compiler.SourceModel.Expr)
*/
public static final QualifiedName isErrorCall =
QualifiedName.make(
CAL_Optimizer_Transformations_internal.MODULE_NAME,
"isErrorCall");
/**
* Checks if the case constant (from the outer alternative) matches the return
* expression from the inner alternative.
* <p>
* Example True == isMatching (Cons a b) (CaseDataCons "Cons")
*
* @param expri (CAL type: <code>Cal.Internal.Optimizer_Expression.Expression</code>)
* The inner expression to match
* @param cco (CAL type: <code>Cal.Internal.Optimizer_Expression.CaseConst</code>)
* The case constant from the outer expression to match.
* @return (CAL type: <code>Cal.Core.Prelude.Boolean</code>)
* True if the out case constant matches the inner return expression.
*/
public static final SourceModel.Expr isMatching(SourceModel.Expr expri, SourceModel.Expr cco) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.isMatching), expri, cco});
}
/**
* Name binding for function: isMatching.
* @see #isMatching(org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr)
*/
public static final QualifiedName isMatching =
QualifiedName.make(
CAL_Optimizer_Transformations_internal.MODULE_NAME,
"isMatching");
/**
* Helper binding method for function: isMatchingAlt.
* @param alti
* @param alto
* @return the SourceModule.expr representing an application of isMatchingAlt
*/
public static final SourceModel.Expr isMatchingAlt(SourceModel.Expr alti, SourceModel.Expr alto) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.isMatchingAlt), alti, alto});
}
/**
* Name binding for function: isMatchingAlt.
* @see #isMatchingAlt(org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr)
*/
public static final QualifiedName isMatchingAlt =
QualifiedName.make(
CAL_Optimizer_Transformations_internal.MODULE_NAME,
"isMatchingAlt");
/**
* Determines if expr is recursive.
* @param self (CAL type: <code>Cal.Internal.Optimizer_Expression.QualifiedName</code>)
* The name of the variable that is defined as expr
* @param expression (CAL type: <code>Cal.Internal.Optimizer_Expression.Expression</code>)
* The functions that defines self.
* @return (CAL type: <code>Cal.Core.Prelude.Boolean</code>)
* True iff expr calls self
*/
public static final SourceModel.Expr isRecursive(SourceModel.Expr self, SourceModel.Expr expression) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.isRecursive), self, expression});
}
/**
* Name binding for function: isRecursive.
* @see #isRecursive(org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr)
*/
public static final QualifiedName isRecursive =
QualifiedName.make(
CAL_Optimizer_Transformations_internal.MODULE_NAME,
"isRecursive");
/**
* Will the expression be evaluated first when the given expression is evaluated.
* @param isThisStrict (CAL type: <code>Cal.Internal.Optimizer_Expression.QualifiedName</code>)
* @param inThisExpression (CAL type: <code>Cal.Internal.Optimizer_Expression.Expression</code>)
* @return (CAL type: <code>Cal.Core.Prelude.Boolean</code>)
*/
public static final SourceModel.Expr isStrictInExpression(SourceModel.Expr isThisStrict, SourceModel.Expr inThisExpression) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.isStrictInExpression), isThisStrict, inThisExpression});
}
/**
* Name binding for function: isStrictInExpression.
* @see #isStrictInExpression(org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr)
*/
public static final QualifiedName isStrictInExpression =
QualifiedName.make(
CAL_Optimizer_Transformations_internal.MODULE_NAME,
"isStrictInExpression");
/**
* Build a Prelude.seq call with the given arguments.
* @param state (CAL type: <code>Cal.Internal.Optimizer_State.TransformState</code>)
* @param history (CAL type: <code>Cal.Internal.Optimizer_State.TransformHistory</code>)
* @param a (CAL type: <code>Cal.Internal.Optimizer_Expression.Expression</code>)
* @param b (CAL type: <code>Cal.Internal.Optimizer_Expression.Expression</code>)
* @return (CAL type: <code>Cal.Internal.Optimizer_Expression.Expression</code>)
*/
public static final SourceModel.Expr makeSeqCall(SourceModel.Expr state, SourceModel.Expr history, SourceModel.Expr a, SourceModel.Expr b) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.makeSeqCall), state, history, a, b});
}
/**
* Name binding for function: makeSeqCall.
* @see #makeSeqCall(org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr)
*/
public static final QualifiedName makeSeqCall =
QualifiedName.make(
CAL_Optimizer_Transformations_internal.MODULE_NAME,
"makeSeqCall");
/**
* Helper binding method for function: matchCaseConstAndDataConstructor.
* @param cc
* @param dc
* @return the SourceModule.expr representing an application of matchCaseConstAndDataConstructor
*/
public static final SourceModel.Expr matchCaseConstAndDataConstructor(SourceModel.Expr cc, SourceModel.Expr dc) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.matchCaseConstAndDataConstructor), cc, dc});
}
/**
* Name binding for function: matchCaseConstAndDataConstructor.
* @see #matchCaseConstAndDataConstructor(org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr)
*/
public static final QualifiedName matchCaseConstAndDataConstructor =
QualifiedName.make(
CAL_Optimizer_Transformations_internal.MODULE_NAME,
"matchCaseConstAndDataConstructor");
/**
* Helper binding method for function: matchCaseConstAndLiteral.
* @param cc
* @param literal
* @return the SourceModule.expr representing an application of matchCaseConstAndLiteral
*/
public static final SourceModel.Expr matchCaseConstAndLiteral(SourceModel.Expr cc, SourceModel.Expr literal) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.matchCaseConstAndLiteral), cc, literal});
}
/**
* Name binding for function: matchCaseConstAndLiteral.
* @see #matchCaseConstAndLiteral(org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr)
*/
public static final QualifiedName matchCaseConstAndLiteral =
QualifiedName.make(
CAL_Optimizer_Transformations_internal.MODULE_NAME,
"matchCaseConstAndLiteral");
/**
* Determine if the given pair of field names refer to the same field.
* @param dc (CAL type: <code>Cal.Internal.Optimizer_Expression.DataCons</code>)
* @param fn1 (CAL type: <code>Cal.Internal.Optimizer_Expression.FieldName</code>)
* @param fn2 (CAL type: <code>Cal.Internal.Optimizer_Expression.FieldName</code>)
* @return (CAL type: <code>Cal.Core.Prelude.Boolean</code>)
*/
public static final SourceModel.Expr matchFN(SourceModel.Expr dc, SourceModel.Expr fn1, SourceModel.Expr fn2) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.matchFN), dc, fn1, fn2});
}
/**
* Name binding for function: matchFN.
* @see #matchFN(org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr)
*/
public static final QualifiedName matchFN =
QualifiedName.make(
CAL_Optimizer_Transformations_internal.MODULE_NAME,
"matchFN");
/**
* Check if the given alt matches the given value. This only works for Boolean values.
* @param expectedValue (CAL type: <code>Cal.Core.Prelude.Boolean</code>)
* The value to look for
* @param alt (CAL type: <code>Cal.Internal.Optimizer_Expression.Alt</code>)
* The alt to check
* @return (CAL type: <code>Cal.Core.Prelude.Boolean</code>)
* True iff the given alt matches the given boolean value.
*/
public static final SourceModel.Expr matchesBoolean(SourceModel.Expr expectedValue, SourceModel.Expr alt) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.matchesBoolean), expectedValue, alt});
}
/**
* @see #matchesBoolean(org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr)
* @param expectedValue
* @param alt
* @return the SourceModel.Expr representing an application of matchesBoolean
*/
public static final SourceModel.Expr matchesBoolean(boolean expectedValue, SourceModel.Expr alt) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.matchesBoolean), SourceModel.Expr.makeBooleanValue(expectedValue), alt});
}
/**
* Name binding for function: matchesBoolean.
* @see #matchesBoolean(org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr)
*/
public static final QualifiedName matchesBoolean =
QualifiedName.make(
CAL_Optimizer_Transformations_internal.MODULE_NAME,
"matchesBoolean");
/**
* Helper binding method for function: matchesCaseConst.
* @param expectedValue
* @param caseConst
* @return the SourceModule.expr representing an application of matchesCaseConst
*/
public static final SourceModel.Expr matchesCaseConst(SourceModel.Expr expectedValue, SourceModel.Expr caseConst) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.matchesCaseConst), expectedValue, caseConst});
}
/**
* @see #matchesCaseConst(org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr)
* @param expectedValue
* @param caseConst
* @return the SourceModel.Expr representing an application of matchesCaseConst
*/
public static final SourceModel.Expr matchesCaseConst(boolean expectedValue, SourceModel.Expr caseConst) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.matchesCaseConst), SourceModel.Expr.makeBooleanValue(expectedValue), caseConst});
}
/**
* Name binding for function: matchesCaseConst.
* @see #matchesCaseConst(org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr)
*/
public static final QualifiedName matchesCaseConst =
QualifiedName.make(
CAL_Optimizer_Transformations_internal.MODULE_NAME,
"matchesCaseConst");
/**
* Helper binding method for function: onlyRecursive_fusion.
* @return the SourceModule.expr representing an application of onlyRecursive_fusion
*/
public static final SourceModel.Expr onlyRecursive_fusion() {
return SourceModel.Expr.Var.make(Functions.onlyRecursive_fusion);
}
/**
* Name binding for function: onlyRecursive_fusion.
* @see #onlyRecursive_fusion()
*/
public static final QualifiedName onlyRecursive_fusion =
QualifiedName.make(
CAL_Optimizer_Transformations_internal.MODULE_NAME,
"onlyRecursive_fusion");
/**
* Helper binding method for function: onlyRecursive_specialization.
* @return the SourceModule.expr representing an application of onlyRecursive_specialization
*/
public static final SourceModel.Expr onlyRecursive_specialization() {
return
SourceModel.Expr.Var.make(
Functions.onlyRecursive_specialization);
}
/**
* Name binding for function: onlyRecursive_specialization.
* @see #onlyRecursive_specialization()
*/
public static final QualifiedName onlyRecursive_specialization =
QualifiedName.make(
CAL_Optimizer_Transformations_internal.MODULE_NAME,
"onlyRecursive_specialization");
/**
* Performs a bottom up tranversal of the expression. The given set of
* transformations are performed on the sub-expressions. The expression is
* traverse nIterations number of times.
* @param transformations (CAL type: <code>[Cal.Internal.Optimizer_State.TransformState -> Cal.Internal.Optimizer_State.TransformHistory -> Cal.Internal.Optimizer_Expression.Expression -> (Cal.Internal.Optimizer_State.TransformHistory, Cal.Core.Prelude.Boolean, Cal.Internal.Optimizer_Expression.Expression)]</code>)
* The set of transformations to perform on the
* sub-expressions.
* @param transformState (CAL type: <code>Cal.Internal.Optimizer_State.TransformState</code>)
* Information about the current context of the expression
* traversal.
* @param transformHistory (CAL type: <code>Cal.Internal.Optimizer_State.TransformHistory</code>)
* Information about the history of the current
* transformation.
* @param nIterations (CAL type: <code>Cal.Core.Prelude.Int</code>)
* The number of times to traverse the expression performing
* optimization. There could be fancier control but currently that seems no
* necessary.
* @param expr (CAL type: <code>Cal.Internal.Optimizer_Expression.Expression</code>)
* The expression to transform.
* @return (CAL type: <code>(Cal.Internal.Optimizer_State.TransformHistory, Cal.Core.Prelude.Boolean, Cal.Internal.Optimizer_Expression.Expression)</code>)
* The result of performing the given transformations on the input
* expression.
*/
public static final SourceModel.Expr optimizeExplicit(SourceModel.Expr transformations, SourceModel.Expr transformState, SourceModel.Expr transformHistory, SourceModel.Expr nIterations, SourceModel.Expr expr) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.optimizeExplicit), transformations, transformState, transformHistory, nIterations, expr});
}
/**
* @see #optimizeExplicit(org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr)
* @param transformations
* @param transformState
* @param transformHistory
* @param nIterations
* @param expr
* @return the SourceModel.Expr representing an application of optimizeExplicit
*/
public static final SourceModel.Expr optimizeExplicit(SourceModel.Expr transformations, SourceModel.Expr transformState, SourceModel.Expr transformHistory, int nIterations, SourceModel.Expr expr) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.optimizeExplicit), transformations, transformState, transformHistory, SourceModel.Expr.makeIntValue(nIterations), expr});
}
/**
* Name binding for function: optimizeExplicit.
* @see #optimizeExplicit(org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr)
*/
public static final QualifiedName optimizeExplicit =
QualifiedName.make(
CAL_Optimizer_Transformations_internal.MODULE_NAME,
"optimizeExplicit");
/**
* Helper binding method for function: optimizeExplicitTwoStage.
* @param transformations
* @param stateTwo
* @param transformState
* @param transformHistory
* @param nIterations
* @param expr
* @return the SourceModule.expr representing an application of optimizeExplicitTwoStage
*/
public static final SourceModel.Expr optimizeExplicitTwoStage(SourceModel.Expr transformations, SourceModel.Expr stateTwo, SourceModel.Expr transformState, SourceModel.Expr transformHistory, SourceModel.Expr nIterations, SourceModel.Expr expr) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.optimizeExplicitTwoStage), transformations, stateTwo, transformState, transformHistory, nIterations, expr});
}
/**
* @see #optimizeExplicitTwoStage(org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr)
* @param transformations
* @param stateTwo
* @param transformState
* @param transformHistory
* @param nIterations
* @param expr
* @return the SourceModel.Expr representing an application of optimizeExplicitTwoStage
*/
public static final SourceModel.Expr optimizeExplicitTwoStage(SourceModel.Expr transformations, SourceModel.Expr stateTwo, SourceModel.Expr transformState, SourceModel.Expr transformHistory, int nIterations, SourceModel.Expr expr) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.optimizeExplicitTwoStage), transformations, stateTwo, transformState, transformHistory, SourceModel.Expr.makeIntValue(nIterations), expr});
}
/**
* Name binding for function: optimizeExplicitTwoStage.
* @see #optimizeExplicitTwoStage(org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr)
*/
public static final QualifiedName optimizeExplicitTwoStage =
QualifiedName.make(
CAL_Optimizer_Transformations_internal.MODULE_NAME,
"optimizeExplicitTwoStage");
/**
* 3.3.1 - Fusion (not in the original paper but this is where it seems it would
* go)
* <p>
* (f1 e1 e2 � ek (f2 ek+1 ek+2 � ek+m) ek+m+1 � ek+m+n
* <p>
* to
* <p>
* let f1$f2 = eBody�� in f1$f2 e1 e2 � ek ek+1 ek+2 � ek+m ek+m+1 � ek+m+n
* <p>
* The optimizer looks for patterns as shown in the input pattern. If found the
* optimizer makes an expression of the form
* <p>
* eBody: f1 a1 a2 � ak (f2 ak+1 ak+2 � ak+m) ak+m+1 � ak+m+n
* <p>
* a<n> is a newly created variable name. The expression eBody is then
* optimized. For all occurrences of the pattern eBody in eBody� a call to f1$f2
* is used instead. This produces the expression eBody��. If there are no calls
* to f1 or f2 in the expression eBody�� then the fusion is successful and the
* specified output is used as the new expression otherwise there is no change
* to the expression and the output equals the input.
*
* @param state (CAL type: <code>Cal.Internal.Optimizer_State.TransformState</code>)
* @param history0 (CAL type: <code>Cal.Internal.Optimizer_State.TransformHistory</code>)
* @param expr (CAL type: <code>Cal.Internal.Optimizer_Expression.Expression</code>)
* @return (CAL type: <code>(Cal.Internal.Optimizer_State.TransformHistory, Cal.Core.Prelude.Boolean, Cal.Internal.Optimizer_Expression.Expression)</code>)
*/
public static final SourceModel.Expr performFusion(SourceModel.Expr state, SourceModel.Expr history0, SourceModel.Expr expr) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.performFusion), state, history0, expr});
}
/**
* Name binding for function: performFusion.
* @see #performFusion(org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr)
*/
public static final QualifiedName performFusion =
QualifiedName.make(
CAL_Optimizer_Transformations_internal.MODULE_NAME,
"performFusion");
/**
* Helper binding method for function: performInlining.
* @param state
* @param history
* @param letVar
* @param arguments
* @param letExpr
* @param letBody
* @param forceInlining
* @return the SourceModule.expr representing an application of performInlining
*/
public static final SourceModel.Expr performInlining(SourceModel.Expr state, SourceModel.Expr history, SourceModel.Expr letVar, SourceModel.Expr arguments, SourceModel.Expr letExpr, SourceModel.Expr letBody, SourceModel.Expr forceInlining) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.performInlining), state, history, letVar, arguments, letExpr, letBody, forceInlining});
}
/**
* @see #performInlining(org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr)
* @param state
* @param history
* @param letVar
* @param arguments
* @param letExpr
* @param letBody
* @param forceInlining
* @return the SourceModel.Expr representing an application of performInlining
*/
public static final SourceModel.Expr performInlining(SourceModel.Expr state, SourceModel.Expr history, SourceModel.Expr letVar, int arguments, SourceModel.Expr letExpr, SourceModel.Expr letBody, boolean forceInlining) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.performInlining), state, history, letVar, SourceModel.Expr.makeIntValue(arguments), letExpr, letBody, SourceModel.Expr.makeBooleanValue(forceInlining)});
}
/**
* Name binding for function: performInlining.
* @see #performInlining(org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr)
*/
public static final QualifiedName performInlining =
QualifiedName.make(
CAL_Optimizer_Transformations_internal.MODULE_NAME,
"performInlining");
/**
* Remove all the constant arguments from the recursive calls in the body since
* these value will be embedded in the specialized function.
* @param oldFunctor (CAL type: <code>Cal.Internal.Optimizer_Expression.QualifiedName</code>)
* The functor of the function that is specialized.
* @param newFunctor (CAL type: <code>Cal.Internal.Optimizer_Expression.Expression</code>)
* The name of the new specialized function.
* @param isConstArgs (CAL type: <code>[Cal.Core.Prelude.Boolean]</code>)
* Information about the arguments that are constants. The nth
* element of the list is True iff the nth argument is a constant.
* @param state (CAL type: <code>Cal.Internal.Optimizer_State.TransformState</code>)
* The state pass during the transformation.
* @param history (CAL type: <code>Cal.Internal.Optimizer_State.TransformHistory</code>)
* The history of the tranformation.
* @param expr (CAL type: <code>Cal.Internal.Optimizer_Expression.Expression</code>)
* The expression to remove the constant arguments from.
* @return (CAL type: <code>(Cal.Internal.Optimizer_State.TransformHistory, Cal.Core.Prelude.Boolean, Cal.Internal.Optimizer_Expression.Expression)</code>)
*/
public static final SourceModel.Expr removeConstantArguments(SourceModel.Expr oldFunctor, SourceModel.Expr newFunctor, SourceModel.Expr isConstArgs, SourceModel.Expr state, SourceModel.Expr history, SourceModel.Expr expr) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.removeConstantArguments), oldFunctor, newFunctor, isConstArgs, state, history, expr});
}
/**
* Name binding for function: removeConstantArguments.
* @see #removeConstantArguments(org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr)
*/
public static final QualifiedName removeConstantArguments =
QualifiedName.make(
CAL_Optimizer_Transformations_internal.MODULE_NAME,
"removeConstantArguments");
/**
* Remove any unused alt pattern variables.
* @param alt (CAL type: <code>Cal.Internal.Optimizer_Expression.Alt</code>)
* @return (CAL type: <code>Cal.Internal.Optimizer_Expression.Alt</code>)
*/
public static final SourceModel.Expr removeUnusedAltVariables(SourceModel.Expr alt) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.removeUnusedAltVariables), alt});
}
/**
* Name binding for function: removeUnusedAltVariables.
* @see #removeUnusedAltVariables(org.openquark.cal.compiler.SourceModel.Expr)
*/
public static final QualifiedName removeUnusedAltVariables =
QualifiedName.make(
CAL_Optimizer_Transformations_internal.MODULE_NAME,
"removeUnusedAltVariables");
/**
* Transformer for renaming case variables in an expression.
* @param state (CAL type: <code>Cal.Internal.Optimizer_State.TransformState</code>)
* @param history (CAL type: <code>Cal.Internal.Optimizer_State.TransformHistory</code>)
* @param expression (CAL type: <code>Cal.Internal.Optimizer_Expression.Expression</code>)
* @return (CAL type: <code>(Cal.Internal.Optimizer_State.TransformHistory, Cal.Core.Prelude.Boolean, Cal.Internal.Optimizer_Expression.Expression)</code>)
*/
public static final SourceModel.Expr renameCaseVariables(SourceModel.Expr state, SourceModel.Expr history, SourceModel.Expr expression) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.renameCaseVariables), state, history, expression});
}
/**
* Name binding for function: renameCaseVariables.
* @see #renameCaseVariables(org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr)
*/
public static final QualifiedName renameCaseVariables =
QualifiedName.make(
CAL_Optimizer_Transformations_internal.MODULE_NAME,
"renameCaseVariables");
/**
* Transformer for renaming lambda variables in an expression.
* @param state (CAL type: <code>Cal.Internal.Optimizer_State.TransformState</code>)
* @param history (CAL type: <code>Cal.Internal.Optimizer_State.TransformHistory</code>)
* @param expression (CAL type: <code>Cal.Internal.Optimizer_Expression.Expression</code>)
* @return (CAL type: <code>(Cal.Internal.Optimizer_State.TransformHistory, Cal.Core.Prelude.Boolean, Cal.Internal.Optimizer_Expression.Expression)</code>)
*/
public static final SourceModel.Expr renameLambdaVariables(SourceModel.Expr state, SourceModel.Expr history, SourceModel.Expr expression) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.renameLambdaVariables), state, history, expression});
}
/**
* Name binding for function: renameLambdaVariables.
* @see #renameLambdaVariables(org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr)
*/
public static final QualifiedName renameLambdaVariables =
QualifiedName.make(
CAL_Optimizer_Transformations_internal.MODULE_NAME,
"renameLambdaVariables");
/**
* Transformer for renaming let variables in an expression.
* @param updateOnlyKeepable (CAL type: <code>Cal.Core.Prelude.Boolean</code>)
* @param state (CAL type: <code>Cal.Internal.Optimizer_State.TransformState</code>)
* @param history (CAL type: <code>Cal.Internal.Optimizer_State.TransformHistory</code>)
* @param expression (CAL type: <code>Cal.Internal.Optimizer_Expression.Expression</code>)
* @return (CAL type: <code>(Cal.Internal.Optimizer_State.TransformHistory, Cal.Core.Prelude.Boolean, Cal.Internal.Optimizer_Expression.Expression)</code>)
*/
public static final SourceModel.Expr renameLetVariables(SourceModel.Expr updateOnlyKeepable, SourceModel.Expr state, SourceModel.Expr history, SourceModel.Expr expression) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.renameLetVariables), updateOnlyKeepable, state, history, expression});
}
/**
* @see #renameLetVariables(org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr)
* @param updateOnlyKeepable
* @param state
* @param history
* @param expression
* @return the SourceModel.Expr representing an application of renameLetVariables
*/
public static final SourceModel.Expr renameLetVariables(boolean updateOnlyKeepable, SourceModel.Expr state, SourceModel.Expr history, SourceModel.Expr expression) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.renameLetVariables), SourceModel.Expr.makeBooleanValue(updateOnlyKeepable), state, history, expression});
}
/**
* Name binding for function: renameLetVariables.
* @see #renameLetVariables(org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr)
*/
public static final QualifiedName renameLetVariables =
QualifiedName.make(
CAL_Optimizer_Transformations_internal.MODULE_NAME,
"renameLetVariables");
/**
* Helper binding method for function: renameVariables.
* @param source
* @param state
* @param history
* @param expression
* @return the SourceModule.expr representing an application of renameVariables
*/
public static final SourceModel.Expr renameVariables(SourceModel.Expr source, SourceModel.Expr state, SourceModel.Expr history, SourceModel.Expr expression) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.renameVariables), source, state, history, expression});
}
/**
* @see #renameVariables(org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr)
* @param source
* @param state
* @param history
* @param expression
* @return the SourceModel.Expr representing an application of renameVariables
*/
public static final SourceModel.Expr renameVariables(java.lang.String source, SourceModel.Expr state, SourceModel.Expr history, SourceModel.Expr expression) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.renameVariables), SourceModel.Expr.makeStringValue(source), state, history, expression});
}
/**
* Name binding for function: renameVariables.
* @see #renameVariables(org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr)
*/
public static final QualifiedName renameVariables =
QualifiedName.make(
CAL_Optimizer_Transformations_internal.MODULE_NAME,
"renameVariables");
/**
* Takes the tail of a list where the tail of the empty list is the empty list.
* @param list (CAL type: <code>[a]</code>)
* The list to take the tail of.
* @return (CAL type: <code>[a]</code>)
* If the list is empty the empty list is returned otherwise the tail of
* the list is returned. TODO Get rid of this function.
*/
public static final SourceModel.Expr safeTail(SourceModel.Expr list) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.safeTail), list});
}
/**
* Name binding for function: safeTail.
* @see #safeTail(org.openquark.cal.compiler.SourceModel.Expr)
*/
public static final QualifiedName safeTail =
QualifiedName.make(
CAL_Optimizer_Transformations_internal.MODULE_NAME,
"safeTail");
/**
* For the given list of args build a collection if Prelude.seq statements for the given
* type if necessary.
* @param state (CAL type: <code>Cal.Internal.Optimizer_State.TransformState</code>)
* The context of the current transformation.
* @param history (CAL type: <code>Cal.Internal.Optimizer_State.TransformHistory</code>)
* Information from the history of the transformation.
* @param dc (CAL type: <code>Cal.Internal.Optimizer_Expression.DataCons</code>)
* The data constructor that the args are applied to.
* @param args (CAL type: <code>[Cal.Internal.Optimizer_Expression.Expression]</code>)
* The args of the given data constructor.
* @param counter (CAL type: <code>Cal.Core.Prelude.Int</code>)
* The index of the first arg in the args list.
* @param answer (CAL type: <code>Cal.Internal.Optimizer_Expression.Expression</code>)
* The expression that is the value of the final expression.
* @return (CAL type: <code>Cal.Internal.Optimizer_Expression.Expression</code>)
*/
public static final SourceModel.Expr selectStrictArguments(SourceModel.Expr state, SourceModel.Expr history, SourceModel.Expr dc, SourceModel.Expr args, SourceModel.Expr counter, SourceModel.Expr answer) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.selectStrictArguments), state, history, dc, args, counter, answer});
}
/**
* @see #selectStrictArguments(org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr)
* @param state
* @param history
* @param dc
* @param args
* @param counter
* @param answer
* @return the SourceModel.Expr representing an application of selectStrictArguments
*/
public static final SourceModel.Expr selectStrictArguments(SourceModel.Expr state, SourceModel.Expr history, SourceModel.Expr dc, SourceModel.Expr args, int counter, SourceModel.Expr answer) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.selectStrictArguments), state, history, dc, args, SourceModel.Expr.makeIntValue(counter), answer});
}
/**
* Name binding for function: selectStrictArguments.
* @see #selectStrictArguments(org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr)
*/
public static final QualifiedName selectStrictArguments =
QualifiedName.make(
CAL_Optimizer_Transformations_internal.MODULE_NAME,
"selectStrictArguments");
/**
* Helper binding method for function: simplifySeq_case4.
* @param state
* @param history
* @param expression
* @return the SourceModule.expr representing an application of simplifySeq_case4
*/
public static final SourceModel.Expr simplifySeq_case4(SourceModel.Expr state, SourceModel.Expr history, SourceModel.Expr expression) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.simplifySeq_case4), state, history, expression});
}
/**
* Name binding for function: simplifySeq_case4.
* @see #simplifySeq_case4(org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr)
*/
public static final QualifiedName simplifySeq_case4 =
QualifiedName.make(
CAL_Optimizer_Transformations_internal.MODULE_NAME,
"simplifySeq_case4");
/**
* Use the type of the lambda expression variable to try to make the type of the given expression
* more specific. Currently only working for expressions that are Var's.
* @param lambdaType (CAL type: <code>Cal.Internal.Optimizer_Type.Type</code>)
* @param expr (CAL type: <code>Cal.Internal.Optimizer_Expression.Expression</code>)
* @return (CAL type: <code>Cal.Internal.Optimizer_Expression.Expression</code>)
*/
public static final SourceModel.Expr specializeType(SourceModel.Expr lambdaType, SourceModel.Expr expr) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.specializeType), lambdaType, expr});
}
/**
* Name binding for function: specializeType.
* @see #specializeType(org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr)
*/
public static final QualifiedName specializeType =
QualifiedName.make(
CAL_Optimizer_Transformations_internal.MODULE_NAME,
"specializeType");
/**
* Helper binding method for function: tShower.
* @param label
* @param transform
* @param state
* @param history
* @param expression
* @return the SourceModule.expr representing an application of tShower
*/
public static final SourceModel.Expr tShower(SourceModel.Expr label, SourceModel.Expr transform, SourceModel.Expr state, SourceModel.Expr history, SourceModel.Expr expression) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.tShower), label, transform, state, history, expression});
}
/**
* @see #tShower(org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr)
* @param label
* @param transform
* @param state
* @param history
* @param expression
* @return the SourceModel.Expr representing an application of tShower
*/
public static final SourceModel.Expr tShower(java.lang.String label, SourceModel.Expr transform, SourceModel.Expr state, SourceModel.Expr history, SourceModel.Expr expression) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.tShower), SourceModel.Expr.makeStringValue(label), transform, state, history, expression});
}
/**
* Name binding for function: tShower.
* @see #tShower(org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr)
*/
public static final QualifiedName tShower =
QualifiedName.make(
CAL_Optimizer_Transformations_internal.MODULE_NAME,
"tShower");
/**
* Helper function for showing the input and output of a transformation if the
* transformation changes the expression.
* @param label (CAL type: <code>Cal.Core.Prelude.String</code>)
* @param transform (CAL type: <code>Cal.Internal.Optimizer_State.TransformState -> Cal.Internal.Optimizer_State.TransformHistory -> Cal.Internal.Optimizer_Expression.Expression -> (Cal.Internal.Optimizer_State.TransformHistory, Cal.Core.Prelude.Boolean, Cal.Internal.Optimizer_Expression.Expression)</code>)
* @param arg_3 (CAL type: <code>Cal.Internal.Optimizer_State.TransformState</code>)
* @param arg_4 (CAL type: <code>Cal.Internal.Optimizer_State.TransformHistory</code>)
* @param arg_5 (CAL type: <code>Cal.Internal.Optimizer_Expression.Expression</code>)
* @return (CAL type: <code>(Cal.Internal.Optimizer_State.TransformHistory, Cal.Core.Prelude.Boolean, Cal.Internal.Optimizer_Expression.Expression)</code>)
*/
public static final SourceModel.Expr tShower3(SourceModel.Expr label, SourceModel.Expr transform, SourceModel.Expr arg_3, SourceModel.Expr arg_4, SourceModel.Expr arg_5) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.tShower3), label, transform, arg_3, arg_4, arg_5});
}
/**
* @see #tShower3(org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr)
* @param label
* @param transform
* @param arg_3
* @param arg_4
* @param arg_5
* @return the SourceModel.Expr representing an application of tShower3
*/
public static final SourceModel.Expr tShower3(java.lang.String label, SourceModel.Expr transform, SourceModel.Expr arg_3, SourceModel.Expr arg_4, SourceModel.Expr arg_5) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.tShower3), SourceModel.Expr.makeStringValue(label), transform, arg_3, arg_4, arg_5});
}
/**
* Name binding for function: tShower3.
* @see #tShower3(org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr)
*/
public static final QualifiedName tShower3 =
QualifiedName.make(
CAL_Optimizer_Transformations_internal.MODULE_NAME,
"tShower3");
/**
* Helper binding method for function: trace2.
* @param unused
* @param v
* @return the SourceModule.expr representing an application of trace2
*/
public static final SourceModel.Expr trace2(SourceModel.Expr unused, SourceModel.Expr v) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.trace2), unused, v});
}
/**
* @see #trace2(org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr)
* @param unused
* @param v
* @return the SourceModel.Expr representing an application of trace2
*/
public static final SourceModel.Expr trace2(java.lang.String unused, SourceModel.Expr v) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.trace2), SourceModel.Expr.makeStringValue(unused), v});
}
/**
* Name binding for function: trace2.
* @see #trace2(org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr)
*/
public static final QualifiedName trace2 =
QualifiedName.make(
CAL_Optimizer_Transformations_internal.MODULE_NAME,
"trace2");
/**
* 3.1 - Beta reduction
* <p>
* (\v -> e) x
* <p>
* to
* <p>
* e (x/v)
*
* @param state (CAL type: <code>Cal.Internal.Optimizer_State.TransformState</code>)
* Information about the current expression.
* @param history (CAL type: <code>Cal.Internal.Optimizer_State.TransformHistory</code>)
* Information about the history of the transformation.
* @param application (CAL type: <code>Cal.Internal.Optimizer_Expression.Expression</code>)
* expression The expression to transform
* @return (CAL type: <code>(Cal.Internal.Optimizer_State.TransformHistory, Cal.Core.Prelude.Boolean, Cal.Internal.Optimizer_Expression.Expression)</code>)
* The transformed expression.
* <p>
* TODO: Check the if there are any strictness issues.
*/
public static final SourceModel.Expr transform_3_1(SourceModel.Expr state, SourceModel.Expr history, SourceModel.Expr application) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.transform_3_1), state, history, application});
}
/**
* Name binding for function: transform_3_1.
* @see #transform_3_1(org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr)
*/
public static final QualifiedName transform_3_1 =
QualifiedName.make(
CAL_Optimizer_Transformations_internal.MODULE_NAME,
"transform_3_1");
/**
* Helper binding method for function: transform_3_1Examples.
* @param typeConstants
* @return the SourceModule.expr representing an application of transform_3_1Examples
*/
public static final SourceModel.Expr transform_3_1Examples(SourceModel.Expr typeConstants) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.transform_3_1Examples), typeConstants});
}
/**
* Name binding for function: transform_3_1Examples.
* @see #transform_3_1Examples(org.openquark.cal.compiler.SourceModel.Expr)
*/
public static final QualifiedName transform_3_1Examples =
QualifiedName.make(
CAL_Optimizer_Transformations_internal.MODULE_NAME,
"transform_3_1Examples");
/**
* 3.2.1 - Dead code removal
* <p>
* let v = ev in e (where v is not found in e)
* <p>
* to
* <p>
* e
*
* @param removeOldOnesAsWell (CAL type: <code>Cal.Core.Prelude.Boolean</code>)
* @param state (CAL type: <code>Cal.Internal.Optimizer_State.TransformState</code>)
* @param history (CAL type: <code>Cal.Internal.Optimizer_State.TransformHistory</code>)
* @param expr (CAL type: <code>Cal.Internal.Optimizer_Expression.Expression</code>)
* @return (CAL type: <code>(Cal.Internal.Optimizer_State.TransformHistory, Cal.Core.Prelude.Boolean, Cal.Internal.Optimizer_Expression.Expression)</code>)
*/
public static final SourceModel.Expr transform_3_2_1(SourceModel.Expr removeOldOnesAsWell, SourceModel.Expr state, SourceModel.Expr history, SourceModel.Expr expr) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.transform_3_2_1), removeOldOnesAsWell, state, history, expr});
}
/**
* @see #transform_3_2_1(org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr)
* @param removeOldOnesAsWell
* @param state
* @param history
* @param expr
* @return the SourceModel.Expr representing an application of transform_3_2_1
*/
public static final SourceModel.Expr transform_3_2_1(boolean removeOldOnesAsWell, SourceModel.Expr state, SourceModel.Expr history, SourceModel.Expr expr) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.transform_3_2_1), SourceModel.Expr.makeBooleanValue(removeOldOnesAsWell), state, history, expr});
}
/**
* Name binding for function: transform_3_2_1.
* @see #transform_3_2_1(org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr)
*/
public static final QualifiedName transform_3_2_1 =
QualifiedName.make(
CAL_Optimizer_Transformations_internal.MODULE_NAME,
"transform_3_2_1");
/**
* Helper binding method for function: transform_3_2_1Examples.
* @param typeConstants
* @return the SourceModule.expr representing an application of transform_3_2_1Examples
*/
public static final SourceModel.Expr transform_3_2_1Examples(SourceModel.Expr typeConstants) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.transform_3_2_1Examples), typeConstants});
}
/**
* Name binding for function: transform_3_2_1Examples.
* @see #transform_3_2_1Examples(org.openquark.cal.compiler.SourceModel.Expr)
*/
public static final QualifiedName transform_3_2_1Examples =
QualifiedName.make(
CAL_Optimizer_Transformations_internal.MODULE_NAME,
"transform_3_2_1Examples");
/**
* 3.2.1 - Inlining
* <p>
* let v = ev in e
* <p>
* to
* <p>
* let v = ev in e[ev/v]
* <p>
* NOTE:
* <p>
* 1. The inliner will only work for fully saturated cases of lambda
* expressions. This is temporary until the lambda lifter can handle code
* generated by the specialier.
*
* @param state (CAL type: <code>Cal.Internal.Optimizer_State.TransformState</code>)
* @param history (CAL type: <code>Cal.Internal.Optimizer_State.TransformHistory</code>)
* @param expr (CAL type: <code>Cal.Internal.Optimizer_Expression.Expression</code>)
* @return (CAL type: <code>(Cal.Internal.Optimizer_State.TransformHistory, Cal.Core.Prelude.Boolean, Cal.Internal.Optimizer_Expression.Expression)</code>)
*/
public static final SourceModel.Expr transform_3_2_2(SourceModel.Expr state, SourceModel.Expr history, SourceModel.Expr expr) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.transform_3_2_2), state, history, expr});
}
/**
* Name binding for function: transform_3_2_2.
* @see #transform_3_2_2(org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr)
*/
public static final QualifiedName transform_3_2_2 =
QualifiedName.make(
CAL_Optimizer_Transformations_internal.MODULE_NAME,
"transform_3_2_2");
/**
* Helper binding method for function: transform_3_2_2Examples.
* @param typeConstants
* @return the SourceModule.expr representing an application of transform_3_2_2Examples
*/
public static final SourceModel.Expr transform_3_2_2Examples(SourceModel.Expr typeConstants) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.transform_3_2_2Examples), typeConstants});
}
/**
* Name binding for function: transform_3_2_2Examples.
* @see #transform_3_2_2Examples(org.openquark.cal.compiler.SourceModel.Expr)
*/
public static final QualifiedName transform_3_2_2Examples =
QualifiedName.make(
CAL_Optimizer_Transformations_internal.MODULE_NAME,
"transform_3_2_2Examples");
/**
* Lift let definitions higher up to open the expression up for other optimizations.
* <p>
* Input:
* <p>
* (e1 (let v=d in e2))
* <p>
* Output:
* <p>
* (let v=d in (e1 e2)) as long as v is not free in e1.
* <p>
* Input:
* <p>
* ((let v=d in e1) e2)
* <p>
* Output:
* <p>
* (let v=d in (e1 e2))
*
* @param state (CAL type: <code>Cal.Internal.Optimizer_State.TransformState</code>)
* @param history (CAL type: <code>Cal.Internal.Optimizer_State.TransformHistory</code>)
* @param expr (CAL type: <code>Cal.Internal.Optimizer_Expression.Expression</code>)
* @return (CAL type: <code>(Cal.Internal.Optimizer_State.TransformHistory, Cal.Core.Prelude.Boolean, Cal.Internal.Optimizer_Expression.Expression)</code>)
*/
public static final SourceModel.Expr transform_3_4_2(SourceModel.Expr state, SourceModel.Expr history, SourceModel.Expr expr) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.transform_3_4_2), state, history, expr});
}
/**
* Name binding for function: transform_3_4_2.
* @see #transform_3_4_2(org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr)
*/
public static final QualifiedName transform_3_4_2 =
QualifiedName.make(
CAL_Optimizer_Transformations_internal.MODULE_NAME,
"transform_3_4_2");
/**
* 3.5.1 - Case float from App
* <p>
* (case ec of alt1 -> e1; alt2 -> e2; ...) v
* <p>
* to
* <p>
* case ec of alt1 -> e1 v; alt2 -> e2 v; ...
*
* @param state (CAL type: <code>Cal.Internal.Optimizer_State.TransformState</code>)
* Information about the current expression.
* @param history (CAL type: <code>Cal.Internal.Optimizer_State.TransformHistory</code>)
* History of the transformation.
* @param expression (CAL type: <code>Cal.Internal.Optimizer_Expression.Expression</code>)
* Expression to transform
* @return (CAL type: <code>(Cal.Internal.Optimizer_State.TransformHistory, Cal.Core.Prelude.Boolean, Cal.Internal.Optimizer_Expression.Expression)</code>)
* The transformed expression is applicable
* <p>
* TODO This should be renaming the alternative variables to avoid name capture.
*/
public static final SourceModel.Expr transform_3_5_1(SourceModel.Expr state, SourceModel.Expr history, SourceModel.Expr expression) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.transform_3_5_1), state, history, expression});
}
/**
* Name binding for function: transform_3_5_1.
* @see #transform_3_5_1(org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr)
*/
public static final QualifiedName transform_3_5_1 =
QualifiedName.make(
CAL_Optimizer_Transformations_internal.MODULE_NAME,
"transform_3_5_1");
/**
* Embed the outer case into the inner case. See test 7-9 and 15 in Optimizer_Tests.cal
* <p>
* TODO: What about name capture. This should be safe now right with the renaming. Check it out.
*
* @param state (CAL type: <code>Cal.Internal.Optimizer_State.TransformState</code>)
* @param history (CAL type: <code>Cal.Internal.Optimizer_State.TransformHistory</code>)
* @param expression (CAL type: <code>Cal.Internal.Optimizer_Expression.Expression</code>)
* @return (CAL type: <code>(Cal.Internal.Optimizer_State.TransformHistory, Cal.Core.Prelude.Boolean, Cal.Internal.Optimizer_Expression.Expression)</code>)
*/
public static final SourceModel.Expr transform_3_5_2(SourceModel.Expr state, SourceModel.Expr history, SourceModel.Expr expression) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.transform_3_5_2), state, history, expression});
}
/**
* Name binding for function: transform_3_5_2.
* @see #transform_3_5_2(org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr)
*/
public static final QualifiedName transform_3_5_2 =
QualifiedName.make(
CAL_Optimizer_Transformations_internal.MODULE_NAME,
"transform_3_5_2");
/**
* let
* outerExpr1 = case innerExpr of <innerPattern1> -> ...; // Inner Switch
* in
* case outerExpr1 of // Outer Switch
* <outerPattern1> -> ...
* <outerPattern2> -> ... outerExpr1? ...
* <p>
* =>
* <p>
* case innerExpr of
* <innerPattern1> ->
* let
* outerExpr1 = innerExpr1;
* in
* case outerExpr1 of
* <outerPattern1> -> ...
* <outerPattern2> -> ... outerExpr1? ...
*
* @param state (CAL type: <code>Cal.Internal.Optimizer_State.TransformState</code>)
* @param history (CAL type: <code>Cal.Internal.Optimizer_State.TransformHistory</code>)
* @param expression (CAL type: <code>Cal.Internal.Optimizer_Expression.Expression</code>)
* @return (CAL type: <code>(Cal.Internal.Optimizer_State.TransformHistory, Cal.Core.Prelude.Boolean, Cal.Internal.Optimizer_Expression.Expression)</code>)
*/
public static final SourceModel.Expr transform_3_5_2_withInlining(SourceModel.Expr state, SourceModel.Expr history, SourceModel.Expr expression) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.transform_3_5_2_withInlining), state, history, expression});
}
/**
* Name binding for function: transform_3_5_2_withInlining.
* @see #transform_3_5_2_withInlining(org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr)
*/
public static final QualifiedName transform_3_5_2_withInlining =
QualifiedName.make(
CAL_Optimizer_Transformations_internal.MODULE_NAME,
"transform_3_5_2_withInlining");
/**
* 3.5.5 - Lambda floating through case. This is another one I made up and it
* not part of the original paper but would go here if it was.
* <p>
* case (\v1 v2 ... vk -> <expr>) of <alts>
* <p>
* to
* <p>
* \v1 v2 ... vk -> case expr of <alts>
* <p>
* TODO Rename the variables raised to avoid name capture.
*
* @param state (CAL type: <code>Cal.Internal.Optimizer_State.TransformState</code>)
* @param history (CAL type: <code>Cal.Internal.Optimizer_State.TransformHistory</code>)
* @param caseExpr (CAL type: <code>Cal.Internal.Optimizer_Expression.Expression</code>)
* @return (CAL type: <code>(Cal.Internal.Optimizer_State.TransformHistory, Cal.Core.Prelude.Boolean, Cal.Internal.Optimizer_Expression.Expression)</code>)
*/
public static final SourceModel.Expr transform_3_5_5(SourceModel.Expr state, SourceModel.Expr history, SourceModel.Expr caseExpr) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.transform_3_5_5), state, history, caseExpr});
}
/**
* Name binding for function: transform_3_5_5.
* @see #transform_3_5_5(org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr)
*/
public static final QualifiedName transform_3_5_5 =
QualifiedName.make(
CAL_Optimizer_Transformations_internal.MODULE_NAME,
"transform_3_5_5");
/**
* The `seq` and the seq type expression have a different form. This converts all of the expression so that
* they have the same form, the seq form.
* <p>
* These are the transformation that are performed :
* <p>
* 1. NOT VALID ((f (seq (seq x y) x)) y) => ((seq x (seq y (f x))) y) iff f is a variable and of type lambda expression
* 2. ((seq x y) z) => (seq x (y z))
* 3. (seq (seq x y) z) => (seq x (seq y z))
*
* @param state (CAL type: <code>Cal.Internal.Optimizer_State.TransformState</code>)
* @param history (CAL type: <code>Cal.Internal.Optimizer_State.TransformHistory</code>)
* @param expression (CAL type: <code>Cal.Internal.Optimizer_Expression.Expression</code>)
* @return (CAL type: <code>(Cal.Internal.Optimizer_State.TransformHistory, Cal.Core.Prelude.Boolean, Cal.Internal.Optimizer_Expression.Expression)</code>)
*/
public static final SourceModel.Expr transform_canonizeSeq(SourceModel.Expr state, SourceModel.Expr history, SourceModel.Expr expression) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.transform_canonizeSeq), state, history, expression});
}
/**
* Name binding for function: transform_canonizeSeq.
* @see #transform_canonizeSeq(org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr)
*/
public static final QualifiedName transform_canonizeSeq =
QualifiedName.make(
CAL_Optimizer_Transformations_internal.MODULE_NAME,
"transform_canonizeSeq");
/**
* Look for expressions of the form
* <p>
* switch expr of True -> altExpr1; False -> altExpr2;
* <p>
* and convert them to If applications
*
* @param expression (CAL type: <code>Cal.Internal.Optimizer_Expression.Expression</code>)
* The expression to check for switch to if conversions.
* <p>
* Note: Only does the conversion of the switch expression is not another switch expression.
*
* @return (CAL type: <code>Cal.Internal.Optimizer_Expression.Expression</code>)
*/
public static final SourceModel.Expr transform_convertToIfs(SourceModel.Expr expression) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.transform_convertToIfs), expression});
}
/**
* Name binding for function: transform_convertToIfs.
* @see #transform_convertToIfs(org.openquark.cal.compiler.SourceModel.Expr)
*/
public static final QualifiedName transform_convertToIfs =
QualifiedName.make(
CAL_Optimizer_Transformations_internal.MODULE_NAME,
"transform_convertToIfs");
/**
* For patterns that do not have all the variables defined. Complete the patterns with dummy variables.
* This makes pattern matching easier. For example
* <p>
* data d1 x y x
* <p>
* case value of
* d1 {x} -> ...
* <p>
* becomes
* <p>
* case value of
* d1 {x, y=dummy1, z=dummy2} ->
*
* @param state (CAL type: <code>Cal.Internal.Optimizer_State.TransformState</code>)
* @param history (CAL type: <code>Cal.Internal.Optimizer_State.TransformHistory</code>)
* @param expression (CAL type: <code>Cal.Internal.Optimizer_Expression.Expression</code>)
* @return (CAL type: <code>(Cal.Internal.Optimizer_State.TransformHistory, Cal.Core.Prelude.Boolean, Cal.Internal.Optimizer_Expression.Expression)</code>)
*/
public static final SourceModel.Expr transform_defineAllAltVariables(SourceModel.Expr state, SourceModel.Expr history, SourceModel.Expr expression) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.transform_defineAllAltVariables), state, history, expression});
}
/**
* Name binding for function: transform_defineAllAltVariables.
* @see #transform_defineAllAltVariables(org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr)
*/
public static final QualifiedName transform_defineAllAltVariables =
QualifiedName.make(
CAL_Optimizer_Transformations_internal.MODULE_NAME,
"transform_defineAllAltVariables");
/**
* Evaluate the given various arithmetic expression.
* <p>
* 1. Integer comparisons involving constants.
* 2. x + 0
* <p>
* TODO Work with vars
*
* @param state (CAL type: <code>Cal.Internal.Optimizer_State.TransformState</code>)
* @param history (CAL type: <code>Cal.Internal.Optimizer_State.TransformHistory</code>)
* @param expr (CAL type: <code>Cal.Internal.Optimizer_Expression.Expression</code>)
* @return (CAL type: <code>(Cal.Internal.Optimizer_State.TransformHistory, Cal.Core.Prelude.Boolean, Cal.Internal.Optimizer_Expression.Expression)</code>)
*/
public static final SourceModel.Expr transform_evaluateArithmeticExpressions(SourceModel.Expr state, SourceModel.Expr history, SourceModel.Expr expr) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.transform_evaluateArithmeticExpressions), state, history, expr});
}
/**
* Name binding for function: transform_evaluateArithmeticExpressions.
* @see #transform_evaluateArithmeticExpressions(org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr)
*/
public static final QualifiedName transform_evaluateArithmeticExpressions =
QualifiedName.make(
CAL_Optimizer_Transformations_internal.MODULE_NAME,
"transform_evaluateArithmeticExpressions");
/**
* Evaluate case expression with known values. See tests 22-29, 64, 66 and 88 in Optimizer_Test.cal for examples.
* @param state (CAL type: <code>Cal.Internal.Optimizer_State.TransformState</code>)
* @param history (CAL type: <code>Cal.Internal.Optimizer_State.TransformHistory</code>)
* @param caseExpr (CAL type: <code>Cal.Internal.Optimizer_Expression.Expression</code>)
* @return (CAL type: <code>(Cal.Internal.Optimizer_State.TransformHistory, Cal.Core.Prelude.Boolean, Cal.Internal.Optimizer_Expression.Expression)</code>)
*/
public static final SourceModel.Expr transform_evaluateCase(SourceModel.Expr state, SourceModel.Expr history, SourceModel.Expr caseExpr) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.transform_evaluateCase), state, history, caseExpr});
}
/**
* Name binding for function: transform_evaluateCase.
* @see #transform_evaluateCase(org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr)
*/
public static final QualifiedName transform_evaluateCase =
QualifiedName.make(
CAL_Optimizer_Transformations_internal.MODULE_NAME,
"transform_evaluateCase");
/**
* Evaluate record selection if possible. See tests 17-21 in Optimizer_Tests.cal
* <p>
* For example, (Just x).Just.value => x.
*
* @param state (CAL type: <code>Cal.Internal.Optimizer_State.TransformState</code>)
* @param history (CAL type: <code>Cal.Internal.Optimizer_State.TransformHistory</code>)
* @param expression (CAL type: <code>Cal.Internal.Optimizer_Expression.Expression</code>)
* @return (CAL type: <code>(Cal.Internal.Optimizer_State.TransformHistory, Cal.Core.Prelude.Boolean, Cal.Internal.Optimizer_Expression.Expression)</code>)
*/
public static final SourceModel.Expr transform_evaluateRecordSelection(SourceModel.Expr state, SourceModel.Expr history, SourceModel.Expr expression) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.transform_evaluateRecordSelection), state, history, expression});
}
/**
* Name binding for function: transform_evaluateRecordSelection.
* @see #transform_evaluateRecordSelection(org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr)
*/
public static final QualifiedName transform_evaluateRecordSelection =
QualifiedName.make(
CAL_Optimizer_Transformations_internal.MODULE_NAME,
"transform_evaluateRecordSelection");
/**
* This a hack. This will return true iff
* <p>
* 1. The expression contains non-top level cases.
* 2. The expression contains lambda expressions.
*
* @param isTopLevelExpr (CAL type: <code>Cal.Core.Prelude.Boolean</code>)
* Is this expression starting at the top level or lower. If lower then lambda's and case expressions are not allowed.
* @param expr (CAL type: <code>Cal.Internal.Optimizer_Expression.Expression</code>)
* The expression to check for bad structure.
* @return (CAL type: <code>Cal.Core.Prelude.Boolean</code>)
*/
public static final SourceModel.Expr transform_hasBadStructure(SourceModel.Expr isTopLevelExpr, SourceModel.Expr expr) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.transform_hasBadStructure), isTopLevelExpr, expr});
}
/**
* @see #transform_hasBadStructure(org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr)
* @param isTopLevelExpr
* @param expr
* @return the SourceModel.Expr representing an application of transform_hasBadStructure
*/
public static final SourceModel.Expr transform_hasBadStructure(boolean isTopLevelExpr, SourceModel.Expr expr) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.transform_hasBadStructure), SourceModel.Expr.makeBooleanValue(isTopLevelExpr), expr});
}
/**
* Name binding for function: transform_hasBadStructure.
* @see #transform_hasBadStructure(org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr)
*/
public static final QualifiedName transform_hasBadStructure =
QualifiedName.make(
CAL_Optimizer_Transformations_internal.MODULE_NAME,
"transform_hasBadStructure");
/**
* Convert if/then/else's into case expression. This is to avoid having to write
* special transformations for the 'if' expressions.
* @param state (CAL type: <code>Cal.Internal.Optimizer_State.TransformState</code>)
* The context of the current expression.
* @param expr (CAL type: <code>Cal.Internal.Optimizer_Expression.Expression</code>)
* The expression to transforms
* @return (CAL type: <code>Cal.Internal.Optimizer_Expression.Expression</code>)
* The expression with if/then/else call changed to a case expression if
* applicable.
* <p>
* TODO - rewrite this using flattenExpression;
*/
public static final SourceModel.Expr transform_if_to_case(SourceModel.Expr state, SourceModel.Expr expr) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.transform_if_to_case), state, expr});
}
/**
* Name binding for function: transform_if_to_case.
* @see #transform_if_to_case(org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr)
*/
public static final QualifiedName transform_if_to_case =
QualifiedName.make(
CAL_Optimizer_Transformations_internal.MODULE_NAME,
"transform_if_to_case");
/**
* Lift let definitions higher up to open the expression up for other optimizations. (3.4.3)
* <p>
* Input:
* <p>
* case (let v = ev in e) of alts
* <p>
* Output:
* <p>
* let v = ev in (case e of alts) where v is not free in alts.
*
* @param state (CAL type: <code>Cal.Internal.Optimizer_State.TransformState</code>)
* @param history (CAL type: <code>Cal.Internal.Optimizer_State.TransformHistory</code>)
* @param expr (CAL type: <code>Cal.Internal.Optimizer_Expression.Expression</code>)
* @return (CAL type: <code>(Cal.Internal.Optimizer_State.TransformHistory, Cal.Core.Prelude.Boolean, Cal.Internal.Optimizer_Expression.Expression)</code>)
*/
public static final SourceModel.Expr transform_letFloatingFromCaseScrutinee(SourceModel.Expr state, SourceModel.Expr history, SourceModel.Expr expr) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.transform_letFloatingFromCaseScrutinee), state, history, expr});
}
/**
* Name binding for function: transform_letFloatingFromCaseScrutinee.
* @see #transform_letFloatingFromCaseScrutinee(org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr)
*/
public static final QualifiedName transform_letFloatingFromCaseScrutinee =
QualifiedName.make(
CAL_Optimizer_Transformations_internal.MODULE_NAME,
"transform_letFloatingFromCaseScrutinee");
/**
* This transformation is tested be test 74. Removed redundant case checks.
* @param state (CAL type: <code>Cal.Internal.Optimizer_State.TransformState</code>)
* @param history (CAL type: <code>Cal.Internal.Optimizer_State.TransformHistory</code>)
* @param expression (CAL type: <code>Cal.Internal.Optimizer_Expression.Expression</code>)
* @return (CAL type: <code>(Cal.Internal.Optimizer_State.TransformHistory, Cal.Core.Prelude.Boolean, Cal.Internal.Optimizer_Expression.Expression)</code>)
*/
public static final SourceModel.Expr transform_redundantCases(SourceModel.Expr state, SourceModel.Expr history, SourceModel.Expr expression) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.transform_redundantCases), state, history, expression});
}
/**
* Name binding for function: transform_redundantCases.
* @see #transform_redundantCases(org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr)
*/
public static final QualifiedName transform_redundantCases =
QualifiedName.make(
CAL_Optimizer_Transformations_internal.MODULE_NAME,
"transform_redundantCases");
/**
* Remove unused variables from Alt patterns.
* @param expression (CAL type: <code>Cal.Internal.Optimizer_Expression.Expression</code>)
* @return (CAL type: <code>Cal.Internal.Optimizer_Expression.Expression</code>)
*/
public static final SourceModel.Expr transform_removeUnusedAltVariables(SourceModel.Expr expression) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.transform_removeUnusedAltVariables), expression});
}
/**
* Name binding for function: transform_removeUnusedAltVariables.
* @see #transform_removeUnusedAltVariables(org.openquark.cal.compiler.SourceModel.Expr)
*/
public static final QualifiedName transform_removeUnusedAltVariables =
QualifiedName.make(
CAL_Optimizer_Transformations_internal.MODULE_NAME,
"transform_removeUnusedAltVariables");
/**
* case x of True -> True; False -> False; => x
* case error arg of ... => error arg
* @param state (CAL type: <code>Cal.Internal.Optimizer_State.TransformState</code>)
* @param history (CAL type: <code>Cal.Internal.Optimizer_State.TransformHistory</code>)
* @param caseExpr (CAL type: <code>Cal.Internal.Optimizer_Expression.Expression</code>)
* @return (CAL type: <code>(Cal.Internal.Optimizer_State.TransformHistory, Cal.Core.Prelude.Boolean, Cal.Internal.Optimizer_Expression.Expression)</code>)
*/
public static final SourceModel.Expr transform_simplifyCase(SourceModel.Expr state, SourceModel.Expr history, SourceModel.Expr caseExpr) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.transform_simplifyCase), state, history, caseExpr});
}
/**
* Name binding for function: transform_simplifyCase.
* @see #transform_simplifyCase(org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr)
*/
public static final QualifiedName transform_simplifyCase =
QualifiedName.make(
CAL_Optimizer_Transformations_internal.MODULE_NAME,
"transform_simplifyCase");
/**
* Simplify statements such as "x `seq` x" to "x". See tests 30-32 in Optimizer_Tests.cal.
* Now also corresponds to tests 44 to 48, and 65, and 95.
* <p>
* The following transformations are performed.
* <p>
* 1. x `seq` x => x
* 2. Lambda x1 (Lambda x2 ... (prelude.seq x1 y) => Lambda !x1 (Lambda x2 ... y iff the intervening lambda vars are all not strict
* 3. (x `seq` case x of ...) => (case x of ...).
* 4. (seq x (seq y ((f x) y))) where f :: !a -> !b -> ... => (f x) y
* 5. y `seq` z => z iff y is known to be WHNF
* 6. (\!x -> case x of ...) => (\x -> case x of ...)
*
* @param state (CAL type: <code>Cal.Internal.Optimizer_State.TransformState</code>)
* @param history (CAL type: <code>Cal.Internal.Optimizer_State.TransformHistory</code>)
* @param expression (CAL type: <code>Cal.Internal.Optimizer_Expression.Expression</code>)
* @return (CAL type: <code>(Cal.Internal.Optimizer_State.TransformHistory, Cal.Core.Prelude.Boolean, Cal.Internal.Optimizer_Expression.Expression)</code>)
*/
public static final SourceModel.Expr transform_simplifySeq(SourceModel.Expr state, SourceModel.Expr history, SourceModel.Expr expression) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.transform_simplifySeq), state, history, expression});
}
/**
* Name binding for function: transform_simplifySeq.
* @see #transform_simplifySeq(org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr)
*/
public static final QualifiedName transform_simplifySeq =
QualifiedName.make(
CAL_Optimizer_Transformations_internal.MODULE_NAME,
"transform_simplifySeq");
/**
* Look for functions to create specializations of.
* <p>
* Input:
* <p>
* let f a1 a2 � ak = � (f a1 a2� � ai� � ak) � in � (f e1 e2 � ei � ek) �
* <p>
* The function f calls itself recursively. A number of arguments are passed
* unchanged so they are constant for any given call.
* <p>
* Output:
* <p>
* f� a2 �ai = � f a2� � ai� [e1/a1]�[ek/ak]
* <p>
* f� e2 � ei
* <p>
* Embed the constant values into the function f and remove the arguments from
* the calls. Change the call to call f1 instead of f.
* <p>
* Notes:
* <p>
* This makes two passes at specialization. The first pass will try embedding arguments even if
* the argument is not constant in the recursive function. If the function body reduces so there is
* no recursive call then the new function will be kept. For example,
* <p>
* test11 = test11_andListMap noStrictId [];
* <p>
* test11_andListMap nToTest !list =
* case list of
* [] -> True;
* head : tail -> nToTest head && test11_andListMap nToTest tail;
* ;
* <p>
* answer11 = True;
* <p>
* If the reduction fails then the old specialization will be applied.
*
* @param state (CAL type: <code>Cal.Internal.Optimizer_State.TransformState</code>)
* @param history (CAL type: <code>Cal.Internal.Optimizer_State.TransformHistory</code>)
* @param expr (CAL type: <code>Cal.Internal.Optimizer_Expression.Expression</code>)
* @return (CAL type: <code>(Cal.Internal.Optimizer_State.TransformHistory, Cal.Core.Prelude.Boolean, Cal.Internal.Optimizer_Expression.Expression)</code>)
*/
public static final SourceModel.Expr transform_specialization(SourceModel.Expr state, SourceModel.Expr history, SourceModel.Expr expr) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.transform_specialization), state, history, expr});
}
/**
* Name binding for function: transform_specialization.
* @see #transform_specialization(org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr, org.openquark.cal.compiler.SourceModel.Expr)
*/
public static final QualifiedName transform_specialization =
QualifiedName.make(
CAL_Optimizer_Transformations_internal.MODULE_NAME,
"transform_specialization");
/**
* Helper binding method for function: transformations.
* @return the SourceModule.expr representing an application of transformations
*/
public static final SourceModel.Expr transformations() {
return SourceModel.Expr.Var.make(Functions.transformations);
}
/**
* Name binding for function: transformations.
* @see #transformations()
*/
public static final QualifiedName transformations =
QualifiedName.make(
CAL_Optimizer_Transformations_internal.MODULE_NAME,
"transformations");
/**
* First pass at converting an expression to a type. This can be used to unify all the types and
* transfer type information across expressions.
* @param typeConstants (CAL type: <code>Cal.Internal.Optimizer_State.JPreludeTypeConstants</code>)
* @return (CAL type: <code>Cal.Core.Prelude.Boolean</code>)
*/
public static final SourceModel.Expr unitTests(SourceModel.Expr typeConstants) {
return
SourceModel.Expr.Application.make(
new SourceModel.Expr[] {SourceModel.Expr.Var.make(Functions.unitTests), typeConstants});
}
/**
* Name binding for function: unitTests.
* @see #unitTests(org.openquark.cal.compiler.SourceModel.Expr)
*/
public static final QualifiedName unitTests =
QualifiedName.make(
CAL_Optimizer_Transformations_internal.MODULE_NAME,
"unitTests");
}
/**
* A hash of the concatenated JavaDoc for this class (including inner classes).
* This value is used when checking for changes to generated binding classes.
*/
public static final int javaDocHash = 103300719;
}