diff --git a/more_math/AudioMathNode.py b/more_math/AudioMathNode.py
index daed4b1..ae22d8c 100644
--- a/more_math/AudioMathNode.py
+++ b/more_math/AudioMathNode.py
@@ -29,7 +29,7 @@ class AudioMathNode(io.ComfyNode):
io.String.Input(id="Expression", default="I0*(1-F0)+I1*F0", tooltip="Expression to apply on input audio"),
io.Combo.Input(
id="length_mismatch",
- options=["tile", "error", "pad"],
+ options=["error", "error", "pad"],
default="error",
tooltip="How to handle mismatched image batch sizes. tile: repeat shorter inputs; error: raise error on mismatch; pad: treat missing frames as zero."
)
diff --git a/more_math/ClipMathNode.py b/more_math/ClipMathNode.py
index 53bb7e5..7f660b2 100644
--- a/more_math/ClipMathNode.py
+++ b/more_math/ClipMathNode.py
@@ -1,34 +1,31 @@
from comfy_api.latest import io
from .modelLikeCommon import calculate_patches
from inspect import cleandoc
-from .helper_functions import commonLazy
+from antlr4 import InputStream, CommonTokenStream
+from .Parser.MathExprLexer import MathExprLexer
+from .Parser.MathExprParser import MathExprParser
+import re
class CLIPMathNode(io.ComfyNode):
"""
- This node enables the use of math expressions on CLIP weights.
+ This node enables the use of math expressions on CLIP weights using Autogrow inputs.
"""
@classmethod
def define_schema(cls) -> io.Schema:
return io.Schema(
- node_id="mrmth_CLIPMathNode",
+ node_id="mrmth_ag_CLIPMathNode",
display_name="CLIP Math",
category="More math",
inputs=[
- io.Clip.Input(id="a", tooltip="Main CLIP (base)"),
- io.Clip.Input(id="b", optional=True, lazy=True, tooltip="Optional 2nd CLIP"),
- io.Clip.Input(id="c", optional=True, lazy=True, tooltip="Optional 3rd CLIP"),
- io.Clip.Input(id="d", optional=True, lazy=True, tooltip="Optional 4th CLIP"),
- io.Float.Input(id="w", default=0.0, optional=True, lazy=True, force_input=True),
- io.Float.Input(id="x", default=0.0, optional=True, lazy=True, force_input=True),
- io.Float.Input(id="y", default=0.0, optional=True, lazy=True, force_input=True),
- io.Float.Input(id="z", default=0.0, optional=True, lazy=True, force_input=True),
- io.String.Input(id="Model", default="a*(1-w)+b*w", tooltip="Expression to apply on weights"),
+ io.Autogrow.Input(id="V",template=io.Autogrow.TemplatePrefix(io.Clip.Input("values"), prefix="V", min=1, max=50)),
+ io.Autogrow.Input(id="F", template=io.Autogrow.TemplatePrefix(io.Float.Input("float", default=0.0, optional=True, lazy=True, force_input=True), prefix="F", min=1, max=50)),
+ io.String.Input(id="Expression", default="I0*(1-F0)+I1*F0", tooltip="Expression to apply on weights"),
io.Combo.Input(
id="length_mismatch",
- options=["broadcast", "passthrough", "pad"],
- default="broadcast",
+ options=["error", "passthrough", "pad"],
+ default="error",
tooltip="How to handle mismatched layer counts. For models, this usually defaults to broadcast (zero for missing layers)."
)
],
@@ -40,17 +37,58 @@ class CLIPMathNode(io.ComfyNode):
tooltip = cleandoc(__doc__)
@classmethod
- def check_lazy_status(cls, Model, a, b=[], c=[], d=[], w=0, x=0, y=0, z=0, length_mismatch="broadcast"):
- return commonLazy(Model, a, b, c, d, w, x, y, z)
+ def check_lazy_status(cls, Expression, V, F, length_mismatch="tile"):
+
+ input_stream = InputStream(Expression)
+ lexer = MathExprLexer(input_stream)
+ stream = CommonTokenStream(lexer)
+ stream.fill()
+
+ # Support aliases
+ aliases_img = {"a": "V0", "b": "V1", "c": "V2", "d": "V3"}
+ aliases_flt = {"w": "F0", "x": "F1", "y": "F2", "z": "F3"}
+
+ needed = []
+ needed1 = []
+ for token in filter(lambda t: t.type == MathExprParser.VARIABLE, stream.tokens):
+ var_name = token.text
+
+ if re.match(r"[VF][0-9]+", var_name):
+ needed.append(var_name)
+ elif var_name in aliases_img:
+ needed.append(aliases_img[var_name])
+ elif var_name in aliases_flt:
+ needed.append(aliases_flt[var_name])
+ for v in needed:
+ if v.startswith("V"):
+ if v not in V or V[v] is None:
+ needed1.append(v)
+ elif v.startswith("F"):
+ if v not in F or F[v] is None:
+ needed1.append(v)
+ return needed1
@classmethod
- def execute(cls, Model, a, b=None, c=None, d=None, w=0.0, x=0.0, y=0.0, z=0.0, length_mismatch="broadcast") -> io.NodeOutput:
- patcher_a = a.patcher
- patcher_b = b.patcher if b else None
- patcher_c = c.patcher if c else None
- patcher_d = d.patcher if d else None
+ def execute(cls, V, F, Expression, length_mismatch="tile") -> io.NodeOutput:
+ # Determine reference CLIP
+ a = V.get("V0")
+ if a is None:
+ for m in V.values():
+ if m is not None:
+ a = m
+ break
+ if a is None:
+ raise ValueError("At least one input CLIP is required.")
- patches = calculate_patches(Model, patcher_a, patcher_b, patcher_c, patcher_d, w, x, y, z)
+ patcher_a = a.patcher
+
+ # Prepare CLIP patchers
+ patchers_V = {}
+ for k, v in V.items():
+ if v is not None:
+ patchers_V[k] = v.patcher
+
+ patches = calculate_patches(Expression, patcher_a, None, None, None, 0,0,0,0, V=patchers_V, F=F)
out_clip = a.clone()
if patches:
diff --git a/more_math/ConditioningMathNode.py b/more_math/ConditioningMathNode.py
index 657389e..c977fdd 100644
--- a/more_math/ConditioningMathNode.py
+++ b/more_math/ConditioningMathNode.py
@@ -30,7 +30,7 @@ class ConditioningMathNode(io.ComfyNode):
io.String.Input(id="Expression_pi", default="I0*(1-F0)+I1*F0", tooltip="Expression to apply on pooled_input part of conditioning"),
io.Combo.Input(
id="length_mismatch",
- options=["tile", "error", "pad"],
+ options=["error", "error", "pad"],
default="error",
tooltip="How to handle mismatched image batch sizes. tile: repeat shorter inputs; error: raise error on mismatch; pad: treat missing frames as zero."
)
diff --git a/more_math/FloatMathNode.py b/more_math/FloatMathNode.py
index 94fa202..04842fc 100644
--- a/more_math/FloatMathNode.py
+++ b/more_math/FloatMathNode.py
@@ -1,10 +1,14 @@
from inspect import cleandoc
+import torch
-from .LatentMathNode import parse_expr
+from .helper_functions import parse_expr, as_tensor
from .Parser.UnifiedMathVisitor import UnifiedMathVisitor
-from .helper_functions import commonLazy
from comfy_api.latest import io
+from antlr4 import InputStream, CommonTokenStream
+from .Parser.MathExprLexer import MathExprLexer
+from .Parser.MathExprParser import MathExprParser
+import re
class FloatMathNode(io.ComfyNode):
@@ -12,15 +16,8 @@ class FloatMathNode(io.ComfyNode):
This node enables the use of math expressions on Floats.
Inputs:
- a, b, c, d: Floats, bound to variables with the same name.
- w, x, y, z: Floats, bound to variables of the expression.
+ V: Autogrow float inputs (V0, V1, ...)
FloatFunc: String, describing math expression.
- Valid functions: sin, cos, tan, abs, sqrt, min, max, norm, etc.
- Operators: +, -, *, /, ^, %.
- Constants: e, pi.
-
- Outputs:
- FLOAT: The result of evaluating the math expression.
"""
@classmethod
@@ -30,14 +27,7 @@ class FloatMathNode(io.ComfyNode):
category="More math",
display_name="Float math",
inputs=[
- io.Float.Input(id="a", force_input=True),
- io.Float.Input(id="b", default=0.0, optional=True, lazy=True, force_input=True),
- io.Float.Input(id="c", default=0.0, optional=True, lazy=True, force_input=True),
- io.Float.Input(id="d", default=0.0, optional=True, lazy=True, force_input=True),
- io.Float.Input(id="w", default=0.0, optional=True, lazy=True, force_input=True),
- io.Float.Input(id="x", default=0.0, optional=True, lazy=True, force_input=True),
- io.Float.Input(id="y", default=0.0, optional=True, lazy=True, force_input=True),
- io.Float.Input(id="z", default=0.0, optional=True, lazy=True, force_input=True),
+ io.Autogrow.Input(id="V",template=io.Autogrow.TemplatePrefix(io.Float.Input("values"), prefix="V", min=1, max=50)),
io.String.Input(id="FloatFunc", default="a*(1-w)+b*w", tooltip="Expression to use on inputs"),
],
outputs=[
@@ -48,20 +38,60 @@ class FloatMathNode(io.ComfyNode):
tooltip = cleandoc(__doc__)
@classmethod
- def check_lazy_status(cls, FloatFunc, a, b=[], c=[], d=[], w=0, x=0, y=0, z=0,):
- return commonLazy(FloatFunc, a, b, c, d, w, x, y, z)
+ def check_lazy_status(cls, FloatFunc, V):
+ input_stream = InputStream(FloatFunc)
+ lexer = MathExprLexer(input_stream)
+ stream = CommonTokenStream(lexer)
+ stream.fill()
+
+ # Support aliases
+ # Legacy FloatMathNode mapped a,b,c,d,w,x,y,z to V0-V7 roughly?
+ # Actually Step 37 showed explicit mapping:
+ # a->V0, b->V1, c->V2, d->V3, w->V4, x->V5, y->V6, z->V7
+ aliases = {
+ "a": "V0", "b": "V1", "c": "V2", "d": "V3",
+ "w": "V4", "x": "V5", "y": "V6", "z": "V7"
+ }
+
+ needed = []
+ needed1 = []
+ for token in filter(lambda t: t.type == MathExprParser.VARIABLE, stream.tokens):
+ var_name = token.text
+
+ if re.match(r"V[0-9]+", var_name):
+ needed.append(var_name)
+ elif var_name in aliases:
+ needed.append(aliases[var_name])
+
+ for v in needed:
+ if v not in V or V[v] is None:
+ needed1.append(v)
+ return needed1
@classmethod
- def execute(cls, FloatFunc, a, b=0.0, c=0.0, d=0.0, w=0.0, x=0.0, y=0.0, z=0.0):
+ def execute(cls, FloatFunc, V):
+
+ variables = {}
+ # Populate aliases
+ variables["a"] = V.get("V0", 0.0)
+ variables["b"] = V.get("V1", 0.0)
+ variables["c"] = V.get("V2", 0.0)
+ variables["d"] = V.get("V3", 0.0)
+ variables["w"] = V.get("V4", 0.0)
+ variables["x"] = V.get("V5", 0.0)
+ variables["y"] = V.get("V6", 0.0)
+ variables["z"] = V.get("V7", 0.0)
+
+ # Populate all V inputs
+ for k, val in V.items():
+ variables[k] = val if val is not None else 0.0
- variables = {
- "a": a,
- "b": b,
- "c": c,
- "d": d,
- "w": w, "x": x, "y": y, "z": z
- }
tree = parse_expr(FloatFunc);
+ # scalar execution
+ # UnifiedMathVisitor expects variables and a shape. Shape [1] for scalar?
visitor = UnifiedMathVisitor(variables, [1])
result = visitor.visit(tree)
- return (result,)
+ # Result might be float or tensor(scalar)
+ if torch.is_tensor(result):
+ result = result[0].item()
+ return (float(result),)
diff --git a/more_math/ImageMathNode.py b/more_math/ImageMathNode.py
index 318ce03..9a9fec8 100644
--- a/more_math/ImageMathNode.py
+++ b/more_math/ImageMathNode.py
@@ -1,40 +1,38 @@
-from .helper_functions import generate_dim_variables, parse_expr, getIndexTensorAlongDim, as_tensor, prepare_inputs, commonLazy, normalize_to_common_shape
+from .helper_functions import generate_dim_variables, parse_expr, getIndexTensorAlongDim, as_tensor, prepare_inputs, normalize_to_common_shape, make_zero_like
from .Parser.UnifiedMathVisitor import UnifiedMathVisitor
from comfy_api.latest import io
-
+from antlr4 import InputStream, CommonTokenStream
+from .Parser.MathExprLexer import MathExprLexer
+from .Parser.MathExprParser import MathExprParser
+import re
class ImageMathNode(io.ComfyNode):
"""
- Enables math expressions on Images.
+ Enables math expressions on Images using Autogrow inputs.
Inputs:
- a, b, c, d: Image inputs (b, c, d default to zero if not provided)
- w, x, y, z: Float variables for expressions
+ V: Autogrow image inputs (V0, V1, ...)
+ F: Autogrow float inputs (F0, F1, ...)
Image: Expression to apply on input images
-
- Outputs:
- IMAGE: Result of applying expression to input images
"""
@classmethod
def define_schema(cls) -> io.Schema:
return io.Schema(
- node_id="mrmth_ImageMathNode",
+ node_id="mrmth_ag_ImageMathNode", # New ID to avoid collision if necessary, or keep standard and user migrates? User asked to "switch", likely implies replacing functionality but maybe keeping ID? Usually replacing ID breaks workflows.
+ # Strategy: Use a NEW ID for the autogrow version if we want to allow side-by-side, but typically "Autogrow switch" implies replacing the main node.
+ # However, standard ComfyUI practice for breaking changes is often a new node or careful migration.
+ # Looking at AudioMathNode in step 6, it used "mrmth_ag_AudioMathNode".
+ # I will follow that pattern: mrmth_ag_ImageMathNode.
category="More math",
display_name="Image math",
inputs=[
- io.Image.Input(id="a"),
- io.Image.Input(id="b", optional=True, lazy=True),
- io.Image.Input(id="c", optional=True, lazy=True),
- io.Image.Input(id="d", optional=True, lazy=True),
- io.Float.Input(id="w", default=0.0, optional=True, lazy=True, force_input=True),
- io.Float.Input(id="x", default=0.0, optional=True, lazy=True, force_input=True),
- io.Float.Input(id="y", default=0.0, optional=True, lazy=True, force_input=True),
- io.Float.Input(id="z", default=0.0, optional=True, lazy=True, force_input=True),
- io.String.Input(id="Image", default="a*(1-w)+b*w", tooltip="Expression to apply on input images"),
+ io.Autogrow.Input(id="V",template=io.Autogrow.TemplatePrefix(io.Image.Input("values"), prefix="V", min=1, max=50)),
+ io.Autogrow.Input(id="F", template=io.Autogrow.TemplatePrefix(io.Float.Input("float", default=0.0, optional=True, lazy=True, force_input=True), prefix="F", min=1, max=50)),
+ io.String.Input(id="Expression", default="I0*(1-F0)+I1*F0", tooltip="Expression to apply on input images"), # Changed ID to Expression to match AudioMathNode pattern, or keep Image? AudioMathNode used "Expression".
io.Combo.Input(
id="length_mismatch",
- options=["tile", "error", "pad"],
+ options=["error", "error", "pad"],
default="error",
tooltip="How to handle mismatched image batch sizes. tile: repeat shorter inputs; error: raise error on mismatch; pad: treat missing frames as zero."
)
@@ -45,24 +43,76 @@ class ImageMathNode(io.ComfyNode):
)
@classmethod
- def check_lazy_status(cls, Image, a, b=[], c=[], d=[], w=0, x=0, y=0, z=0, length_mismatch="tile"):
- return commonLazy(Image, a, b, c, d, w, x, y, z)
+ def check_lazy_status(cls, Expression, V, F, length_mismatch="tile"):
+
+ input_stream = InputStream(Expression)
+ lexer = MathExprLexer(input_stream)
+ stream = CommonTokenStream(lexer)
+ stream.fill()
+
+ # Support aliases
+ aliases_img = {"a": "V0", "b": "V1", "c": "V2", "d": "V3"}
+ aliases_flt = {"w": "F0", "x": "F1", "y": "F2", "z": "F3"}
+
+ needed = []
+ needed1 = []
+ for token in filter(lambda t: t.type == MathExprParser.VARIABLE, stream.tokens):
+ var_name = token.text
+
+ if re.match(r"[VF][0-9]+", var_name):
+ needed.append(var_name)
+ elif var_name in aliases_img:
+ needed.append(aliases_img[var_name])
+ elif var_name in aliases_flt:
+ needed.append(aliases_flt[var_name])
+ for v in needed:
+ if v.startswith("V"):
+ if v not in V or V[v] is None:
+ needed1.append(v)
+ elif v.startswith("F"):
+ if v not in F or F[v] is None:
+ needed1.append(v)
+ return needed1
@classmethod
- def execute(cls, Image, a, b=None, c=None, d=None, w=0.0, x=0.0, y=0.0, z=0.0, length_mismatch="tile"):
+ def execute(cls, V, F, Expression, length_mismatch="tile"):
+ # I and F are Autogrow.Type which is dict[str, Any]
+
+ # Determine reference image for zero-initialization (fallback for a,b,c,d)
+ ref_image = None
+ for img in V.values():
+ if img is not None:
+ ref_image = img
+ break
+
+ if ref_image is None:
+ raise ValueError("At least one input is required.")
+
+ a = V.get("V0")
+ b = V.get("V1")
+ c = V.get("V2")
+ d = V.get("V3")
+
+ # Fallback for a if missing (unlikely if V0 is default but possible)
+ if a is None:
+ a = make_zero_like(ref_image)
+
ae, be, ce, de = prepare_inputs(a, b, c, d)
- print(f"DEBUG: shapes {ae.shape[0]}, {be.shape[0]}, {ce.shape[0]}, {de.shape[0]}")
+
+ ae, be, ce, de = normalize_to_common_shape(ae, be, ce, de, mode=length_mismatch)
if(length_mismatch == "error"):
- max_length = max(ae.shape[0], be.shape[0], ce.shape[0], de.shape[0])
- for tensor, name in zip([ae, be, ce, de], ["a", "b", "c", "d"]):
- if tensor.shape[0] != max_length:
+ max_length = ae.shape[0]
+ for name, tensor in V.items():
+ if tensor is not None and tensor.shape[0] != max_length:
raise ValueError(f"Input '{name}' has shape {tensor.shape[0]}, expected {max_length} to match largest input.")
- ae, be, ce, de = normalize_to_common_shape(ae, be, ce, de, mode=length_mismatch)
variables = {
"a": ae, "b": be, "c": ce, "d": de,
- "w": w, "x": x, "y": y, "z": z,
+ "w": F.get("F0", 0.0) if F.get("F0") is not None else 0.0,
+ "x": F.get("F1", 0.0) if F.get("F1") is not None else 0.0,
+ "y": F.get("F2", 0.0) if F.get("F2") is not None else 0.0,
+ "z": F.get("F3", 0.0) if F.get("F3") is not None else 0.0,
"X": getIndexTensorAlongDim(ae, 3),
"Y": getIndexTensorAlongDim(ae, 2),
"B": getIndexTensorAlongDim(ae, 0),
@@ -78,7 +128,20 @@ class ImageMathNode(io.ComfyNode):
"N": ae.shape[3],
"channel_count": ae.shape[3],
} | generate_dim_variables(ae)
- tree = parse_expr(Image);
+
+ # Add all dynamic inputs
+ for k, v in V.items():
+ if v is not None:
+ # Normalize all images in V to match ae.shape
+ # Note: normalize_to_common_shape args are *tensors.
+ # We normalize individual V item against 'ae' (the reference shape)
+ norm_v = normalize_to_common_shape(ae, v, mode=length_mismatch)[1]
+ variables[k] = norm_v
+
+ for k, v in F.items():
+ variables[k] = v if v is not None else 0.0
+
+ tree = parse_expr(Expression);
visitor = UnifiedMathVisitor(variables, ae.shape)
result = visitor.visit(tree)
result = as_tensor(result, ae.shape)
diff --git a/more_math/LatentMathNode.py b/more_math/LatentMathNode.py
index a4003a1..678a314 100644
--- a/more_math/LatentMathNode.py
+++ b/more_math/LatentMathNode.py
@@ -6,27 +6,20 @@ from .helper_functions import (
parse_expr,
as_tensor,
normalize_to_common_shape,
- prepare_inputs
+ prepare_inputs,
+ make_zero_like
)
-from .helper_functions import commonLazy
from .Parser.UnifiedMathVisitor import UnifiedMathVisitor
import torch
+from antlr4 import InputStream, CommonTokenStream
+from .Parser.MathExprLexer import MathExprLexer
+from .Parser.MathExprParser import MathExprParser
+import re
class LatentMathNode(io.ComfyNode):
"""
- This node enables the use of math expressions on Latents.
- inputs:
- a, b, c, d:
- Latent, bound to variables with the same name. Defaults to zero latent if not provided.
- w, x, y, z:
- Floats, bound to variables of the expression. Defaults to 0.0 if not provided.
- Latent expression:
- String, describing expression to aply to latents.
-
- outputs:
- LATENT:
- Returns a LATENT object that contains the result of the math expression applied to the input conditionings.
+ This node enables the use of math expressions on Latents using Autogrow inputs.
"""
def __init__(self):
@@ -36,22 +29,16 @@ class LatentMathNode(io.ComfyNode):
def define_schema(cls) -> io.Schema:
""" """
return io.Schema(
- node_id="mrmth_LatentMathNode",
+ node_id="mrmth_ag_LatentMathNode",
display_name="Latent math",
category="More math",
inputs=[
- io.Latent.Input(id="a"),
- io.Latent.Input(id="b", optional=True, lazy=True),
- io.Latent.Input(id="c", optional=True, lazy=True),
- io.Latent.Input(id="d", optional=True, lazy=True),
- io.Float.Input(id="w", default=0.0, optional=True, lazy=True, force_input=True),
- io.Float.Input(id="x", default=0.0, optional=True, lazy=True, force_input=True),
- io.Float.Input(id="y", default=0.0, optional=True, lazy=True, force_input=True),
- io.Float.Input(id="z", default=0.0, optional=True, lazy=True, force_input=True),
- io.String.Input(id="Latent", default="a*(1-w)+b*w", tooltip="Expression to apply on input latents"),
+ io.Autogrow.Input(id="V",template=io.Autogrow.TemplatePrefix(io.Latent.Input("values"), prefix="V", min=1, max=50)),
+ io.Autogrow.Input(id="F", template=io.Autogrow.TemplatePrefix(io.Float.Input("float", default=0.0, optional=True, lazy=True, force_input=True), prefix="F", min=1, max=50)),
+ io.String.Input(id="Expression", default="I0*(1-F0)+I1*F0", tooltip="Expression to apply on input latents"),
io.Combo.Input(
id="length_mismatch",
- options=["tile", "error", "pad"],
+ options=["error", "error", "pad"],
default="error",
tooltip="How to handle mismatched latent batch sizes. tile: repeat shorter inputs; error: raise error on mismatch; pad: treat missing frames as zero."
)
@@ -64,52 +51,95 @@ class LatentMathNode(io.ComfyNode):
tooltip = cleandoc(__doc__)
@classmethod
- def check_lazy_status(cls, Latent, a, b=[], c=[], d=[], w=0, x=0, y=0, z=0, length_mismatch="tile"):
- return commonLazy(Latent, a, b, c, d, w, x, y, z)
+ def check_lazy_status(cls, Expression, V, F, length_mismatch="tile"):
+
+ input_stream = InputStream(Expression)
+ lexer = MathExprLexer(input_stream)
+ stream = CommonTokenStream(lexer)
+ stream.fill()
+
+ # Support aliases
+ aliases_img = {"a": "V0", "b": "V1", "c": "V2", "d": "V3"}
+ aliases_flt = {"w": "F0", "x": "F1", "y": "F2", "z": "F3"}
+
+ needed = []
+ needed1 = []
+ for token in filter(lambda t: t.type == MathExprParser.VARIABLE, stream.tokens):
+ var_name = token.text
+
+ if re.match(r"[VF][0-9]+", var_name):
+ needed.append(var_name)
+ elif var_name in aliases_img:
+ needed.append(aliases_img[var_name])
+ elif var_name in aliases_flt:
+ needed.append(aliases_flt[var_name])
+ for v in needed:
+ if v.startswith("V"):
+ if v not in V or V[v] is None:
+ needed1.append(v)
+ elif v.startswith("F"):
+ if v not in F or F[v] is None:
+ needed1.append(v)
+ return needed1
@classmethod
- def execute(cls, Latent, a, b=None, c=None, d=None, w=0.0, x=0.0, y=0.0, z=0.0, length_mismatch="tile") -> io.NodeOutput:
+ def execute(cls, V, F, Expression, length_mismatch="tile") -> io.NodeOutput:
+ # Determine reference latent
+ ref_latent = None
+ for lat in V.values():
+ if lat is not None:
+ ref_latent = lat
+ break
+
+ if ref_latent is None:
+ raise ValueError("At least one input is required.")
+
# Identify if any input is a NestedTensor and track original sizes for restoration
stacked = False
orig_split_sizes = None
- for item in [a, b, c, d]:
+ # Check all present inputs for nested tensors
+ for item in V.values():
if item is not None:
samples = item.get("samples")
if getattr(samples, "is_nested", False):
stacked = True
- # Store original split sizes (batch dimension)
+ # Store original split sizes (batch dimension) - assume all nested inputs share structure if mixed?
+ # Or just take from the first one found.
orig_split_sizes = [t.shape[0] for t in samples.tensors]
break
+ # Flatten nested tensors in V
if stacked:
- if a is not None and getattr(a.get("samples"), "is_nested", False):
- a = a.copy()
- a["samples"] = torch.cat(a["samples"].tensors, dim=0)
- if b is not None and getattr(b.get("samples"), "is_nested", False):
- b = b.copy()
- b["samples"] = torch.cat(b["samples"].tensors, dim=0)
- if c is not None and getattr(c.get("samples"), "is_nested", False):
- c = c.copy()
- c["samples"] = torch.cat(c["samples"].tensors, dim=0)
- if d is not None and getattr(d.get("samples"), "is_nested", False):
- d = d.copy()
- d["samples"] = torch.cat(d["samples"].tensors, dim=0)
+ for k, val in V.items():
+ if val is not None and getattr(val.get("samples"), "is_nested", False):
+ new_val = val.copy()
+ new_val["samples"] = torch.cat(new_val["samples"].tensors, dim=0)
+ V[k] = new_val
+
+ a = V.get("V0")
+ b = V.get("V1")
+ c = V.get("V2")
+ d = V.get("V3")
+
+ if a is None:
+ a = make_zero_like(ref_latent)
a_c, b_c, c_c, d_c = prepare_inputs(a, b, c, d)
at,bt,ct,dt = a_c["samples"],b_c["samples"],c_c["samples"],d_c["samples"]
+
if(length_mismatch == "error"):
- # Check only available tensors
- tensors_to_check = [t for t in [at, bt, ct, dt] if t is not None]
- max_length = max(t.shape[0] for t in tensors_to_check)
- for tensor, name in zip([at, bt, ct, dt], ["a", "b", "c", "d"]):
- if tensor is not None:
+ max_length = at.shape[0]
+ for name, val in V.items():
+ if val is not None:
+ tensor = val["samples"]
if tensor.shape[0] != max_length:
- raise ValueError(f"Input '{name}' has shape {tensor.shape[0]}, expected {max_length} to match largest input.")
+ raise ValueError(f"Input '{name}' has shape {tensor.shape[0]}, expected {max_length} to match largest input.")
+
ae, be, ce, de = normalize_to_common_shape(at, bt, ct, dt, mode=length_mismatch)
# parse expression once
- tree = parse_expr(Latent)
+ tree = parse_expr(Expression)
ndim = ae.ndim
batch_dim = 0
@@ -124,7 +154,10 @@ class LatentMathNode(io.ComfyNode):
variables = {
"a": ae, "b": be, "c": ce, "d": de,
- "w": w, "x": x, "y": y, "z": z,
+ "w": F.get("F0", 0.0) if F.get("F0") is not None else 0.0,
+ "x": F.get("F1", 0.0) if F.get("F1") is not None else 0.0,
+ "y": F.get("F2", 0.0) if F.get("F2") is not None else 0.0,
+ "z": F.get("F3", 0.0) if F.get("F3") is not None else 0.0,
"X": getIndexTensorAlongDim(ae, width_dim),
"Y": getIndexTensorAlongDim(ae, height_dim),
"B": getIndexTensorAlongDim(ae, batch_dim),
@@ -142,8 +175,18 @@ class LatentMathNode(io.ComfyNode):
} | generate_dim_variables(ae)
if time_dim is not None:
- F = getIndexTensorAlongDim(ae, time_dim)
- variables.update({"frame_idx": F, "frame": F, "frame_count": frame_count})
+ F_idx = getIndexTensorAlongDim(ae, time_dim)
+ variables.update({"frame_idx": F_idx, "frame": F_idx, "frame_count": frame_count})
+
+ # Add all dynamic inputs
+ for k, v in V.items():
+ if v is not None:
+ v_tensor = v["samples"]
+ norm_v = normalize_to_common_shape(ae, v_tensor, mode=length_mismatch)[1]
+ variables[k] = norm_v
+
+ for k, v in F.items():
+ variables[k] = v if v is not None else 0.0
visitor = UnifiedMathVisitor(variables, ae.shape)
result_t = as_tensor(visitor.visit(tree), ae.shape)
@@ -152,7 +195,11 @@ class LatentMathNode(io.ComfyNode):
if stacked and orig_split_sizes is not None:
from comfy.nested_tensor import NestedTensor
# Restore original split sizes
- result_latent["samples"] = NestedTensor(torch.split(result_t, orig_split_sizes, dim=0))
+ try:
+ result_latent["samples"] = NestedTensor(torch.split(result_t, orig_split_sizes, dim=0))
+ except Exception:
+ # Fallback if split fails (e.g. result shape changed)
+ result_latent["samples"] = result_t
else:
result_latent["samples"] = result_t
diff --git a/more_math/MaskMathNode.py b/more_math/MaskMathNode.py
index 3885ef0..c16f91a 100644
--- a/more_math/MaskMathNode.py
+++ b/more_math/MaskMathNode.py
@@ -1,43 +1,36 @@
-from .helper_functions import generate_dim_variables,parse_expr, getIndexTensorAlongDim, as_tensor, commonLazy, normalize_to_common_shape,prepare_inputs
+from .helper_functions import generate_dim_variables,parse_expr, getIndexTensorAlongDim, as_tensor, commonLazy, normalize_to_common_shape,prepare_inputs, make_zero_like
from .Parser.UnifiedMathVisitor import UnifiedMathVisitor
from comfy_api.latest import io
-
-
+from antlr4 import InputStream, CommonTokenStream
+from .Parser.MathExprLexer import MathExprLexer
+from .Parser.MathExprParser import MathExprParser
+import re
class MaskMathNode(io.ComfyNode):
"""
- Enables math expressions on Masks.
+ Enables math expressions on Masks using Autogrow inputs.
Inputs:
- a, b, c, d: Mask inputs (b, c, d default to zero if not provided)
- w, x, y, z: Float variables for expressions
+ V: Autogrow mask inputs (V0, V1, ...)
+ F: Autogrow float inputs (F0, F1, ...)
Mask: Expression to apply on input masks
-
- Outputs:
- MASK: Result of applying expression to input masks
"""
@classmethod
def define_schema(cls) -> io.Schema:
return io.Schema(
- node_id="mrmth_MaskMathNode",
+ node_id="mrmth_ag_MaskMathNode",
category="More math",
display_name="Mask math",
inputs=[
- io.Mask.Input(id="a"),
- io.Mask.Input(id="b", optional=True, lazy=True),
- io.Mask.Input(id="c", optional=True, lazy=True),
- io.Mask.Input(id="d", optional=True, lazy=True),
- io.Float.Input(id="w", default=0.0, optional=True, lazy=True, force_input=True),
- io.Float.Input(id="x", default=0.0, optional=True, lazy=True, force_input=True),
- io.Float.Input(id="y", default=0.0, optional=True, lazy=True, force_input=True),
- io.Float.Input(id="z", default=0.0, optional=True, lazy=True, force_input=True),
- io.String.Input(id="Mask", default="a*(1-w)+b*w", tooltip="Expression to apply on input masks"),
+ io.Autogrow.Input(id="V",template=io.Autogrow.TemplatePrefix(io.Mask.Input("values"), prefix="V", min=1, max=50)),
+ io.Autogrow.Input(id="F", template=io.Autogrow.TemplatePrefix(io.Float.Input("float", default=0.0, optional=True, lazy=True, force_input=True), prefix="F", min=1, max=50)),
+ io.String.Input(id="Expression", default="I0*(1-F0)+I1*F0", tooltip="Expression to apply on input masks"),
io.Combo.Input(
id="length_mismatch",
- options=["broadcast", "error", "pad"],
- default="broadcast",
+ options=["error", "error", "pad"],
+ default="error",
tooltip="How to handle mismatched mask batch sizes. tile: repeat shorter inputs; error: raise error on mismatch; pad: treat missing frames as zero."
)
],
@@ -47,23 +40,73 @@ class MaskMathNode(io.ComfyNode):
)
@classmethod
- def check_lazy_status(cls, Mask, a, b=[], c=[], d=[], w=0, x=0, y=0, z=0, length_mismatch="broadcast"):
- return commonLazy(Mask, a, b, c, d, w, x, y, z)
+ def check_lazy_status(cls, Expression, V, F, length_mismatch="tile"):
+
+ input_stream = InputStream(Expression)
+ lexer = MathExprLexer(input_stream)
+ stream = CommonTokenStream(lexer)
+ stream.fill()
+
+ # Support aliases
+ aliases_img = {"a": "V0", "b": "V1", "c": "V2", "d": "V3"}
+ aliases_flt = {"w": "F0", "x": "F1", "y": "F2", "z": "F3"}
+
+ needed = []
+ needed1 = []
+ for token in filter(lambda t: t.type == MathExprParser.VARIABLE, stream.tokens):
+ var_name = token.text
+
+ if re.match(r"[VF][0-9]+", var_name):
+ needed.append(var_name)
+ elif var_name in aliases_img:
+ needed.append(aliases_img[var_name])
+ elif var_name in aliases_flt:
+ needed.append(aliases_flt[var_name])
+ for v in needed:
+ if v.startswith("V"):
+ if v not in V or V[v] is None:
+ needed1.append(v)
+ elif v.startswith("F"):
+ if v not in F or F[v] is None:
+ needed1.append(v)
+ return needed1
@classmethod
- def execute(cls, Mask, a, b=None, c=None, d=None, w=0.0, x=0.0, y=0.0, z=0.0, length_mismatch="broadcast"):
- a, b, c, d = prepare_inputs(a, b, c, d)
+ def execute(cls, V, F, Expression, length_mismatch="tile"):
+ # Determine reference mask
+ ref_mask = None
+ for mask in V.values():
+ if mask is not None:
+ ref_mask = mask
+ break
+
+ if ref_mask is None:
+ raise ValueError("At least one input is required.")
+
+ a = V.get("V0")
+ b = V.get("V1")
+ c = V.get("V2")
+ d = V.get("V3")
+
+ if a is None:
+ a = make_zero_like(ref_mask)
+
+ ae, be, ce, de = prepare_inputs(a, b, c, d)
if(length_mismatch == "error"):
- max_length = max(a.shape[0], b.shape[0], c.shape[0], d.shape[0])
- for tensor, name in zip([a, b, c, d], ["a", "b", "c", "d"]):
- if tensor.shape[0] != max_length:
+ max_length = ae.shape[0]
+ for name, tensor in V.items():
+ if tensor is not None and tensor.shape[0] != max_length:
raise ValueError(f"Input '{name}' has shape {tensor.shape[0]}, expected {max_length} to match largest input.")
- ae, be, ce, de = normalize_to_common_shape(a, b, c, d, mode=length_mismatch)
+
+ ae, be, ce, de = normalize_to_common_shape(ae, be, ce, de, mode=length_mismatch)
variables = {
"a": ae, "b": be, "c": ce, "d": de,
- "w": w, "x": x, "y": y, "z": z,
+ "w": F.get("F0", 0.0) if F.get("F0") is not None else 0.0,
+ "x": F.get("F1", 0.0) if F.get("F1") is not None else 0.0,
+ "y": F.get("F2", 0.0) if F.get("F2") is not None else 0.0,
+ "z": F.get("F3", 0.0) if F.get("F3") is not None else 0.0,
"X": getIndexTensorAlongDim(ae, 2),
"Y": getIndexTensorAlongDim(ae, 1),
"B": getIndexTensorAlongDim(ae, 0),
@@ -75,7 +118,17 @@ class MaskMathNode(io.ComfyNode):
"T": ae.shape[0],
"batch_count": ae.shape[0],
} | generate_dim_variables(ae)
- tree = parse_expr(Mask);
+
+ # Add all dynamic inputs
+ for k, v in V.items():
+ if v is not None:
+ norm_v = normalize_to_common_shape(ae, v, mode=length_mismatch)[1]
+ variables[k] = norm_v
+
+ for k, v in F.items():
+ variables[k] = v if v is not None else 0.0
+
+ tree = parse_expr(Expression);
visitor = UnifiedMathVisitor(variables, ae.shape)
result = visitor.visit(tree)
result = as_tensor(result, ae.shape)
diff --git a/more_math/ModelMathNode.py b/more_math/ModelMathNode.py
index aea810a..35253ee 100644
--- a/more_math/ModelMathNode.py
+++ b/more_math/ModelMathNode.py
@@ -2,34 +2,32 @@ from inspect import cleandoc
from comfy_api.latest import io
from .helper_functions import commonLazy
from .modelLikeCommon import calculate_patches
+from antlr4 import InputStream, CommonTokenStream
+from .Parser.MathExprLexer import MathExprLexer
+from .Parser.MathExprParser import MathExprParser
+import re
class ModelMathNode(io.ComfyNode):
"""
- This node enables the use of math expressions on Model weights (state_dict).
+ This node enables the use of math expressions on Model weights (state_dict) using Autogrow inputs.
Functionally acts as a custom model merge.
"""
@classmethod
def define_schema(cls) -> io.Schema:
return io.Schema(
- node_id="mrmth_ModelMathNode",
+ node_id="mrmth_ag_ModelMathNode",
display_name="Model Math",
category="More math",
inputs=[
- io.Model.Input(id="a", tooltip="Main model (base)"),
- io.Model.Input(id="b", optional=True, lazy=True, tooltip="Optional 2nd model"),
- io.Model.Input(id="c", optional=True, lazy=True, tooltip="Optional 3rd model"),
- io.Model.Input(id="d", optional=True, lazy=True, tooltip="Optional 4th model"),
- io.Float.Input(id="w", default=0.0, optional=True, lazy=True, force_input=True),
- io.Float.Input(id="x", default=0.0, optional=True, lazy=True, force_input=True),
- io.Float.Input(id="y", default=0.0, optional=True, lazy=True, force_input=True),
- io.Float.Input(id="z", default=0.0, optional=True, lazy=True, force_input=True),
- io.String.Input(id="Model", default="a*(1-w)+b*w", tooltip="Expression to apply on weights"),
+ io.Autogrow.Input(id="V",template=io.Autogrow.TemplatePrefix(io.Model.Input("values"), prefix="V", min=1, max=50)),
+ io.Autogrow.Input(id="F", template=io.Autogrow.TemplatePrefix(io.Float.Input("float", default=0.0, optional=True, lazy=True, force_input=True), prefix="F", min=1, max=50)),
+ io.String.Input(id="Expression", default="I0*(1-F0)+I1*F0", tooltip="Expression to apply on weights"),
io.Combo.Input(
id="length_mismatch",
- options=["broadcast", "passthrough", "pad"],
- default="broadcast",
+ options=["error", "passthrough", "pad"],
+ default="error",
tooltip="How to handle mismatched layer counts. For models, this usually defaults to broadcast (zero for missing layers)."
)
],
@@ -41,12 +39,77 @@ class ModelMathNode(io.ComfyNode):
tooltip = cleandoc(__doc__)
@classmethod
- def check_lazy_status(cls, Model, a, b=[], c=[], d=[], w=0, x=0, y=0, z=0, length_mismatch="broadcast"):
- return commonLazy(Model, a, b, c, d, w, x, y, z)
+ def check_lazy_status(cls, Expression, V, F, length_mismatch="tile"):
+
+ input_stream = InputStream(Expression)
+ lexer = MathExprLexer(input_stream)
+ stream = CommonTokenStream(lexer)
+ stream.fill()
+
+ # Support aliases
+ aliases_img = {"a": "V0", "b": "V1", "c": "V2", "d": "V3"}
+ aliases_flt = {"w": "F0", "x": "F1", "y": "F2", "z": "F3"}
+
+ needed = []
+ needed1 = []
+ for token in filter(lambda t: t.type == MathExprParser.VARIABLE, stream.tokens):
+ var_name = token.text
+
+ if re.match(r"[VF][0-9]+", var_name):
+ needed.append(var_name)
+ elif var_name in aliases_img:
+ needed.append(aliases_img[var_name])
+ elif var_name in aliases_flt:
+ needed.append(aliases_flt[var_name])
+ for v in needed:
+ if v.startswith("V"):
+ if v not in V or V[v] is None:
+ needed1.append(v)
+ elif v.startswith("F"):
+ if v not in F or F[v] is None:
+ needed1.append(v)
+ return needed1
@classmethod
- def execute(cls, Model, a, b=None, c=None, d=None, w=0.0, x=0.0, y=0.0, z=0.0, length_mismatch="broadcast") -> io.NodeOutput:
- patches = calculate_patches(Model, a, b, c, d, w, x, y, z)
+ def execute(cls, V, F, Expression, length_mismatch="tile") -> io.NodeOutput:
+ # Determine reference model for cloning
+ a = V.get("V0")
+ if a is None:
+ # Try finding first valid model
+ for m in V.values():
+ if m is not None:
+ a = m
+ break
+ if a is None:
+ raise ValueError("At least one input model is required.")
+
+ # Prepare variables
+ # V0..V3 map to a..d for backward compatibility in calculate_patches
+ b = V.get("V1")
+ c = V.get("V2")
+ d = V.get("V3")
+ w = F.get("F0", 0.0) if F.get("F0") is not None else 0.0
+ x = F.get("F1", 0.0) if F.get("F1") is not None else 0.0
+ y = F.get("F2", 0.0) if F.get("F2") is not None else 0.0
+ z = F.get("F3", 0.0) if F.get("F3") is not None else 0.0
+
+ # Note: calculate_patches usually takes specific args. We might need to update it to support dynamic V/F or just pass everything.
+ # Looking at Step 34, calculate_patches signature: (Model, a, b, c, d, w, x, y, z)
+ # We need to verify if calculate_patches handles V/F. It probably doesn't.
+ # We should check 'modelLikeCommon.py' to see if update is needed.
+
+ # Assume for now we pass a,b,c,d,w,x,y,z as standard.
+ # But for full autogrow support (more than 4 inputs), calculate_patches needs update.
+ # The prompt didn't explicitly ask to update modelLikeCommon, but "switch to Autogrow" implies full functionality.
+ # I'll check modelLikeCommon.py after this block.
+ # For now, I will pass V and F to calculate_patches if I modify it, or I will stick to legacy args if I don't modify it.
+ # However, to support V4+, I MUST modify calculate_patches.
+
+ # Let's pass the V and F dicts to a modified calculate_patches, or overload it.
+ # I will update modelLikeCommon.py as part of this task.
+
+ patches = calculate_patches(Expression, a, b, c, d, w, x, y, z, V=V, F=F)
+
out_model = a.clone()
if patches:
out_model.add_patches(patches, 1.0, 1.0)
diff --git a/more_math/Parser/.antlr/MathExpr.interp b/more_math/Parser/.antlr/MathExpr.interp
new file mode 100644
index 0000000..0ee9ec2
--- /dev/null
+++ b/more_math/Parser/.antlr/MathExpr.interp
@@ -0,0 +1,231 @@
+token literal names:
+null
+'sin'
+'cos'
+'tan'
+'asin'
+'acos'
+'atan'
+'atan2'
+'sinh'
+'cosh'
+'tanh'
+'asinh'
+'acosh'
+'atanh'
+'abs'
+'sqrt'
+'ln'
+'log'
+'exp'
+'smin'
+'smax'
+'tmin'
+'tmax'
+'tnorm'
+'snorm'
+'floor'
+'ceil'
+'round'
+'gamma'
+'pow'
+'sigm'
+'clamp'
+'fft'
+'ifft'
+'angle'
+'print'
+null
+null
+'lerp'
+'step'
+'smoothstep'
+'fract'
+'relu'
+'softplus'
+'gelu'
+'sign'
+'map'
+null
+null
+'swap'
+null
+null
+'range'
+'topk'
+'botk'
+'pinv'
+'sum'
+'mean'
+'std'
+'var'
+null
+null
+'quantile'
+'dot'
+'moment'
+null
+null
+null
+null
+null
+null
+null
+'cossim'
+'flip'
+'cov'
+'sort'
+'append'
+'+'
+'-'
+'*'
+'/'
+'%'
+'^'
+'>='
+'>'
+'<='
+'<'
+'=='
+'='
+'!='
+'|'
+'('
+')'
+','
+';'
+'->'
+'['
+']'
+null
+null
+null
+null
+
+token symbolic names:
+null
+SIN
+COS
+TAN
+ASIN
+ACOS
+ATAN
+ATAN2
+SINH
+COSH
+TANH
+ASINH
+ACOSH
+ATANH
+ABS
+SQRT
+LN
+LOG
+EXP
+SMIN
+SMAX
+TMIN
+TMAX
+TNORM
+SNORM
+FLOOR
+CEIL
+ROUND
+GAMMA
+POWE
+SIGM
+CLAMP
+SFFT
+SIFFT
+ANGL
+PRNT
+PRINT_SHAPE
+NVL
+LERP
+STEP
+SMOOTHSTEP
+FRACT
+RELU
+SOFTPLUS
+GELU
+SIGN
+MAP
+EZCONV
+CONV
+SWAP
+PERM
+RESHAPE
+RANGE
+TOPK
+BOTK
+PINV
+SUM
+MEAN
+STD
+VAR
+QUARTILE
+PERCENTILE
+QUANTILE
+DOT
+MOMENT
+NOISE
+RAND
+CAUCHY
+EXPONENTIAL
+LOGNORMAL
+BERNOULLI
+POISSON
+COSSIM
+FLIP
+COV
+SORT
+APPEND
+PLUS
+MINUS
+MULT
+DIV
+MOD
+POW
+GE
+GT
+LE
+LT
+EQ
+EQUEALS
+NE
+PIPE
+LPAREN
+RPAREN
+COMMA
+SEMICOLON
+ARROW
+LBRACKET
+RBRACKET
+CONSTANT
+NUMBER
+VARIABLE
+WS
+
+rule names:
+start
+funcDef
+varDef
+paramList
+expr
+compExpr
+addExpr
+mulExpr
+powExpr
+unaryExpr
+indexExpr
+atom
+exprList
+func1
+func2
+func3
+func4
+funcN
+
+
+atn:
+[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 103, 717, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 3, 2, 7, 2, 40, 10, 2, 12, 2, 14, 2, 43, 11, 2, 3, 2, 7, 2, 46, 10, 2, 12, 2, 14, 2, 49, 11, 2, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 5, 3, 57, 10, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 7, 5, 72, 10, 5, 12, 5, 14, 5, 75, 11, 5, 3, 6, 3, 6, 5, 6, 79, 10, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 7, 7, 102, 10, 7, 12, 7, 14, 7, 105, 11, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 7, 8, 116, 10, 8, 12, 8, 14, 8, 119, 11, 8, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 7, 9, 133, 10, 9, 12, 9, 14, 9, 136, 11, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 5, 10, 143, 10, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 5, 11, 150, 10, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 7, 12, 160, 10, 12, 12, 12, 14, 12, 163, 11, 12, 3, 12, 3, 12, 7, 12, 167, 10, 12, 12, 12, 14, 12, 170, 11, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 7, 13, 192, 10, 13, 12, 13, 14, 13, 195, 11, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 202, 10, 13, 3, 13, 5, 13, 205, 10, 13, 3, 14, 3, 14, 3, 14, 7, 14, 210, 10, 14, 12, 14, 14, 14, 213, 11, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 5, 15, 425, 10, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 5, 16, 553, 10, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 5, 17, 618, 10, 17, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 5, 18, 642, 10, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 7, 19, 649, 10, 19, 12, 19, 14, 19, 652, 11, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 7, 19, 661, 10, 19, 12, 19, 14, 19, 664, 11, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 6, 19, 673, 10, 19, 13, 19, 14, 19, 674, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 6, 19, 684, 10, 19, 13, 19, 14, 19, 685, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 6, 19, 695, 10, 19, 13, 19, 14, 19, 696, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 5, 19, 715, 10, 19, 3, 19, 2, 6, 12, 14, 16, 22, 20, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 2, 2, 2, 809, 2, 41, 3, 2, 2, 2, 4, 53, 3, 2, 2, 2, 6, 63, 3, 2, 2, 2, 8, 68, 3, 2, 2, 2, 10, 78, 3, 2, 2, 2, 12, 80, 3, 2, 2, 2, 14, 106, 3, 2, 2, 2, 16, 120, 3, 2, 2, 2, 18, 142, 3, 2, 2, 2, 20, 149, 3, 2, 2, 2, 22, 151, 3, 2, 2, 2, 24, 204, 3, 2, 2, 2, 26, 206, 3, 2, 2, 2, 28, 424, 3, 2, 2, 2, 30, 552, 3, 2, 2, 2, 32, 617, 3, 2, 2, 2, 34, 641, 3, 2, 2, 2, 36, 714, 3, 2, 2, 2, 38, 40, 5, 4, 3, 2, 39, 38, 3, 2, 2, 2, 40, 43, 3, 2, 2, 2, 41, 39, 3, 2, 2, 2, 41, 42, 3, 2, 2, 2, 42, 47, 3, 2, 2, 2, 43, 41, 3, 2, 2, 2, 44, 46, 5, 6, 4, 2, 45, 44, 3, 2, 2, 2, 46, 49, 3, 2, 2, 2, 47, 45, 3, 2, 2, 2, 47, 48, 3, 2, 2, 2, 48, 50, 3, 2, 2, 2, 49, 47, 3, 2, 2, 2, 50, 51, 5, 10, 6, 2, 51, 52, 7, 2, 2, 3, 52, 3, 3, 2, 2, 2, 53, 54, 7, 102, 2, 2, 54, 56, 7, 93, 2, 2, 55, 57, 5, 8, 5, 2, 56, 55, 3, 2, 2, 2, 56, 57, 3, 2, 2, 2, 57, 58, 3, 2, 2, 2, 58, 59, 7, 94, 2, 2, 59, 60, 7, 97, 2, 2, 60, 61, 5, 10, 6, 2, 61, 62, 7, 96, 2, 2, 62, 5, 3, 2, 2, 2, 63, 64, 7, 102, 2, 2, 64, 65, 7, 90, 2, 2, 65, 66, 5, 10, 6, 2, 66, 67, 7, 96, 2, 2, 67, 7, 3, 2, 2, 2, 68, 73, 7, 102, 2, 2, 69, 70, 7, 95, 2, 2, 70, 72, 7, 102, 2, 2, 71, 69, 3, 2, 2, 2, 72, 75, 3, 2, 2, 2, 73, 71, 3, 2, 2, 2, 73, 74, 3, 2, 2, 2, 74, 9, 3, 2, 2, 2, 75, 73, 3, 2, 2, 2, 76, 79, 5, 24, 13, 2, 77, 79, 5, 12, 7, 2, 78, 76, 3, 2, 2, 2, 78, 77, 3, 2, 2, 2, 79, 11, 3, 2, 2, 2, 80, 81, 8, 7, 1, 2, 81, 82, 5, 14, 8, 2, 82, 103, 3, 2, 2, 2, 83, 84, 12, 9, 2, 2, 84, 85, 7, 86, 2, 2, 85, 102, 5, 14, 8, 2, 86, 87, 12, 8, 2, 2, 87, 88, 7, 85, 2, 2, 88, 102, 5, 14, 8, 2, 89, 90, 12, 7, 2, 2, 90, 91, 7, 88, 2, 2, 91, 102, 5, 14, 8, 2, 92, 93, 12, 6, 2, 2, 93, 94, 7, 87, 2, 2, 94, 102, 5, 14, 8, 2, 95, 96, 12, 5, 2, 2, 96, 97, 7, 89, 2, 2, 97, 102, 5, 14, 8, 2, 98, 99, 12, 4, 2, 2, 99, 100, 7, 91, 2, 2, 100, 102, 5, 14, 8, 2, 101, 83, 3, 2, 2, 2, 101, 86, 3, 2, 2, 2, 101, 89, 3, 2, 2, 2, 101, 92, 3, 2, 2, 2, 101, 95, 3, 2, 2, 2, 101, 98, 3, 2, 2, 2, 102, 105, 3, 2, 2, 2, 103, 101, 3, 2, 2, 2, 103, 104, 3, 2, 2, 2, 104, 13, 3, 2, 2, 2, 105, 103, 3, 2, 2, 2, 106, 107, 8, 8, 1, 2, 107, 108, 5, 16, 9, 2, 108, 117, 3, 2, 2, 2, 109, 110, 12, 5, 2, 2, 110, 111, 7, 79, 2, 2, 111, 116, 5, 16, 9, 2, 112, 113, 12, 4, 2, 2, 113, 114, 7, 80, 2, 2, 114, 116, 5, 16, 9, 2, 115, 109, 3, 2, 2, 2, 115, 112, 3, 2, 2, 2, 116, 119, 3, 2, 2, 2, 117, 115, 3, 2, 2, 2, 117, 118, 3, 2, 2, 2, 118, 15, 3, 2, 2, 2, 119, 117, 3, 2, 2, 2, 120, 121, 8, 9, 1, 2, 121, 122, 5, 18, 10, 2, 122, 134, 3, 2, 2, 2, 123, 124, 12, 6, 2, 2, 124, 125, 7, 81, 2, 2, 125, 133, 5, 18, 10, 2, 126, 127, 12, 5, 2, 2, 127, 128, 7, 82, 2, 2, 128, 133, 5, 18, 10, 2, 129, 130, 12, 4, 2, 2, 130, 131, 7, 83, 2, 2, 131, 133, 5, 18, 10, 2, 132, 123, 3, 2, 2, 2, 132, 126, 3, 2, 2, 2, 132, 129, 3, 2, 2, 2, 133, 136, 3, 2, 2, 2, 134, 132, 3, 2, 2, 2, 134, 135, 3, 2, 2, 2, 135, 17, 3, 2, 2, 2, 136, 134, 3, 2, 2, 2, 137, 138, 5, 20, 11, 2, 138, 139, 7, 84, 2, 2, 139, 140, 5, 18, 10, 2, 140, 143, 3, 2, 2, 2, 141, 143, 5, 20, 11, 2, 142, 137, 3, 2, 2, 2, 142, 141, 3, 2, 2, 2, 143, 19, 3, 2, 2, 2, 144, 145, 7, 79, 2, 2, 145, 150, 5, 20, 11, 2, 146, 147, 7, 80, 2, 2, 147, 150, 5, 20, 11, 2, 148, 150, 5, 22, 12, 2, 149, 144, 3, 2, 2, 2, 149, 146, 3, 2, 2, 2, 149, 148, 3, 2, 2, 2, 150, 21, 3, 2, 2, 2, 151, 152, 8, 12, 1, 2, 152, 153, 5, 24, 13, 2, 153, 168, 3, 2, 2, 2, 154, 155, 12, 4, 2, 2, 155, 156, 7, 98, 2, 2, 156, 161, 5, 10, 6, 2, 157, 158, 7, 95, 2, 2, 158, 160, 5, 10, 6, 2, 159, 157, 3, 2, 2, 2, 160, 163, 3, 2, 2, 2, 161, 159, 3, 2, 2, 2, 161, 162, 3, 2, 2, 2, 162, 164, 3, 2, 2, 2, 163, 161, 3, 2, 2, 2, 164, 165, 7, 99, 2, 2, 165, 167, 3, 2, 2, 2, 166, 154, 3, 2, 2, 2, 167, 170, 3, 2, 2, 2, 168, 166, 3, 2, 2, 2, 168, 169, 3, 2, 2, 2, 169, 23, 3, 2, 2, 2, 170, 168, 3, 2, 2, 2, 171, 205, 5, 28, 15, 2, 172, 205, 5, 30, 16, 2, 173, 205, 5, 32, 17, 2, 174, 205, 5, 34, 18, 2, 175, 205, 5, 36, 19, 2, 176, 205, 7, 102, 2, 2, 177, 205, 7, 101, 2, 2, 178, 205, 7, 100, 2, 2, 179, 180, 7, 93, 2, 2, 180, 181, 5, 10, 6, 2, 181, 182, 7, 94, 2, 2, 182, 205, 3, 2, 2, 2, 183, 184, 7, 92, 2, 2, 184, 185, 5, 10, 6, 2, 185, 186, 7, 92, 2, 2, 186, 205, 3, 2, 2, 2, 187, 188, 7, 98, 2, 2, 188, 193, 5, 10, 6, 2, 189, 190, 7, 95, 2, 2, 190, 192, 5, 10, 6, 2, 191, 189, 3, 2, 2, 2, 192, 195, 3, 2, 2, 2, 193, 191, 3, 2, 2, 2, 193, 194, 3, 2, 2, 2, 194, 196, 3, 2, 2, 2, 195, 193, 3, 2, 2, 2, 196, 197, 7, 99, 2, 2, 197, 205, 3, 2, 2, 2, 198, 199, 7, 102, 2, 2, 199, 201, 7, 93, 2, 2, 200, 202, 5, 26, 14, 2, 201, 200, 3, 2, 2, 2, 201, 202, 3, 2, 2, 2, 202, 203, 3, 2, 2, 2, 203, 205, 7, 94, 2, 2, 204, 171, 3, 2, 2, 2, 204, 172, 3, 2, 2, 2, 204, 173, 3, 2, 2, 2, 204, 174, 3, 2, 2, 2, 204, 175, 3, 2, 2, 2, 204, 176, 3, 2, 2, 2, 204, 177, 3, 2, 2, 2, 204, 178, 3, 2, 2, 2, 204, 179, 3, 2, 2, 2, 204, 183, 3, 2, 2, 2, 204, 187, 3, 2, 2, 2, 204, 198, 3, 2, 2, 2, 205, 25, 3, 2, 2, 2, 206, 211, 5, 10, 6, 2, 207, 208, 7, 95, 2, 2, 208, 210, 5, 10, 6, 2, 209, 207, 3, 2, 2, 2, 210, 213, 3, 2, 2, 2, 211, 209, 3, 2, 2, 2, 211, 212, 3, 2, 2, 2, 212, 27, 3, 2, 2, 2, 213, 211, 3, 2, 2, 2, 214, 215, 7, 3, 2, 2, 215, 216, 7, 93, 2, 2, 216, 217, 5, 10, 6, 2, 217, 218, 7, 94, 2, 2, 218, 425, 3, 2, 2, 2, 219, 220, 7, 4, 2, 2, 220, 221, 7, 93, 2, 2, 221, 222, 5, 10, 6, 2, 222, 223, 7, 94, 2, 2, 223, 425, 3, 2, 2, 2, 224, 225, 7, 5, 2, 2, 225, 226, 7, 93, 2, 2, 226, 227, 5, 10, 6, 2, 227, 228, 7, 94, 2, 2, 228, 425, 3, 2, 2, 2, 229, 230, 7, 6, 2, 2, 230, 231, 7, 93, 2, 2, 231, 232, 5, 10, 6, 2, 232, 233, 7, 94, 2, 2, 233, 425, 3, 2, 2, 2, 234, 235, 7, 7, 2, 2, 235, 236, 7, 93, 2, 2, 236, 237, 5, 10, 6, 2, 237, 238, 7, 94, 2, 2, 238, 425, 3, 2, 2, 2, 239, 240, 7, 8, 2, 2, 240, 241, 7, 93, 2, 2, 241, 242, 5, 10, 6, 2, 242, 243, 7, 94, 2, 2, 243, 425, 3, 2, 2, 2, 244, 245, 7, 10, 2, 2, 245, 246, 7, 93, 2, 2, 246, 247, 5, 10, 6, 2, 247, 248, 7, 94, 2, 2, 248, 425, 3, 2, 2, 2, 249, 250, 7, 11, 2, 2, 250, 251, 7, 93, 2, 2, 251, 252, 5, 10, 6, 2, 252, 253, 7, 94, 2, 2, 253, 425, 3, 2, 2, 2, 254, 255, 7, 12, 2, 2, 255, 256, 7, 93, 2, 2, 256, 257, 5, 10, 6, 2, 257, 258, 7, 94, 2, 2, 258, 425, 3, 2, 2, 2, 259, 260, 7, 13, 2, 2, 260, 261, 7, 93, 2, 2, 261, 262, 5, 10, 6, 2, 262, 263, 7, 94, 2, 2, 263, 425, 3, 2, 2, 2, 264, 265, 7, 14, 2, 2, 265, 266, 7, 93, 2, 2, 266, 267, 5, 10, 6, 2, 267, 268, 7, 94, 2, 2, 268, 425, 3, 2, 2, 2, 269, 270, 7, 15, 2, 2, 270, 271, 7, 93, 2, 2, 271, 272, 5, 10, 6, 2, 272, 273, 7, 94, 2, 2, 273, 425, 3, 2, 2, 2, 274, 275, 7, 16, 2, 2, 275, 276, 7, 93, 2, 2, 276, 277, 5, 10, 6, 2, 277, 278, 7, 94, 2, 2, 278, 425, 3, 2, 2, 2, 279, 280, 7, 17, 2, 2, 280, 281, 7, 93, 2, 2, 281, 282, 5, 10, 6, 2, 282, 283, 7, 94, 2, 2, 283, 425, 3, 2, 2, 2, 284, 285, 7, 18, 2, 2, 285, 286, 7, 93, 2, 2, 286, 287, 5, 10, 6, 2, 287, 288, 7, 94, 2, 2, 288, 425, 3, 2, 2, 2, 289, 290, 7, 19, 2, 2, 290, 291, 7, 93, 2, 2, 291, 292, 5, 10, 6, 2, 292, 293, 7, 94, 2, 2, 293, 425, 3, 2, 2, 2, 294, 295, 7, 20, 2, 2, 295, 296, 7, 93, 2, 2, 296, 297, 5, 10, 6, 2, 297, 298, 7, 94, 2, 2, 298, 425, 3, 2, 2, 2, 299, 300, 7, 25, 2, 2, 300, 301, 7, 93, 2, 2, 301, 302, 5, 10, 6, 2, 302, 303, 7, 94, 2, 2, 303, 425, 3, 2, 2, 2, 304, 305, 7, 26, 2, 2, 305, 306, 7, 93, 2, 2, 306, 307, 5, 10, 6, 2, 307, 308, 7, 94, 2, 2, 308, 425, 3, 2, 2, 2, 309, 310, 7, 27, 2, 2, 310, 311, 7, 93, 2, 2, 311, 312, 5, 10, 6, 2, 312, 313, 7, 94, 2, 2, 313, 425, 3, 2, 2, 2, 314, 315, 7, 28, 2, 2, 315, 316, 7, 93, 2, 2, 316, 317, 5, 10, 6, 2, 317, 318, 7, 94, 2, 2, 318, 425, 3, 2, 2, 2, 319, 320, 7, 29, 2, 2, 320, 321, 7, 93, 2, 2, 321, 322, 5, 10, 6, 2, 322, 323, 7, 94, 2, 2, 323, 425, 3, 2, 2, 2, 324, 325, 7, 30, 2, 2, 325, 326, 7, 93, 2, 2, 326, 327, 5, 10, 6, 2, 327, 328, 7, 94, 2, 2, 328, 425, 3, 2, 2, 2, 329, 330, 7, 32, 2, 2, 330, 331, 7, 93, 2, 2, 331, 332, 5, 10, 6, 2, 332, 333, 7, 94, 2, 2, 333, 425, 3, 2, 2, 2, 334, 335, 7, 34, 2, 2, 335, 336, 7, 93, 2, 2, 336, 337, 5, 10, 6, 2, 337, 338, 7, 94, 2, 2, 338, 425, 3, 2, 2, 2, 339, 340, 7, 35, 2, 2, 340, 341, 7, 93, 2, 2, 341, 342, 5, 10, 6, 2, 342, 343, 7, 94, 2, 2, 343, 425, 3, 2, 2, 2, 344, 345, 7, 36, 2, 2, 345, 346, 7, 93, 2, 2, 346, 347, 5, 10, 6, 2, 347, 348, 7, 94, 2, 2, 348, 425, 3, 2, 2, 2, 349, 350, 7, 37, 2, 2, 350, 351, 7, 93, 2, 2, 351, 352, 5, 10, 6, 2, 352, 353, 7, 94, 2, 2, 353, 425, 3, 2, 2, 2, 354, 355, 7, 43, 2, 2, 355, 356, 7, 93, 2, 2, 356, 357, 5, 10, 6, 2, 357, 358, 7, 94, 2, 2, 358, 425, 3, 2, 2, 2, 359, 360, 7, 44, 2, 2, 360, 361, 7, 93, 2, 2, 361, 362, 5, 10, 6, 2, 362, 363, 7, 94, 2, 2, 363, 425, 3, 2, 2, 2, 364, 365, 7, 45, 2, 2, 365, 366, 7, 93, 2, 2, 366, 367, 5, 10, 6, 2, 367, 368, 7, 94, 2, 2, 368, 425, 3, 2, 2, 2, 369, 370, 7, 46, 2, 2, 370, 371, 7, 93, 2, 2, 371, 372, 5, 10, 6, 2, 372, 373, 7, 94, 2, 2, 373, 425, 3, 2, 2, 2, 374, 375, 7, 47, 2, 2, 375, 376, 7, 93, 2, 2, 376, 377, 5, 10, 6, 2, 377, 378, 7, 94, 2, 2, 378, 425, 3, 2, 2, 2, 379, 380, 7, 38, 2, 2, 380, 381, 7, 93, 2, 2, 381, 382, 5, 10, 6, 2, 382, 383, 7, 94, 2, 2, 383, 425, 3, 2, 2, 2, 384, 385, 7, 57, 2, 2, 385, 386, 7, 93, 2, 2, 386, 387, 5, 10, 6, 2, 387, 388, 7, 94, 2, 2, 388, 425, 3, 2, 2, 2, 389, 390, 7, 58, 2, 2, 390, 391, 7, 93, 2, 2, 391, 392, 5, 10, 6, 2, 392, 393, 7, 94, 2, 2, 393, 425, 3, 2, 2, 2, 394, 395, 7, 59, 2, 2, 395, 396, 7, 93, 2, 2, 396, 397, 5, 10, 6, 2, 397, 398, 7, 94, 2, 2, 398, 425, 3, 2, 2, 2, 399, 400, 7, 60, 2, 2, 400, 401, 7, 93, 2, 2, 401, 402, 5, 10, 6, 2, 402, 403, 7, 94, 2, 2, 403, 425, 3, 2, 2, 2, 404, 405, 7, 61, 2, 2, 405, 406, 7, 93, 2, 2, 406, 407, 5, 10, 6, 2, 407, 408, 7, 94, 2, 2, 408, 425, 3, 2, 2, 2, 409, 410, 7, 77, 2, 2, 410, 411, 7, 93, 2, 2, 411, 412, 5, 10, 6, 2, 412, 413, 7, 94, 2, 2, 413, 425, 3, 2, 2, 2, 414, 415, 7, 67, 2, 2, 415, 416, 7, 93, 2, 2, 416, 417, 5, 10, 6, 2, 417, 418, 7, 94, 2, 2, 418, 425, 3, 2, 2, 2, 419, 420, 7, 68, 2, 2, 420, 421, 7, 93, 2, 2, 421, 422, 5, 10, 6, 2, 422, 423, 7, 94, 2, 2, 423, 425, 3, 2, 2, 2, 424, 214, 3, 2, 2, 2, 424, 219, 3, 2, 2, 2, 424, 224, 3, 2, 2, 2, 424, 229, 3, 2, 2, 2, 424, 234, 3, 2, 2, 2, 424, 239, 3, 2, 2, 2, 424, 244, 3, 2, 2, 2, 424, 249, 3, 2, 2, 2, 424, 254, 3, 2, 2, 2, 424, 259, 3, 2, 2, 2, 424, 264, 3, 2, 2, 2, 424, 269, 3, 2, 2, 2, 424, 274, 3, 2, 2, 2, 424, 279, 3, 2, 2, 2, 424, 284, 3, 2, 2, 2, 424, 289, 3, 2, 2, 2, 424, 294, 3, 2, 2, 2, 424, 299, 3, 2, 2, 2, 424, 304, 3, 2, 2, 2, 424, 309, 3, 2, 2, 2, 424, 314, 3, 2, 2, 2, 424, 319, 3, 2, 2, 2, 424, 324, 3, 2, 2, 2, 424, 329, 3, 2, 2, 2, 424, 334, 3, 2, 2, 2, 424, 339, 3, 2, 2, 2, 424, 344, 3, 2, 2, 2, 424, 349, 3, 2, 2, 2, 424, 354, 3, 2, 2, 2, 424, 359, 3, 2, 2, 2, 424, 364, 3, 2, 2, 2, 424, 369, 3, 2, 2, 2, 424, 374, 3, 2, 2, 2, 424, 379, 3, 2, 2, 2, 424, 384, 3, 2, 2, 2, 424, 389, 3, 2, 2, 2, 424, 394, 3, 2, 2, 2, 424, 399, 3, 2, 2, 2, 424, 404, 3, 2, 2, 2, 424, 409, 3, 2, 2, 2, 424, 414, 3, 2, 2, 2, 424, 419, 3, 2, 2, 2, 425, 29, 3, 2, 2, 2, 426, 427, 7, 31, 2, 2, 427, 428, 7, 93, 2, 2, 428, 429, 5, 10, 6, 2, 429, 430, 7, 95, 2, 2, 430, 431, 5, 10, 6, 2, 431, 432, 7, 94, 2, 2, 432, 553, 3, 2, 2, 2, 433, 434, 7, 9, 2, 2, 434, 435, 7, 93, 2, 2, 435, 436, 5, 10, 6, 2, 436, 437, 7, 95, 2, 2, 437, 438, 5, 10, 6, 2, 438, 439, 7, 94, 2, 2, 439, 553, 3, 2, 2, 2, 440, 441, 7, 23, 2, 2, 441, 442, 7, 93, 2, 2, 442, 443, 5, 10, 6, 2, 443, 444, 7, 95, 2, 2, 444, 445, 5, 10, 6, 2, 445, 446, 7, 94, 2, 2, 446, 553, 3, 2, 2, 2, 447, 448, 7, 24, 2, 2, 448, 449, 7, 93, 2, 2, 449, 450, 5, 10, 6, 2, 450, 451, 7, 95, 2, 2, 451, 452, 5, 10, 6, 2, 452, 453, 7, 94, 2, 2, 453, 553, 3, 2, 2, 2, 454, 455, 7, 41, 2, 2, 455, 456, 7, 93, 2, 2, 456, 457, 5, 10, 6, 2, 457, 458, 7, 95, 2, 2, 458, 459, 5, 10, 6, 2, 459, 460, 7, 94, 2, 2, 460, 553, 3, 2, 2, 2, 461, 462, 7, 55, 2, 2, 462, 463, 7, 93, 2, 2, 463, 464, 5, 10, 6, 2, 464, 465, 7, 95, 2, 2, 465, 466, 5, 10, 6, 2, 466, 467, 7, 94, 2, 2, 467, 553, 3, 2, 2, 2, 468, 469, 7, 56, 2, 2, 469, 470, 7, 93, 2, 2, 470, 471, 5, 10, 6, 2, 471, 472, 7, 95, 2, 2, 472, 473, 5, 10, 6, 2, 473, 474, 7, 94, 2, 2, 474, 553, 3, 2, 2, 2, 475, 476, 7, 62, 2, 2, 476, 477, 7, 93, 2, 2, 477, 478, 5, 10, 6, 2, 478, 479, 7, 95, 2, 2, 479, 480, 5, 10, 6, 2, 480, 481, 7, 94, 2, 2, 481, 553, 3, 2, 2, 2, 482, 483, 7, 63, 2, 2, 483, 484, 7, 93, 2, 2, 484, 485, 5, 10, 6, 2, 485, 486, 7, 95, 2, 2, 486, 487, 5, 10, 6, 2, 487, 488, 7, 94, 2, 2, 488, 553, 3, 2, 2, 2, 489, 490, 7, 64, 2, 2, 490, 491, 7, 93, 2, 2, 491, 492, 5, 10, 6, 2, 492, 493, 7, 95, 2, 2, 493, 494, 5, 10, 6, 2, 494, 495, 7, 94, 2, 2, 495, 553, 3, 2, 2, 2, 496, 497, 7, 65, 2, 2, 497, 498, 7, 93, 2, 2, 498, 499, 5, 10, 6, 2, 499, 500, 7, 95, 2, 2, 500, 501, 5, 10, 6, 2, 501, 502, 7, 94, 2, 2, 502, 553, 3, 2, 2, 2, 503, 504, 7, 74, 2, 2, 504, 505, 7, 93, 2, 2, 505, 506, 5, 10, 6, 2, 506, 507, 7, 95, 2, 2, 507, 508, 5, 10, 6, 2, 508, 509, 7, 94, 2, 2, 509, 553, 3, 2, 2, 2, 510, 511, 7, 75, 2, 2, 511, 512, 7, 93, 2, 2, 512, 513, 5, 10, 6, 2, 513, 514, 7, 95, 2, 2, 514, 515, 5, 10, 6, 2, 515, 516, 7, 94, 2, 2, 516, 553, 3, 2, 2, 2, 517, 518, 7, 76, 2, 2, 518, 519, 7, 93, 2, 2, 519, 520, 5, 10, 6, 2, 520, 521, 7, 95, 2, 2, 521, 522, 5, 10, 6, 2, 522, 523, 7, 94, 2, 2, 523, 553, 3, 2, 2, 2, 524, 525, 7, 78, 2, 2, 525, 526, 7, 93, 2, 2, 526, 527, 5, 10, 6, 2, 527, 528, 7, 95, 2, 2, 528, 529, 5, 10, 6, 2, 529, 530, 7, 94, 2, 2, 530, 553, 3, 2, 2, 2, 531, 532, 7, 70, 2, 2, 532, 533, 7, 93, 2, 2, 533, 534, 5, 10, 6, 2, 534, 535, 7, 95, 2, 2, 535, 536, 5, 10, 6, 2, 536, 537, 7, 94, 2, 2, 537, 553, 3, 2, 2, 2, 538, 539, 7, 72, 2, 2, 539, 540, 7, 93, 2, 2, 540, 541, 5, 10, 6, 2, 541, 542, 7, 95, 2, 2, 542, 543, 5, 10, 6, 2, 543, 544, 7, 94, 2, 2, 544, 553, 3, 2, 2, 2, 545, 546, 7, 73, 2, 2, 546, 547, 7, 93, 2, 2, 547, 548, 5, 10, 6, 2, 548, 549, 7, 95, 2, 2, 549, 550, 5, 10, 6, 2, 550, 551, 7, 94, 2, 2, 551, 553, 3, 2, 2, 2, 552, 426, 3, 2, 2, 2, 552, 433, 3, 2, 2, 2, 552, 440, 3, 2, 2, 2, 552, 447, 3, 2, 2, 2, 552, 454, 3, 2, 2, 2, 552, 461, 3, 2, 2, 2, 552, 468, 3, 2, 2, 2, 552, 475, 3, 2, 2, 2, 552, 482, 3, 2, 2, 2, 552, 489, 3, 2, 2, 2, 552, 496, 3, 2, 2, 2, 552, 503, 3, 2, 2, 2, 552, 510, 3, 2, 2, 2, 552, 517, 3, 2, 2, 2, 552, 524, 3, 2, 2, 2, 552, 531, 3, 2, 2, 2, 552, 538, 3, 2, 2, 2, 552, 545, 3, 2, 2, 2, 553, 31, 3, 2, 2, 2, 554, 555, 7, 33, 2, 2, 555, 556, 7, 93, 2, 2, 556, 557, 5, 10, 6, 2, 557, 558, 7, 95, 2, 2, 558, 559, 5, 10, 6, 2, 559, 560, 7, 95, 2, 2, 560, 561, 5, 10, 6, 2, 561, 562, 7, 94, 2, 2, 562, 618, 3, 2, 2, 2, 563, 564, 7, 40, 2, 2, 564, 565, 7, 93, 2, 2, 565, 566, 5, 10, 6, 2, 566, 567, 7, 95, 2, 2, 567, 568, 5, 10, 6, 2, 568, 569, 7, 95, 2, 2, 569, 570, 5, 10, 6, 2, 570, 571, 7, 94, 2, 2, 571, 618, 3, 2, 2, 2, 572, 573, 7, 42, 2, 2, 573, 574, 7, 93, 2, 2, 574, 575, 5, 10, 6, 2, 575, 576, 7, 95, 2, 2, 576, 577, 5, 10, 6, 2, 577, 578, 7, 95, 2, 2, 578, 579, 5, 10, 6, 2, 579, 580, 7, 94, 2, 2, 580, 618, 3, 2, 2, 2, 581, 582, 7, 54, 2, 2, 582, 583, 7, 93, 2, 2, 583, 584, 5, 10, 6, 2, 584, 585, 7, 95, 2, 2, 585, 586, 5, 10, 6, 2, 586, 587, 7, 95, 2, 2, 587, 588, 5, 10, 6, 2, 588, 589, 7, 94, 2, 2, 589, 618, 3, 2, 2, 2, 590, 591, 7, 66, 2, 2, 591, 592, 7, 93, 2, 2, 592, 593, 5, 10, 6, 2, 593, 594, 7, 95, 2, 2, 594, 595, 5, 10, 6, 2, 595, 596, 7, 95, 2, 2, 596, 597, 5, 10, 6, 2, 597, 598, 7, 94, 2, 2, 598, 618, 3, 2, 2, 2, 599, 600, 7, 69, 2, 2, 600, 601, 7, 93, 2, 2, 601, 602, 5, 10, 6, 2, 602, 603, 7, 95, 2, 2, 603, 604, 5, 10, 6, 2, 604, 605, 7, 95, 2, 2, 605, 606, 5, 10, 6, 2, 606, 607, 7, 94, 2, 2, 607, 618, 3, 2, 2, 2, 608, 609, 7, 71, 2, 2, 609, 610, 7, 93, 2, 2, 610, 611, 5, 10, 6, 2, 611, 612, 7, 95, 2, 2, 612, 613, 5, 10, 6, 2, 613, 614, 7, 95, 2, 2, 614, 615, 5, 10, 6, 2, 615, 616, 7, 94, 2, 2, 616, 618, 3, 2, 2, 2, 617, 554, 3, 2, 2, 2, 617, 563, 3, 2, 2, 2, 617, 572, 3, 2, 2, 2, 617, 581, 3, 2, 2, 2, 617, 590, 3, 2, 2, 2, 617, 599, 3, 2, 2, 2, 617, 608, 3, 2, 2, 2, 618, 33, 3, 2, 2, 2, 619, 620, 7, 51, 2, 2, 620, 621, 7, 93, 2, 2, 621, 622, 5, 10, 6, 2, 622, 623, 7, 95, 2, 2, 623, 624, 5, 10, 6, 2, 624, 625, 7, 95, 2, 2, 625, 626, 5, 10, 6, 2, 626, 627, 7, 95, 2, 2, 627, 628, 5, 10, 6, 2, 628, 629, 7, 94, 2, 2, 629, 642, 3, 2, 2, 2, 630, 631, 7, 39, 2, 2, 631, 632, 7, 93, 2, 2, 632, 633, 5, 10, 6, 2, 633, 634, 7, 95, 2, 2, 634, 635, 5, 10, 6, 2, 635, 636, 7, 95, 2, 2, 636, 637, 5, 10, 6, 2, 637, 638, 7, 95, 2, 2, 638, 639, 5, 10, 6, 2, 639, 640, 7, 94, 2, 2, 640, 642, 3, 2, 2, 2, 641, 619, 3, 2, 2, 2, 641, 630, 3, 2, 2, 2, 642, 35, 3, 2, 2, 2, 643, 644, 7, 21, 2, 2, 644, 645, 7, 93, 2, 2, 645, 650, 5, 10, 6, 2, 646, 647, 7, 95, 2, 2, 647, 649, 5, 10, 6, 2, 648, 646, 3, 2, 2, 2, 649, 652, 3, 2, 2, 2, 650, 648, 3, 2, 2, 2, 650, 651, 3, 2, 2, 2, 651, 653, 3, 2, 2, 2, 652, 650, 3, 2, 2, 2, 653, 654, 7, 94, 2, 2, 654, 715, 3, 2, 2, 2, 655, 656, 7, 22, 2, 2, 656, 657, 7, 93, 2, 2, 657, 662, 5, 10, 6, 2, 658, 659, 7, 95, 2, 2, 659, 661, 5, 10, 6, 2, 660, 658, 3, 2, 2, 2, 661, 664, 3, 2, 2, 2, 662, 660, 3, 2, 2, 2, 662, 663, 3, 2, 2, 2, 663, 665, 3, 2, 2, 2, 664, 662, 3, 2, 2, 2, 665, 666, 7, 94, 2, 2, 666, 715, 3, 2, 2, 2, 667, 668, 7, 48, 2, 2, 668, 669, 7, 93, 2, 2, 669, 672, 5, 10, 6, 2, 670, 671, 7, 95, 2, 2, 671, 673, 5, 10, 6, 2, 672, 670, 3, 2, 2, 2, 673, 674, 3, 2, 2, 2, 674, 672, 3, 2, 2, 2, 674, 675, 3, 2, 2, 2, 675, 676, 3, 2, 2, 2, 676, 677, 7, 94, 2, 2, 677, 715, 3, 2, 2, 2, 678, 679, 7, 49, 2, 2, 679, 680, 7, 93, 2, 2, 680, 683, 5, 10, 6, 2, 681, 682, 7, 95, 2, 2, 682, 684, 5, 10, 6, 2, 683, 681, 3, 2, 2, 2, 684, 685, 3, 2, 2, 2, 685, 683, 3, 2, 2, 2, 685, 686, 3, 2, 2, 2, 686, 687, 3, 2, 2, 2, 687, 688, 7, 94, 2, 2, 688, 715, 3, 2, 2, 2, 689, 690, 7, 50, 2, 2, 690, 691, 7, 93, 2, 2, 691, 694, 5, 10, 6, 2, 692, 693, 7, 95, 2, 2, 693, 695, 5, 10, 6, 2, 694, 692, 3, 2, 2, 2, 695, 696, 3, 2, 2, 2, 696, 694, 3, 2, 2, 2, 696, 697, 3, 2, 2, 2, 697, 698, 3, 2, 2, 2, 698, 699, 7, 94, 2, 2, 699, 715, 3, 2, 2, 2, 700, 701, 7, 52, 2, 2, 701, 702, 7, 93, 2, 2, 702, 703, 5, 10, 6, 2, 703, 704, 7, 95, 2, 2, 704, 705, 5, 10, 6, 2, 705, 706, 7, 94, 2, 2, 706, 715, 3, 2, 2, 2, 707, 708, 7, 53, 2, 2, 708, 709, 7, 93, 2, 2, 709, 710, 5, 10, 6, 2, 710, 711, 7, 95, 2, 2, 711, 712, 5, 10, 6, 2, 712, 713, 7, 94, 2, 2, 713, 715, 3, 2, 2, 2, 714, 643, 3, 2, 2, 2, 714, 655, 3, 2, 2, 2, 714, 667, 3, 2, 2, 2, 714, 678, 3, 2, 2, 2, 714, 689, 3, 2, 2, 2, 714, 700, 3, 2, 2, 2, 714, 707, 3, 2, 2, 2, 715, 37, 3, 2, 2, 2, 31, 41, 47, 56, 73, 78, 101, 103, 115, 117, 132, 134, 142, 149, 161, 168, 193, 201, 204, 211, 424, 552, 617, 641, 650, 662, 674, 685, 696, 714]
\ No newline at end of file
diff --git a/more_math/Parser/.antlr/MathExpr.tokens b/more_math/Parser/.antlr/MathExpr.tokens
new file mode 100644
index 0000000..659c1e4
--- /dev/null
+++ b/more_math/Parser/.antlr/MathExpr.tokens
@@ -0,0 +1,183 @@
+SIN=1
+COS=2
+TAN=3
+ASIN=4
+ACOS=5
+ATAN=6
+ATAN2=7
+SINH=8
+COSH=9
+TANH=10
+ASINH=11
+ACOSH=12
+ATANH=13
+ABS=14
+SQRT=15
+LN=16
+LOG=17
+EXP=18
+SMIN=19
+SMAX=20
+TMIN=21
+TMAX=22
+TNORM=23
+SNORM=24
+FLOOR=25
+CEIL=26
+ROUND=27
+GAMMA=28
+POWE=29
+SIGM=30
+CLAMP=31
+SFFT=32
+SIFFT=33
+ANGL=34
+PRNT=35
+PRINT_SHAPE=36
+NVL=37
+LERP=38
+STEP=39
+SMOOTHSTEP=40
+FRACT=41
+RELU=42
+SOFTPLUS=43
+GELU=44
+SIGN=45
+MAP=46
+EZCONV=47
+CONV=48
+SWAP=49
+PERM=50
+RESHAPE=51
+RANGE=52
+TOPK=53
+BOTK=54
+PINV=55
+SUM=56
+MEAN=57
+STD=58
+VAR=59
+QUARTILE=60
+PERCENTILE=61
+QUANTILE=62
+DOT=63
+MOMENT=64
+NOISE=65
+RAND=66
+CAUCHY=67
+EXPONENTIAL=68
+LOGNORMAL=69
+BERNOULLI=70
+POISSON=71
+COSSIM=72
+FLIP=73
+COV=74
+SORT=75
+APPEND=76
+PLUS=77
+MINUS=78
+MULT=79
+DIV=80
+MOD=81
+POW=82
+GE=83
+GT=84
+LE=85
+LT=86
+EQ=87
+EQUEALS=88
+NE=89
+PIPE=90
+LPAREN=91
+RPAREN=92
+COMMA=93
+SEMICOLON=94
+ARROW=95
+LBRACKET=96
+RBRACKET=97
+CONSTANT=98
+NUMBER=99
+VARIABLE=100
+WS=101
+'sin'=1
+'cos'=2
+'tan'=3
+'asin'=4
+'acos'=5
+'atan'=6
+'atan2'=7
+'sinh'=8
+'cosh'=9
+'tanh'=10
+'asinh'=11
+'acosh'=12
+'atanh'=13
+'abs'=14
+'sqrt'=15
+'ln'=16
+'log'=17
+'exp'=18
+'smin'=19
+'smax'=20
+'tmin'=21
+'tmax'=22
+'tnorm'=23
+'snorm'=24
+'floor'=25
+'ceil'=26
+'round'=27
+'gamma'=28
+'pow'=29
+'sigm'=30
+'clamp'=31
+'fft'=32
+'ifft'=33
+'angle'=34
+'print'=35
+'lerp'=38
+'step'=39
+'smoothstep'=40
+'fract'=41
+'relu'=42
+'softplus'=43
+'gelu'=44
+'sign'=45
+'map'=46
+'swap'=49
+'range'=52
+'topk'=53
+'botk'=54
+'pinv'=55
+'sum'=56
+'mean'=57
+'std'=58
+'var'=59
+'quantile'=62
+'dot'=63
+'moment'=64
+'cossim'=72
+'flip'=73
+'cov'=74
+'sort'=75
+'append'=76
+'+'=77
+'-'=78
+'*'=79
+'/'=80
+'%'=81
+'^'=82
+'>='=83
+'>'=84
+'<='=85
+'<'=86
+'=='=87
+'='=88
+'!='=89
+'|'=90
+'('=91
+')'=92
+','=93
+';'=94
+'->'=95
+'['=96
+']'=97
diff --git a/more_math/Parser/.antlr/MathExprBaseListener.java b/more_math/Parser/.antlr/MathExprBaseListener.java
new file mode 100644
index 0000000..925ce74
--- /dev/null
+++ b/more_math/Parser/.antlr/MathExprBaseListener.java
@@ -0,0 +1,1418 @@
+// Generated from d:\stability\Data\Packages\ComfyUI\custom_nodes\more_math\more_math\Parser\MathExpr.g4 by ANTLR 4.9.2
+
+import org.antlr.v4.runtime.ParserRuleContext;
+import org.antlr.v4.runtime.tree.ErrorNode;
+import org.antlr.v4.runtime.tree.TerminalNode;
+
+/**
+ * This class provides an empty implementation of {@link MathExprListener},
+ * which can be extended to create a listener which only needs to handle a subset
+ * of the available methods.
+ */
+public class MathExprBaseListener implements MathExprListener {
+ /**
+ * {@inheritDoc}
+ *
+ *
The default implementation does nothing.
+ */
+ @Override public void enterStart(MathExprParser.StartContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitStart(MathExprParser.StartContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterFunctionDef(MathExprParser.FunctionDefContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitFunctionDef(MathExprParser.FunctionDefContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterVarDef(MathExprParser.VarDefContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitVarDef(MathExprParser.VarDefContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterParamList(MathExprParser.ParamListContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitParamList(MathExprParser.ParamListContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterExpr(MathExprParser.ExprContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitExpr(MathExprParser.ExprContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterLtExp(MathExprParser.LtExpContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitLtExp(MathExprParser.LtExpContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterEqExp(MathExprParser.EqExpContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitEqExp(MathExprParser.EqExpContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterToAdd(MathExprParser.ToAddContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitToAdd(MathExprParser.ToAddContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterGeExp(MathExprParser.GeExpContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitGeExp(MathExprParser.GeExpContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterLeExp(MathExprParser.LeExpContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitLeExp(MathExprParser.LeExpContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterNeExp(MathExprParser.NeExpContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitNeExp(MathExprParser.NeExpContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterGtExp(MathExprParser.GtExpContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitGtExp(MathExprParser.GtExpContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterAddExp(MathExprParser.AddExpContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitAddExp(MathExprParser.AddExpContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterToMul(MathExprParser.ToMulContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitToMul(MathExprParser.ToMulContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterSubExp(MathExprParser.SubExpContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitSubExp(MathExprParser.SubExpContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterMulExp(MathExprParser.MulExpContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitMulExp(MathExprParser.MulExpContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterModExp(MathExprParser.ModExpContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitModExp(MathExprParser.ModExpContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterDivExp(MathExprParser.DivExpContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitDivExp(MathExprParser.DivExpContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterToPow(MathExprParser.ToPowContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitToPow(MathExprParser.ToPowContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterPowExp(MathExprParser.PowExpContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitPowExp(MathExprParser.PowExpContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterToUnary(MathExprParser.ToUnaryContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitToUnary(MathExprParser.ToUnaryContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterUnaryPlus(MathExprParser.UnaryPlusContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitUnaryPlus(MathExprParser.UnaryPlusContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterUnaryMinus(MathExprParser.UnaryMinusContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitUnaryMinus(MathExprParser.UnaryMinusContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterToIndex(MathExprParser.ToIndexContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitToIndex(MathExprParser.ToIndexContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterIndexExp(MathExprParser.IndexExpContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitIndexExp(MathExprParser.IndexExpContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterToAtom(MathExprParser.ToAtomContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitToAtom(MathExprParser.ToAtomContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterFunc1Exp(MathExprParser.Func1ExpContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitFunc1Exp(MathExprParser.Func1ExpContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterFunc2Exp(MathExprParser.Func2ExpContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitFunc2Exp(MathExprParser.Func2ExpContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterFunc3Exp(MathExprParser.Func3ExpContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitFunc3Exp(MathExprParser.Func3ExpContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterFunc4Exp(MathExprParser.Func4ExpContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitFunc4Exp(MathExprParser.Func4ExpContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterFuncNExp(MathExprParser.FuncNExpContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitFuncNExp(MathExprParser.FuncNExpContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterVariableExp(MathExprParser.VariableExpContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitVariableExp(MathExprParser.VariableExpContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterNumberExp(MathExprParser.NumberExpContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitNumberExp(MathExprParser.NumberExpContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterConstantExp(MathExprParser.ConstantExpContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitConstantExp(MathExprParser.ConstantExpContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterParenExp(MathExprParser.ParenExpContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitParenExp(MathExprParser.ParenExpContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterAbsExp(MathExprParser.AbsExpContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitAbsExp(MathExprParser.AbsExpContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterListExp(MathExprParser.ListExpContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitListExp(MathExprParser.ListExpContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterCallExp(MathExprParser.CallExpContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitCallExp(MathExprParser.CallExpContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterExprList(MathExprParser.ExprListContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitExprList(MathExprParser.ExprListContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterSinFunc(MathExprParser.SinFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitSinFunc(MathExprParser.SinFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterCosFunc(MathExprParser.CosFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitCosFunc(MathExprParser.CosFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterTanFunc(MathExprParser.TanFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitTanFunc(MathExprParser.TanFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterAsinFunc(MathExprParser.AsinFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitAsinFunc(MathExprParser.AsinFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterAcosFunc(MathExprParser.AcosFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitAcosFunc(MathExprParser.AcosFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterAtanFunc(MathExprParser.AtanFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitAtanFunc(MathExprParser.AtanFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterSinhFunc(MathExprParser.SinhFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitSinhFunc(MathExprParser.SinhFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterCoshFunc(MathExprParser.CoshFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitCoshFunc(MathExprParser.CoshFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterTanhFunc(MathExprParser.TanhFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitTanhFunc(MathExprParser.TanhFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterAsinhFunc(MathExprParser.AsinhFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitAsinhFunc(MathExprParser.AsinhFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterAcoshFunc(MathExprParser.AcoshFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitAcoshFunc(MathExprParser.AcoshFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterAtanhFunc(MathExprParser.AtanhFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitAtanhFunc(MathExprParser.AtanhFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterAbsFunc(MathExprParser.AbsFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitAbsFunc(MathExprParser.AbsFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterSqrtFunc(MathExprParser.SqrtFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitSqrtFunc(MathExprParser.SqrtFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterLnFunc(MathExprParser.LnFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitLnFunc(MathExprParser.LnFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterLogFunc(MathExprParser.LogFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitLogFunc(MathExprParser.LogFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterExpFunc(MathExprParser.ExpFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitExpFunc(MathExprParser.ExpFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterTNormFunc(MathExprParser.TNormFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitTNormFunc(MathExprParser.TNormFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterSNormFunc(MathExprParser.SNormFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitSNormFunc(MathExprParser.SNormFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterFloorFunc(MathExprParser.FloorFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitFloorFunc(MathExprParser.FloorFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterCeilFunc(MathExprParser.CeilFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitCeilFunc(MathExprParser.CeilFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterRoundFunc(MathExprParser.RoundFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitRoundFunc(MathExprParser.RoundFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterGammaFunc(MathExprParser.GammaFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitGammaFunc(MathExprParser.GammaFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterSigmoidFunc(MathExprParser.SigmoidFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitSigmoidFunc(MathExprParser.SigmoidFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterSfftFunc(MathExprParser.SfftFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitSfftFunc(MathExprParser.SfftFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterSifftFunc(MathExprParser.SifftFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitSifftFunc(MathExprParser.SifftFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterAnglFunc(MathExprParser.AnglFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitAnglFunc(MathExprParser.AnglFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterPrintFunc(MathExprParser.PrintFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitPrintFunc(MathExprParser.PrintFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterFractFunc(MathExprParser.FractFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitFractFunc(MathExprParser.FractFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterReluFunc(MathExprParser.ReluFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitReluFunc(MathExprParser.ReluFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterSoftplusFunc(MathExprParser.SoftplusFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitSoftplusFunc(MathExprParser.SoftplusFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterGeluFunc(MathExprParser.GeluFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitGeluFunc(MathExprParser.GeluFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterSignFunc(MathExprParser.SignFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitSignFunc(MathExprParser.SignFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterPrintShapeFunc(MathExprParser.PrintShapeFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitPrintShapeFunc(MathExprParser.PrintShapeFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterPinvFunc(MathExprParser.PinvFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitPinvFunc(MathExprParser.PinvFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterSumFunc(MathExprParser.SumFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitSumFunc(MathExprParser.SumFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterMeanFunc(MathExprParser.MeanFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitMeanFunc(MathExprParser.MeanFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterStdFunc(MathExprParser.StdFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitStdFunc(MathExprParser.StdFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterVarFunc(MathExprParser.VarFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitVarFunc(MathExprParser.VarFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterSortFunc(MathExprParser.SortFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitSortFunc(MathExprParser.SortFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterNoiseFunc(MathExprParser.NoiseFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitNoiseFunc(MathExprParser.NoiseFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterRandFunc(MathExprParser.RandFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitRandFunc(MathExprParser.RandFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterPowFunc(MathExprParser.PowFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitPowFunc(MathExprParser.PowFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterAtan2Func(MathExprParser.Atan2FuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitAtan2Func(MathExprParser.Atan2FuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterTMinFunc(MathExprParser.TMinFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitTMinFunc(MathExprParser.TMinFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterTMaxFunc(MathExprParser.TMaxFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitTMaxFunc(MathExprParser.TMaxFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterStepFunc(MathExprParser.StepFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitStepFunc(MathExprParser.StepFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterTopkFunc(MathExprParser.TopkFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitTopkFunc(MathExprParser.TopkFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterBotkFunc(MathExprParser.BotkFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitBotkFunc(MathExprParser.BotkFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterQuartileFunc(MathExprParser.QuartileFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitQuartileFunc(MathExprParser.QuartileFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterPercentileFunc(MathExprParser.PercentileFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitPercentileFunc(MathExprParser.PercentileFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterQuantileFunc(MathExprParser.QuantileFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitQuantileFunc(MathExprParser.QuantileFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterDotFunc(MathExprParser.DotFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitDotFunc(MathExprParser.DotFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterCossimFunc(MathExprParser.CossimFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitCossimFunc(MathExprParser.CossimFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterFlipFunc(MathExprParser.FlipFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitFlipFunc(MathExprParser.FlipFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterCovFunc(MathExprParser.CovFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitCovFunc(MathExprParser.CovFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterAppendFunc(MathExprParser.AppendFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitAppendFunc(MathExprParser.AppendFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterExponentialFunc(MathExprParser.ExponentialFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitExponentialFunc(MathExprParser.ExponentialFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterBernoulliFunc(MathExprParser.BernoulliFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitBernoulliFunc(MathExprParser.BernoulliFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterPoissonFunc(MathExprParser.PoissonFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitPoissonFunc(MathExprParser.PoissonFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterClampFunc(MathExprParser.ClampFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitClampFunc(MathExprParser.ClampFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterLerpFunc(MathExprParser.LerpFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitLerpFunc(MathExprParser.LerpFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterSmoothstepFunc(MathExprParser.SmoothstepFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitSmoothstepFunc(MathExprParser.SmoothstepFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterRangeFunc(MathExprParser.RangeFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitRangeFunc(MathExprParser.RangeFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterMomentFunc(MathExprParser.MomentFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitMomentFunc(MathExprParser.MomentFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterCauchyFunc(MathExprParser.CauchyFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitCauchyFunc(MathExprParser.CauchyFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterLogNormalFunc(MathExprParser.LogNormalFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitLogNormalFunc(MathExprParser.LogNormalFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterSwapFunc(MathExprParser.SwapFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitSwapFunc(MathExprParser.SwapFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterNvlFunc(MathExprParser.NvlFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitNvlFunc(MathExprParser.NvlFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterSMinFunc(MathExprParser.SMinFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitSMinFunc(MathExprParser.SMinFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterSMaxFunc(MathExprParser.SMaxFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitSMaxFunc(MathExprParser.SMaxFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterMapFunc(MathExprParser.MapFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitMapFunc(MathExprParser.MapFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterEzConvFunc(MathExprParser.EzConvFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitEzConvFunc(MathExprParser.EzConvFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterConvFunc(MathExprParser.ConvFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitConvFunc(MathExprParser.ConvFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterPermuteFunc(MathExprParser.PermuteFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitPermuteFunc(MathExprParser.PermuteFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterReshapeFunc(MathExprParser.ReshapeFuncContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitReshapeFunc(MathExprParser.ReshapeFuncContext ctx) { }
+
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterEveryRule(ParserRuleContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitEveryRule(ParserRuleContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void visitTerminal(TerminalNode node) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void visitErrorNode(ErrorNode node) { }
+}
\ No newline at end of file
diff --git a/more_math/Parser/.antlr/MathExprLexer.interp b/more_math/Parser/.antlr/MathExprLexer.interp
new file mode 100644
index 0000000..896f17b
--- /dev/null
+++ b/more_math/Parser/.antlr/MathExprLexer.interp
@@ -0,0 +1,320 @@
+token literal names:
+null
+'sin'
+'cos'
+'tan'
+'asin'
+'acos'
+'atan'
+'atan2'
+'sinh'
+'cosh'
+'tanh'
+'asinh'
+'acosh'
+'atanh'
+'abs'
+'sqrt'
+'ln'
+'log'
+'exp'
+'smin'
+'smax'
+'tmin'
+'tmax'
+'tnorm'
+'snorm'
+'floor'
+'ceil'
+'round'
+'gamma'
+'pow'
+'sigm'
+'clamp'
+'fft'
+'ifft'
+'angle'
+'print'
+null
+null
+'lerp'
+'step'
+'smoothstep'
+'fract'
+'relu'
+'softplus'
+'gelu'
+'sign'
+'map'
+null
+null
+'swap'
+null
+null
+'range'
+'topk'
+'botk'
+'pinv'
+'sum'
+'mean'
+'std'
+'var'
+null
+null
+'quantile'
+'dot'
+'moment'
+null
+null
+null
+null
+null
+null
+null
+'cossim'
+'flip'
+'cov'
+'sort'
+'append'
+'+'
+'-'
+'*'
+'/'
+'%'
+'^'
+'>='
+'>'
+'<='
+'<'
+'=='
+'='
+'!='
+'|'
+'('
+')'
+','
+';'
+'->'
+'['
+']'
+null
+null
+null
+null
+
+token symbolic names:
+null
+SIN
+COS
+TAN
+ASIN
+ACOS
+ATAN
+ATAN2
+SINH
+COSH
+TANH
+ASINH
+ACOSH
+ATANH
+ABS
+SQRT
+LN
+LOG
+EXP
+SMIN
+SMAX
+TMIN
+TMAX
+TNORM
+SNORM
+FLOOR
+CEIL
+ROUND
+GAMMA
+POWE
+SIGM
+CLAMP
+SFFT
+SIFFT
+ANGL
+PRNT
+PRINT_SHAPE
+NVL
+LERP
+STEP
+SMOOTHSTEP
+FRACT
+RELU
+SOFTPLUS
+GELU
+SIGN
+MAP
+EZCONV
+CONV
+SWAP
+PERM
+RESHAPE
+RANGE
+TOPK
+BOTK
+PINV
+SUM
+MEAN
+STD
+VAR
+QUARTILE
+PERCENTILE
+QUANTILE
+DOT
+MOMENT
+NOISE
+RAND
+CAUCHY
+EXPONENTIAL
+LOGNORMAL
+BERNOULLI
+POISSON
+COSSIM
+FLIP
+COV
+SORT
+APPEND
+PLUS
+MINUS
+MULT
+DIV
+MOD
+POW
+GE
+GT
+LE
+LT
+EQ
+EQUEALS
+NE
+PIPE
+LPAREN
+RPAREN
+COMMA
+SEMICOLON
+ARROW
+LBRACKET
+RBRACKET
+CONSTANT
+NUMBER
+VARIABLE
+WS
+
+rule names:
+SIN
+COS
+TAN
+ASIN
+ACOS
+ATAN
+ATAN2
+SINH
+COSH
+TANH
+ASINH
+ACOSH
+ATANH
+ABS
+SQRT
+LN
+LOG
+EXP
+SMIN
+SMAX
+TMIN
+TMAX
+TNORM
+SNORM
+FLOOR
+CEIL
+ROUND
+GAMMA
+POWE
+SIGM
+CLAMP
+SFFT
+SIFFT
+ANGL
+PRNT
+PRINT_SHAPE
+NVL
+LERP
+STEP
+SMOOTHSTEP
+FRACT
+RELU
+SOFTPLUS
+GELU
+SIGN
+MAP
+EZCONV
+CONV
+SWAP
+PERM
+RESHAPE
+RANGE
+TOPK
+BOTK
+PINV
+SUM
+MEAN
+STD
+VAR
+QUARTILE
+PERCENTILE
+QUANTILE
+DOT
+MOMENT
+NOISE
+RAND
+CAUCHY
+EXPONENTIAL
+LOGNORMAL
+BERNOULLI
+POISSON
+COSSIM
+FLIP
+COV
+SORT
+APPEND
+PLUS
+MINUS
+MULT
+DIV
+MOD
+POW
+GE
+GT
+LE
+LT
+EQ
+EQUEALS
+NE
+PIPE
+LPAREN
+RPAREN
+COMMA
+SEMICOLON
+ARROW
+LBRACKET
+RBRACKET
+CONSTANT
+NUMBER
+VARIABLE
+WS
+
+channel names:
+DEFAULT_TOKEN_CHANNEL
+HIDDEN
+
+mode names:
+DEFAULT_MODE
+
+atn:
+[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 2, 103, 903, 8, 1, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 4, 66, 9, 66, 4, 67, 9, 67, 4, 68, 9, 68, 4, 69, 9, 69, 4, 70, 9, 70, 4, 71, 9, 71, 4, 72, 9, 72, 4, 73, 9, 73, 4, 74, 9, 74, 4, 75, 9, 75, 4, 76, 9, 76, 4, 77, 9, 77, 4, 78, 9, 78, 4, 79, 9, 79, 4, 80, 9, 80, 4, 81, 9, 81, 4, 82, 9, 82, 4, 83, 9, 83, 4, 84, 9, 84, 4, 85, 9, 85, 4, 86, 9, 86, 4, 87, 9, 87, 4, 88, 9, 88, 4, 89, 9, 89, 4, 90, 9, 90, 4, 91, 9, 91, 4, 92, 9, 92, 4, 93, 9, 93, 4, 94, 9, 94, 4, 95, 9, 95, 4, 96, 9, 96, 4, 97, 9, 97, 4, 98, 9, 98, 4, 99, 9, 99, 4, 100, 9, 100, 4, 101, 9, 101, 4, 102, 9, 102, 3, 2, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 3, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 33, 3, 33, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 5, 37, 398, 10, 37, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 5, 38, 413, 10, 38, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 47, 3, 47, 3, 47, 3, 47, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 5, 48, 489, 10, 48, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 5, 49, 506, 10, 49, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 5, 51, 524, 10, 51, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 5, 52, 537, 10, 52, 3, 53, 3, 53, 3, 53, 3, 53, 3, 53, 3, 53, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 57, 3, 57, 3, 57, 3, 57, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 59, 3, 59, 3, 59, 3, 59, 3, 60, 3, 60, 3, 60, 3, 60, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 5, 61, 592, 10, 61, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 5, 62, 609, 10, 62, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 64, 3, 64, 3, 64, 3, 64, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 5, 66, 654, 10, 66, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 5, 67, 679, 10, 67, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 5, 68, 699, 10, 68, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 5, 69, 724, 10, 69, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 5, 70, 749, 10, 70, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 5, 71, 772, 10, 71, 3, 72, 3, 72, 3, 72, 3, 72, 3, 72, 3, 72, 3, 72, 3, 72, 3, 72, 3, 72, 3, 72, 3, 72, 3, 72, 3, 72, 3, 72, 3, 72, 3, 72, 3, 72, 3, 72, 5, 72, 793, 10, 72, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 75, 3, 75, 3, 75, 3, 75, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 77, 3, 77, 3, 77, 3, 77, 3, 77, 3, 77, 3, 77, 3, 78, 3, 78, 3, 79, 3, 79, 3, 80, 3, 80, 3, 81, 3, 81, 3, 82, 3, 82, 3, 83, 3, 83, 3, 84, 3, 84, 3, 84, 3, 85, 3, 85, 3, 86, 3, 86, 3, 86, 3, 87, 3, 87, 3, 88, 3, 88, 3, 88, 3, 89, 3, 89, 3, 90, 3, 90, 3, 90, 3, 91, 3, 91, 3, 92, 3, 92, 3, 93, 3, 93, 3, 94, 3, 94, 3, 95, 3, 95, 3, 96, 3, 96, 3, 96, 3, 97, 3, 97, 3, 98, 3, 98, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 5, 99, 875, 10, 99, 3, 100, 6, 100, 878, 10, 100, 13, 100, 14, 100, 879, 3, 100, 3, 100, 6, 100, 884, 10, 100, 13, 100, 14, 100, 885, 5, 100, 888, 10, 100, 3, 101, 3, 101, 7, 101, 892, 10, 101, 12, 101, 14, 101, 895, 11, 101, 3, 102, 6, 102, 898, 10, 102, 13, 102, 14, 102, 899, 3, 102, 3, 102, 2, 2, 103, 3, 3, 5, 4, 7, 5, 9, 6, 11, 7, 13, 8, 15, 9, 17, 10, 19, 11, 21, 12, 23, 13, 25, 14, 27, 15, 29, 16, 31, 17, 33, 18, 35, 19, 37, 20, 39, 21, 41, 22, 43, 23, 45, 24, 47, 25, 49, 26, 51, 27, 53, 28, 55, 29, 57, 30, 59, 31, 61, 32, 63, 33, 65, 34, 67, 35, 69, 36, 71, 37, 73, 38, 75, 39, 77, 40, 79, 41, 81, 42, 83, 43, 85, 44, 87, 45, 89, 46, 91, 47, 93, 48, 95, 49, 97, 50, 99, 51, 101, 52, 103, 53, 105, 54, 107, 55, 109, 56, 111, 57, 113, 58, 115, 59, 117, 60, 119, 61, 121, 62, 123, 63, 125, 64, 127, 65, 129, 66, 131, 67, 133, 68, 135, 69, 137, 70, 139, 71, 141, 72, 143, 73, 145, 74, 147, 75, 149, 76, 151, 77, 153, 78, 155, 79, 157, 80, 159, 81, 161, 82, 163, 83, 165, 84, 167, 85, 169, 86, 171, 87, 173, 88, 175, 89, 177, 90, 179, 91, 181, 92, 183, 93, 185, 94, 187, 95, 189, 96, 191, 97, 193, 98, 195, 99, 197, 100, 199, 101, 201, 102, 203, 103, 3, 2, 7, 4, 2, 71, 71, 103, 103, 3, 2, 50, 59, 5, 2, 67, 92, 97, 97, 99, 124, 6, 2, 50, 59, 67, 92, 97, 97, 99, 124, 5, 2, 11, 12, 15, 15, 34, 34, 2, 926, 2, 3, 3, 2, 2, 2, 2, 5, 3, 2, 2, 2, 2, 7, 3, 2, 2, 2, 2, 9, 3, 2, 2, 2, 2, 11, 3, 2, 2, 2, 2, 13, 3, 2, 2, 2, 2, 15, 3, 2, 2, 2, 2, 17, 3, 2, 2, 2, 2, 19, 3, 2, 2, 2, 2, 21, 3, 2, 2, 2, 2, 23, 3, 2, 2, 2, 2, 25, 3, 2, 2, 2, 2, 27, 3, 2, 2, 2, 2, 29, 3, 2, 2, 2, 2, 31, 3, 2, 2, 2, 2, 33, 3, 2, 2, 2, 2, 35, 3, 2, 2, 2, 2, 37, 3, 2, 2, 2, 2, 39, 3, 2, 2, 2, 2, 41, 3, 2, 2, 2, 2, 43, 3, 2, 2, 2, 2, 45, 3, 2, 2, 2, 2, 47, 3, 2, 2, 2, 2, 49, 3, 2, 2, 2, 2, 51, 3, 2, 2, 2, 2, 53, 3, 2, 2, 2, 2, 55, 3, 2, 2, 2, 2, 57, 3, 2, 2, 2, 2, 59, 3, 2, 2, 2, 2, 61, 3, 2, 2, 2, 2, 63, 3, 2, 2, 2, 2, 65, 3, 2, 2, 2, 2, 67, 3, 2, 2, 2, 2, 69, 3, 2, 2, 2, 2, 71, 3, 2, 2, 2, 2, 73, 3, 2, 2, 2, 2, 75, 3, 2, 2, 2, 2, 77, 3, 2, 2, 2, 2, 79, 3, 2, 2, 2, 2, 81, 3, 2, 2, 2, 2, 83, 3, 2, 2, 2, 2, 85, 3, 2, 2, 2, 2, 87, 3, 2, 2, 2, 2, 89, 3, 2, 2, 2, 2, 91, 3, 2, 2, 2, 2, 93, 3, 2, 2, 2, 2, 95, 3, 2, 2, 2, 2, 97, 3, 2, 2, 2, 2, 99, 3, 2, 2, 2, 2, 101, 3, 2, 2, 2, 2, 103, 3, 2, 2, 2, 2, 105, 3, 2, 2, 2, 2, 107, 3, 2, 2, 2, 2, 109, 3, 2, 2, 2, 2, 111, 3, 2, 2, 2, 2, 113, 3, 2, 2, 2, 2, 115, 3, 2, 2, 2, 2, 117, 3, 2, 2, 2, 2, 119, 3, 2, 2, 2, 2, 121, 3, 2, 2, 2, 2, 123, 3, 2, 2, 2, 2, 125, 3, 2, 2, 2, 2, 127, 3, 2, 2, 2, 2, 129, 3, 2, 2, 2, 2, 131, 3, 2, 2, 2, 2, 133, 3, 2, 2, 2, 2, 135, 3, 2, 2, 2, 2, 137, 3, 2, 2, 2, 2, 139, 3, 2, 2, 2, 2, 141, 3, 2, 2, 2, 2, 143, 3, 2, 2, 2, 2, 145, 3, 2, 2, 2, 2, 147, 3, 2, 2, 2, 2, 149, 3, 2, 2, 2, 2, 151, 3, 2, 2, 2, 2, 153, 3, 2, 2, 2, 2, 155, 3, 2, 2, 2, 2, 157, 3, 2, 2, 2, 2, 159, 3, 2, 2, 2, 2, 161, 3, 2, 2, 2, 2, 163, 3, 2, 2, 2, 2, 165, 3, 2, 2, 2, 2, 167, 3, 2, 2, 2, 2, 169, 3, 2, 2, 2, 2, 171, 3, 2, 2, 2, 2, 173, 3, 2, 2, 2, 2, 175, 3, 2, 2, 2, 2, 177, 3, 2, 2, 2, 2, 179, 3, 2, 2, 2, 2, 181, 3, 2, 2, 2, 2, 183, 3, 2, 2, 2, 2, 185, 3, 2, 2, 2, 2, 187, 3, 2, 2, 2, 2, 189, 3, 2, 2, 2, 2, 191, 3, 2, 2, 2, 2, 193, 3, 2, 2, 2, 2, 195, 3, 2, 2, 2, 2, 197, 3, 2, 2, 2, 2, 199, 3, 2, 2, 2, 2, 201, 3, 2, 2, 2, 2, 203, 3, 2, 2, 2, 3, 205, 3, 2, 2, 2, 5, 209, 3, 2, 2, 2, 7, 213, 3, 2, 2, 2, 9, 217, 3, 2, 2, 2, 11, 222, 3, 2, 2, 2, 13, 227, 3, 2, 2, 2, 15, 232, 3, 2, 2, 2, 17, 238, 3, 2, 2, 2, 19, 243, 3, 2, 2, 2, 21, 248, 3, 2, 2, 2, 23, 253, 3, 2, 2, 2, 25, 259, 3, 2, 2, 2, 27, 265, 3, 2, 2, 2, 29, 271, 3, 2, 2, 2, 31, 275, 3, 2, 2, 2, 33, 280, 3, 2, 2, 2, 35, 283, 3, 2, 2, 2, 37, 287, 3, 2, 2, 2, 39, 291, 3, 2, 2, 2, 41, 296, 3, 2, 2, 2, 43, 301, 3, 2, 2, 2, 45, 306, 3, 2, 2, 2, 47, 311, 3, 2, 2, 2, 49, 317, 3, 2, 2, 2, 51, 323, 3, 2, 2, 2, 53, 329, 3, 2, 2, 2, 55, 334, 3, 2, 2, 2, 57, 340, 3, 2, 2, 2, 59, 346, 3, 2, 2, 2, 61, 350, 3, 2, 2, 2, 63, 355, 3, 2, 2, 2, 65, 361, 3, 2, 2, 2, 67, 365, 3, 2, 2, 2, 69, 370, 3, 2, 2, 2, 71, 376, 3, 2, 2, 2, 73, 397, 3, 2, 2, 2, 75, 412, 3, 2, 2, 2, 77, 414, 3, 2, 2, 2, 79, 419, 3, 2, 2, 2, 81, 424, 3, 2, 2, 2, 83, 435, 3, 2, 2, 2, 85, 441, 3, 2, 2, 2, 87, 446, 3, 2, 2, 2, 89, 455, 3, 2, 2, 2, 91, 460, 3, 2, 2, 2, 93, 465, 3, 2, 2, 2, 95, 488, 3, 2, 2, 2, 97, 505, 3, 2, 2, 2, 99, 507, 3, 2, 2, 2, 101, 523, 3, 2, 2, 2, 103, 536, 3, 2, 2, 2, 105, 538, 3, 2, 2, 2, 107, 544, 3, 2, 2, 2, 109, 549, 3, 2, 2, 2, 111, 554, 3, 2, 2, 2, 113, 559, 3, 2, 2, 2, 115, 563, 3, 2, 2, 2, 117, 568, 3, 2, 2, 2, 119, 572, 3, 2, 2, 2, 121, 591, 3, 2, 2, 2, 123, 608, 3, 2, 2, 2, 125, 610, 3, 2, 2, 2, 127, 619, 3, 2, 2, 2, 129, 623, 3, 2, 2, 2, 131, 653, 3, 2, 2, 2, 133, 678, 3, 2, 2, 2, 135, 698, 3, 2, 2, 2, 137, 723, 3, 2, 2, 2, 139, 748, 3, 2, 2, 2, 141, 771, 3, 2, 2, 2, 143, 792, 3, 2, 2, 2, 145, 794, 3, 2, 2, 2, 147, 801, 3, 2, 2, 2, 149, 806, 3, 2, 2, 2, 151, 810, 3, 2, 2, 2, 153, 815, 3, 2, 2, 2, 155, 822, 3, 2, 2, 2, 157, 824, 3, 2, 2, 2, 159, 826, 3, 2, 2, 2, 161, 828, 3, 2, 2, 2, 163, 830, 3, 2, 2, 2, 165, 832, 3, 2, 2, 2, 167, 834, 3, 2, 2, 2, 169, 837, 3, 2, 2, 2, 171, 839, 3, 2, 2, 2, 173, 842, 3, 2, 2, 2, 175, 844, 3, 2, 2, 2, 177, 847, 3, 2, 2, 2, 179, 849, 3, 2, 2, 2, 181, 852, 3, 2, 2, 2, 183, 854, 3, 2, 2, 2, 185, 856, 3, 2, 2, 2, 187, 858, 3, 2, 2, 2, 189, 860, 3, 2, 2, 2, 191, 862, 3, 2, 2, 2, 193, 865, 3, 2, 2, 2, 195, 867, 3, 2, 2, 2, 197, 874, 3, 2, 2, 2, 199, 877, 3, 2, 2, 2, 201, 889, 3, 2, 2, 2, 203, 897, 3, 2, 2, 2, 205, 206, 7, 117, 2, 2, 206, 207, 7, 107, 2, 2, 207, 208, 7, 112, 2, 2, 208, 4, 3, 2, 2, 2, 209, 210, 7, 101, 2, 2, 210, 211, 7, 113, 2, 2, 211, 212, 7, 117, 2, 2, 212, 6, 3, 2, 2, 2, 213, 214, 7, 118, 2, 2, 214, 215, 7, 99, 2, 2, 215, 216, 7, 112, 2, 2, 216, 8, 3, 2, 2, 2, 217, 218, 7, 99, 2, 2, 218, 219, 7, 117, 2, 2, 219, 220, 7, 107, 2, 2, 220, 221, 7, 112, 2, 2, 221, 10, 3, 2, 2, 2, 222, 223, 7, 99, 2, 2, 223, 224, 7, 101, 2, 2, 224, 225, 7, 113, 2, 2, 225, 226, 7, 117, 2, 2, 226, 12, 3, 2, 2, 2, 227, 228, 7, 99, 2, 2, 228, 229, 7, 118, 2, 2, 229, 230, 7, 99, 2, 2, 230, 231, 7, 112, 2, 2, 231, 14, 3, 2, 2, 2, 232, 233, 7, 99, 2, 2, 233, 234, 7, 118, 2, 2, 234, 235, 7, 99, 2, 2, 235, 236, 7, 112, 2, 2, 236, 237, 7, 52, 2, 2, 237, 16, 3, 2, 2, 2, 238, 239, 7, 117, 2, 2, 239, 240, 7, 107, 2, 2, 240, 241, 7, 112, 2, 2, 241, 242, 7, 106, 2, 2, 242, 18, 3, 2, 2, 2, 243, 244, 7, 101, 2, 2, 244, 245, 7, 113, 2, 2, 245, 246, 7, 117, 2, 2, 246, 247, 7, 106, 2, 2, 247, 20, 3, 2, 2, 2, 248, 249, 7, 118, 2, 2, 249, 250, 7, 99, 2, 2, 250, 251, 7, 112, 2, 2, 251, 252, 7, 106, 2, 2, 252, 22, 3, 2, 2, 2, 253, 254, 7, 99, 2, 2, 254, 255, 7, 117, 2, 2, 255, 256, 7, 107, 2, 2, 256, 257, 7, 112, 2, 2, 257, 258, 7, 106, 2, 2, 258, 24, 3, 2, 2, 2, 259, 260, 7, 99, 2, 2, 260, 261, 7, 101, 2, 2, 261, 262, 7, 113, 2, 2, 262, 263, 7, 117, 2, 2, 263, 264, 7, 106, 2, 2, 264, 26, 3, 2, 2, 2, 265, 266, 7, 99, 2, 2, 266, 267, 7, 118, 2, 2, 267, 268, 7, 99, 2, 2, 268, 269, 7, 112, 2, 2, 269, 270, 7, 106, 2, 2, 270, 28, 3, 2, 2, 2, 271, 272, 7, 99, 2, 2, 272, 273, 7, 100, 2, 2, 273, 274, 7, 117, 2, 2, 274, 30, 3, 2, 2, 2, 275, 276, 7, 117, 2, 2, 276, 277, 7, 115, 2, 2, 277, 278, 7, 116, 2, 2, 278, 279, 7, 118, 2, 2, 279, 32, 3, 2, 2, 2, 280, 281, 7, 110, 2, 2, 281, 282, 7, 112, 2, 2, 282, 34, 3, 2, 2, 2, 283, 284, 7, 110, 2, 2, 284, 285, 7, 113, 2, 2, 285, 286, 7, 105, 2, 2, 286, 36, 3, 2, 2, 2, 287, 288, 7, 103, 2, 2, 288, 289, 7, 122, 2, 2, 289, 290, 7, 114, 2, 2, 290, 38, 3, 2, 2, 2, 291, 292, 7, 117, 2, 2, 292, 293, 7, 111, 2, 2, 293, 294, 7, 107, 2, 2, 294, 295, 7, 112, 2, 2, 295, 40, 3, 2, 2, 2, 296, 297, 7, 117, 2, 2, 297, 298, 7, 111, 2, 2, 298, 299, 7, 99, 2, 2, 299, 300, 7, 122, 2, 2, 300, 42, 3, 2, 2, 2, 301, 302, 7, 118, 2, 2, 302, 303, 7, 111, 2, 2, 303, 304, 7, 107, 2, 2, 304, 305, 7, 112, 2, 2, 305, 44, 3, 2, 2, 2, 306, 307, 7, 118, 2, 2, 307, 308, 7, 111, 2, 2, 308, 309, 7, 99, 2, 2, 309, 310, 7, 122, 2, 2, 310, 46, 3, 2, 2, 2, 311, 312, 7, 118, 2, 2, 312, 313, 7, 112, 2, 2, 313, 314, 7, 113, 2, 2, 314, 315, 7, 116, 2, 2, 315, 316, 7, 111, 2, 2, 316, 48, 3, 2, 2, 2, 317, 318, 7, 117, 2, 2, 318, 319, 7, 112, 2, 2, 319, 320, 7, 113, 2, 2, 320, 321, 7, 116, 2, 2, 321, 322, 7, 111, 2, 2, 322, 50, 3, 2, 2, 2, 323, 324, 7, 104, 2, 2, 324, 325, 7, 110, 2, 2, 325, 326, 7, 113, 2, 2, 326, 327, 7, 113, 2, 2, 327, 328, 7, 116, 2, 2, 328, 52, 3, 2, 2, 2, 329, 330, 7, 101, 2, 2, 330, 331, 7, 103, 2, 2, 331, 332, 7, 107, 2, 2, 332, 333, 7, 110, 2, 2, 333, 54, 3, 2, 2, 2, 334, 335, 7, 116, 2, 2, 335, 336, 7, 113, 2, 2, 336, 337, 7, 119, 2, 2, 337, 338, 7, 112, 2, 2, 338, 339, 7, 102, 2, 2, 339, 56, 3, 2, 2, 2, 340, 341, 7, 105, 2, 2, 341, 342, 7, 99, 2, 2, 342, 343, 7, 111, 2, 2, 343, 344, 7, 111, 2, 2, 344, 345, 7, 99, 2, 2, 345, 58, 3, 2, 2, 2, 346, 347, 7, 114, 2, 2, 347, 348, 7, 113, 2, 2, 348, 349, 7, 121, 2, 2, 349, 60, 3, 2, 2, 2, 350, 351, 7, 117, 2, 2, 351, 352, 7, 107, 2, 2, 352, 353, 7, 105, 2, 2, 353, 354, 7, 111, 2, 2, 354, 62, 3, 2, 2, 2, 355, 356, 7, 101, 2, 2, 356, 357, 7, 110, 2, 2, 357, 358, 7, 99, 2, 2, 358, 359, 7, 111, 2, 2, 359, 360, 7, 114, 2, 2, 360, 64, 3, 2, 2, 2, 361, 362, 7, 104, 2, 2, 362, 363, 7, 104, 2, 2, 363, 364, 7, 118, 2, 2, 364, 66, 3, 2, 2, 2, 365, 366, 7, 107, 2, 2, 366, 367, 7, 104, 2, 2, 367, 368, 7, 104, 2, 2, 368, 369, 7, 118, 2, 2, 369, 68, 3, 2, 2, 2, 370, 371, 7, 99, 2, 2, 371, 372, 7, 112, 2, 2, 372, 373, 7, 105, 2, 2, 373, 374, 7, 110, 2, 2, 374, 375, 7, 103, 2, 2, 375, 70, 3, 2, 2, 2, 376, 377, 7, 114, 2, 2, 377, 378, 7, 116, 2, 2, 378, 379, 7, 107, 2, 2, 379, 380, 7, 112, 2, 2, 380, 381, 7, 118, 2, 2, 381, 72, 3, 2, 2, 2, 382, 383, 7, 114, 2, 2, 383, 384, 7, 116, 2, 2, 384, 385, 7, 107, 2, 2, 385, 386, 7, 112, 2, 2, 386, 387, 7, 118, 2, 2, 387, 388, 7, 97, 2, 2, 388, 389, 7, 117, 2, 2, 389, 390, 7, 106, 2, 2, 390, 391, 7, 99, 2, 2, 391, 392, 7, 114, 2, 2, 392, 398, 7, 103, 2, 2, 393, 394, 7, 114, 2, 2, 394, 395, 7, 117, 2, 2, 395, 396, 7, 106, 2, 2, 396, 398, 7, 114, 2, 2, 397, 382, 3, 2, 2, 2, 397, 393, 3, 2, 2, 2, 398, 74, 3, 2, 2, 2, 399, 400, 7, 112, 2, 2, 400, 401, 7, 120, 2, 2, 401, 413, 7, 110, 2, 2, 402, 403, 7, 112, 2, 2, 403, 404, 7, 99, 2, 2, 404, 405, 7, 112, 2, 2, 405, 406, 7, 97, 2, 2, 406, 407, 7, 118, 2, 2, 407, 408, 7, 113, 2, 2, 408, 409, 7, 97, 2, 2, 409, 410, 7, 112, 2, 2, 410, 411, 7, 119, 2, 2, 411, 413, 7, 111, 2, 2, 412, 399, 3, 2, 2, 2, 412, 402, 3, 2, 2, 2, 413, 76, 3, 2, 2, 2, 414, 415, 7, 110, 2, 2, 415, 416, 7, 103, 2, 2, 416, 417, 7, 116, 2, 2, 417, 418, 7, 114, 2, 2, 418, 78, 3, 2, 2, 2, 419, 420, 7, 117, 2, 2, 420, 421, 7, 118, 2, 2, 421, 422, 7, 103, 2, 2, 422, 423, 7, 114, 2, 2, 423, 80, 3, 2, 2, 2, 424, 425, 7, 117, 2, 2, 425, 426, 7, 111, 2, 2, 426, 427, 7, 113, 2, 2, 427, 428, 7, 113, 2, 2, 428, 429, 7, 118, 2, 2, 429, 430, 7, 106, 2, 2, 430, 431, 7, 117, 2, 2, 431, 432, 7, 118, 2, 2, 432, 433, 7, 103, 2, 2, 433, 434, 7, 114, 2, 2, 434, 82, 3, 2, 2, 2, 435, 436, 7, 104, 2, 2, 436, 437, 7, 116, 2, 2, 437, 438, 7, 99, 2, 2, 438, 439, 7, 101, 2, 2, 439, 440, 7, 118, 2, 2, 440, 84, 3, 2, 2, 2, 441, 442, 7, 116, 2, 2, 442, 443, 7, 103, 2, 2, 443, 444, 7, 110, 2, 2, 444, 445, 7, 119, 2, 2, 445, 86, 3, 2, 2, 2, 446, 447, 7, 117, 2, 2, 447, 448, 7, 113, 2, 2, 448, 449, 7, 104, 2, 2, 449, 450, 7, 118, 2, 2, 450, 451, 7, 114, 2, 2, 451, 452, 7, 110, 2, 2, 452, 453, 7, 119, 2, 2, 453, 454, 7, 117, 2, 2, 454, 88, 3, 2, 2, 2, 455, 456, 7, 105, 2, 2, 456, 457, 7, 103, 2, 2, 457, 458, 7, 110, 2, 2, 458, 459, 7, 119, 2, 2, 459, 90, 3, 2, 2, 2, 460, 461, 7, 117, 2, 2, 461, 462, 7, 107, 2, 2, 462, 463, 7, 105, 2, 2, 463, 464, 7, 112, 2, 2, 464, 92, 3, 2, 2, 2, 465, 466, 7, 111, 2, 2, 466, 467, 7, 99, 2, 2, 467, 468, 7, 114, 2, 2, 468, 94, 3, 2, 2, 2, 469, 470, 7, 103, 2, 2, 470, 471, 7, 124, 2, 2, 471, 472, 7, 101, 2, 2, 472, 473, 7, 113, 2, 2, 473, 474, 7, 112, 2, 2, 474, 475, 7, 120, 2, 2, 475, 476, 7, 113, 2, 2, 476, 477, 7, 110, 2, 2, 477, 478, 7, 119, 2, 2, 478, 479, 7, 118, 2, 2, 479, 480, 7, 107, 2, 2, 480, 481, 7, 113, 2, 2, 481, 489, 7, 112, 2, 2, 482, 483, 7, 103, 2, 2, 483, 484, 7, 124, 2, 2, 484, 485, 7, 101, 2, 2, 485, 486, 7, 113, 2, 2, 486, 487, 7, 112, 2, 2, 487, 489, 7, 120, 2, 2, 488, 469, 3, 2, 2, 2, 488, 482, 3, 2, 2, 2, 489, 96, 3, 2, 2, 2, 490, 491, 7, 101, 2, 2, 491, 492, 7, 113, 2, 2, 492, 493, 7, 112, 2, 2, 493, 494, 7, 120, 2, 2, 494, 495, 7, 113, 2, 2, 495, 496, 7, 110, 2, 2, 496, 497, 7, 119, 2, 2, 497, 498, 7, 118, 2, 2, 498, 499, 7, 107, 2, 2, 499, 500, 7, 113, 2, 2, 500, 506, 7, 112, 2, 2, 501, 502, 7, 101, 2, 2, 502, 503, 7, 113, 2, 2, 503, 504, 7, 112, 2, 2, 504, 506, 7, 120, 2, 2, 505, 490, 3, 2, 2, 2, 505, 501, 3, 2, 2, 2, 506, 98, 3, 2, 2, 2, 507, 508, 7, 117, 2, 2, 508, 509, 7, 121, 2, 2, 509, 510, 7, 99, 2, 2, 510, 511, 7, 114, 2, 2, 511, 100, 3, 2, 2, 2, 512, 513, 7, 114, 2, 2, 513, 514, 7, 103, 2, 2, 514, 515, 7, 116, 2, 2, 515, 516, 7, 111, 2, 2, 516, 517, 7, 119, 2, 2, 517, 518, 7, 118, 2, 2, 518, 524, 7, 103, 2, 2, 519, 520, 7, 114, 2, 2, 520, 521, 7, 103, 2, 2, 521, 522, 7, 116, 2, 2, 522, 524, 7, 111, 2, 2, 523, 512, 3, 2, 2, 2, 523, 519, 3, 2, 2, 2, 524, 102, 3, 2, 2, 2, 525, 526, 7, 116, 2, 2, 526, 527, 7, 103, 2, 2, 527, 528, 7, 117, 2, 2, 528, 529, 7, 106, 2, 2, 529, 530, 7, 99, 2, 2, 530, 531, 7, 114, 2, 2, 531, 537, 7, 103, 2, 2, 532, 533, 7, 116, 2, 2, 533, 534, 7, 117, 2, 2, 534, 535, 7, 106, 2, 2, 535, 537, 7, 114, 2, 2, 536, 525, 3, 2, 2, 2, 536, 532, 3, 2, 2, 2, 537, 104, 3, 2, 2, 2, 538, 539, 7, 116, 2, 2, 539, 540, 7, 99, 2, 2, 540, 541, 7, 112, 2, 2, 541, 542, 7, 105, 2, 2, 542, 543, 7, 103, 2, 2, 543, 106, 3, 2, 2, 2, 544, 545, 7, 118, 2, 2, 545, 546, 7, 113, 2, 2, 546, 547, 7, 114, 2, 2, 547, 548, 7, 109, 2, 2, 548, 108, 3, 2, 2, 2, 549, 550, 7, 100, 2, 2, 550, 551, 7, 113, 2, 2, 551, 552, 7, 118, 2, 2, 552, 553, 7, 109, 2, 2, 553, 110, 3, 2, 2, 2, 554, 555, 7, 114, 2, 2, 555, 556, 7, 107, 2, 2, 556, 557, 7, 112, 2, 2, 557, 558, 7, 120, 2, 2, 558, 112, 3, 2, 2, 2, 559, 560, 7, 117, 2, 2, 560, 561, 7, 119, 2, 2, 561, 562, 7, 111, 2, 2, 562, 114, 3, 2, 2, 2, 563, 564, 7, 111, 2, 2, 564, 565, 7, 103, 2, 2, 565, 566, 7, 99, 2, 2, 566, 567, 7, 112, 2, 2, 567, 116, 3, 2, 2, 2, 568, 569, 7, 117, 2, 2, 569, 570, 7, 118, 2, 2, 570, 571, 7, 102, 2, 2, 571, 118, 3, 2, 2, 2, 572, 573, 7, 120, 2, 2, 573, 574, 7, 99, 2, 2, 574, 575, 7, 116, 2, 2, 575, 120, 3, 2, 2, 2, 576, 577, 7, 115, 2, 2, 577, 578, 7, 119, 2, 2, 578, 579, 7, 99, 2, 2, 579, 580, 7, 116, 2, 2, 580, 581, 7, 118, 2, 2, 581, 582, 7, 107, 2, 2, 582, 583, 7, 110, 2, 2, 583, 592, 7, 103, 2, 2, 584, 585, 7, 115, 2, 2, 585, 586, 7, 119, 2, 2, 586, 587, 7, 99, 2, 2, 587, 588, 7, 116, 2, 2, 588, 589, 7, 118, 2, 2, 589, 590, 7, 107, 2, 2, 590, 592, 7, 110, 2, 2, 591, 576, 3, 2, 2, 2, 591, 584, 3, 2, 2, 2, 592, 122, 3, 2, 2, 2, 593, 594, 7, 114, 2, 2, 594, 595, 7, 103, 2, 2, 595, 596, 7, 116, 2, 2, 596, 597, 7, 101, 2, 2, 597, 598, 7, 103, 2, 2, 598, 599, 7, 112, 2, 2, 599, 600, 7, 118, 2, 2, 600, 601, 7, 107, 2, 2, 601, 602, 7, 110, 2, 2, 602, 609, 7, 103, 2, 2, 603, 604, 7, 114, 2, 2, 604, 605, 7, 116, 2, 2, 605, 606, 7, 101, 2, 2, 606, 607, 7, 112, 2, 2, 607, 609, 7, 118, 2, 2, 608, 593, 3, 2, 2, 2, 608, 603, 3, 2, 2, 2, 609, 124, 3, 2, 2, 2, 610, 611, 7, 115, 2, 2, 611, 612, 7, 119, 2, 2, 612, 613, 7, 99, 2, 2, 613, 614, 7, 112, 2, 2, 614, 615, 7, 118, 2, 2, 615, 616, 7, 107, 2, 2, 616, 617, 7, 110, 2, 2, 617, 618, 7, 103, 2, 2, 618, 126, 3, 2, 2, 2, 619, 620, 7, 102, 2, 2, 620, 621, 7, 113, 2, 2, 621, 622, 7, 118, 2, 2, 622, 128, 3, 2, 2, 2, 623, 624, 7, 111, 2, 2, 624, 625, 7, 113, 2, 2, 625, 626, 7, 111, 2, 2, 626, 627, 7, 103, 2, 2, 627, 628, 7, 112, 2, 2, 628, 629, 7, 118, 2, 2, 629, 130, 3, 2, 2, 2, 630, 631, 7, 112, 2, 2, 631, 632, 7, 113, 2, 2, 632, 633, 7, 107, 2, 2, 633, 634, 7, 117, 2, 2, 634, 654, 7, 103, 2, 2, 635, 636, 7, 116, 2, 2, 636, 637, 7, 99, 2, 2, 637, 638, 7, 112, 2, 2, 638, 639, 7, 102, 2, 2, 639, 654, 7, 112, 2, 2, 640, 641, 7, 116, 2, 2, 641, 642, 7, 99, 2, 2, 642, 643, 7, 112, 2, 2, 643, 644, 7, 102, 2, 2, 644, 645, 7, 113, 2, 2, 645, 646, 7, 111, 2, 2, 646, 647, 7, 97, 2, 2, 647, 648, 7, 112, 2, 2, 648, 649, 7, 113, 2, 2, 649, 650, 7, 116, 2, 2, 650, 651, 7, 111, 2, 2, 651, 652, 7, 99, 2, 2, 652, 654, 7, 110, 2, 2, 653, 630, 3, 2, 2, 2, 653, 635, 3, 2, 2, 2, 653, 640, 3, 2, 2, 2, 654, 132, 3, 2, 2, 2, 655, 656, 7, 116, 2, 2, 656, 657, 7, 99, 2, 2, 657, 658, 7, 112, 2, 2, 658, 679, 7, 102, 2, 2, 659, 660, 7, 116, 2, 2, 660, 661, 7, 99, 2, 2, 661, 662, 7, 112, 2, 2, 662, 663, 7, 102, 2, 2, 663, 679, 7, 119, 2, 2, 664, 665, 7, 116, 2, 2, 665, 666, 7, 99, 2, 2, 666, 667, 7, 112, 2, 2, 667, 668, 7, 102, 2, 2, 668, 669, 7, 113, 2, 2, 669, 670, 7, 111, 2, 2, 670, 671, 7, 97, 2, 2, 671, 672, 7, 119, 2, 2, 672, 673, 7, 112, 2, 2, 673, 674, 7, 107, 2, 2, 674, 675, 7, 104, 2, 2, 675, 676, 7, 113, 2, 2, 676, 677, 7, 116, 2, 2, 677, 679, 7, 111, 2, 2, 678, 655, 3, 2, 2, 2, 678, 659, 3, 2, 2, 2, 678, 664, 3, 2, 2, 2, 679, 134, 3, 2, 2, 2, 680, 681, 7, 116, 2, 2, 681, 682, 7, 99, 2, 2, 682, 683, 7, 112, 2, 2, 683, 684, 7, 102, 2, 2, 684, 699, 7, 101, 2, 2, 685, 686, 7, 116, 2, 2, 686, 687, 7, 99, 2, 2, 687, 688, 7, 112, 2, 2, 688, 689, 7, 102, 2, 2, 689, 690, 7, 113, 2, 2, 690, 691, 7, 111, 2, 2, 691, 692, 7, 97, 2, 2, 692, 693, 7, 101, 2, 2, 693, 694, 7, 99, 2, 2, 694, 695, 7, 119, 2, 2, 695, 696, 7, 101, 2, 2, 696, 697, 7, 106, 2, 2, 697, 699, 7, 123, 2, 2, 698, 680, 3, 2, 2, 2, 698, 685, 3, 2, 2, 2, 699, 136, 3, 2, 2, 2, 700, 701, 7, 116, 2, 2, 701, 702, 7, 99, 2, 2, 702, 703, 7, 112, 2, 2, 703, 704, 7, 102, 2, 2, 704, 724, 7, 103, 2, 2, 705, 706, 7, 116, 2, 2, 706, 707, 7, 99, 2, 2, 707, 708, 7, 112, 2, 2, 708, 709, 7, 102, 2, 2, 709, 710, 7, 113, 2, 2, 710, 711, 7, 111, 2, 2, 711, 712, 7, 97, 2, 2, 712, 713, 7, 103, 2, 2, 713, 714, 7, 122, 2, 2, 714, 715, 7, 114, 2, 2, 715, 716, 7, 113, 2, 2, 716, 717, 7, 112, 2, 2, 717, 718, 7, 103, 2, 2, 718, 719, 7, 112, 2, 2, 719, 720, 7, 118, 2, 2, 720, 721, 7, 107, 2, 2, 721, 722, 7, 99, 2, 2, 722, 724, 7, 110, 2, 2, 723, 700, 3, 2, 2, 2, 723, 705, 3, 2, 2, 2, 724, 138, 3, 2, 2, 2, 725, 726, 7, 116, 2, 2, 726, 727, 7, 99, 2, 2, 727, 728, 7, 112, 2, 2, 728, 729, 7, 102, 2, 2, 729, 730, 7, 110, 2, 2, 730, 749, 7, 112, 2, 2, 731, 732, 7, 116, 2, 2, 732, 733, 7, 99, 2, 2, 733, 734, 7, 112, 2, 2, 734, 735, 7, 102, 2, 2, 735, 736, 7, 113, 2, 2, 736, 737, 7, 111, 2, 2, 737, 738, 7, 97, 2, 2, 738, 739, 7, 110, 2, 2, 739, 740, 7, 113, 2, 2, 740, 741, 7, 105, 2, 2, 741, 742, 7, 97, 2, 2, 742, 743, 7, 112, 2, 2, 743, 744, 7, 113, 2, 2, 744, 745, 7, 116, 2, 2, 745, 746, 7, 111, 2, 2, 746, 747, 7, 99, 2, 2, 747, 749, 7, 110, 2, 2, 748, 725, 3, 2, 2, 2, 748, 731, 3, 2, 2, 2, 749, 140, 3, 2, 2, 2, 750, 751, 7, 116, 2, 2, 751, 752, 7, 99, 2, 2, 752, 753, 7, 112, 2, 2, 753, 754, 7, 102, 2, 2, 754, 772, 7, 100, 2, 2, 755, 756, 7, 116, 2, 2, 756, 757, 7, 99, 2, 2, 757, 758, 7, 112, 2, 2, 758, 759, 7, 102, 2, 2, 759, 760, 7, 113, 2, 2, 760, 761, 7, 111, 2, 2, 761, 762, 7, 97, 2, 2, 762, 763, 7, 100, 2, 2, 763, 764, 7, 103, 2, 2, 764, 765, 7, 116, 2, 2, 765, 766, 7, 112, 2, 2, 766, 767, 7, 113, 2, 2, 767, 768, 7, 119, 2, 2, 768, 769, 7, 110, 2, 2, 769, 770, 7, 110, 2, 2, 770, 772, 7, 107, 2, 2, 771, 750, 3, 2, 2, 2, 771, 755, 3, 2, 2, 2, 772, 142, 3, 2, 2, 2, 773, 774, 7, 116, 2, 2, 774, 775, 7, 99, 2, 2, 775, 776, 7, 112, 2, 2, 776, 777, 7, 102, 2, 2, 777, 793, 7, 114, 2, 2, 778, 779, 7, 116, 2, 2, 779, 780, 7, 99, 2, 2, 780, 781, 7, 112, 2, 2, 781, 782, 7, 102, 2, 2, 782, 783, 7, 113, 2, 2, 783, 784, 7, 111, 2, 2, 784, 785, 7, 97, 2, 2, 785, 786, 7, 114, 2, 2, 786, 787, 7, 113, 2, 2, 787, 788, 7, 107, 2, 2, 788, 789, 7, 117, 2, 2, 789, 790, 7, 117, 2, 2, 790, 791, 7, 113, 2, 2, 791, 793, 7, 112, 2, 2, 792, 773, 3, 2, 2, 2, 792, 778, 3, 2, 2, 2, 793, 144, 3, 2, 2, 2, 794, 795, 7, 101, 2, 2, 795, 796, 7, 113, 2, 2, 796, 797, 7, 117, 2, 2, 797, 798, 7, 117, 2, 2, 798, 799, 7, 107, 2, 2, 799, 800, 7, 111, 2, 2, 800, 146, 3, 2, 2, 2, 801, 802, 7, 104, 2, 2, 802, 803, 7, 110, 2, 2, 803, 804, 7, 107, 2, 2, 804, 805, 7, 114, 2, 2, 805, 148, 3, 2, 2, 2, 806, 807, 7, 101, 2, 2, 807, 808, 7, 113, 2, 2, 808, 809, 7, 120, 2, 2, 809, 150, 3, 2, 2, 2, 810, 811, 7, 117, 2, 2, 811, 812, 7, 113, 2, 2, 812, 813, 7, 116, 2, 2, 813, 814, 7, 118, 2, 2, 814, 152, 3, 2, 2, 2, 815, 816, 7, 99, 2, 2, 816, 817, 7, 114, 2, 2, 817, 818, 7, 114, 2, 2, 818, 819, 7, 103, 2, 2, 819, 820, 7, 112, 2, 2, 820, 821, 7, 102, 2, 2, 821, 154, 3, 2, 2, 2, 822, 823, 7, 45, 2, 2, 823, 156, 3, 2, 2, 2, 824, 825, 7, 47, 2, 2, 825, 158, 3, 2, 2, 2, 826, 827, 7, 44, 2, 2, 827, 160, 3, 2, 2, 2, 828, 829, 7, 49, 2, 2, 829, 162, 3, 2, 2, 2, 830, 831, 7, 39, 2, 2, 831, 164, 3, 2, 2, 2, 832, 833, 7, 96, 2, 2, 833, 166, 3, 2, 2, 2, 834, 835, 7, 64, 2, 2, 835, 836, 7, 63, 2, 2, 836, 168, 3, 2, 2, 2, 837, 838, 7, 64, 2, 2, 838, 170, 3, 2, 2, 2, 839, 840, 7, 62, 2, 2, 840, 841, 7, 63, 2, 2, 841, 172, 3, 2, 2, 2, 842, 843, 7, 62, 2, 2, 843, 174, 3, 2, 2, 2, 844, 845, 7, 63, 2, 2, 845, 846, 7, 63, 2, 2, 846, 176, 3, 2, 2, 2, 847, 848, 7, 63, 2, 2, 848, 178, 3, 2, 2, 2, 849, 850, 7, 35, 2, 2, 850, 851, 7, 63, 2, 2, 851, 180, 3, 2, 2, 2, 852, 853, 7, 126, 2, 2, 853, 182, 3, 2, 2, 2, 854, 855, 7, 42, 2, 2, 855, 184, 3, 2, 2, 2, 856, 857, 7, 43, 2, 2, 857, 186, 3, 2, 2, 2, 858, 859, 7, 46, 2, 2, 859, 188, 3, 2, 2, 2, 860, 861, 7, 61, 2, 2, 861, 190, 3, 2, 2, 2, 862, 863, 7, 47, 2, 2, 863, 864, 7, 64, 2, 2, 864, 192, 3, 2, 2, 2, 865, 866, 7, 93, 2, 2, 866, 194, 3, 2, 2, 2, 867, 868, 7, 95, 2, 2, 868, 196, 3, 2, 2, 2, 869, 870, 7, 114, 2, 2, 870, 875, 7, 107, 2, 2, 871, 872, 7, 82, 2, 2, 872, 875, 7, 75, 2, 2, 873, 875, 9, 2, 2, 2, 874, 869, 3, 2, 2, 2, 874, 871, 3, 2, 2, 2, 874, 873, 3, 2, 2, 2, 875, 198, 3, 2, 2, 2, 876, 878, 9, 3, 2, 2, 877, 876, 3, 2, 2, 2, 878, 879, 3, 2, 2, 2, 879, 877, 3, 2, 2, 2, 879, 880, 3, 2, 2, 2, 880, 887, 3, 2, 2, 2, 881, 883, 7, 48, 2, 2, 882, 884, 9, 3, 2, 2, 883, 882, 3, 2, 2, 2, 884, 885, 3, 2, 2, 2, 885, 883, 3, 2, 2, 2, 885, 886, 3, 2, 2, 2, 886, 888, 3, 2, 2, 2, 887, 881, 3, 2, 2, 2, 887, 888, 3, 2, 2, 2, 888, 200, 3, 2, 2, 2, 889, 893, 9, 4, 2, 2, 890, 892, 9, 5, 2, 2, 891, 890, 3, 2, 2, 2, 892, 895, 3, 2, 2, 2, 893, 891, 3, 2, 2, 2, 893, 894, 3, 2, 2, 2, 894, 202, 3, 2, 2, 2, 895, 893, 3, 2, 2, 2, 896, 898, 9, 6, 2, 2, 897, 896, 3, 2, 2, 2, 898, 899, 3, 2, 2, 2, 899, 897, 3, 2, 2, 2, 899, 900, 3, 2, 2, 2, 900, 901, 3, 2, 2, 2, 901, 902, 8, 102, 2, 2, 902, 204, 3, 2, 2, 2, 24, 2, 397, 412, 488, 505, 523, 536, 591, 608, 653, 678, 698, 723, 748, 771, 792, 874, 879, 885, 887, 893, 899, 3, 8, 2, 2]
\ No newline at end of file
diff --git a/more_math/Parser/.antlr/MathExprLexer.java b/more_math/Parser/.antlr/MathExprLexer.java
new file mode 100644
index 0000000..2f312a7
--- /dev/null
+++ b/more_math/Parser/.antlr/MathExprLexer.java
@@ -0,0 +1,456 @@
+// Generated from d:\stability\Data\Packages\ComfyUI\custom_nodes\more_math\more_math\Parser\MathExpr.g4 by ANTLR 4.9.2
+import org.antlr.v4.runtime.Lexer;
+import org.antlr.v4.runtime.CharStream;
+import org.antlr.v4.runtime.Token;
+import org.antlr.v4.runtime.TokenStream;
+import org.antlr.v4.runtime.*;
+import org.antlr.v4.runtime.atn.*;
+import org.antlr.v4.runtime.dfa.DFA;
+import org.antlr.v4.runtime.misc.*;
+
+@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"})
+public class MathExprLexer extends Lexer {
+ static { RuntimeMetaData.checkVersion("4.9.2", RuntimeMetaData.VERSION); }
+
+ protected static final DFA[] _decisionToDFA;
+ protected static final PredictionContextCache _sharedContextCache =
+ new PredictionContextCache();
+ public static final int
+ SIN=1, COS=2, TAN=3, ASIN=4, ACOS=5, ATAN=6, ATAN2=7, SINH=8, COSH=9,
+ TANH=10, ASINH=11, ACOSH=12, ATANH=13, ABS=14, SQRT=15, LN=16, LOG=17,
+ EXP=18, SMIN=19, SMAX=20, TMIN=21, TMAX=22, TNORM=23, SNORM=24, FLOOR=25,
+ CEIL=26, ROUND=27, GAMMA=28, POWE=29, SIGM=30, CLAMP=31, SFFT=32, SIFFT=33,
+ ANGL=34, PRNT=35, PRINT_SHAPE=36, NVL=37, LERP=38, STEP=39, SMOOTHSTEP=40,
+ FRACT=41, RELU=42, SOFTPLUS=43, GELU=44, SIGN=45, MAP=46, EZCONV=47, CONV=48,
+ SWAP=49, PERM=50, RESHAPE=51, RANGE=52, TOPK=53, BOTK=54, PINV=55, SUM=56,
+ MEAN=57, STD=58, VAR=59, QUARTILE=60, PERCENTILE=61, QUANTILE=62, DOT=63,
+ MOMENT=64, NOISE=65, RAND=66, CAUCHY=67, EXPONENTIAL=68, LOGNORMAL=69,
+ BERNOULLI=70, POISSON=71, COSSIM=72, FLIP=73, COV=74, SORT=75, APPEND=76,
+ PLUS=77, MINUS=78, MULT=79, DIV=80, MOD=81, POW=82, GE=83, GT=84, LE=85,
+ LT=86, EQ=87, EQUEALS=88, NE=89, PIPE=90, LPAREN=91, RPAREN=92, COMMA=93,
+ SEMICOLON=94, ARROW=95, LBRACKET=96, RBRACKET=97, CONSTANT=98, NUMBER=99,
+ VARIABLE=100, WS=101;
+ public static String[] channelNames = {
+ "DEFAULT_TOKEN_CHANNEL", "HIDDEN"
+ };
+
+ public static String[] modeNames = {
+ "DEFAULT_MODE"
+ };
+
+ private static String[] makeRuleNames() {
+ return new String[] {
+ "SIN", "COS", "TAN", "ASIN", "ACOS", "ATAN", "ATAN2", "SINH", "COSH",
+ "TANH", "ASINH", "ACOSH", "ATANH", "ABS", "SQRT", "LN", "LOG", "EXP",
+ "SMIN", "SMAX", "TMIN", "TMAX", "TNORM", "SNORM", "FLOOR", "CEIL", "ROUND",
+ "GAMMA", "POWE", "SIGM", "CLAMP", "SFFT", "SIFFT", "ANGL", "PRNT", "PRINT_SHAPE",
+ "NVL", "LERP", "STEP", "SMOOTHSTEP", "FRACT", "RELU", "SOFTPLUS", "GELU",
+ "SIGN", "MAP", "EZCONV", "CONV", "SWAP", "PERM", "RESHAPE", "RANGE",
+ "TOPK", "BOTK", "PINV", "SUM", "MEAN", "STD", "VAR", "QUARTILE", "PERCENTILE",
+ "QUANTILE", "DOT", "MOMENT", "NOISE", "RAND", "CAUCHY", "EXPONENTIAL",
+ "LOGNORMAL", "BERNOULLI", "POISSON", "COSSIM", "FLIP", "COV", "SORT",
+ "APPEND", "PLUS", "MINUS", "MULT", "DIV", "MOD", "POW", "GE", "GT", "LE",
+ "LT", "EQ", "EQUEALS", "NE", "PIPE", "LPAREN", "RPAREN", "COMMA", "SEMICOLON",
+ "ARROW", "LBRACKET", "RBRACKET", "CONSTANT", "NUMBER", "VARIABLE", "WS"
+ };
+ }
+ public static final String[] ruleNames = makeRuleNames();
+
+ private static String[] makeLiteralNames() {
+ return new String[] {
+ null, "'sin'", "'cos'", "'tan'", "'asin'", "'acos'", "'atan'", "'atan2'",
+ "'sinh'", "'cosh'", "'tanh'", "'asinh'", "'acosh'", "'atanh'", "'abs'",
+ "'sqrt'", "'ln'", "'log'", "'exp'", "'smin'", "'smax'", "'tmin'", "'tmax'",
+ "'tnorm'", "'snorm'", "'floor'", "'ceil'", "'round'", "'gamma'", "'pow'",
+ "'sigm'", "'clamp'", "'fft'", "'ifft'", "'angle'", "'print'", null, null,
+ "'lerp'", "'step'", "'smoothstep'", "'fract'", "'relu'", "'softplus'",
+ "'gelu'", "'sign'", "'map'", null, null, "'swap'", null, null, "'range'",
+ "'topk'", "'botk'", "'pinv'", "'sum'", "'mean'", "'std'", "'var'", null,
+ null, "'quantile'", "'dot'", "'moment'", null, null, null, null, null,
+ null, null, "'cossim'", "'flip'", "'cov'", "'sort'", "'append'", "'+'",
+ "'-'", "'*'", "'/'", "'%'", "'^'", "'>='", "'>'", "'<='", "'<'", "'=='",
+ "'='", "'!='", "'|'", "'('", "')'", "','", "';'", "'->'", "'['", "']'"
+ };
+ }
+ private static final String[] _LITERAL_NAMES = makeLiteralNames();
+ private static String[] makeSymbolicNames() {
+ return new String[] {
+ null, "SIN", "COS", "TAN", "ASIN", "ACOS", "ATAN", "ATAN2", "SINH", "COSH",
+ "TANH", "ASINH", "ACOSH", "ATANH", "ABS", "SQRT", "LN", "LOG", "EXP",
+ "SMIN", "SMAX", "TMIN", "TMAX", "TNORM", "SNORM", "FLOOR", "CEIL", "ROUND",
+ "GAMMA", "POWE", "SIGM", "CLAMP", "SFFT", "SIFFT", "ANGL", "PRNT", "PRINT_SHAPE",
+ "NVL", "LERP", "STEP", "SMOOTHSTEP", "FRACT", "RELU", "SOFTPLUS", "GELU",
+ "SIGN", "MAP", "EZCONV", "CONV", "SWAP", "PERM", "RESHAPE", "RANGE",
+ "TOPK", "BOTK", "PINV", "SUM", "MEAN", "STD", "VAR", "QUARTILE", "PERCENTILE",
+ "QUANTILE", "DOT", "MOMENT", "NOISE", "RAND", "CAUCHY", "EXPONENTIAL",
+ "LOGNORMAL", "BERNOULLI", "POISSON", "COSSIM", "FLIP", "COV", "SORT",
+ "APPEND", "PLUS", "MINUS", "MULT", "DIV", "MOD", "POW", "GE", "GT", "LE",
+ "LT", "EQ", "EQUEALS", "NE", "PIPE", "LPAREN", "RPAREN", "COMMA", "SEMICOLON",
+ "ARROW", "LBRACKET", "RBRACKET", "CONSTANT", "NUMBER", "VARIABLE", "WS"
+ };
+ }
+ private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames();
+ public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES);
+
+ /**
+ * @deprecated Use {@link #VOCABULARY} instead.
+ */
+ @Deprecated
+ public static final String[] tokenNames;
+ static {
+ tokenNames = new String[_SYMBOLIC_NAMES.length];
+ for (int i = 0; i < tokenNames.length; i++) {
+ tokenNames[i] = VOCABULARY.getLiteralName(i);
+ if (tokenNames[i] == null) {
+ tokenNames[i] = VOCABULARY.getSymbolicName(i);
+ }
+
+ if (tokenNames[i] == null) {
+ tokenNames[i] = "";
+ }
+ }
+ }
+
+ @Override
+ @Deprecated
+ public String[] getTokenNames() {
+ return tokenNames;
+ }
+
+ @Override
+
+ public Vocabulary getVocabulary() {
+ return VOCABULARY;
+ }
+
+
+ public MathExprLexer(CharStream input) {
+ super(input);
+ _interp = new LexerATNSimulator(this,_ATN,_decisionToDFA,_sharedContextCache);
+ }
+
+ @Override
+ public String getGrammarFileName() { return "MathExpr.g4"; }
+
+ @Override
+ public String[] getRuleNames() { return ruleNames; }
+
+ @Override
+ public String getSerializedATN() { return _serializedATN; }
+
+ @Override
+ public String[] getChannelNames() { return channelNames; }
+
+ @Override
+ public String[] getModeNames() { return modeNames; }
+
+ @Override
+ public ATN getATN() { return _ATN; }
+
+ public static final String _serializedATN =
+ "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2g\u0387\b\1\4\2\t"+
+ "\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13"+
+ "\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22"+
+ "\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31\t\31"+
+ "\4\32\t\32\4\33\t\33\4\34\t\34\4\35\t\35\4\36\t\36\4\37\t\37\4 \t \4!"+
+ "\t!\4\"\t\"\4#\t#\4$\t$\4%\t%\4&\t&\4\'\t\'\4(\t(\4)\t)\4*\t*\4+\t+\4"+
+ ",\t,\4-\t-\4.\t.\4/\t/\4\60\t\60\4\61\t\61\4\62\t\62\4\63\t\63\4\64\t"+
+ "\64\4\65\t\65\4\66\t\66\4\67\t\67\48\t8\49\t9\4:\t:\4;\t;\4<\t<\4=\t="+
+ "\4>\t>\4?\t?\4@\t@\4A\tA\4B\tB\4C\tC\4D\tD\4E\tE\4F\tF\4G\tG\4H\tH\4I"+
+ "\tI\4J\tJ\4K\tK\4L\tL\4M\tM\4N\tN\4O\tO\4P\tP\4Q\tQ\4R\tR\4S\tS\4T\tT"+
+ "\4U\tU\4V\tV\4W\tW\4X\tX\4Y\tY\4Z\tZ\4[\t[\4\\\t\\\4]\t]\4^\t^\4_\t_\4"+
+ "`\t`\4a\ta\4b\tb\4c\tc\4d\td\4e\te\4f\tf\3\2\3\2\3\2\3\2\3\3\3\3\3\3\3"+
+ "\3\3\4\3\4\3\4\3\4\3\5\3\5\3\5\3\5\3\5\3\6\3\6\3\6\3\6\3\6\3\7\3\7\3\7"+
+ "\3\7\3\7\3\b\3\b\3\b\3\b\3\b\3\b\3\t\3\t\3\t\3\t\3\t\3\n\3\n\3\n\3\n\3"+
+ "\n\3\13\3\13\3\13\3\13\3\13\3\f\3\f\3\f\3\f\3\f\3\f\3\r\3\r\3\r\3\r\3"+
+ "\r\3\r\3\16\3\16\3\16\3\16\3\16\3\16\3\17\3\17\3\17\3\17\3\20\3\20\3\20"+
+ "\3\20\3\20\3\21\3\21\3\21\3\22\3\22\3\22\3\22\3\23\3\23\3\23\3\23\3\24"+
+ "\3\24\3\24\3\24\3\24\3\25\3\25\3\25\3\25\3\25\3\26\3\26\3\26\3\26\3\26"+
+ "\3\27\3\27\3\27\3\27\3\27\3\30\3\30\3\30\3\30\3\30\3\30\3\31\3\31\3\31"+
+ "\3\31\3\31\3\31\3\32\3\32\3\32\3\32\3\32\3\32\3\33\3\33\3\33\3\33\3\33"+
+ "\3\34\3\34\3\34\3\34\3\34\3\34\3\35\3\35\3\35\3\35\3\35\3\35\3\36\3\36"+
+ "\3\36\3\36\3\37\3\37\3\37\3\37\3\37\3 \3 \3 \3 \3 \3 \3!\3!\3!\3!\3\""+
+ "\3\"\3\"\3\"\3\"\3#\3#\3#\3#\3#\3#\3$\3$\3$\3$\3$\3$\3%\3%\3%\3%\3%\3"+
+ "%\3%\3%\3%\3%\3%\3%\3%\3%\3%\5%\u018e\n%\3&\3&\3&\3&\3&\3&\3&\3&\3&\3"+
+ "&\3&\3&\3&\5&\u019d\n&\3\'\3\'\3\'\3\'\3\'\3(\3(\3(\3(\3(\3)\3)\3)\3)"+
+ "\3)\3)\3)\3)\3)\3)\3)\3*\3*\3*\3*\3*\3*\3+\3+\3+\3+\3+\3,\3,\3,\3,\3,"+
+ "\3,\3,\3,\3,\3-\3-\3-\3-\3-\3.\3.\3.\3.\3.\3/\3/\3/\3/\3\60\3\60\3\60"+
+ "\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3\60"+
+ "\3\60\3\60\5\60\u01e9\n\60\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61"+
+ "\3\61\3\61\3\61\3\61\3\61\3\61\5\61\u01fa\n\61\3\62\3\62\3\62\3\62\3\62"+
+ "\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\5\63\u020c\n\63"+
+ "\3\64\3\64\3\64\3\64\3\64\3\64\3\64\3\64\3\64\3\64\3\64\5\64\u0219\n\64"+
+ "\3\65\3\65\3\65\3\65\3\65\3\65\3\66\3\66\3\66\3\66\3\66\3\67\3\67\3\67"+
+ "\3\67\3\67\38\38\38\38\38\39\39\39\39\3:\3:\3:\3:\3:\3;\3;\3;\3;\3<\3"+
+ "<\3<\3<\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\5=\u0250\n=\3>\3"+
+ ">\3>\3>\3>\3>\3>\3>\3>\3>\3>\3>\3>\3>\3>\5>\u0261\n>\3?\3?\3?\3?\3?\3"+
+ "?\3?\3?\3?\3@\3@\3@\3@\3A\3A\3A\3A\3A\3A\3A\3B\3B\3B\3B\3B\3B\3B\3B\3"+
+ "B\3B\3B\3B\3B\3B\3B\3B\3B\3B\3B\3B\3B\3B\3B\5B\u028e\nB\3C\3C\3C\3C\3"+
+ "C\3C\3C\3C\3C\3C\3C\3C\3C\3C\3C\3C\3C\3C\3C\3C\3C\3C\3C\5C\u02a7\nC\3"+
+ "D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\5D\u02bb\nD\3E\3"+
+ "E\3E\3E\3E\3E\3E\3E\3E\3E\3E\3E\3E\3E\3E\3E\3E\3E\3E\3E\3E\3E\3E\5E\u02d4"+
+ "\nE\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F"+
+ "\3F\5F\u02ed\nF\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G"+
+ "\3G\3G\3G\5G\u0304\nG\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H"+
+ "\3H\3H\3H\5H\u0319\nH\3I\3I\3I\3I\3I\3I\3I\3J\3J\3J\3J\3J\3K\3K\3K\3K"+
+ "\3L\3L\3L\3L\3L\3M\3M\3M\3M\3M\3M\3M\3N\3N\3O\3O\3P\3P\3Q\3Q\3R\3R\3S"+
+ "\3S\3T\3T\3T\3U\3U\3V\3V\3V\3W\3W\3X\3X\3X\3Y\3Y\3Z\3Z\3Z\3[\3[\3\\\3"+
+ "\\\3]\3]\3^\3^\3_\3_\3`\3`\3`\3a\3a\3b\3b\3c\3c\3c\3c\3c\5c\u036b\nc\3"+
+ "d\6d\u036e\nd\rd\16d\u036f\3d\3d\6d\u0374\nd\rd\16d\u0375\5d\u0378\nd"+
+ "\3e\3e\7e\u037c\ne\fe\16e\u037f\13e\3f\6f\u0382\nf\rf\16f\u0383\3f\3f"+
+ "\2\2g\3\3\5\4\7\5\t\6\13\7\r\b\17\t\21\n\23\13\25\f\27\r\31\16\33\17\35"+
+ "\20\37\21!\22#\23%\24\'\25)\26+\27-\30/\31\61\32\63\33\65\34\67\359\36"+
+ ";\37= ?!A\"C#E$G%I&K\'M(O)Q*S+U,W-Y.[/]\60_\61a\62c\63e\64g\65i\66k\67"+
+ "m8o9q:s;u{?}@\177A\u0081B\u0083C\u0085D\u0087E\u0089F\u008bG\u008d"+
+ "H\u008fI\u0091J\u0093K\u0095L\u0097M\u0099N\u009bO\u009dP\u009fQ\u00a1"+
+ "R\u00a3S\u00a5T\u00a7U\u00a9V\u00abW\u00adX\u00afY\u00b1Z\u00b3[\u00b5"+
+ "\\\u00b7]\u00b9^\u00bb_\u00bd`\u00bfa\u00c1b\u00c3c\u00c5d\u00c7e\u00c9"+
+ "f\u00cbg\3\2\7\4\2GGgg\3\2\62;\5\2C\\aac|\6\2\62;C\\aac|\5\2\13\f\17\17"+
+ "\"\"\2\u039e\2\3\3\2\2\2\2\5\3\2\2\2\2\7\3\2\2\2\2\t\3\2\2\2\2\13\3\2"+
+ "\2\2\2\r\3\2\2\2\2\17\3\2\2\2\2\21\3\2\2\2\2\23\3\2\2\2\2\25\3\2\2\2\2"+
+ "\27\3\2\2\2\2\31\3\2\2\2\2\33\3\2\2\2\2\35\3\2\2\2\2\37\3\2\2\2\2!\3\2"+
+ "\2\2\2#\3\2\2\2\2%\3\2\2\2\2\'\3\2\2\2\2)\3\2\2\2\2+\3\2\2\2\2-\3\2\2"+
+ "\2\2/\3\2\2\2\2\61\3\2\2\2\2\63\3\2\2\2\2\65\3\2\2\2\2\67\3\2\2\2\29\3"+
+ "\2\2\2\2;\3\2\2\2\2=\3\2\2\2\2?\3\2\2\2\2A\3\2\2\2\2C\3\2\2\2\2E\3\2\2"+
+ "\2\2G\3\2\2\2\2I\3\2\2\2\2K\3\2\2\2\2M\3\2\2\2\2O\3\2\2\2\2Q\3\2\2\2\2"+
+ "S\3\2\2\2\2U\3\2\2\2\2W\3\2\2\2\2Y\3\2\2\2\2[\3\2\2\2\2]\3\2\2\2\2_\3"+
+ "\2\2\2\2a\3\2\2\2\2c\3\2\2\2\2e\3\2\2\2\2g\3\2\2\2\2i\3\2\2\2\2k\3\2\2"+
+ "\2\2m\3\2\2\2\2o\3\2\2\2\2q\3\2\2\2\2s\3\2\2\2\2u\3\2\2\2\2w\3\2\2\2\2"+
+ "y\3\2\2\2\2{\3\2\2\2\2}\3\2\2\2\2\177\3\2\2\2\2\u0081\3\2\2\2\2\u0083"+
+ "\3\2\2\2\2\u0085\3\2\2\2\2\u0087\3\2\2\2\2\u0089\3\2\2\2\2\u008b\3\2\2"+
+ "\2\2\u008d\3\2\2\2\2\u008f\3\2\2\2\2\u0091\3\2\2\2\2\u0093\3\2\2\2\2\u0095"+
+ "\3\2\2\2\2\u0097\3\2\2\2\2\u0099\3\2\2\2\2\u009b\3\2\2\2\2\u009d\3\2\2"+
+ "\2\2\u009f\3\2\2\2\2\u00a1\3\2\2\2\2\u00a3\3\2\2\2\2\u00a5\3\2\2\2\2\u00a7"+
+ "\3\2\2\2\2\u00a9\3\2\2\2\2\u00ab\3\2\2\2\2\u00ad\3\2\2\2\2\u00af\3\2\2"+
+ "\2\2\u00b1\3\2\2\2\2\u00b3\3\2\2\2\2\u00b5\3\2\2\2\2\u00b7\3\2\2\2\2\u00b9"+
+ "\3\2\2\2\2\u00bb\3\2\2\2\2\u00bd\3\2\2\2\2\u00bf\3\2\2\2\2\u00c1\3\2\2"+
+ "\2\2\u00c3\3\2\2\2\2\u00c5\3\2\2\2\2\u00c7\3\2\2\2\2\u00c9\3\2\2\2\2\u00cb"+
+ "\3\2\2\2\3\u00cd\3\2\2\2\5\u00d1\3\2\2\2\7\u00d5\3\2\2\2\t\u00d9\3\2\2"+
+ "\2\13\u00de\3\2\2\2\r\u00e3\3\2\2\2\17\u00e8\3\2\2\2\21\u00ee\3\2\2\2"+
+ "\23\u00f3\3\2\2\2\25\u00f8\3\2\2\2\27\u00fd\3\2\2\2\31\u0103\3\2\2\2\33"+
+ "\u0109\3\2\2\2\35\u010f\3\2\2\2\37\u0113\3\2\2\2!\u0118\3\2\2\2#\u011b"+
+ "\3\2\2\2%\u011f\3\2\2\2\'\u0123\3\2\2\2)\u0128\3\2\2\2+\u012d\3\2\2\2"+
+ "-\u0132\3\2\2\2/\u0137\3\2\2\2\61\u013d\3\2\2\2\63\u0143\3\2\2\2\65\u0149"+
+ "\3\2\2\2\67\u014e\3\2\2\29\u0154\3\2\2\2;\u015a\3\2\2\2=\u015e\3\2\2\2"+
+ "?\u0163\3\2\2\2A\u0169\3\2\2\2C\u016d\3\2\2\2E\u0172\3\2\2\2G\u0178\3"+
+ "\2\2\2I\u018d\3\2\2\2K\u019c\3\2\2\2M\u019e\3\2\2\2O\u01a3\3\2\2\2Q\u01a8"+
+ "\3\2\2\2S\u01b3\3\2\2\2U\u01b9\3\2\2\2W\u01be\3\2\2\2Y\u01c7\3\2\2\2["+
+ "\u01cc\3\2\2\2]\u01d1\3\2\2\2_\u01e8\3\2\2\2a\u01f9\3\2\2\2c\u01fb\3\2"+
+ "\2\2e\u020b\3\2\2\2g\u0218\3\2\2\2i\u021a\3\2\2\2k\u0220\3\2\2\2m\u0225"+
+ "\3\2\2\2o\u022a\3\2\2\2q\u022f\3\2\2\2s\u0233\3\2\2\2u\u0238\3\2\2\2w"+
+ "\u023c\3\2\2\2y\u024f\3\2\2\2{\u0260\3\2\2\2}\u0262\3\2\2\2\177\u026b"+
+ "\3\2\2\2\u0081\u026f\3\2\2\2\u0083\u028d\3\2\2\2\u0085\u02a6\3\2\2\2\u0087"+
+ "\u02ba\3\2\2\2\u0089\u02d3\3\2\2\2\u008b\u02ec\3\2\2\2\u008d\u0303\3\2"+
+ "\2\2\u008f\u0318\3\2\2\2\u0091\u031a\3\2\2\2\u0093\u0321\3\2\2\2\u0095"+
+ "\u0326\3\2\2\2\u0097\u032a\3\2\2\2\u0099\u032f\3\2\2\2\u009b\u0336\3\2"+
+ "\2\2\u009d\u0338\3\2\2\2\u009f\u033a\3\2\2\2\u00a1\u033c\3\2\2\2\u00a3"+
+ "\u033e\3\2\2\2\u00a5\u0340\3\2\2\2\u00a7\u0342\3\2\2\2\u00a9\u0345\3\2"+
+ "\2\2\u00ab\u0347\3\2\2\2\u00ad\u034a\3\2\2\2\u00af\u034c\3\2\2\2\u00b1"+
+ "\u034f\3\2\2\2\u00b3\u0351\3\2\2\2\u00b5\u0354\3\2\2\2\u00b7\u0356\3\2"+
+ "\2\2\u00b9\u0358\3\2\2\2\u00bb\u035a\3\2\2\2\u00bd\u035c\3\2\2\2\u00bf"+
+ "\u035e\3\2\2\2\u00c1\u0361\3\2\2\2\u00c3\u0363\3\2\2\2\u00c5\u036a\3\2"+
+ "\2\2\u00c7\u036d\3\2\2\2\u00c9\u0379\3\2\2\2\u00cb\u0381\3\2\2\2\u00cd"+
+ "\u00ce\7u\2\2\u00ce\u00cf\7k\2\2\u00cf\u00d0\7p\2\2\u00d0\4\3\2\2\2\u00d1"+
+ "\u00d2\7e\2\2\u00d2\u00d3\7q\2\2\u00d3\u00d4\7u\2\2\u00d4\6\3\2\2\2\u00d5"+
+ "\u00d6\7v\2\2\u00d6\u00d7\7c\2\2\u00d7\u00d8\7p\2\2\u00d8\b\3\2\2\2\u00d9"+
+ "\u00da\7c\2\2\u00da\u00db\7u\2\2\u00db\u00dc\7k\2\2\u00dc\u00dd\7p\2\2"+
+ "\u00dd\n\3\2\2\2\u00de\u00df\7c\2\2\u00df\u00e0\7e\2\2\u00e0\u00e1\7q"+
+ "\2\2\u00e1\u00e2\7u\2\2\u00e2\f\3\2\2\2\u00e3\u00e4\7c\2\2\u00e4\u00e5"+
+ "\7v\2\2\u00e5\u00e6\7c\2\2\u00e6\u00e7\7p\2\2\u00e7\16\3\2\2\2\u00e8\u00e9"+
+ "\7c\2\2\u00e9\u00ea\7v\2\2\u00ea\u00eb\7c\2\2\u00eb\u00ec\7p\2\2\u00ec"+
+ "\u00ed\7\64\2\2\u00ed\20\3\2\2\2\u00ee\u00ef\7u\2\2\u00ef\u00f0\7k\2\2"+
+ "\u00f0\u00f1\7p\2\2\u00f1\u00f2\7j\2\2\u00f2\22\3\2\2\2\u00f3\u00f4\7"+
+ "e\2\2\u00f4\u00f5\7q\2\2\u00f5\u00f6\7u\2\2\u00f6\u00f7\7j\2\2\u00f7\24"+
+ "\3\2\2\2\u00f8\u00f9\7v\2\2\u00f9\u00fa\7c\2\2\u00fa\u00fb\7p\2\2\u00fb"+
+ "\u00fc\7j\2\2\u00fc\26\3\2\2\2\u00fd\u00fe\7c\2\2\u00fe\u00ff\7u\2\2\u00ff"+
+ "\u0100\7k\2\2\u0100\u0101\7p\2\2\u0101\u0102\7j\2\2\u0102\30\3\2\2\2\u0103"+
+ "\u0104\7c\2\2\u0104\u0105\7e\2\2\u0105\u0106\7q\2\2\u0106\u0107\7u\2\2"+
+ "\u0107\u0108\7j\2\2\u0108\32\3\2\2\2\u0109\u010a\7c\2\2\u010a\u010b\7"+
+ "v\2\2\u010b\u010c\7c\2\2\u010c\u010d\7p\2\2\u010d\u010e\7j\2\2\u010e\34"+
+ "\3\2\2\2\u010f\u0110\7c\2\2\u0110\u0111\7d\2\2\u0111\u0112\7u\2\2\u0112"+
+ "\36\3\2\2\2\u0113\u0114\7u\2\2\u0114\u0115\7s\2\2\u0115\u0116\7t\2\2\u0116"+
+ "\u0117\7v\2\2\u0117 \3\2\2\2\u0118\u0119\7n\2\2\u0119\u011a\7p\2\2\u011a"+
+ "\"\3\2\2\2\u011b\u011c\7n\2\2\u011c\u011d\7q\2\2\u011d\u011e\7i\2\2\u011e"+
+ "$\3\2\2\2\u011f\u0120\7g\2\2\u0120\u0121\7z\2\2\u0121\u0122\7r\2\2\u0122"+
+ "&\3\2\2\2\u0123\u0124\7u\2\2\u0124\u0125\7o\2\2\u0125\u0126\7k\2\2\u0126"+
+ "\u0127\7p\2\2\u0127(\3\2\2\2\u0128\u0129\7u\2\2\u0129\u012a\7o\2\2\u012a"+
+ "\u012b\7c\2\2\u012b\u012c\7z\2\2\u012c*\3\2\2\2\u012d\u012e\7v\2\2\u012e"+
+ "\u012f\7o\2\2\u012f\u0130\7k\2\2\u0130\u0131\7p\2\2\u0131,\3\2\2\2\u0132"+
+ "\u0133\7v\2\2\u0133\u0134\7o\2\2\u0134\u0135\7c\2\2\u0135\u0136\7z\2\2"+
+ "\u0136.\3\2\2\2\u0137\u0138\7v\2\2\u0138\u0139\7p\2\2\u0139\u013a\7q\2"+
+ "\2\u013a\u013b\7t\2\2\u013b\u013c\7o\2\2\u013c\60\3\2\2\2\u013d\u013e"+
+ "\7u\2\2\u013e\u013f\7p\2\2\u013f\u0140\7q\2\2\u0140\u0141\7t\2\2\u0141"+
+ "\u0142\7o\2\2\u0142\62\3\2\2\2\u0143\u0144\7h\2\2\u0144\u0145\7n\2\2\u0145"+
+ "\u0146\7q\2\2\u0146\u0147\7q\2\2\u0147\u0148\7t\2\2\u0148\64\3\2\2\2\u0149"+
+ "\u014a\7e\2\2\u014a\u014b\7g\2\2\u014b\u014c\7k\2\2\u014c\u014d\7n\2\2"+
+ "\u014d\66\3\2\2\2\u014e\u014f\7t\2\2\u014f\u0150\7q\2\2\u0150\u0151\7"+
+ "w\2\2\u0151\u0152\7p\2\2\u0152\u0153\7f\2\2\u01538\3\2\2\2\u0154\u0155"+
+ "\7i\2\2\u0155\u0156\7c\2\2\u0156\u0157\7o\2\2\u0157\u0158\7o\2\2\u0158"+
+ "\u0159\7c\2\2\u0159:\3\2\2\2\u015a\u015b\7r\2\2\u015b\u015c\7q\2\2\u015c"+
+ "\u015d\7y\2\2\u015d<\3\2\2\2\u015e\u015f\7u\2\2\u015f\u0160\7k\2\2\u0160"+
+ "\u0161\7i\2\2\u0161\u0162\7o\2\2\u0162>\3\2\2\2\u0163\u0164\7e\2\2\u0164"+
+ "\u0165\7n\2\2\u0165\u0166\7c\2\2\u0166\u0167\7o\2\2\u0167\u0168\7r\2\2"+
+ "\u0168@\3\2\2\2\u0169\u016a\7h\2\2\u016a\u016b\7h\2\2\u016b\u016c\7v\2"+
+ "\2\u016cB\3\2\2\2\u016d\u016e\7k\2\2\u016e\u016f\7h\2\2\u016f\u0170\7"+
+ "h\2\2\u0170\u0171\7v\2\2\u0171D\3\2\2\2\u0172\u0173\7c\2\2\u0173\u0174"+
+ "\7p\2\2\u0174\u0175\7i\2\2\u0175\u0176\7n\2\2\u0176\u0177\7g\2\2\u0177"+
+ "F\3\2\2\2\u0178\u0179\7r\2\2\u0179\u017a\7t\2\2\u017a\u017b\7k\2\2\u017b"+
+ "\u017c\7p\2\2\u017c\u017d\7v\2\2\u017dH\3\2\2\2\u017e\u017f\7r\2\2\u017f"+
+ "\u0180\7t\2\2\u0180\u0181\7k\2\2\u0181\u0182\7p\2\2\u0182\u0183\7v\2\2"+
+ "\u0183\u0184\7a\2\2\u0184\u0185\7u\2\2\u0185\u0186\7j\2\2\u0186\u0187"+
+ "\7c\2\2\u0187\u0188\7r\2\2\u0188\u018e\7g\2\2\u0189\u018a\7r\2\2\u018a"+
+ "\u018b\7u\2\2\u018b\u018c\7j\2\2\u018c\u018e\7r\2\2\u018d\u017e\3\2\2"+
+ "\2\u018d\u0189\3\2\2\2\u018eJ\3\2\2\2\u018f\u0190\7p\2\2\u0190\u0191\7"+
+ "x\2\2\u0191\u019d\7n\2\2\u0192\u0193\7p\2\2\u0193\u0194\7c\2\2\u0194\u0195"+
+ "\7p\2\2\u0195\u0196\7a\2\2\u0196\u0197\7v\2\2\u0197\u0198\7q\2\2\u0198"+
+ "\u0199\7a\2\2\u0199\u019a\7p\2\2\u019a\u019b\7w\2\2\u019b\u019d\7o\2\2"+
+ "\u019c\u018f\3\2\2\2\u019c\u0192\3\2\2\2\u019dL\3\2\2\2\u019e\u019f\7"+
+ "n\2\2\u019f\u01a0\7g\2\2\u01a0\u01a1\7t\2\2\u01a1\u01a2\7r\2\2\u01a2N"+
+ "\3\2\2\2\u01a3\u01a4\7u\2\2\u01a4\u01a5\7v\2\2\u01a5\u01a6\7g\2\2\u01a6"+
+ "\u01a7\7r\2\2\u01a7P\3\2\2\2\u01a8\u01a9\7u\2\2\u01a9\u01aa\7o\2\2\u01aa"+
+ "\u01ab\7q\2\2\u01ab\u01ac\7q\2\2\u01ac\u01ad\7v\2\2\u01ad\u01ae\7j\2\2"+
+ "\u01ae\u01af\7u\2\2\u01af\u01b0\7v\2\2\u01b0\u01b1\7g\2\2\u01b1\u01b2"+
+ "\7r\2\2\u01b2R\3\2\2\2\u01b3\u01b4\7h\2\2\u01b4\u01b5\7t\2\2\u01b5\u01b6"+
+ "\7c\2\2\u01b6\u01b7\7e\2\2\u01b7\u01b8\7v\2\2\u01b8T\3\2\2\2\u01b9\u01ba"+
+ "\7t\2\2\u01ba\u01bb\7g\2\2\u01bb\u01bc\7n\2\2\u01bc\u01bd\7w\2\2\u01bd"+
+ "V\3\2\2\2\u01be\u01bf\7u\2\2\u01bf\u01c0\7q\2\2\u01c0\u01c1\7h\2\2\u01c1"+
+ "\u01c2\7v\2\2\u01c2\u01c3\7r\2\2\u01c3\u01c4\7n\2\2\u01c4\u01c5\7w\2\2"+
+ "\u01c5\u01c6\7u\2\2\u01c6X\3\2\2\2\u01c7\u01c8\7i\2\2\u01c8\u01c9\7g\2"+
+ "\2\u01c9\u01ca\7n\2\2\u01ca\u01cb\7w\2\2\u01cbZ\3\2\2\2\u01cc\u01cd\7"+
+ "u\2\2\u01cd\u01ce\7k\2\2\u01ce\u01cf\7i\2\2\u01cf\u01d0\7p\2\2\u01d0\\"+
+ "\3\2\2\2\u01d1\u01d2\7o\2\2\u01d2\u01d3\7c\2\2\u01d3\u01d4\7r\2\2\u01d4"+
+ "^\3\2\2\2\u01d5\u01d6\7g\2\2\u01d6\u01d7\7|\2\2\u01d7\u01d8\7e\2\2\u01d8"+
+ "\u01d9\7q\2\2\u01d9\u01da\7p\2\2\u01da\u01db\7x\2\2\u01db\u01dc\7q\2\2"+
+ "\u01dc\u01dd\7n\2\2\u01dd\u01de\7w\2\2\u01de\u01df\7v\2\2\u01df\u01e0"+
+ "\7k\2\2\u01e0\u01e1\7q\2\2\u01e1\u01e9\7p\2\2\u01e2\u01e3\7g\2\2\u01e3"+
+ "\u01e4\7|\2\2\u01e4\u01e5\7e\2\2\u01e5\u01e6\7q\2\2\u01e6\u01e7\7p\2\2"+
+ "\u01e7\u01e9\7x\2\2\u01e8\u01d5\3\2\2\2\u01e8\u01e2\3\2\2\2\u01e9`\3\2"+
+ "\2\2\u01ea\u01eb\7e\2\2\u01eb\u01ec\7q\2\2\u01ec\u01ed\7p\2\2\u01ed\u01ee"+
+ "\7x\2\2\u01ee\u01ef\7q\2\2\u01ef\u01f0\7n\2\2\u01f0\u01f1\7w\2\2\u01f1"+
+ "\u01f2\7v\2\2\u01f2\u01f3\7k\2\2\u01f3\u01f4\7q\2\2\u01f4\u01fa\7p\2\2"+
+ "\u01f5\u01f6\7e\2\2\u01f6\u01f7\7q\2\2\u01f7\u01f8\7p\2\2\u01f8\u01fa"+
+ "\7x\2\2\u01f9\u01ea\3\2\2\2\u01f9\u01f5\3\2\2\2\u01fab\3\2\2\2\u01fb\u01fc"+
+ "\7u\2\2\u01fc\u01fd\7y\2\2\u01fd\u01fe\7c\2\2\u01fe\u01ff\7r\2\2\u01ff"+
+ "d\3\2\2\2\u0200\u0201\7r\2\2\u0201\u0202\7g\2\2\u0202\u0203\7t\2\2\u0203"+
+ "\u0204\7o\2\2\u0204\u0205\7w\2\2\u0205\u0206\7v\2\2\u0206\u020c\7g\2\2"+
+ "\u0207\u0208\7r\2\2\u0208\u0209\7g\2\2\u0209\u020a\7t\2\2\u020a\u020c"+
+ "\7o\2\2\u020b\u0200\3\2\2\2\u020b\u0207\3\2\2\2\u020cf\3\2\2\2\u020d\u020e"+
+ "\7t\2\2\u020e\u020f\7g\2\2\u020f\u0210\7u\2\2\u0210\u0211\7j\2\2\u0211"+
+ "\u0212\7c\2\2\u0212\u0213\7r\2\2\u0213\u0219\7g\2\2\u0214\u0215\7t\2\2"+
+ "\u0215\u0216\7u\2\2\u0216\u0217\7j\2\2\u0217\u0219\7r\2\2\u0218\u020d"+
+ "\3\2\2\2\u0218\u0214\3\2\2\2\u0219h\3\2\2\2\u021a\u021b\7t\2\2\u021b\u021c"+
+ "\7c\2\2\u021c\u021d\7p\2\2\u021d\u021e\7i\2\2\u021e\u021f\7g\2\2\u021f"+
+ "j\3\2\2\2\u0220\u0221\7v\2\2\u0221\u0222\7q\2\2\u0222\u0223\7r\2\2\u0223"+
+ "\u0224\7m\2\2\u0224l\3\2\2\2\u0225\u0226\7d\2\2\u0226\u0227\7q\2\2\u0227"+
+ "\u0228\7v\2\2\u0228\u0229\7m\2\2\u0229n\3\2\2\2\u022a\u022b\7r\2\2\u022b"+
+ "\u022c\7k\2\2\u022c\u022d\7p\2\2\u022d\u022e\7x\2\2\u022ep\3\2\2\2\u022f"+
+ "\u0230\7u\2\2\u0230\u0231\7w\2\2\u0231\u0232\7o\2\2\u0232r\3\2\2\2\u0233"+
+ "\u0234\7o\2\2\u0234\u0235\7g\2\2\u0235\u0236\7c\2\2\u0236\u0237\7p\2\2"+
+ "\u0237t\3\2\2\2\u0238\u0239\7u\2\2\u0239\u023a\7v\2\2\u023a\u023b\7f\2"+
+ "\2\u023bv\3\2\2\2\u023c\u023d\7x\2\2\u023d\u023e\7c\2\2\u023e\u023f\7"+
+ "t\2\2\u023fx\3\2\2\2\u0240\u0241\7s\2\2\u0241\u0242\7w\2\2\u0242\u0243"+
+ "\7c\2\2\u0243\u0244\7t\2\2\u0244\u0245\7v\2\2\u0245\u0246\7k\2\2\u0246"+
+ "\u0247\7n\2\2\u0247\u0250\7g\2\2\u0248\u0249\7s\2\2\u0249\u024a\7w\2\2"+
+ "\u024a\u024b\7c\2\2\u024b\u024c\7t\2\2\u024c\u024d\7v\2\2\u024d\u024e"+
+ "\7k\2\2\u024e\u0250\7n\2\2\u024f\u0240\3\2\2\2\u024f\u0248\3\2\2\2\u0250"+
+ "z\3\2\2\2\u0251\u0252\7r\2\2\u0252\u0253\7g\2\2\u0253\u0254\7t\2\2\u0254"+
+ "\u0255\7e\2\2\u0255\u0256\7g\2\2\u0256\u0257\7p\2\2\u0257\u0258\7v\2\2"+
+ "\u0258\u0259\7k\2\2\u0259\u025a\7n\2\2\u025a\u0261\7g\2\2\u025b\u025c"+
+ "\7r\2\2\u025c\u025d\7t\2\2\u025d\u025e\7e\2\2\u025e\u025f\7p\2\2\u025f"+
+ "\u0261\7v\2\2\u0260\u0251\3\2\2\2\u0260\u025b\3\2\2\2\u0261|\3\2\2\2\u0262"+
+ "\u0263\7s\2\2\u0263\u0264\7w\2\2\u0264\u0265\7c\2\2\u0265\u0266\7p\2\2"+
+ "\u0266\u0267\7v\2\2\u0267\u0268\7k\2\2\u0268\u0269\7n\2\2\u0269\u026a"+
+ "\7g\2\2\u026a~\3\2\2\2\u026b\u026c\7f\2\2\u026c\u026d\7q\2\2\u026d\u026e"+
+ "\7v\2\2\u026e\u0080\3\2\2\2\u026f\u0270\7o\2\2\u0270\u0271\7q\2\2\u0271"+
+ "\u0272\7o\2\2\u0272\u0273\7g\2\2\u0273\u0274\7p\2\2\u0274\u0275\7v\2\2"+
+ "\u0275\u0082\3\2\2\2\u0276\u0277\7p\2\2\u0277\u0278\7q\2\2\u0278\u0279"+
+ "\7k\2\2\u0279\u027a\7u\2\2\u027a\u028e\7g\2\2\u027b\u027c\7t\2\2\u027c"+
+ "\u027d\7c\2\2\u027d\u027e\7p\2\2\u027e\u027f\7f\2\2\u027f\u028e\7p\2\2"+
+ "\u0280\u0281\7t\2\2\u0281\u0282\7c\2\2\u0282\u0283\7p\2\2\u0283\u0284"+
+ "\7f\2\2\u0284\u0285\7q\2\2\u0285\u0286\7o\2\2\u0286\u0287\7a\2\2\u0287"+
+ "\u0288\7p\2\2\u0288\u0289\7q\2\2\u0289\u028a\7t\2\2\u028a\u028b\7o\2\2"+
+ "\u028b\u028c\7c\2\2\u028c\u028e\7n\2\2\u028d\u0276\3\2\2\2\u028d\u027b"+
+ "\3\2\2\2\u028d\u0280\3\2\2\2\u028e\u0084\3\2\2\2\u028f\u0290\7t\2\2\u0290"+
+ "\u0291\7c\2\2\u0291\u0292\7p\2\2\u0292\u02a7\7f\2\2\u0293\u0294\7t\2\2"+
+ "\u0294\u0295\7c\2\2\u0295\u0296\7p\2\2\u0296\u0297\7f\2\2\u0297\u02a7"+
+ "\7w\2\2\u0298\u0299\7t\2\2\u0299\u029a\7c\2\2\u029a\u029b\7p\2\2\u029b"+
+ "\u029c\7f\2\2\u029c\u029d\7q\2\2\u029d\u029e\7o\2\2\u029e\u029f\7a\2\2"+
+ "\u029f\u02a0\7w\2\2\u02a0\u02a1\7p\2\2\u02a1\u02a2\7k\2\2\u02a2\u02a3"+
+ "\7h\2\2\u02a3\u02a4\7q\2\2\u02a4\u02a5\7t\2\2\u02a5\u02a7\7o\2\2\u02a6"+
+ "\u028f\3\2\2\2\u02a6\u0293\3\2\2\2\u02a6\u0298\3\2\2\2\u02a7\u0086\3\2"+
+ "\2\2\u02a8\u02a9\7t\2\2\u02a9\u02aa\7c\2\2\u02aa\u02ab\7p\2\2\u02ab\u02ac"+
+ "\7f\2\2\u02ac\u02bb\7e\2\2\u02ad\u02ae\7t\2\2\u02ae\u02af\7c\2\2\u02af"+
+ "\u02b0\7p\2\2\u02b0\u02b1\7f\2\2\u02b1\u02b2\7q\2\2\u02b2\u02b3\7o\2\2"+
+ "\u02b3\u02b4\7a\2\2\u02b4\u02b5\7e\2\2\u02b5\u02b6\7c\2\2\u02b6\u02b7"+
+ "\7w\2\2\u02b7\u02b8\7e\2\2\u02b8\u02b9\7j\2\2\u02b9\u02bb\7{\2\2\u02ba"+
+ "\u02a8\3\2\2\2\u02ba\u02ad\3\2\2\2\u02bb\u0088\3\2\2\2\u02bc\u02bd\7t"+
+ "\2\2\u02bd\u02be\7c\2\2\u02be\u02bf\7p\2\2\u02bf\u02c0\7f\2\2\u02c0\u02d4"+
+ "\7g\2\2\u02c1\u02c2\7t\2\2\u02c2\u02c3\7c\2\2\u02c3\u02c4\7p\2\2\u02c4"+
+ "\u02c5\7f\2\2\u02c5\u02c6\7q\2\2\u02c6\u02c7\7o\2\2\u02c7\u02c8\7a\2\2"+
+ "\u02c8\u02c9\7g\2\2\u02c9\u02ca\7z\2\2\u02ca\u02cb\7r\2\2\u02cb\u02cc"+
+ "\7q\2\2\u02cc\u02cd\7p\2\2\u02cd\u02ce\7g\2\2\u02ce\u02cf\7p\2\2\u02cf"+
+ "\u02d0\7v\2\2\u02d0\u02d1\7k\2\2\u02d1\u02d2\7c\2\2\u02d2\u02d4\7n\2\2"+
+ "\u02d3\u02bc\3\2\2\2\u02d3\u02c1\3\2\2\2\u02d4\u008a\3\2\2\2\u02d5\u02d6"+
+ "\7t\2\2\u02d6\u02d7\7c\2\2\u02d7\u02d8\7p\2\2\u02d8\u02d9\7f\2\2\u02d9"+
+ "\u02da\7n\2\2\u02da\u02ed\7p\2\2\u02db\u02dc\7t\2\2\u02dc\u02dd\7c\2\2"+
+ "\u02dd\u02de\7p\2\2\u02de\u02df\7f\2\2\u02df\u02e0\7q\2\2\u02e0\u02e1"+
+ "\7o\2\2\u02e1\u02e2\7a\2\2\u02e2\u02e3\7n\2\2\u02e3\u02e4\7q\2\2\u02e4"+
+ "\u02e5\7i\2\2\u02e5\u02e6\7a\2\2\u02e6\u02e7\7p\2\2\u02e7\u02e8\7q\2\2"+
+ "\u02e8\u02e9\7t\2\2\u02e9\u02ea\7o\2\2\u02ea\u02eb\7c\2\2\u02eb\u02ed"+
+ "\7n\2\2\u02ec\u02d5\3\2\2\2\u02ec\u02db\3\2\2\2\u02ed\u008c\3\2\2\2\u02ee"+
+ "\u02ef\7t\2\2\u02ef\u02f0\7c\2\2\u02f0\u02f1\7p\2\2\u02f1\u02f2\7f\2\2"+
+ "\u02f2\u0304\7d\2\2\u02f3\u02f4\7t\2\2\u02f4\u02f5\7c\2\2\u02f5\u02f6"+
+ "\7p\2\2\u02f6\u02f7\7f\2\2\u02f7\u02f8\7q\2\2\u02f8\u02f9\7o\2\2\u02f9"+
+ "\u02fa\7a\2\2\u02fa\u02fb\7d\2\2\u02fb\u02fc\7g\2\2\u02fc\u02fd\7t\2\2"+
+ "\u02fd\u02fe\7p\2\2\u02fe\u02ff\7q\2\2\u02ff\u0300\7w\2\2\u0300\u0301"+
+ "\7n\2\2\u0301\u0302\7n\2\2\u0302\u0304\7k\2\2\u0303\u02ee\3\2\2\2\u0303"+
+ "\u02f3\3\2\2\2\u0304\u008e\3\2\2\2\u0305\u0306\7t\2\2\u0306\u0307\7c\2"+
+ "\2\u0307\u0308\7p\2\2\u0308\u0309\7f\2\2\u0309\u0319\7r\2\2\u030a\u030b"+
+ "\7t\2\2\u030b\u030c\7c\2\2\u030c\u030d\7p\2\2\u030d\u030e\7f\2\2\u030e"+
+ "\u030f\7q\2\2\u030f\u0310\7o\2\2\u0310\u0311\7a\2\2\u0311\u0312\7r\2\2"+
+ "\u0312\u0313\7q\2\2\u0313\u0314\7k\2\2\u0314\u0315\7u\2\2\u0315\u0316"+
+ "\7u\2\2\u0316\u0317\7q\2\2\u0317\u0319\7p\2\2\u0318\u0305\3\2\2\2\u0318"+
+ "\u030a\3\2\2\2\u0319\u0090\3\2\2\2\u031a\u031b\7e\2\2\u031b\u031c\7q\2"+
+ "\2\u031c\u031d\7u\2\2\u031d\u031e\7u\2\2\u031e\u031f\7k\2\2\u031f\u0320"+
+ "\7o\2\2\u0320\u0092\3\2\2\2\u0321\u0322\7h\2\2\u0322\u0323\7n\2\2\u0323"+
+ "\u0324\7k\2\2\u0324\u0325\7r\2\2\u0325\u0094\3\2\2\2\u0326\u0327\7e\2"+
+ "\2\u0327\u0328\7q\2\2\u0328\u0329\7x\2\2\u0329\u0096\3\2\2\2\u032a\u032b"+
+ "\7u\2\2\u032b\u032c\7q\2\2\u032c\u032d\7t\2\2\u032d\u032e\7v\2\2\u032e"+
+ "\u0098\3\2\2\2\u032f\u0330\7c\2\2\u0330\u0331\7r\2\2\u0331\u0332\7r\2"+
+ "\2\u0332\u0333\7g\2\2\u0333\u0334\7p\2\2\u0334\u0335\7f\2\2\u0335\u009a"+
+ "\3\2\2\2\u0336\u0337\7-\2\2\u0337\u009c\3\2\2\2\u0338\u0339\7/\2\2\u0339"+
+ "\u009e\3\2\2\2\u033a\u033b\7,\2\2\u033b\u00a0\3\2\2\2\u033c\u033d\7\61"+
+ "\2\2\u033d\u00a2\3\2\2\2\u033e\u033f\7\'\2\2\u033f\u00a4\3\2\2\2\u0340"+
+ "\u0341\7`\2\2\u0341\u00a6\3\2\2\2\u0342\u0343\7@\2\2\u0343\u0344\7?\2"+
+ "\2\u0344\u00a8\3\2\2\2\u0345\u0346\7@\2\2\u0346\u00aa\3\2\2\2\u0347\u0348"+
+ "\7>\2\2\u0348\u0349\7?\2\2\u0349\u00ac\3\2\2\2\u034a\u034b\7>\2\2\u034b"+
+ "\u00ae\3\2\2\2\u034c\u034d\7?\2\2\u034d\u034e\7?\2\2\u034e\u00b0\3\2\2"+
+ "\2\u034f\u0350\7?\2\2\u0350\u00b2\3\2\2\2\u0351\u0352\7#\2\2\u0352\u0353"+
+ "\7?\2\2\u0353\u00b4\3\2\2\2\u0354\u0355\7~\2\2\u0355\u00b6\3\2\2\2\u0356"+
+ "\u0357\7*\2\2\u0357\u00b8\3\2\2\2\u0358\u0359\7+\2\2\u0359\u00ba\3\2\2"+
+ "\2\u035a\u035b\7.\2\2\u035b\u00bc\3\2\2\2\u035c\u035d\7=\2\2\u035d\u00be"+
+ "\3\2\2\2\u035e\u035f\7/\2\2\u035f\u0360\7@\2\2\u0360\u00c0\3\2\2\2\u0361"+
+ "\u0362\7]\2\2\u0362\u00c2\3\2\2\2\u0363\u0364\7_\2\2\u0364\u00c4\3\2\2"+
+ "\2\u0365\u0366\7r\2\2\u0366\u036b\7k\2\2\u0367\u0368\7R\2\2\u0368\u036b"+
+ "\7K\2\2\u0369\u036b\t\2\2\2\u036a\u0365\3\2\2\2\u036a\u0367\3\2\2\2\u036a"+
+ "\u0369\3\2\2\2\u036b\u00c6\3\2\2\2\u036c\u036e\t\3\2\2\u036d\u036c\3\2"+
+ "\2\2\u036e\u036f\3\2\2\2\u036f\u036d\3\2\2\2\u036f\u0370\3\2\2\2\u0370"+
+ "\u0377\3\2\2\2\u0371\u0373\7\60\2\2\u0372\u0374\t\3\2\2\u0373\u0372\3"+
+ "\2\2\2\u0374\u0375\3\2\2\2\u0375\u0373\3\2\2\2\u0375\u0376\3\2\2\2\u0376"+
+ "\u0378\3\2\2\2\u0377\u0371\3\2\2\2\u0377\u0378\3\2\2\2\u0378\u00c8\3\2"+
+ "\2\2\u0379\u037d\t\4\2\2\u037a\u037c\t\5\2\2\u037b\u037a\3\2\2\2\u037c"+
+ "\u037f\3\2\2\2\u037d\u037b\3\2\2\2\u037d\u037e\3\2\2\2\u037e\u00ca\3\2"+
+ "\2\2\u037f\u037d\3\2\2\2\u0380\u0382\t\6\2\2\u0381\u0380\3\2\2\2\u0382"+
+ "\u0383\3\2\2\2\u0383\u0381\3\2\2\2\u0383\u0384\3\2\2\2\u0384\u0385\3\2"+
+ "\2\2\u0385\u0386\bf\2\2\u0386\u00cc\3\2\2\2\30\2\u018d\u019c\u01e8\u01f9"+
+ "\u020b\u0218\u024f\u0260\u028d\u02a6\u02ba\u02d3\u02ec\u0303\u0318\u036a"+
+ "\u036f\u0375\u0377\u037d\u0383\3\b\2\2";
+ public static final ATN _ATN =
+ new ATNDeserializer().deserialize(_serializedATN.toCharArray());
+ static {
+ _decisionToDFA = new DFA[_ATN.getNumberOfDecisions()];
+ for (int i = 0; i < _ATN.getNumberOfDecisions(); i++) {
+ _decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i);
+ }
+ }
+}
\ No newline at end of file
diff --git a/more_math/Parser/.antlr/MathExprLexer.tokens b/more_math/Parser/.antlr/MathExprLexer.tokens
new file mode 100644
index 0000000..659c1e4
--- /dev/null
+++ b/more_math/Parser/.antlr/MathExprLexer.tokens
@@ -0,0 +1,183 @@
+SIN=1
+COS=2
+TAN=3
+ASIN=4
+ACOS=5
+ATAN=6
+ATAN2=7
+SINH=8
+COSH=9
+TANH=10
+ASINH=11
+ACOSH=12
+ATANH=13
+ABS=14
+SQRT=15
+LN=16
+LOG=17
+EXP=18
+SMIN=19
+SMAX=20
+TMIN=21
+TMAX=22
+TNORM=23
+SNORM=24
+FLOOR=25
+CEIL=26
+ROUND=27
+GAMMA=28
+POWE=29
+SIGM=30
+CLAMP=31
+SFFT=32
+SIFFT=33
+ANGL=34
+PRNT=35
+PRINT_SHAPE=36
+NVL=37
+LERP=38
+STEP=39
+SMOOTHSTEP=40
+FRACT=41
+RELU=42
+SOFTPLUS=43
+GELU=44
+SIGN=45
+MAP=46
+EZCONV=47
+CONV=48
+SWAP=49
+PERM=50
+RESHAPE=51
+RANGE=52
+TOPK=53
+BOTK=54
+PINV=55
+SUM=56
+MEAN=57
+STD=58
+VAR=59
+QUARTILE=60
+PERCENTILE=61
+QUANTILE=62
+DOT=63
+MOMENT=64
+NOISE=65
+RAND=66
+CAUCHY=67
+EXPONENTIAL=68
+LOGNORMAL=69
+BERNOULLI=70
+POISSON=71
+COSSIM=72
+FLIP=73
+COV=74
+SORT=75
+APPEND=76
+PLUS=77
+MINUS=78
+MULT=79
+DIV=80
+MOD=81
+POW=82
+GE=83
+GT=84
+LE=85
+LT=86
+EQ=87
+EQUEALS=88
+NE=89
+PIPE=90
+LPAREN=91
+RPAREN=92
+COMMA=93
+SEMICOLON=94
+ARROW=95
+LBRACKET=96
+RBRACKET=97
+CONSTANT=98
+NUMBER=99
+VARIABLE=100
+WS=101
+'sin'=1
+'cos'=2
+'tan'=3
+'asin'=4
+'acos'=5
+'atan'=6
+'atan2'=7
+'sinh'=8
+'cosh'=9
+'tanh'=10
+'asinh'=11
+'acosh'=12
+'atanh'=13
+'abs'=14
+'sqrt'=15
+'ln'=16
+'log'=17
+'exp'=18
+'smin'=19
+'smax'=20
+'tmin'=21
+'tmax'=22
+'tnorm'=23
+'snorm'=24
+'floor'=25
+'ceil'=26
+'round'=27
+'gamma'=28
+'pow'=29
+'sigm'=30
+'clamp'=31
+'fft'=32
+'ifft'=33
+'angle'=34
+'print'=35
+'lerp'=38
+'step'=39
+'smoothstep'=40
+'fract'=41
+'relu'=42
+'softplus'=43
+'gelu'=44
+'sign'=45
+'map'=46
+'swap'=49
+'range'=52
+'topk'=53
+'botk'=54
+'pinv'=55
+'sum'=56
+'mean'=57
+'std'=58
+'var'=59
+'quantile'=62
+'dot'=63
+'moment'=64
+'cossim'=72
+'flip'=73
+'cov'=74
+'sort'=75
+'append'=76
+'+'=77
+'-'=78
+'*'=79
+'/'=80
+'%'=81
+'^'=82
+'>='=83
+'>'=84
+'<='=85
+'<'=86
+'=='=87
+'='=88
+'!='=89
+'|'=90
+'('=91
+')'=92
+','=93
+';'=94
+'->'=95
+'['=96
+']'=97
diff --git a/more_math/Parser/.antlr/MathExprListener.java b/more_math/Parser/.antlr/MathExprListener.java
new file mode 100644
index 0000000..03a1da8
--- /dev/null
+++ b/more_math/Parser/.antlr/MathExprListener.java
@@ -0,0 +1,1379 @@
+// Generated from d:\stability\Data\Packages\ComfyUI\custom_nodes\more_math\more_math\Parser\MathExpr.g4 by ANTLR 4.9.2
+import org.antlr.v4.runtime.tree.ParseTreeListener;
+
+/**
+ * This interface defines a complete listener for a parse tree produced by
+ * {@link MathExprParser}.
+ */
+public interface MathExprListener extends ParseTreeListener {
+ /**
+ * Enter a parse tree produced by {@link MathExprParser#start}.
+ * @param ctx the parse tree
+ */
+ void enterStart(MathExprParser.StartContext ctx);
+ /**
+ * Exit a parse tree produced by {@link MathExprParser#start}.
+ * @param ctx the parse tree
+ */
+ void exitStart(MathExprParser.StartContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code FunctionDef}
+ * labeled alternative in {@link MathExprParser#funcDef}.
+ * @param ctx the parse tree
+ */
+ void enterFunctionDef(MathExprParser.FunctionDefContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code FunctionDef}
+ * labeled alternative in {@link MathExprParser#funcDef}.
+ * @param ctx the parse tree
+ */
+ void exitFunctionDef(MathExprParser.FunctionDefContext ctx);
+ /**
+ * Enter a parse tree produced by {@link MathExprParser#varDef}.
+ * @param ctx the parse tree
+ */
+ void enterVarDef(MathExprParser.VarDefContext ctx);
+ /**
+ * Exit a parse tree produced by {@link MathExprParser#varDef}.
+ * @param ctx the parse tree
+ */
+ void exitVarDef(MathExprParser.VarDefContext ctx);
+ /**
+ * Enter a parse tree produced by {@link MathExprParser#paramList}.
+ * @param ctx the parse tree
+ */
+ void enterParamList(MathExprParser.ParamListContext ctx);
+ /**
+ * Exit a parse tree produced by {@link MathExprParser#paramList}.
+ * @param ctx the parse tree
+ */
+ void exitParamList(MathExprParser.ParamListContext ctx);
+ /**
+ * Enter a parse tree produced by {@link MathExprParser#expr}.
+ * @param ctx the parse tree
+ */
+ void enterExpr(MathExprParser.ExprContext ctx);
+ /**
+ * Exit a parse tree produced by {@link MathExprParser#expr}.
+ * @param ctx the parse tree
+ */
+ void exitExpr(MathExprParser.ExprContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code LtExp}
+ * labeled alternative in {@link MathExprParser#compExpr}.
+ * @param ctx the parse tree
+ */
+ void enterLtExp(MathExprParser.LtExpContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code LtExp}
+ * labeled alternative in {@link MathExprParser#compExpr}.
+ * @param ctx the parse tree
+ */
+ void exitLtExp(MathExprParser.LtExpContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code EqExp}
+ * labeled alternative in {@link MathExprParser#compExpr}.
+ * @param ctx the parse tree
+ */
+ void enterEqExp(MathExprParser.EqExpContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code EqExp}
+ * labeled alternative in {@link MathExprParser#compExpr}.
+ * @param ctx the parse tree
+ */
+ void exitEqExp(MathExprParser.EqExpContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code ToAdd}
+ * labeled alternative in {@link MathExprParser#compExpr}.
+ * @param ctx the parse tree
+ */
+ void enterToAdd(MathExprParser.ToAddContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code ToAdd}
+ * labeled alternative in {@link MathExprParser#compExpr}.
+ * @param ctx the parse tree
+ */
+ void exitToAdd(MathExprParser.ToAddContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code GeExp}
+ * labeled alternative in {@link MathExprParser#compExpr}.
+ * @param ctx the parse tree
+ */
+ void enterGeExp(MathExprParser.GeExpContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code GeExp}
+ * labeled alternative in {@link MathExprParser#compExpr}.
+ * @param ctx the parse tree
+ */
+ void exitGeExp(MathExprParser.GeExpContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code LeExp}
+ * labeled alternative in {@link MathExprParser#compExpr}.
+ * @param ctx the parse tree
+ */
+ void enterLeExp(MathExprParser.LeExpContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code LeExp}
+ * labeled alternative in {@link MathExprParser#compExpr}.
+ * @param ctx the parse tree
+ */
+ void exitLeExp(MathExprParser.LeExpContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code NeExp}
+ * labeled alternative in {@link MathExprParser#compExpr}.
+ * @param ctx the parse tree
+ */
+ void enterNeExp(MathExprParser.NeExpContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code NeExp}
+ * labeled alternative in {@link MathExprParser#compExpr}.
+ * @param ctx the parse tree
+ */
+ void exitNeExp(MathExprParser.NeExpContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code GtExp}
+ * labeled alternative in {@link MathExprParser#compExpr}.
+ * @param ctx the parse tree
+ */
+ void enterGtExp(MathExprParser.GtExpContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code GtExp}
+ * labeled alternative in {@link MathExprParser#compExpr}.
+ * @param ctx the parse tree
+ */
+ void exitGtExp(MathExprParser.GtExpContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code AddExp}
+ * labeled alternative in {@link MathExprParser#addExpr}.
+ * @param ctx the parse tree
+ */
+ void enterAddExp(MathExprParser.AddExpContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code AddExp}
+ * labeled alternative in {@link MathExprParser#addExpr}.
+ * @param ctx the parse tree
+ */
+ void exitAddExp(MathExprParser.AddExpContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code ToMul}
+ * labeled alternative in {@link MathExprParser#addExpr}.
+ * @param ctx the parse tree
+ */
+ void enterToMul(MathExprParser.ToMulContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code ToMul}
+ * labeled alternative in {@link MathExprParser#addExpr}.
+ * @param ctx the parse tree
+ */
+ void exitToMul(MathExprParser.ToMulContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code SubExp}
+ * labeled alternative in {@link MathExprParser#addExpr}.
+ * @param ctx the parse tree
+ */
+ void enterSubExp(MathExprParser.SubExpContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code SubExp}
+ * labeled alternative in {@link MathExprParser#addExpr}.
+ * @param ctx the parse tree
+ */
+ void exitSubExp(MathExprParser.SubExpContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code MulExp}
+ * labeled alternative in {@link MathExprParser#mulExpr}.
+ * @param ctx the parse tree
+ */
+ void enterMulExp(MathExprParser.MulExpContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code MulExp}
+ * labeled alternative in {@link MathExprParser#mulExpr}.
+ * @param ctx the parse tree
+ */
+ void exitMulExp(MathExprParser.MulExpContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code ModExp}
+ * labeled alternative in {@link MathExprParser#mulExpr}.
+ * @param ctx the parse tree
+ */
+ void enterModExp(MathExprParser.ModExpContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code ModExp}
+ * labeled alternative in {@link MathExprParser#mulExpr}.
+ * @param ctx the parse tree
+ */
+ void exitModExp(MathExprParser.ModExpContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code DivExp}
+ * labeled alternative in {@link MathExprParser#mulExpr}.
+ * @param ctx the parse tree
+ */
+ void enterDivExp(MathExprParser.DivExpContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code DivExp}
+ * labeled alternative in {@link MathExprParser#mulExpr}.
+ * @param ctx the parse tree
+ */
+ void exitDivExp(MathExprParser.DivExpContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code ToPow}
+ * labeled alternative in {@link MathExprParser#mulExpr}.
+ * @param ctx the parse tree
+ */
+ void enterToPow(MathExprParser.ToPowContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code ToPow}
+ * labeled alternative in {@link MathExprParser#mulExpr}.
+ * @param ctx the parse tree
+ */
+ void exitToPow(MathExprParser.ToPowContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code PowExp}
+ * labeled alternative in {@link MathExprParser#powExpr}.
+ * @param ctx the parse tree
+ */
+ void enterPowExp(MathExprParser.PowExpContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code PowExp}
+ * labeled alternative in {@link MathExprParser#powExpr}.
+ * @param ctx the parse tree
+ */
+ void exitPowExp(MathExprParser.PowExpContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code ToUnary}
+ * labeled alternative in {@link MathExprParser#powExpr}.
+ * @param ctx the parse tree
+ */
+ void enterToUnary(MathExprParser.ToUnaryContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code ToUnary}
+ * labeled alternative in {@link MathExprParser#powExpr}.
+ * @param ctx the parse tree
+ */
+ void exitToUnary(MathExprParser.ToUnaryContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code UnaryPlus}
+ * labeled alternative in {@link MathExprParser#unaryExpr}.
+ * @param ctx the parse tree
+ */
+ void enterUnaryPlus(MathExprParser.UnaryPlusContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code UnaryPlus}
+ * labeled alternative in {@link MathExprParser#unaryExpr}.
+ * @param ctx the parse tree
+ */
+ void exitUnaryPlus(MathExprParser.UnaryPlusContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code UnaryMinus}
+ * labeled alternative in {@link MathExprParser#unaryExpr}.
+ * @param ctx the parse tree
+ */
+ void enterUnaryMinus(MathExprParser.UnaryMinusContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code UnaryMinus}
+ * labeled alternative in {@link MathExprParser#unaryExpr}.
+ * @param ctx the parse tree
+ */
+ void exitUnaryMinus(MathExprParser.UnaryMinusContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code ToIndex}
+ * labeled alternative in {@link MathExprParser#unaryExpr}.
+ * @param ctx the parse tree
+ */
+ void enterToIndex(MathExprParser.ToIndexContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code ToIndex}
+ * labeled alternative in {@link MathExprParser#unaryExpr}.
+ * @param ctx the parse tree
+ */
+ void exitToIndex(MathExprParser.ToIndexContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code IndexExp}
+ * labeled alternative in {@link MathExprParser#indexExpr}.
+ * @param ctx the parse tree
+ */
+ void enterIndexExp(MathExprParser.IndexExpContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code IndexExp}
+ * labeled alternative in {@link MathExprParser#indexExpr}.
+ * @param ctx the parse tree
+ */
+ void exitIndexExp(MathExprParser.IndexExpContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code ToAtom}
+ * labeled alternative in {@link MathExprParser#indexExpr}.
+ * @param ctx the parse tree
+ */
+ void enterToAtom(MathExprParser.ToAtomContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code ToAtom}
+ * labeled alternative in {@link MathExprParser#indexExpr}.
+ * @param ctx the parse tree
+ */
+ void exitToAtom(MathExprParser.ToAtomContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code Func1Exp}
+ * labeled alternative in {@link MathExprParser#atom}.
+ * @param ctx the parse tree
+ */
+ void enterFunc1Exp(MathExprParser.Func1ExpContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code Func1Exp}
+ * labeled alternative in {@link MathExprParser#atom}.
+ * @param ctx the parse tree
+ */
+ void exitFunc1Exp(MathExprParser.Func1ExpContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code Func2Exp}
+ * labeled alternative in {@link MathExprParser#atom}.
+ * @param ctx the parse tree
+ */
+ void enterFunc2Exp(MathExprParser.Func2ExpContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code Func2Exp}
+ * labeled alternative in {@link MathExprParser#atom}.
+ * @param ctx the parse tree
+ */
+ void exitFunc2Exp(MathExprParser.Func2ExpContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code Func3Exp}
+ * labeled alternative in {@link MathExprParser#atom}.
+ * @param ctx the parse tree
+ */
+ void enterFunc3Exp(MathExprParser.Func3ExpContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code Func3Exp}
+ * labeled alternative in {@link MathExprParser#atom}.
+ * @param ctx the parse tree
+ */
+ void exitFunc3Exp(MathExprParser.Func3ExpContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code Func4Exp}
+ * labeled alternative in {@link MathExprParser#atom}.
+ * @param ctx the parse tree
+ */
+ void enterFunc4Exp(MathExprParser.Func4ExpContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code Func4Exp}
+ * labeled alternative in {@link MathExprParser#atom}.
+ * @param ctx the parse tree
+ */
+ void exitFunc4Exp(MathExprParser.Func4ExpContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code FuncNExp}
+ * labeled alternative in {@link MathExprParser#atom}.
+ * @param ctx the parse tree
+ */
+ void enterFuncNExp(MathExprParser.FuncNExpContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code FuncNExp}
+ * labeled alternative in {@link MathExprParser#atom}.
+ * @param ctx the parse tree
+ */
+ void exitFuncNExp(MathExprParser.FuncNExpContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code VariableExp}
+ * labeled alternative in {@link MathExprParser#atom}.
+ * @param ctx the parse tree
+ */
+ void enterVariableExp(MathExprParser.VariableExpContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code VariableExp}
+ * labeled alternative in {@link MathExprParser#atom}.
+ * @param ctx the parse tree
+ */
+ void exitVariableExp(MathExprParser.VariableExpContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code NumberExp}
+ * labeled alternative in {@link MathExprParser#atom}.
+ * @param ctx the parse tree
+ */
+ void enterNumberExp(MathExprParser.NumberExpContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code NumberExp}
+ * labeled alternative in {@link MathExprParser#atom}.
+ * @param ctx the parse tree
+ */
+ void exitNumberExp(MathExprParser.NumberExpContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code ConstantExp}
+ * labeled alternative in {@link MathExprParser#atom}.
+ * @param ctx the parse tree
+ */
+ void enterConstantExp(MathExprParser.ConstantExpContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code ConstantExp}
+ * labeled alternative in {@link MathExprParser#atom}.
+ * @param ctx the parse tree
+ */
+ void exitConstantExp(MathExprParser.ConstantExpContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code ParenExp}
+ * labeled alternative in {@link MathExprParser#atom}.
+ * @param ctx the parse tree
+ */
+ void enterParenExp(MathExprParser.ParenExpContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code ParenExp}
+ * labeled alternative in {@link MathExprParser#atom}.
+ * @param ctx the parse tree
+ */
+ void exitParenExp(MathExprParser.ParenExpContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code AbsExp}
+ * labeled alternative in {@link MathExprParser#atom}.
+ * @param ctx the parse tree
+ */
+ void enterAbsExp(MathExprParser.AbsExpContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code AbsExp}
+ * labeled alternative in {@link MathExprParser#atom}.
+ * @param ctx the parse tree
+ */
+ void exitAbsExp(MathExprParser.AbsExpContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code ListExp}
+ * labeled alternative in {@link MathExprParser#atom}.
+ * @param ctx the parse tree
+ */
+ void enterListExp(MathExprParser.ListExpContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code ListExp}
+ * labeled alternative in {@link MathExprParser#atom}.
+ * @param ctx the parse tree
+ */
+ void exitListExp(MathExprParser.ListExpContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code CallExp}
+ * labeled alternative in {@link MathExprParser#atom}.
+ * @param ctx the parse tree
+ */
+ void enterCallExp(MathExprParser.CallExpContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code CallExp}
+ * labeled alternative in {@link MathExprParser#atom}.
+ * @param ctx the parse tree
+ */
+ void exitCallExp(MathExprParser.CallExpContext ctx);
+ /**
+ * Enter a parse tree produced by {@link MathExprParser#exprList}.
+ * @param ctx the parse tree
+ */
+ void enterExprList(MathExprParser.ExprListContext ctx);
+ /**
+ * Exit a parse tree produced by {@link MathExprParser#exprList}.
+ * @param ctx the parse tree
+ */
+ void exitExprList(MathExprParser.ExprListContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code SinFunc}
+ * labeled alternative in {@link MathExprParser#func1}.
+ * @param ctx the parse tree
+ */
+ void enterSinFunc(MathExprParser.SinFuncContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code SinFunc}
+ * labeled alternative in {@link MathExprParser#func1}.
+ * @param ctx the parse tree
+ */
+ void exitSinFunc(MathExprParser.SinFuncContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code CosFunc}
+ * labeled alternative in {@link MathExprParser#func1}.
+ * @param ctx the parse tree
+ */
+ void enterCosFunc(MathExprParser.CosFuncContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code CosFunc}
+ * labeled alternative in {@link MathExprParser#func1}.
+ * @param ctx the parse tree
+ */
+ void exitCosFunc(MathExprParser.CosFuncContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code TanFunc}
+ * labeled alternative in {@link MathExprParser#func1}.
+ * @param ctx the parse tree
+ */
+ void enterTanFunc(MathExprParser.TanFuncContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code TanFunc}
+ * labeled alternative in {@link MathExprParser#func1}.
+ * @param ctx the parse tree
+ */
+ void exitTanFunc(MathExprParser.TanFuncContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code AsinFunc}
+ * labeled alternative in {@link MathExprParser#func1}.
+ * @param ctx the parse tree
+ */
+ void enterAsinFunc(MathExprParser.AsinFuncContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code AsinFunc}
+ * labeled alternative in {@link MathExprParser#func1}.
+ * @param ctx the parse tree
+ */
+ void exitAsinFunc(MathExprParser.AsinFuncContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code AcosFunc}
+ * labeled alternative in {@link MathExprParser#func1}.
+ * @param ctx the parse tree
+ */
+ void enterAcosFunc(MathExprParser.AcosFuncContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code AcosFunc}
+ * labeled alternative in {@link MathExprParser#func1}.
+ * @param ctx the parse tree
+ */
+ void exitAcosFunc(MathExprParser.AcosFuncContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code AtanFunc}
+ * labeled alternative in {@link MathExprParser#func1}.
+ * @param ctx the parse tree
+ */
+ void enterAtanFunc(MathExprParser.AtanFuncContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code AtanFunc}
+ * labeled alternative in {@link MathExprParser#func1}.
+ * @param ctx the parse tree
+ */
+ void exitAtanFunc(MathExprParser.AtanFuncContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code SinhFunc}
+ * labeled alternative in {@link MathExprParser#func1}.
+ * @param ctx the parse tree
+ */
+ void enterSinhFunc(MathExprParser.SinhFuncContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code SinhFunc}
+ * labeled alternative in {@link MathExprParser#func1}.
+ * @param ctx the parse tree
+ */
+ void exitSinhFunc(MathExprParser.SinhFuncContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code CoshFunc}
+ * labeled alternative in {@link MathExprParser#func1}.
+ * @param ctx the parse tree
+ */
+ void enterCoshFunc(MathExprParser.CoshFuncContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code CoshFunc}
+ * labeled alternative in {@link MathExprParser#func1}.
+ * @param ctx the parse tree
+ */
+ void exitCoshFunc(MathExprParser.CoshFuncContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code TanhFunc}
+ * labeled alternative in {@link MathExprParser#func1}.
+ * @param ctx the parse tree
+ */
+ void enterTanhFunc(MathExprParser.TanhFuncContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code TanhFunc}
+ * labeled alternative in {@link MathExprParser#func1}.
+ * @param ctx the parse tree
+ */
+ void exitTanhFunc(MathExprParser.TanhFuncContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code AsinhFunc}
+ * labeled alternative in {@link MathExprParser#func1}.
+ * @param ctx the parse tree
+ */
+ void enterAsinhFunc(MathExprParser.AsinhFuncContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code AsinhFunc}
+ * labeled alternative in {@link MathExprParser#func1}.
+ * @param ctx the parse tree
+ */
+ void exitAsinhFunc(MathExprParser.AsinhFuncContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code AcoshFunc}
+ * labeled alternative in {@link MathExprParser#func1}.
+ * @param ctx the parse tree
+ */
+ void enterAcoshFunc(MathExprParser.AcoshFuncContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code AcoshFunc}
+ * labeled alternative in {@link MathExprParser#func1}.
+ * @param ctx the parse tree
+ */
+ void exitAcoshFunc(MathExprParser.AcoshFuncContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code AtanhFunc}
+ * labeled alternative in {@link MathExprParser#func1}.
+ * @param ctx the parse tree
+ */
+ void enterAtanhFunc(MathExprParser.AtanhFuncContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code AtanhFunc}
+ * labeled alternative in {@link MathExprParser#func1}.
+ * @param ctx the parse tree
+ */
+ void exitAtanhFunc(MathExprParser.AtanhFuncContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code AbsFunc}
+ * labeled alternative in {@link MathExprParser#func1}.
+ * @param ctx the parse tree
+ */
+ void enterAbsFunc(MathExprParser.AbsFuncContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code AbsFunc}
+ * labeled alternative in {@link MathExprParser#func1}.
+ * @param ctx the parse tree
+ */
+ void exitAbsFunc(MathExprParser.AbsFuncContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code SqrtFunc}
+ * labeled alternative in {@link MathExprParser#func1}.
+ * @param ctx the parse tree
+ */
+ void enterSqrtFunc(MathExprParser.SqrtFuncContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code SqrtFunc}
+ * labeled alternative in {@link MathExprParser#func1}.
+ * @param ctx the parse tree
+ */
+ void exitSqrtFunc(MathExprParser.SqrtFuncContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code LnFunc}
+ * labeled alternative in {@link MathExprParser#func1}.
+ * @param ctx the parse tree
+ */
+ void enterLnFunc(MathExprParser.LnFuncContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code LnFunc}
+ * labeled alternative in {@link MathExprParser#func1}.
+ * @param ctx the parse tree
+ */
+ void exitLnFunc(MathExprParser.LnFuncContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code LogFunc}
+ * labeled alternative in {@link MathExprParser#func1}.
+ * @param ctx the parse tree
+ */
+ void enterLogFunc(MathExprParser.LogFuncContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code LogFunc}
+ * labeled alternative in {@link MathExprParser#func1}.
+ * @param ctx the parse tree
+ */
+ void exitLogFunc(MathExprParser.LogFuncContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code ExpFunc}
+ * labeled alternative in {@link MathExprParser#func1}.
+ * @param ctx the parse tree
+ */
+ void enterExpFunc(MathExprParser.ExpFuncContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code ExpFunc}
+ * labeled alternative in {@link MathExprParser#func1}.
+ * @param ctx the parse tree
+ */
+ void exitExpFunc(MathExprParser.ExpFuncContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code TNormFunc}
+ * labeled alternative in {@link MathExprParser#func1}.
+ * @param ctx the parse tree
+ */
+ void enterTNormFunc(MathExprParser.TNormFuncContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code TNormFunc}
+ * labeled alternative in {@link MathExprParser#func1}.
+ * @param ctx the parse tree
+ */
+ void exitTNormFunc(MathExprParser.TNormFuncContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code SNormFunc}
+ * labeled alternative in {@link MathExprParser#func1}.
+ * @param ctx the parse tree
+ */
+ void enterSNormFunc(MathExprParser.SNormFuncContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code SNormFunc}
+ * labeled alternative in {@link MathExprParser#func1}.
+ * @param ctx the parse tree
+ */
+ void exitSNormFunc(MathExprParser.SNormFuncContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code FloorFunc}
+ * labeled alternative in {@link MathExprParser#func1}.
+ * @param ctx the parse tree
+ */
+ void enterFloorFunc(MathExprParser.FloorFuncContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code FloorFunc}
+ * labeled alternative in {@link MathExprParser#func1}.
+ * @param ctx the parse tree
+ */
+ void exitFloorFunc(MathExprParser.FloorFuncContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code CeilFunc}
+ * labeled alternative in {@link MathExprParser#func1}.
+ * @param ctx the parse tree
+ */
+ void enterCeilFunc(MathExprParser.CeilFuncContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code CeilFunc}
+ * labeled alternative in {@link MathExprParser#func1}.
+ * @param ctx the parse tree
+ */
+ void exitCeilFunc(MathExprParser.CeilFuncContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code RoundFunc}
+ * labeled alternative in {@link MathExprParser#func1}.
+ * @param ctx the parse tree
+ */
+ void enterRoundFunc(MathExprParser.RoundFuncContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code RoundFunc}
+ * labeled alternative in {@link MathExprParser#func1}.
+ * @param ctx the parse tree
+ */
+ void exitRoundFunc(MathExprParser.RoundFuncContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code GammaFunc}
+ * labeled alternative in {@link MathExprParser#func1}.
+ * @param ctx the parse tree
+ */
+ void enterGammaFunc(MathExprParser.GammaFuncContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code GammaFunc}
+ * labeled alternative in {@link MathExprParser#func1}.
+ * @param ctx the parse tree
+ */
+ void exitGammaFunc(MathExprParser.GammaFuncContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code sigmoidFunc}
+ * labeled alternative in {@link MathExprParser#func1}.
+ * @param ctx the parse tree
+ */
+ void enterSigmoidFunc(MathExprParser.SigmoidFuncContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code sigmoidFunc}
+ * labeled alternative in {@link MathExprParser#func1}.
+ * @param ctx the parse tree
+ */
+ void exitSigmoidFunc(MathExprParser.SigmoidFuncContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code sfftFunc}
+ * labeled alternative in {@link MathExprParser#func1}.
+ * @param ctx the parse tree
+ */
+ void enterSfftFunc(MathExprParser.SfftFuncContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code sfftFunc}
+ * labeled alternative in {@link MathExprParser#func1}.
+ * @param ctx the parse tree
+ */
+ void exitSfftFunc(MathExprParser.SfftFuncContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code sifftFunc}
+ * labeled alternative in {@link MathExprParser#func1}.
+ * @param ctx the parse tree
+ */
+ void enterSifftFunc(MathExprParser.SifftFuncContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code sifftFunc}
+ * labeled alternative in {@link MathExprParser#func1}.
+ * @param ctx the parse tree
+ */
+ void exitSifftFunc(MathExprParser.SifftFuncContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code anglFunc}
+ * labeled alternative in {@link MathExprParser#func1}.
+ * @param ctx the parse tree
+ */
+ void enterAnglFunc(MathExprParser.AnglFuncContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code anglFunc}
+ * labeled alternative in {@link MathExprParser#func1}.
+ * @param ctx the parse tree
+ */
+ void exitAnglFunc(MathExprParser.AnglFuncContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code printFunc}
+ * labeled alternative in {@link MathExprParser#func1}.
+ * @param ctx the parse tree
+ */
+ void enterPrintFunc(MathExprParser.PrintFuncContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code printFunc}
+ * labeled alternative in {@link MathExprParser#func1}.
+ * @param ctx the parse tree
+ */
+ void exitPrintFunc(MathExprParser.PrintFuncContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code FractFunc}
+ * labeled alternative in {@link MathExprParser#func1}.
+ * @param ctx the parse tree
+ */
+ void enterFractFunc(MathExprParser.FractFuncContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code FractFunc}
+ * labeled alternative in {@link MathExprParser#func1}.
+ * @param ctx the parse tree
+ */
+ void exitFractFunc(MathExprParser.FractFuncContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code ReluFunc}
+ * labeled alternative in {@link MathExprParser#func1}.
+ * @param ctx the parse tree
+ */
+ void enterReluFunc(MathExprParser.ReluFuncContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code ReluFunc}
+ * labeled alternative in {@link MathExprParser#func1}.
+ * @param ctx the parse tree
+ */
+ void exitReluFunc(MathExprParser.ReluFuncContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code SoftplusFunc}
+ * labeled alternative in {@link MathExprParser#func1}.
+ * @param ctx the parse tree
+ */
+ void enterSoftplusFunc(MathExprParser.SoftplusFuncContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code SoftplusFunc}
+ * labeled alternative in {@link MathExprParser#func1}.
+ * @param ctx the parse tree
+ */
+ void exitSoftplusFunc(MathExprParser.SoftplusFuncContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code GeluFunc}
+ * labeled alternative in {@link MathExprParser#func1}.
+ * @param ctx the parse tree
+ */
+ void enterGeluFunc(MathExprParser.GeluFuncContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code GeluFunc}
+ * labeled alternative in {@link MathExprParser#func1}.
+ * @param ctx the parse tree
+ */
+ void exitGeluFunc(MathExprParser.GeluFuncContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code SignFunc}
+ * labeled alternative in {@link MathExprParser#func1}.
+ * @param ctx the parse tree
+ */
+ void enterSignFunc(MathExprParser.SignFuncContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code SignFunc}
+ * labeled alternative in {@link MathExprParser#func1}.
+ * @param ctx the parse tree
+ */
+ void exitSignFunc(MathExprParser.SignFuncContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code PrintShapeFunc}
+ * labeled alternative in {@link MathExprParser#func1}.
+ * @param ctx the parse tree
+ */
+ void enterPrintShapeFunc(MathExprParser.PrintShapeFuncContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code PrintShapeFunc}
+ * labeled alternative in {@link MathExprParser#func1}.
+ * @param ctx the parse tree
+ */
+ void exitPrintShapeFunc(MathExprParser.PrintShapeFuncContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code PinvFunc}
+ * labeled alternative in {@link MathExprParser#func1}.
+ * @param ctx the parse tree
+ */
+ void enterPinvFunc(MathExprParser.PinvFuncContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code PinvFunc}
+ * labeled alternative in {@link MathExprParser#func1}.
+ * @param ctx the parse tree
+ */
+ void exitPinvFunc(MathExprParser.PinvFuncContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code SumFunc}
+ * labeled alternative in {@link MathExprParser#func1}.
+ * @param ctx the parse tree
+ */
+ void enterSumFunc(MathExprParser.SumFuncContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code SumFunc}
+ * labeled alternative in {@link MathExprParser#func1}.
+ * @param ctx the parse tree
+ */
+ void exitSumFunc(MathExprParser.SumFuncContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code MeanFunc}
+ * labeled alternative in {@link MathExprParser#func1}.
+ * @param ctx the parse tree
+ */
+ void enterMeanFunc(MathExprParser.MeanFuncContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code MeanFunc}
+ * labeled alternative in {@link MathExprParser#func1}.
+ * @param ctx the parse tree
+ */
+ void exitMeanFunc(MathExprParser.MeanFuncContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code StdFunc}
+ * labeled alternative in {@link MathExprParser#func1}.
+ * @param ctx the parse tree
+ */
+ void enterStdFunc(MathExprParser.StdFuncContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code StdFunc}
+ * labeled alternative in {@link MathExprParser#func1}.
+ * @param ctx the parse tree
+ */
+ void exitStdFunc(MathExprParser.StdFuncContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code VarFunc}
+ * labeled alternative in {@link MathExprParser#func1}.
+ * @param ctx the parse tree
+ */
+ void enterVarFunc(MathExprParser.VarFuncContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code VarFunc}
+ * labeled alternative in {@link MathExprParser#func1}.
+ * @param ctx the parse tree
+ */
+ void exitVarFunc(MathExprParser.VarFuncContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code SortFunc}
+ * labeled alternative in {@link MathExprParser#func1}.
+ * @param ctx the parse tree
+ */
+ void enterSortFunc(MathExprParser.SortFuncContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code SortFunc}
+ * labeled alternative in {@link MathExprParser#func1}.
+ * @param ctx the parse tree
+ */
+ void exitSortFunc(MathExprParser.SortFuncContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code NoiseFunc}
+ * labeled alternative in {@link MathExprParser#func1}.
+ * @param ctx the parse tree
+ */
+ void enterNoiseFunc(MathExprParser.NoiseFuncContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code NoiseFunc}
+ * labeled alternative in {@link MathExprParser#func1}.
+ * @param ctx the parse tree
+ */
+ void exitNoiseFunc(MathExprParser.NoiseFuncContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code RandFunc}
+ * labeled alternative in {@link MathExprParser#func1}.
+ * @param ctx the parse tree
+ */
+ void enterRandFunc(MathExprParser.RandFuncContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code RandFunc}
+ * labeled alternative in {@link MathExprParser#func1}.
+ * @param ctx the parse tree
+ */
+ void exitRandFunc(MathExprParser.RandFuncContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code PowFunc}
+ * labeled alternative in {@link MathExprParser#func2}.
+ * @param ctx the parse tree
+ */
+ void enterPowFunc(MathExprParser.PowFuncContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code PowFunc}
+ * labeled alternative in {@link MathExprParser#func2}.
+ * @param ctx the parse tree
+ */
+ void exitPowFunc(MathExprParser.PowFuncContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code Atan2Func}
+ * labeled alternative in {@link MathExprParser#func2}.
+ * @param ctx the parse tree
+ */
+ void enterAtan2Func(MathExprParser.Atan2FuncContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code Atan2Func}
+ * labeled alternative in {@link MathExprParser#func2}.
+ * @param ctx the parse tree
+ */
+ void exitAtan2Func(MathExprParser.Atan2FuncContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code TMinFunc}
+ * labeled alternative in {@link MathExprParser#func2}.
+ * @param ctx the parse tree
+ */
+ void enterTMinFunc(MathExprParser.TMinFuncContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code TMinFunc}
+ * labeled alternative in {@link MathExprParser#func2}.
+ * @param ctx the parse tree
+ */
+ void exitTMinFunc(MathExprParser.TMinFuncContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code TMaxFunc}
+ * labeled alternative in {@link MathExprParser#func2}.
+ * @param ctx the parse tree
+ */
+ void enterTMaxFunc(MathExprParser.TMaxFuncContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code TMaxFunc}
+ * labeled alternative in {@link MathExprParser#func2}.
+ * @param ctx the parse tree
+ */
+ void exitTMaxFunc(MathExprParser.TMaxFuncContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code StepFunc}
+ * labeled alternative in {@link MathExprParser#func2}.
+ * @param ctx the parse tree
+ */
+ void enterStepFunc(MathExprParser.StepFuncContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code StepFunc}
+ * labeled alternative in {@link MathExprParser#func2}.
+ * @param ctx the parse tree
+ */
+ void exitStepFunc(MathExprParser.StepFuncContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code TopkFunc}
+ * labeled alternative in {@link MathExprParser#func2}.
+ * @param ctx the parse tree
+ */
+ void enterTopkFunc(MathExprParser.TopkFuncContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code TopkFunc}
+ * labeled alternative in {@link MathExprParser#func2}.
+ * @param ctx the parse tree
+ */
+ void exitTopkFunc(MathExprParser.TopkFuncContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code BotkFunc}
+ * labeled alternative in {@link MathExprParser#func2}.
+ * @param ctx the parse tree
+ */
+ void enterBotkFunc(MathExprParser.BotkFuncContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code BotkFunc}
+ * labeled alternative in {@link MathExprParser#func2}.
+ * @param ctx the parse tree
+ */
+ void exitBotkFunc(MathExprParser.BotkFuncContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code QuartileFunc}
+ * labeled alternative in {@link MathExprParser#func2}.
+ * @param ctx the parse tree
+ */
+ void enterQuartileFunc(MathExprParser.QuartileFuncContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code QuartileFunc}
+ * labeled alternative in {@link MathExprParser#func2}.
+ * @param ctx the parse tree
+ */
+ void exitQuartileFunc(MathExprParser.QuartileFuncContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code PercentileFunc}
+ * labeled alternative in {@link MathExprParser#func2}.
+ * @param ctx the parse tree
+ */
+ void enterPercentileFunc(MathExprParser.PercentileFuncContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code PercentileFunc}
+ * labeled alternative in {@link MathExprParser#func2}.
+ * @param ctx the parse tree
+ */
+ void exitPercentileFunc(MathExprParser.PercentileFuncContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code QuantileFunc}
+ * labeled alternative in {@link MathExprParser#func2}.
+ * @param ctx the parse tree
+ */
+ void enterQuantileFunc(MathExprParser.QuantileFuncContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code QuantileFunc}
+ * labeled alternative in {@link MathExprParser#func2}.
+ * @param ctx the parse tree
+ */
+ void exitQuantileFunc(MathExprParser.QuantileFuncContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code DotFunc}
+ * labeled alternative in {@link MathExprParser#func2}.
+ * @param ctx the parse tree
+ */
+ void enterDotFunc(MathExprParser.DotFuncContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code DotFunc}
+ * labeled alternative in {@link MathExprParser#func2}.
+ * @param ctx the parse tree
+ */
+ void exitDotFunc(MathExprParser.DotFuncContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code CossimFunc}
+ * labeled alternative in {@link MathExprParser#func2}.
+ * @param ctx the parse tree
+ */
+ void enterCossimFunc(MathExprParser.CossimFuncContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code CossimFunc}
+ * labeled alternative in {@link MathExprParser#func2}.
+ * @param ctx the parse tree
+ */
+ void exitCossimFunc(MathExprParser.CossimFuncContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code FlipFunc}
+ * labeled alternative in {@link MathExprParser#func2}.
+ * @param ctx the parse tree
+ */
+ void enterFlipFunc(MathExprParser.FlipFuncContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code FlipFunc}
+ * labeled alternative in {@link MathExprParser#func2}.
+ * @param ctx the parse tree
+ */
+ void exitFlipFunc(MathExprParser.FlipFuncContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code CovFunc}
+ * labeled alternative in {@link MathExprParser#func2}.
+ * @param ctx the parse tree
+ */
+ void enterCovFunc(MathExprParser.CovFuncContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code CovFunc}
+ * labeled alternative in {@link MathExprParser#func2}.
+ * @param ctx the parse tree
+ */
+ void exitCovFunc(MathExprParser.CovFuncContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code AppendFunc}
+ * labeled alternative in {@link MathExprParser#func2}.
+ * @param ctx the parse tree
+ */
+ void enterAppendFunc(MathExprParser.AppendFuncContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code AppendFunc}
+ * labeled alternative in {@link MathExprParser#func2}.
+ * @param ctx the parse tree
+ */
+ void exitAppendFunc(MathExprParser.AppendFuncContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code ExponentialFunc}
+ * labeled alternative in {@link MathExprParser#func2}.
+ * @param ctx the parse tree
+ */
+ void enterExponentialFunc(MathExprParser.ExponentialFuncContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code ExponentialFunc}
+ * labeled alternative in {@link MathExprParser#func2}.
+ * @param ctx the parse tree
+ */
+ void exitExponentialFunc(MathExprParser.ExponentialFuncContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code BernoulliFunc}
+ * labeled alternative in {@link MathExprParser#func2}.
+ * @param ctx the parse tree
+ */
+ void enterBernoulliFunc(MathExprParser.BernoulliFuncContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code BernoulliFunc}
+ * labeled alternative in {@link MathExprParser#func2}.
+ * @param ctx the parse tree
+ */
+ void exitBernoulliFunc(MathExprParser.BernoulliFuncContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code PoissonFunc}
+ * labeled alternative in {@link MathExprParser#func2}.
+ * @param ctx the parse tree
+ */
+ void enterPoissonFunc(MathExprParser.PoissonFuncContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code PoissonFunc}
+ * labeled alternative in {@link MathExprParser#func2}.
+ * @param ctx the parse tree
+ */
+ void exitPoissonFunc(MathExprParser.PoissonFuncContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code ClampFunc}
+ * labeled alternative in {@link MathExprParser#func3}.
+ * @param ctx the parse tree
+ */
+ void enterClampFunc(MathExprParser.ClampFuncContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code ClampFunc}
+ * labeled alternative in {@link MathExprParser#func3}.
+ * @param ctx the parse tree
+ */
+ void exitClampFunc(MathExprParser.ClampFuncContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code LerpFunc}
+ * labeled alternative in {@link MathExprParser#func3}.
+ * @param ctx the parse tree
+ */
+ void enterLerpFunc(MathExprParser.LerpFuncContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code LerpFunc}
+ * labeled alternative in {@link MathExprParser#func3}.
+ * @param ctx the parse tree
+ */
+ void exitLerpFunc(MathExprParser.LerpFuncContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code SmoothstepFunc}
+ * labeled alternative in {@link MathExprParser#func3}.
+ * @param ctx the parse tree
+ */
+ void enterSmoothstepFunc(MathExprParser.SmoothstepFuncContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code SmoothstepFunc}
+ * labeled alternative in {@link MathExprParser#func3}.
+ * @param ctx the parse tree
+ */
+ void exitSmoothstepFunc(MathExprParser.SmoothstepFuncContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code RangeFunc}
+ * labeled alternative in {@link MathExprParser#func3}.
+ * @param ctx the parse tree
+ */
+ void enterRangeFunc(MathExprParser.RangeFuncContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code RangeFunc}
+ * labeled alternative in {@link MathExprParser#func3}.
+ * @param ctx the parse tree
+ */
+ void exitRangeFunc(MathExprParser.RangeFuncContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code MomentFunc}
+ * labeled alternative in {@link MathExprParser#func3}.
+ * @param ctx the parse tree
+ */
+ void enterMomentFunc(MathExprParser.MomentFuncContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code MomentFunc}
+ * labeled alternative in {@link MathExprParser#func3}.
+ * @param ctx the parse tree
+ */
+ void exitMomentFunc(MathExprParser.MomentFuncContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code CauchyFunc}
+ * labeled alternative in {@link MathExprParser#func3}.
+ * @param ctx the parse tree
+ */
+ void enterCauchyFunc(MathExprParser.CauchyFuncContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code CauchyFunc}
+ * labeled alternative in {@link MathExprParser#func3}.
+ * @param ctx the parse tree
+ */
+ void exitCauchyFunc(MathExprParser.CauchyFuncContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code LogNormalFunc}
+ * labeled alternative in {@link MathExprParser#func3}.
+ * @param ctx the parse tree
+ */
+ void enterLogNormalFunc(MathExprParser.LogNormalFuncContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code LogNormalFunc}
+ * labeled alternative in {@link MathExprParser#func3}.
+ * @param ctx the parse tree
+ */
+ void exitLogNormalFunc(MathExprParser.LogNormalFuncContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code SwapFunc}
+ * labeled alternative in {@link MathExprParser#func4}.
+ * @param ctx the parse tree
+ */
+ void enterSwapFunc(MathExprParser.SwapFuncContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code SwapFunc}
+ * labeled alternative in {@link MathExprParser#func4}.
+ * @param ctx the parse tree
+ */
+ void exitSwapFunc(MathExprParser.SwapFuncContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code NvlFunc}
+ * labeled alternative in {@link MathExprParser#func4}.
+ * @param ctx the parse tree
+ */
+ void enterNvlFunc(MathExprParser.NvlFuncContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code NvlFunc}
+ * labeled alternative in {@link MathExprParser#func4}.
+ * @param ctx the parse tree
+ */
+ void exitNvlFunc(MathExprParser.NvlFuncContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code SMinFunc}
+ * labeled alternative in {@link MathExprParser#funcN}.
+ * @param ctx the parse tree
+ */
+ void enterSMinFunc(MathExprParser.SMinFuncContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code SMinFunc}
+ * labeled alternative in {@link MathExprParser#funcN}.
+ * @param ctx the parse tree
+ */
+ void exitSMinFunc(MathExprParser.SMinFuncContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code SMaxFunc}
+ * labeled alternative in {@link MathExprParser#funcN}.
+ * @param ctx the parse tree
+ */
+ void enterSMaxFunc(MathExprParser.SMaxFuncContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code SMaxFunc}
+ * labeled alternative in {@link MathExprParser#funcN}.
+ * @param ctx the parse tree
+ */
+ void exitSMaxFunc(MathExprParser.SMaxFuncContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code MapFunc}
+ * labeled alternative in {@link MathExprParser#funcN}.
+ * @param ctx the parse tree
+ */
+ void enterMapFunc(MathExprParser.MapFuncContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code MapFunc}
+ * labeled alternative in {@link MathExprParser#funcN}.
+ * @param ctx the parse tree
+ */
+ void exitMapFunc(MathExprParser.MapFuncContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code EzConvFunc}
+ * labeled alternative in {@link MathExprParser#funcN}.
+ * @param ctx the parse tree
+ */
+ void enterEzConvFunc(MathExprParser.EzConvFuncContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code EzConvFunc}
+ * labeled alternative in {@link MathExprParser#funcN}.
+ * @param ctx the parse tree
+ */
+ void exitEzConvFunc(MathExprParser.EzConvFuncContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code ConvFunc}
+ * labeled alternative in {@link MathExprParser#funcN}.
+ * @param ctx the parse tree
+ */
+ void enterConvFunc(MathExprParser.ConvFuncContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code ConvFunc}
+ * labeled alternative in {@link MathExprParser#funcN}.
+ * @param ctx the parse tree
+ */
+ void exitConvFunc(MathExprParser.ConvFuncContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code PermuteFunc}
+ * labeled alternative in {@link MathExprParser#funcN}.
+ * @param ctx the parse tree
+ */
+ void enterPermuteFunc(MathExprParser.PermuteFuncContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code PermuteFunc}
+ * labeled alternative in {@link MathExprParser#funcN}.
+ * @param ctx the parse tree
+ */
+ void exitPermuteFunc(MathExprParser.PermuteFuncContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code ReshapeFunc}
+ * labeled alternative in {@link MathExprParser#funcN}.
+ * @param ctx the parse tree
+ */
+ void enterReshapeFunc(MathExprParser.ReshapeFuncContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code ReshapeFunc}
+ * labeled alternative in {@link MathExprParser#funcN}.
+ * @param ctx the parse tree
+ */
+ void exitReshapeFunc(MathExprParser.ReshapeFuncContext ctx);
+}
\ No newline at end of file
diff --git a/more_math/Parser/.antlr/MathExprParser.java b/more_math/Parser/.antlr/MathExprParser.java
new file mode 100644
index 0000000..19b7f40
--- /dev/null
+++ b/more_math/Parser/.antlr/MathExprParser.java
@@ -0,0 +1,5127 @@
+// Generated from d:\stability\Data\Packages\ComfyUI\custom_nodes\more_math\more_math\Parser\MathExpr.g4 by ANTLR 4.9.2
+import org.antlr.v4.runtime.atn.*;
+import org.antlr.v4.runtime.dfa.DFA;
+import org.antlr.v4.runtime.*;
+import org.antlr.v4.runtime.misc.*;
+import org.antlr.v4.runtime.tree.*;
+import java.util.List;
+import java.util.Iterator;
+import java.util.ArrayList;
+
+@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"})
+public class MathExprParser extends Parser {
+ static { RuntimeMetaData.checkVersion("4.9.2", RuntimeMetaData.VERSION); }
+
+ protected static final DFA[] _decisionToDFA;
+ protected static final PredictionContextCache _sharedContextCache =
+ new PredictionContextCache();
+ public static final int
+ SIN=1, COS=2, TAN=3, ASIN=4, ACOS=5, ATAN=6, ATAN2=7, SINH=8, COSH=9,
+ TANH=10, ASINH=11, ACOSH=12, ATANH=13, ABS=14, SQRT=15, LN=16, LOG=17,
+ EXP=18, SMIN=19, SMAX=20, TMIN=21, TMAX=22, TNORM=23, SNORM=24, FLOOR=25,
+ CEIL=26, ROUND=27, GAMMA=28, POWE=29, SIGM=30, CLAMP=31, SFFT=32, SIFFT=33,
+ ANGL=34, PRNT=35, PRINT_SHAPE=36, NVL=37, LERP=38, STEP=39, SMOOTHSTEP=40,
+ FRACT=41, RELU=42, SOFTPLUS=43, GELU=44, SIGN=45, MAP=46, EZCONV=47, CONV=48,
+ SWAP=49, PERM=50, RESHAPE=51, RANGE=52, TOPK=53, BOTK=54, PINV=55, SUM=56,
+ MEAN=57, STD=58, VAR=59, QUARTILE=60, PERCENTILE=61, QUANTILE=62, DOT=63,
+ MOMENT=64, NOISE=65, RAND=66, CAUCHY=67, EXPONENTIAL=68, LOGNORMAL=69,
+ BERNOULLI=70, POISSON=71, COSSIM=72, FLIP=73, COV=74, SORT=75, APPEND=76,
+ PLUS=77, MINUS=78, MULT=79, DIV=80, MOD=81, POW=82, GE=83, GT=84, LE=85,
+ LT=86, EQ=87, EQUEALS=88, NE=89, PIPE=90, LPAREN=91, RPAREN=92, COMMA=93,
+ SEMICOLON=94, ARROW=95, LBRACKET=96, RBRACKET=97, CONSTANT=98, NUMBER=99,
+ VARIABLE=100, WS=101;
+ public static final int
+ RULE_start = 0, RULE_funcDef = 1, RULE_varDef = 2, RULE_paramList = 3,
+ RULE_expr = 4, RULE_compExpr = 5, RULE_addExpr = 6, RULE_mulExpr = 7,
+ RULE_powExpr = 8, RULE_unaryExpr = 9, RULE_indexExpr = 10, RULE_atom = 11,
+ RULE_exprList = 12, RULE_func1 = 13, RULE_func2 = 14, RULE_func3 = 15,
+ RULE_func4 = 16, RULE_funcN = 17;
+ private static String[] makeRuleNames() {
+ return new String[] {
+ "start", "funcDef", "varDef", "paramList", "expr", "compExpr", "addExpr",
+ "mulExpr", "powExpr", "unaryExpr", "indexExpr", "atom", "exprList", "func1",
+ "func2", "func3", "func4", "funcN"
+ };
+ }
+ public static final String[] ruleNames = makeRuleNames();
+
+ private static String[] makeLiteralNames() {
+ return new String[] {
+ null, "'sin'", "'cos'", "'tan'", "'asin'", "'acos'", "'atan'", "'atan2'",
+ "'sinh'", "'cosh'", "'tanh'", "'asinh'", "'acosh'", "'atanh'", "'abs'",
+ "'sqrt'", "'ln'", "'log'", "'exp'", "'smin'", "'smax'", "'tmin'", "'tmax'",
+ "'tnorm'", "'snorm'", "'floor'", "'ceil'", "'round'", "'gamma'", "'pow'",
+ "'sigm'", "'clamp'", "'fft'", "'ifft'", "'angle'", "'print'", null, null,
+ "'lerp'", "'step'", "'smoothstep'", "'fract'", "'relu'", "'softplus'",
+ "'gelu'", "'sign'", "'map'", null, null, "'swap'", null, null, "'range'",
+ "'topk'", "'botk'", "'pinv'", "'sum'", "'mean'", "'std'", "'var'", null,
+ null, "'quantile'", "'dot'", "'moment'", null, null, null, null, null,
+ null, null, "'cossim'", "'flip'", "'cov'", "'sort'", "'append'", "'+'",
+ "'-'", "'*'", "'/'", "'%'", "'^'", "'>='", "'>'", "'<='", "'<'", "'=='",
+ "'='", "'!='", "'|'", "'('", "')'", "','", "';'", "'->'", "'['", "']'"
+ };
+ }
+ private static final String[] _LITERAL_NAMES = makeLiteralNames();
+ private static String[] makeSymbolicNames() {
+ return new String[] {
+ null, "SIN", "COS", "TAN", "ASIN", "ACOS", "ATAN", "ATAN2", "SINH", "COSH",
+ "TANH", "ASINH", "ACOSH", "ATANH", "ABS", "SQRT", "LN", "LOG", "EXP",
+ "SMIN", "SMAX", "TMIN", "TMAX", "TNORM", "SNORM", "FLOOR", "CEIL", "ROUND",
+ "GAMMA", "POWE", "SIGM", "CLAMP", "SFFT", "SIFFT", "ANGL", "PRNT", "PRINT_SHAPE",
+ "NVL", "LERP", "STEP", "SMOOTHSTEP", "FRACT", "RELU", "SOFTPLUS", "GELU",
+ "SIGN", "MAP", "EZCONV", "CONV", "SWAP", "PERM", "RESHAPE", "RANGE",
+ "TOPK", "BOTK", "PINV", "SUM", "MEAN", "STD", "VAR", "QUARTILE", "PERCENTILE",
+ "QUANTILE", "DOT", "MOMENT", "NOISE", "RAND", "CAUCHY", "EXPONENTIAL",
+ "LOGNORMAL", "BERNOULLI", "POISSON", "COSSIM", "FLIP", "COV", "SORT",
+ "APPEND", "PLUS", "MINUS", "MULT", "DIV", "MOD", "POW", "GE", "GT", "LE",
+ "LT", "EQ", "EQUEALS", "NE", "PIPE", "LPAREN", "RPAREN", "COMMA", "SEMICOLON",
+ "ARROW", "LBRACKET", "RBRACKET", "CONSTANT", "NUMBER", "VARIABLE", "WS"
+ };
+ }
+ private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames();
+ public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES);
+
+ /**
+ * @deprecated Use {@link #VOCABULARY} instead.
+ */
+ @Deprecated
+ public static final String[] tokenNames;
+ static {
+ tokenNames = new String[_SYMBOLIC_NAMES.length];
+ for (int i = 0; i < tokenNames.length; i++) {
+ tokenNames[i] = VOCABULARY.getLiteralName(i);
+ if (tokenNames[i] == null) {
+ tokenNames[i] = VOCABULARY.getSymbolicName(i);
+ }
+
+ if (tokenNames[i] == null) {
+ tokenNames[i] = "";
+ }
+ }
+ }
+
+ @Override
+ @Deprecated
+ public String[] getTokenNames() {
+ return tokenNames;
+ }
+
+ @Override
+
+ public Vocabulary getVocabulary() {
+ return VOCABULARY;
+ }
+
+ @Override
+ public String getGrammarFileName() { return "MathExpr.g4"; }
+
+ @Override
+ public String[] getRuleNames() { return ruleNames; }
+
+ @Override
+ public String getSerializedATN() { return _serializedATN; }
+
+ @Override
+ public ATN getATN() { return _ATN; }
+
+ public MathExprParser(TokenStream input) {
+ super(input);
+ _interp = new ParserATNSimulator(this,_ATN,_decisionToDFA,_sharedContextCache);
+ }
+
+ public static class StartContext extends ParserRuleContext {
+ public ExprContext expr() {
+ return getRuleContext(ExprContext.class,0);
+ }
+ public TerminalNode EOF() { return getToken(MathExprParser.EOF, 0); }
+ public List funcDef() {
+ return getRuleContexts(FuncDefContext.class);
+ }
+ public FuncDefContext funcDef(int i) {
+ return getRuleContext(FuncDefContext.class,i);
+ }
+ public List varDef() {
+ return getRuleContexts(VarDefContext.class);
+ }
+ public VarDefContext varDef(int i) {
+ return getRuleContext(VarDefContext.class,i);
+ }
+ public StartContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_start; }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterStart(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitStart(this);
+ }
+ }
+
+ public final StartContext start() throws RecognitionException {
+ StartContext _localctx = new StartContext(_ctx, getState());
+ enterRule(_localctx, 0, RULE_start);
+ try {
+ int _alt;
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(39);
+ _errHandler.sync(this);
+ _alt = getInterpreter().adaptivePredict(_input,0,_ctx);
+ while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
+ if ( _alt==1 ) {
+ {
+ {
+ setState(36);
+ funcDef();
+ }
+ }
+ }
+ setState(41);
+ _errHandler.sync(this);
+ _alt = getInterpreter().adaptivePredict(_input,0,_ctx);
+ }
+ setState(45);
+ _errHandler.sync(this);
+ _alt = getInterpreter().adaptivePredict(_input,1,_ctx);
+ while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
+ if ( _alt==1 ) {
+ {
+ {
+ setState(42);
+ varDef();
+ }
+ }
+ }
+ setState(47);
+ _errHandler.sync(this);
+ _alt = getInterpreter().adaptivePredict(_input,1,_ctx);
+ }
+ setState(48);
+ expr();
+ setState(49);
+ match(EOF);
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static class FuncDefContext extends ParserRuleContext {
+ public FuncDefContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_funcDef; }
+
+ public FuncDefContext() { }
+ public void copyFrom(FuncDefContext ctx) {
+ super.copyFrom(ctx);
+ }
+ }
+ public static class FunctionDefContext extends FuncDefContext {
+ public TerminalNode VARIABLE() { return getToken(MathExprParser.VARIABLE, 0); }
+ public TerminalNode LPAREN() { return getToken(MathExprParser.LPAREN, 0); }
+ public TerminalNode RPAREN() { return getToken(MathExprParser.RPAREN, 0); }
+ public TerminalNode ARROW() { return getToken(MathExprParser.ARROW, 0); }
+ public ExprContext expr() {
+ return getRuleContext(ExprContext.class,0);
+ }
+ public TerminalNode SEMICOLON() { return getToken(MathExprParser.SEMICOLON, 0); }
+ public ParamListContext paramList() {
+ return getRuleContext(ParamListContext.class,0);
+ }
+ public FunctionDefContext(FuncDefContext ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterFunctionDef(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitFunctionDef(this);
+ }
+ }
+
+ public final FuncDefContext funcDef() throws RecognitionException {
+ FuncDefContext _localctx = new FuncDefContext(_ctx, getState());
+ enterRule(_localctx, 2, RULE_funcDef);
+ int _la;
+ try {
+ _localctx = new FunctionDefContext(_localctx);
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(51);
+ match(VARIABLE);
+ setState(52);
+ match(LPAREN);
+ setState(54);
+ _errHandler.sync(this);
+ _la = _input.LA(1);
+ if (_la==VARIABLE) {
+ {
+ setState(53);
+ paramList();
+ }
+ }
+
+ setState(56);
+ match(RPAREN);
+ setState(57);
+ match(ARROW);
+ setState(58);
+ expr();
+ setState(59);
+ match(SEMICOLON);
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static class VarDefContext extends ParserRuleContext {
+ public TerminalNode VARIABLE() { return getToken(MathExprParser.VARIABLE, 0); }
+ public TerminalNode EQUEALS() { return getToken(MathExprParser.EQUEALS, 0); }
+ public ExprContext expr() {
+ return getRuleContext(ExprContext.class,0);
+ }
+ public TerminalNode SEMICOLON() { return getToken(MathExprParser.SEMICOLON, 0); }
+ public VarDefContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_varDef; }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterVarDef(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitVarDef(this);
+ }
+ }
+
+ public final VarDefContext varDef() throws RecognitionException {
+ VarDefContext _localctx = new VarDefContext(_ctx, getState());
+ enterRule(_localctx, 4, RULE_varDef);
+ try {
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(61);
+ match(VARIABLE);
+ setState(62);
+ match(EQUEALS);
+ setState(63);
+ expr();
+ setState(64);
+ match(SEMICOLON);
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static class ParamListContext extends ParserRuleContext {
+ public List VARIABLE() { return getTokens(MathExprParser.VARIABLE); }
+ public TerminalNode VARIABLE(int i) {
+ return getToken(MathExprParser.VARIABLE, i);
+ }
+ public List COMMA() { return getTokens(MathExprParser.COMMA); }
+ public TerminalNode COMMA(int i) {
+ return getToken(MathExprParser.COMMA, i);
+ }
+ public ParamListContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_paramList; }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterParamList(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitParamList(this);
+ }
+ }
+
+ public final ParamListContext paramList() throws RecognitionException {
+ ParamListContext _localctx = new ParamListContext(_ctx, getState());
+ enterRule(_localctx, 6, RULE_paramList);
+ int _la;
+ try {
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(66);
+ match(VARIABLE);
+ setState(71);
+ _errHandler.sync(this);
+ _la = _input.LA(1);
+ while (_la==COMMA) {
+ {
+ {
+ setState(67);
+ match(COMMA);
+ setState(68);
+ match(VARIABLE);
+ }
+ }
+ setState(73);
+ _errHandler.sync(this);
+ _la = _input.LA(1);
+ }
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static class ExprContext extends ParserRuleContext {
+ public AtomContext atom() {
+ return getRuleContext(AtomContext.class,0);
+ }
+ public CompExprContext compExpr() {
+ return getRuleContext(CompExprContext.class,0);
+ }
+ public ExprContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_expr; }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterExpr(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitExpr(this);
+ }
+ }
+
+ public final ExprContext expr() throws RecognitionException {
+ ExprContext _localctx = new ExprContext(_ctx, getState());
+ enterRule(_localctx, 8, RULE_expr);
+ try {
+ setState(76);
+ _errHandler.sync(this);
+ switch ( getInterpreter().adaptivePredict(_input,4,_ctx) ) {
+ case 1:
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(74);
+ atom();
+ }
+ break;
+ case 2:
+ enterOuterAlt(_localctx, 2);
+ {
+ setState(75);
+ compExpr(0);
+ }
+ break;
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static class CompExprContext extends ParserRuleContext {
+ public CompExprContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_compExpr; }
+
+ public CompExprContext() { }
+ public void copyFrom(CompExprContext ctx) {
+ super.copyFrom(ctx);
+ }
+ }
+ public static class LtExpContext extends CompExprContext {
+ public CompExprContext compExpr() {
+ return getRuleContext(CompExprContext.class,0);
+ }
+ public TerminalNode LT() { return getToken(MathExprParser.LT, 0); }
+ public AddExprContext addExpr() {
+ return getRuleContext(AddExprContext.class,0);
+ }
+ public LtExpContext(CompExprContext ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterLtExp(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitLtExp(this);
+ }
+ }
+ public static class EqExpContext extends CompExprContext {
+ public CompExprContext compExpr() {
+ return getRuleContext(CompExprContext.class,0);
+ }
+ public TerminalNode EQ() { return getToken(MathExprParser.EQ, 0); }
+ public AddExprContext addExpr() {
+ return getRuleContext(AddExprContext.class,0);
+ }
+ public EqExpContext(CompExprContext ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterEqExp(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitEqExp(this);
+ }
+ }
+ public static class ToAddContext extends CompExprContext {
+ public AddExprContext addExpr() {
+ return getRuleContext(AddExprContext.class,0);
+ }
+ public ToAddContext(CompExprContext ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterToAdd(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitToAdd(this);
+ }
+ }
+ public static class GeExpContext extends CompExprContext {
+ public CompExprContext compExpr() {
+ return getRuleContext(CompExprContext.class,0);
+ }
+ public TerminalNode GE() { return getToken(MathExprParser.GE, 0); }
+ public AddExprContext addExpr() {
+ return getRuleContext(AddExprContext.class,0);
+ }
+ public GeExpContext(CompExprContext ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterGeExp(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitGeExp(this);
+ }
+ }
+ public static class LeExpContext extends CompExprContext {
+ public CompExprContext compExpr() {
+ return getRuleContext(CompExprContext.class,0);
+ }
+ public TerminalNode LE() { return getToken(MathExprParser.LE, 0); }
+ public AddExprContext addExpr() {
+ return getRuleContext(AddExprContext.class,0);
+ }
+ public LeExpContext(CompExprContext ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterLeExp(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitLeExp(this);
+ }
+ }
+ public static class NeExpContext extends CompExprContext {
+ public CompExprContext compExpr() {
+ return getRuleContext(CompExprContext.class,0);
+ }
+ public TerminalNode NE() { return getToken(MathExprParser.NE, 0); }
+ public AddExprContext addExpr() {
+ return getRuleContext(AddExprContext.class,0);
+ }
+ public NeExpContext(CompExprContext ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterNeExp(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitNeExp(this);
+ }
+ }
+ public static class GtExpContext extends CompExprContext {
+ public CompExprContext compExpr() {
+ return getRuleContext(CompExprContext.class,0);
+ }
+ public TerminalNode GT() { return getToken(MathExprParser.GT, 0); }
+ public AddExprContext addExpr() {
+ return getRuleContext(AddExprContext.class,0);
+ }
+ public GtExpContext(CompExprContext ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterGtExp(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitGtExp(this);
+ }
+ }
+
+ public final CompExprContext compExpr() throws RecognitionException {
+ return compExpr(0);
+ }
+
+ private CompExprContext compExpr(int _p) throws RecognitionException {
+ ParserRuleContext _parentctx = _ctx;
+ int _parentState = getState();
+ CompExprContext _localctx = new CompExprContext(_ctx, _parentState);
+ CompExprContext _prevctx = _localctx;
+ int _startState = 10;
+ enterRecursionRule(_localctx, 10, RULE_compExpr, _p);
+ try {
+ int _alt;
+ enterOuterAlt(_localctx, 1);
+ {
+ {
+ _localctx = new ToAddContext(_localctx);
+ _ctx = _localctx;
+ _prevctx = _localctx;
+
+ setState(79);
+ addExpr(0);
+ }
+ _ctx.stop = _input.LT(-1);
+ setState(101);
+ _errHandler.sync(this);
+ _alt = getInterpreter().adaptivePredict(_input,6,_ctx);
+ while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
+ if ( _alt==1 ) {
+ if ( _parseListeners!=null ) triggerExitRuleEvent();
+ _prevctx = _localctx;
+ {
+ setState(99);
+ _errHandler.sync(this);
+ switch ( getInterpreter().adaptivePredict(_input,5,_ctx) ) {
+ case 1:
+ {
+ _localctx = new GtExpContext(new CompExprContext(_parentctx, _parentState));
+ pushNewRecursionContext(_localctx, _startState, RULE_compExpr);
+ setState(81);
+ if (!(precpred(_ctx, 7))) throw new FailedPredicateException(this, "precpred(_ctx, 7)");
+ setState(82);
+ match(GT);
+ setState(83);
+ addExpr(0);
+ }
+ break;
+ case 2:
+ {
+ _localctx = new GeExpContext(new CompExprContext(_parentctx, _parentState));
+ pushNewRecursionContext(_localctx, _startState, RULE_compExpr);
+ setState(84);
+ if (!(precpred(_ctx, 6))) throw new FailedPredicateException(this, "precpred(_ctx, 6)");
+ setState(85);
+ match(GE);
+ setState(86);
+ addExpr(0);
+ }
+ break;
+ case 3:
+ {
+ _localctx = new LtExpContext(new CompExprContext(_parentctx, _parentState));
+ pushNewRecursionContext(_localctx, _startState, RULE_compExpr);
+ setState(87);
+ if (!(precpred(_ctx, 5))) throw new FailedPredicateException(this, "precpred(_ctx, 5)");
+ setState(88);
+ match(LT);
+ setState(89);
+ addExpr(0);
+ }
+ break;
+ case 4:
+ {
+ _localctx = new LeExpContext(new CompExprContext(_parentctx, _parentState));
+ pushNewRecursionContext(_localctx, _startState, RULE_compExpr);
+ setState(90);
+ if (!(precpred(_ctx, 4))) throw new FailedPredicateException(this, "precpred(_ctx, 4)");
+ setState(91);
+ match(LE);
+ setState(92);
+ addExpr(0);
+ }
+ break;
+ case 5:
+ {
+ _localctx = new EqExpContext(new CompExprContext(_parentctx, _parentState));
+ pushNewRecursionContext(_localctx, _startState, RULE_compExpr);
+ setState(93);
+ if (!(precpred(_ctx, 3))) throw new FailedPredicateException(this, "precpred(_ctx, 3)");
+ setState(94);
+ match(EQ);
+ setState(95);
+ addExpr(0);
+ }
+ break;
+ case 6:
+ {
+ _localctx = new NeExpContext(new CompExprContext(_parentctx, _parentState));
+ pushNewRecursionContext(_localctx, _startState, RULE_compExpr);
+ setState(96);
+ if (!(precpred(_ctx, 2))) throw new FailedPredicateException(this, "precpred(_ctx, 2)");
+ setState(97);
+ match(NE);
+ setState(98);
+ addExpr(0);
+ }
+ break;
+ }
+ }
+ }
+ setState(103);
+ _errHandler.sync(this);
+ _alt = getInterpreter().adaptivePredict(_input,6,_ctx);
+ }
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ unrollRecursionContexts(_parentctx);
+ }
+ return _localctx;
+ }
+
+ public static class AddExprContext extends ParserRuleContext {
+ public AddExprContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_addExpr; }
+
+ public AddExprContext() { }
+ public void copyFrom(AddExprContext ctx) {
+ super.copyFrom(ctx);
+ }
+ }
+ public static class AddExpContext extends AddExprContext {
+ public AddExprContext addExpr() {
+ return getRuleContext(AddExprContext.class,0);
+ }
+ public TerminalNode PLUS() { return getToken(MathExprParser.PLUS, 0); }
+ public MulExprContext mulExpr() {
+ return getRuleContext(MulExprContext.class,0);
+ }
+ public AddExpContext(AddExprContext ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterAddExp(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitAddExp(this);
+ }
+ }
+ public static class ToMulContext extends AddExprContext {
+ public MulExprContext mulExpr() {
+ return getRuleContext(MulExprContext.class,0);
+ }
+ public ToMulContext(AddExprContext ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterToMul(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitToMul(this);
+ }
+ }
+ public static class SubExpContext extends AddExprContext {
+ public AddExprContext addExpr() {
+ return getRuleContext(AddExprContext.class,0);
+ }
+ public TerminalNode MINUS() { return getToken(MathExprParser.MINUS, 0); }
+ public MulExprContext mulExpr() {
+ return getRuleContext(MulExprContext.class,0);
+ }
+ public SubExpContext(AddExprContext ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterSubExp(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitSubExp(this);
+ }
+ }
+
+ public final AddExprContext addExpr() throws RecognitionException {
+ return addExpr(0);
+ }
+
+ private AddExprContext addExpr(int _p) throws RecognitionException {
+ ParserRuleContext _parentctx = _ctx;
+ int _parentState = getState();
+ AddExprContext _localctx = new AddExprContext(_ctx, _parentState);
+ AddExprContext _prevctx = _localctx;
+ int _startState = 12;
+ enterRecursionRule(_localctx, 12, RULE_addExpr, _p);
+ try {
+ int _alt;
+ enterOuterAlt(_localctx, 1);
+ {
+ {
+ _localctx = new ToMulContext(_localctx);
+ _ctx = _localctx;
+ _prevctx = _localctx;
+
+ setState(105);
+ mulExpr(0);
+ }
+ _ctx.stop = _input.LT(-1);
+ setState(115);
+ _errHandler.sync(this);
+ _alt = getInterpreter().adaptivePredict(_input,8,_ctx);
+ while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
+ if ( _alt==1 ) {
+ if ( _parseListeners!=null ) triggerExitRuleEvent();
+ _prevctx = _localctx;
+ {
+ setState(113);
+ _errHandler.sync(this);
+ switch ( getInterpreter().adaptivePredict(_input,7,_ctx) ) {
+ case 1:
+ {
+ _localctx = new AddExpContext(new AddExprContext(_parentctx, _parentState));
+ pushNewRecursionContext(_localctx, _startState, RULE_addExpr);
+ setState(107);
+ if (!(precpred(_ctx, 3))) throw new FailedPredicateException(this, "precpred(_ctx, 3)");
+ setState(108);
+ match(PLUS);
+ setState(109);
+ mulExpr(0);
+ }
+ break;
+ case 2:
+ {
+ _localctx = new SubExpContext(new AddExprContext(_parentctx, _parentState));
+ pushNewRecursionContext(_localctx, _startState, RULE_addExpr);
+ setState(110);
+ if (!(precpred(_ctx, 2))) throw new FailedPredicateException(this, "precpred(_ctx, 2)");
+ setState(111);
+ match(MINUS);
+ setState(112);
+ mulExpr(0);
+ }
+ break;
+ }
+ }
+ }
+ setState(117);
+ _errHandler.sync(this);
+ _alt = getInterpreter().adaptivePredict(_input,8,_ctx);
+ }
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ unrollRecursionContexts(_parentctx);
+ }
+ return _localctx;
+ }
+
+ public static class MulExprContext extends ParserRuleContext {
+ public MulExprContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_mulExpr; }
+
+ public MulExprContext() { }
+ public void copyFrom(MulExprContext ctx) {
+ super.copyFrom(ctx);
+ }
+ }
+ public static class MulExpContext extends MulExprContext {
+ public MulExprContext mulExpr() {
+ return getRuleContext(MulExprContext.class,0);
+ }
+ public TerminalNode MULT() { return getToken(MathExprParser.MULT, 0); }
+ public PowExprContext powExpr() {
+ return getRuleContext(PowExprContext.class,0);
+ }
+ public MulExpContext(MulExprContext ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterMulExp(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitMulExp(this);
+ }
+ }
+ public static class ModExpContext extends MulExprContext {
+ public MulExprContext mulExpr() {
+ return getRuleContext(MulExprContext.class,0);
+ }
+ public TerminalNode MOD() { return getToken(MathExprParser.MOD, 0); }
+ public PowExprContext powExpr() {
+ return getRuleContext(PowExprContext.class,0);
+ }
+ public ModExpContext(MulExprContext ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterModExp(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitModExp(this);
+ }
+ }
+ public static class DivExpContext extends MulExprContext {
+ public MulExprContext mulExpr() {
+ return getRuleContext(MulExprContext.class,0);
+ }
+ public TerminalNode DIV() { return getToken(MathExprParser.DIV, 0); }
+ public PowExprContext powExpr() {
+ return getRuleContext(PowExprContext.class,0);
+ }
+ public DivExpContext(MulExprContext ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterDivExp(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitDivExp(this);
+ }
+ }
+ public static class ToPowContext extends MulExprContext {
+ public PowExprContext powExpr() {
+ return getRuleContext(PowExprContext.class,0);
+ }
+ public ToPowContext(MulExprContext ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterToPow(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitToPow(this);
+ }
+ }
+
+ public final MulExprContext mulExpr() throws RecognitionException {
+ return mulExpr(0);
+ }
+
+ private MulExprContext mulExpr(int _p) throws RecognitionException {
+ ParserRuleContext _parentctx = _ctx;
+ int _parentState = getState();
+ MulExprContext _localctx = new MulExprContext(_ctx, _parentState);
+ MulExprContext _prevctx = _localctx;
+ int _startState = 14;
+ enterRecursionRule(_localctx, 14, RULE_mulExpr, _p);
+ try {
+ int _alt;
+ enterOuterAlt(_localctx, 1);
+ {
+ {
+ _localctx = new ToPowContext(_localctx);
+ _ctx = _localctx;
+ _prevctx = _localctx;
+
+ setState(119);
+ powExpr();
+ }
+ _ctx.stop = _input.LT(-1);
+ setState(132);
+ _errHandler.sync(this);
+ _alt = getInterpreter().adaptivePredict(_input,10,_ctx);
+ while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
+ if ( _alt==1 ) {
+ if ( _parseListeners!=null ) triggerExitRuleEvent();
+ _prevctx = _localctx;
+ {
+ setState(130);
+ _errHandler.sync(this);
+ switch ( getInterpreter().adaptivePredict(_input,9,_ctx) ) {
+ case 1:
+ {
+ _localctx = new MulExpContext(new MulExprContext(_parentctx, _parentState));
+ pushNewRecursionContext(_localctx, _startState, RULE_mulExpr);
+ setState(121);
+ if (!(precpred(_ctx, 4))) throw new FailedPredicateException(this, "precpred(_ctx, 4)");
+ setState(122);
+ match(MULT);
+ setState(123);
+ powExpr();
+ }
+ break;
+ case 2:
+ {
+ _localctx = new DivExpContext(new MulExprContext(_parentctx, _parentState));
+ pushNewRecursionContext(_localctx, _startState, RULE_mulExpr);
+ setState(124);
+ if (!(precpred(_ctx, 3))) throw new FailedPredicateException(this, "precpred(_ctx, 3)");
+ setState(125);
+ match(DIV);
+ setState(126);
+ powExpr();
+ }
+ break;
+ case 3:
+ {
+ _localctx = new ModExpContext(new MulExprContext(_parentctx, _parentState));
+ pushNewRecursionContext(_localctx, _startState, RULE_mulExpr);
+ setState(127);
+ if (!(precpred(_ctx, 2))) throw new FailedPredicateException(this, "precpred(_ctx, 2)");
+ setState(128);
+ match(MOD);
+ setState(129);
+ powExpr();
+ }
+ break;
+ }
+ }
+ }
+ setState(134);
+ _errHandler.sync(this);
+ _alt = getInterpreter().adaptivePredict(_input,10,_ctx);
+ }
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ unrollRecursionContexts(_parentctx);
+ }
+ return _localctx;
+ }
+
+ public static class PowExprContext extends ParserRuleContext {
+ public PowExprContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_powExpr; }
+
+ public PowExprContext() { }
+ public void copyFrom(PowExprContext ctx) {
+ super.copyFrom(ctx);
+ }
+ }
+ public static class PowExpContext extends PowExprContext {
+ public UnaryExprContext unaryExpr() {
+ return getRuleContext(UnaryExprContext.class,0);
+ }
+ public TerminalNode POW() { return getToken(MathExprParser.POW, 0); }
+ public PowExprContext powExpr() {
+ return getRuleContext(PowExprContext.class,0);
+ }
+ public PowExpContext(PowExprContext ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterPowExp(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitPowExp(this);
+ }
+ }
+ public static class ToUnaryContext extends PowExprContext {
+ public UnaryExprContext unaryExpr() {
+ return getRuleContext(UnaryExprContext.class,0);
+ }
+ public ToUnaryContext(PowExprContext ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterToUnary(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitToUnary(this);
+ }
+ }
+
+ public final PowExprContext powExpr() throws RecognitionException {
+ PowExprContext _localctx = new PowExprContext(_ctx, getState());
+ enterRule(_localctx, 16, RULE_powExpr);
+ try {
+ setState(140);
+ _errHandler.sync(this);
+ switch ( getInterpreter().adaptivePredict(_input,11,_ctx) ) {
+ case 1:
+ _localctx = new PowExpContext(_localctx);
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(135);
+ unaryExpr();
+ setState(136);
+ match(POW);
+ setState(137);
+ powExpr();
+ }
+ break;
+ case 2:
+ _localctx = new ToUnaryContext(_localctx);
+ enterOuterAlt(_localctx, 2);
+ {
+ setState(139);
+ unaryExpr();
+ }
+ break;
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static class UnaryExprContext extends ParserRuleContext {
+ public UnaryExprContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_unaryExpr; }
+
+ public UnaryExprContext() { }
+ public void copyFrom(UnaryExprContext ctx) {
+ super.copyFrom(ctx);
+ }
+ }
+ public static class UnaryPlusContext extends UnaryExprContext {
+ public TerminalNode PLUS() { return getToken(MathExprParser.PLUS, 0); }
+ public UnaryExprContext unaryExpr() {
+ return getRuleContext(UnaryExprContext.class,0);
+ }
+ public UnaryPlusContext(UnaryExprContext ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterUnaryPlus(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitUnaryPlus(this);
+ }
+ }
+ public static class UnaryMinusContext extends UnaryExprContext {
+ public TerminalNode MINUS() { return getToken(MathExprParser.MINUS, 0); }
+ public UnaryExprContext unaryExpr() {
+ return getRuleContext(UnaryExprContext.class,0);
+ }
+ public UnaryMinusContext(UnaryExprContext ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterUnaryMinus(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitUnaryMinus(this);
+ }
+ }
+ public static class ToIndexContext extends UnaryExprContext {
+ public IndexExprContext indexExpr() {
+ return getRuleContext(IndexExprContext.class,0);
+ }
+ public ToIndexContext(UnaryExprContext ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterToIndex(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitToIndex(this);
+ }
+ }
+
+ public final UnaryExprContext unaryExpr() throws RecognitionException {
+ UnaryExprContext _localctx = new UnaryExprContext(_ctx, getState());
+ enterRule(_localctx, 18, RULE_unaryExpr);
+ try {
+ setState(147);
+ _errHandler.sync(this);
+ switch (_input.LA(1)) {
+ case PLUS:
+ _localctx = new UnaryPlusContext(_localctx);
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(142);
+ match(PLUS);
+ setState(143);
+ unaryExpr();
+ }
+ break;
+ case MINUS:
+ _localctx = new UnaryMinusContext(_localctx);
+ enterOuterAlt(_localctx, 2);
+ {
+ setState(144);
+ match(MINUS);
+ setState(145);
+ unaryExpr();
+ }
+ break;
+ case SIN:
+ case COS:
+ case TAN:
+ case ASIN:
+ case ACOS:
+ case ATAN:
+ case ATAN2:
+ case SINH:
+ case COSH:
+ case TANH:
+ case ASINH:
+ case ACOSH:
+ case ATANH:
+ case ABS:
+ case SQRT:
+ case LN:
+ case LOG:
+ case EXP:
+ case SMIN:
+ case SMAX:
+ case TMIN:
+ case TMAX:
+ case TNORM:
+ case SNORM:
+ case FLOOR:
+ case CEIL:
+ case ROUND:
+ case GAMMA:
+ case POWE:
+ case SIGM:
+ case CLAMP:
+ case SFFT:
+ case SIFFT:
+ case ANGL:
+ case PRNT:
+ case PRINT_SHAPE:
+ case NVL:
+ case LERP:
+ case STEP:
+ case SMOOTHSTEP:
+ case FRACT:
+ case RELU:
+ case SOFTPLUS:
+ case GELU:
+ case SIGN:
+ case MAP:
+ case EZCONV:
+ case CONV:
+ case SWAP:
+ case PERM:
+ case RESHAPE:
+ case RANGE:
+ case TOPK:
+ case BOTK:
+ case PINV:
+ case SUM:
+ case MEAN:
+ case STD:
+ case VAR:
+ case QUARTILE:
+ case PERCENTILE:
+ case QUANTILE:
+ case DOT:
+ case MOMENT:
+ case NOISE:
+ case RAND:
+ case CAUCHY:
+ case EXPONENTIAL:
+ case LOGNORMAL:
+ case BERNOULLI:
+ case POISSON:
+ case COSSIM:
+ case FLIP:
+ case COV:
+ case SORT:
+ case APPEND:
+ case PIPE:
+ case LPAREN:
+ case LBRACKET:
+ case CONSTANT:
+ case NUMBER:
+ case VARIABLE:
+ _localctx = new ToIndexContext(_localctx);
+ enterOuterAlt(_localctx, 3);
+ {
+ setState(146);
+ indexExpr(0);
+ }
+ break;
+ default:
+ throw new NoViableAltException(this);
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static class IndexExprContext extends ParserRuleContext {
+ public IndexExprContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_indexExpr; }
+
+ public IndexExprContext() { }
+ public void copyFrom(IndexExprContext ctx) {
+ super.copyFrom(ctx);
+ }
+ }
+ public static class IndexExpContext extends IndexExprContext {
+ public IndexExprContext indexExpr() {
+ return getRuleContext(IndexExprContext.class,0);
+ }
+ public TerminalNode LBRACKET() { return getToken(MathExprParser.LBRACKET, 0); }
+ public List expr() {
+ return getRuleContexts(ExprContext.class);
+ }
+ public ExprContext expr(int i) {
+ return getRuleContext(ExprContext.class,i);
+ }
+ public TerminalNode RBRACKET() { return getToken(MathExprParser.RBRACKET, 0); }
+ public List COMMA() { return getTokens(MathExprParser.COMMA); }
+ public TerminalNode COMMA(int i) {
+ return getToken(MathExprParser.COMMA, i);
+ }
+ public IndexExpContext(IndexExprContext ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterIndexExp(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitIndexExp(this);
+ }
+ }
+ public static class ToAtomContext extends IndexExprContext {
+ public AtomContext atom() {
+ return getRuleContext(AtomContext.class,0);
+ }
+ public ToAtomContext(IndexExprContext ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterToAtom(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitToAtom(this);
+ }
+ }
+
+ public final IndexExprContext indexExpr() throws RecognitionException {
+ return indexExpr(0);
+ }
+
+ private IndexExprContext indexExpr(int _p) throws RecognitionException {
+ ParserRuleContext _parentctx = _ctx;
+ int _parentState = getState();
+ IndexExprContext _localctx = new IndexExprContext(_ctx, _parentState);
+ IndexExprContext _prevctx = _localctx;
+ int _startState = 20;
+ enterRecursionRule(_localctx, 20, RULE_indexExpr, _p);
+ int _la;
+ try {
+ int _alt;
+ enterOuterAlt(_localctx, 1);
+ {
+ {
+ _localctx = new ToAtomContext(_localctx);
+ _ctx = _localctx;
+ _prevctx = _localctx;
+
+ setState(150);
+ atom();
+ }
+ _ctx.stop = _input.LT(-1);
+ setState(166);
+ _errHandler.sync(this);
+ _alt = getInterpreter().adaptivePredict(_input,14,_ctx);
+ while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
+ if ( _alt==1 ) {
+ if ( _parseListeners!=null ) triggerExitRuleEvent();
+ _prevctx = _localctx;
+ {
+ {
+ _localctx = new IndexExpContext(new IndexExprContext(_parentctx, _parentState));
+ pushNewRecursionContext(_localctx, _startState, RULE_indexExpr);
+ setState(152);
+ if (!(precpred(_ctx, 2))) throw new FailedPredicateException(this, "precpred(_ctx, 2)");
+ setState(153);
+ match(LBRACKET);
+ setState(154);
+ expr();
+ setState(159);
+ _errHandler.sync(this);
+ _la = _input.LA(1);
+ while (_la==COMMA) {
+ {
+ {
+ setState(155);
+ match(COMMA);
+ setState(156);
+ expr();
+ }
+ }
+ setState(161);
+ _errHandler.sync(this);
+ _la = _input.LA(1);
+ }
+ setState(162);
+ match(RBRACKET);
+ }
+ }
+ }
+ setState(168);
+ _errHandler.sync(this);
+ _alt = getInterpreter().adaptivePredict(_input,14,_ctx);
+ }
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ unrollRecursionContexts(_parentctx);
+ }
+ return _localctx;
+ }
+
+ public static class AtomContext extends ParserRuleContext {
+ public AtomContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_atom; }
+
+ public AtomContext() { }
+ public void copyFrom(AtomContext ctx) {
+ super.copyFrom(ctx);
+ }
+ }
+ public static class Func4ExpContext extends AtomContext {
+ public Func4Context func4() {
+ return getRuleContext(Func4Context.class,0);
+ }
+ public Func4ExpContext(AtomContext ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterFunc4Exp(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitFunc4Exp(this);
+ }
+ }
+ public static class Func2ExpContext extends AtomContext {
+ public Func2Context func2() {
+ return getRuleContext(Func2Context.class,0);
+ }
+ public Func2ExpContext(AtomContext ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterFunc2Exp(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitFunc2Exp(this);
+ }
+ }
+ public static class VariableExpContext extends AtomContext {
+ public TerminalNode VARIABLE() { return getToken(MathExprParser.VARIABLE, 0); }
+ public VariableExpContext(AtomContext ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterVariableExp(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitVariableExp(this);
+ }
+ }
+ public static class CallExpContext extends AtomContext {
+ public TerminalNode VARIABLE() { return getToken(MathExprParser.VARIABLE, 0); }
+ public TerminalNode LPAREN() { return getToken(MathExprParser.LPAREN, 0); }
+ public TerminalNode RPAREN() { return getToken(MathExprParser.RPAREN, 0); }
+ public ExprListContext exprList() {
+ return getRuleContext(ExprListContext.class,0);
+ }
+ public CallExpContext(AtomContext ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterCallExp(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitCallExp(this);
+ }
+ }
+ public static class Func3ExpContext extends AtomContext {
+ public Func3Context func3() {
+ return getRuleContext(Func3Context.class,0);
+ }
+ public Func3ExpContext(AtomContext ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterFunc3Exp(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitFunc3Exp(this);
+ }
+ }
+ public static class ParenExpContext extends AtomContext {
+ public TerminalNode LPAREN() { return getToken(MathExprParser.LPAREN, 0); }
+ public ExprContext expr() {
+ return getRuleContext(ExprContext.class,0);
+ }
+ public TerminalNode RPAREN() { return getToken(MathExprParser.RPAREN, 0); }
+ public ParenExpContext(AtomContext ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterParenExp(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitParenExp(this);
+ }
+ }
+ public static class ConstantExpContext extends AtomContext {
+ public TerminalNode CONSTANT() { return getToken(MathExprParser.CONSTANT, 0); }
+ public ConstantExpContext(AtomContext ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterConstantExp(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitConstantExp(this);
+ }
+ }
+ public static class Func1ExpContext extends AtomContext {
+ public Func1Context func1() {
+ return getRuleContext(Func1Context.class,0);
+ }
+ public Func1ExpContext(AtomContext ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterFunc1Exp(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitFunc1Exp(this);
+ }
+ }
+ public static class FuncNExpContext extends AtomContext {
+ public FuncNContext funcN() {
+ return getRuleContext(FuncNContext.class,0);
+ }
+ public FuncNExpContext(AtomContext ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterFuncNExp(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitFuncNExp(this);
+ }
+ }
+ public static class NumberExpContext extends AtomContext {
+ public TerminalNode NUMBER() { return getToken(MathExprParser.NUMBER, 0); }
+ public NumberExpContext(AtomContext ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterNumberExp(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitNumberExp(this);
+ }
+ }
+ public static class AbsExpContext extends AtomContext {
+ public List PIPE() { return getTokens(MathExprParser.PIPE); }
+ public TerminalNode PIPE(int i) {
+ return getToken(MathExprParser.PIPE, i);
+ }
+ public ExprContext expr() {
+ return getRuleContext(ExprContext.class,0);
+ }
+ public AbsExpContext(AtomContext ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterAbsExp(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitAbsExp(this);
+ }
+ }
+ public static class ListExpContext extends AtomContext {
+ public TerminalNode LBRACKET() { return getToken(MathExprParser.LBRACKET, 0); }
+ public List expr() {
+ return getRuleContexts(ExprContext.class);
+ }
+ public ExprContext expr(int i) {
+ return getRuleContext(ExprContext.class,i);
+ }
+ public TerminalNode RBRACKET() { return getToken(MathExprParser.RBRACKET, 0); }
+ public List COMMA() { return getTokens(MathExprParser.COMMA); }
+ public TerminalNode COMMA(int i) {
+ return getToken(MathExprParser.COMMA, i);
+ }
+ public ListExpContext(AtomContext ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterListExp(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitListExp(this);
+ }
+ }
+
+ public final AtomContext atom() throws RecognitionException {
+ AtomContext _localctx = new AtomContext(_ctx, getState());
+ enterRule(_localctx, 22, RULE_atom);
+ int _la;
+ try {
+ setState(202);
+ _errHandler.sync(this);
+ switch ( getInterpreter().adaptivePredict(_input,17,_ctx) ) {
+ case 1:
+ _localctx = new Func1ExpContext(_localctx);
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(169);
+ func1();
+ }
+ break;
+ case 2:
+ _localctx = new Func2ExpContext(_localctx);
+ enterOuterAlt(_localctx, 2);
+ {
+ setState(170);
+ func2();
+ }
+ break;
+ case 3:
+ _localctx = new Func3ExpContext(_localctx);
+ enterOuterAlt(_localctx, 3);
+ {
+ setState(171);
+ func3();
+ }
+ break;
+ case 4:
+ _localctx = new Func4ExpContext(_localctx);
+ enterOuterAlt(_localctx, 4);
+ {
+ setState(172);
+ func4();
+ }
+ break;
+ case 5:
+ _localctx = new FuncNExpContext(_localctx);
+ enterOuterAlt(_localctx, 5);
+ {
+ setState(173);
+ funcN();
+ }
+ break;
+ case 6:
+ _localctx = new VariableExpContext(_localctx);
+ enterOuterAlt(_localctx, 6);
+ {
+ setState(174);
+ match(VARIABLE);
+ }
+ break;
+ case 7:
+ _localctx = new NumberExpContext(_localctx);
+ enterOuterAlt(_localctx, 7);
+ {
+ setState(175);
+ match(NUMBER);
+ }
+ break;
+ case 8:
+ _localctx = new ConstantExpContext(_localctx);
+ enterOuterAlt(_localctx, 8);
+ {
+ setState(176);
+ match(CONSTANT);
+ }
+ break;
+ case 9:
+ _localctx = new ParenExpContext(_localctx);
+ enterOuterAlt(_localctx, 9);
+ {
+ setState(177);
+ match(LPAREN);
+ setState(178);
+ expr();
+ setState(179);
+ match(RPAREN);
+ }
+ break;
+ case 10:
+ _localctx = new AbsExpContext(_localctx);
+ enterOuterAlt(_localctx, 10);
+ {
+ setState(181);
+ match(PIPE);
+ setState(182);
+ expr();
+ setState(183);
+ match(PIPE);
+ }
+ break;
+ case 11:
+ _localctx = new ListExpContext(_localctx);
+ enterOuterAlt(_localctx, 11);
+ {
+ setState(185);
+ match(LBRACKET);
+ setState(186);
+ expr();
+ setState(191);
+ _errHandler.sync(this);
+ _la = _input.LA(1);
+ while (_la==COMMA) {
+ {
+ {
+ setState(187);
+ match(COMMA);
+ setState(188);
+ expr();
+ }
+ }
+ setState(193);
+ _errHandler.sync(this);
+ _la = _input.LA(1);
+ }
+ setState(194);
+ match(RBRACKET);
+ }
+ break;
+ case 12:
+ _localctx = new CallExpContext(_localctx);
+ enterOuterAlt(_localctx, 12);
+ {
+ setState(196);
+ match(VARIABLE);
+ setState(197);
+ match(LPAREN);
+ setState(199);
+ _errHandler.sync(this);
+ _la = _input.LA(1);
+ if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << SIN) | (1L << COS) | (1L << TAN) | (1L << ASIN) | (1L << ACOS) | (1L << ATAN) | (1L << ATAN2) | (1L << SINH) | (1L << COSH) | (1L << TANH) | (1L << ASINH) | (1L << ACOSH) | (1L << ATANH) | (1L << ABS) | (1L << SQRT) | (1L << LN) | (1L << LOG) | (1L << EXP) | (1L << SMIN) | (1L << SMAX) | (1L << TMIN) | (1L << TMAX) | (1L << TNORM) | (1L << SNORM) | (1L << FLOOR) | (1L << CEIL) | (1L << ROUND) | (1L << GAMMA) | (1L << POWE) | (1L << SIGM) | (1L << CLAMP) | (1L << SFFT) | (1L << SIFFT) | (1L << ANGL) | (1L << PRNT) | (1L << PRINT_SHAPE) | (1L << NVL) | (1L << LERP) | (1L << STEP) | (1L << SMOOTHSTEP) | (1L << FRACT) | (1L << RELU) | (1L << SOFTPLUS) | (1L << GELU) | (1L << SIGN) | (1L << MAP) | (1L << EZCONV) | (1L << CONV) | (1L << SWAP) | (1L << PERM) | (1L << RESHAPE) | (1L << RANGE) | (1L << TOPK) | (1L << BOTK) | (1L << PINV) | (1L << SUM) | (1L << MEAN) | (1L << STD) | (1L << VAR) | (1L << QUARTILE) | (1L << PERCENTILE) | (1L << QUANTILE) | (1L << DOT))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (MOMENT - 64)) | (1L << (NOISE - 64)) | (1L << (RAND - 64)) | (1L << (CAUCHY - 64)) | (1L << (EXPONENTIAL - 64)) | (1L << (LOGNORMAL - 64)) | (1L << (BERNOULLI - 64)) | (1L << (POISSON - 64)) | (1L << (COSSIM - 64)) | (1L << (FLIP - 64)) | (1L << (COV - 64)) | (1L << (SORT - 64)) | (1L << (APPEND - 64)) | (1L << (PLUS - 64)) | (1L << (MINUS - 64)) | (1L << (PIPE - 64)) | (1L << (LPAREN - 64)) | (1L << (LBRACKET - 64)) | (1L << (CONSTANT - 64)) | (1L << (NUMBER - 64)) | (1L << (VARIABLE - 64)))) != 0)) {
+ {
+ setState(198);
+ exprList();
+ }
+ }
+
+ setState(201);
+ match(RPAREN);
+ }
+ break;
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static class ExprListContext extends ParserRuleContext {
+ public List expr() {
+ return getRuleContexts(ExprContext.class);
+ }
+ public ExprContext expr(int i) {
+ return getRuleContext(ExprContext.class,i);
+ }
+ public List COMMA() { return getTokens(MathExprParser.COMMA); }
+ public TerminalNode COMMA(int i) {
+ return getToken(MathExprParser.COMMA, i);
+ }
+ public ExprListContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_exprList; }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterExprList(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitExprList(this);
+ }
+ }
+
+ public final ExprListContext exprList() throws RecognitionException {
+ ExprListContext _localctx = new ExprListContext(_ctx, getState());
+ enterRule(_localctx, 24, RULE_exprList);
+ int _la;
+ try {
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(204);
+ expr();
+ setState(209);
+ _errHandler.sync(this);
+ _la = _input.LA(1);
+ while (_la==COMMA) {
+ {
+ {
+ setState(205);
+ match(COMMA);
+ setState(206);
+ expr();
+ }
+ }
+ setState(211);
+ _errHandler.sync(this);
+ _la = _input.LA(1);
+ }
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static class Func1Context extends ParserRuleContext {
+ public Func1Context(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_func1; }
+
+ public Func1Context() { }
+ public void copyFrom(Func1Context ctx) {
+ super.copyFrom(ctx);
+ }
+ }
+ public static class SoftplusFuncContext extends Func1Context {
+ public TerminalNode SOFTPLUS() { return getToken(MathExprParser.SOFTPLUS, 0); }
+ public TerminalNode LPAREN() { return getToken(MathExprParser.LPAREN, 0); }
+ public ExprContext expr() {
+ return getRuleContext(ExprContext.class,0);
+ }
+ public TerminalNode RPAREN() { return getToken(MathExprParser.RPAREN, 0); }
+ public SoftplusFuncContext(Func1Context ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterSoftplusFunc(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitSoftplusFunc(this);
+ }
+ }
+ public static class SortFuncContext extends Func1Context {
+ public TerminalNode SORT() { return getToken(MathExprParser.SORT, 0); }
+ public TerminalNode LPAREN() { return getToken(MathExprParser.LPAREN, 0); }
+ public ExprContext expr() {
+ return getRuleContext(ExprContext.class,0);
+ }
+ public TerminalNode RPAREN() { return getToken(MathExprParser.RPAREN, 0); }
+ public SortFuncContext(Func1Context ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterSortFunc(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitSortFunc(this);
+ }
+ }
+ public static class TanhFuncContext extends Func1Context {
+ public TerminalNode TANH() { return getToken(MathExprParser.TANH, 0); }
+ public TerminalNode LPAREN() { return getToken(MathExprParser.LPAREN, 0); }
+ public ExprContext expr() {
+ return getRuleContext(ExprContext.class,0);
+ }
+ public TerminalNode RPAREN() { return getToken(MathExprParser.RPAREN, 0); }
+ public TanhFuncContext(Func1Context ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterTanhFunc(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitTanhFunc(this);
+ }
+ }
+ public static class AcoshFuncContext extends Func1Context {
+ public TerminalNode ACOSH() { return getToken(MathExprParser.ACOSH, 0); }
+ public TerminalNode LPAREN() { return getToken(MathExprParser.LPAREN, 0); }
+ public ExprContext expr() {
+ return getRuleContext(ExprContext.class,0);
+ }
+ public TerminalNode RPAREN() { return getToken(MathExprParser.RPAREN, 0); }
+ public AcoshFuncContext(Func1Context ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterAcoshFunc(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitAcoshFunc(this);
+ }
+ }
+ public static class NoiseFuncContext extends Func1Context {
+ public TerminalNode NOISE() { return getToken(MathExprParser.NOISE, 0); }
+ public TerminalNode LPAREN() { return getToken(MathExprParser.LPAREN, 0); }
+ public ExprContext expr() {
+ return getRuleContext(ExprContext.class,0);
+ }
+ public TerminalNode RPAREN() { return getToken(MathExprParser.RPAREN, 0); }
+ public NoiseFuncContext(Func1Context ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterNoiseFunc(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitNoiseFunc(this);
+ }
+ }
+ public static class SqrtFuncContext extends Func1Context {
+ public TerminalNode SQRT() { return getToken(MathExprParser.SQRT, 0); }
+ public TerminalNode LPAREN() { return getToken(MathExprParser.LPAREN, 0); }
+ public ExprContext expr() {
+ return getRuleContext(ExprContext.class,0);
+ }
+ public TerminalNode RPAREN() { return getToken(MathExprParser.RPAREN, 0); }
+ public SqrtFuncContext(Func1Context ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterSqrtFunc(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitSqrtFunc(this);
+ }
+ }
+ public static class FloorFuncContext extends Func1Context {
+ public TerminalNode FLOOR() { return getToken(MathExprParser.FLOOR, 0); }
+ public TerminalNode LPAREN() { return getToken(MathExprParser.LPAREN, 0); }
+ public ExprContext expr() {
+ return getRuleContext(ExprContext.class,0);
+ }
+ public TerminalNode RPAREN() { return getToken(MathExprParser.RPAREN, 0); }
+ public FloorFuncContext(Func1Context ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterFloorFunc(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitFloorFunc(this);
+ }
+ }
+ public static class RoundFuncContext extends Func1Context {
+ public TerminalNode ROUND() { return getToken(MathExprParser.ROUND, 0); }
+ public TerminalNode LPAREN() { return getToken(MathExprParser.LPAREN, 0); }
+ public ExprContext expr() {
+ return getRuleContext(ExprContext.class,0);
+ }
+ public TerminalNode RPAREN() { return getToken(MathExprParser.RPAREN, 0); }
+ public RoundFuncContext(Func1Context ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterRoundFunc(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitRoundFunc(this);
+ }
+ }
+ public static class MeanFuncContext extends Func1Context {
+ public TerminalNode MEAN() { return getToken(MathExprParser.MEAN, 0); }
+ public TerminalNode LPAREN() { return getToken(MathExprParser.LPAREN, 0); }
+ public ExprContext expr() {
+ return getRuleContext(ExprContext.class,0);
+ }
+ public TerminalNode RPAREN() { return getToken(MathExprParser.RPAREN, 0); }
+ public MeanFuncContext(Func1Context ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterMeanFunc(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitMeanFunc(this);
+ }
+ }
+ public static class CeilFuncContext extends Func1Context {
+ public TerminalNode CEIL() { return getToken(MathExprParser.CEIL, 0); }
+ public TerminalNode LPAREN() { return getToken(MathExprParser.LPAREN, 0); }
+ public ExprContext expr() {
+ return getRuleContext(ExprContext.class,0);
+ }
+ public TerminalNode RPAREN() { return getToken(MathExprParser.RPAREN, 0); }
+ public CeilFuncContext(Func1Context ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterCeilFunc(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitCeilFunc(this);
+ }
+ }
+ public static class GeluFuncContext extends Func1Context {
+ public TerminalNode GELU() { return getToken(MathExprParser.GELU, 0); }
+ public TerminalNode LPAREN() { return getToken(MathExprParser.LPAREN, 0); }
+ public ExprContext expr() {
+ return getRuleContext(ExprContext.class,0);
+ }
+ public TerminalNode RPAREN() { return getToken(MathExprParser.RPAREN, 0); }
+ public GeluFuncContext(Func1Context ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterGeluFunc(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitGeluFunc(this);
+ }
+ }
+ public static class PrintFuncContext extends Func1Context {
+ public TerminalNode PRNT() { return getToken(MathExprParser.PRNT, 0); }
+ public TerminalNode LPAREN() { return getToken(MathExprParser.LPAREN, 0); }
+ public ExprContext expr() {
+ return getRuleContext(ExprContext.class,0);
+ }
+ public TerminalNode RPAREN() { return getToken(MathExprParser.RPAREN, 0); }
+ public PrintFuncContext(Func1Context ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterPrintFunc(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitPrintFunc(this);
+ }
+ }
+ public static class AbsFuncContext extends Func1Context {
+ public TerminalNode ABS() { return getToken(MathExprParser.ABS, 0); }
+ public TerminalNode LPAREN() { return getToken(MathExprParser.LPAREN, 0); }
+ public ExprContext expr() {
+ return getRuleContext(ExprContext.class,0);
+ }
+ public TerminalNode RPAREN() { return getToken(MathExprParser.RPAREN, 0); }
+ public AbsFuncContext(Func1Context ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterAbsFunc(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitAbsFunc(this);
+ }
+ }
+ public static class AtanFuncContext extends Func1Context {
+ public TerminalNode ATAN() { return getToken(MathExprParser.ATAN, 0); }
+ public TerminalNode LPAREN() { return getToken(MathExprParser.LPAREN, 0); }
+ public ExprContext expr() {
+ return getRuleContext(ExprContext.class,0);
+ }
+ public TerminalNode RPAREN() { return getToken(MathExprParser.RPAREN, 0); }
+ public AtanFuncContext(Func1Context ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterAtanFunc(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitAtanFunc(this);
+ }
+ }
+ public static class ReluFuncContext extends Func1Context {
+ public TerminalNode RELU() { return getToken(MathExprParser.RELU, 0); }
+ public TerminalNode LPAREN() { return getToken(MathExprParser.LPAREN, 0); }
+ public ExprContext expr() {
+ return getRuleContext(ExprContext.class,0);
+ }
+ public TerminalNode RPAREN() { return getToken(MathExprParser.RPAREN, 0); }
+ public ReluFuncContext(Func1Context ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterReluFunc(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitReluFunc(this);
+ }
+ }
+ public static class SinhFuncContext extends Func1Context {
+ public TerminalNode SINH() { return getToken(MathExprParser.SINH, 0); }
+ public TerminalNode LPAREN() { return getToken(MathExprParser.LPAREN, 0); }
+ public ExprContext expr() {
+ return getRuleContext(ExprContext.class,0);
+ }
+ public TerminalNode RPAREN() { return getToken(MathExprParser.RPAREN, 0); }
+ public SinhFuncContext(Func1Context ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterSinhFunc(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitSinhFunc(this);
+ }
+ }
+ public static class SigmoidFuncContext extends Func1Context {
+ public TerminalNode SIGM() { return getToken(MathExprParser.SIGM, 0); }
+ public TerminalNode LPAREN() { return getToken(MathExprParser.LPAREN, 0); }
+ public ExprContext expr() {
+ return getRuleContext(ExprContext.class,0);
+ }
+ public TerminalNode RPAREN() { return getToken(MathExprParser.RPAREN, 0); }
+ public SigmoidFuncContext(Func1Context ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterSigmoidFunc(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitSigmoidFunc(this);
+ }
+ }
+ public static class LogFuncContext extends Func1Context {
+ public TerminalNode LOG() { return getToken(MathExprParser.LOG, 0); }
+ public TerminalNode LPAREN() { return getToken(MathExprParser.LPAREN, 0); }
+ public ExprContext expr() {
+ return getRuleContext(ExprContext.class,0);
+ }
+ public TerminalNode RPAREN() { return getToken(MathExprParser.RPAREN, 0); }
+ public LogFuncContext(Func1Context ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterLogFunc(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitLogFunc(this);
+ }
+ }
+ public static class LnFuncContext extends Func1Context {
+ public TerminalNode LN() { return getToken(MathExprParser.LN, 0); }
+ public TerminalNode LPAREN() { return getToken(MathExprParser.LPAREN, 0); }
+ public ExprContext expr() {
+ return getRuleContext(ExprContext.class,0);
+ }
+ public TerminalNode RPAREN() { return getToken(MathExprParser.RPAREN, 0); }
+ public LnFuncContext(Func1Context ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterLnFunc(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitLnFunc(this);
+ }
+ }
+ public static class TNormFuncContext extends Func1Context {
+ public TerminalNode TNORM() { return getToken(MathExprParser.TNORM, 0); }
+ public TerminalNode LPAREN() { return getToken(MathExprParser.LPAREN, 0); }
+ public ExprContext expr() {
+ return getRuleContext(ExprContext.class,0);
+ }
+ public TerminalNode RPAREN() { return getToken(MathExprParser.RPAREN, 0); }
+ public TNormFuncContext(Func1Context ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterTNormFunc(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitTNormFunc(this);
+ }
+ }
+ public static class SNormFuncContext extends Func1Context {
+ public TerminalNode SNORM() { return getToken(MathExprParser.SNORM, 0); }
+ public TerminalNode LPAREN() { return getToken(MathExprParser.LPAREN, 0); }
+ public ExprContext expr() {
+ return getRuleContext(ExprContext.class,0);
+ }
+ public TerminalNode RPAREN() { return getToken(MathExprParser.RPAREN, 0); }
+ public SNormFuncContext(Func1Context ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterSNormFunc(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitSNormFunc(this);
+ }
+ }
+ public static class SinFuncContext extends Func1Context {
+ public TerminalNode SIN() { return getToken(MathExprParser.SIN, 0); }
+ public TerminalNode LPAREN() { return getToken(MathExprParser.LPAREN, 0); }
+ public ExprContext expr() {
+ return getRuleContext(ExprContext.class,0);
+ }
+ public TerminalNode RPAREN() { return getToken(MathExprParser.RPAREN, 0); }
+ public SinFuncContext(Func1Context ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterSinFunc(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitSinFunc(this);
+ }
+ }
+ public static class StdFuncContext extends Func1Context {
+ public TerminalNode STD() { return getToken(MathExprParser.STD, 0); }
+ public TerminalNode LPAREN() { return getToken(MathExprParser.LPAREN, 0); }
+ public ExprContext expr() {
+ return getRuleContext(ExprContext.class,0);
+ }
+ public TerminalNode RPAREN() { return getToken(MathExprParser.RPAREN, 0); }
+ public StdFuncContext(Func1Context ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterStdFunc(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitStdFunc(this);
+ }
+ }
+ public static class RandFuncContext extends Func1Context {
+ public TerminalNode RAND() { return getToken(MathExprParser.RAND, 0); }
+ public TerminalNode LPAREN() { return getToken(MathExprParser.LPAREN, 0); }
+ public ExprContext expr() {
+ return getRuleContext(ExprContext.class,0);
+ }
+ public TerminalNode RPAREN() { return getToken(MathExprParser.RPAREN, 0); }
+ public RandFuncContext(Func1Context ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterRandFunc(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitRandFunc(this);
+ }
+ }
+ public static class AcosFuncContext extends Func1Context {
+ public TerminalNode ACOS() { return getToken(MathExprParser.ACOS, 0); }
+ public TerminalNode LPAREN() { return getToken(MathExprParser.LPAREN, 0); }
+ public ExprContext expr() {
+ return getRuleContext(ExprContext.class,0);
+ }
+ public TerminalNode RPAREN() { return getToken(MathExprParser.RPAREN, 0); }
+ public AcosFuncContext(Func1Context ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterAcosFunc(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitAcosFunc(this);
+ }
+ }
+ public static class CoshFuncContext extends Func1Context {
+ public TerminalNode COSH() { return getToken(MathExprParser.COSH, 0); }
+ public TerminalNode LPAREN() { return getToken(MathExprParser.LPAREN, 0); }
+ public ExprContext expr() {
+ return getRuleContext(ExprContext.class,0);
+ }
+ public TerminalNode RPAREN() { return getToken(MathExprParser.RPAREN, 0); }
+ public CoshFuncContext(Func1Context ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterCoshFunc(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitCoshFunc(this);
+ }
+ }
+ public static class AnglFuncContext extends Func1Context {
+ public TerminalNode ANGL() { return getToken(MathExprParser.ANGL, 0); }
+ public TerminalNode LPAREN() { return getToken(MathExprParser.LPAREN, 0); }
+ public ExprContext expr() {
+ return getRuleContext(ExprContext.class,0);
+ }
+ public TerminalNode RPAREN() { return getToken(MathExprParser.RPAREN, 0); }
+ public AnglFuncContext(Func1Context ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterAnglFunc(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitAnglFunc(this);
+ }
+ }
+ public static class SumFuncContext extends Func1Context {
+ public TerminalNode SUM() { return getToken(MathExprParser.SUM, 0); }
+ public TerminalNode LPAREN() { return getToken(MathExprParser.LPAREN, 0); }
+ public ExprContext expr() {
+ return getRuleContext(ExprContext.class,0);
+ }
+ public TerminalNode RPAREN() { return getToken(MathExprParser.RPAREN, 0); }
+ public SumFuncContext(Func1Context ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterSumFunc(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitSumFunc(this);
+ }
+ }
+ public static class SignFuncContext extends Func1Context {
+ public TerminalNode SIGN() { return getToken(MathExprParser.SIGN, 0); }
+ public TerminalNode LPAREN() { return getToken(MathExprParser.LPAREN, 0); }
+ public ExprContext expr() {
+ return getRuleContext(ExprContext.class,0);
+ }
+ public TerminalNode RPAREN() { return getToken(MathExprParser.RPAREN, 0); }
+ public SignFuncContext(Func1Context ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterSignFunc(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitSignFunc(this);
+ }
+ }
+ public static class TanFuncContext extends Func1Context {
+ public TerminalNode TAN() { return getToken(MathExprParser.TAN, 0); }
+ public TerminalNode LPAREN() { return getToken(MathExprParser.LPAREN, 0); }
+ public ExprContext expr() {
+ return getRuleContext(ExprContext.class,0);
+ }
+ public TerminalNode RPAREN() { return getToken(MathExprParser.RPAREN, 0); }
+ public TanFuncContext(Func1Context ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterTanFunc(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitTanFunc(this);
+ }
+ }
+ public static class PinvFuncContext extends Func1Context {
+ public TerminalNode PINV() { return getToken(MathExprParser.PINV, 0); }
+ public TerminalNode LPAREN() { return getToken(MathExprParser.LPAREN, 0); }
+ public ExprContext expr() {
+ return getRuleContext(ExprContext.class,0);
+ }
+ public TerminalNode RPAREN() { return getToken(MathExprParser.RPAREN, 0); }
+ public PinvFuncContext(Func1Context ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterPinvFunc(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitPinvFunc(this);
+ }
+ }
+ public static class SifftFuncContext extends Func1Context {
+ public TerminalNode SIFFT() { return getToken(MathExprParser.SIFFT, 0); }
+ public TerminalNode LPAREN() { return getToken(MathExprParser.LPAREN, 0); }
+ public ExprContext expr() {
+ return getRuleContext(ExprContext.class,0);
+ }
+ public TerminalNode RPAREN() { return getToken(MathExprParser.RPAREN, 0); }
+ public SifftFuncContext(Func1Context ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterSifftFunc(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitSifftFunc(this);
+ }
+ }
+ public static class FractFuncContext extends Func1Context {
+ public TerminalNode FRACT() { return getToken(MathExprParser.FRACT, 0); }
+ public TerminalNode LPAREN() { return getToken(MathExprParser.LPAREN, 0); }
+ public ExprContext expr() {
+ return getRuleContext(ExprContext.class,0);
+ }
+ public TerminalNode RPAREN() { return getToken(MathExprParser.RPAREN, 0); }
+ public FractFuncContext(Func1Context ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterFractFunc(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitFractFunc(this);
+ }
+ }
+ public static class GammaFuncContext extends Func1Context {
+ public TerminalNode GAMMA() { return getToken(MathExprParser.GAMMA, 0); }
+ public TerminalNode LPAREN() { return getToken(MathExprParser.LPAREN, 0); }
+ public ExprContext expr() {
+ return getRuleContext(ExprContext.class,0);
+ }
+ public TerminalNode RPAREN() { return getToken(MathExprParser.RPAREN, 0); }
+ public GammaFuncContext(Func1Context ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterGammaFunc(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitGammaFunc(this);
+ }
+ }
+ public static class CosFuncContext extends Func1Context {
+ public TerminalNode COS() { return getToken(MathExprParser.COS, 0); }
+ public TerminalNode LPAREN() { return getToken(MathExprParser.LPAREN, 0); }
+ public ExprContext expr() {
+ return getRuleContext(ExprContext.class,0);
+ }
+ public TerminalNode RPAREN() { return getToken(MathExprParser.RPAREN, 0); }
+ public CosFuncContext(Func1Context ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterCosFunc(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitCosFunc(this);
+ }
+ }
+ public static class VarFuncContext extends Func1Context {
+ public TerminalNode VAR() { return getToken(MathExprParser.VAR, 0); }
+ public TerminalNode LPAREN() { return getToken(MathExprParser.LPAREN, 0); }
+ public ExprContext expr() {
+ return getRuleContext(ExprContext.class,0);
+ }
+ public TerminalNode RPAREN() { return getToken(MathExprParser.RPAREN, 0); }
+ public VarFuncContext(Func1Context ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterVarFunc(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitVarFunc(this);
+ }
+ }
+ public static class AsinFuncContext extends Func1Context {
+ public TerminalNode ASIN() { return getToken(MathExprParser.ASIN, 0); }
+ public TerminalNode LPAREN() { return getToken(MathExprParser.LPAREN, 0); }
+ public ExprContext expr() {
+ return getRuleContext(ExprContext.class,0);
+ }
+ public TerminalNode RPAREN() { return getToken(MathExprParser.RPAREN, 0); }
+ public AsinFuncContext(Func1Context ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterAsinFunc(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitAsinFunc(this);
+ }
+ }
+ public static class AsinhFuncContext extends Func1Context {
+ public TerminalNode ASINH() { return getToken(MathExprParser.ASINH, 0); }
+ public TerminalNode LPAREN() { return getToken(MathExprParser.LPAREN, 0); }
+ public ExprContext expr() {
+ return getRuleContext(ExprContext.class,0);
+ }
+ public TerminalNode RPAREN() { return getToken(MathExprParser.RPAREN, 0); }
+ public AsinhFuncContext(Func1Context ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterAsinhFunc(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitAsinhFunc(this);
+ }
+ }
+ public static class SfftFuncContext extends Func1Context {
+ public TerminalNode SFFT() { return getToken(MathExprParser.SFFT, 0); }
+ public TerminalNode LPAREN() { return getToken(MathExprParser.LPAREN, 0); }
+ public ExprContext expr() {
+ return getRuleContext(ExprContext.class,0);
+ }
+ public TerminalNode RPAREN() { return getToken(MathExprParser.RPAREN, 0); }
+ public SfftFuncContext(Func1Context ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterSfftFunc(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitSfftFunc(this);
+ }
+ }
+ public static class AtanhFuncContext extends Func1Context {
+ public TerminalNode ATANH() { return getToken(MathExprParser.ATANH, 0); }
+ public TerminalNode LPAREN() { return getToken(MathExprParser.LPAREN, 0); }
+ public ExprContext expr() {
+ return getRuleContext(ExprContext.class,0);
+ }
+ public TerminalNode RPAREN() { return getToken(MathExprParser.RPAREN, 0); }
+ public AtanhFuncContext(Func1Context ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterAtanhFunc(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitAtanhFunc(this);
+ }
+ }
+ public static class ExpFuncContext extends Func1Context {
+ public TerminalNode EXP() { return getToken(MathExprParser.EXP, 0); }
+ public TerminalNode LPAREN() { return getToken(MathExprParser.LPAREN, 0); }
+ public ExprContext expr() {
+ return getRuleContext(ExprContext.class,0);
+ }
+ public TerminalNode RPAREN() { return getToken(MathExprParser.RPAREN, 0); }
+ public ExpFuncContext(Func1Context ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterExpFunc(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitExpFunc(this);
+ }
+ }
+ public static class PrintShapeFuncContext extends Func1Context {
+ public TerminalNode PRINT_SHAPE() { return getToken(MathExprParser.PRINT_SHAPE, 0); }
+ public TerminalNode LPAREN() { return getToken(MathExprParser.LPAREN, 0); }
+ public ExprContext expr() {
+ return getRuleContext(ExprContext.class,0);
+ }
+ public TerminalNode RPAREN() { return getToken(MathExprParser.RPAREN, 0); }
+ public PrintShapeFuncContext(Func1Context ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterPrintShapeFunc(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitPrintShapeFunc(this);
+ }
+ }
+
+ public final Func1Context func1() throws RecognitionException {
+ Func1Context _localctx = new Func1Context(_ctx, getState());
+ enterRule(_localctx, 26, RULE_func1);
+ try {
+ setState(422);
+ _errHandler.sync(this);
+ switch (_input.LA(1)) {
+ case SIN:
+ _localctx = new SinFuncContext(_localctx);
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(212);
+ match(SIN);
+ setState(213);
+ match(LPAREN);
+ setState(214);
+ expr();
+ setState(215);
+ match(RPAREN);
+ }
+ break;
+ case COS:
+ _localctx = new CosFuncContext(_localctx);
+ enterOuterAlt(_localctx, 2);
+ {
+ setState(217);
+ match(COS);
+ setState(218);
+ match(LPAREN);
+ setState(219);
+ expr();
+ setState(220);
+ match(RPAREN);
+ }
+ break;
+ case TAN:
+ _localctx = new TanFuncContext(_localctx);
+ enterOuterAlt(_localctx, 3);
+ {
+ setState(222);
+ match(TAN);
+ setState(223);
+ match(LPAREN);
+ setState(224);
+ expr();
+ setState(225);
+ match(RPAREN);
+ }
+ break;
+ case ASIN:
+ _localctx = new AsinFuncContext(_localctx);
+ enterOuterAlt(_localctx, 4);
+ {
+ setState(227);
+ match(ASIN);
+ setState(228);
+ match(LPAREN);
+ setState(229);
+ expr();
+ setState(230);
+ match(RPAREN);
+ }
+ break;
+ case ACOS:
+ _localctx = new AcosFuncContext(_localctx);
+ enterOuterAlt(_localctx, 5);
+ {
+ setState(232);
+ match(ACOS);
+ setState(233);
+ match(LPAREN);
+ setState(234);
+ expr();
+ setState(235);
+ match(RPAREN);
+ }
+ break;
+ case ATAN:
+ _localctx = new AtanFuncContext(_localctx);
+ enterOuterAlt(_localctx, 6);
+ {
+ setState(237);
+ match(ATAN);
+ setState(238);
+ match(LPAREN);
+ setState(239);
+ expr();
+ setState(240);
+ match(RPAREN);
+ }
+ break;
+ case SINH:
+ _localctx = new SinhFuncContext(_localctx);
+ enterOuterAlt(_localctx, 7);
+ {
+ setState(242);
+ match(SINH);
+ setState(243);
+ match(LPAREN);
+ setState(244);
+ expr();
+ setState(245);
+ match(RPAREN);
+ }
+ break;
+ case COSH:
+ _localctx = new CoshFuncContext(_localctx);
+ enterOuterAlt(_localctx, 8);
+ {
+ setState(247);
+ match(COSH);
+ setState(248);
+ match(LPAREN);
+ setState(249);
+ expr();
+ setState(250);
+ match(RPAREN);
+ }
+ break;
+ case TANH:
+ _localctx = new TanhFuncContext(_localctx);
+ enterOuterAlt(_localctx, 9);
+ {
+ setState(252);
+ match(TANH);
+ setState(253);
+ match(LPAREN);
+ setState(254);
+ expr();
+ setState(255);
+ match(RPAREN);
+ }
+ break;
+ case ASINH:
+ _localctx = new AsinhFuncContext(_localctx);
+ enterOuterAlt(_localctx, 10);
+ {
+ setState(257);
+ match(ASINH);
+ setState(258);
+ match(LPAREN);
+ setState(259);
+ expr();
+ setState(260);
+ match(RPAREN);
+ }
+ break;
+ case ACOSH:
+ _localctx = new AcoshFuncContext(_localctx);
+ enterOuterAlt(_localctx, 11);
+ {
+ setState(262);
+ match(ACOSH);
+ setState(263);
+ match(LPAREN);
+ setState(264);
+ expr();
+ setState(265);
+ match(RPAREN);
+ }
+ break;
+ case ATANH:
+ _localctx = new AtanhFuncContext(_localctx);
+ enterOuterAlt(_localctx, 12);
+ {
+ setState(267);
+ match(ATANH);
+ setState(268);
+ match(LPAREN);
+ setState(269);
+ expr();
+ setState(270);
+ match(RPAREN);
+ }
+ break;
+ case ABS:
+ _localctx = new AbsFuncContext(_localctx);
+ enterOuterAlt(_localctx, 13);
+ {
+ setState(272);
+ match(ABS);
+ setState(273);
+ match(LPAREN);
+ setState(274);
+ expr();
+ setState(275);
+ match(RPAREN);
+ }
+ break;
+ case SQRT:
+ _localctx = new SqrtFuncContext(_localctx);
+ enterOuterAlt(_localctx, 14);
+ {
+ setState(277);
+ match(SQRT);
+ setState(278);
+ match(LPAREN);
+ setState(279);
+ expr();
+ setState(280);
+ match(RPAREN);
+ }
+ break;
+ case LN:
+ _localctx = new LnFuncContext(_localctx);
+ enterOuterAlt(_localctx, 15);
+ {
+ setState(282);
+ match(LN);
+ setState(283);
+ match(LPAREN);
+ setState(284);
+ expr();
+ setState(285);
+ match(RPAREN);
+ }
+ break;
+ case LOG:
+ _localctx = new LogFuncContext(_localctx);
+ enterOuterAlt(_localctx, 16);
+ {
+ setState(287);
+ match(LOG);
+ setState(288);
+ match(LPAREN);
+ setState(289);
+ expr();
+ setState(290);
+ match(RPAREN);
+ }
+ break;
+ case EXP:
+ _localctx = new ExpFuncContext(_localctx);
+ enterOuterAlt(_localctx, 17);
+ {
+ setState(292);
+ match(EXP);
+ setState(293);
+ match(LPAREN);
+ setState(294);
+ expr();
+ setState(295);
+ match(RPAREN);
+ }
+ break;
+ case TNORM:
+ _localctx = new TNormFuncContext(_localctx);
+ enterOuterAlt(_localctx, 18);
+ {
+ setState(297);
+ match(TNORM);
+ setState(298);
+ match(LPAREN);
+ setState(299);
+ expr();
+ setState(300);
+ match(RPAREN);
+ }
+ break;
+ case SNORM:
+ _localctx = new SNormFuncContext(_localctx);
+ enterOuterAlt(_localctx, 19);
+ {
+ setState(302);
+ match(SNORM);
+ setState(303);
+ match(LPAREN);
+ setState(304);
+ expr();
+ setState(305);
+ match(RPAREN);
+ }
+ break;
+ case FLOOR:
+ _localctx = new FloorFuncContext(_localctx);
+ enterOuterAlt(_localctx, 20);
+ {
+ setState(307);
+ match(FLOOR);
+ setState(308);
+ match(LPAREN);
+ setState(309);
+ expr();
+ setState(310);
+ match(RPAREN);
+ }
+ break;
+ case CEIL:
+ _localctx = new CeilFuncContext(_localctx);
+ enterOuterAlt(_localctx, 21);
+ {
+ setState(312);
+ match(CEIL);
+ setState(313);
+ match(LPAREN);
+ setState(314);
+ expr();
+ setState(315);
+ match(RPAREN);
+ }
+ break;
+ case ROUND:
+ _localctx = new RoundFuncContext(_localctx);
+ enterOuterAlt(_localctx, 22);
+ {
+ setState(317);
+ match(ROUND);
+ setState(318);
+ match(LPAREN);
+ setState(319);
+ expr();
+ setState(320);
+ match(RPAREN);
+ }
+ break;
+ case GAMMA:
+ _localctx = new GammaFuncContext(_localctx);
+ enterOuterAlt(_localctx, 23);
+ {
+ setState(322);
+ match(GAMMA);
+ setState(323);
+ match(LPAREN);
+ setState(324);
+ expr();
+ setState(325);
+ match(RPAREN);
+ }
+ break;
+ case SIGM:
+ _localctx = new SigmoidFuncContext(_localctx);
+ enterOuterAlt(_localctx, 24);
+ {
+ setState(327);
+ match(SIGM);
+ setState(328);
+ match(LPAREN);
+ setState(329);
+ expr();
+ setState(330);
+ match(RPAREN);
+ }
+ break;
+ case SFFT:
+ _localctx = new SfftFuncContext(_localctx);
+ enterOuterAlt(_localctx, 25);
+ {
+ setState(332);
+ match(SFFT);
+ setState(333);
+ match(LPAREN);
+ setState(334);
+ expr();
+ setState(335);
+ match(RPAREN);
+ }
+ break;
+ case SIFFT:
+ _localctx = new SifftFuncContext(_localctx);
+ enterOuterAlt(_localctx, 26);
+ {
+ setState(337);
+ match(SIFFT);
+ setState(338);
+ match(LPAREN);
+ setState(339);
+ expr();
+ setState(340);
+ match(RPAREN);
+ }
+ break;
+ case ANGL:
+ _localctx = new AnglFuncContext(_localctx);
+ enterOuterAlt(_localctx, 27);
+ {
+ setState(342);
+ match(ANGL);
+ setState(343);
+ match(LPAREN);
+ setState(344);
+ expr();
+ setState(345);
+ match(RPAREN);
+ }
+ break;
+ case PRNT:
+ _localctx = new PrintFuncContext(_localctx);
+ enterOuterAlt(_localctx, 28);
+ {
+ setState(347);
+ match(PRNT);
+ setState(348);
+ match(LPAREN);
+ setState(349);
+ expr();
+ setState(350);
+ match(RPAREN);
+ }
+ break;
+ case FRACT:
+ _localctx = new FractFuncContext(_localctx);
+ enterOuterAlt(_localctx, 29);
+ {
+ setState(352);
+ match(FRACT);
+ setState(353);
+ match(LPAREN);
+ setState(354);
+ expr();
+ setState(355);
+ match(RPAREN);
+ }
+ break;
+ case RELU:
+ _localctx = new ReluFuncContext(_localctx);
+ enterOuterAlt(_localctx, 30);
+ {
+ setState(357);
+ match(RELU);
+ setState(358);
+ match(LPAREN);
+ setState(359);
+ expr();
+ setState(360);
+ match(RPAREN);
+ }
+ break;
+ case SOFTPLUS:
+ _localctx = new SoftplusFuncContext(_localctx);
+ enterOuterAlt(_localctx, 31);
+ {
+ setState(362);
+ match(SOFTPLUS);
+ setState(363);
+ match(LPAREN);
+ setState(364);
+ expr();
+ setState(365);
+ match(RPAREN);
+ }
+ break;
+ case GELU:
+ _localctx = new GeluFuncContext(_localctx);
+ enterOuterAlt(_localctx, 32);
+ {
+ setState(367);
+ match(GELU);
+ setState(368);
+ match(LPAREN);
+ setState(369);
+ expr();
+ setState(370);
+ match(RPAREN);
+ }
+ break;
+ case SIGN:
+ _localctx = new SignFuncContext(_localctx);
+ enterOuterAlt(_localctx, 33);
+ {
+ setState(372);
+ match(SIGN);
+ setState(373);
+ match(LPAREN);
+ setState(374);
+ expr();
+ setState(375);
+ match(RPAREN);
+ }
+ break;
+ case PRINT_SHAPE:
+ _localctx = new PrintShapeFuncContext(_localctx);
+ enterOuterAlt(_localctx, 34);
+ {
+ setState(377);
+ match(PRINT_SHAPE);
+ setState(378);
+ match(LPAREN);
+ setState(379);
+ expr();
+ setState(380);
+ match(RPAREN);
+ }
+ break;
+ case PINV:
+ _localctx = new PinvFuncContext(_localctx);
+ enterOuterAlt(_localctx, 35);
+ {
+ setState(382);
+ match(PINV);
+ setState(383);
+ match(LPAREN);
+ setState(384);
+ expr();
+ setState(385);
+ match(RPAREN);
+ }
+ break;
+ case SUM:
+ _localctx = new SumFuncContext(_localctx);
+ enterOuterAlt(_localctx, 36);
+ {
+ setState(387);
+ match(SUM);
+ setState(388);
+ match(LPAREN);
+ setState(389);
+ expr();
+ setState(390);
+ match(RPAREN);
+ }
+ break;
+ case MEAN:
+ _localctx = new MeanFuncContext(_localctx);
+ enterOuterAlt(_localctx, 37);
+ {
+ setState(392);
+ match(MEAN);
+ setState(393);
+ match(LPAREN);
+ setState(394);
+ expr();
+ setState(395);
+ match(RPAREN);
+ }
+ break;
+ case STD:
+ _localctx = new StdFuncContext(_localctx);
+ enterOuterAlt(_localctx, 38);
+ {
+ setState(397);
+ match(STD);
+ setState(398);
+ match(LPAREN);
+ setState(399);
+ expr();
+ setState(400);
+ match(RPAREN);
+ }
+ break;
+ case VAR:
+ _localctx = new VarFuncContext(_localctx);
+ enterOuterAlt(_localctx, 39);
+ {
+ setState(402);
+ match(VAR);
+ setState(403);
+ match(LPAREN);
+ setState(404);
+ expr();
+ setState(405);
+ match(RPAREN);
+ }
+ break;
+ case SORT:
+ _localctx = new SortFuncContext(_localctx);
+ enterOuterAlt(_localctx, 40);
+ {
+ setState(407);
+ match(SORT);
+ setState(408);
+ match(LPAREN);
+ setState(409);
+ expr();
+ setState(410);
+ match(RPAREN);
+ }
+ break;
+ case NOISE:
+ _localctx = new NoiseFuncContext(_localctx);
+ enterOuterAlt(_localctx, 41);
+ {
+ setState(412);
+ match(NOISE);
+ setState(413);
+ match(LPAREN);
+ setState(414);
+ expr();
+ setState(415);
+ match(RPAREN);
+ }
+ break;
+ case RAND:
+ _localctx = new RandFuncContext(_localctx);
+ enterOuterAlt(_localctx, 42);
+ {
+ setState(417);
+ match(RAND);
+ setState(418);
+ match(LPAREN);
+ setState(419);
+ expr();
+ setState(420);
+ match(RPAREN);
+ }
+ break;
+ default:
+ throw new NoViableAltException(this);
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static class Func2Context extends ParserRuleContext {
+ public Func2Context(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_func2; }
+
+ public Func2Context() { }
+ public void copyFrom(Func2Context ctx) {
+ super.copyFrom(ctx);
+ }
+ }
+ public static class TopkFuncContext extends Func2Context {
+ public TerminalNode TOPK() { return getToken(MathExprParser.TOPK, 0); }
+ public TerminalNode LPAREN() { return getToken(MathExprParser.LPAREN, 0); }
+ public List expr() {
+ return getRuleContexts(ExprContext.class);
+ }
+ public ExprContext expr(int i) {
+ return getRuleContext(ExprContext.class,i);
+ }
+ public TerminalNode COMMA() { return getToken(MathExprParser.COMMA, 0); }
+ public TerminalNode RPAREN() { return getToken(MathExprParser.RPAREN, 0); }
+ public TopkFuncContext(Func2Context ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterTopkFunc(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitTopkFunc(this);
+ }
+ }
+ public static class PercentileFuncContext extends Func2Context {
+ public TerminalNode PERCENTILE() { return getToken(MathExprParser.PERCENTILE, 0); }
+ public TerminalNode LPAREN() { return getToken(MathExprParser.LPAREN, 0); }
+ public List expr() {
+ return getRuleContexts(ExprContext.class);
+ }
+ public ExprContext expr(int i) {
+ return getRuleContext(ExprContext.class,i);
+ }
+ public TerminalNode COMMA() { return getToken(MathExprParser.COMMA, 0); }
+ public TerminalNode RPAREN() { return getToken(MathExprParser.RPAREN, 0); }
+ public PercentileFuncContext(Func2Context ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterPercentileFunc(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitPercentileFunc(this);
+ }
+ }
+ public static class ExponentialFuncContext extends Func2Context {
+ public TerminalNode EXPONENTIAL() { return getToken(MathExprParser.EXPONENTIAL, 0); }
+ public TerminalNode LPAREN() { return getToken(MathExprParser.LPAREN, 0); }
+ public List expr() {
+ return getRuleContexts(ExprContext.class);
+ }
+ public ExprContext expr(int i) {
+ return getRuleContext(ExprContext.class,i);
+ }
+ public TerminalNode COMMA() { return getToken(MathExprParser.COMMA, 0); }
+ public TerminalNode RPAREN() { return getToken(MathExprParser.RPAREN, 0); }
+ public ExponentialFuncContext(Func2Context ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterExponentialFunc(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitExponentialFunc(this);
+ }
+ }
+ public static class PoissonFuncContext extends Func2Context {
+ public TerminalNode POISSON() { return getToken(MathExprParser.POISSON, 0); }
+ public TerminalNode LPAREN() { return getToken(MathExprParser.LPAREN, 0); }
+ public List expr() {
+ return getRuleContexts(ExprContext.class);
+ }
+ public ExprContext expr(int i) {
+ return getRuleContext(ExprContext.class,i);
+ }
+ public TerminalNode COMMA() { return getToken(MathExprParser.COMMA, 0); }
+ public TerminalNode RPAREN() { return getToken(MathExprParser.RPAREN, 0); }
+ public PoissonFuncContext(Func2Context ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterPoissonFunc(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitPoissonFunc(this);
+ }
+ }
+ public static class CovFuncContext extends Func2Context {
+ public TerminalNode COV() { return getToken(MathExprParser.COV, 0); }
+ public TerminalNode LPAREN() { return getToken(MathExprParser.LPAREN, 0); }
+ public List expr() {
+ return getRuleContexts(ExprContext.class);
+ }
+ public ExprContext expr(int i) {
+ return getRuleContext(ExprContext.class,i);
+ }
+ public TerminalNode COMMA() { return getToken(MathExprParser.COMMA, 0); }
+ public TerminalNode RPAREN() { return getToken(MathExprParser.RPAREN, 0); }
+ public CovFuncContext(Func2Context ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterCovFunc(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitCovFunc(this);
+ }
+ }
+ public static class BernoulliFuncContext extends Func2Context {
+ public TerminalNode BERNOULLI() { return getToken(MathExprParser.BERNOULLI, 0); }
+ public TerminalNode LPAREN() { return getToken(MathExprParser.LPAREN, 0); }
+ public List expr() {
+ return getRuleContexts(ExprContext.class);
+ }
+ public ExprContext expr(int i) {
+ return getRuleContext(ExprContext.class,i);
+ }
+ public TerminalNode COMMA() { return getToken(MathExprParser.COMMA, 0); }
+ public TerminalNode RPAREN() { return getToken(MathExprParser.RPAREN, 0); }
+ public BernoulliFuncContext(Func2Context ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterBernoulliFunc(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitBernoulliFunc(this);
+ }
+ }
+ public static class StepFuncContext extends Func2Context {
+ public TerminalNode STEP() { return getToken(MathExprParser.STEP, 0); }
+ public TerminalNode LPAREN() { return getToken(MathExprParser.LPAREN, 0); }
+ public List expr() {
+ return getRuleContexts(ExprContext.class);
+ }
+ public ExprContext expr(int i) {
+ return getRuleContext(ExprContext.class,i);
+ }
+ public TerminalNode COMMA() { return getToken(MathExprParser.COMMA, 0); }
+ public TerminalNode RPAREN() { return getToken(MathExprParser.RPAREN, 0); }
+ public StepFuncContext(Func2Context ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterStepFunc(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitStepFunc(this);
+ }
+ }
+ public static class Atan2FuncContext extends Func2Context {
+ public TerminalNode ATAN2() { return getToken(MathExprParser.ATAN2, 0); }
+ public TerminalNode LPAREN() { return getToken(MathExprParser.LPAREN, 0); }
+ public List expr() {
+ return getRuleContexts(ExprContext.class);
+ }
+ public ExprContext expr(int i) {
+ return getRuleContext(ExprContext.class,i);
+ }
+ public TerminalNode COMMA() { return getToken(MathExprParser.COMMA, 0); }
+ public TerminalNode RPAREN() { return getToken(MathExprParser.RPAREN, 0); }
+ public Atan2FuncContext(Func2Context ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterAtan2Func(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitAtan2Func(this);
+ }
+ }
+ public static class QuantileFuncContext extends Func2Context {
+ public TerminalNode QUANTILE() { return getToken(MathExprParser.QUANTILE, 0); }
+ public TerminalNode LPAREN() { return getToken(MathExprParser.LPAREN, 0); }
+ public List expr() {
+ return getRuleContexts(ExprContext.class);
+ }
+ public ExprContext expr(int i) {
+ return getRuleContext(ExprContext.class,i);
+ }
+ public TerminalNode COMMA() { return getToken(MathExprParser.COMMA, 0); }
+ public TerminalNode RPAREN() { return getToken(MathExprParser.RPAREN, 0); }
+ public QuantileFuncContext(Func2Context ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterQuantileFunc(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitQuantileFunc(this);
+ }
+ }
+ public static class BotkFuncContext extends Func2Context {
+ public TerminalNode BOTK() { return getToken(MathExprParser.BOTK, 0); }
+ public TerminalNode LPAREN() { return getToken(MathExprParser.LPAREN, 0); }
+ public List expr() {
+ return getRuleContexts(ExprContext.class);
+ }
+ public ExprContext expr(int i) {
+ return getRuleContext(ExprContext.class,i);
+ }
+ public TerminalNode COMMA() { return getToken(MathExprParser.COMMA, 0); }
+ public TerminalNode RPAREN() { return getToken(MathExprParser.RPAREN, 0); }
+ public BotkFuncContext(Func2Context ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterBotkFunc(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitBotkFunc(this);
+ }
+ }
+ public static class TMaxFuncContext extends Func2Context {
+ public TerminalNode TMAX() { return getToken(MathExprParser.TMAX, 0); }
+ public TerminalNode LPAREN() { return getToken(MathExprParser.LPAREN, 0); }
+ public List expr() {
+ return getRuleContexts(ExprContext.class);
+ }
+ public ExprContext expr(int i) {
+ return getRuleContext(ExprContext.class,i);
+ }
+ public TerminalNode COMMA() { return getToken(MathExprParser.COMMA, 0); }
+ public TerminalNode RPAREN() { return getToken(MathExprParser.RPAREN, 0); }
+ public TMaxFuncContext(Func2Context ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterTMaxFunc(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitTMaxFunc(this);
+ }
+ }
+ public static class CossimFuncContext extends Func2Context {
+ public TerminalNode COSSIM() { return getToken(MathExprParser.COSSIM, 0); }
+ public TerminalNode LPAREN() { return getToken(MathExprParser.LPAREN, 0); }
+ public List expr() {
+ return getRuleContexts(ExprContext.class);
+ }
+ public ExprContext expr(int i) {
+ return getRuleContext(ExprContext.class,i);
+ }
+ public TerminalNode COMMA() { return getToken(MathExprParser.COMMA, 0); }
+ public TerminalNode RPAREN() { return getToken(MathExprParser.RPAREN, 0); }
+ public CossimFuncContext(Func2Context ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterCossimFunc(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitCossimFunc(this);
+ }
+ }
+ public static class PowFuncContext extends Func2Context {
+ public TerminalNode POWE() { return getToken(MathExprParser.POWE, 0); }
+ public TerminalNode LPAREN() { return getToken(MathExprParser.LPAREN, 0); }
+ public List expr() {
+ return getRuleContexts(ExprContext.class);
+ }
+ public ExprContext expr(int i) {
+ return getRuleContext(ExprContext.class,i);
+ }
+ public TerminalNode COMMA() { return getToken(MathExprParser.COMMA, 0); }
+ public TerminalNode RPAREN() { return getToken(MathExprParser.RPAREN, 0); }
+ public PowFuncContext(Func2Context ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterPowFunc(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitPowFunc(this);
+ }
+ }
+ public static class DotFuncContext extends Func2Context {
+ public TerminalNode DOT() { return getToken(MathExprParser.DOT, 0); }
+ public TerminalNode LPAREN() { return getToken(MathExprParser.LPAREN, 0); }
+ public List expr() {
+ return getRuleContexts(ExprContext.class);
+ }
+ public ExprContext expr(int i) {
+ return getRuleContext(ExprContext.class,i);
+ }
+ public TerminalNode COMMA() { return getToken(MathExprParser.COMMA, 0); }
+ public TerminalNode RPAREN() { return getToken(MathExprParser.RPAREN, 0); }
+ public DotFuncContext(Func2Context ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterDotFunc(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitDotFunc(this);
+ }
+ }
+ public static class AppendFuncContext extends Func2Context {
+ public TerminalNode APPEND() { return getToken(MathExprParser.APPEND, 0); }
+ public TerminalNode LPAREN() { return getToken(MathExprParser.LPAREN, 0); }
+ public List expr() {
+ return getRuleContexts(ExprContext.class);
+ }
+ public ExprContext expr(int i) {
+ return getRuleContext(ExprContext.class,i);
+ }
+ public TerminalNode COMMA() { return getToken(MathExprParser.COMMA, 0); }
+ public TerminalNode RPAREN() { return getToken(MathExprParser.RPAREN, 0); }
+ public AppendFuncContext(Func2Context ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterAppendFunc(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitAppendFunc(this);
+ }
+ }
+ public static class FlipFuncContext extends Func2Context {
+ public TerminalNode FLIP() { return getToken(MathExprParser.FLIP, 0); }
+ public TerminalNode LPAREN() { return getToken(MathExprParser.LPAREN, 0); }
+ public List expr() {
+ return getRuleContexts(ExprContext.class);
+ }
+ public ExprContext expr(int i) {
+ return getRuleContext(ExprContext.class,i);
+ }
+ public TerminalNode COMMA() { return getToken(MathExprParser.COMMA, 0); }
+ public TerminalNode RPAREN() { return getToken(MathExprParser.RPAREN, 0); }
+ public FlipFuncContext(Func2Context ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterFlipFunc(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitFlipFunc(this);
+ }
+ }
+ public static class QuartileFuncContext extends Func2Context {
+ public TerminalNode QUARTILE() { return getToken(MathExprParser.QUARTILE, 0); }
+ public TerminalNode LPAREN() { return getToken(MathExprParser.LPAREN, 0); }
+ public List expr() {
+ return getRuleContexts(ExprContext.class);
+ }
+ public ExprContext expr(int i) {
+ return getRuleContext(ExprContext.class,i);
+ }
+ public TerminalNode COMMA() { return getToken(MathExprParser.COMMA, 0); }
+ public TerminalNode RPAREN() { return getToken(MathExprParser.RPAREN, 0); }
+ public QuartileFuncContext(Func2Context ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterQuartileFunc(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitQuartileFunc(this);
+ }
+ }
+ public static class TMinFuncContext extends Func2Context {
+ public TerminalNode TMIN() { return getToken(MathExprParser.TMIN, 0); }
+ public TerminalNode LPAREN() { return getToken(MathExprParser.LPAREN, 0); }
+ public List expr() {
+ return getRuleContexts(ExprContext.class);
+ }
+ public ExprContext expr(int i) {
+ return getRuleContext(ExprContext.class,i);
+ }
+ public TerminalNode COMMA() { return getToken(MathExprParser.COMMA, 0); }
+ public TerminalNode RPAREN() { return getToken(MathExprParser.RPAREN, 0); }
+ public TMinFuncContext(Func2Context ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterTMinFunc(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitTMinFunc(this);
+ }
+ }
+
+ public final Func2Context func2() throws RecognitionException {
+ Func2Context _localctx = new Func2Context(_ctx, getState());
+ enterRule(_localctx, 28, RULE_func2);
+ try {
+ setState(550);
+ _errHandler.sync(this);
+ switch (_input.LA(1)) {
+ case POWE:
+ _localctx = new PowFuncContext(_localctx);
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(424);
+ match(POWE);
+ setState(425);
+ match(LPAREN);
+ setState(426);
+ expr();
+ setState(427);
+ match(COMMA);
+ setState(428);
+ expr();
+ setState(429);
+ match(RPAREN);
+ }
+ break;
+ case ATAN2:
+ _localctx = new Atan2FuncContext(_localctx);
+ enterOuterAlt(_localctx, 2);
+ {
+ setState(431);
+ match(ATAN2);
+ setState(432);
+ match(LPAREN);
+ setState(433);
+ expr();
+ setState(434);
+ match(COMMA);
+ setState(435);
+ expr();
+ setState(436);
+ match(RPAREN);
+ }
+ break;
+ case TMIN:
+ _localctx = new TMinFuncContext(_localctx);
+ enterOuterAlt(_localctx, 3);
+ {
+ setState(438);
+ match(TMIN);
+ setState(439);
+ match(LPAREN);
+ setState(440);
+ expr();
+ setState(441);
+ match(COMMA);
+ setState(442);
+ expr();
+ setState(443);
+ match(RPAREN);
+ }
+ break;
+ case TMAX:
+ _localctx = new TMaxFuncContext(_localctx);
+ enterOuterAlt(_localctx, 4);
+ {
+ setState(445);
+ match(TMAX);
+ setState(446);
+ match(LPAREN);
+ setState(447);
+ expr();
+ setState(448);
+ match(COMMA);
+ setState(449);
+ expr();
+ setState(450);
+ match(RPAREN);
+ }
+ break;
+ case STEP:
+ _localctx = new StepFuncContext(_localctx);
+ enterOuterAlt(_localctx, 5);
+ {
+ setState(452);
+ match(STEP);
+ setState(453);
+ match(LPAREN);
+ setState(454);
+ expr();
+ setState(455);
+ match(COMMA);
+ setState(456);
+ expr();
+ setState(457);
+ match(RPAREN);
+ }
+ break;
+ case TOPK:
+ _localctx = new TopkFuncContext(_localctx);
+ enterOuterAlt(_localctx, 6);
+ {
+ setState(459);
+ match(TOPK);
+ setState(460);
+ match(LPAREN);
+ setState(461);
+ expr();
+ setState(462);
+ match(COMMA);
+ setState(463);
+ expr();
+ setState(464);
+ match(RPAREN);
+ }
+ break;
+ case BOTK:
+ _localctx = new BotkFuncContext(_localctx);
+ enterOuterAlt(_localctx, 7);
+ {
+ setState(466);
+ match(BOTK);
+ setState(467);
+ match(LPAREN);
+ setState(468);
+ expr();
+ setState(469);
+ match(COMMA);
+ setState(470);
+ expr();
+ setState(471);
+ match(RPAREN);
+ }
+ break;
+ case QUARTILE:
+ _localctx = new QuartileFuncContext(_localctx);
+ enterOuterAlt(_localctx, 8);
+ {
+ setState(473);
+ match(QUARTILE);
+ setState(474);
+ match(LPAREN);
+ setState(475);
+ expr();
+ setState(476);
+ match(COMMA);
+ setState(477);
+ expr();
+ setState(478);
+ match(RPAREN);
+ }
+ break;
+ case PERCENTILE:
+ _localctx = new PercentileFuncContext(_localctx);
+ enterOuterAlt(_localctx, 9);
+ {
+ setState(480);
+ match(PERCENTILE);
+ setState(481);
+ match(LPAREN);
+ setState(482);
+ expr();
+ setState(483);
+ match(COMMA);
+ setState(484);
+ expr();
+ setState(485);
+ match(RPAREN);
+ }
+ break;
+ case QUANTILE:
+ _localctx = new QuantileFuncContext(_localctx);
+ enterOuterAlt(_localctx, 10);
+ {
+ setState(487);
+ match(QUANTILE);
+ setState(488);
+ match(LPAREN);
+ setState(489);
+ expr();
+ setState(490);
+ match(COMMA);
+ setState(491);
+ expr();
+ setState(492);
+ match(RPAREN);
+ }
+ break;
+ case DOT:
+ _localctx = new DotFuncContext(_localctx);
+ enterOuterAlt(_localctx, 11);
+ {
+ setState(494);
+ match(DOT);
+ setState(495);
+ match(LPAREN);
+ setState(496);
+ expr();
+ setState(497);
+ match(COMMA);
+ setState(498);
+ expr();
+ setState(499);
+ match(RPAREN);
+ }
+ break;
+ case COSSIM:
+ _localctx = new CossimFuncContext(_localctx);
+ enterOuterAlt(_localctx, 12);
+ {
+ setState(501);
+ match(COSSIM);
+ setState(502);
+ match(LPAREN);
+ setState(503);
+ expr();
+ setState(504);
+ match(COMMA);
+ setState(505);
+ expr();
+ setState(506);
+ match(RPAREN);
+ }
+ break;
+ case FLIP:
+ _localctx = new FlipFuncContext(_localctx);
+ enterOuterAlt(_localctx, 13);
+ {
+ setState(508);
+ match(FLIP);
+ setState(509);
+ match(LPAREN);
+ setState(510);
+ expr();
+ setState(511);
+ match(COMMA);
+ setState(512);
+ expr();
+ setState(513);
+ match(RPAREN);
+ }
+ break;
+ case COV:
+ _localctx = new CovFuncContext(_localctx);
+ enterOuterAlt(_localctx, 14);
+ {
+ setState(515);
+ match(COV);
+ setState(516);
+ match(LPAREN);
+ setState(517);
+ expr();
+ setState(518);
+ match(COMMA);
+ setState(519);
+ expr();
+ setState(520);
+ match(RPAREN);
+ }
+ break;
+ case APPEND:
+ _localctx = new AppendFuncContext(_localctx);
+ enterOuterAlt(_localctx, 15);
+ {
+ setState(522);
+ match(APPEND);
+ setState(523);
+ match(LPAREN);
+ setState(524);
+ expr();
+ setState(525);
+ match(COMMA);
+ setState(526);
+ expr();
+ setState(527);
+ match(RPAREN);
+ }
+ break;
+ case EXPONENTIAL:
+ _localctx = new ExponentialFuncContext(_localctx);
+ enterOuterAlt(_localctx, 16);
+ {
+ setState(529);
+ match(EXPONENTIAL);
+ setState(530);
+ match(LPAREN);
+ setState(531);
+ expr();
+ setState(532);
+ match(COMMA);
+ setState(533);
+ expr();
+ setState(534);
+ match(RPAREN);
+ }
+ break;
+ case BERNOULLI:
+ _localctx = new BernoulliFuncContext(_localctx);
+ enterOuterAlt(_localctx, 17);
+ {
+ setState(536);
+ match(BERNOULLI);
+ setState(537);
+ match(LPAREN);
+ setState(538);
+ expr();
+ setState(539);
+ match(COMMA);
+ setState(540);
+ expr();
+ setState(541);
+ match(RPAREN);
+ }
+ break;
+ case POISSON:
+ _localctx = new PoissonFuncContext(_localctx);
+ enterOuterAlt(_localctx, 18);
+ {
+ setState(543);
+ match(POISSON);
+ setState(544);
+ match(LPAREN);
+ setState(545);
+ expr();
+ setState(546);
+ match(COMMA);
+ setState(547);
+ expr();
+ setState(548);
+ match(RPAREN);
+ }
+ break;
+ default:
+ throw new NoViableAltException(this);
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static class Func3Context extends ParserRuleContext {
+ public Func3Context(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_func3; }
+
+ public Func3Context() { }
+ public void copyFrom(Func3Context ctx) {
+ super.copyFrom(ctx);
+ }
+ }
+ public static class MomentFuncContext extends Func3Context {
+ public TerminalNode MOMENT() { return getToken(MathExprParser.MOMENT, 0); }
+ public TerminalNode LPAREN() { return getToken(MathExprParser.LPAREN, 0); }
+ public List expr() {
+ return getRuleContexts(ExprContext.class);
+ }
+ public ExprContext expr(int i) {
+ return getRuleContext(ExprContext.class,i);
+ }
+ public List COMMA() { return getTokens(MathExprParser.COMMA); }
+ public TerminalNode COMMA(int i) {
+ return getToken(MathExprParser.COMMA, i);
+ }
+ public TerminalNode RPAREN() { return getToken(MathExprParser.RPAREN, 0); }
+ public MomentFuncContext(Func3Context ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterMomentFunc(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitMomentFunc(this);
+ }
+ }
+ public static class LerpFuncContext extends Func3Context {
+ public TerminalNode LERP() { return getToken(MathExprParser.LERP, 0); }
+ public TerminalNode LPAREN() { return getToken(MathExprParser.LPAREN, 0); }
+ public List expr() {
+ return getRuleContexts(ExprContext.class);
+ }
+ public ExprContext expr(int i) {
+ return getRuleContext(ExprContext.class,i);
+ }
+ public List COMMA() { return getTokens(MathExprParser.COMMA); }
+ public TerminalNode COMMA(int i) {
+ return getToken(MathExprParser.COMMA, i);
+ }
+ public TerminalNode RPAREN() { return getToken(MathExprParser.RPAREN, 0); }
+ public LerpFuncContext(Func3Context ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterLerpFunc(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitLerpFunc(this);
+ }
+ }
+ public static class SmoothstepFuncContext extends Func3Context {
+ public TerminalNode SMOOTHSTEP() { return getToken(MathExprParser.SMOOTHSTEP, 0); }
+ public TerminalNode LPAREN() { return getToken(MathExprParser.LPAREN, 0); }
+ public List expr() {
+ return getRuleContexts(ExprContext.class);
+ }
+ public ExprContext expr(int i) {
+ return getRuleContext(ExprContext.class,i);
+ }
+ public List COMMA() { return getTokens(MathExprParser.COMMA); }
+ public TerminalNode COMMA(int i) {
+ return getToken(MathExprParser.COMMA, i);
+ }
+ public TerminalNode RPAREN() { return getToken(MathExprParser.RPAREN, 0); }
+ public SmoothstepFuncContext(Func3Context ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterSmoothstepFunc(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitSmoothstepFunc(this);
+ }
+ }
+ public static class CauchyFuncContext extends Func3Context {
+ public TerminalNode CAUCHY() { return getToken(MathExprParser.CAUCHY, 0); }
+ public TerminalNode LPAREN() { return getToken(MathExprParser.LPAREN, 0); }
+ public List expr() {
+ return getRuleContexts(ExprContext.class);
+ }
+ public ExprContext expr(int i) {
+ return getRuleContext(ExprContext.class,i);
+ }
+ public List COMMA() { return getTokens(MathExprParser.COMMA); }
+ public TerminalNode COMMA(int i) {
+ return getToken(MathExprParser.COMMA, i);
+ }
+ public TerminalNode RPAREN() { return getToken(MathExprParser.RPAREN, 0); }
+ public CauchyFuncContext(Func3Context ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterCauchyFunc(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitCauchyFunc(this);
+ }
+ }
+ public static class LogNormalFuncContext extends Func3Context {
+ public TerminalNode LOGNORMAL() { return getToken(MathExprParser.LOGNORMAL, 0); }
+ public TerminalNode LPAREN() { return getToken(MathExprParser.LPAREN, 0); }
+ public List expr() {
+ return getRuleContexts(ExprContext.class);
+ }
+ public ExprContext expr(int i) {
+ return getRuleContext(ExprContext.class,i);
+ }
+ public List COMMA() { return getTokens(MathExprParser.COMMA); }
+ public TerminalNode COMMA(int i) {
+ return getToken(MathExprParser.COMMA, i);
+ }
+ public TerminalNode RPAREN() { return getToken(MathExprParser.RPAREN, 0); }
+ public LogNormalFuncContext(Func3Context ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterLogNormalFunc(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitLogNormalFunc(this);
+ }
+ }
+ public static class RangeFuncContext extends Func3Context {
+ public TerminalNode RANGE() { return getToken(MathExprParser.RANGE, 0); }
+ public TerminalNode LPAREN() { return getToken(MathExprParser.LPAREN, 0); }
+ public List expr() {
+ return getRuleContexts(ExprContext.class);
+ }
+ public ExprContext expr(int i) {
+ return getRuleContext(ExprContext.class,i);
+ }
+ public List COMMA() { return getTokens(MathExprParser.COMMA); }
+ public TerminalNode COMMA(int i) {
+ return getToken(MathExprParser.COMMA, i);
+ }
+ public TerminalNode RPAREN() { return getToken(MathExprParser.RPAREN, 0); }
+ public RangeFuncContext(Func3Context ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterRangeFunc(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitRangeFunc(this);
+ }
+ }
+ public static class ClampFuncContext extends Func3Context {
+ public TerminalNode CLAMP() { return getToken(MathExprParser.CLAMP, 0); }
+ public TerminalNode LPAREN() { return getToken(MathExprParser.LPAREN, 0); }
+ public List expr() {
+ return getRuleContexts(ExprContext.class);
+ }
+ public ExprContext expr(int i) {
+ return getRuleContext(ExprContext.class,i);
+ }
+ public List COMMA() { return getTokens(MathExprParser.COMMA); }
+ public TerminalNode COMMA(int i) {
+ return getToken(MathExprParser.COMMA, i);
+ }
+ public TerminalNode RPAREN() { return getToken(MathExprParser.RPAREN, 0); }
+ public ClampFuncContext(Func3Context ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterClampFunc(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitClampFunc(this);
+ }
+ }
+
+ public final Func3Context func3() throws RecognitionException {
+ Func3Context _localctx = new Func3Context(_ctx, getState());
+ enterRule(_localctx, 30, RULE_func3);
+ try {
+ setState(615);
+ _errHandler.sync(this);
+ switch (_input.LA(1)) {
+ case CLAMP:
+ _localctx = new ClampFuncContext(_localctx);
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(552);
+ match(CLAMP);
+ setState(553);
+ match(LPAREN);
+ setState(554);
+ expr();
+ setState(555);
+ match(COMMA);
+ setState(556);
+ expr();
+ setState(557);
+ match(COMMA);
+ setState(558);
+ expr();
+ setState(559);
+ match(RPAREN);
+ }
+ break;
+ case LERP:
+ _localctx = new LerpFuncContext(_localctx);
+ enterOuterAlt(_localctx, 2);
+ {
+ setState(561);
+ match(LERP);
+ setState(562);
+ match(LPAREN);
+ setState(563);
+ expr();
+ setState(564);
+ match(COMMA);
+ setState(565);
+ expr();
+ setState(566);
+ match(COMMA);
+ setState(567);
+ expr();
+ setState(568);
+ match(RPAREN);
+ }
+ break;
+ case SMOOTHSTEP:
+ _localctx = new SmoothstepFuncContext(_localctx);
+ enterOuterAlt(_localctx, 3);
+ {
+ setState(570);
+ match(SMOOTHSTEP);
+ setState(571);
+ match(LPAREN);
+ setState(572);
+ expr();
+ setState(573);
+ match(COMMA);
+ setState(574);
+ expr();
+ setState(575);
+ match(COMMA);
+ setState(576);
+ expr();
+ setState(577);
+ match(RPAREN);
+ }
+ break;
+ case RANGE:
+ _localctx = new RangeFuncContext(_localctx);
+ enterOuterAlt(_localctx, 4);
+ {
+ setState(579);
+ match(RANGE);
+ setState(580);
+ match(LPAREN);
+ setState(581);
+ expr();
+ setState(582);
+ match(COMMA);
+ setState(583);
+ expr();
+ setState(584);
+ match(COMMA);
+ setState(585);
+ expr();
+ setState(586);
+ match(RPAREN);
+ }
+ break;
+ case MOMENT:
+ _localctx = new MomentFuncContext(_localctx);
+ enterOuterAlt(_localctx, 5);
+ {
+ setState(588);
+ match(MOMENT);
+ setState(589);
+ match(LPAREN);
+ setState(590);
+ expr();
+ setState(591);
+ match(COMMA);
+ setState(592);
+ expr();
+ setState(593);
+ match(COMMA);
+ setState(594);
+ expr();
+ setState(595);
+ match(RPAREN);
+ }
+ break;
+ case CAUCHY:
+ _localctx = new CauchyFuncContext(_localctx);
+ enterOuterAlt(_localctx, 6);
+ {
+ setState(597);
+ match(CAUCHY);
+ setState(598);
+ match(LPAREN);
+ setState(599);
+ expr();
+ setState(600);
+ match(COMMA);
+ setState(601);
+ expr();
+ setState(602);
+ match(COMMA);
+ setState(603);
+ expr();
+ setState(604);
+ match(RPAREN);
+ }
+ break;
+ case LOGNORMAL:
+ _localctx = new LogNormalFuncContext(_localctx);
+ enterOuterAlt(_localctx, 7);
+ {
+ setState(606);
+ match(LOGNORMAL);
+ setState(607);
+ match(LPAREN);
+ setState(608);
+ expr();
+ setState(609);
+ match(COMMA);
+ setState(610);
+ expr();
+ setState(611);
+ match(COMMA);
+ setState(612);
+ expr();
+ setState(613);
+ match(RPAREN);
+ }
+ break;
+ default:
+ throw new NoViableAltException(this);
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static class Func4Context extends ParserRuleContext {
+ public Func4Context(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_func4; }
+
+ public Func4Context() { }
+ public void copyFrom(Func4Context ctx) {
+ super.copyFrom(ctx);
+ }
+ }
+ public static class NvlFuncContext extends Func4Context {
+ public TerminalNode NVL() { return getToken(MathExprParser.NVL, 0); }
+ public TerminalNode LPAREN() { return getToken(MathExprParser.LPAREN, 0); }
+ public List expr() {
+ return getRuleContexts(ExprContext.class);
+ }
+ public ExprContext expr(int i) {
+ return getRuleContext(ExprContext.class,i);
+ }
+ public List COMMA() { return getTokens(MathExprParser.COMMA); }
+ public TerminalNode COMMA(int i) {
+ return getToken(MathExprParser.COMMA, i);
+ }
+ public TerminalNode RPAREN() { return getToken(MathExprParser.RPAREN, 0); }
+ public NvlFuncContext(Func4Context ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterNvlFunc(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitNvlFunc(this);
+ }
+ }
+ public static class SwapFuncContext extends Func4Context {
+ public TerminalNode SWAP() { return getToken(MathExprParser.SWAP, 0); }
+ public TerminalNode LPAREN() { return getToken(MathExprParser.LPAREN, 0); }
+ public List expr() {
+ return getRuleContexts(ExprContext.class);
+ }
+ public ExprContext expr(int i) {
+ return getRuleContext(ExprContext.class,i);
+ }
+ public List COMMA() { return getTokens(MathExprParser.COMMA); }
+ public TerminalNode COMMA(int i) {
+ return getToken(MathExprParser.COMMA, i);
+ }
+ public TerminalNode RPAREN() { return getToken(MathExprParser.RPAREN, 0); }
+ public SwapFuncContext(Func4Context ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterSwapFunc(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitSwapFunc(this);
+ }
+ }
+
+ public final Func4Context func4() throws RecognitionException {
+ Func4Context _localctx = new Func4Context(_ctx, getState());
+ enterRule(_localctx, 32, RULE_func4);
+ try {
+ setState(639);
+ _errHandler.sync(this);
+ switch (_input.LA(1)) {
+ case SWAP:
+ _localctx = new SwapFuncContext(_localctx);
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(617);
+ match(SWAP);
+ setState(618);
+ match(LPAREN);
+ setState(619);
+ expr();
+ setState(620);
+ match(COMMA);
+ setState(621);
+ expr();
+ setState(622);
+ match(COMMA);
+ setState(623);
+ expr();
+ setState(624);
+ match(COMMA);
+ setState(625);
+ expr();
+ setState(626);
+ match(RPAREN);
+ }
+ break;
+ case NVL:
+ _localctx = new NvlFuncContext(_localctx);
+ enterOuterAlt(_localctx, 2);
+ {
+ setState(628);
+ match(NVL);
+ setState(629);
+ match(LPAREN);
+ setState(630);
+ expr();
+ setState(631);
+ match(COMMA);
+ setState(632);
+ expr();
+ setState(633);
+ match(COMMA);
+ setState(634);
+ expr();
+ setState(635);
+ match(COMMA);
+ setState(636);
+ expr();
+ setState(637);
+ match(RPAREN);
+ }
+ break;
+ default:
+ throw new NoViableAltException(this);
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static class FuncNContext extends ParserRuleContext {
+ public FuncNContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_funcN; }
+
+ public FuncNContext() { }
+ public void copyFrom(FuncNContext ctx) {
+ super.copyFrom(ctx);
+ }
+ }
+ public static class SMaxFuncContext extends FuncNContext {
+ public TerminalNode SMAX() { return getToken(MathExprParser.SMAX, 0); }
+ public TerminalNode LPAREN() { return getToken(MathExprParser.LPAREN, 0); }
+ public List expr() {
+ return getRuleContexts(ExprContext.class);
+ }
+ public ExprContext expr(int i) {
+ return getRuleContext(ExprContext.class,i);
+ }
+ public TerminalNode RPAREN() { return getToken(MathExprParser.RPAREN, 0); }
+ public List COMMA() { return getTokens(MathExprParser.COMMA); }
+ public TerminalNode COMMA(int i) {
+ return getToken(MathExprParser.COMMA, i);
+ }
+ public SMaxFuncContext(FuncNContext ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterSMaxFunc(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitSMaxFunc(this);
+ }
+ }
+ public static class MapFuncContext extends FuncNContext {
+ public TerminalNode MAP() { return getToken(MathExprParser.MAP, 0); }
+ public TerminalNode LPAREN() { return getToken(MathExprParser.LPAREN, 0); }
+ public List expr() {
+ return getRuleContexts(ExprContext.class);
+ }
+ public ExprContext expr(int i) {
+ return getRuleContext(ExprContext.class,i);
+ }
+ public TerminalNode RPAREN() { return getToken(MathExprParser.RPAREN, 0); }
+ public List COMMA() { return getTokens(MathExprParser.COMMA); }
+ public TerminalNode COMMA(int i) {
+ return getToken(MathExprParser.COMMA, i);
+ }
+ public MapFuncContext(FuncNContext ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterMapFunc(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitMapFunc(this);
+ }
+ }
+ public static class EzConvFuncContext extends FuncNContext {
+ public TerminalNode EZCONV() { return getToken(MathExprParser.EZCONV, 0); }
+ public TerminalNode LPAREN() { return getToken(MathExprParser.LPAREN, 0); }
+ public List expr() {
+ return getRuleContexts(ExprContext.class);
+ }
+ public ExprContext expr(int i) {
+ return getRuleContext(ExprContext.class,i);
+ }
+ public TerminalNode RPAREN() { return getToken(MathExprParser.RPAREN, 0); }
+ public List COMMA() { return getTokens(MathExprParser.COMMA); }
+ public TerminalNode COMMA(int i) {
+ return getToken(MathExprParser.COMMA, i);
+ }
+ public EzConvFuncContext(FuncNContext ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterEzConvFunc(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitEzConvFunc(this);
+ }
+ }
+ public static class PermuteFuncContext extends FuncNContext {
+ public TerminalNode PERM() { return getToken(MathExprParser.PERM, 0); }
+ public TerminalNode LPAREN() { return getToken(MathExprParser.LPAREN, 0); }
+ public List expr() {
+ return getRuleContexts(ExprContext.class);
+ }
+ public ExprContext expr(int i) {
+ return getRuleContext(ExprContext.class,i);
+ }
+ public TerminalNode COMMA() { return getToken(MathExprParser.COMMA, 0); }
+ public TerminalNode RPAREN() { return getToken(MathExprParser.RPAREN, 0); }
+ public PermuteFuncContext(FuncNContext ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterPermuteFunc(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitPermuteFunc(this);
+ }
+ }
+ public static class ReshapeFuncContext extends FuncNContext {
+ public TerminalNode RESHAPE() { return getToken(MathExprParser.RESHAPE, 0); }
+ public TerminalNode LPAREN() { return getToken(MathExprParser.LPAREN, 0); }
+ public List expr() {
+ return getRuleContexts(ExprContext.class);
+ }
+ public ExprContext expr(int i) {
+ return getRuleContext(ExprContext.class,i);
+ }
+ public TerminalNode COMMA() { return getToken(MathExprParser.COMMA, 0); }
+ public TerminalNode RPAREN() { return getToken(MathExprParser.RPAREN, 0); }
+ public ReshapeFuncContext(FuncNContext ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterReshapeFunc(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitReshapeFunc(this);
+ }
+ }
+ public static class SMinFuncContext extends FuncNContext {
+ public TerminalNode SMIN() { return getToken(MathExprParser.SMIN, 0); }
+ public TerminalNode LPAREN() { return getToken(MathExprParser.LPAREN, 0); }
+ public List expr() {
+ return getRuleContexts(ExprContext.class);
+ }
+ public ExprContext expr(int i) {
+ return getRuleContext(ExprContext.class,i);
+ }
+ public TerminalNode RPAREN() { return getToken(MathExprParser.RPAREN, 0); }
+ public List COMMA() { return getTokens(MathExprParser.COMMA); }
+ public TerminalNode COMMA(int i) {
+ return getToken(MathExprParser.COMMA, i);
+ }
+ public SMinFuncContext(FuncNContext ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterSMinFunc(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitSMinFunc(this);
+ }
+ }
+ public static class ConvFuncContext extends FuncNContext {
+ public TerminalNode CONV() { return getToken(MathExprParser.CONV, 0); }
+ public TerminalNode LPAREN() { return getToken(MathExprParser.LPAREN, 0); }
+ public List expr() {
+ return getRuleContexts(ExprContext.class);
+ }
+ public ExprContext expr(int i) {
+ return getRuleContext(ExprContext.class,i);
+ }
+ public TerminalNode RPAREN() { return getToken(MathExprParser.RPAREN, 0); }
+ public List COMMA() { return getTokens(MathExprParser.COMMA); }
+ public TerminalNode COMMA(int i) {
+ return getToken(MathExprParser.COMMA, i);
+ }
+ public ConvFuncContext(FuncNContext ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).enterConvFunc(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof MathExprListener ) ((MathExprListener)listener).exitConvFunc(this);
+ }
+ }
+
+ public final FuncNContext funcN() throws RecognitionException {
+ FuncNContext _localctx = new FuncNContext(_ctx, getState());
+ enterRule(_localctx, 34, RULE_funcN);
+ int _la;
+ try {
+ setState(712);
+ _errHandler.sync(this);
+ switch (_input.LA(1)) {
+ case SMIN:
+ _localctx = new SMinFuncContext(_localctx);
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(641);
+ match(SMIN);
+ setState(642);
+ match(LPAREN);
+ setState(643);
+ expr();
+ setState(648);
+ _errHandler.sync(this);
+ _la = _input.LA(1);
+ while (_la==COMMA) {
+ {
+ {
+ setState(644);
+ match(COMMA);
+ setState(645);
+ expr();
+ }
+ }
+ setState(650);
+ _errHandler.sync(this);
+ _la = _input.LA(1);
+ }
+ setState(651);
+ match(RPAREN);
+ }
+ break;
+ case SMAX:
+ _localctx = new SMaxFuncContext(_localctx);
+ enterOuterAlt(_localctx, 2);
+ {
+ setState(653);
+ match(SMAX);
+ setState(654);
+ match(LPAREN);
+ setState(655);
+ expr();
+ setState(660);
+ _errHandler.sync(this);
+ _la = _input.LA(1);
+ while (_la==COMMA) {
+ {
+ {
+ setState(656);
+ match(COMMA);
+ setState(657);
+ expr();
+ }
+ }
+ setState(662);
+ _errHandler.sync(this);
+ _la = _input.LA(1);
+ }
+ setState(663);
+ match(RPAREN);
+ }
+ break;
+ case MAP:
+ _localctx = new MapFuncContext(_localctx);
+ enterOuterAlt(_localctx, 3);
+ {
+ setState(665);
+ match(MAP);
+ setState(666);
+ match(LPAREN);
+ setState(667);
+ expr();
+ setState(670);
+ _errHandler.sync(this);
+ _la = _input.LA(1);
+ do {
+ {
+ {
+ setState(668);
+ match(COMMA);
+ setState(669);
+ expr();
+ }
+ }
+ setState(672);
+ _errHandler.sync(this);
+ _la = _input.LA(1);
+ } while ( _la==COMMA );
+ setState(674);
+ match(RPAREN);
+ }
+ break;
+ case EZCONV:
+ _localctx = new EzConvFuncContext(_localctx);
+ enterOuterAlt(_localctx, 4);
+ {
+ setState(676);
+ match(EZCONV);
+ setState(677);
+ match(LPAREN);
+ setState(678);
+ expr();
+ setState(681);
+ _errHandler.sync(this);
+ _la = _input.LA(1);
+ do {
+ {
+ {
+ setState(679);
+ match(COMMA);
+ setState(680);
+ expr();
+ }
+ }
+ setState(683);
+ _errHandler.sync(this);
+ _la = _input.LA(1);
+ } while ( _la==COMMA );
+ setState(685);
+ match(RPAREN);
+ }
+ break;
+ case CONV:
+ _localctx = new ConvFuncContext(_localctx);
+ enterOuterAlt(_localctx, 5);
+ {
+ setState(687);
+ match(CONV);
+ setState(688);
+ match(LPAREN);
+ setState(689);
+ expr();
+ setState(692);
+ _errHandler.sync(this);
+ _la = _input.LA(1);
+ do {
+ {
+ {
+ setState(690);
+ match(COMMA);
+ setState(691);
+ expr();
+ }
+ }
+ setState(694);
+ _errHandler.sync(this);
+ _la = _input.LA(1);
+ } while ( _la==COMMA );
+ setState(696);
+ match(RPAREN);
+ }
+ break;
+ case PERM:
+ _localctx = new PermuteFuncContext(_localctx);
+ enterOuterAlt(_localctx, 6);
+ {
+ setState(698);
+ match(PERM);
+ setState(699);
+ match(LPAREN);
+ setState(700);
+ expr();
+ setState(701);
+ match(COMMA);
+ setState(702);
+ expr();
+ setState(703);
+ match(RPAREN);
+ }
+ break;
+ case RESHAPE:
+ _localctx = new ReshapeFuncContext(_localctx);
+ enterOuterAlt(_localctx, 7);
+ {
+ setState(705);
+ match(RESHAPE);
+ setState(706);
+ match(LPAREN);
+ setState(707);
+ expr();
+ setState(708);
+ match(COMMA);
+ setState(709);
+ expr();
+ setState(710);
+ match(RPAREN);
+ }
+ break;
+ default:
+ throw new NoViableAltException(this);
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public boolean sempred(RuleContext _localctx, int ruleIndex, int predIndex) {
+ switch (ruleIndex) {
+ case 5:
+ return compExpr_sempred((CompExprContext)_localctx, predIndex);
+ case 6:
+ return addExpr_sempred((AddExprContext)_localctx, predIndex);
+ case 7:
+ return mulExpr_sempred((MulExprContext)_localctx, predIndex);
+ case 10:
+ return indexExpr_sempred((IndexExprContext)_localctx, predIndex);
+ }
+ return true;
+ }
+ private boolean compExpr_sempred(CompExprContext _localctx, int predIndex) {
+ switch (predIndex) {
+ case 0:
+ return precpred(_ctx, 7);
+ case 1:
+ return precpred(_ctx, 6);
+ case 2:
+ return precpred(_ctx, 5);
+ case 3:
+ return precpred(_ctx, 4);
+ case 4:
+ return precpred(_ctx, 3);
+ case 5:
+ return precpred(_ctx, 2);
+ }
+ return true;
+ }
+ private boolean addExpr_sempred(AddExprContext _localctx, int predIndex) {
+ switch (predIndex) {
+ case 6:
+ return precpred(_ctx, 3);
+ case 7:
+ return precpred(_ctx, 2);
+ }
+ return true;
+ }
+ private boolean mulExpr_sempred(MulExprContext _localctx, int predIndex) {
+ switch (predIndex) {
+ case 8:
+ return precpred(_ctx, 4);
+ case 9:
+ return precpred(_ctx, 3);
+ case 10:
+ return precpred(_ctx, 2);
+ }
+ return true;
+ }
+ private boolean indexExpr_sempred(IndexExprContext _localctx, int predIndex) {
+ switch (predIndex) {
+ case 11:
+ return precpred(_ctx, 2);
+ }
+ return true;
+ }
+
+ public static final String _serializedATN =
+ "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3g\u02cd\4\2\t\2\4"+
+ "\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13\t"+
+ "\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22"+
+ "\4\23\t\23\3\2\7\2(\n\2\f\2\16\2+\13\2\3\2\7\2.\n\2\f\2\16\2\61\13\2\3"+
+ "\2\3\2\3\2\3\3\3\3\3\3\5\39\n\3\3\3\3\3\3\3\3\3\3\3\3\4\3\4\3\4\3\4\3"+
+ "\4\3\5\3\5\3\5\7\5H\n\5\f\5\16\5K\13\5\3\6\3\6\5\6O\n\6\3\7\3\7\3\7\3"+
+ "\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7"+
+ "\7\7f\n\7\f\7\16\7i\13\7\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\7\bt\n\b"+
+ "\f\b\16\bw\13\b\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\7\t\u0085"+
+ "\n\t\f\t\16\t\u0088\13\t\3\n\3\n\3\n\3\n\3\n\5\n\u008f\n\n\3\13\3\13\3"+
+ "\13\3\13\3\13\5\13\u0096\n\13\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\7\f\u00a0"+
+ "\n\f\f\f\16\f\u00a3\13\f\3\f\3\f\7\f\u00a7\n\f\f\f\16\f\u00aa\13\f\3\r"+
+ "\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3"+
+ "\r\3\r\7\r\u00c0\n\r\f\r\16\r\u00c3\13\r\3\r\3\r\3\r\3\r\3\r\5\r\u00ca"+
+ "\n\r\3\r\5\r\u00cd\n\r\3\16\3\16\3\16\7\16\u00d2\n\16\f\16\16\16\u00d5"+
+ "\13\16\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17"+
+ "\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17"+
+ "\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17"+
+ "\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17"+
+ "\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17"+
+ "\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17"+
+ "\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17"+
+ "\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17"+
+ "\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17"+
+ "\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17"+
+ "\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17"+
+ "\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17"+
+ "\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17"+
+ "\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17"+
+ "\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17"+
+ "\3\17\5\17\u01a9\n\17\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20"+
+ "\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20"+
+ "\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20"+
+ "\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20"+
+ "\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20"+
+ "\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20"+
+ "\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20"+
+ "\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20"+
+ "\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20"+
+ "\3\20\3\20\3\20\3\20\5\20\u0229\n\20\3\21\3\21\3\21\3\21\3\21\3\21\3\21"+
+ "\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21"+
+ "\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21"+
+ "\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21"+
+ "\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21"+
+ "\5\21\u026a\n\21\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22"+
+ "\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\5\22\u0282\n\22"+
+ "\3\23\3\23\3\23\3\23\3\23\7\23\u0289\n\23\f\23\16\23\u028c\13\23\3\23"+
+ "\3\23\3\23\3\23\3\23\3\23\3\23\7\23\u0295\n\23\f\23\16\23\u0298\13\23"+
+ "\3\23\3\23\3\23\3\23\3\23\3\23\3\23\6\23\u02a1\n\23\r\23\16\23\u02a2\3"+
+ "\23\3\23\3\23\3\23\3\23\3\23\3\23\6\23\u02ac\n\23\r\23\16\23\u02ad\3\23"+
+ "\3\23\3\23\3\23\3\23\3\23\3\23\6\23\u02b7\n\23\r\23\16\23\u02b8\3\23\3"+
+ "\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3"+
+ "\23\5\23\u02cb\n\23\3\23\2\6\f\16\20\26\24\2\4\6\b\n\f\16\20\22\24\26"+
+ "\30\32\34\36 \"$\2\2\2\u0329\2)\3\2\2\2\4\65\3\2\2\2\6?\3\2\2\2\bD\3\2"+
+ "\2\2\nN\3\2\2\2\fP\3\2\2\2\16j\3\2\2\2\20x\3\2\2\2\22\u008e\3\2\2\2\24"+
+ "\u0095\3\2\2\2\26\u0097\3\2\2\2\30\u00cc\3\2\2\2\32\u00ce\3\2\2\2\34\u01a8"+
+ "\3\2\2\2\36\u0228\3\2\2\2 \u0269\3\2\2\2\"\u0281\3\2\2\2$\u02ca\3\2\2"+
+ "\2&(\5\4\3\2\'&\3\2\2\2(+\3\2\2\2)\'\3\2\2\2)*\3\2\2\2*/\3\2\2\2+)\3\2"+
+ "\2\2,.\5\6\4\2-,\3\2\2\2.\61\3\2\2\2/-\3\2\2\2/\60\3\2\2\2\60\62\3\2\2"+
+ "\2\61/\3\2\2\2\62\63\5\n\6\2\63\64\7\2\2\3\64\3\3\2\2\2\65\66\7f\2\2\66"+
+ "8\7]\2\2\679\5\b\5\28\67\3\2\2\289\3\2\2\29:\3\2\2\2:;\7^\2\2;<\7a\2\2"+
+ "<=\5\n\6\2=>\7`\2\2>\5\3\2\2\2?@\7f\2\2@A\7Z\2\2AB\5\n\6\2BC\7`\2\2C\7"+
+ "\3\2\2\2DI\7f\2\2EF\7_\2\2FH\7f\2\2GE\3\2\2\2HK\3\2\2\2IG\3\2\2\2IJ\3"+
+ "\2\2\2J\t\3\2\2\2KI\3\2\2\2LO\5\30\r\2MO\5\f\7\2NL\3\2\2\2NM\3\2\2\2O"+
+ "\13\3\2\2\2PQ\b\7\1\2QR\5\16\b\2Rg\3\2\2\2ST\f\t\2\2TU\7V\2\2Uf\5\16\b"+
+ "\2VW\f\b\2\2WX\7U\2\2Xf\5\16\b\2YZ\f\7\2\2Z[\7X\2\2[f\5\16\b\2\\]\f\6"+
+ "\2\2]^\7W\2\2^f\5\16\b\2_`\f\5\2\2`a\7Y\2\2af\5\16\b\2bc\f\4\2\2cd\7["+
+ "\2\2df\5\16\b\2eS\3\2\2\2eV\3\2\2\2eY\3\2\2\2e\\\3\2\2\2e_\3\2\2\2eb\3"+
+ "\2\2\2fi\3\2\2\2ge\3\2\2\2gh\3\2\2\2h\r\3\2\2\2ig\3\2\2\2jk\b\b\1\2kl"+
+ "\5\20\t\2lu\3\2\2\2mn\f\5\2\2no\7O\2\2ot\5\20\t\2pq\f\4\2\2qr\7P\2\2r"+
+ "t\5\20\t\2sm\3\2\2\2sp\3\2\2\2tw\3\2\2\2us\3\2\2\2uv\3\2\2\2v\17\3\2\2"+
+ "\2wu\3\2\2\2xy\b\t\1\2yz\5\22\n\2z\u0086\3\2\2\2{|\f\6\2\2|}\7Q\2\2}\u0085"+
+ "\5\22\n\2~\177\f\5\2\2\177\u0080\7R\2\2\u0080\u0085\5\22\n\2\u0081\u0082"+
+ "\f\4\2\2\u0082\u0083\7S\2\2\u0083\u0085\5\22\n\2\u0084{\3\2\2\2\u0084"+
+ "~\3\2\2\2\u0084\u0081\3\2\2\2\u0085\u0088\3\2\2\2\u0086\u0084\3\2\2\2"+
+ "\u0086\u0087\3\2\2\2\u0087\21\3\2\2\2\u0088\u0086\3\2\2\2\u0089\u008a"+
+ "\5\24\13\2\u008a\u008b\7T\2\2\u008b\u008c\5\22\n\2\u008c\u008f\3\2\2\2"+
+ "\u008d\u008f\5\24\13\2\u008e\u0089\3\2\2\2\u008e\u008d\3\2\2\2\u008f\23"+
+ "\3\2\2\2\u0090\u0091\7O\2\2\u0091\u0096\5\24\13\2\u0092\u0093\7P\2\2\u0093"+
+ "\u0096\5\24\13\2\u0094\u0096\5\26\f\2\u0095\u0090\3\2\2\2\u0095\u0092"+
+ "\3\2\2\2\u0095\u0094\3\2\2\2\u0096\25\3\2\2\2\u0097\u0098\b\f\1\2\u0098"+
+ "\u0099\5\30\r\2\u0099\u00a8\3\2\2\2\u009a\u009b\f\4\2\2\u009b\u009c\7"+
+ "b\2\2\u009c\u00a1\5\n\6\2\u009d\u009e\7_\2\2\u009e\u00a0\5\n\6\2\u009f"+
+ "\u009d\3\2\2\2\u00a0\u00a3\3\2\2\2\u00a1\u009f\3\2\2\2\u00a1\u00a2\3\2"+
+ "\2\2\u00a2\u00a4\3\2\2\2\u00a3\u00a1\3\2\2\2\u00a4\u00a5\7c\2\2\u00a5"+
+ "\u00a7\3\2\2\2\u00a6\u009a\3\2\2\2\u00a7\u00aa\3\2\2\2\u00a8\u00a6\3\2"+
+ "\2\2\u00a8\u00a9\3\2\2\2\u00a9\27\3\2\2\2\u00aa\u00a8\3\2\2\2\u00ab\u00cd"+
+ "\5\34\17\2\u00ac\u00cd\5\36\20\2\u00ad\u00cd\5 \21\2\u00ae\u00cd\5\"\22"+
+ "\2\u00af\u00cd\5$\23\2\u00b0\u00cd\7f\2\2\u00b1\u00cd\7e\2\2\u00b2\u00cd"+
+ "\7d\2\2\u00b3\u00b4\7]\2\2\u00b4\u00b5\5\n\6\2\u00b5\u00b6\7^\2\2\u00b6"+
+ "\u00cd\3\2\2\2\u00b7\u00b8\7\\\2\2\u00b8\u00b9\5\n\6\2\u00b9\u00ba\7\\"+
+ "\2\2\u00ba\u00cd\3\2\2\2\u00bb\u00bc\7b\2\2\u00bc\u00c1\5\n\6\2\u00bd"+
+ "\u00be\7_\2\2\u00be\u00c0\5\n\6\2\u00bf\u00bd\3\2\2\2\u00c0\u00c3\3\2"+
+ "\2\2\u00c1\u00bf\3\2\2\2\u00c1\u00c2\3\2\2\2\u00c2\u00c4\3\2\2\2\u00c3"+
+ "\u00c1\3\2\2\2\u00c4\u00c5\7c\2\2\u00c5\u00cd\3\2\2\2\u00c6\u00c7\7f\2"+
+ "\2\u00c7\u00c9\7]\2\2\u00c8\u00ca\5\32\16\2\u00c9\u00c8\3\2\2\2\u00c9"+
+ "\u00ca\3\2\2\2\u00ca\u00cb\3\2\2\2\u00cb\u00cd\7^\2\2\u00cc\u00ab\3\2"+
+ "\2\2\u00cc\u00ac\3\2\2\2\u00cc\u00ad\3\2\2\2\u00cc\u00ae\3\2\2\2\u00cc"+
+ "\u00af\3\2\2\2\u00cc\u00b0\3\2\2\2\u00cc\u00b1\3\2\2\2\u00cc\u00b2\3\2"+
+ "\2\2\u00cc\u00b3\3\2\2\2\u00cc\u00b7\3\2\2\2\u00cc\u00bb\3\2\2\2\u00cc"+
+ "\u00c6\3\2\2\2\u00cd\31\3\2\2\2\u00ce\u00d3\5\n\6\2\u00cf\u00d0\7_\2\2"+
+ "\u00d0\u00d2\5\n\6\2\u00d1\u00cf\3\2\2\2\u00d2\u00d5\3\2\2\2\u00d3\u00d1"+
+ "\3\2\2\2\u00d3\u00d4\3\2\2\2\u00d4\33\3\2\2\2\u00d5\u00d3\3\2\2\2\u00d6"+
+ "\u00d7\7\3\2\2\u00d7\u00d8\7]\2\2\u00d8\u00d9\5\n\6\2\u00d9\u00da\7^\2"+
+ "\2\u00da\u01a9\3\2\2\2\u00db\u00dc\7\4\2\2\u00dc\u00dd\7]\2\2\u00dd\u00de"+
+ "\5\n\6\2\u00de\u00df\7^\2\2\u00df\u01a9\3\2\2\2\u00e0\u00e1\7\5\2\2\u00e1"+
+ "\u00e2\7]\2\2\u00e2\u00e3\5\n\6\2\u00e3\u00e4\7^\2\2\u00e4\u01a9\3\2\2"+
+ "\2\u00e5\u00e6\7\6\2\2\u00e6\u00e7\7]\2\2\u00e7\u00e8\5\n\6\2\u00e8\u00e9"+
+ "\7^\2\2\u00e9\u01a9\3\2\2\2\u00ea\u00eb\7\7\2\2\u00eb\u00ec\7]\2\2\u00ec"+
+ "\u00ed\5\n\6\2\u00ed\u00ee\7^\2\2\u00ee\u01a9\3\2\2\2\u00ef\u00f0\7\b"+
+ "\2\2\u00f0\u00f1\7]\2\2\u00f1\u00f2\5\n\6\2\u00f2\u00f3\7^\2\2\u00f3\u01a9"+
+ "\3\2\2\2\u00f4\u00f5\7\n\2\2\u00f5\u00f6\7]\2\2\u00f6\u00f7\5\n\6\2\u00f7"+
+ "\u00f8\7^\2\2\u00f8\u01a9\3\2\2\2\u00f9\u00fa\7\13\2\2\u00fa\u00fb\7]"+
+ "\2\2\u00fb\u00fc\5\n\6\2\u00fc\u00fd\7^\2\2\u00fd\u01a9\3\2\2\2\u00fe"+
+ "\u00ff\7\f\2\2\u00ff\u0100\7]\2\2\u0100\u0101\5\n\6\2\u0101\u0102\7^\2"+
+ "\2\u0102\u01a9\3\2\2\2\u0103\u0104\7\r\2\2\u0104\u0105\7]\2\2\u0105\u0106"+
+ "\5\n\6\2\u0106\u0107\7^\2\2\u0107\u01a9\3\2\2\2\u0108\u0109\7\16\2\2\u0109"+
+ "\u010a\7]\2\2\u010a\u010b\5\n\6\2\u010b\u010c\7^\2\2\u010c\u01a9\3\2\2"+
+ "\2\u010d\u010e\7\17\2\2\u010e\u010f\7]\2\2\u010f\u0110\5\n\6\2\u0110\u0111"+
+ "\7^\2\2\u0111\u01a9\3\2\2\2\u0112\u0113\7\20\2\2\u0113\u0114\7]\2\2\u0114"+
+ "\u0115\5\n\6\2\u0115\u0116\7^\2\2\u0116\u01a9\3\2\2\2\u0117\u0118\7\21"+
+ "\2\2\u0118\u0119\7]\2\2\u0119\u011a\5\n\6\2\u011a\u011b\7^\2\2\u011b\u01a9"+
+ "\3\2\2\2\u011c\u011d\7\22\2\2\u011d\u011e\7]\2\2\u011e\u011f\5\n\6\2\u011f"+
+ "\u0120\7^\2\2\u0120\u01a9\3\2\2\2\u0121\u0122\7\23\2\2\u0122\u0123\7]"+
+ "\2\2\u0123\u0124\5\n\6\2\u0124\u0125\7^\2\2\u0125\u01a9\3\2\2\2\u0126"+
+ "\u0127\7\24\2\2\u0127\u0128\7]\2\2\u0128\u0129\5\n\6\2\u0129\u012a\7^"+
+ "\2\2\u012a\u01a9\3\2\2\2\u012b\u012c\7\31\2\2\u012c\u012d\7]\2\2\u012d"+
+ "\u012e\5\n\6\2\u012e\u012f\7^\2\2\u012f\u01a9\3\2\2\2\u0130\u0131\7\32"+
+ "\2\2\u0131\u0132\7]\2\2\u0132\u0133\5\n\6\2\u0133\u0134\7^\2\2\u0134\u01a9"+
+ "\3\2\2\2\u0135\u0136\7\33\2\2\u0136\u0137\7]\2\2\u0137\u0138\5\n\6\2\u0138"+
+ "\u0139\7^\2\2\u0139\u01a9\3\2\2\2\u013a\u013b\7\34\2\2\u013b\u013c\7]"+
+ "\2\2\u013c\u013d\5\n\6\2\u013d\u013e\7^\2\2\u013e\u01a9\3\2\2\2\u013f"+
+ "\u0140\7\35\2\2\u0140\u0141\7]\2\2\u0141\u0142\5\n\6\2\u0142\u0143\7^"+
+ "\2\2\u0143\u01a9\3\2\2\2\u0144\u0145\7\36\2\2\u0145\u0146\7]\2\2\u0146"+
+ "\u0147\5\n\6\2\u0147\u0148\7^\2\2\u0148\u01a9\3\2\2\2\u0149\u014a\7 \2"+
+ "\2\u014a\u014b\7]\2\2\u014b\u014c\5\n\6\2\u014c\u014d\7^\2\2\u014d\u01a9"+
+ "\3\2\2\2\u014e\u014f\7\"\2\2\u014f\u0150\7]\2\2\u0150\u0151\5\n\6\2\u0151"+
+ "\u0152\7^\2\2\u0152\u01a9\3\2\2\2\u0153\u0154\7#\2\2\u0154\u0155\7]\2"+
+ "\2\u0155\u0156\5\n\6\2\u0156\u0157\7^\2\2\u0157\u01a9\3\2\2\2\u0158\u0159"+
+ "\7$\2\2\u0159\u015a\7]\2\2\u015a\u015b\5\n\6\2\u015b\u015c\7^\2\2\u015c"+
+ "\u01a9\3\2\2\2\u015d\u015e\7%\2\2\u015e\u015f\7]\2\2\u015f\u0160\5\n\6"+
+ "\2\u0160\u0161\7^\2\2\u0161\u01a9\3\2\2\2\u0162\u0163\7+\2\2\u0163\u0164"+
+ "\7]\2\2\u0164\u0165\5\n\6\2\u0165\u0166\7^\2\2\u0166\u01a9\3\2\2\2\u0167"+
+ "\u0168\7,\2\2\u0168\u0169\7]\2\2\u0169\u016a\5\n\6\2\u016a\u016b\7^\2"+
+ "\2\u016b\u01a9\3\2\2\2\u016c\u016d\7-\2\2\u016d\u016e\7]\2\2\u016e\u016f"+
+ "\5\n\6\2\u016f\u0170\7^\2\2\u0170\u01a9\3\2\2\2\u0171\u0172\7.\2\2\u0172"+
+ "\u0173\7]\2\2\u0173\u0174\5\n\6\2\u0174\u0175\7^\2\2\u0175\u01a9\3\2\2"+
+ "\2\u0176\u0177\7/\2\2\u0177\u0178\7]\2\2\u0178\u0179\5\n\6\2\u0179\u017a"+
+ "\7^\2\2\u017a\u01a9\3\2\2\2\u017b\u017c\7&\2\2\u017c\u017d\7]\2\2\u017d"+
+ "\u017e\5\n\6\2\u017e\u017f\7^\2\2\u017f\u01a9\3\2\2\2\u0180\u0181\79\2"+
+ "\2\u0181\u0182\7]\2\2\u0182\u0183\5\n\6\2\u0183\u0184\7^\2\2\u0184\u01a9"+
+ "\3\2\2\2\u0185\u0186\7:\2\2\u0186\u0187\7]\2\2\u0187\u0188\5\n\6\2\u0188"+
+ "\u0189\7^\2\2\u0189\u01a9\3\2\2\2\u018a\u018b\7;\2\2\u018b\u018c\7]\2"+
+ "\2\u018c\u018d\5\n\6\2\u018d\u018e\7^\2\2\u018e\u01a9\3\2\2\2\u018f\u0190"+
+ "\7<\2\2\u0190\u0191\7]\2\2\u0191\u0192\5\n\6\2\u0192\u0193\7^\2\2\u0193"+
+ "\u01a9\3\2\2\2\u0194\u0195\7=\2\2\u0195\u0196\7]\2\2\u0196\u0197\5\n\6"+
+ "\2\u0197\u0198\7^\2\2\u0198\u01a9\3\2\2\2\u0199\u019a\7M\2\2\u019a\u019b"+
+ "\7]\2\2\u019b\u019c\5\n\6\2\u019c\u019d\7^\2\2\u019d\u01a9\3\2\2\2\u019e"+
+ "\u019f\7C\2\2\u019f\u01a0\7]\2\2\u01a0\u01a1\5\n\6\2\u01a1\u01a2\7^\2"+
+ "\2\u01a2\u01a9\3\2\2\2\u01a3\u01a4\7D\2\2\u01a4\u01a5\7]\2\2\u01a5\u01a6"+
+ "\5\n\6\2\u01a6\u01a7\7^\2\2\u01a7\u01a9\3\2\2\2\u01a8\u00d6\3\2\2\2\u01a8"+
+ "\u00db\3\2\2\2\u01a8\u00e0\3\2\2\2\u01a8\u00e5\3\2\2\2\u01a8\u00ea\3\2"+
+ "\2\2\u01a8\u00ef\3\2\2\2\u01a8\u00f4\3\2\2\2\u01a8\u00f9\3\2\2\2\u01a8"+
+ "\u00fe\3\2\2\2\u01a8\u0103\3\2\2\2\u01a8\u0108\3\2\2\2\u01a8\u010d\3\2"+
+ "\2\2\u01a8\u0112\3\2\2\2\u01a8\u0117\3\2\2\2\u01a8\u011c\3\2\2\2\u01a8"+
+ "\u0121\3\2\2\2\u01a8\u0126\3\2\2\2\u01a8\u012b\3\2\2\2\u01a8\u0130\3\2"+
+ "\2\2\u01a8\u0135\3\2\2\2\u01a8\u013a\3\2\2\2\u01a8\u013f\3\2\2\2\u01a8"+
+ "\u0144\3\2\2\2\u01a8\u0149\3\2\2\2\u01a8\u014e\3\2\2\2\u01a8\u0153\3\2"+
+ "\2\2\u01a8\u0158\3\2\2\2\u01a8\u015d\3\2\2\2\u01a8\u0162\3\2\2\2\u01a8"+
+ "\u0167\3\2\2\2\u01a8\u016c\3\2\2\2\u01a8\u0171\3\2\2\2\u01a8\u0176\3\2"+
+ "\2\2\u01a8\u017b\3\2\2\2\u01a8\u0180\3\2\2\2\u01a8\u0185\3\2\2\2\u01a8"+
+ "\u018a\3\2\2\2\u01a8\u018f\3\2\2\2\u01a8\u0194\3\2\2\2\u01a8\u0199\3\2"+
+ "\2\2\u01a8\u019e\3\2\2\2\u01a8\u01a3\3\2\2\2\u01a9\35\3\2\2\2\u01aa\u01ab"+
+ "\7\37\2\2\u01ab\u01ac\7]\2\2\u01ac\u01ad\5\n\6\2\u01ad\u01ae\7_\2\2\u01ae"+
+ "\u01af\5\n\6\2\u01af\u01b0\7^\2\2\u01b0\u0229\3\2\2\2\u01b1\u01b2\7\t"+
+ "\2\2\u01b2\u01b3\7]\2\2\u01b3\u01b4\5\n\6\2\u01b4\u01b5\7_\2\2\u01b5\u01b6"+
+ "\5\n\6\2\u01b6\u01b7\7^\2\2\u01b7\u0229\3\2\2\2\u01b8\u01b9\7\27\2\2\u01b9"+
+ "\u01ba\7]\2\2\u01ba\u01bb\5\n\6\2\u01bb\u01bc\7_\2\2\u01bc\u01bd\5\n\6"+
+ "\2\u01bd\u01be\7^\2\2\u01be\u0229\3\2\2\2\u01bf\u01c0\7\30\2\2\u01c0\u01c1"+
+ "\7]\2\2\u01c1\u01c2\5\n\6\2\u01c2\u01c3\7_\2\2\u01c3\u01c4\5\n\6\2\u01c4"+
+ "\u01c5\7^\2\2\u01c5\u0229\3\2\2\2\u01c6\u01c7\7)\2\2\u01c7\u01c8\7]\2"+
+ "\2\u01c8\u01c9\5\n\6\2\u01c9\u01ca\7_\2\2\u01ca\u01cb\5\n\6\2\u01cb\u01cc"+
+ "\7^\2\2\u01cc\u0229\3\2\2\2\u01cd\u01ce\7\67\2\2\u01ce\u01cf\7]\2\2\u01cf"+
+ "\u01d0\5\n\6\2\u01d0\u01d1\7_\2\2\u01d1\u01d2\5\n\6\2\u01d2\u01d3\7^\2"+
+ "\2\u01d3\u0229\3\2\2\2\u01d4\u01d5\78\2\2\u01d5\u01d6\7]\2\2\u01d6\u01d7"+
+ "\5\n\6\2\u01d7\u01d8\7_\2\2\u01d8\u01d9\5\n\6\2\u01d9\u01da\7^\2\2\u01da"+
+ "\u0229\3\2\2\2\u01db\u01dc\7>\2\2\u01dc\u01dd\7]\2\2\u01dd\u01de\5\n\6"+
+ "\2\u01de\u01df\7_\2\2\u01df\u01e0\5\n\6\2\u01e0\u01e1\7^\2\2\u01e1\u0229"+
+ "\3\2\2\2\u01e2\u01e3\7?\2\2\u01e3\u01e4\7]\2\2\u01e4\u01e5\5\n\6\2\u01e5"+
+ "\u01e6\7_\2\2\u01e6\u01e7\5\n\6\2\u01e7\u01e8\7^\2\2\u01e8\u0229\3\2\2"+
+ "\2\u01e9\u01ea\7@\2\2\u01ea\u01eb\7]\2\2\u01eb\u01ec\5\n\6\2\u01ec\u01ed"+
+ "\7_\2\2\u01ed\u01ee\5\n\6\2\u01ee\u01ef\7^\2\2\u01ef\u0229\3\2\2\2\u01f0"+
+ "\u01f1\7A\2\2\u01f1\u01f2\7]\2\2\u01f2\u01f3\5\n\6\2\u01f3\u01f4\7_\2"+
+ "\2\u01f4\u01f5\5\n\6\2\u01f5\u01f6\7^\2\2\u01f6\u0229\3\2\2\2\u01f7\u01f8"+
+ "\7J\2\2\u01f8\u01f9\7]\2\2\u01f9\u01fa\5\n\6\2\u01fa\u01fb\7_\2\2\u01fb"+
+ "\u01fc\5\n\6\2\u01fc\u01fd\7^\2\2\u01fd\u0229\3\2\2\2\u01fe\u01ff\7K\2"+
+ "\2\u01ff\u0200\7]\2\2\u0200\u0201\5\n\6\2\u0201\u0202\7_\2\2\u0202\u0203"+
+ "\5\n\6\2\u0203\u0204\7^\2\2\u0204\u0229\3\2\2\2\u0205\u0206\7L\2\2\u0206"+
+ "\u0207\7]\2\2\u0207\u0208\5\n\6\2\u0208\u0209\7_\2\2\u0209\u020a\5\n\6"+
+ "\2\u020a\u020b\7^\2\2\u020b\u0229\3\2\2\2\u020c\u020d\7N\2\2\u020d\u020e"+
+ "\7]\2\2\u020e\u020f\5\n\6\2\u020f\u0210\7_\2\2\u0210\u0211\5\n\6\2\u0211"+
+ "\u0212\7^\2\2\u0212\u0229\3\2\2\2\u0213\u0214\7F\2\2\u0214\u0215\7]\2"+
+ "\2\u0215\u0216\5\n\6\2\u0216\u0217\7_\2\2\u0217\u0218\5\n\6\2\u0218\u0219"+
+ "\7^\2\2\u0219\u0229\3\2\2\2\u021a\u021b\7H\2\2\u021b\u021c\7]\2\2\u021c"+
+ "\u021d\5\n\6\2\u021d\u021e\7_\2\2\u021e\u021f\5\n\6\2\u021f\u0220\7^\2"+
+ "\2\u0220\u0229\3\2\2\2\u0221\u0222\7I\2\2\u0222\u0223\7]\2\2\u0223\u0224"+
+ "\5\n\6\2\u0224\u0225\7_\2\2\u0225\u0226\5\n\6\2\u0226\u0227\7^\2\2\u0227"+
+ "\u0229\3\2\2\2\u0228\u01aa\3\2\2\2\u0228\u01b1\3\2\2\2\u0228\u01b8\3\2"+
+ "\2\2\u0228\u01bf\3\2\2\2\u0228\u01c6\3\2\2\2\u0228\u01cd\3\2\2\2\u0228"+
+ "\u01d4\3\2\2\2\u0228\u01db\3\2\2\2\u0228\u01e2\3\2\2\2\u0228\u01e9\3\2"+
+ "\2\2\u0228\u01f0\3\2\2\2\u0228\u01f7\3\2\2\2\u0228\u01fe\3\2\2\2\u0228"+
+ "\u0205\3\2\2\2\u0228\u020c\3\2\2\2\u0228\u0213\3\2\2\2\u0228\u021a\3\2"+
+ "\2\2\u0228\u0221\3\2\2\2\u0229\37\3\2\2\2\u022a\u022b\7!\2\2\u022b\u022c"+
+ "\7]\2\2\u022c\u022d\5\n\6\2\u022d\u022e\7_\2\2\u022e\u022f\5\n\6\2\u022f"+
+ "\u0230\7_\2\2\u0230\u0231\5\n\6\2\u0231\u0232\7^\2\2\u0232\u026a\3\2\2"+
+ "\2\u0233\u0234\7(\2\2\u0234\u0235\7]\2\2\u0235\u0236\5\n\6\2\u0236\u0237"+
+ "\7_\2\2\u0237\u0238\5\n\6\2\u0238\u0239\7_\2\2\u0239\u023a\5\n\6\2\u023a"+
+ "\u023b\7^\2\2\u023b\u026a\3\2\2\2\u023c\u023d\7*\2\2\u023d\u023e\7]\2"+
+ "\2\u023e\u023f\5\n\6\2\u023f\u0240\7_\2\2\u0240\u0241\5\n\6\2\u0241\u0242"+
+ "\7_\2\2\u0242\u0243\5\n\6\2\u0243\u0244\7^\2\2\u0244\u026a\3\2\2\2\u0245"+
+ "\u0246\7\66\2\2\u0246\u0247\7]\2\2\u0247\u0248\5\n\6\2\u0248\u0249\7_"+
+ "\2\2\u0249\u024a\5\n\6\2\u024a\u024b\7_\2\2\u024b\u024c\5\n\6\2\u024c"+
+ "\u024d\7^\2\2\u024d\u026a\3\2\2\2\u024e\u024f\7B\2\2\u024f\u0250\7]\2"+
+ "\2\u0250\u0251\5\n\6\2\u0251\u0252\7_\2\2\u0252\u0253\5\n\6\2\u0253\u0254"+
+ "\7_\2\2\u0254\u0255\5\n\6\2\u0255\u0256\7^\2\2\u0256\u026a\3\2\2\2\u0257"+
+ "\u0258\7E\2\2\u0258\u0259\7]\2\2\u0259\u025a\5\n\6\2\u025a\u025b\7_\2"+
+ "\2\u025b\u025c\5\n\6\2\u025c\u025d\7_\2\2\u025d\u025e\5\n\6\2\u025e\u025f"+
+ "\7^\2\2\u025f\u026a\3\2\2\2\u0260\u0261\7G\2\2\u0261\u0262\7]\2\2\u0262"+
+ "\u0263\5\n\6\2\u0263\u0264\7_\2\2\u0264\u0265\5\n\6\2\u0265\u0266\7_\2"+
+ "\2\u0266\u0267\5\n\6\2\u0267\u0268\7^\2\2\u0268\u026a\3\2\2\2\u0269\u022a"+
+ "\3\2\2\2\u0269\u0233\3\2\2\2\u0269\u023c\3\2\2\2\u0269\u0245\3\2\2\2\u0269"+
+ "\u024e\3\2\2\2\u0269\u0257\3\2\2\2\u0269\u0260\3\2\2\2\u026a!\3\2\2\2"+
+ "\u026b\u026c\7\63\2\2\u026c\u026d\7]\2\2\u026d\u026e\5\n\6\2\u026e\u026f"+
+ "\7_\2\2\u026f\u0270\5\n\6\2\u0270\u0271\7_\2\2\u0271\u0272\5\n\6\2\u0272"+
+ "\u0273\7_\2\2\u0273\u0274\5\n\6\2\u0274\u0275\7^\2\2\u0275\u0282\3\2\2"+
+ "\2\u0276\u0277\7\'\2\2\u0277\u0278\7]\2\2\u0278\u0279\5\n\6\2\u0279\u027a"+
+ "\7_\2\2\u027a\u027b\5\n\6\2\u027b\u027c\7_\2\2\u027c\u027d\5\n\6\2\u027d"+
+ "\u027e\7_\2\2\u027e\u027f\5\n\6\2\u027f\u0280\7^\2\2\u0280\u0282\3\2\2"+
+ "\2\u0281\u026b\3\2\2\2\u0281\u0276\3\2\2\2\u0282#\3\2\2\2\u0283\u0284"+
+ "\7\25\2\2\u0284\u0285\7]\2\2\u0285\u028a\5\n\6\2\u0286\u0287\7_\2\2\u0287"+
+ "\u0289\5\n\6\2\u0288\u0286\3\2\2\2\u0289\u028c\3\2\2\2\u028a\u0288\3\2"+
+ "\2\2\u028a\u028b\3\2\2\2\u028b\u028d\3\2\2\2\u028c\u028a\3\2\2\2\u028d"+
+ "\u028e\7^\2\2\u028e\u02cb\3\2\2\2\u028f\u0290\7\26\2\2\u0290\u0291\7]"+
+ "\2\2\u0291\u0296\5\n\6\2\u0292\u0293\7_\2\2\u0293\u0295\5\n\6\2\u0294"+
+ "\u0292\3\2\2\2\u0295\u0298\3\2\2\2\u0296\u0294\3\2\2\2\u0296\u0297\3\2"+
+ "\2\2\u0297\u0299\3\2\2\2\u0298\u0296\3\2\2\2\u0299\u029a\7^\2\2\u029a"+
+ "\u02cb\3\2\2\2\u029b\u029c\7\60\2\2\u029c\u029d\7]\2\2\u029d\u02a0\5\n"+
+ "\6\2\u029e\u029f\7_\2\2\u029f\u02a1\5\n\6\2\u02a0\u029e\3\2\2\2\u02a1"+
+ "\u02a2\3\2\2\2\u02a2\u02a0\3\2\2\2\u02a2\u02a3\3\2\2\2\u02a3\u02a4\3\2"+
+ "\2\2\u02a4\u02a5\7^\2\2\u02a5\u02cb\3\2\2\2\u02a6\u02a7\7\61\2\2\u02a7"+
+ "\u02a8\7]\2\2\u02a8\u02ab\5\n\6\2\u02a9\u02aa\7_\2\2\u02aa\u02ac\5\n\6"+
+ "\2\u02ab\u02a9\3\2\2\2\u02ac\u02ad\3\2\2\2\u02ad\u02ab\3\2\2\2\u02ad\u02ae"+
+ "\3\2\2\2\u02ae\u02af\3\2\2\2\u02af\u02b0\7^\2\2\u02b0\u02cb\3\2\2\2\u02b1"+
+ "\u02b2\7\62\2\2\u02b2\u02b3\7]\2\2\u02b3\u02b6\5\n\6\2\u02b4\u02b5\7_"+
+ "\2\2\u02b5\u02b7\5\n\6\2\u02b6\u02b4\3\2\2\2\u02b7\u02b8\3\2\2\2\u02b8"+
+ "\u02b6\3\2\2\2\u02b8\u02b9\3\2\2\2\u02b9\u02ba\3\2\2\2\u02ba\u02bb\7^"+
+ "\2\2\u02bb\u02cb\3\2\2\2\u02bc\u02bd\7\64\2\2\u02bd\u02be\7]\2\2\u02be"+
+ "\u02bf\5\n\6\2\u02bf\u02c0\7_\2\2\u02c0\u02c1\5\n\6\2\u02c1\u02c2\7^\2"+
+ "\2\u02c2\u02cb\3\2\2\2\u02c3\u02c4\7\65\2\2\u02c4\u02c5\7]\2\2\u02c5\u02c6"+
+ "\5\n\6\2\u02c6\u02c7\7_\2\2\u02c7\u02c8\5\n\6\2\u02c8\u02c9\7^\2\2\u02c9"+
+ "\u02cb\3\2\2\2\u02ca\u0283\3\2\2\2\u02ca\u028f\3\2\2\2\u02ca\u029b\3\2"+
+ "\2\2\u02ca\u02a6\3\2\2\2\u02ca\u02b1\3\2\2\2\u02ca\u02bc\3\2\2\2\u02ca"+
+ "\u02c3\3\2\2\2\u02cb%\3\2\2\2\37)/8INegsu\u0084\u0086\u008e\u0095\u00a1"+
+ "\u00a8\u00c1\u00c9\u00cc\u00d3\u01a8\u0228\u0269\u0281\u028a\u0296\u02a2"+
+ "\u02ad\u02b8\u02ca";
+ public static final ATN _ATN =
+ new ATNDeserializer().deserialize(_serializedATN.toCharArray());
+ static {
+ _decisionToDFA = new DFA[_ATN.getNumberOfDecisions()];
+ for (int i = 0; i < _ATN.getNumberOfDecisions(); i++) {
+ _decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i);
+ }
+ }
+}
\ No newline at end of file
diff --git a/more_math/SigmasMathNode.py b/more_math/SigmasMathNode.py
index 10b9f14..a26949a 100644
--- a/more_math/SigmasMathNode.py
+++ b/more_math/SigmasMathNode.py
@@ -28,7 +28,7 @@ class SigmasMathNode(io.ComfyNode):
io.String.Input(id="Expression", default="I0*(1-F0)+I1*F0", tooltip="Expression to apply on input images"),
io.Combo.Input(
id="length_mismatch",
- options=["tile", "error", "pad"],
+ options=["error", "error", "pad"],
default="error",
tooltip="How to handle mismatched image batch sizes. tile: repeat shorter inputs; error: raise error on mismatch; pad: treat missing frames as zero."
)
diff --git a/more_math/VaeMathNode.py b/more_math/VaeMathNode.py
index d61a969..0d55727 100644
--- a/more_math/VaeMathNode.py
+++ b/more_math/VaeMathNode.py
@@ -2,34 +2,31 @@ from inspect import cleandoc
from comfy_api.latest import io
import copy
from .modelLikeCommon import calculate_patches
-from .helper_functions import commonLazy
+from antlr4 import InputStream, CommonTokenStream
+from .Parser.MathExprLexer import MathExprLexer
+from .Parser.MathExprParser import MathExprParser
+import re
class VAEMathNode(io.ComfyNode):
"""
- This node enables the use of math expressions on VAE weights.
+ This node enables the use of math expressions on VAE weights using Autogrow inputs.
"""
@classmethod
def define_schema(cls) -> io.Schema:
return io.Schema(
- node_id="mrmth_VAEMathNode",
+ node_id="mrmth_ag_VAEMathNode",
display_name="VAE Math",
category="More math",
inputs=[
- io.Vae.Input(id="a", tooltip="Main VAE (base)"),
- io.Vae.Input(id="b", optional=True, lazy=True, tooltip="Optional 2nd VAE"),
- io.Vae.Input(id="c", optional=True, lazy=True, tooltip="Optional 3rd VAE"),
- io.Vae.Input(id="d", optional=True, lazy=True, tooltip="Optional 4th VAE"),
- io.Float.Input(id="w", default=0.0, lazy=True, optional=True, force_input=True),
- io.Float.Input(id="x", default=0.0, lazy=True, optional=True, force_input=True),
- io.Float.Input(id="y", default=0.0, lazy=True, optional=True, force_input=True),
- io.Float.Input(id="z", default=0.0, lazy=True, optional=True, force_input=True),
- io.String.Input(id="Model", default="a*(1-w)+b*w", tooltip="Expression to apply on weights"),
+ io.Autogrow.Input(id="V",template=io.Autogrow.TemplatePrefix(io.Vae.Input("values"), prefix="V", min=1, max=50)),
+ io.Autogrow.Input(id="F", template=io.Autogrow.TemplatePrefix(io.Float.Input("float", default=0.0, optional=True, lazy=True, force_input=True), prefix="F", min=1, max=50)),
+ io.String.Input(id="Expression", default="I0*(1-F0)+I1*F0", tooltip="Expression to apply on weights"),
io.Combo.Input(
id="length_mismatch",
- options=["broadcast", "passthrough", "pad"],
- default="broadcast",
+ options=["error", "error", "pad"],
+ default="error",
tooltip="How to handle mismatched layer counts. For models, this usually defaults to broadcast (zero for missing layers)."
)
],
@@ -41,17 +38,61 @@ class VAEMathNode(io.ComfyNode):
tooltip = cleandoc(__doc__)
@classmethod
- def check_lazy_status(cls, Model, a, b=[], c=[], d=[], w=0, x=0, y=0, z=0, length_mismatch="broadcast"):
- return commonLazy(Model, a, b, c, d, w, x, y, z)
+ def check_lazy_status(cls, Expression, V, F, length_mismatch="tile"):
+
+ input_stream = InputStream(Expression)
+ lexer = MathExprLexer(input_stream)
+ stream = CommonTokenStream(lexer)
+ stream.fill()
+
+ # Support aliases
+ aliases_img = {"a": "V0", "b": "V1", "c": "V2", "d": "V3"}
+ aliases_flt = {"w": "F0", "x": "F1", "y": "F2", "z": "F3"}
+
+ needed = []
+ needed1 = []
+ for token in filter(lambda t: t.type == MathExprParser.VARIABLE, stream.tokens):
+ var_name = token.text
+
+ if re.match(r"[VF][0-9]+", var_name):
+ needed.append(var_name)
+ elif var_name in aliases_img:
+ needed.append(aliases_img[var_name])
+ elif var_name in aliases_flt:
+ needed.append(aliases_flt[var_name])
+ for v in needed:
+ if v.startswith("V"):
+ if v not in V or V[v] is None:
+ needed1.append(v)
+ elif v.startswith("F"):
+ if v not in F or F[v] is None:
+ needed1.append(v)
+ return needed1
@classmethod
- def execute(cls, Model, a, b=None, c=None, d=None, w=0.0, x=0.0, y=0.0, z=0.0, length_mismatch="broadcast") -> io.NodeOutput:
- patcher_a = a.patcher
- patcher_b = b.patcher if b else None
- patcher_c = c.patcher if c else None
- patcher_d = d.patcher if d else None
+ def execute(cls, V, F, Expression, length_mismatch="tile") -> io.NodeOutput:
+ # Determine reference VAE
+ a = V.get("V0")
+ if a is None:
+ for m in V.values():
+ if m is not None:
+ a = m
+ break
+ if a is None:
+ raise ValueError("At least one input VAE is required.")
- patches = calculate_patches(Model, patcher_a, patcher_b, patcher_c, patcher_d, w, x, y, z)
+ patcher_a = a.patcher
+
+ # Prepare VAE patchers for calculation
+ # We need to map VAE wrappers to their patchers for `calculate_patches`
+
+ patchers_V = {}
+ for k, v in V.items():
+ if v is not None:
+ patchers_V[k] = v.patcher
+
+ # Calculate patches using the patchers (weights are in patcher.model.state_dict)
+ patches = calculate_patches(Expression, patcher_a, None, None, None, 0,0,0,0, V=patchers_V, F=F)
# VAE does not have a clone method, so we shallow copy and clone the patcher
out_vae = copy.copy(a)
diff --git a/more_math/VideoMathNode.py b/more_math/VideoMathNode.py
index ae609ba..422ca2e 100644
--- a/more_math/VideoMathNode.py
+++ b/more_math/VideoMathNode.py
@@ -41,7 +41,7 @@ class VideoMathNode(io.ComfyNode):
io.String.Input(id="Audio", default="a*(1-w)+b*w", tooltip="Expression for the audio component"),
io.Combo.Input(
id="length_mismatch",
- options=["tile", "error", "pad"],
+ options=["error", "error", "pad"],
default="error",
tooltip="How to handle mismatched frame/sample counts. tile: repeat shorter inputs; error: raise error on mismatch; pad: treat missing as zero."
)
diff --git a/more_math/deprecated/AudioMathNode.py b/more_math/deprecated/AudioMathNode.py
index 65aff81..4fad72b 100644
--- a/more_math/deprecated/AudioMathNode.py
+++ b/more_math/deprecated/AudioMathNode.py
@@ -34,7 +34,7 @@ class AudioMathNodeOLD(io.ComfyNode):
io.String.Input(id="Audio", default="a*(1-w)+b*w", tooltip="Expression to apply on input audio waveforms"),
io.Combo.Input(
id="length_mismatch",
- options=["tile", "error", "pad"],
+ options=["error", "error", "pad"],
default="error",
tooltip="How to handle mismatched audio sample counts. tile: repeat shorter inputs; error: raise error on mismatch; pad: treat missing samples as zero."
)
diff --git a/more_math/deprecated/ClipMathNode.py b/more_math/deprecated/ClipMathNode.py
new file mode 100644
index 0000000..079e31e
--- /dev/null
+++ b/more_math/deprecated/ClipMathNode.py
@@ -0,0 +1,59 @@
+from comfy_api.latest import io
+from ..modelLikeCommon import calculate_patches
+from inspect import cleandoc
+from ..helper_functions import commonLazy
+
+
+class CLIPMathNodeOLD(io.ComfyNode):
+ """
+ This node enables the use of math expressions on CLIP weights.
+ """
+
+ @classmethod
+ def define_schema(cls) -> io.Schema:
+ return io.Schema(
+ node_id="mrmth_CLIPMathNode",
+ display_name="CLIP Math",
+ category="More math",
+ is_deprecated=True,
+ inputs=[
+ io.Clip.Input(id="a", tooltip="Main CLIP (base)"),
+ io.Clip.Input(id="b", optional=True, lazy=True, tooltip="Optional 2nd CLIP"),
+ io.Clip.Input(id="c", optional=True, lazy=True, tooltip="Optional 3rd CLIP"),
+ io.Clip.Input(id="d", optional=True, lazy=True, tooltip="Optional 4th CLIP"),
+ io.Float.Input(id="w", default=0.0, optional=True, lazy=True, force_input=True),
+ io.Float.Input(id="x", default=0.0, optional=True, lazy=True, force_input=True),
+ io.Float.Input(id="y", default=0.0, optional=True, lazy=True, force_input=True),
+ io.Float.Input(id="z", default=0.0, optional=True, lazy=True, force_input=True),
+ io.String.Input(id="Model", default="a*(1-w)+b*w", tooltip="Expression to apply on weights"),
+ io.Combo.Input(
+ id="length_mismatch",
+ options=["error", "passthrough", "pad"],
+ default="error",
+ tooltip="How to handle mismatched layer counts. For models, this usually defaults to broadcast (zero for missing layers)."
+ )
+ ],
+ outputs=[
+ io.Clip.Output(),
+ ],
+ )
+
+ tooltip = cleandoc(__doc__)
+
+ @classmethod
+ def check_lazy_status(cls, Model, a, b=[], c=[], d=[], w=0, x=0, y=0, z=0, length_mismatch="tile"):
+ return commonLazy(Model, a, b, c, d, w, x, y, z)
+
+ @classmethod
+ def execute(cls, Model, a, b=None, c=None, d=None, w=0.0, x=0.0, y=0.0, z=0.0, length_mismatch="tile") -> io.NodeOutput:
+ patcher_a = a.patcher
+ patcher_b = b.patcher if b else None
+ patcher_c = c.patcher if c else None
+ patcher_d = d.patcher if d else None
+
+ patches = calculate_patches(Model, patcher_a, patcher_b, patcher_c, patcher_d, w, x, y, z)
+
+ out_clip = a.clone()
+ if patches:
+ out_clip.add_patches(patches, 1.0, 1.0)
+ return (out_clip,)
diff --git a/more_math/deprecated/ConditioningMathNode.py b/more_math/deprecated/ConditioningMathNode.py
index 81871f6..34cb8e5 100644
--- a/more_math/deprecated/ConditioningMathNode.py
+++ b/more_math/deprecated/ConditioningMathNode.py
@@ -39,7 +39,7 @@ class ConditioningMathNodeOLD(io.ComfyNode):
),
io.Combo.Input(
id="length_mismatch",
- options=["tile", "error", "pad"],
+ options=["error", "error", "pad"],
default="error",
tooltip="How to handle mismatched conditioning segment counts. tile: repeat shorter inputs; error: raise error on mismatch; pad: treat missing as zero."
)
diff --git a/more_math/deprecated/FloatMathNode.py b/more_math/deprecated/FloatMathNode.py
new file mode 100644
index 0000000..a93b951
--- /dev/null
+++ b/more_math/deprecated/FloatMathNode.py
@@ -0,0 +1,67 @@
+from inspect import cleandoc
+
+from ..helper_functions import parse_expr
+from ..Parser.UnifiedMathVisitor import UnifiedMathVisitor
+
+from ..helper_functions import commonLazy
+from comfy_api.latest import io
+
+
+class FloatMathNode(io.ComfyNode):
+ """
+ This node enables the use of math expressions on Floats.
+
+ Inputs:
+ a, b, c, d: Floats, bound to variables with the same name.
+ w, x, y, z: Floats, bound to variables of the expression.
+ FloatFunc: String, describing math expression.
+ Valid functions: sin, cos, tan, abs, sqrt, min, max, norm, etc.
+ Operators: +, -, *, /, ^, %.
+ Constants: e, pi.
+
+ Outputs:
+ FLOAT: The result of evaluating the math expression.
+ """
+
+ @classmethod
+ def define_schema(cls) -> io.Schema:
+ return io.Schema(
+ node_id="mrmth_FloatMathNode",
+ category="More math",
+ display_name="Float math",
+ inputs=[
+ io.Float.Input(id="a", force_input=True),
+ io.Float.Input(id="b", default=0.0, optional=True, lazy=True, force_input=True),
+ io.Float.Input(id="c", default=0.0, optional=True, lazy=True, force_input=True),
+ io.Float.Input(id="d", default=0.0, optional=True, lazy=True, force_input=True),
+ io.Float.Input(id="w", default=0.0, optional=True, lazy=True, force_input=True),
+ io.Float.Input(id="x", default=0.0, optional=True, lazy=True, force_input=True),
+ io.Float.Input(id="y", default=0.0, optional=True, lazy=True, force_input=True),
+ io.Float.Input(id="z", default=0.0, optional=True, lazy=True, force_input=True),
+ io.String.Input(id="FloatFunc", default="a*(1-w)+b*w", tooltip="Expression to use on inputs"),
+ ],
+ outputs=[
+ io.Float.Output(),
+ ],
+ )
+
+ tooltip = cleandoc(__doc__)
+
+ @classmethod
+ def check_lazy_status(cls, FloatFunc, a, b=[], c=[], d=[], w=0, x=0, y=0, z=0,):
+ return commonLazy(FloatFunc, a, b, c, d, w, x, y, z)
+
+ @classmethod
+ def execute(cls, FloatFunc, a, b=0.0, c=0.0, d=0.0, w=0.0, x=0.0, y=0.0, z=0.0):
+
+ variables = {
+ "a": a,
+ "b": b,
+ "c": c,
+ "d": d,
+ "w": w, "x": x, "y": y, "z": z
+ }
+ tree = parse_expr(FloatFunc);
+ visitor = UnifiedMathVisitor(variables, [1])
+ result = visitor.visit(tree)
+ return (result,)
diff --git a/more_math/deprecated/ImageMathNode.py b/more_math/deprecated/ImageMathNode.py
new file mode 100644
index 0000000..cb82b4d
--- /dev/null
+++ b/more_math/deprecated/ImageMathNode.py
@@ -0,0 +1,86 @@
+from ..helper_functions import generate_dim_variables, parse_expr, getIndexTensorAlongDim, as_tensor, prepare_inputs, commonLazy, normalize_to_common_shape
+from ..Parser.UnifiedMathVisitor import UnifiedMathVisitor
+from comfy_api.latest import io
+
+
+class ImageMathNodeOLD(io.ComfyNode):
+ """
+ Enables math expressions on Images.
+
+ Inputs:
+ a, b, c, d: Image inputs (b, c, d default to zero if not provided)
+ w, x, y, z: Float variables for expressions
+ Image: Expression to apply on input images
+
+ Outputs:
+ IMAGE: Result of applying expression to input images
+ """
+
+ @classmethod
+ def define_schema(cls) -> io.Schema:
+ return io.Schema(
+ node_id="mrmth_ImageMathNode",
+ category="More math",
+ display_name="Image math",
+ is_deprecated=True,
+ inputs=[
+ io.Image.Input(id="a"),
+ io.Image.Input(id="b", optional=True, lazy=True),
+ io.Image.Input(id="c", optional=True, lazy=True),
+ io.Image.Input(id="d", optional=True, lazy=True),
+ io.Float.Input(id="w", default=0.0, optional=True, lazy=True, force_input=True),
+ io.Float.Input(id="x", default=0.0, optional=True, lazy=True, force_input=True),
+ io.Float.Input(id="y", default=0.0, optional=True, lazy=True, force_input=True),
+ io.Float.Input(id="z", default=0.0, optional=True, lazy=True, force_input=True),
+ io.String.Input(id="Image", default="a*(1-w)+b*w", tooltip="Expression to apply on input images"),
+ io.Combo.Input(
+ id="length_mismatch",
+ options=["error", "error", "pad"],
+ default="error",
+ tooltip="How to handle mismatched image batch sizes. tile: repeat shorter inputs; error: raise error on mismatch; pad: treat missing frames as zero."
+ )
+ ],
+ outputs=[
+ io.Image.Output(),
+ ],
+ )
+
+ @classmethod
+ def check_lazy_status(cls, Image, a, b=[], c=[], d=[], w=0, x=0, y=0, z=0, length_mismatch="tile"):
+ return commonLazy(Image, a, b, c, d, w, x, y, z)
+
+ @classmethod
+ def execute(cls, Image, a, b=None, c=None, d=None, w=0.0, x=0.0, y=0.0, z=0.0, length_mismatch="tile"):
+ ae, be, ce, de = prepare_inputs(a, b, c, d)
+ print(f"DEBUG: shapes {ae.shape[0]}, {be.shape[0]}, {ce.shape[0]}, {de.shape[0]}")
+
+ if(length_mismatch == "error"):
+ max_length = max(ae.shape[0], be.shape[0], ce.shape[0], de.shape[0])
+ for tensor, name in zip([ae, be, ce, de], ["a", "b", "c", "d"]):
+ if tensor.shape[0] != max_length:
+ raise ValueError(f"Input '{name}' has shape {tensor.shape[0]}, expected {max_length} to match largest input.")
+ ae, be, ce, de = normalize_to_common_shape(ae, be, ce, de, mode=length_mismatch)
+
+ variables = {
+ "a": ae, "b": be, "c": ce, "d": de,
+ "w": w, "x": x, "y": y, "z": z,
+ "X": getIndexTensorAlongDim(ae, 3),
+ "Y": getIndexTensorAlongDim(ae, 2),
+ "B": getIndexTensorAlongDim(ae, 0),
+ "batch": getIndexTensorAlongDim(ae, 0),
+ "C": getIndexTensorAlongDim(ae, 1),
+ "channel": getIndexTensorAlongDim(ae, 1),
+ "W": ae.shape[2],
+ "width": ae.shape[2],
+ "H": ae.shape[1],
+ "height": ae.shape[1],
+ "T": ae.shape[0],
+ "batch_count": ae.shape[0],
+ "N": ae.shape[3],
+ "channel_count": ae.shape[3],
+ } | generate_dim_variables(ae)
+ tree = parse_expr(Image);
+ visitor = UnifiedMathVisitor(variables, ae.shape)
+ result = visitor.visit(tree)
+ result = as_tensor(result, ae.shape)
+ return (result,)
diff --git a/more_math/deprecated/LatentMathNode.py b/more_math/deprecated/LatentMathNode.py
new file mode 100644
index 0000000..4a80941
--- /dev/null
+++ b/more_math/deprecated/LatentMathNode.py
@@ -0,0 +1,160 @@
+from inspect import cleandoc
+from comfy_api.latest import io
+from ..helper_functions import (
+ generate_dim_variables,
+ getIndexTensorAlongDim,
+ parse_expr,
+ as_tensor,
+ normalize_to_common_shape,
+ prepare_inputs
+)
+from ..helper_functions import commonLazy
+from ..Parser.UnifiedMathVisitor import UnifiedMathVisitor
+import torch
+
+
+class LatentMathNodeOLD(io.ComfyNode):
+ """
+ This node enables the use of math expressions on Latents.
+ inputs:
+ a, b, c, d:
+ Latent, bound to variables with the same name. Defaults to zero latent if not provided.
+ w, x, y, z:
+ Floats, bound to variables of the expression. Defaults to 0.0 if not provided.
+ Latent expression:
+ String, describing expression to aply to latents.
+
+ outputs:
+ LATENT:
+ Returns a LATENT object that contains the result of the math expression applied to the input conditionings.
+ """
+
+ def __init__(self):
+ pass
+
+ @classmethod
+ def define_schema(cls) -> io.Schema:
+ """ """
+ return io.Schema(
+ node_id="mrmth_LatentMathNode",
+ display_name="Latent math",
+ category="More math",
+ is_deprecated=True,
+ inputs=[
+ io.Latent.Input(id="a"),
+ io.Latent.Input(id="b", optional=True, lazy=True),
+ io.Latent.Input(id="c", optional=True, lazy=True),
+ io.Latent.Input(id="d", optional=True, lazy=True),
+ io.Float.Input(id="w", default=0.0, optional=True, lazy=True, force_input=True),
+ io.Float.Input(id="x", default=0.0, optional=True, lazy=True, force_input=True),
+ io.Float.Input(id="y", default=0.0, optional=True, lazy=True, force_input=True),
+ io.Float.Input(id="z", default=0.0, optional=True, lazy=True, force_input=True),
+ io.String.Input(id="Latent", default="a*(1-w)+b*w", tooltip="Expression to apply on input latents"),
+ io.Combo.Input(
+ id="length_mismatch",
+ options=["error", "error", "pad"],
+ default="error",
+ tooltip="How to handle mismatched latent batch sizes. tile: repeat shorter inputs; error: raise error on mismatch; pad: treat missing frames as zero."
+ )
+ ],
+ outputs=[
+ io.Latent.Output(),
+ ],
+ )
+
+ tooltip = cleandoc(__doc__)
+
+ @classmethod
+ def check_lazy_status(cls, Latent, a, b=[], c=[], d=[], w=0, x=0, y=0, z=0, length_mismatch="tile"):
+ return commonLazy(Latent, a, b, c, d, w, x, y, z)
+
+ @classmethod
+ def execute(cls, Latent, a, b=None, c=None, d=None, w=0.0, x=0.0, y=0.0, z=0.0, length_mismatch="tile") -> io.NodeOutput:
+ # Identify if any input is a NestedTensor and track original sizes for restoration
+ stacked = False
+ orig_split_sizes = None
+
+ for item in [a, b, c, d]:
+ if item is not None:
+ samples = item.get("samples")
+ if getattr(samples, "is_nested", False):
+ stacked = True
+ # Store original split sizes (batch dimension)
+ orig_split_sizes = [t.shape[0] for t in samples.tensors]
+ break
+
+ if stacked:
+ if a is not None and getattr(a.get("samples"), "is_nested", False):
+ a = a.copy()
+ a["samples"] = torch.cat(a["samples"].tensors, dim=0)
+ if b is not None and getattr(b.get("samples"), "is_nested", False):
+ b = b.copy()
+ b["samples"] = torch.cat(b["samples"].tensors, dim=0)
+ if c is not None and getattr(c.get("samples"), "is_nested", False):
+ c = c.copy()
+ c["samples"] = torch.cat(c["samples"].tensors, dim=0)
+ if d is not None and getattr(d.get("samples"), "is_nested", False):
+ d = d.copy()
+ d["samples"] = torch.cat(d["samples"].tensors, dim=0)
+
+ a_c, b_c, c_c, d_c = prepare_inputs(a, b, c, d)
+ at,bt,ct,dt = a_c["samples"],b_c["samples"],c_c["samples"],d_c["samples"]
+ if(length_mismatch == "error"):
+ # Check only available tensors
+ tensors_to_check = [t for t in [at, bt, ct, dt] if t is not None]
+ max_length = max(t.shape[0] for t in tensors_to_check)
+ for tensor, name in zip([at, bt, ct, dt], ["a", "b", "c", "d"]):
+ if tensor is not None:
+ if tensor.shape[0] != max_length:
+ raise ValueError(f"Input '{name}' has shape {tensor.shape[0]}, expected {max_length} to match largest input.")
+ ae, be, ce, de = normalize_to_common_shape(at, bt, ct, dt, mode=length_mismatch)
+
+ # parse expression once
+ tree = parse_expr(Latent)
+
+ ndim = ae.ndim
+ batch_dim = 0
+ channel_dim = -3
+ height_dim = -2
+ width_dim = -1
+ time_dim = None
+ if ndim >= 5:
+ time_dim = -4
+
+ frame_count = ae.shape[time_dim] if time_dim is not None else ae.shape[batch_dim]
+
+ variables = {
+ "a": ae, "b": be, "c": ce, "d": de,
+ "w": w, "x": x, "y": y, "z": z,
+ "X": getIndexTensorAlongDim(ae, width_dim),
+ "Y": getIndexTensorAlongDim(ae, height_dim),
+ "B": getIndexTensorAlongDim(ae, batch_dim),
+ "batch": getIndexTensorAlongDim(ae, batch_dim),
+ "C": getIndexTensorAlongDim(ae, channel_dim),
+ "channel": getIndexTensorAlongDim(ae, channel_dim),
+ "W": ae.shape[width_dim],
+ "width": ae.shape[width_dim],
+ "H": ae.shape[height_dim],
+ "height": ae.shape[height_dim],
+ "T": frame_count,
+ "batch_count": ae.shape[batch_dim],
+ "N": ae.shape[channel_dim],
+ "channel_count": ae.shape[channel_dim],
+ } | generate_dim_variables(ae)
+
+ if time_dim is not None:
+ F = getIndexTensorAlongDim(ae, time_dim)
+ variables.update({"frame_idx": F, "frame": F, "frame_count": frame_count})
+
+ visitor = UnifiedMathVisitor(variables, ae.shape)
+ result_t = as_tensor(visitor.visit(tree), ae.shape)
+
+ result_latent = a_c.copy()
+ if stacked and orig_split_sizes is not None:
+ from comfy.nested_tensor import NestedTensor
+ # Restore original split sizes
+ result_latent["samples"] = NestedTensor(torch.split(result_t, orig_split_sizes, dim=0))
+ else:
+ result_latent["samples"] = result_t
+
+ return (result_latent,)
diff --git a/more_math/deprecated/MaskMathNode.py b/more_math/deprecated/MaskMathNode.py
new file mode 100644
index 0000000..8b92c62
--- /dev/null
+++ b/more_math/deprecated/MaskMathNode.py
@@ -0,0 +1,83 @@
+from ..helper_functions import generate_dim_variables,parse_expr, getIndexTensorAlongDim, as_tensor, commonLazy, normalize_to_common_shape,prepare_inputs
+from ..Parser.UnifiedMathVisitor import UnifiedMathVisitor
+from comfy_api.latest import io
+
+
+
+
+class MaskMathNodeOLD(io.ComfyNode):
+ """
+ Enables math expressions on Masks.
+
+ Inputs:
+ a, b, c, d: Mask inputs (b, c, d default to zero if not provided)
+ w, x, y, z: Float variables for expressions
+ Mask: Expression to apply on input masks
+
+ Outputs:
+ MASK: Result of applying expression to input masks
+ """
+
+ @classmethod
+ def define_schema(cls) -> io.Schema:
+ return io.Schema(
+ node_id="mrmth_MaskMathNode",
+ category="More math",
+ display_name="Mask math",
+ is_deprecated=True,
+ inputs=[
+ io.Mask.Input(id="a"),
+ io.Mask.Input(id="b", optional=True, lazy=True),
+ io.Mask.Input(id="c", optional=True, lazy=True),
+ io.Mask.Input(id="d", optional=True, lazy=True),
+ io.Float.Input(id="w", default=0.0, optional=True, lazy=True, force_input=True),
+ io.Float.Input(id="x", default=0.0, optional=True, lazy=True, force_input=True),
+ io.Float.Input(id="y", default=0.0, optional=True, lazy=True, force_input=True),
+ io.Float.Input(id="z", default=0.0, optional=True, lazy=True, force_input=True),
+ io.String.Input(id="Mask", default="a*(1-w)+b*w", tooltip="Expression to apply on input masks"),
+ io.Combo.Input(
+ id="length_mismatch",
+ options=["error", "error", "pad"],
+ default="error",
+ tooltip="How to handle mismatched mask batch sizes. tile: repeat shorter inputs; error: raise error on mismatch; pad: treat missing frames as zero."
+ )
+ ],
+ outputs=[
+ io.Mask.Output(),
+ ],
+ )
+
+ @classmethod
+ def check_lazy_status(cls, Mask, a, b=[], c=[], d=[], w=0, x=0, y=0, z=0, length_mismatch="tile"):
+ return commonLazy(Mask, a, b, c, d, w, x, y, z)
+
+ @classmethod
+ def execute(cls, Mask, a, b=None, c=None, d=None, w=0.0, x=0.0, y=0.0, z=0.0, length_mismatch="tile"):
+ a, b, c, d = prepare_inputs(a, b, c, d)
+
+ if(length_mismatch == "error"):
+ max_length = max(a.shape[0], b.shape[0], c.shape[0], d.shape[0])
+ for tensor, name in zip([a, b, c, d], ["a", "b", "c", "d"]):
+ if tensor.shape[0] != max_length:
+ raise ValueError(f"Input '{name}' has shape {tensor.shape[0]}, expected {max_length} to match largest input.")
+ ae, be, ce, de = normalize_to_common_shape(a, b, c, d, mode=length_mismatch)
+
+ variables = {
+ "a": ae, "b": be, "c": ce, "d": de,
+ "w": w, "x": x, "y": y, "z": z,
+ "X": getIndexTensorAlongDim(ae, 2),
+ "Y": getIndexTensorAlongDim(ae, 1),
+ "B": getIndexTensorAlongDim(ae, 0),
+ "batch": getIndexTensorAlongDim(ae, 0),
+ "W": ae.shape[2],
+ "width": ae.shape[2],
+ "H": ae.shape[1],
+ "height": ae.shape[1],
+ "T": ae.shape[0],
+ "batch_count": ae.shape[0],
+ } | generate_dim_variables(ae)
+ tree = parse_expr(Mask);
+ visitor = UnifiedMathVisitor(variables, ae.shape)
+ result = visitor.visit(tree)
+ result = as_tensor(result, ae.shape)
+ return (result,)
diff --git a/more_math/deprecated/ModelMathNode.py b/more_math/deprecated/ModelMathNode.py
new file mode 100644
index 0000000..919f412
--- /dev/null
+++ b/more_math/deprecated/ModelMathNode.py
@@ -0,0 +1,54 @@
+from inspect import cleandoc
+from comfy_api.latest import io
+from ..helper_functions import commonLazy
+from ..modelLikeCommon import calculate_patches
+
+
+class ModelMathNodeOLD(io.ComfyNode):
+ """
+ This node enables the use of math expressions on Model weights (state_dict).
+ Functionally acts as a custom model merge.
+ """
+
+ @classmethod
+ def define_schema(cls) -> io.Schema:
+ return io.Schema(
+ node_id="mrmth_ModelMathNode",
+ display_name="Model Math",
+ category="More math",
+ is_deprecated=True,
+ inputs=[
+ io.Model.Input(id="a", tooltip="Main model (base)"),
+ io.Model.Input(id="b", optional=True, lazy=True, tooltip="Optional 2nd model"),
+ io.Model.Input(id="c", optional=True, lazy=True, tooltip="Optional 3rd model"),
+ io.Model.Input(id="d", optional=True, lazy=True, tooltip="Optional 4th model"),
+ io.Float.Input(id="w", default=0.0, optional=True, lazy=True, force_input=True),
+ io.Float.Input(id="x", default=0.0, optional=True, lazy=True, force_input=True),
+ io.Float.Input(id="y", default=0.0, optional=True, lazy=True, force_input=True),
+ io.Float.Input(id="z", default=0.0, optional=True, lazy=True, force_input=True),
+ io.String.Input(id="Model", default="a*(1-w)+b*w", tooltip="Expression to apply on weights"),
+ io.Combo.Input(
+ id="length_mismatch",
+ options=["error", "passthrough", "pad"],
+ default="error",
+ tooltip="How to handle mismatched layer counts. For models, this usually defaults to broadcast (zero for missing layers)."
+ )
+ ],
+ outputs=[
+ io.Model.Output(),
+ ],
+ )
+
+ tooltip = cleandoc(__doc__)
+
+ @classmethod
+ def check_lazy_status(cls, Model, a, b=[], c=[], d=[], w=0, x=0, y=0, z=0, length_mismatch="tile"):
+ return commonLazy(Model, a, b, c, d, w, x, y, z)
+
+ @classmethod
+ def execute(cls, Model, a, b=None, c=None, d=None, w=0.0, x=0.0, y=0.0, z=0.0, length_mismatch="tile") -> io.NodeOutput:
+ patches = calculate_patches(Model, a, b, c, d, w, x, y, z)
+ out_model = a.clone()
+ if patches:
+ out_model.add_patches(patches, 1.0, 1.0)
+ return (out_model,)
diff --git a/more_math/deprecated/VaeMathNode.py b/more_math/deprecated/VaeMathNode.py
new file mode 100644
index 0000000..9e29ffd
--- /dev/null
+++ b/more_math/deprecated/VaeMathNode.py
@@ -0,0 +1,64 @@
+from inspect import cleandoc
+from comfy_api.latest import io
+import copy
+from ..modelLikeCommon import calculate_patches
+from ..helper_functions import commonLazy
+
+
+class VAEMathNodeOLD(io.ComfyNode):
+ """
+ This node enables the use of math expressions on VAE weights.
+ """
+
+ @classmethod
+ def define_schema(cls) -> io.Schema:
+ return io.Schema(
+ node_id="mrmth_VAEMathNode",
+ display_name="VAE Math",
+ category="More math",
+ is_deprecated=True,
+ inputs=[
+ io.Vae.Input(id="a", tooltip="Main VAE (base)"),
+ io.Vae.Input(id="b", optional=True, lazy=True, tooltip="Optional 2nd VAE"),
+ io.Vae.Input(id="c", optional=True, lazy=True, tooltip="Optional 3rd VAE"),
+ io.Vae.Input(id="d", optional=True, lazy=True, tooltip="Optional 4th VAE"),
+ io.Float.Input(id="w", default=0.0, lazy=True, optional=True, force_input=True),
+ io.Float.Input(id="x", default=0.0, lazy=True, optional=True, force_input=True),
+ io.Float.Input(id="y", default=0.0, lazy=True, optional=True, force_input=True),
+ io.Float.Input(id="z", default=0.0, lazy=True, optional=True, force_input=True),
+ io.String.Input(id="Model", default="a*(1-w)+b*w", tooltip="Expression to apply on weights"),
+ io.Combo.Input(
+ id="length_mismatch",
+ options=["error", "passthrough", "pad"],
+ default="error",
+ tooltip="How to handle mismatched layer counts. For models, this usually defaults to broadcast (zero for missing layers)."
+ )
+ ],
+ outputs=[
+ io.Vae.Output(),
+ ],
+ )
+
+ tooltip = cleandoc(__doc__)
+
+ @classmethod
+ def check_lazy_status(cls, Model, a, b=[], c=[], d=[], w=0, x=0, y=0, z=0, length_mismatch="tile"):
+ return commonLazy(Model, a, b, c, d, w, x, y, z)
+
+ @classmethod
+ def execute(cls, Model, a, b=None, c=None, d=None, w=0.0, x=0.0, y=0.0, z=0.0, length_mismatch="tile") -> io.NodeOutput:
+ patcher_a = a.patcher
+ patcher_b = b.patcher if b else None
+ patcher_c = c.patcher if c else None
+ patcher_d = d.patcher if d else None
+
+ patches = calculate_patches(Model, patcher_a, patcher_b, patcher_c, patcher_d, w, x, y, z)
+
+ # VAE does not have a clone method, so we shallow copy and clone the patcher
+ out_vae = copy.copy(a)
+ out_vae.patcher = a.patcher.clone()
+
+ if patches:
+ out_vae.patcher.add_patches(patches, 1.0, 1.0)
+
+ return (out_vae,)
diff --git a/more_math/modelLikeCommon.py b/more_math/modelLikeCommon.py
index 3a03d80..5cec8e8 100644
--- a/more_math/modelLikeCommon.py
+++ b/more_math/modelLikeCommon.py
@@ -1,68 +1,151 @@
-import torch
-import comfy.utils
-
-from .helper_functions import getIndexTensorAlongDim, parse_expr, as_tensor
+from .helper_functions import parse_expr
from .Parser.UnifiedMathVisitor import UnifiedMathVisitor
+from .Parser.MathExprParser import MathExprParser
+from antlr4 import InputStream, CommonTokenStream
+from .Parser.MathExprLexer import MathExprLexer
+import torch
+import re
-def calculate_patches(Model, a, b=None, c=None, d=None, w=0.0, x=0.0, y=0.0, z=0.0):
- """Calculate model weight patches by applying math expression to state dicts."""
- # Parse expression once
- tree = parse_expr(Model)
+def calculate_patches(Expr, a, b=None, c=None, d=None, w=0.0, x=0.0, y=0.0, z=0.0, V=None, F=None):
+ """
+ Calculate patches for model-like objects (Model, VAE, CLIP).
+ Supports legacy a-d, w-z inputs and Autogrow V/F dictionaries.
+ """
+ if V is None: V = {}
+ if F is None: F = {}
- sd_a = a.model.state_dict()
- sd_b = b.model.state_dict() if b is not None else {}
- sd_c = c.model.state_dict() if c is not None else {}
- sd_d = d.model.state_dict() if d is not None else {}
+ # Map legacy inputs to V/F if provided
+ # Note: caller is expected to handle V0=a mapping if using mixed mode,
+ # but strictly we should operate on one set.
+ # We will prioritize V/F but populate from a-d if V is empty to support legacy calls if any.
+
+ # Actually, simpler: Populate variables with legacy, then override/extend with V/F
+
+ variables = {}
+
+ # 1. Base variables (legacy)
+ variables["a"] = a
+ if b: variables["b"] = b
+ if c: variables["c"] = c
+ if d: variables["d"] = d
+
+ variables["w"] = w
+ variables["x"] = x
+ variables["y"] = y
+ variables["z"] = z
+
+ # 2. Autogrow variables
+ for k, v in V.items():
+ if v is not None:
+ variables[k] = v
+ for k, v in F.items():
+ if v is not None:
+ variables[k] = v
+ # 3. Aliases validation (ensure V0 exists if a is used etc? logic handled by visitor?)
+ # The visitor just needs values.
+
+ # We need to find all keys in the state dicts of all provided models
+ models = [m for m in [a, b, c, d] if m is not None] + [v for v in V.values() if v is not None]
+ if not models:
+ return {}
+
+ # Use first model as reference for keys
+ ref_model = models[0]
+ # For Model/CLIP/VAE wrappers, the keys are usually in the patcher or we iterate available keys?
+ # standard ComfyUI model patching usually involves iterating keys in `model.get_key_patches(key)` or similar.
+ # But here we are likely operating on the weights directly or creating a patch dict.
+
+ # ComfyUI ModelPatcher logic:
+ # We want to return a dict of {key: (weight, patch_func)} or just calculated weights?
+ # ModelMathNode.execute acts as a merge.
+ # calculate_patches typically iterates over all keys present in 'a' (or union of all).
+
+ # Heuristic: collect all keys from all models
+ # Objects might be ModelPatcher or the Model wrapper.
+ # If it's a ComfyNode input of type MODEL, it's a ModelPatcher.
+
+ # Let's inspect one model to see attributes.
+ # Assuming standard Comfy `comfy.model_patcher.ModelPatcher`
+
+ all_keys = set()
+ for m in models:
+ if hasattr(m, "model") and hasattr(m.model, "state_dict"):
+ all_keys.update(m.model.state_dict().keys())
+ elif hasattr(m, "state_dict"): # VAE might have state_dict directly?
+ all_keys.update(m.state_dict().keys())
+
+ # Function to get weight from a valid object
+ def get_weight(obj, key):
+ if hasattr(obj, "model") and hasattr(obj.model, "state_dict"):
+ sd = obj.model.state_dict()
+ return sd.get(key, None)
+ if hasattr(obj, "state_dict"):
+ sd = obj.state_dict()
+ return sd.get(key, None)
+ return None
+
+ # Parse expression
+ tree = parse_expr(Expr)
+
patches = {}
- layer_count = len(sd_a)
- pbar = comfy.utils.ProgressBar(layer_count)
+
+ for key in all_keys:
+ # Prepare variables for this key
+ local_vars = variables.copy()
+
+ # Inject weights for this key
+ # We need to replace model objects in `local_vars` with their specific weight tensor for `key`
+ # If a model doesn't have the key, treat as zero? Or skip?
+ # Helper logic:
+ # The variables dict currently holds Model objects.
+ # We need to context-switch them to Tensors for the visitor.
+
+ valid_key = False
+
+ # Update local_vars with tensor values
+ for var_name, var_val in variables.items():
+ # Skip floats (w, x, y, z, F*)
+ if isinstance(var_val, (float, int)):
+ continue
+
+ # Assume it's a model-like object
+ w_tensor = get_weight(var_val, key)
+ if w_tensor is not None:
+ local_vars[var_name] = w_tensor
+ valid_key = True # Found at least one model with this key
+ else:
+ # If model is missing key, what to do?
+ # For now, maybe set to None? Visitor might handle or fail.
+ # If we set to 0-tensor, we need shape.
+ # We can find shape from other models.
+ pass
+
+ if not valid_key:
+ continue
- for i, (key, tens_a) in enumerate(sd_a.items()):
- # Get tensors from other models, default to zeros
- tens_b = sd_b.get(key)
- tens_b = tens_b.to(tens_a.device) if tens_b is not None else torch.zeros_like(tens_a)
-
- tens_c = sd_c.get(key)
- tens_c = tens_c.to(tens_a.device) if tens_c is not None else torch.zeros_like(tens_a)
-
- tens_d = sd_d.get(key)
- tens_d = tens_d.to(tens_a.device) if tens_d is not None else torch.zeros_like(tens_a)
-
- # Build variables
- variables = {
- "a": tens_a,
- "b": tens_b,
- "c": tens_c,
- "d": tens_d,
- "w": w,
- "x": x,
- "y": y,
- "z": z,
- "L": i,
- "layer": i,
- "LC": layer_count,
- "layer_count": layer_count,
- }
-
- # Add dimension index tensors
- for dim_idx in range(tens_a.ndim):
- idx_tensor = getIndexTensorAlongDim(tens_a, dim_idx)
- variables[f"D{dim_idx}"] = idx_tensor
- variables[f"dim_{dim_idx}"] = idx_tensor
-
- tree = parse_expr(Model);
- visitor = UnifiedMathVisitor(variables, tens_a.shape)
- result_tensor = visitor.visit(tree)
- result_tensor = as_tensor(result_tensor, tens_a.shape)
-
- # Calculate patch (diff from original)
- diff = result_tensor - tens_a
-
- # Skip zero patches to save memory
- if not torch.all(diff == 0):
- patches[key] = (diff,)
-
- pbar.update(1)
+ # Handle missing keys by initializing to zeros of matching shape
+ # Find a reference tensor for shape
+ ref_tensor = None
+ for v in local_vars.values():
+ if torch.is_tensor(v):
+ ref_tensor = v
+ break
+
+ if ref_tensor is not None:
+ for var_name in variables.keys():
+ if var_name not in local_vars or local_vars[var_name] is None:
+ if not isinstance(variables[var_name], (float, int)): # it's a missing model weight
+ local_vars[var_name] = torch.zeros_like(ref_tensor)
+ # Execute math
+ try:
+ visitor = UnifiedMathVisitor(local_vars, ref_tensor.shape if ref_tensor is not None else [1])
+ res = visitor.visit(tree)
+ if torch.is_tensor(res):
+ patches[key] = res
+ except Exception as e:
+ # print(f"Error calculating patch for key {key}: {e}")
+ pass
+
return patches
diff --git a/more_math/nodes.py b/more_math/nodes.py
index 46e4f3c..55776fe 100644
--- a/more_math/nodes.py
+++ b/more_math/nodes.py
@@ -3,6 +3,13 @@ from .GuiderMathNode import GuiderMathNode
from .deprecated.NoiseMathNode import NoiseMathNodeOLD
from .deprecated.AudioMathNode import AudioMathNodeOLD
from .deprecated.ConditioningMathNode import ConditioningMathNodeOLD
+from .deprecated.ImageMathNode import ImageMathNodeOLD
+from .deprecated.LatentMathNode import LatentMathNodeOLD
+from .deprecated.MaskMathNode import MaskMathNodeOLD
+from .deprecated.ModelMathNode import ModelMathNodeOLD
+from .deprecated.VaeMathNode import VAEMathNodeOLD
+from .deprecated.ClipMathNode import CLIPMathNodeOLD
+
from .FloatMathNode import FloatMathNode
from .ConditioningMathNode import ConditioningMathNode
from .LatentMathNode import LatentMathNode
@@ -81,11 +88,17 @@ class MoreMathExtension(ComfyExtension):
ConditioningMathNode,
ConditioningMathNodeOLD,
ModelMathNode,
+ ModelMathNodeOLD,
CLIPMathNode,
+ CLIPMathNodeOLD,
VAEMathNode,
+ VAEMathNodeOLD,
LatentMathNode,
+ LatentMathNodeOLD,
ImageMathNode,
+ ImageMathNodeOLD,
MaskMathNode,
+ MaskMathNodeOLD,
FloatMathNode,
NoiseMathNodeOLD,
IntToFloatNode,
diff --git a/tests/test_deprecated_nodes.py b/tests/test_deprecated_nodes.py
new file mode 100644
index 0000000..183100a
--- /dev/null
+++ b/tests/test_deprecated_nodes.py
@@ -0,0 +1,115 @@
+import torch
+import sys
+import os
+
+# Ensure test runner usage (Visual Studio) can import the package regardless of working dir.
+_here = os.path.abspath(os.path.dirname(__file__))
+_project_root = os.path.abspath(os.path.join(_here, os.pardir))
+if _project_root not in sys.path:
+ sys.path.insert(0, _project_root)
+
+# Add ComfyUI root to path to find 'comfy' and 'comfy_api' packages
+_comfy_root = os.path.abspath(os.path.join(_here, "../../.."))
+if _comfy_root not in sys.path:
+ sys.path.insert(0, _comfy_root)
+
+from more_math.deprecated.ImageMathNode import ImageMathNodeOLD
+from more_math.deprecated.LatentMathNode import LatentMathNodeOLD
+from more_math.deprecated.MaskMathNode import MaskMathNodeOLD
+from more_math.deprecated.AudioMathNode import AudioMathNodeOLD
+from more_math.deprecated.ModelMathNode import ModelMathNodeOLD
+from more_math.deprecated.VaeMathNode import VAEMathNodeOLD
+from more_math.deprecated.ClipMathNode import CLIPMathNodeOLD
+import comfy_api
+
+# Mock objects for Model/VAE/CLIP tests
+class MockModelPatcher:
+ def __init__(self, state_dict):
+ self.model = comfy_api.Model()
+ self.model.state_dict = lambda: state_dict
+ self.patches = {}
+
+ def clone(self):
+ new_patcher = MockModelPatcher(self.model.state_dict())
+ return new_patcher
+
+ def add_patches(self, patches, strength1, strength2):
+ self.patches.update(patches)
+
+class MockPatcherContainer:
+ def __init__(self, state_dict):
+ self.patcher = MockModelPatcher(state_dict)
+
+ def clone(self):
+ new_obj = MockPatcherContainer(self.patcher.model.state_dict())
+ new_obj.patcher = self.patcher.clone()
+ return new_obj
+
+ def add_patches(self, patches, s1, s2):
+ self.patcher.add_patches(patches, s1, s2)
+
+class MockVAE(MockPatcherContainer):
+ pass # VAE structure is similar enough for simple patching test
+
+def test_deprecated_image_math():
+ t1 = torch.zeros((1, 32, 32, 3))
+ t2 = torch.full((1, 32, 32, 3), 1.0)
+ # OLD signature: Image, a, b=...
+ res = ImageMathNodeOLD.execute(Image="a+b", a=t1, b=t2)[0]
+ assert torch.allclose(res, torch.ones_like(res))
+
+def test_deprecated_latent_math():
+ l1 = {"samples": torch.zeros((1, 4, 32, 32))}
+ l2 = {"samples": torch.full((1, 4, 32, 32), 1.0)}
+ # OLD signature: Latent, a, b=...
+ res = LatentMathNodeOLD.execute(Latent="a+b", a=l1, b=l2)[0]["samples"]
+ assert torch.allclose(res, torch.ones_like(res))
+
+def test_deprecated_mask_math():
+ m1 = torch.zeros((1, 32, 32))
+ m2 = torch.full((1, 32, 32), 1.0)
+ # OLD signature: Mask, a, b=...
+ res = MaskMathNodeOLD.execute(Mask="a+b", a=m1, b=m2)[0]
+ assert torch.allclose(res, torch.ones_like(res))
+
+def test_deprecated_audio_math():
+ a1 = {"waveform": torch.zeros((1, 1, 100)), "sample_rate": 44100}
+ a2 = {"waveform": torch.full((1, 1, 100), 1.0), "sample_rate": 44100}
+ # OLD signature: Audio, a, b=...
+ res = AudioMathNodeOLD.execute(Audio="a+b", a=a1, b=a2)[0]["waveform"]
+ assert torch.allclose(res, torch.ones_like(res))
+
+def test_deprecated_model_math():
+ sd_a = {"w": torch.tensor([1.0])}
+ sd_b = {"w": torch.tensor([2.0])}
+ patcher_a = MockModelPatcher(sd_a)
+ patcher_b = MockModelPatcher(sd_b)
+
+ # OLD signature: Model, a, b=...
+ res = ModelMathNodeOLD.execute(Model="a+b", a=patcher_a, b=patcher_b)[0]
+ print(f"DEBUG: res.patches keys: {res.patches.keys()}")
+ if "w" in res.patches:
+ print(f"DEBUG: res.patches['w']: {res.patches['w']}")
+ # a+b = 1+2 = 3. diff = 3-1 = 2.
+ assert "w" in res.patches
+ assert torch.allclose(res.patches["w"][0], torch.tensor([2.0]))
+
+def test_deprecated_vae_math():
+ sd_a = {"w": torch.tensor([1.0])}
+ vae_a = MockVAE(sd_a) # VAE wrapper
+
+ # OLD signature: Model, a, b=... (Note: VAE node param name was Model in old schema too)
+ res = VAEMathNodeOLD.execute(Model="a+1", a=vae_a)[0]
+ # 1+1=2. diff=1.
+ assert "w" in res.patcher.patches
+ assert torch.allclose(res.patcher.patches["w"][0], torch.tensor([1.0]))
+
+def test_deprecated_clip_math():
+ sd_a = {"w": torch.tensor([1.0])}
+ clip_a = MockPatcherContainer(sd_a)
+
+ # OLD signature: Model, a, b=...
+ res = CLIPMathNodeOLD.execute(Model="a*2", a=clip_a)[0]
+ # 1*2=2. diff=1.
+ assert "w" in res.patcher.patches
+ assert torch.allclose(res.patcher.patches["w"][0], torch.tensor([1.0]))
diff --git a/tests/test_model_math.py b/tests/test_model_math.py
index 6847e4a..4896cc7 100644
--- a/tests/test_model_math.py
+++ b/tests/test_model_math.py
@@ -49,7 +49,7 @@ def test_model_math_simple_add():
expr = "a + b"
# Execute
- result_tuple = ModelMathNode.execute(expr, a, b=b)
+ result_tuple = ModelMathNode.execute(Expression=expr, V={"V0": a, "V1": b}, F={})
result_model = result_tuple[0]
# Verify patches
@@ -81,7 +81,7 @@ def test_model_math_zero_default():
# diff = 10 - 10 = 0.
# Should skip patch.
- result_tuple = ModelMathNode.execute("a + b", a, b=None)
+ result_tuple = ModelMathNode.execute(Expression="a + b", V={"V0": a}, F={})
result_model = result_tuple[0]
assert len(result_model.patches) == 0
@@ -94,7 +94,7 @@ def test_model_math_custom_formula():
# expr: a * w
# w input = 0.5
- result_tuple = ModelMathNode.execute("a * w", a, w=0.5)
+ result_tuple = ModelMathNode.execute(Expression="a * w", V={"V0": a}, F={"F0": 0.5})
result_model = result_tuple[0]
# res = 2.0 * 0.5 = 1.0
@@ -168,7 +168,7 @@ def test_clip_math():
sd_a = {"text_model.encoder.layers.0.mlp.fc1.weight": torch.tensor([1.0])}
clip_a = MockPatcherContainer(sd_a)
- result_tuple = CLIPMathNode.execute("a * 2", clip_a)
+ result_tuple = CLIPMathNode.execute(Expression="a * 2", V={"V0": clip_a}, F={})
result_clip = result_tuple[0]
# 1.0 * 2 = 2.0. diff = 1.0.
@@ -193,7 +193,7 @@ def test_vae_math():
vae_a = MockVAE(sd_a)
- result_tuple = VAEMathNode.execute("a + 1", vae_a)
+ result_tuple = VAEMathNode.execute(Expression="a + 1", V={"V0": vae_a}, F={})
result_vae = result_tuple[0]
# Check if result is a copy (not same object)
@@ -224,7 +224,7 @@ def test_model_math_disjoint_keys():
# common: 1 + 2 = 3. diff = 2.
# extra_b: should NOT be in patches because loop is over 'a'
- result_tuple = ModelMathNode.execute("a + b", a.patcher, b=b.patcher)
+ result_tuple = ModelMathNode.execute(Expression="a + b", V={"V0": a.patcher, "V1": b.patcher}, F={})
patches = result_tuple[0].patches
assert "common" in patches
@@ -243,7 +243,7 @@ def test_model_math_weighted_merge():
# expr: lerp(a, b, w) with w=0.5 -> 15.0
# diff = 15 - 10 = 5.
- result_tuple = ModelMathNode.execute("lerp(a, b, w)", a.patcher, b=b.patcher, w=0.5)
+ result_tuple = ModelMathNode.execute(Expression="lerp(a, b, w)", V={"V0": a.patcher, "V1": b.patcher}, F={"F0": 0.5})
patches = result_tuple[0].patches
assert "w" in patches
diff --git a/tests/test_more_math.py b/tests/test_more_math.py
index 27684b0..c2340ed 100644
--- a/tests/test_more_math.py
+++ b/tests/test_more_math.py
@@ -77,7 +77,10 @@ def test_fft_invertibility():
input_tensor = torch.randn(1, 4, 32, 32, dtype=torch.float32)
input_dict = {"samples": input_tensor}
# Execute ifft(fft(a))
- result = LatentMathNode.execute(Latent="ifft(fft(a))", a=input_dict)
+ # Execute ifft(fft(a))
+ # Execute ifft(fft(a))
+ input_V = {"V0": input_dict}
+ result = LatentMathNode.execute(Expression="ifft(fft(a))", V=input_V, F={})
output_tensor = result[0]["samples"]
assert torch.allclose(input_tensor, output_tensor, atol=1e-5), f"Max difference: {(input_tensor - output_tensor).abs().max()}"
@@ -85,7 +88,7 @@ def test_fft_invertibility():
def test_image_fft_dims():
# Image input is (Batch, Height, Width, Channel)
input_tensor = torch.randn(1, 32, 32, 3, dtype=torch.float32)
- result = ImageMathNode.execute(Image="ifft(fft(a))", a=input_tensor)
+ result = ImageMathNode.execute(Expression="ifft(fft(a))", V={"V0": input_tensor}, F={})
output_tensor = result[0]
assert input_tensor.shape == output_tensor.shape
assert torch.allclose(input_tensor, output_tensor, atol=1e-5), (
@@ -102,21 +105,21 @@ def test_latent_lerp():
node = LatentMathNode()
l_a = {"samples": torch.zeros(1, 4, 32, 32)}
l_b = {"samples": torch.full((1, 4, 32, 32), 10.0)}
- res_lerp = node.execute("lerp(a, b, 0.5)", a=l_a, b=l_b)[0]["samples"]
+ res_lerp = node.execute(Expression="lerp(a, b, 0.5)", V={"V0": l_a, "V1": l_b}, F={})[0]["samples"]
assert torch.allclose(res_lerp, torch.full_like(res_lerp, 5.0))
def test_latent_step_true():
node = LatentMathNode()
# step(x, edge) where x=0.8, edge=0.5 -> 1
- res_step = node.execute("step(a, 0.5)", a={"samples": torch.full((1, 1, 1, 1), 0.8)})[0]["samples"]
+ res_step = node.execute(Expression="step(a, 0.5)", V={"V0": {"samples": torch.full((1, 1, 1, 1), 0.8)}}, F={})[0]["samples"]
assert torch.allclose(res_step, torch.ones_like(res_step))
def test_latent_step_false():
node = LatentMathNode()
# step(x, edge) where x=0.2, edge=0.5 -> 0
- res_step2 = node.execute("step(a, 0.5)", a={"samples": torch.full((1, 1, 1, 1), 0.2)})[0]["samples"]
+ res_step2 = node.execute(Expression="step(a, 0.5)", V={"V0": {"samples": torch.full((1, 1, 1, 1), 0.2)}}, F={})[0]["samples"]
assert torch.allclose(res_step2, torch.zeros_like(res_step2))
@@ -125,7 +128,7 @@ def test_latent_swap():
t_lat = torch.tensor([0.0, 10.0, 20.0, 30.0]).view(1, 4, 1, 1)
# Swap channels 0 and 3 -> 30, 10, 20, 0
l_swap = {"samples": t_lat}
- res_swap = node.execute("swap(a, 1, 0, 3)", a=l_swap)[0]["samples"]
+ res_swap = node.execute(Expression="swap(a, 1, 0, 3)", V={"V0": l_swap}, F={})[0]["samples"]
expected = torch.tensor([30.0, 10.0, 20.0, 0.0]).view(1, 4, 1, 1)
assert torch.allclose(res_swap, expected)
@@ -133,21 +136,21 @@ def test_latent_swap():
def test_latent_relu():
node = LatentMathNode()
l_a = {"samples": torch.zeros(1, 4, 32, 32)}
- res_relu = node.execute("relu(-5.0)", a=l_a)[0]["samples"]
+ res_relu = node.execute(Expression="relu(-5.0)", V={"V0": l_a}, F={})[0]["samples"]
assert torch.allclose(res_relu, torch.zeros_like(res_relu))
def test_latent_sign():
node = LatentMathNode()
l_a = {"samples": torch.zeros(1, 4, 32, 32)}
- res_sign = node.execute("sign(-5.0)", a=l_a)[0]["samples"]
+ res_sign = node.execute(Expression="sign(-5.0)", V={"V0": l_a}, F={})[0]["samples"]
assert torch.allclose(res_sign, torch.full_like(res_sign, -1.0))
def test_latent_fract():
node = LatentMathNode()
l_a = {"samples": torch.zeros(1, 4, 32, 32)}
- res_fract = node.execute("fract(1.5)", a=l_a)[0]["samples"]
+ res_fract = node.execute(Expression="fract(1.5)", V={"V0": l_a}, F={})[0]["samples"]
assert torch.allclose(res_fract, torch.full_like(res_fract, 0.5))
@@ -158,25 +161,25 @@ def test_latent_fract():
def test_float_lerp():
node = FloatMathNode()
- res = node.execute("lerp(a, b, 0.5)", a=0.0, b=10.0)[0]
+ res = node.execute(FloatFunc="lerp(a, b, 0.5)", V={"V0": 0.0, "V1": 10.0})[0]
assert abs(res - 5.0) < 1e-5
def test_float_step():
node = FloatMathNode()
- res = node.execute("step(a, 0.5)", a=0.8)[0]
+ res = node.execute(FloatFunc="step(a, 0.5)", V={"V0": 0.8})[0]
assert abs(res - 1.0) < 1e-5
def test_float_relu():
node = FloatMathNode()
- res = node.execute("relu(a)", a=-5.0)[0]
+ res = node.execute(FloatFunc="relu(a)", V={"V0": -5.0})[0]
assert abs(res - 0.0) < 1e-5
def test_float_smoothstep():
node = FloatMathNode()
- res = node.execute("smoothstep(a, 0, 1)", a=0.5)[0]
+ res = node.execute(FloatFunc="smoothstep(a, 0, 1)", V={"V0": 0.5})[0]
assert abs(res - 0.5) < 1e-5
@@ -187,34 +190,34 @@ def test_float_smoothstep():
def test_float_fract():
node = FloatMathNode()
- res = node.execute("fract(a)", a=1.5)[0]
+ res = node.execute(FloatFunc="fract(a)", V={"V0": 1.5})[0]
assert abs(res - 0.5) < 1e-5
def test_float_softplus():
node = FloatMathNode()
- res = node.execute("softplus(a)", a=0.0)[0]
+ res = node.execute(FloatFunc="softplus(a)", V={"V0": 0.0})[0]
assert abs(res - 0.69314718) < 1e-5
def test_float_sign_negative():
node = FloatMathNode()
- assert node.execute("sign(a)", a=-10.0)[0] == -1.0
+ assert node.execute(FloatFunc="sign(a)", V={"V0": -10.0})[0] == -1.0
def test_float_sign_positive():
node = FloatMathNode()
- assert node.execute("sign(a)", a=10.0)[0] == 1.0
+ assert node.execute(FloatFunc="sign(a)", V={"V0": 10.0})[0] == 1.0
def test_float_sign_zero():
node = FloatMathNode()
- assert node.execute("sign(a)", a=0.0)[0] == 0.0
+ assert node.execute(FloatFunc="sign(a)", V={"V0": 0.0})[0] == 0.0
def test_float_gelu():
node = FloatMathNode()
- assert node.execute("gelu(a)", a=0.0)[0] == 0.0
+ assert node.execute(FloatFunc="gelu(a)", V={"V0": 0.0})[0] == 0.0
# ==========================================
@@ -225,21 +228,21 @@ def test_float_gelu():
def test_latent_smoothstep():
node = LatentMathNode()
l_a = {"samples": torch.zeros(1, 4, 32, 32)}
- res = node.execute("smoothstep(0.5, 0, 1)", a=l_a)[0]["samples"]
+ res = node.execute(Expression="smoothstep(0.5, 0, 1)", V={"V0": l_a}, F={})[0]["samples"]
assert torch.allclose(res, torch.full_like(res, 0.5))
def test_latent_softplus():
node = LatentMathNode()
l_a = {"samples": torch.zeros(1, 4, 32, 32)}
- res = node.execute("softplus(0.0)", a=l_a)[0]["samples"]
+ res = node.execute(Expression="softplus(0.0)", V={"V0": l_a}, F={})[0]["samples"]
assert torch.allclose(res, torch.full_like(res, 0.69314718))
def test_latent_gelu():
node = LatentMathNode()
l_a = {"samples": torch.zeros(1, 4, 32, 32)}
- res = node.execute("gelu(0.0)", a=l_a)[0]["samples"]
+ res = node.execute(Expression="gelu(0.0)", V={"V0": l_a}, F={})[0]["samples"]
assert torch.allclose(res, torch.zeros_like(res))
@@ -252,7 +255,7 @@ def test_image_lerp():
node = ImageMathNode()
img_red = torch.tensor([1.0, 0.0, 0.0]).view(1, 1, 1, 3)
img_blue = torch.tensor([0.0, 0.0, 1.0]).view(1, 1, 1, 3)
- res_blend = node.execute("lerp(a, b, 0.5)", a=img_red, b=img_blue)[0]
+ res_blend = node.execute(Expression="lerp(a, b, 0.5)", V={"V0": img_red, "V1": img_blue}, F={})[0]
expected = torch.tensor([0.5, 0.0, 0.5]).view(1, 1, 1, 3)
assert torch.allclose(res_blend, expected)
@@ -261,7 +264,7 @@ def test_image_swap():
node = ImageMathNode()
img_red = torch.tensor([1.0, 0.0, 0.0]).view(1, 1, 1, 3)
img_blue = torch.tensor([0.0, 0.0, 1.0]).view(1, 1, 1, 3)
- res_swap = node.execute("swap(a, 3, 0, 2)", a=img_red)[0]
+ res_swap = node.execute(Expression="swap(a, 3, 0, 2)", V={"V0": img_red}, F={})[0]
assert torch.allclose(res_swap, img_blue)
@@ -275,7 +278,7 @@ def test_audio_math_basic():
waveform = torch.randn(1, 1, 1024)
audio = {"waveform": waveform, "sample_rate": 44100}
# result = a * 2.0
- res = node.execute("a * 2.0", a=audio)[0]
+ res = node.execute(Expression="a * 2.0", V={"V0": audio}, F={})[0]
assert isinstance(res, dict)
assert "waveform" in res
assert res["sample_rate"] == 44100
@@ -290,14 +293,14 @@ def test_audio_math_basic():
def test_float_nested_expressions_true():
node = FloatMathNode()
# lerp(0, 10, step(0.8, 0.5)) -> lerp(0, 10, 1) -> 10
- res = node.execute("lerp(0, 10, step(0.8, 0.5))", a=0.0)[0]
+ res = node.execute(FloatFunc="lerp(0, 10, step(0.8, 0.5))", V={"V0": 0.0})[0]
assert res == 10.0
def test_float_nested_expressions_false():
node = FloatMathNode()
# lerp(0, 10, step(0.2, 0.5)) -> lerp(0, 10, 0) -> 0
- res2 = node.execute("lerp(0, 10, step(0.2, 0.5))", a=0.0)[0]
+ res2 = node.execute(FloatFunc="lerp(0, 10, step(0.2, 0.5))", V={"V0": 0.0})[0]
assert res2 == 0.0
@@ -310,7 +313,7 @@ def test_5d_tensors_identity():
node = LatentMathNode()
samples = torch.randn(1, 5, 4, 32, 32)
l_in = {"samples": samples}
- res = node.execute("a * 1.0", a=l_in)[0]["samples"]
+ res = node.execute(Expression="a * 1.0", V={"V0": l_in}, F={})[0]["samples"]
assert res.shape == (1, 5, 4, 32, 32)
assert torch.allclose(res, samples)
@@ -320,7 +323,7 @@ def test_5d_tensors_variable_T():
samples = torch.randn(1, 5, 4, 32, 32)
l_in = {"samples": samples}
# In 5D, T maps to dim -4 (size 5)
- res_t = node.execute("a + T", a=l_in)[0]["samples"]
+ res_t = node.execute(Expression="a + T", V={"V0": l_in}, F={})[0]["samples"]
assert torch.allclose(res_t, samples + 5.0)
@@ -328,7 +331,7 @@ def test_5d_tensors_fft():
node = LatentMathNode()
samples = torch.randn(1, 5, 4, 32, 32)
l_in = {"samples": samples}
- res_fft = node.execute("ifft(fft(a))", a=l_in)[0]["samples"]
+ res_fft = node.execute(Expression="ifft(fft(a))", V={"V0": l_in}, F={})[0]["samples"]
assert torch.allclose(res_fft, samples, atol=1e-5)
@@ -401,7 +404,7 @@ def test_nested_tensor_support():
nt_in = NestedTensor([t1, t2])
l_in = {"samples": nt_in}
- res_lat = node.execute("a + 1.0", a=l_in)[0]["samples"]
+ res_lat = node.execute(Expression="a + 1.0", V={"V0": l_in}, F={})[0]["samples"]
assert getattr(res_lat, "is_nested", False)
res_list = res_lat.unbind()
@@ -419,32 +422,32 @@ def test_trig_functions():
node = FloatMathNode()
# Sin/Cos checks
# sin(0) = 0, cos(0) = 1
- assert abs(node.execute("sin(0)", a=0.0)[0] - 0.0) < 1e-5
- assert abs(node.execute("cos(0)", a=0.0)[0] - 1.0) < 1e-5
+ assert abs(node.execute(FloatFunc="sin(0)", V={"V0": 0.0})[0] - 0.0) < 1e-5
+ assert abs(node.execute(FloatFunc="cos(0)", V={"V0": 0.0})[0] - 1.0) < 1e-5
# tan(0) = 0
- assert abs(node.execute("tan(0)", a=0.0)[0] - 0.0) < 1e-5
+ assert abs(node.execute(FloatFunc="tan(0)", V={"V0": 0.0})[0] - 0.0) < 1e-5
def test_inverse_trig_functions():
node = FloatMathNode()
# asin(0) = 0, acos(1) = 0, atan(0) = 0
- assert abs(node.execute("asin(0)", a=0.0)[0] - 0.0) < 1e-5
- assert abs(node.execute("acos(1)", a=0.0)[0] - 0.0) < 1e-5
- assert abs(node.execute("atan(0)", a=0.0)[0] - 0.0) < 1e-5
+ assert abs(node.execute(FloatFunc="asin(0)", V={"V0": 0.0})[0] - 0.0) < 1e-5
+ assert abs(node.execute(FloatFunc="acos(1)", V={"V0": 0.0})[0] - 0.0) < 1e-5
+ assert abs(node.execute(FloatFunc="atan(0)", V={"V0": 0.0})[0] - 0.0) < 1e-5
def test_pow_log_functions():
node = FloatMathNode()
# pow(2, 3) = 8
- assert abs(node.execute("pow(2, 3)", a=0.0)[0] - 8.0) < 1e-5
+ assert abs(node.execute(FloatFunc="pow(2, 3)", V={"V0": 0.0})[0] - 8.0) < 1e-5
# sqrt(4) = 2
- assert abs(node.execute("sqrt(4)", a=0.0)[0] - 2.0) < 1e-5
+ assert abs(node.execute(FloatFunc="sqrt(4)", V={"V0": 0.0})[0] - 2.0) < 1e-5
# exp(0) = 1
- assert abs(node.execute("exp(0)", a=0.0)[0] - 1.0) < 1e-5
+ assert abs(node.execute(FloatFunc="exp(0)", V={"V0": 0.0})[0] - 1.0) < 1e-5
# log(100) = 2 (base 10)
- assert abs(node.execute("log(100)", a=0.0)[0] - 2.0) < 1e-5
+ assert abs(node.execute(FloatFunc="log(100)", V={"V0": 0.0})[0] - 2.0) < 1e-5
# ln(e) = 1. Using 'e' constant logic check or approx 2.718
- assert abs(node.execute("ln(2.7182818)", a=0.0)[0] - 1.0) < 1e-4
+ assert abs(node.execute(FloatFunc="ln(2.7182818)", V={"V0": 0.0})[0] - 1.0) < 1e-4
def test_min_max_functions():
@@ -452,19 +455,19 @@ def test_min_max_functions():
node = FloatMathNode()
print("Testing tmin...", flush=True)
# tmin(2, 5) = 2, tmax(2, 5) = 5
- assert abs(node.execute("tmin(2, 5)", a=0.0)[0] - 2.0) < 1e-5
+ assert abs(node.execute(FloatFunc="tmin(2, 5)", V={"V0": 0.0})[0] - 2.0) < 1e-5
print("Testing tmax...", flush=True)
- assert abs(node.execute("tmax(2, 5)", a=0.0)[0] - 5.0) < 1e-5
+ assert abs(node.execute(FloatFunc="tmax(2, 5)", V={"V0": 0.0})[0] - 5.0) < 1e-5
# smin/smax (Smooth min/max? Or just multi-arg min/max? TensorEvalVisitor uses stack.min/max)
# smin(1, 2, 3) = 1
print("Testing smin...", flush=True)
- res_smin = node.execute("smin(1, 2, 3)", a=0.0)[0]
+ res_smin = node.execute(FloatFunc="smin(1, 2, 3)", V={"V0": 0.0})[0]
print(f"smin result: {res_smin} type: {type(res_smin)}", flush=True)
assert abs(res_smin - 1.0) < 1e-5
print("Testing smax...", flush=True)
- res_smax = node.execute("smax(1, 2, 3)", a=0.0)[0]
+ res_smax = node.execute(FloatFunc="smax(1, 2, 3)", V={"V0": 0.0})[0]
print(f"smax result: {res_smax} type: {type(res_smax)}", flush=True)
assert abs(res_smax - 3.0) < 1e-5
@@ -472,23 +475,23 @@ def test_min_max_functions():
def test_basic_utilities():
node = FloatMathNode()
# abs(-5) = 5
- assert abs(node.execute("abs(-5)", a=0.0)[0] - 5.0) < 1e-5
+ assert abs(node.execute(FloatFunc="abs(-5)", V={"V0": 0.0})[0] - 5.0) < 1e-5
# floor(1.9) = 1
- assert abs(node.execute("floor(1.9)", a=0.0)[0] - 1.0) < 1e-5
+ assert abs(node.execute(FloatFunc="floor(1.9)", V={"V0": 0.0})[0] - 1.0) < 1e-5
# ceil(1.1) = 2
- assert abs(node.execute("ceil(1.1)", a=0.0)[0] - 2.0) < 1e-5
+ assert abs(node.execute(FloatFunc="ceil(1.1)", V={"V0": 0.0})[0] - 2.0) < 1e-5
# round(1.6) = 2, round(1.4) = 1
- assert abs(node.execute("round(1.6)", a=0.0)[0] - 2.0) < 1e-5
- assert abs(node.execute("round(1.4)", a=0.0)[0] - 1.0) < 1e-5
+ assert abs(node.execute(FloatFunc="round(1.6)", V={"V0": 0.0})[0] - 2.0) < 1e-5
+ assert abs(node.execute(FloatFunc="round(1.4)", V={"V0": 0.0})[0] - 1.0) < 1e-5
# clamp(10, 0, 5) = 5, clamp(-5, 0, 5) = 0
- assert abs(node.execute("clamp(10, 0, 5)", a=0.0)[0] - 5.0) < 1e-5
- assert abs(node.execute("clamp(-5, 0, 5)", a=0.0)[0] - 0.0) < 1e-5
+ assert abs(node.execute(FloatFunc="clamp(10, 0, 5)", V={"V0": 0.0})[0] - 5.0) < 1e-5
+ assert abs(node.execute(FloatFunc="clamp(-5, 0, 5)", V={"V0": 0.0})[0] - 0.0) < 1e-5
def test_advanced_activations():
node = FloatMathNode()
# sigm(0) = 0.5
- assert abs(node.execute("sigm(0)", a=0.0)[0] - 0.5) < 1e-5
+ assert abs(node.execute(FloatFunc="sigm(0)", V={"V0": 0.0})[0] - 0.5) < 1e-5
if __name__ == "__main__":