From 0fcb7bf7bd3c2280dd33d7b0c48e40d754bed2fa Mon Sep 17 00:00:00 2001 From: mcDandy Date: Sat, 24 Jan 2026 23:15:03 +0100 Subject: [PATCH] (AI) implement the rest --- more_math/AudioMathNode.py | 2 +- more_math/ClipMathNode.py | 82 +- more_math/ConditioningMathNode.py | 2 +- more_math/FloatMathNode.py | 88 +- more_math/ImageMathNode.py | 121 +- more_math/LatentMathNode.py | 153 +- more_math/MaskMathNode.py | 115 +- more_math/ModelMathNode.py | 97 +- more_math/Parser/.antlr/MathExpr.interp | 231 + more_math/Parser/.antlr/MathExpr.tokens | 183 + .../Parser/.antlr/MathExprBaseListener.java | 1418 +++++ more_math/Parser/.antlr/MathExprLexer.interp | 320 + more_math/Parser/.antlr/MathExprLexer.java | 456 ++ more_math/Parser/.antlr/MathExprLexer.tokens | 183 + more_math/Parser/.antlr/MathExprListener.java | 1379 +++++ more_math/Parser/.antlr/MathExprParser.java | 5127 +++++++++++++++++ more_math/SigmasMathNode.py | 2 +- more_math/VaeMathNode.py | 85 +- more_math/VideoMathNode.py | 2 +- more_math/deprecated/AudioMathNode.py | 2 +- more_math/deprecated/ClipMathNode.py | 59 + more_math/deprecated/ConditioningMathNode.py | 2 +- more_math/deprecated/FloatMathNode.py | 67 + more_math/deprecated/ImageMathNode.py | 86 + more_math/deprecated/LatentMathNode.py | 160 + more_math/deprecated/MaskMathNode.py | 83 + more_math/deprecated/ModelMathNode.py | 54 + more_math/deprecated/VaeMathNode.py | 64 + more_math/modelLikeCommon.py | 203 +- more_math/nodes.py | 13 + tests/test_deprecated_nodes.py | 115 + tests/test_model_math.py | 14 +- tests/test_more_math.py | 111 +- 33 files changed, 10749 insertions(+), 330 deletions(-) create mode 100644 more_math/Parser/.antlr/MathExpr.interp create mode 100644 more_math/Parser/.antlr/MathExpr.tokens create mode 100644 more_math/Parser/.antlr/MathExprBaseListener.java create mode 100644 more_math/Parser/.antlr/MathExprLexer.interp create mode 100644 more_math/Parser/.antlr/MathExprLexer.java create mode 100644 more_math/Parser/.antlr/MathExprLexer.tokens create mode 100644 more_math/Parser/.antlr/MathExprListener.java create mode 100644 more_math/Parser/.antlr/MathExprParser.java create mode 100644 more_math/deprecated/ClipMathNode.py create mode 100644 more_math/deprecated/FloatMathNode.py create mode 100644 more_math/deprecated/ImageMathNode.py create mode 100644 more_math/deprecated/LatentMathNode.py create mode 100644 more_math/deprecated/MaskMathNode.py create mode 100644 more_math/deprecated/ModelMathNode.py create mode 100644 more_math/deprecated/VaeMathNode.py create mode 100644 tests/test_deprecated_nodes.py 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__":